mirror of
https://github.com/ganelson/inform.git
synced 2024-07-16 22:14:23 +03:00
1635 lines
185 KiB
HTML
1635 lines
185 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>3/tmp</title>
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
<nav role="navigation">
|
|
<h1><a href="../webs.html">Sources</a></h1>
|
|
<ul>
|
|
<li><a href="../compiler.html">compiler</a></li>
|
|
<li><a href="../other.html"><b>other tools</b></a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul>
|
|
<h2>Other Tools</h2>
|
|
<ul>
|
|
<li><a href="../inblorb/index.html">inblorb</a></li>
|
|
<li><a href="../indoc/index.html">indoc</a></li>
|
|
<li><a href="../inpolicy/index.html">inpolicy</a></li>
|
|
<li><a href="../inrtps/index.html">inrtps</a></li>
|
|
</ul>
|
|
<h2>Foundation</h2>
|
|
<ul>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
</ul>
|
|
|
|
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of '3/wm' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../other.html">Other Tools</a></li><li><a href="index.html">inblorb 4</a></li><li><a href="index.html#3">Chapter 3: Other Material</a></li><li><b>Website Maker</b></li></ul><p class="purpose">To accompany a release with a mini-website.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Landmarks in the source</a></li><li><a href="#SP3">§3. Styling with CSS</a></li><li><a href="#SP9">§9. Making an HTML page from a template</a></li><li><a href="#SP11">§11. Rendering the source text as HTML pages</a></li><li><a href="#SP12">§12. Pass 1: scanning the source for tables and headings</a></li><li><a href="#SP15">§15. Pass 2: writing the source text pages</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Landmarks in the source. </b>Making a website is not especially tricky. The difficult part is typesetting
|
|
the source text into it, if that's been requested. We will need to do that by
|
|
scanning the source text for typographically significant structures:
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">ABBREVIATED_HEADING_LENGTH</span><span class="plain"> 1000</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">table</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">table_line_start</span><span class="plain">; </span> <span class="comment">line number in the source where the table heading appears</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">table_line_end</span><span class="plain">; </span> <span class="comment">line number of the blank line which marks the end of the table body</span>
|
|
<span class="constant">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">table</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">heading</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">heading_line</span><span class="plain">; </span> <span class="comment">line number in the source at which the heading appears</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">heading_level</span><span class="plain">; </span> <span class="comment">a low number makes this a more significant heading than a high number</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">heading_has_content</span><span class="plain">; </span> <span class="comment">is there anything other than white space before the next heading?</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">segment</span><span class="plain"> *</span><span class="identifier">heading_to_segment</span><span class="plain">; </span> <span class="comment">which segment contains the heading</span>
|
|
<span class="reserved">struct</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="constant">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">heading</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure table is private to this section.</p>
|
|
|
|
<p class="endnote">The structure heading is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>Segments are used to divide the source text into pieces of what we hope will
|
|
be a manageable size.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">It is not true that the source text is partitioned exactly by segments. The
|
|
topmost segment begins at the first heading in the source text. So there
|
|
will usually be at least a few prefatory lines before this point — perhaps
|
|
the title, some extension inclusions, and so on — and it's even possible,
|
|
if there are no headings at all, for there to be no segments so that the
|
|
entire source text is "prefatory". If we have three segments, then, we
|
|
will split the source text into four HTML files:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">source0.html</span></code> — "Page 1 of 4", the preface and then contents
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">source1.html</span></code> — "Page 2 of 4", first segment (with allocation ID 0)
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">source2.html</span></code> — "Page 3 of 4", second segment (with allocation ID 1)
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><code class="display"><span class="extract">source3.html</span></code> — "Page 4 of 4", third segment (with allocation ID 2)
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Note that the prefatory lines contain no headings, that every heading
|
|
belongs to a unique segment (hence the <code class="display"><span class="extract">heading_to_segment</span></code> field above)
|
|
and that the top line of every segment is always a heading. A single
|
|
segment can contain multiple headings, because we run on a heading if it
|
|
contains no content except white space: this is so that, e.g.,
|
|
</p>
|
|
|
|
<blockquote>
|
|
<p>Part I - Up the Amazon</p>
|
|
|
|
</blockquote>
|
|
|
|
<blockquote>
|
|
<p>Section I.1 - The lower delta</p>
|
|
|
|
</blockquote>
|
|
|
|
<blockquote>
|
|
<p>Rickety Jetty is a room. [...]</p>
|
|
|
|
</blockquote>
|
|
|
|
<p class="inwebparagraph">would be combined into a single segment, rather than a pointlessly short
|
|
segment just containing the "Part I" heading followed by a second segment
|
|
opening with "Section I.1".
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">segment</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">begins_at</span><span class="plain">; </span> <span class="comment">line number on which the segment begins</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ends_at</span><span class="plain">; </span> <span class="comment">line number of the last line of the segment, or <code class="display"><span class="extract">MAX_SOURCE_TEXT_LINES</span></code> if it runs to the end</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">documentation</span><span class="plain">; </span> <span class="comment">is this in the documentation of an extension?</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_file_position</span><span class="plain"> </span><span class="identifier">start_position_in_file</span><span class="plain">; </span> <span class="comment">within the source text</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">most_recent_heading</span><span class="plain">; </span> <span class="comment">or <code class="display"><span class="extract">NULL</span></code> if there hasn't been one</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">table</span><span class="plain"> *</span><span class="identifier">most_recent_table</span><span class="plain">; </span> <span class="comment">or <code class="display"><span class="extract">NULL</span></code> if there hasn't been one</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">segment_url</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">link_home</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">link_contents</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">link_previous</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">link_next</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">page_number</span><span class="plain">;</span>
|
|
<span class="constant">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">segment</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure segment is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Styling with CSS. </b>We try to give the template files as much freedom as possible to define
|
|
whatever CSS styles they need, but the template can't see inside the text of
|
|
variables, so Inblorb itself has to choose CSS styles for anything interesting
|
|
that is displayed there. We use the following style names, which a CSS file
|
|
is required to define:
|
|
</p>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<ul class="items"><li>(a) <code class="display"><span class="extract">columnhead</span></code> — the heading of a column in a Table in I7 source text
|
|
</li><li>(b) <code class="display"><span class="extract">comment</span></code> — comments in I7 source text
|
|
</li><li>(c) <code class="display"><span class="extract">filetype</span></code> — the "(pdf, 150KB)" text annotating links
|
|
</li><li>(d) <code class="display"><span class="extract">heading</span></code> — heading or top line of a Table in I7 source text
|
|
</li><li>(e) <code class="display"><span class="extract">i6code</span></code> — verbatim I6 code in I7 source text
|
|
</li><li>(f) <code class="display"><span class="extract">notecue</span></code> — footnote cues which annotate I7 source text
|
|
</li><li>(g) <code class="display"><span class="extract">notesheading</span></code> — the little "Notes" subheading above the footnotes to source text
|
|
</li><li>(h) <code class="display"><span class="extract">notetext</span></code> — texts of footnotes which annotate I7 source text
|
|
</li><li>(i) <code class="display"><span class="extract">quote</span></code> — double-quoted text in I7 source text
|
|
</li><li>(j) <code class="display"><span class="extract">substitution</span></code> — text substitution inside double-quoted text in I7 source text
|
|
</li></ul>
|
|
<p class="inwebparagraph">In addition it must provide paragraph classes <code class="display"><span class="extract">indent0</span></code> to <code class="display"><span class="extract">indent9</span></code> for code
|
|
which begins at tab positions 0 to 9 (see below). Although "Standard.css"
|
|
contains other names of classes, these are only needed because "Standard.html"
|
|
or "Standard-Source.html" say so: Inblorb does not mandate them.
|
|
</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>In case CSS is not available, we use old-fashioned HTML alternatives:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::open_style</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">new</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">new</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="reserved">if</span><span class="plain"> (</span><span class="identifier">use_css_code_styles</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<span class=\</span><span class="plain">"</span><span class="string">%s\</span><span class="plain">"</span><span class="string">>"</span><span class="plain">, </span><span class="identifier">new</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">strcmp</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">, </span><span class="string">"columnhead"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<u>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">, </span><span class="string">"comment"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<font color=#404040>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">, </span><span class="string">"filetype"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<small>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">, </span><span class="string">"heading"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<b>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">, </span><span class="string">"i6code"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<font color=#909090>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">, </span><span class="string">"notecue"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<font color=#404040><sup>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">, </span><span class="string">"notesheading"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<i>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">, </span><span class="string">"notetext"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<font color=#404040>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">, </span><span class="string">"quote"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<font color=#000080>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">new</span><span class="plain">, </span><span class="string">"substitution"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<font color=#000080>"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::close_style</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">old</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">old</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="reserved">if</span><span class="plain"> (</span><span class="identifier">use_css_code_styles</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</span>"</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">strcmp</span><span class="plain">(</span><span class="identifier">old</span><span class="plain">, </span><span class="string">"columnhead"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</u>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">old</span><span class="plain">, </span><span class="string">"comment"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</font>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">old</span><span class="plain">, </span><span class="string">"filetype"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</small>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">old</span><span class="plain">, </span><span class="string">"heading"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</b>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">old</span><span class="plain">, </span><span class="string">"i6code"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</font>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">old</span><span class="plain">, </span><span class="string">"notecue"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</sup></font>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">old</span><span class="plain">, </span><span class="string">"notesheading"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</i>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">old</span><span class="plain">, </span><span class="string">"notetext"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</font>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">old</span><span class="plain">, </span><span class="string">"quote"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</font>"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">strcmp</span><span class="plain">(</span><span class="identifier">old</span><span class="plain">, </span><span class="string">"substitution"</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</font>"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::open_style is used in <a href="#SP5">§5</a>, <a href="#SP20_2">§20.2</a>, <a href="#SP22_3">§22.3</a>, <a href="#SP22_4_1">§22.4.1</a>, <a href="#SP22_4_7_3_1">§22.4.7.3.1</a>, 3/laaf (<a href="3-laaf.html#SP6">§6</a>).</p>
|
|
|
|
<p class="endnote">The function Websites::close_style is used in <a href="#SP5">§5</a>, <a href="#SP20_2">§20.2</a>, <a href="#SP22_3">§22.3</a>, <a href="#SP22_4_2">§22.4.2</a>, <a href="#SP22_4_7_3_1">§22.4.7.3.1</a>, 3/laaf (<a href="3-laaf.html#SP6">§6</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>In what follows, we will need to have a current typographic style for text,
|
|
and may need to change it at any point inside the paragraph. We represent the
|
|
current style by the global variable <code class="display"><span class="extract">current_style</span></code>, which is either <code class="display"><span class="extract">NULL</span></code>
|
|
(for ordinary text) or the name of one of the styles above.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">current_style</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::change_style</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">new</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">current_style</span><span class="plain">) </span><span class="functiontext">Websites::close_style</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">current_style</span><span class="plain">);</span>
|
|
<span class="functiontext">Websites::open_style</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">new</span><span class="plain">);</span>
|
|
<span class="identifier">current_style</span><span class="plain"> = </span><span class="identifier">new</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::change_style is used in <a href="#SP22_4_7">§22.4.7</a>, <a href="#SP22_4_7_2">§22.4.7.2</a>, <a href="#SP22_4_7_3">§22.4.7.3</a>, <a href="#SP22_4_7_4">§22.4.7.4</a>, <a href="#SP22_4_7_5">§22.4.7.5</a>, <a href="#SP22_4_7_6">§22.4.7.6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>We also use CSS to manage code indentation, when it's available, since this
|
|
can handle hanging indentation much better.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The block of source text displayed on a web page should be framed within:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::open_code</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">use_css_code_styles</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<p>"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::close_code</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">use_css_code_styles</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</p>"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::open_code is used in <a href="#SP20">§20</a>.</p>
|
|
|
|
<p class="endnote">The function Websites::close_code is used in <a href="#SP20">§20</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>Each individual paragraph of the source text (which looks like a line to us)
|
|
should then be framed within:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::open_code_paragraph</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">indentation</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">use_css_code_styles</span><span class="plain">) {</span>
|
|
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">classname</span><span class="plain"> = </span><span class="string">""</span><span class="plain">;</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">indentation</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> 0: </span><span class="identifier">classname</span><span class="plain"> = </span><span class="string">"indent0"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 1: </span><span class="identifier">classname</span><span class="plain"> = </span><span class="string">"indent1"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 2: </span><span class="identifier">classname</span><span class="plain"> = </span><span class="string">"indent2"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 3: </span><span class="identifier">classname</span><span class="plain"> = </span><span class="string">"indent3"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 4: </span><span class="identifier">classname</span><span class="plain"> = </span><span class="string">"indent4"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 5: </span><span class="identifier">classname</span><span class="plain"> = </span><span class="string">"indent5"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 6: </span><span class="identifier">classname</span><span class="plain"> = </span><span class="string">"indent6"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 7: </span><span class="identifier">classname</span><span class="plain"> = </span><span class="string">"indent7"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> 8: </span><span class="identifier">classname</span><span class="plain"> = </span><span class="string">"indent8"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">classname</span><span class="plain"> = </span><span class="string">"indent9"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<p class=\</span><span class="plain">"</span><span class="string">%s\</span><span class="plain">"</span><span class="string">>"</span><span class="plain">, </span><span class="identifier">classname</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">indentation</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&nbsp;&nbsp;&nbsp;&nbsp;"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::close_code_paragraph</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">use_css_code_styles</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</p>"</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">"<br>"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::open_code_paragraph is used in <a href="#SP22_4">§22.4</a>.</p>
|
|
|
|
<p class="endnote">The function Websites::close_code_paragraph is used in <a href="#SP22_4">§22.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. </b>In the age of CSS, old-fashioned elements like <code class="display"><span class="extract">halign</span></code> for individual table
|
|
cells are deprecated, so:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::open_table_cell</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">use_css_code_styles</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<td>"</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">"<td halign=\</span><span class="plain">"</span><span class="string">left\</span><span class="plain">"</span><span class="string"> valign=\</span><span class="plain">"</span><span class="string">top\</span><span class="plain">"</span><span class="string">>"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::close_table_cell</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">use_css_code_styles</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</td>"</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">"&nbsp;&nbsp;</td>"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::open_table_cell is used in <a href="#SP22_4">§22.4</a>, <a href="#SP22_4_7_1">§22.4.7.1</a>.</p>
|
|
|
|
<p class="endnote">The function Websites::close_table_cell is used in <a href="#SP22_4">§22.4</a>, <a href="#SP22_4_7_1">§22.4.7.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Making an HTML page from a template. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">COPYTO</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::web_copy</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">from</span><span class="plain"> == </span><span class="identifier">to</span><span class="plain">))</span>
|
|
<span class="functiontext">BlorbErrors::fatal</span><span class="plain">(</span><span class="string">"files confused in website maker"</span><span class="plain">);</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">TO_struct</span><span class="plain">;</span>
|
|
<span class="identifier">COPYTO</span><span class="plain"> = &</span><span class="identifier">TO_struct</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">, </span><span class="constant">UTF8_ENC</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) {</span>
|
|
<span class="functiontext">BlorbErrors::error_1f</span><span class="plain">(</span><span class="string">"unable to open file to be written for web site"</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">HTML_pages_created</span><span class="plain">++;</span>
|
|
<span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"can't open template file"</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="functiontext">Websites::copy_html_line</span><span class="plain">, 0, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">STREAM_CLOSE</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">);</span>
|
|
<span class="identifier">COPYTO</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::web_copy is used in <a href="#SP15_3">§15.3</a>, <a href="#SP15_4">§15.4</a>, 1/mn (<a href="1-mn.html#SP6">§6</a>), 3/rls (<a href="3-rls.html#SP9_1">§9.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b>Each line in turn comes here, then.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">For this to work we rely on the source template containing a <code class="display"><span class="extract"></head></span></code> tag,
|
|
in exactly that casing and spacing, but that's safe enough for the templates
|
|
used by Inform.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::copy_html_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
|
|
<span class="functiontext">Websites::copy_html_line_r</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">);</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">, </span><span class="character">'\</span><span class="plain">n</span><span class="character">'</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::copy_html_line_r</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
|
|
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?)%[(%c*?)%](%c*)"</span><span class="plain">)) {</span>
|
|
<span class="functiontext">Websites::copy_html_line_r</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">);</span>
|
|
<span class="functiontext">Placeholders::write</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
|
|
<span class="functiontext">Websites::copy_html_line_r</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2], </span><span class="identifier">tfp</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">);</span>
|
|
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?)</head>(%c*)"</span><span class="plain">)) {</span>
|
|
<span class="functiontext">Websites::copy_html_line_r</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">);</span>
|
|
<span class="functiontext">Placeholders::write</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"INTERPRETERSCRIPTS"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">, </span><span class="string">"</head>"</span><span class="plain">);</span>
|
|
<span class="functiontext">Websites::copy_html_line_r</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1], </span><span class="identifier">tfp</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">);</span>
|
|
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::copy_html_line is used in <a href="#SP9">§9</a>.</p>
|
|
|
|
<p class="endnote">The function Websites::copy_html_line_r appears nowhere else.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. Rendering the source text as HTML pages. </b>This is a fiddly operation, which requires us to parse the source text and
|
|
then typeset it appealingly in a whole suite of HTML pages. This necessarily
|
|
involves loops, but our main aim is to complete the process in O(N)
|
|
running time, where N is the number of lines in the source text. (Note
|
|
that the number of HTML files to be written will also be O(N).)
|
|
</p>
|
|
|
|
<p class="inwebparagraph">This is done in two passes. On pass 1, we scan the source text for tables
|
|
and headings, and divide the whole into "segments", each of which is
|
|
typeset as a single HTML page: segments do not quite correspond to headings,
|
|
as we shall see. But we write nothing. On pass 2, we actually write these
|
|
HTML pages.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">source_text</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::web_copy_source</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="reserved">template</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">website_pathname</span><span class="plain">) {</span>
|
|
<span class="identifier">source_text</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="functiontext">Placeholders::read</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"SOURCELOCATION"</span><span class="plain">));</span>
|
|
<span class="functiontext">Websites::scan_source_text</span><span class="plain">();</span>
|
|
<span class="functiontext">Websites::write_source_text_pages</span><span class="plain">(</span><span class="reserved">template</span><span class="plain">, </span><span class="identifier">website_pathname</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::web_copy_source is used in 3/rls (<a href="3-rls.html#SP6_7">§6.7</a>, <a href="3-rls.html#SP9_1">§9.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Pass 1: scanning the source for tables and headings. </b>During this scan, we will maintain the following variables:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">within_a_table</span><span class="plain">; </span> <span class="comment">are we inside a Table declaration in the source text?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">scan_quoted_matter</span><span class="plain">; </span> <span class="comment">are we inside double-quoted matter in the source text?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">scan_comment_nesting</span><span class="plain">; </span> <span class="comment">level of nesting of comments in source text: 0 means "not in a comment"</span>
|
|
<span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">latest_line_position</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">ftell</span></code>-reported byte offset of the start of the current line in the source</span>
|
|
<span class="reserved">table</span><span class="plain"> *</span><span class="identifier">current_table</span><span class="plain">; </span> <span class="comment">the Table which started most recently, or <code class="display"><span class="extract">NULL</span></code> if none has</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">current_heading</span><span class="plain">; </span> <span class="comment">the heading seen most recently, or <code class="display"><span class="extract">NULL</span></code> if none has been</span>
|
|
<span class="reserved">segment</span><span class="plain"> *</span><span class="identifier">current_segment</span><span class="plain">; </span> <span class="comment">the segment which started most recently, or <code class="display"><span class="extract">NULL</span></code> if none has</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">position_of_documentation_bar</span><span class="plain">; </span> <span class="comment">line count of the <code class="display"><span class="extract">---- Documentation ----</span></code> line, if there is one</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. </b>Pass 1 has running time O(N) since it calls <code class="display"><span class="extract">Websites::scan_source_line</span></code> exactly once
|
|
for each line in the source, and <code class="display"><span class="extract">Websites::scan_source_line</span></code> looks only at a single line
|
|
and at the current table, heading and segment.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">MAX_SOURCE_TEXT_LINES</span><span class="plain"> 2000000000; </span> <span class="comment">enough for 300 copies of the Linux kernel source — plenty!</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::scan_source_text</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="identifier">within_a_table</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">scan_comment_nesting</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">scan_quoted_matter</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">latest_line_position</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">current_table</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">current_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">current_segment</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">position_of_documentation_bar</span><span class="plain"> = </span><span class="constant">MAX_SOURCE_TEXT_LINES</span><span class="plain">;</span>
|
|
|
|
<span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="identifier">source_text</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"can't open source text of project"</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, </span><span class="functiontext">Websites::scan_source_line</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Adjust heading levels downwards as far as we can without losing relative hierarchy</span> <span class="cwebmacronumber">13.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::scan_source_text is used in <a href="#SP11">§11</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13_1"></a><b>§13.1. </b>Suppose our source contains only headings at levels 3 and 4: we can reduce these
|
|
to levels 0 and 1 without disturbing their relative importance, and that makes it
|
|
easier for us to typeset them in a sensible way — there's no point making any
|
|
typographic allowance for three sizes of headings greater than are found anywhere
|
|
in the source text.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Adjust heading levels downwards as far as we can without losing relative hierarchy</span> <span class="cwebmacronumber">13.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">minhl</span><span class="plain"> = 10;</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain">-</span><span class="element">>heading_level</span><span class="plain"> < </span><span class="constant">DOC_LEVEL</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain">-</span><span class="element">>heading_level</span><span class="plain"> < </span><span class="identifier">minhl</span><span class="plain">)</span>
|
|
<span class="identifier">minhl</span><span class="plain"> = </span><span class="identifier">h</span><span class="plain">-</span><span class="element">>heading_level</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain">-</span><span class="element">>heading_level</span><span class="plain"> < </span><span class="constant">DOC_LEVEL</span><span class="plain">)</span>
|
|
<span class="identifier">h</span><span class="plain">-</span><span class="element">>heading_level</span><span class="plain"> -= </span><span class="identifier">minhl</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP13">§13</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. </b>Here we scan each single line. (Lines to us may look like whole paragraphs
|
|
to the Inform user; we're dealing with gaps between explicit line break
|
|
characters.)
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::scan_source_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">lc</span><span class="plain"> = </span><span class="functiontext">TextFiles::get_line_count</span><span class="plain">(</span><span class="identifier">tfp</span><span class="plain">), </span><span class="identifier">lv</span><span class="plain"> = </span><span class="constant">DULL_LEVEL</span><span class="plain">;</span>
|
|
<span class="identifier">latest_line_position</span><span class="plain"> = </span><span class="identifier">tfp</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">scan_quoted_matter</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Look at the first word on the line to find the level of our interest</span> <span class="cwebmacronumber">14.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">scan_comment_nesting</span><span class="plain"> > 0) && (</span><span class="identifier">lv</span><span class="plain"> != </span><span class="constant">EMPTY_LEVEL</span><span class="plain">)) </span><span class="identifier">lv</span><span class="plain"> = </span><span class="constant">DULL_LEVEL</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Correct the comment nesting level ready for next time</span> <span class="cwebmacronumber">14.2</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lv</span><span class="plain"> == </span><span class="constant">DULL_LEVEL</span><span class="plain">) && (</span><span class="identifier">current_heading</span><span class="plain">)) </span><span class="identifier">current_heading</span><span class="plain">-</span><span class="element">>heading_has_content</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lv</span><span class="plain"> == </span><span class="constant">EMPTY_LEVEL</span><span class="plain">) && (</span><span class="identifier">within_a_table</span><span class="plain">)) </span><<span class="cwebmacro">End a table here and return</span> <span class="cwebmacronumber">14.4</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lv</span><span class="plain"> == </span><span class="constant">TABLE_LEVEL</span><span class="plain">) </span><<span class="cwebmacro">Start a new table here and return</span> <span class="cwebmacronumber">14.3</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">lv</span><span class="plain"> == </span><span class="constant">EMPTY_LEVEL</span><span class="plain">) || (</span><span class="identifier">lv</span><span class="plain"> == </span><span class="constant">DULL_LEVEL</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lv</span><span class="plain"> == </span><span class="constant">DOC_LEVEL</span><span class="plain">) </span><span class="identifier">position_of_documentation_bar</span><span class="plain"> = </span><span class="identifier">lc</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Place a new heading here</span> <span class="cwebmacronumber">14.5</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::scan_source_line is used in <a href="#SP13">§13</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14_1"></a><b>§14.1. </b>Looking at the first word, if any, tells whether we are a heading, or the start
|
|
of a table, or an empty line, or none of these (in which case a line is perhaps
|
|
unfairly called "dull"). We set <code class="display"><span class="extract">lv</span></code> accordingly.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">EMPTY_LEVEL</span><span class="plain"> -1</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">DULL_LEVEL</span><span class="plain"> 0</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">TABLE_LEVEL</span><span class="plain"> 1000</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">DOC_LEVEL</span><span class="plain"> 1001</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">EXAMPLE_LEVEL</span><span class="plain"> 1002</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">DOC_CHAPTER_LEVEL</span><span class="plain"> 1003</span>
|
|
<span class="definitionkeyword">define</span> <span class="constant">DOC_SECTION_LEVEL</span><span class="plain"> 1004</span>
|
|
</pre>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Look at the first word on the line to find the level of our interest</span> <span class="cwebmacronumber">14.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *"</span><span class="plain">)) </span><span class="identifier">lv</span><span class="plain"> = </span><span class="constant">EMPTY_LEVEL</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *(%C+)%c*?"</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="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"table"</span><span class="plain">)) </span><span class="identifier">lv</span><span class="plain"> = </span><span class="constant">TABLE_LEVEL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">lc</span><span class="plain"> > </span><span class="identifier">position_of_documentation_bar</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="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"chapter:"</span><span class="plain">)) </span><span class="identifier">lv</span><span class="plain"> = </span><span class="constant">DOC_CHAPTER_LEVEL</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="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"section:"</span><span class="plain">)) </span><span class="identifier">lv</span><span class="plain"> = </span><span class="constant">DOC_SECTION_LEVEL</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="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"example:"</span><span class="plain">)) </span><span class="identifier">lv</span><span class="plain"> = </span><span class="constant">EXAMPLE_LEVEL</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"volume"</span><span class="plain">)) </span><span class="identifier">lv</span><span class="plain"> = 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"book"</span><span class="plain">)) </span><span class="identifier">lv</span><span class="plain"> = 2;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"part"</span><span class="plain">)) </span><span class="identifier">lv</span><span class="plain"> = 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"chapter"</span><span class="plain">)) </span><span class="identifier">lv</span><span class="plain"> = 4;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"section"</span><span class="plain">)) </span><span class="identifier">lv</span><span class="plain"> = 5;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *---- documentation ---- *"</span><span class="plain">)) </span><span class="identifier">lv</span><span class="plain"> = </span><span class="constant">DOC_LEVEL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP14">§14</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14_2"></a><b>§14.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Correct the comment nesting level ready for next time</span> <span class="cwebmacronumber">14.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="character">'['</span><span class="plain">) </span><span class="identifier">scan_comment_nesting</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="character">']'</span><span class="plain">) </span><span class="identifier">scan_comment_nesting</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">scan_comment_nesting</span><span class="plain"> == 0) && (</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">))</span>
|
|
<span class="identifier">scan_quoted_matter</span><span class="plain"> = (</span><span class="identifier">scan_quoted_matter</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="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP14">§14</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14_3"></a><b>§14.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Start a new table here and return</span> <span class="cwebmacronumber">14.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">current_table</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">table</span><span class="plain">);</span>
|
|
<span class="identifier">current_table</span><span class="plain">-</span><span class="element">>table_line_start</span><span class="plain"> = </span><span class="identifier">lc</span><span class="plain">;</span>
|
|
<span class="identifier">current_table</span><span class="plain">-</span><span class="element">>table_line_end</span><span class="plain"> = </span><span class="constant">MAX_SOURCE_TEXT_LINES</span><span class="plain">;</span>
|
|
<span class="identifier">within_a_table</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP14">§14</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14_4"></a><b>§14.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">End a table here and return</span> <span class="cwebmacronumber">14.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">current_table</span><span class="plain">-</span><span class="element">>table_line_end</span><span class="plain"> = </span><span class="identifier">lc</span><span class="plain">;</span>
|
|
<span class="identifier">within_a_table</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP14">§14</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14_5"></a><b>§14.5. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Place a new heading here</span> <span class="cwebmacronumber">14.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">new_h</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">heading</span><span class="plain">);</span>
|
|
<span class="identifier">new_h</span><span class="plain">-</span><span class="element">>heading_text</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">);</span>
|
|
<span class="identifier">new_h</span><span class="plain">-</span><span class="element">>heading_level</span><span class="plain"> = </span><span class="identifier">lv</span><span class="plain">;</span>
|
|
<span class="identifier">new_h</span><span class="plain">-</span><span class="element">>heading_line</span><span class="plain"> = </span><span class="identifier">lc</span><span class="plain">;</span>
|
|
<span class="identifier">new_h</span><span class="plain">-</span><span class="element">>heading_has_content</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">current_heading</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">current_heading</span><span class="plain">-</span><span class="element">>heading_has_content</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">lv</span><span class="plain"> == </span><span class="constant">DOC_LEVEL</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">current_segment</span><span class="plain">) </span><span class="identifier">current_segment</span><span class="plain">-</span><span class="element">>ends_at</span><span class="plain"> = </span><span class="identifier">lc</span><span class="plain"> - 1;</span>
|
|
<span class="identifier">current_segment</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">segment</span><span class="plain">);</span>
|
|
<span class="identifier">current_segment</span><span class="plain">-</span><span class="element">>begins_at</span><span class="plain"> = </span><span class="identifier">lc</span><span class="plain">;</span>
|
|
<span class="identifier">current_segment</span><span class="plain">-</span><span class="element">>ends_at</span><span class="plain"> = </span><span class="constant">MAX_SOURCE_TEXT_LINES</span><span class="plain">;</span>
|
|
<span class="identifier">current_segment</span><span class="plain">-</span><span class="element">>start_position_in_file</span><span class="plain"> = *</span><span class="identifier">latest_line_position</span><span class="plain">;</span>
|
|
<span class="identifier">current_segment</span><span class="plain">-</span><span class="element">>most_recent_heading</span><span class="plain"> = </span><span class="identifier">current_heading</span><span class="plain">;</span>
|
|
<span class="identifier">current_segment</span><span class="plain">-</span><span class="element">>most_recent_table</span><span class="plain"> = </span><span class="identifier">current_table</span><span class="plain">;</span>
|
|
<span class="identifier">current_segment</span><span class="plain">-</span><span class="element">>documentation</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">lc</span><span class="plain"> >= </span><span class="identifier">position_of_documentation_bar</span><span class="plain">) </span><span class="identifier">current_segment</span><span class="plain">-</span><span class="element">>documentation</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">new_h</span><span class="plain">-</span><span class="element">>heading_to_segment</span><span class="plain"> = </span><span class="identifier">current_segment</span><span class="plain">;</span>
|
|
<span class="identifier">current_heading</span><span class="plain"> = </span><span class="identifier">new_h</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP14">§14</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. Pass 2: writing the source text pages. </b>Though there is no obvious way that the following routine passes control
|
|
to the routines below it, in fact it does: <code class="display"><span class="extract">Websites::web_copy</span></code> works on the template
|
|
and finds reserved variables such as "[SOURCE]"; expanding those then calls
|
|
the routines below.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">segment</span><span class="plain"> *</span><span class="identifier">segment_being_written</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">no_doc_files</span><span class="plain"> = 0, </span><span class="identifier">no_src_files</span><span class="plain"> = 0;</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::write_source_text_pages</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="reserved">template</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">website_pathname</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">contents_leafname</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">contents_leafname</span><span class="plain">, </span><span class="string">"%S.html"</span><span class="plain">, </span><span class="functiontext">Placeholders::read</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"SOURCEPREFIX"</span><span class="plain">));</span>
|
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">contents_page</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">website_pathname</span><span class="plain">, </span><span class="identifier">contents_leafname</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">contents_leafname</span><span class="plain">);</span>
|
|
|
|
<<span class="cwebmacro">Devise URLs for the segments</span> <span class="cwebmacronumber">15.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Work out how the segments link together</span> <span class="cwebmacronumber">15.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Generate the prefatory page, which isn't a segment</span> <span class="cwebmacronumber">15.3</span>><span class="character">;</span>
|
|
<<span class="cwebmacro">Generate the segment pages</span> <span class="cwebmacronumber">15.4</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::write_source_text_pages is used in <a href="#SP11">§11</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15_1"></a><b>§15.1. </b>Calling these URLs is a bit grand, since they are only leafnames. The
|
|
source segments have pages <code class="display"><span class="extract">source_0.html</span></code> and so on up; the documentation
|
|
pages <code class="display"><span class="extract">doc_0.html</span></code> and so on up.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Devise URLs for the segments</span> <span class="cwebmacronumber">15.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">segment</span><span class="plain"> *</span><span class="identifier">seg</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">seg</span><span class="plain">, </span><span class="reserved">segment</span><span class="plain">) {</span>
|
|
<span class="identifier">segment_being_written</span><span class="plain"> = </span><span class="identifier">seg</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>documentation</span><span class="plain">) {</span>
|
|
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>segment_url</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>segment_url</span><span class="plain">, </span><span class="string">"doc_%d.html"</span><span class="plain">, </span><span class="identifier">no_doc_files</span><span class="plain">++);</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>page_number</span><span class="plain"> = </span><span class="identifier">no_doc_files</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>segment_url</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>segment_url</span><span class="plain">, </span><span class="string">"%S_%d.html"</span><span class="plain">,</span>
|
|
<span class="functiontext">Placeholders::read</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"SOURCEPREFIX"</span><span class="plain">), </span><span class="identifier">no_src_files</span><span class="plain">++);</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>page_number</span><span class="plain"> = </span><span class="identifier">no_src_files</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="#SP15">§15</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15_2"></a><b>§15.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Work out how the segments link together</span> <span class="cwebmacronumber">15.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">segment</span><span class="plain"> *</span><span class="identifier">seg</span><span class="plain">, *</span><span class="identifier">first_doc_seg</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">first_src_seg</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">seg</span><span class="plain">, </span><span class="reserved">segment</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>documentation</span><span class="plain">) {</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_home</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_contents</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_previous</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">first_doc_seg</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">first_doc_seg</span><span class="plain"> = </span><span class="identifier">seg</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_home</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_contents</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_previous</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_next</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">first_src_seg</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
|
|
<span class="identifier">first_src_seg</span><span class="plain"> = </span><span class="identifier">seg</span><span class="plain">;</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_previous</span><span class="plain"> = </span><span class="identifier">contents_leafname</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">seg</span><span class="plain">, </span><span class="reserved">segment</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>documentation</span><span class="plain">) {</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_home</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"index.html"</span><span class="plain">;</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_contents</span><span class="plain"> = </span><span class="identifier">first_doc_seg</span><span class="plain">-</span><span class="element">>segment_url</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_home</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"index.html"</span><span class="plain">;</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_contents</span><span class="plain"> = </span><span class="identifier">contents_leafname</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">segment</span><span class="plain"> *</span><span class="identifier">before</span><span class="plain"> = </span><span class="identifier">seg</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="constant">TRUE</span><span class="plain">) {</span>
|
|
<span class="identifier">before</span><span class="plain"> = </span><span class="identifier">PREV_OBJECT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="reserved">segment</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">before</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">before</span><span class="plain">-</span><span class="element">>documentation</span><span class="plain"> == </span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>documentation</span><span class="plain">) {</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_previous</span><span class="plain"> = </span><span class="identifier">before</span><span class="plain">-</span><span class="element">>segment_url</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">segment</span><span class="plain"> *</span><span class="identifier">after</span><span class="plain"> = </span><span class="identifier">seg</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="constant">TRUE</span><span class="plain">) {</span>
|
|
<span class="identifier">after</span><span class="plain"> = </span><span class="identifier">NEXT_OBJECT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">, </span><span class="reserved">segment</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">after</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">after</span><span class="plain">-</span><span class="element">>documentation</span><span class="plain"> == </span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>documentation</span><span class="plain">) {</span>
|
|
<span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_next</span><span class="plain"> = </span><span class="identifier">after</span><span class="plain">-</span><span class="element">>segment_url</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP15">§15</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15_3"></a><b>§15.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Generate the prefatory page, which isn't a segment</span> <span class="cwebmacronumber">15.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">segment_being_written</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">source_HTML_pages_created</span><span class="plain">++;</span>
|
|
<span class="functiontext">Websites::web_copy</span><span class="plain">(</span><span class="reserved">template</span><span class="plain">, </span><span class="identifier">contents_page</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP15">§15</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15_4"></a><b>§15.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Generate the segment pages</span> <span class="cwebmacronumber">15.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">segment</span><span class="plain"> *</span><span class="identifier">seg</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">seg</span><span class="plain">, </span><span class="reserved">segment</span><span class="plain">) {</span>
|
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">segment_page</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">website_pathname</span><span class="plain">, </span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>segment_url</span><span class="plain">);</span>
|
|
<span class="identifier">segment_being_written</span><span class="plain"> = </span><span class="identifier">seg</span><span class="plain">;</span>
|
|
<span class="identifier">source_HTML_pages_created</span><span class="plain">++;</span>
|
|
<span class="functiontext">Websites::web_copy</span><span class="plain">(</span><span class="reserved">template</span><span class="plain">, </span><span class="identifier">segment_page</span><span class="plain">);</span>
|
|
<span class="identifier">segment_being_written</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP15">§15</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. </b>This is what "[PAGENUMBER]" in the template becomes.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::expand_PAGENUMBER_variable</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">p</span><span class="plain"> = 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">segment_being_written</span><span class="plain">) {</span>
|
|
<span class="identifier">p</span><span class="plain"> = </span><span class="identifier">segment_being_written</span><span class="plain">-</span><span class="element">>page_number</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">segment_being_written</span><span class="plain">-</span><span class="element">>documentation</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="identifier">p</span><span class="plain">++; </span> <span class="comment">allow for header page</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">, </span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::expand_PAGENUMBER_variable is used in 3/plc (<a href="3-plc.html#SP7">§7</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. </b>And similarly "[PAGEEXTENT]".
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::expand_PAGEEXTENT_variable</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</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="identifier">no_src_files</span><span class="plain"> + 1;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">segment_being_written</span><span class="plain">) && (</span><span class="identifier">segment_being_written</span><span class="plain">-</span><span class="element">>documentation</span><span class="plain">))</span>
|
|
<span class="identifier">n</span><span class="plain"> = </span><span class="identifier">no_doc_files</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> == 0) </span><span class="identifier">n</span><span class="plain"> = 1;</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">, </span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::expand_PAGEEXTENT_variable is used in 3/plc (<a href="3-plc.html#SP7">§7</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP18"></a><b>§18. </b>And this is what "[SOURCELINKS]" in the template becomes:
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::expand_SOURCELINKS_variable</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
|
|
<span class="reserved">segment</span><span class="plain"> *</span><span class="identifier">seg</span><span class="plain"> = </span><span class="identifier">segment_being_written</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">seg</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_home</span><span class="plain">)</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">, </span><span class="string">"<li><a href=\</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string">>Home page</a></li>"</span><span class="plain">, </span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_home</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_contents</span><span class="plain">)</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">, </span><span class="string">"<li><a href=\</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string">>Beginning</a></li>"</span><span class="plain">, </span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_contents</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_previous</span><span class="plain">)</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">, </span><span class="string">"<li><a href=\</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string">>Previous</a></li>"</span><span class="plain">, </span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_previous</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_next</span><span class="plain">)</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">, </span><span class="string">"<li><a href=\</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string">>Next</a></li>"</span><span class="plain">, </span><span class="identifier">seg</span><span class="plain">-</span><span class="element">>link_next</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">, </span><span class="string">"<li><a href=\</span><span class="plain">"</span><span class="string">index.html\</span><span class="plain">"</span><span class="string">>Home page</a></li>"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">COPYTO</span><span class="plain">, </span><span class="string">"<li><a href=\</span><span class="plain">"</span><span class="string">%S.txt\</span><span class="plain">"</span><span class="string">>Complete text</a></li>"</span><span class="plain">,</span>
|
|
<span class="functiontext">Placeholders::read</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"SOURCEPREFIX"</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::expand_SOURCELINKS_variable is used in 3/plc (<a href="3-plc.html#SP7">§7</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP19"></a><b>§19. </b>When working on "[SOURCE]" or "[SOURCENOTES]", we will need to run
|
|
through a segment of the source text, one line at a time. As we do so, we'll
|
|
maintain the following variables, along with <code class="display"><span class="extract">current_style</span></code> (for which
|
|
see the CSS discussion above):
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">SPAGE</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">where the output is going</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">SOURCENOTES_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">TRUE</span></code> for "[SOURCENOTES]", <code class="display"><span class="extract">FALSE</span></code> for "[SOURCE]"</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">quoted_matter</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">; </span> <span class="comment">are we inside double-quoted matter in the source text?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i6_matter</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">; </span> <span class="comment">are we inside verbatim I6 code in the source text?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">comment_nesting</span><span class="plain"> = 0; </span> <span class="comment">nesting level of comments in source text being read: 0 for not in a comment</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">footnote_comment_level</span><span class="plain"> = 0; </span> <span class="comment">ditto, but where the outermost comment is a footnote marker</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">carry_over_indentation</span><span class="plain"> = -1; </span> <span class="comment">indentation carried over for para breaks in quoted text</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">next_footnote_number</span><span class="plain"> = 1; </span> <span class="comment">number to assign to the next footnote which comes up</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">latest_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">a heading which is always behind the current position</span>
|
|
<span class="reserved">table</span><span class="plain"> *</span><span class="identifier">latest_table</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">a table which is always behind the current position</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20"></a><b>§20. </b>So this is "[SOURCE]" (if <code class="display"><span class="extract">noting_mode</span></code> is <code class="display"><span class="extract">FALSE</span></code>) or "[SOURCENOTES]"
|
|
(if <code class="display"><span class="extract">TRUE</span></code>).
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::expand_SOURCE_or_SOURCENOTES_variable</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">SN</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">SN</span><span class="plain">) </span><<span class="cwebmacro">Typeset the little Notes subheading</span> <span class="cwebmacronumber">20.2</span>><span class="plain">;</span>
|
|
<span class="functiontext">Websites::open_code</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Initialise the variables to their state at the start of an HTML page</span> <span class="cwebmacronumber">20.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Read the source text and feed it one line at a time to the line-writer</span> <span class="cwebmacronumber">20.3</span>><span class="plain">;</span>
|
|
<span class="functiontext">Websites::close_code</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::expand_SOURCE_or_SOURCENOTES_variable is used in 3/plc (<a href="3-plc.html#SP7">§7</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_1"></a><b>§20.1. </b>So at the start of the preface or of any segment:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Initialise the variables to their state at the start of an HTML page</span> <span class="cwebmacronumber">20.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">next_footnote_number</span><span class="plain"> = 1;</span>
|
|
<span class="identifier">SPAGE</span><span class="plain"> = </span><span class="identifier">OUT</span><span class="plain">;</span>
|
|
<span class="identifier">SOURCENOTES_mode</span><span class="plain"> = </span><span class="identifier">SN</span><span class="plain">;</span>
|
|
<span class="identifier">quoted_matter</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">i6_matter</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">comment_nesting</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">footnote_comment_level</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">carry_over_indentation</span><span class="plain"> = -1;</span>
|
|
<span class="identifier">current_style</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">latest_heading</span><span class="plain"> = </span><span class="identifier">FIRST_OBJECT</span><span class="plain">(</span><span class="reserved">heading</span><span class="plain">);</span>
|
|
<span class="identifier">latest_table</span><span class="plain"> = </span><span class="identifier">FIRST_OBJECT</span><span class="plain">(</span><span class="reserved">table</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20">§20</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_2"></a><b>§20.2. </b>We expect any use of "[SOURCENOTES]" to come after the relevant
|
|
"[SOURCE]", so that looking at <code class="display"><span class="extract">next_footnote_number</span></code> will tell us how many
|
|
notes there were.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Typeset the little Notes subheading</span> <span class="cwebmacronumber">20.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">next_footnote_number</span><span class="plain"> == 1) </span><span class="reserved">return</span><span class="plain">; </span> <span class="comment">there were no footnotes at all</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<p>"</span><span class="plain">);</span>
|
|
<span class="functiontext">Websites::open_style</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"notesheading"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">next_footnote_number</span><span class="plain"> == 2) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Note"</span><span class="plain">); </span> <span class="comment">just one</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Notes"</span><span class="plain">); </span> <span class="comment">more than one</span>
|
|
<span class="functiontext">Websites::close_style</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"notesheading"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"</p>\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20">§20</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_3"></a><b>§20.3. </b>We want to be very careful about running time here. This paragraph will
|
|
run about H times, where H is the number of headings (in fact at most H+1
|
|
times and usually a little less); but we might reasonably expect that H
|
|
is proportional to N, since there's typically a heading every 30 or so
|
|
lines in the source text, so that H is about N/30. If we then did the simplest
|
|
thing, of opening the source text file and sending every line to
|
|
<code class="display"><span class="extract">Websites::write_source_line</span></code>, we would make O(N^2) calls, and even though many of
|
|
those would quickly return it would be an expensive algorithm.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Instead, we start at the relevant position in the source text for the
|
|
current HTML page, and we stop the moment that <code class="display"><span class="extract">Websites::write_source_line</span></code> reports
|
|
that it has gone past the material of interest. We thus make at most N+H
|
|
calls to <code class="display"><span class="extract">Websites::write_source_line</span></code> (the extra H calls being for one overspill line
|
|
per segment, where we realise that we've gone too far).
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Read the source text and feed it one line at a time to the line-writer</span> <span class="cwebmacronumber">20.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">start</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">segment_being_written</span><span class="plain">) </span><<span class="cwebmacro">Start from just the right place in the source file</span> <span class="cwebmacronumber">20.3.1</span>><span class="plain">;</span>
|
|
<span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="identifier">source_text</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"can't open source text"</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, </span><span class="functiontext">Websites::source_write_iterator</span><span class="plain">, </span><span class="identifier">start</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20">§20</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP20_3_1"></a><b>§20.3.1. </b>The following simulates the effect of running through the uninteresting lines
|
|
before the segment begins:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Start from just the right place in the source file</span> <span class="cwebmacronumber">20.3.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">start</span><span class="plain"> = &(</span><span class="identifier">segment_being_written</span><span class="plain">-</span><span class="element">>start_position_in_file</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">segment_being_written</span><span class="plain">-</span><span class="element">>most_recent_heading</span><span class="plain">)</span>
|
|
<span class="identifier">latest_heading</span><span class="plain"> = </span><span class="identifier">segment_being_written</span><span class="plain">-</span><span class="element">>most_recent_heading</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">segment_being_written</span><span class="plain">-</span><span class="element">>most_recent_table</span><span class="plain">)</span>
|
|
<span class="identifier">latest_table</span><span class="plain"> = </span><span class="identifier">segment_being_written</span><span class="plain">-</span><span class="element">>most_recent_table</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP20_3">§20.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP21"></a><b>§21. </b></p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::source_write_iterator</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">done_yet</span><span class="plain"> = </span><span class="functiontext">Websites::write_source_line</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">done_yet</span><span class="plain">) </span><span class="functiontext">TextFiles::lose_interest</span><span class="plain">(</span><span class="identifier">tfp</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::source_write_iterator is used in <a href="#SP20_3">§20.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22"></a><b>§22. </b>And this is where we write lines. We arrive here with exactly the same line
|
|
count as the scanner observed before on pass 1, so we can validly compare
|
|
our current line count against those stored for tables, headings and segments.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">When this routine returns <code class="display"><span class="extract">TRUE</span></code>, it signals that there is no further need for
|
|
the source text, and that saves reading in all of the remaining lines which
|
|
won't be needed.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Websites::write_source_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">line_count</span><span class="plain"> = </span><span class="functiontext">TextFiles::get_line_count</span><span class="plain">(</span><span class="identifier">tfp</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">segment_being_written</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><<span class="cwebmacro">Filter out lines for the preface</span> <span class="cwebmacronumber">22.1</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Filter out lines for the segments</span> <span class="cwebmacronumber">22.2</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">SOURCENOTES_mode</span><span class="plain">) </span><<span class="cwebmacro">Typeset the line in [SOURCENOTES] mode</span> <span class="cwebmacronumber">22.3</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Typeset the line in [SOURCE] mode</span> <span class="cwebmacronumber">22.4</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>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::write_source_line is used in <a href="#SP21">§21</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_1"></a><b>§22.1. </b>Recall that the source text is divided into an initial portion containing
|
|
no headings — the "preface" — and then segments, each of which begins with
|
|
a heading.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Here we are handling the case of typesetting the preface. We allow the line
|
|
to appear as normal if it is before the first segment; once we reach the
|
|
first segment — if there's a first segment to reach — we then typeset the
|
|
contents listing. (If there's no first segment, then there are no headings,
|
|
and there's no need for a contents listing.) If we've output the contents
|
|
listing then we are finished writing the preface and don't need to read the
|
|
source text further, so we return <code class="display"><span class="extract">TRUE</span></code>.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Filter out lines for the preface</span> <span class="cwebmacronumber">22.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">segment</span><span class="plain"> *</span><span class="identifier">first_segment</span><span class="plain"> = </span><span class="identifier">FIRST_OBJECT</span><span class="plain">(</span><span class="reserved">segment</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">first_segment</span><span class="plain">) && (</span><span class="identifier">line_count</span><span class="plain"> == </span><span class="identifier">first_segment</span><span class="plain">-</span><span class="element">>begins_at</span><span class="plain"> - 1) && (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">) == 0))</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">; </span> <span class="comment">don't bother to typeset a blank line just before the first segment is reached</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">first_segment</span><span class="plain">) && (</span><span class="identifier">line_count</span><span class="plain"> == </span><span class="identifier">first_segment</span><span class="plain">-</span><span class="element">>begins_at</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">SOURCENOTES_mode</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext">Websites::typeset_contents_listing</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">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22">§22</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_2"></a><b>§22.2. </b>The segment pages are easier: in this case we allow the line only if it
|
|
lies inside the segment, and otherwise suppress it. Once we've gone beyond
|
|
the segment, we don't need to read any further, so we return <code class="display"><span class="extract">TRUE</span></code>.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Filter out lines for the segments</span> <span class="cwebmacronumber">22.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">line_count</span><span class="plain"> < </span><span class="identifier">segment_being_written</span><span class="plain">-</span><span class="element">>begins_at</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">if</span><span class="plain"> (</span><span class="identifier">line_count</span><span class="plain"> > </span><span class="identifier">segment_being_written</span><span class="plain">-</span><span class="element">>ends_at</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="reserved">if</span><span class="plain"> (</span><span class="identifier">line_count</span><span class="plain"> == </span><span class="identifier">position_of_documentation_bar</span><span class="plain"> + 1)</span>
|
|
<span class="functiontext">Websites::typeset_contents_listing</span><span class="plain">(</span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22">§22</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_3"></a><b>§22.3. </b>In [SOURCENOTES] mode, we detect footnotes in the form of comments in the
|
|
source text marked by asterisks; each one is assigned the next footnote
|
|
number, and typeset. All other material is ignored.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Typeset the line in [SOURCENOTES] mode</span> <span class="cwebmacronumber">22.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">L</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">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'['</span><span class="plain">) && (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">'*'</span><span class="plain">)) {</span>
|
|
<span class="identifier">footnote_comment_level</span><span class="plain"> = 1;</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"<p><a name=\</span><span class="plain">"</span><span class="string">note%d\</span><span class="plain">"</span><span class="string">></a>"</span><span class="plain">, </span><span class="identifier">next_footnote_number</span><span class="plain">);</span>
|
|
<span class="functiontext">Websites::open_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"notetext"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"<a href=\</span><span class="plain">"</span><span class="string">#note%dref\</span><span class="plain">"</span><span class="string">>[%d]</a>. "</span><span class="plain">,</span>
|
|
<span class="identifier">next_footnote_number</span><span class="plain">, </span><span class="identifier">next_footnote_number</span><span class="plain">);</span>
|
|
<span class="identifier">next_footnote_number</span><span class="plain">++;</span>
|
|
<span class="identifier">i</span><span class="plain">+=2;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">footnote_comment_level</span><span class="plain"> > 0) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</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">footnote_comment_level</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">line</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">footnote_comment_level</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">footnote_comment_level</span><span class="plain"> == 0) {</span>
|
|
<span class="functiontext">Websites::close_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"notetext"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"</p>\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"%c"</span><span class="plain">, </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">));</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">footnote_comment_level</span><span class="plain"> > 0) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">" "</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22">§22</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4"></a><b>§22.4. </b>In [SOURCE] mode, we need to work out appropriate type styles to embellish
|
|
the line, then indent it suitably, then typeset it character by character.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Typeset the line in [SOURCE] mode</span> <span class="cwebmacronumber">22.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">embolden</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">tabulate</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">underline</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Decide any typographic embellishments due to the line falling inside a table</span> <span class="cwebmacronumber">22.4.3</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">The top line of the preface or any segment is in bold</span> <span class="cwebmacronumber">22.4.4</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Any heading line is in bold</span> <span class="cwebmacronumber">22.4.5</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">tabulate</span><span class="plain">) && (</span><span class="identifier">quoted_matter</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">)) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"<tr>"</span><span class="plain">); </span><span class="functiontext">Websites::open_table_cell</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">); }</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">start</span><span class="plain"> = 0;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">footnote_comment_level</span><span class="plain"> > 0) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">start</span><span class="plain">); </span><span class="identifier">start</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">line</span><span class="plain">, </span><span class="identifier">start</span><span class="plain">) == </span><span class="character">'['</span><span class="plain">) </span><span class="identifier">footnote_comment_level</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">line</span><span class="plain">, </span><span class="identifier">start</span><span class="plain">) == </span><span class="character">']'</span><span class="plain">) </span><span class="identifier">footnote_comment_level</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">footnote_comment_level</span><span class="plain"> == 0) { </span><span class="identifier">start</span><span class="plain">++; </span><span class="reserved">break</span><span class="plain">; }</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">footnote_comment_level</span><span class="plain"> == 0) && (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">start</span><span class="plain">))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tabulate</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">insteps</span><span class="plain"> = 0;</span>
|
|
<span class="reserved">for</span><span class="plain"> (; </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">start</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">t</span><span class="character">'</span><span class="plain">; </span><span class="identifier">start</span><span class="plain">++) </span><span class="identifier">insteps</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">carry_over_indentation</span><span class="plain"> < 0) </span><span class="identifier">carry_over_indentation</span><span class="plain"> = </span><span class="identifier">insteps</span><span class="plain">;</span>
|
|
<span class="functiontext">Websites::open_code_paragraph</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="identifier">carry_over_indentation</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<<span class="cwebmacro">Begin typographic embellishments</span> <span class="cwebmacronumber">22.4.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">The documentation requires some corrections</span> <span class="cwebmacronumber">22.4.6</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">start</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">=</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">); </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><<span class="cwebmacro">Typeset a single character of the source text</span> <span class="cwebmacronumber">22.4.7</span>><span class="plain">;</span>
|
|
|
|
<<span class="cwebmacro">End typographic embellishments</span> <span class="cwebmacronumber">22.4.2</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">tabulate</span><span class="plain">) && (</span><span class="identifier">quoted_matter</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">)) { </span><span class="functiontext">Websites::close_table_cell</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"</tr>\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); }</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Websites::close_code_paragraph</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">quoted_matter</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="identifier">carry_over_indentation</span><span class="plain"> = -1;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22">§22</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4_1"></a><b>§22.4.1. </b>The type styles are easily applied, so let's do that now. The innermost one
|
|
must be colour, since that may change in the course of the line.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Begin typographic embellishments</span> <span class="cwebmacronumber">22.4.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">underline</span><span class="plain">) </span><span class="functiontext">Websites::open_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"columnhead"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">embolden</span><span class="plain">) </span><span class="functiontext">Websites::open_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"heading"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">current_style</span><span class="plain">) </span><span class="functiontext">Websites::open_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="identifier">current_style</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22_4">§22.4</a>, <a href="#SP22_4_7_1">§22.4.7.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4_2"></a><b>§22.4.2. </b>And they end in reverse order, so that they nest properly if need be:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">End typographic embellishments</span> <span class="cwebmacronumber">22.4.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">current_style</span><span class="plain">) </span><span class="functiontext">Websites::close_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="identifier">current_style</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">embolden</span><span class="plain">) </span><span class="functiontext">Websites::close_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"heading"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">underline</span><span class="plain">) </span><span class="functiontext">Websites::close_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"columnhead"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22_4">§22.4</a>, <a href="#SP22_4_7_1">§22.4.7.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4_3"></a><b>§22.4.3. </b>The heading line of a source text Table is in bold; the column-headings
|
|
line is underlined; and the material inside appears in an HTML table, with
|
|
<code class="display"><span class="extract">tabulate</span></code> mode set.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The <code class="display"><span class="extract">while</span></code> loop here needs a careful look, since on the face of it this
|
|
could mean O(N) iterations — since the number of tables is probably
|
|
proportional to N — made in the course of the current "[SOURCE]"
|
|
expansion. Since the number of "[SOURCE]" expansions needed to make the
|
|
website is also O(N) — the number of HTML pages in the site is proportional
|
|
to the number of headings, which is also proportional to N — there's a
|
|
risk that this <code class="display"><span class="extract">while</span></code> loop makes the whole website algorithm O(N^2).
|
|
This is why, on each "[SOURCE]" expansion, <code class="display"><span class="extract">latest_table</span></code> is initialised
|
|
not to the first table but to the most recent one at the start position of
|
|
the current HTML page. Moreover, the loop never goes past the current line
|
|
count, which never goes outside the range of lines in the current HTML page.
|
|
The result is that over the course of all the "[SOURCE]" expansions
|
|
combined, the <code class="display"><span class="extract">while</span></code> loop here executes O(N) iterations in total.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Decide any typographic embellishments due to the line falling inside a table</span> <span class="cwebmacronumber">22.4.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">latest_table</span><span class="plain">) && (</span><span class="identifier">latest_table</span><span class="plain">-</span><span class="element">>table_line_end</span><span class="plain"> < </span><span class="identifier">line_count</span><span class="plain">))</span>
|
|
<span class="identifier">latest_table</span><span class="plain"> = </span><span class="identifier">NEXT_OBJECT</span><span class="plain">(</span><span class="identifier">latest_table</span><span class="plain">, </span><span class="reserved">table</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">latest_table</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">latest_table</span><span class="plain">-</span><span class="element">>table_line_start</span><span class="plain">, </span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">latest_table</span><span class="plain">-</span><span class="element">>table_line_end</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">line_count</span><span class="plain"> == </span><span class="identifier">from</span><span class="plain">) {</span>
|
|
<span class="identifier">embolden</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">line_count</span><span class="plain"> > </span><span class="identifier">from</span><span class="plain">) && (</span><span class="identifier">line_count</span><span class="plain"> < </span><span class="identifier">to</span><span class="plain">)) {</span>
|
|
<span class="identifier">tabulate</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">line_count</span><span class="plain"> == </span><span class="identifier">from</span><span class="plain"> + 1) {</span>
|
|
<span class="identifier">underline</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"<table>"</span><span class="plain">);</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">line_count</span><span class="plain"> == </span><span class="identifier">to</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"</table>"</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="#SP22_4">§22.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4_4"></a><b>§22.4.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">The top line of the preface or any segment is in bold</span> <span class="cwebmacronumber">22.4.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">line_count</span><span class="plain"> == 1) ||</span>
|
|
<span class="plain">((</span><span class="identifier">segment_being_written</span><span class="plain">) && (</span><span class="identifier">line_count</span><span class="plain"> == </span><span class="identifier">segment_being_written</span><span class="plain">-</span><span class="element">>begins_at</span><span class="plain">)))</span>
|
|
<span class="identifier">embolden</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22_4">§22.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4_5"></a><b>§22.4.5. </b>See the discussion of <code class="display"><span class="extract">latest_table</span></code> above for why the following <code class="display"><span class="extract">while</span></code>
|
|
loop also doesn't make our algorithm O(N^2).
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Any heading line is in bold</span> <span class="cwebmacronumber">22.4.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">latest_heading</span><span class="plain">) && (</span><span class="identifier">latest_heading</span><span class="plain">-</span><span class="element">>heading_line</span><span class="plain"> < </span><span class="identifier">line_count</span><span class="plain">))</span>
|
|
<span class="identifier">latest_heading</span><span class="plain"> = </span><span class="identifier">NEXT_OBJECT</span><span class="plain">(</span><span class="identifier">latest_heading</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">latest_heading</span><span class="plain">) && (</span><span class="identifier">latest_heading</span><span class="plain">-</span><span class="element">>heading_line</span><span class="plain"> == </span><span class="identifier">line_count</span><span class="plain">))</span>
|
|
<span class="identifier">embolden</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22_4">§22.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4_6"></a><b>§22.4.6. </b><code class="display">
|
|
<<span class="cwebmacrodefn">The documentation requires some corrections</span> <span class="cwebmacronumber">22.4.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">comment_nesting</span><span class="plain"> == 0) && (</span><span class="identifier">quoted_matter</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) && (</span><span class="identifier">i6_matter</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">start</span><span class="plain">) == </span><span class="character">'*'</span><span class="plain">) && (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">start</span><span class="plain">+1) == </span><span class="character">':'</span><span class="plain">) && (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">start</span><span class="plain">+2) == </span><span class="character">' '</span><span class="plain">))</span>
|
|
<span class="identifier">start</span><span class="plain"> += 3;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">line_count</span><span class="plain"> == </span><span class="identifier">position_of_documentation_bar</span><span class="plain">) </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Documentation"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22_4">§22.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4_7"></a><b>§22.4.7. </b>We need to do two things: ensure that the character is HTML-safe, which
|
|
means escaping out <code class="display"><span class="extract">"</span></code>, <code class="display"><span class="extract"><</span></code>, <code class="display"><span class="extract">></span></code> and <code class="display"><span class="extract">&</span></code> (but nothing else since the HTML
|
|
file will use a UTF-8 encoding, the same as that in the source text); and
|
|
keep track of the opening and closing of comments and quoted matter.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Typeset a single character of the source text</span> <span class="cwebmacronumber">22.4.7</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">)) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">t</span><span class="character">'</span><span class="plain">:</span>
|
|
<span class="comment">a multiple tab is equivalent to a single tab in Inform source text</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">'\</span><span class="plain">t</span><span class="character">'</span><span class="plain">) </span><span class="identifier">i</span><span class="plain">++;</span>
|
|
<<span class="cwebmacro">Typeset a tab</span> <span class="cwebmacronumber">22.4.7.1</span>><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'"'</span><span class="plain">:</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">comment_nesting</span><span class="plain"> > 0) || (</span><span class="identifier">i6_matter</span><span class="plain">)) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"&quot;"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Typeset a double quotation mark outside of a comment</span> <span class="cwebmacronumber">22.4.7.2</span>><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'['</span><span class="plain">:</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">quoted_matter</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"["</span><span class="plain">); </span><span class="functiontext">Websites::change_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"substitution"</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">i6_matter</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"["</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Typeset an open square bracket outside of a string</span> <span class="cwebmacronumber">22.4.7.3</span>><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">']'</span><span class="plain">:</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">quoted_matter</span><span class="plain">) { </span><span class="functiontext">Websites::change_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"quote"</span><span class="plain">); </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"]"</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">i6_matter</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"]"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Typeset a close square bracket outside of a string</span> <span class="cwebmacronumber">22.4.7.4</span>><span class="plain">;</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'('</span><span class="plain">:</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">comment_nesting</span><span class="plain"> == 0) && (</span><span class="identifier">quoted_matter</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) && (</span><span class="identifier">i6_matter</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">'-'</span><span class="plain">)) { </span><span class="identifier">i</span><span class="plain">++;</span>
|
|
<<span class="cwebmacro">Typeset the opening of I6 verbatim code</span> <span class="cwebmacronumber">22.4.7.5</span>>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"("</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'-'</span><span class="plain">:</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">i6_matter</span><span class="plain">) && (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">')'</span><span class="plain">)) { </span><span class="identifier">i</span><span class="plain">++;</span>
|
|
<<span class="cwebmacro">Typeset the closing of I6 verbatim code</span> <span class="cwebmacronumber">22.4.7.6</span>>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"-"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'<'</span><span class="plain">: </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"&lt;"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'>'</span><span class="plain">: </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"&gt;"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'&'</span><span class="plain">: </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"&amp;"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"%c"</span><span class="plain">, </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">)); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22_4">§22.4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4_7_1"></a><b>§22.4.7.1. </b>Inside a source-text Table, a tab moves to the next column, so we need to typeset a
|
|
cell boundary in our HTML <code class="display"><span class="extract"><table></span></code>. Outside of that context, a tab is just white
|
|
space and we turn it into a single space.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Typeset a tab</span> <span class="cwebmacronumber">22.4.7.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tabulate</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">End typographic embellishments</span> <span class="cwebmacronumber">22.4.2</span>><span class="plain">;</span>
|
|
<span class="functiontext">Websites::close_table_cell</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">);</span>
|
|
<span class="functiontext">Websites::open_table_cell</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Begin typographic embellishments</span> <span class="cwebmacronumber">22.4.1</span>><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">" "</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22_4_7">§22.4.7</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4_7_2"></a><b>§22.4.7.2. </b>The following enters or exits quoted-matter mode, and is structured so that
|
|
the quotation marks are not coloured — only the material inside them.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Our code in handling quoted and comment matter is greatly simplified by the
|
|
fact that a valid Inform text cannot contain mismatched square brackets;
|
|
however, as Dave Chapeskie points out, a valid comment can contain mismatched
|
|
quotation marks, and this section of code benefits from his careful amendments.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Typeset a double quotation mark outside of a comment</span> <span class="cwebmacronumber">22.4.7.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">quoted_matter</span><span class="plain">) </span><span class="functiontext">Websites::change_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"&quot;"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">quoted_matter</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext">Websites::change_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"quote"</span><span class="plain">);</span>
|
|
<span class="identifier">quoted_matter</span><span class="plain"> = (</span><span class="identifier">quoted_matter</span><span class="plain">)?</span><span class="constant">FALSE</span><span class="plain">:</span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22_4_7">§22.4.7</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4_7_3"></a><b>§22.4.7.3. </b>On the other hand, the squares around a comment do pick up the colour
|
|
of the commentary within them. Asterisked comments must end in the same paragraph
|
|
as they begin.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Typeset an open square bracket outside of a string</span> <span class="cwebmacronumber">22.4.7.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">'*'</span><span class="plain">) {</span>
|
|
<span class="comment">advance past the end of the asterisked comment</span>
|
|
<span class="identifier">footnote_comment_level</span><span class="plain">++;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">+=2, </span><span class="identifier">L</span><span class="plain">=</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">); </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">L</span><span class="plain">; ++</span><span class="identifier">i</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</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">footnote_comment_level</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">line</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">footnote_comment_level</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">footnote_comment_level</span><span class="plain"> == 0) </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == 0) </span><span class="identifier">i</span><span class="plain">--;</span>
|
|
<<span class="cwebmacro">Typeset a footnote cue</span> <span class="cwebmacronumber">22.4.7.3.1</span>><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">comment_nesting</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">comment_nesting</span><span class="plain"> == 1) </span><span class="functiontext">Websites::change_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"comment"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"["</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22_4_7">§22.4.7</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4_7_4"></a><b>§22.4.7.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Typeset a close square bracket outside of a string</span> <span class="cwebmacronumber">22.4.7.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"]"</span><span class="plain">);</span>
|
|
<span class="identifier">comment_nesting</span><span class="plain">--;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">comment_nesting</span><span class="plain"> == 0) </span><span class="functiontext">Websites::change_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22_4_7">§22.4.7</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4_7_5"></a><b>§22.4.7.5. </b>Styling applied to I6 verbatim code does not apply to the purely-I7 markers
|
|
"(-" and "-)" around it:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Typeset the opening of I6 verbatim code</span> <span class="cwebmacronumber">22.4.7.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"(-"</span><span class="plain">);</span>
|
|
<span class="functiontext">Websites::change_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"i6code"</span><span class="plain">);</span>
|
|
<span class="identifier">i6_matter</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22_4_7">§22.4.7</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4_7_6"></a><b>§22.4.7.6. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Typeset the closing of I6 verbatim code</span> <span class="cwebmacronumber">22.4.7.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">Websites::change_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"-)"</span><span class="plain">);</span>
|
|
<span class="identifier">i6_matter</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22_4_7">§22.4.7</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP22_4_7_3_1"></a><b>§22.4.7.3.1. </b>The "cue" of a footnote is the reference in the body of the text, which
|
|
is conventionally printed as a superscript number. We leave that to the
|
|
span <code class="display"><span class="extract">notecue</span></code> if we have CSS, and otherwise render in grey superscript.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Typeset a footnote cue</span> <span class="cwebmacronumber">22.4.7.3.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"<a name=\</span><span class="plain">"</span><span class="string">note%dref\</span><span class="plain">"</span><span class="string">></a>"</span><span class="plain">, </span><span class="identifier">next_footnote_number</span><span class="plain">);</span>
|
|
<span class="functiontext">Websites::open_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"notecue"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"<a href=\</span><span class="plain">"</span><span class="string">#note%d\</span><span class="plain">"</span><span class="string">>[%d]</a>"</span><span class="plain">,</span>
|
|
<span class="identifier">next_footnote_number</span><span class="plain">, </span><span class="identifier">next_footnote_number</span><span class="plain">);</span>
|
|
<span class="functiontext">Websites::close_style</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"notecue"</span><span class="plain">);</span>
|
|
<span class="identifier">next_footnote_number</span><span class="plain">++;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP22_4_7_3">§22.4.7.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23"></a><b>§23. </b>That just leaves the little contents listings — one for the source, and
|
|
another for the documentation (if any).
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Websites::typeset_contents_listing</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">source_contents</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">benchmark_level</span><span class="plain"> = (</span><span class="identifier">source_contents</span><span class="plain">)?0:</span><span class="constant">DOC_CHAPTER_LEVEL</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">current_level</span><span class="plain"> = </span><span class="identifier">benchmark_level</span><span class="plain">-1, </span><span class="identifier">new_level</span><span class="plain">;</span>
|
|
<span class="reserved">heading</span><span class="plain"> *</span><span class="identifier">h</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">h</span><span class="plain">, </span><span class="reserved">heading</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">source_contents</span><span class="plain">) && (</span><span class="identifier">h</span><span class="plain">-</span><span class="element">>heading_line</span><span class="plain"> < </span><span class="identifier">position_of_documentation_bar</span><span class="plain">)) ||</span>
|
|
<span class="plain">((</span><span class="identifier">source_contents</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) && (</span><span class="identifier">h</span><span class="plain">-</span><span class="element">>heading_line</span><span class="plain"> > </span><span class="identifier">position_of_documentation_bar</span><span class="plain">))) {</span>
|
|
<span class="identifier">new_level</span><span class="plain"> = </span><span class="identifier">h</span><span class="plain">-</span><span class="element">>heading_level</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain">-</span><span class="element">>heading_level</span><span class="plain"> == </span><span class="constant">EXAMPLE_LEVEL</span><span class="plain">) </span><span class="identifier">new_level</span><span class="plain"> = </span><span class="constant">DOC_CHAPTER_LEVEL</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Open or close UL tags to move to the new heading level</span> <span class="cwebmacronumber">23.1</span>><span class="plain">;</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"<li><a href=\</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string">>%S</a></li>\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
|
|
<span class="identifier">h</span><span class="plain">-</span><span class="element">>heading_to_segment</span><span class="plain">-</span><span class="element">>segment_url</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">-</span><span class="element">>heading_text</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">new_level</span><span class="plain"> = </span><span class="identifier">benchmark_level</span><span class="plain">-1;</span>
|
|
<<span class="cwebmacro">Open or close UL tags to move to the new heading level</span> <span class="cwebmacronumber">23.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Websites::typeset_contents_listing is used in <a href="#SP22_1">§22.1</a>, <a href="#SP22_2">§22.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP23_1"></a><b>§23.1. </b>This is how we obtain our nested UL tags: <code class="display"><span class="extract">current_level</span></code> starts and ends at
|
|
b-1, and can only change its value by executing the following loops. Since
|
|
it never changes to a value lower than 0 except when returning to b-1 at
|
|
the end, we are always inside at least the outermost <code class="display"><span class="extract"><ul></span></code>, and since the
|
|
net change over the whole process is 0, there must be as many steps upward
|
|
as downward — so every <code class="display"><span class="extract"><ul></span></code> is closed by a matching <code class="display"><span class="extract"></ul></span></code>.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Open or close UL tags to move to the new heading level</span> <span class="cwebmacronumber">23.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">new_level</span><span class="plain"> > </span><span class="identifier">current_level</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"<ul>"</span><span class="plain">); </span><span class="identifier">current_level</span><span class="plain">++; }</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">new_level</span><span class="plain"> < </span><span class="identifier">current_level</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">SPAGE</span><span class="plain">, </span><span class="string">"</ul>"</span><span class="plain">); </span><span class="identifier">current_level</span><span class="plain">--; }</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP23">§23</a> (twice).</p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="3-tmp.html">Back to 'Templates'</a></li><li><a href="3-bs6.html">Continue with 'Base64'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|