mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 18:14:21 +03:00
1110 lines
150 KiB
HTML
1110 lines
150 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Renderer</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="../index.html">
|
|
<img src="../docs-src/Figures/Inform.png" height=72">
|
|
</a></h1>
|
|
<ul><li><a href="../compiler.html">compiler tools</a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul><h2>Other Tools</h2><ul>
|
|
<li><a href="../inblorb/index.html">inblorb</a></li>
|
|
<li><a href="index.html"><span class="selectedlink">indoc</span></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 'Renderer' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../other.html">Other Tools</a></li><li><a href="index.html">indoc</a></li><li><a href="index.html#2">Chapter 2: Processing</a></li><li><b>Renderer</b></li></ul><p class="purpose">The general output apparatus for writing a block of documentation.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Definitions</a></li><li><a href="#SP7">§7. Block buffer</a></li><li><a href="#SP9">§9. Top-level renderer</a></li><li><a href="#SP11">§11. Rendering text</a></li><li><a href="#SP11_2_1">§11.2.1. Code mode</a></li><li><a href="#SP11_2_4">§11.2.4. Tabular mode</a></li><li><a href="#SP11_2_7">§11.2.7. Regular mode</a></li><li><a href="#SP11_2_2_3">§11.2.2.3. Javascript paste icons</a></li><li><a href="#SP14">§14. Rendering cross-references to other sections</a></li><li><a href="#SP16">§16. Handling the formatted file</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>The output mechanism produces documentation in chunks called "blocks", and
|
|
it has a buffer which stores one block at a time. Each block contains a
|
|
list of paragraphs, numbered from 0.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">MAX_PARAGRAPHS_PER_BLOCK</span><span class="plain"> </span><span class="constant">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">paragraph</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">par_indentation</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">par_suppression</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">par_texts</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">par_prefix</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">par_styles</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">par_shortened</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">paragraph</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure paragraph is accessed in 2/rr and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_paras_in_block_buffer</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">paragraph</span><span class="plain"> </span><span class="identifier">paragraphs</span><span class="plain">[</span><span class="constant">MAX_PARAGRAPHS_PER_BLOCK</span><span class="plain">];</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>The blocks are written to a file of "formatted text":
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">current_FTD_filename</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment"> with <code class="display"><span class="extract">NULL</span></code> meaning that no file is open</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">current_FTD_stream</span><span class="plain">; </span><span class="comment"> otherwise, this is where the text goes</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>It's convenient to record all the formatted text filenames written to, and
|
|
those are the keys of the following hash:
|
|
</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">formatted_file</span><span class="plain"> {</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">;</span>
|
|
<span class="constant">MEMORY_MANAGEMENT</span>
|
|
<span class="plain">} </span><span class="reserved">formatted_file</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure formatted_file is accessed in 2/utc and here.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>Miscellaneously:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">Javascript_paste_count</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="comment"> used to make unique ID numbers for paste icons</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">index_to_examples</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">; </span><span class="comment"> used to index examples to particular sections</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">unique_code_pos_counter</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="comment"> used to uniquely ID code samples</span>
|
|
<span class="reserved">example</span><span class="plain"> *</span><span class="identifier">code_example</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Block buffer. </b>When the scanner starts a new block, it calls this:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Renderer::clear_block_buffer<button class="popup" onclick="togglePopup('usagePopup36')">...<span class="popuptext" id="usagePopup36">Usage of <b>Renderer::clear_block_buffer</b>:<br>Rawtext Reader - <a href="2-rr.html#SP3_2">§3.2</a></span></button></span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="identifier">no_paras_in_block_buffer</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">index_to_examples</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="inwebparagraph"><a id="SP8"></a><b>§8. </b>It then calls this to add paragraphs to the block:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Renderer::add_para_to_block_buffer<button class="popup" onclick="togglePopup('usagePopup37')">...<span class="popuptext" id="usagePopup37">Usage of <b>Renderer::add_para_to_block_buffer</b>:<br>Rawtext Reader - <a href="2-rr.html#SP4_7">§4.7</a></span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">indentation</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">suppression</span><span class="plain">,</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">prefix</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">style</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">shortened</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_paras_in_block_buffer</span><span class="plain"> >= </span><span class="constant">MAX_PARAGRAPHS_PER_BLOCK</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="3-em.html#SP2">Errors::fatal</a></span><span class="plain">(</span><span class="string">"too many paragraphs in block"</span><span class="plain">);</span>
|
|
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = &</span><span class="identifier">paragraphs</span><span class="plain">[</span><span class="identifier">no_paras_in_block_buffer</span><span class="plain">++];</span>
|
|
<span class="identifier">P</span><span class="plain">-></span><span class="element">par_indentation</span><span class="plain"> = </span><span class="identifier">indentation</span><span class="plain">;</span>
|
|
<span class="identifier">P</span><span class="plain">-></span><span class="element">par_texts</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
|
|
<span class="identifier">P</span><span class="plain">-></span><span class="element">par_suppression</span><span class="plain"> = </span><span class="identifier">suppression</span><span class="plain">;</span>
|
|
<span class="identifier">P</span><span class="plain">-></span><span class="element">par_prefix</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">prefix</span><span class="plain">);</span>
|
|
<span class="identifier">P</span><span class="plain">-></span><span class="element">par_styles</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP3">Str::duplicate</a></span><span class="plain">(</span><span class="identifier">style</span><span class="plain">);</span>
|
|
<span class="identifier">P</span><span class="plain">-></span><span class="element">par_shortened</span><span class="plain"> = </span><span class="identifier">shortened</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Top-level renderer. </b>If the block consists of text from a section, then the scanner calls the
|
|
following when the buffer is filled. If, on the other hand, the block
|
|
comes from an example, it calls <code class="display"><span class="extract">render_text_of_block</span></code> instead, a simpler
|
|
routine which doesn't surround the text with navigational gadgets and headings.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Renderer::render_block<button class="popup" onclick="togglePopup('usagePopup38')">...<span class="popuptext" id="usagePopup38">Usage of <b>Renderer::render_block</b>:<br>Rawtext Reader - <a href="2-rr.html#SP3_3">§3.3</a></span></button></span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
|
<span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext"><a href="#SP16">Renderer::formatted_file_must_be</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="4-nd.html#SP2">Nav::render_navigation_top</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="#SP11">Renderer::render_text_of_block</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="4-nd.html#SP4">Nav::render_navigation_middle</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Render the examples below the text of the block</span> <span class="cwebmacronumber">9.1</span>><span class="plain">;</span>
|
|
<span class="functiontext"><a href="4-nd.html#SP7">Nav::render_navigation_bottom</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
|
|
<span class="reserved">return</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="inwebparagraph"><a id="SP9_1"></a><b>§9.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Render the examples below the text of the block</span> <span class="cwebmacronumber">9.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">form_of_title_to_test</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Adapt the block title to the form of the title to test</span> <span class="cwebmacronumber">9.1.1</span>><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_examples_rendered_here</span><span class="plain"> = </span><span class="constant">0</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">n</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">n</span><span class="plain"> < </span><span class="identifier">no_examples</span><span class="plain">; </span><span class="identifier">n</span><span class="plain">++) {</span>
|
|
<span class="reserved">example</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-></span><span class="element">examples_sequence</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">];</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain">-></span><span class="element">example_displayed_at_section</span><span class="plain">[</span><span class="identifier">V</span><span class="plain">-></span><span class="element">allocation_id</span><span class="plain">] == </span><span class="identifier">S</span><span class="plain">) {</span>
|
|
<span class="identifier">no_examples_rendered_here</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_examples_rendered_here</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="4-nd.html#SP5">Nav::render_navigation_example_top</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Render the example here</span> <span class="cwebmacronumber">9.1.2</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">examples_mode</span><span class="plain"> == </span><span class="constant">EXMODE_open_internal</span><span class="plain">) </span><span class="functiontext"><a href="2-haj.html#SP12">HTMLUtilities::ruled_line</a></span><span class="plain">(</span><span class="identifier">OUT</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">no_examples_rendered_here</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="4-nd.html#SP6">Nav::render_navigation_example_bottom</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP9">§9</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9_1_1"></a><b>§9.1.1. </b>Examples need to connect with particular sections of documentation, but
|
|
they do so by title, not by block number, to protect them from renumbering
|
|
as sections are added or removed. So if the current block is called
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">2.3. Sailing Ships</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">then we need to look for the text <code class="display"><span class="extract">Sailing Ships</span></code> to see if an example
|
|
belongs here. (But, owing to a historical accident, in the Recipe Book
|
|
section names are capitalised for this purpose.)
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Adapt the block title to the form of the title to test</span> <span class="cwebmacronumber">9.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">form_of_title_to_test</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">unlabelled_title</span><span class="plain">);</span>
|
|
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">form_of_title_to_test</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%d+.)* *(%c*)"</span><span class="plain">)) {</span>
|
|
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">form_of_title_to_test</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]); </span><span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-></span><span class="element">allocation_id</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">)</span>
|
|
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">form_of_title_to_test</span><span class="plain">)</span>
|
|
<span class="functiontext"><a href="4-sm.html#SP14">Str::put</a></span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="functiontext"><a href="4-chr.html#SP1">Characters::toupper</a></span><span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get</a></span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">)));</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP9_1">§9.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9_1_2"></a><b>§9.1.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Render the example here</span> <span class="cwebmacronumber">9.1.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">index_term</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">index_term</span><span class="plain">, </span><span class="string">"%S=___=!example"</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-></span><span class="element">ex_public_name</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="3-gi.html#SP6">Indexes::mark_index_term</a></span><span class="plain">(</span><span class="identifier">index_term</span><span class="plain">, </span><span class="identifier">V</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="identifier">E</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="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">index_term</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">format</span><span class="plain"> == </span><span class="constant">HTML_FORMAT</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">, </span><span class="string">"START EXAMPLE \"%d: %S\" \"e%d\""</span><span class="plain">,</span>
|
|
<span class="identifier">E</span><span class="plain">-></span><span class="element">example_position</span><span class="plain">[0], </span><span class="identifier">E</span><span class="plain">-></span><span class="element">ex_public_name</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-></span><span class="element">allocation_id</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="5-htm.html#SP19">HTML::comment</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">comment</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext"><a href="2-exm.html#SP8">Examples::render_example_cue</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="identifier">code_example</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">;</span>
|
|
<span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext"><a href="#SP10">Renderer::render_example_body</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
|
|
<span class="identifier">code_example</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">indoc_settings</span><span class="plain">-></span><span class="element">format</span><span class="plain"> == </span><span class="constant">HTML_FORMAT</span><span class="plain">) </span><span class="functiontext"><a href="5-htm.html#SP19">HTML::comment</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"END EXAMPLE"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP9_1">§9.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Renderer::render_example_body<button class="popup" onclick="togglePopup('usagePopup39')">...<span class="popuptext" id="usagePopup39">Usage of <b>Renderer::render_example_body</b>:<br><a href="#SP9_1_2">§9.1.2</a></span></button></span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">example</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">, </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">empty</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">hide</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">indoc_settings</span><span class="plain">-></span><span class="element">examples_mode</span><span class="plain"> == </span><span class="constant">EXMODE_openable_internal</span><span class="plain">) </span><span class="identifier">hide</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">indoc_settings</span><span class="plain">-></span><span class="element">format</span><span class="plain"> == </span><span class="constant">HTML_FORMAT</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="string">"example%d"</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">-></span><span class="element">allocation_id</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="5-htm.html#SP13">HTML::begin_div_with_class_and_id_S</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"egpanel"</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">hide</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext"><a href="2-rr.html#SP2">Rawtext::process_example_rawtext_file</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">format</span><span class="plain"> == </span><span class="constant">HTML_FORMAT</span><span class="plain">) {</span>
|
|
<span class="functiontext"><a href="5-htm.html#SP13">HTML::end_div</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">empty</span><span class="plain">) { </span><span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); }</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</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="inwebparagraph"><a id="SP11"></a><b>§11. Rendering text. </b>The actual contents of the buffer are rendered here, then:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Renderer::render_text_of_block<button class="popup" onclick="togglePopup('usagePopup40')">...<span class="popuptext" id="usagePopup40">Usage of <b>Renderer::render_text_of_block</b>:<br><a href="#SP9">§9</a>, Rawtext Reader - <a href="2-rr.html#SP3_3">§3.3</a></span></button></span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">format</span><span class="plain"> == </span><span class="constant">PLAIN_FORMAT</span><span class="plain">) </span><<span class="cwebmacro">Render the block buffer as plain text</span> <span class="cwebmacronumber">11.1</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">format</span><span class="plain"> == </span><span class="constant">HTML_FORMAT</span><span class="plain">) </span><<span class="cwebmacro">Render the block buffer as HTML</span> <span class="cwebmacronumber">11.2</span>><span class="plain">;</span>
|
|
<span class="reserved">return</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="inwebparagraph"><a id="SP11_1"></a><b>§11.1. </b>Plain text is very plain indeed:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Render the block buffer as plain text</span> <span class="cwebmacronumber">11.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">no_paras_in_block_buffer</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="comment"> Indent using tabs</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ic</span><span class="plain"> = </span><span class="identifier">paragraphs</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">].</span><span class="element">par_indentation</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">ic</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">ic</span><span class="plain">--; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\t"</span><span class="plain">); }</span>
|
|
|
|
<span class="comment"> Remove any paste markers entirely</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">raw</span><span class="plain"> = </span><span class="identifier">paragraphs</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">].</span><span class="identifier">par_texts</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"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">treat_code_as_verbatim</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">raw</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"{%*+} *(%c*)"</span><span class="plain">)))</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S\n"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S\n"</span><span class="plain">, </span><span class="identifier">raw</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11">§11</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2"></a><b>§11.2. </b>HTML is more work:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Render the block buffer as HTML</span> <span class="cwebmacronumber">11.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">code_mode</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">tabular_mode</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">last_xref_type</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="comment"> 0 means "none"; 1 means "to section"; 2 means "to example"</span>
|
|
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="identifier">no_paras_in_block_buffer</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
|
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = &(</span><span class="identifier">paragraphs</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-></span><span class="element">par_indentation</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tabular_mode</span><span class="plain">) </span><<span class="cwebmacro">Exit tabular mode</span> <span class="cwebmacronumber">11.2.6</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">code_mode</span><span class="plain">) </span><<span class="cwebmacro">Exit code mode</span> <span class="cwebmacronumber">11.2.3</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Look for cross-references and then render</span> <span class="cwebmacronumber">11.2.7</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">tabular_mode</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">code_mode</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><<span class="cwebmacro">Enter code mode</span> <span class="cwebmacronumber">11.2.1</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">par_texts</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c*%C\t+%C%c*"</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Enter tabular mode</span> <span class="cwebmacronumber">11.2.4</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tabular_mode</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Render the tab-divided line as an HTML table row</span> <span class="cwebmacronumber">11.2.5</span>>
|
|
<span class="reserved">else</span>
|
|
<<span class="cwebmacro">Render the line in code mode</span> <span class="cwebmacronumber">11.2.2</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">tabular_mode</span><span class="plain">) </span><<span class="cwebmacro">Exit tabular mode</span> <span class="cwebmacronumber">11.2.6</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">code_mode</span><span class="plain">) </span><<span class="cwebmacro">Exit code mode</span> <span class="cwebmacronumber">11.2.3</span>><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11">§11</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2_1"></a><b>§11.2.1. Code mode. </b>Code mode is when the renderer is working on a displayed quotation of source
|
|
code, broken off from the main narrative.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Enter code mode</span> <span class="cwebmacronumber">11.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">code_mode</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="string">"c%d"</span><span class="plain">, ++</span><span class="identifier">unique_code_pos_counter</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">code_example</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="string">"_%d"</span><span class="plain">, </span><span class="identifier">code_example</span><span class="plain">-></span><span class="element">allocation_id</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">, </span><span class="string">"START CODE \"%S\""</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="5-htm.html#SP19">HTML::comment</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">comment</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"blockquote"</span><span class="plain">, </span><span class="string">"class=\"code\""</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">, </span><span class="string">"class=\"quoted\""</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="5-htm.html#SP15">HTML::anchor</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11_2">§11.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2_2"></a><b>§11.2.2. </b>Quoted code is pretty well passed through in raw form, except for Javascript
|
|
paste markers, which occupy a lot of code below but don't actually come up
|
|
very much.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Render the line in code mode</span> <span class="cwebmacronumber">11.2.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<<span class="cwebmacro">Render some indentation</span> <span class="cwebmacronumber">11.2.2.1</span>><span class="plain">;</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">par_texts</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">treat_code_as_verbatim</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) {</span>
|
|
|
|
<span class="functiontext"><a href="4-pm.html#SP14">Regexp::replace</a></span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"{%*%*}"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">); </span><span class="comment"> Remove any paste-continuation marker</span>
|
|
|
|
<<span class="cwebmacro">Take note of any named inline example</span> <span class="cwebmacronumber">11.2.2.2</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"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">raw</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?){%*}(%c*)"</span><span class="plain">)) {</span>
|
|
<<span class="cwebmacro">Convert this paste marker to a Javascript paste mechanism</span> <span class="cwebmacronumber">11.2.2.3</span>><span class="plain">;</span>
|
|
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S\n"</span><span class="plain">, </span><span class="identifier">raw</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11_2">§11.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2_2_1"></a><b>§11.2.2.1. </b>A distinctly olde-worlde way to indent.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Render some indentation</span> <span class="cwebmacronumber">11.2.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ic</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">-></span><span class="element">par_indentation</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">ic</span><span class="plain"> > </span><span class="constant">1</span><span class="plain">) { </span><span class="identifier">ic</span><span class="plain">--; </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&#160;&#160;&#160;&#160;"</span><span class="plain">); }</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11_2_2">§11.2.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2_2_2"></a><b>§11.2.2.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Take note of any named inline example</span> <span class="cwebmacronumber">11.2.2.2</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"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">index_to_examples</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">raw</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"{%*}&quot;(%c*)&quot;%c*"</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP21">Str::ne_wide_string</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">L</span><span class="string">"Midsummer Day"</span><span class="plain">))) {</span>
|
|
<span class="functiontext"><a href="3-ei.html#SP2">ExamplesIndex::add_to_alphabetic_examples_index</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11_2_2">§11.2.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2_3"></a><b>§11.2.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Exit code mode</span> <span class="cwebmacronumber">11.2.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">code_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"blockquote"</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="5-htm.html#SP19">HTML::comment</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"END CODE"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11_2">§11.2</a> (twice).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2_4"></a><b>§11.2.4. Tabular mode. </b>Tabular mode is not an alternative to code mode: it's a deeper mode within
|
|
it, and is used for a display of I7 source text (i.e., code) when it needs
|
|
to show a Table.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Enter tabular mode</span> <span class="cwebmacronumber">11.2.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">tabular_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"blockquote"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"table"</span><span class="plain">, </span><span class="string">"class=\"codetable\""</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11_2">§11.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2_5"></a><b>§11.2.5. </b>Within tabular mode, the following renders lines.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Note that any run of one or more tabs is treated as a single column
|
|
division, and that leading or trailing tabs are ignored — so there is no
|
|
way to code for an entirely empty cell. (This is fine for Inform documentation
|
|
purposes since the only empty cells are trailing ones in the line anyway;
|
|
people use the blank marker <code class="display"><span class="extract">--</span></code> explicitly if they want blanks.)
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Render the tab-divided line as an HTML table row</span> <span class="cwebmacronumber">11.2.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"tr"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"td"</span><span class="plain">, </span><span class="string">"class=\"quotedtablecell\""</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">, </span><span class="string">"class=\"quoted\""</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">row</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"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
|
|
<span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">par_texts</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *(%c*?) *"</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">row</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]); </span><span class="comment"> Strip leading and trailing space</span>
|
|
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">row</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?)\t+(%c*)"</span><span class="plain">)) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]); </span><span class="comment"> Place a cell division at any run of one or more tabs</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"td"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"td"</span><span class="plain">, </span><span class="string">"class=\"quotedtablecell\""</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">, </span><span class="string">"class=\"quoted\""</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">row</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">row</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">row</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"td"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"tr"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11_2">§11.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2_6"></a><b>§11.2.6. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Exit tabular mode</span> <span class="cwebmacronumber">11.2.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">tabular_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"table"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"blockquote"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11_2">§11.2</a> (twice).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2_7"></a><b>§11.2.7. Regular mode. </b>So this is what happens when we're not in either tabular or code mode.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The foot of a block of documentation sometimes contains cross-references
|
|
to other blocks (resolved by name), and this is where we recognise and
|
|
convert those to HTML links.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Look for cross-references and then render</span> <span class="cwebmacronumber">11.2.7</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"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">par_texts</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%((-*)See {(%c*?)} for (%c*?).%) *"</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]) == </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="functiontext"><a href="#SP14">Renderer::render_cross_reference</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2], </span><span class="identifier">V</span><span class="plain">, </span><span class="constant">0</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">last_xref_type</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"hr"</span><span class="plain">); }</span>
|
|
<span class="functiontext"><a href="#SP14">Renderer::render_cross_reference</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2], </span><span class="identifier">V</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">last_xref_type</span><span class="plain"> = </span><span class="constant">1</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"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="identifier">par_texts</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%((-*)See (%c*?) for (%c*?).%) *"</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]) == </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="functiontext"><a href="#SP14">Renderer::render_cross_reference</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2], </span><span class="identifier">V</span><span class="plain">, </span><span class="constant">0</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">last_xref_type</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"hr"</span><span class="plain">); }</span>
|
|
<span class="functiontext"><a href="#SP14">Renderer::render_cross_reference</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2], </span><span class="identifier">V</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">last_xref_type</span><span class="plain"> = </span><span class="constant">1</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"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="identifier">par_texts</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%(See example &quot;(%c*?)&quot;%) *"</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last_xref_type</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) { </span><span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"hr"</span><span class="plain">); }</span>
|
|
<span class="functiontext"><a href="#SP15">Renderer::render_example_cross_reference</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">V</span><span class="plain">);</span>
|
|
<span class="identifier">last_xref_type</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Render a non-quotation paragraph to HTML</span> <span class="cwebmacronumber">11.2.7.1</span>><span class="plain">;</span>
|
|
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></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="#SP11_2">§11.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2_7_1"></a><b>§11.2.7.1. </b>Blank lines are simply ignored.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Render a non-quotation paragraph to HTML</span> <span class="cwebmacronumber">11.2.7.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">par_texts</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *"</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">"%S"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">par_prefix</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-></span><span class="element">par_suppression</span><span class="plain"> == </span><span class="constant">TRUE</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S\n"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">par_texts</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"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">P</span><span class="plain">-></span><span class="element">par_styles</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="string">"class=\"%S\""</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">par_styles</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="5-htm.html#SP7">HTML::open</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"p"</span><span class="plain">, </span><span class="identifier">details</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">par_texts</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">par_texts</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11_2_7">§11.2.7</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2_2_3"></a><b>§11.2.2.3. Javascript paste icons. </b>That's the whole rendering routine, except for the handling of Javascript
|
|
paste icons. In rawtext, these look like so:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">{*}A useful sentence.</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">The <code class="display"><span class="extract">{*}</span></code> is replaced by a button which, when clicked on, performs a Javascript
|
|
function call to paste "A useful sentence" into the Inform application's
|
|
source text pane. (Note that the "A useful sentence" text is still also
|
|
rendered on screen — it doesn't vanish into the button.) These pastes
|
|
can occur only in code mode, and can extend for multiple lines, as we'll
|
|
see below.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Convert this paste marker to a Javascript paste mechanism</span> <span class="cwebmacronumber">11.2.2.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">right</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">right</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">javascript_paste_method</span><span class="plain"> == </span><span class="constant">PASTEMODE_none</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">right</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">raw</span><span class="plain">, </span><span class="string">"<a href=\"javascript:pasteCode"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">javascript_paste_method</span><span class="plain"> == </span><span class="constant">PASTEMODE_David</span><span class="plain">) {</span>
|
|
<span class="identifier">Javascript_paste_count</span><span class="plain">++;</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">Javascript_paste_count</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="string">"("</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">J_text</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Determine the quoted J-text</span> <span class="cwebmacronumber">11.2.2.3.1</span>><span class="plain">;</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">titling</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">code_example</span><span class="plain">) {</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">titling</span><span class="plain">, </span><span class="string">"Example - "</span><span class="plain">);</span>
|
|
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">code_example</span><span class="plain">-></span><span class="element">ex_public_name</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get</a></span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\''</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">titling</span><span class="plain">, </span><span class="string">"\\'"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">titling</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext"><a href="#SP13">Renderer::apply_Inform_escape_characters</a></span><span class="plain">(</span><span class="identifier">titling</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">javascript_paste_method</span><span class="plain"> == </span><span class="constant">PASTEMODE_Andrew</span><span class="plain">)</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="string">"'%S\\n'"</span><span class="plain">, </span><span class="identifier">J_text</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="string">")\">"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">retina_images</span><span class="plain">) </span><span class="functiontext"><a href="2-haj.html#SP13">HTMLUtilities::image_element_scaled</a></span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"paste@2x.png"</span><span class="plain">, </span><span class="constant">13</span><span class="plain">, </span><span class="constant">13</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext"><a href="2-haj.html#SP13">HTMLUtilities::image_element</a></span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"paste.png"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="string">"</a> "</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">support_creation</span><span class="plain">) && (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">titling</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">)) {</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="string">"<a href=\"javascript:createNewProject"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">javascript_paste_method</span><span class="plain"> == </span><span class="constant">PASTEMODE_David</span><span class="plain">)</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">Javascript_paste_count</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="string">"("</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">javascript_paste_method</span><span class="plain"> == </span><span class="constant">PASTEMODE_Andrew</span><span class="plain">)</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="string">"'%S\\n', '%S'"</span><span class="plain">, </span><span class="identifier">J_text</span><span class="plain">, </span><span class="identifier">titling</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="string">")\">"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">retina_images</span><span class="plain">) {</span>
|
|
<span class="functiontext"><a href="2-haj.html#SP13">HTMLUtilities::image_element_scaled</a></span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"create@2x.png"</span><span class="plain">, </span><span class="constant">26</span><span class="plain">, </span><span class="constant">13</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="functiontext"><a href="2-haj.html#SP13">HTMLUtilities::image_element</a></span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"create.png"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="string">"</a>"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="string">"&nbsp;&nbsp; "</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">raw</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">right</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">javascript</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">javascript_paste_method</span><span class="plain"> == </span><span class="constant">PASTEMODE_David</span><span class="plain">)) {</span>
|
|
<span class="functiontext"><a href="2-haj.html#SP19">HTMLUtilities::paste_script</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">J_text</span><span class="plain">, </span><span class="identifier">Javascript_paste_count</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-haj.html#SP19">HTMLUtilities::create_script</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">J_text</span><span class="plain">, </span><span class="identifier">Javascript_paste_count</span><span class="plain">, </span><span class="identifier">titling</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="#SP11_2_2">§11.2.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2_2_3_1"></a><b>§11.2.2.3.1. </b>The rawtext is doing something like this:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">{*}A ball is in the bag.</span>
|
|
<span class="plain">The bag is on the kitchen table.</span>
|
|
|
|
<span class="plain">This single sentence doesn"t make much of a simulation. Let"s add:</span>
|
|
|
|
<span class="plain">{**}The stitched seam is part of the ball.</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">The line count <code class="display"><span class="extract">i</span></code> points to the first line of this. The paste consists
|
|
of the two lines about the bag and the table, but with the stitched seam
|
|
line added in, because of the <code class="display"><span class="extract">{**}</span></code> continuation marker. The "range" is
|
|
down to the last line which is included in the paste.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Determine the quoted J-text</span> <span class="cwebmacronumber">11.2.2.3.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">up_to</span><span class="plain">; </span><span class="comment"> one line beyond what will be pasted</span>
|
|
<<span class="cwebmacro">Find the range of rawtext lines which fall into this paste</span> <span class="cwebmacronumber">11.2.2.3.1.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Collate the indented lines in that range into the J-text</span> <span class="cwebmacronumber">11.2.2.3.1.2</span>><span class="plain">;</span>
|
|
<span class="functiontext"><a href="#SP13">Renderer::apply_Inform_escape_characters</a></span><span class="plain">(</span><span class="identifier">J_text</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11_2_2_3">§11.2.2.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2_2_3_1_1"></a><b>§11.2.2.3.1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Find the range of rawtext lines which fall into this paste</span> <span class="cwebmacronumber">11.2.2.3.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">up_to</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">; ((</span><span class="identifier">up_to</span><span class="plain"><</span><span class="identifier">no_paras_in_block_buffer</span><span class="plain">) &&</span>
|
|
<span class="plain">((</span><span class="identifier">paragraphs</span><span class="plain">[</span><span class="identifier">up_to</span><span class="plain">].</span><span class="element">par_indentation</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">paragraphs</span><span class="plain">[</span><span class="identifier">up_to</span><span class="plain">].</span><span class="element">par_texts</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">))); </span><span class="identifier">up_to</span><span class="plain">++) { ; }</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">extended_range</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">extended_range</span><span class="plain">) {</span>
|
|
<span class="identifier">extended_range</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">l</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">up_to</span><span class="plain">; ((</span><span class="identifier">l</span><span class="plain"><</span><span class="identifier">no_paras_in_block_buffer</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">paragraphs</span><span class="plain">[</span><span class="identifier">l</span><span class="plain">].</span><span class="element">par_indentation</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)); </span><span class="identifier">l</span><span class="plain">++) { ; }</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">l</span><span class="plain"><</span><span class="identifier">no_paras_in_block_buffer</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">paragraphs</span><span class="plain">[</span><span class="identifier">l</span><span class="plain">].</span><span class="element">par_texts</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c*{%*%*}%c*"</span><span class="plain">))) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">l</span><span class="plain">++; ((</span><span class="identifier">l</span><span class="plain"><</span><span class="identifier">no_paras_in_block_buffer</span><span class="plain">) &&</span>
|
|
<span class="plain">((</span><span class="identifier">paragraphs</span><span class="plain">[</span><span class="identifier">l</span><span class="plain">].</span><span class="element">par_indentation</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">paragraphs</span><span class="plain">[</span><span class="identifier">l</span><span class="plain">].</span><span class="element">par_texts</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">))); </span><span class="identifier">l</span><span class="plain">++) { ; }</span>
|
|
<span class="identifier">up_to</span><span class="plain"> = </span><span class="identifier">l</span><span class="plain">; </span><span class="identifier">extended_range</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11_2_2_3_1">§11.2.2.3.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11_2_2_3_1_2"></a><b>§11.2.2.3.1.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Collate the indented lines in that range into the J-text</span> <span class="cwebmacronumber">11.2.2.3.1.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=</span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">j</span><span class="plain"><</span><span class="identifier">up_to</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ic</span><span class="plain"> = </span><span class="identifier">paragraphs</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">].</span><span class="element">par_indentation</span><span class="plain">;</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">joinbit</span><span class="plain">);</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">ic</span><span class="plain"> > </span><span class="constant">1</span><span class="plain">) { </span><span class="identifier">ic</span><span class="plain">--; </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">J_text</span><span class="plain">, </span><span class="character">'\t'</span><span class="plain">); }</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain"> == </span><span class="identifier">i</span><span class="plain">) </span><span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">joinbit</span><span class="plain">, </span><span class="identifier">right</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">joinbit</span><span class="plain">, </span><span class="identifier">paragraphs</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">].</span><span class="element">par_texts</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">paragraphs</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">].</span><span class="element">par_indentation</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) && (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">joinbit</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">)) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">br</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">br</span><span class="plain">, </span><span class="string">"[%S]"</span><span class="plain">, </span><span class="identifier">joinbit</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">joinbit</span><span class="plain">, </span><span class="identifier">br</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">br</span><span class="plain">);</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">k</span><span class="plain">=0, </span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">joinbit</span><span class="plain">), </span><span class="identifier">prev_c</span><span class="plain"> = -1; </span><span class="identifier">k</span><span class="plain"><</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">k</span><span class="plain">++) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">joinbit</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">);</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">c</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">J_text</span><span class="plain">, </span><span class="string">"___backslash___"</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">J_text</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">'\t'</span><span class="plain">: </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prev_c</span><span class="plain"> != </span><span class="character">'\t'</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">J_text</span><span class="plain">, </span><span class="string">"\\t"</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="functiontext"><a href="4-sm.html#SP25">Str::includes_wide_string_at</a></span><span class="plain">(</span><span class="identifier">joinbit</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"amp;"</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">+1)) </span><span class="identifier">k</span><span class="plain"> += </span><span class="constant">4</span><span class="plain">;</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">J_text</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="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="functiontext"><a href="4-sm.html#SP25">Str::includes_wide_string_at</a></span><span class="plain">(</span><span class="identifier">joinbit</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"**}"</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">+1)) </span><span class="identifier">k</span><span class="plain"> += </span><span class="constant">3</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">J_text</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">J_text</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">prev_c</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">J_text</span><span class="plain">, </span><span class="character">'\n'</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">joinbit</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP11_2_2_3_1">§11.2.2.3.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Renderer::remove_paste_markers<button class="popup" onclick="togglePopup('usagePopup41')">...<span class="popuptext" id="usagePopup41">Usage of <b>Renderer::remove_paste_markers</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0, </span><span class="identifier">L</span><span class="plain">=</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">text</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"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'{'</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">text</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="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+2) == </span><span class="character">'*'</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+3) == </span><span class="character">'}'</span><span class="plain">)) {</span>
|
|
<span class="functiontext"><a href="#SP12">Renderer::remove_paste_markers_from</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</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">Renderer::remove_paste_markers_from<button class="popup" onclick="togglePopup('usagePopup42')">...<span class="popuptext" id="usagePopup42">Usage of <b>Renderer::remove_paste_markers_from</b>:<br>none</span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">modified</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">j</span><span class="plain">=0; </span><span class="identifier">j</span><span class="plain"><</span><span class="identifier">i</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">, </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">j</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">L</span><span class="plain">=</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">text</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">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'{'</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">text</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="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+2) == </span><span class="character">'*'</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+3) == </span><span class="character">'}'</span><span class="plain">)) </span><span class="identifier">i</span><span class="plain">+=3;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">modified</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. </b></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Renderer::apply_Inform_escape_characters<button class="popup" onclick="togglePopup('usagePopup43')">...<span class="popuptext" id="usagePopup43">Usage of <b>Renderer::apply_Inform_escape_characters</b>:<br><a href="#SP11_2_2_3">§11.2.2.3</a>, <a href="#SP11_2_2_3_1">§11.2.2.3.1</a></span></button></span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0, </span><span class="identifier">L</span><span class="plain">=</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">text</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">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">c</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">c</span><span class="plain"> = </span><span class="functiontext"><a href="4-sm.html#SP13">Str::get_at</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, ++</span><span class="identifier">i</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</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">modified</span><span class="plain">, </span><span class="string">"[=0x0027=]"</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">c</span><span class="plain"> == </span><span class="character">'t'</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">, </span><span class="string">"[=0x0009=]"</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">modified</span><span class="plain">, </span><span class="string">"\\%c"</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="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">modified</span><span class="plain">, </span><span class="string">"[=0x0022=]"</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">'\x0a'</span><span class="plain">: </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">, </span><span class="string">"[=0x000A=]"</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">'\x0d'</span><span class="plain">: </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">, </span><span class="string">"[=0x000A=]"</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">'\t'</span><span class="plain">: </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">, </span><span class="string">"[=0x0009=]"</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">modified</span><span class="plain">, </span><span class="string">"[=0x003C=]"</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">modified</span><span class="plain">, </span><span class="string">"[=0x003E=]"</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="functiontext"><a href="4-sm.html#SP25">Str::includes_wide_string_at</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"__backslash___"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1)) {</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">, </span><span class="string">"[=0x005C=]"</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">+=14;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="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="functiontext"><a href="4-sm.html#SP25">Str::includes_wide_string_at</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"quot;"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1)) {</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">, </span><span class="string">"[=0x0022=]"</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">+=5;</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"><a href="4-sm.html#SP25">Str::includes_wide_string_at</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"lt;"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1)) {</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">, </span><span class="string">"[=0x003C=]"</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">+=3;</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"><a href="4-sm.html#SP25">Str::includes_wide_string_at</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"gt;"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1)) {</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">, </span><span class="string">"[=0x003E=]"</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">+=3;</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">modified</span><span class="plain">, </span><span class="string">"[=0x0026=]"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">modified</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. Rendering cross-references to other sections. </b>These occur when the rawtext contains paragraphs with a very specific
|
|
arrangement:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">(-See Units for a more sophisticated capacity system.)</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">The idea is that, except for the brackets and dash, the text makes sense as
|
|
it stands; but in HTML, we can use the section title ("Units" here) to find
|
|
which block is meant, and encode this as a link.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Renderer::render_cross_reference<button class="popup" onclick="togglePopup('usagePopup44')">...<span class="popuptext" id="usagePopup44">Usage of <b>Renderer::render_cross_reference</b>:<br><a href="#SP11_2_7">§11.2.7</a></span></button></span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">,</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">sname</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">reason</span><span class="plain">, </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">quieter</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">format</span><span class="plain"> == </span><span class="constant">PLAIN_FORMAT</span><span class="plain">)</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(See %S for %S.)\n"</span><span class="plain">, </span><span class="identifier">sname</span><span class="plain">, </span><span class="identifier">reason</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">format</span><span class="plain"> == </span><span class="constant">HTML_FORMAT</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">dest</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">dest</span><span class="plain">, </span><span class="string">"index.html"</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Identify the reference destination and be sure it exists</span> <span class="cwebmacronumber">14.1</span>><span class="plain">;</span>
|
|
|
|
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">, </span><span class="string">"class=\"crossreference\""</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="5-htm.html#SP15">HTML::begin_link_with_class</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"xreflink"</span><span class="plain">, </span><span class="identifier">dest</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-haj.html#SP13">HTMLUtilities::asterisk_image</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"xref.png"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&#160;<i>See </i><b>%S</b>"</span><span class="plain">, </span><span class="identifier">sname</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="5-htm.html#SP15">HTML::end_link</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">quieter</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"i"</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" for %S"</span><span class="plain">, </span><span class="identifier">reason</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">quieter</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"i"</span><span class="plain">);</span>
|
|
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">dest</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14_1"></a><b>§14.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Identify the reference destination and be sure it exists</span> <span class="cwebmacronumber">14.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = (</span><span class="reserved">section</span><span class="plain"> *) </span><span class="functiontext"><a href="2-dct.html#SP8">Dictionaries::read_value</a></span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-></span><span class="element">sections_by_name</span><span class="plain">, </span><span class="identifier">sname</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">) </span><span class="functiontext"><a href="4-sm.html#SP16">Str::copy</a></span><span class="plain">(</span><span class="identifier">dest</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">section_URL</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext"><a href="3-em.html#SP7">Errors::with_text</a></span><span class="plain">(</span><span class="string">"cross-reference to %S points to no section"</span><span class="plain">, </span><span class="identifier">sname</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. </b>And similarly, for cross-referencing to examples by name:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">(See example "Blink")</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Renderer::render_example_cross_reference<button class="popup" onclick="togglePopup('usagePopup45')">...<span class="popuptext" id="usagePopup45">Usage of <b>Renderer::render_example_cross_reference</b>:<br><a href="#SP11_2_7">§11.2.7</a></span></button></span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ename</span><span class="plain">, </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">) {</span>
|
|
<span class="reserved">example</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = (</span><span class="reserved">example</span><span class="plain"> *) </span><span class="functiontext"><a href="2-dct.html#SP8">Dictionaries::read_value</a></span><span class="plain">(</span><span class="identifier">examples_by_name</span><span class="plain">, </span><span class="identifier">ename</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain">) </span><span class="functiontext"><a href="2-exm.html#SP8">Examples::render_example_cue</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">E</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext"><a href="3-em.html#SP7">Errors::with_text</a></span><span class="plain">(</span><span class="string">"cross-reference to %S points to no section"</span><span class="plain">, </span><span class="identifier">ename</span><span class="plain">);</span>
|
|
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. Handling the formatted file. </b>The idea is that several sections in a row may need to be written to the
|
|
same file, or may not. So this routine is called to guarantee that the
|
|
right file is open, rather than always to open one.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Renderer::formatted_file_must_be<button class="popup" onclick="togglePopup('usagePopup46')">...<span class="popuptext" id="usagePopup46">Usage of <b>Renderer::formatted_file_must_be</b>:<br><a href="#SP9">§9</a></span></button></span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="3-fln.html#SP11">Filenames::eq</a></span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-></span><span class="element">section_filename</span><span class="plain">, </span><span class="identifier">current_FTD_filename</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_FTD_filename</span><span class="plain">) </span><span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext"><a href="#SP16_1">Renderer::close_formatted_file</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
|
<span class="identifier">current_FTD_filename</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-></span><span class="element">section_filename</span><span class="plain">;</span>
|
|
<span class="identifier">OUT</span><span class="plain"> = &</span><span class="identifier">current_FTD_stream</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="2-str.html#SP24">Streams::open_to_file</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">section_filename</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"><a href="3-em.html#SP2">Errors::fatal_with_file</a></span><span class="plain">(</span><span class="string">"can't write documentation"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">section_filename</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">wrapper</span><span class="plain"> == </span><span class="constant">WRAPPER_epub</span><span class="plain">) {</span>
|
|
<span class="reserved">ebook_page</span><span class="plain"> *</span><span class="identifier">page</span><span class="plain"> =</span>
|
|
<span class="functiontext"><a href="5-ee.html#SP5">Epub::note_page</a></span><span class="plain">(</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">ebook</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">section_filename</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">section_file_title</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain"> == </span><span class="identifier">V</span><span class="plain">-></span><span class="element">sections</span><span class="plain">[0]) {</span>
|
|
<span class="reserved">ebook_volume</span><span class="plain"> *</span><span class="identifier">ev</span><span class="plain"> = </span><span class="functiontext"><a href="5-ee.html#SP5">Epub::starts_volume</a></span><span class="plain">(</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">ebook</span><span class="plain">, </span><span class="identifier">page</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-></span><span class="element">vol_title</span><span class="plain">);</span>
|
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext"><a href="3-fln.html#SP2">Filenames::in_folder</a></span><span class="plain">(</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">destination</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-></span><span class="element">vol_CSS_leafname</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="5-ee.html#SP5">Epub::use_CSS</a></span><span class="plain">(</span><span class="identifier">ev</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-></span><span class="element">begins_which_chapter</span><span class="plain">)</span>
|
|
<span class="identifier">S</span><span class="plain">-></span><span class="element">begins_which_chapter</span><span class="plain">-></span><span class="element">ebook_ref</span><span class="plain"> =</span>
|
|
<span class="functiontext"><a href="5-ee.html#SP5">Epub::starts_chapter</a></span><span class="plain">(</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">ebook</span><span class="plain">, </span><span class="identifier">page</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">begins_which_chapter</span><span class="plain">-></span><span class="element">chapter_full_title</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">begins_which_chapter</span><span class="plain">-></span><span class="element">chapter_URL</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">formatted_file</span><span class="plain"> *</span><span class="identifier">ftd</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">formatted_file</span><span class="plain">);</span>
|
|
<span class="identifier">ftd</span><span class="plain">-></span><span class="element">name</span><span class="plain"> = </span><span class="identifier">current_FTD_filename</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">format</span><span class="plain"> == </span><span class="constant">HTML_FORMAT</span><span class="plain">) </span><<span class="cwebmacro">Write the HTML header for the formatted file</span> <span class="cwebmacronumber">16.2</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</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="inwebparagraph"><a id="SP16_1"></a><b>§16.1. </b>When we certainly want to dispose of the current file:
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Renderer::close_formatted_file<button class="popup" onclick="togglePopup('usagePopup47')">...<span class="popuptext" id="usagePopup47">Usage of <b>Renderer::close_formatted_file</b>:<br><a href="#SP16">§16</a>, Rawtext Reader - <a href="2-rr.html#SP1">§1</a></span></button></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">current_FTD_filename</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">format</span><span class="plain"> == </span><span class="constant">HTML_FORMAT</span><span class="plain">) </span><<span class="cwebmacro">Write the HTML footer for the formatted file</span> <span class="cwebmacronumber">16.1.1</span>><span class="plain">;</span>
|
|
<span class="functiontext"><a href="2-str.html#SP34">Streams::close</a></span><span class="plain">(&</span><span class="identifier">current_FTD_stream</span><span class="plain">);</span>
|
|
<span class="identifier">current_FTD_filename</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">return</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="inwebparagraph"><a id="SP16_2"></a><b>§16.2. </b>The HTML files are topped and tailed either using a template supplied, or
|
|
with a <code class="display"><span class="extract"><head></span></code> we make ourselves.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Write the HTML header for the formatted file</span> <span class="cwebmacronumber">16.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">top</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-haj.html#SP24">HTMLUtilities::get_tt_matter</a></span><span class="plain">(</span><span class="identifier">top</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">top</span><span class="plain">) > </span><span class="constant">0</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"><a href="4-pm.html#SP9">Regexp::create_mr</a></span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-pm.html#SP10">Regexp::match</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">top</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?)<title>%c*?</title>(%c*)"</span><span class="plain">))</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S<title>Inform 7 - %S</title>%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">S</span><span class="plain">-></span><span class="element">section_file_title</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">top</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="4-pm.html#SP9">Regexp::dispose_of</a></span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="functiontext"><a href="2-haj.html#SP8">HTMLUtilities::begin_file</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-haj.html#SP8">HTMLUtilities::write_title</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">section_file_title</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">javascript</span><span class="plain">) {</span>
|
|
<span class="functiontext"><a href="5-htm.html#SP10">HTML::open_javascript</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-haj.html#SP16">HTMLUtilities::write_javascript_for_buttons</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="5-htm.html#SP10">HTML::close_javascript</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext"><a href="5-htm.html#SP8">HTML::end_head</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="5-htm.html#SP12">HTML::begin_body</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"paper papertint"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">javascript</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">indoc_settings</span><span class="plain">-></span><span class="element">javascript_paste_method</span><span class="plain"> == </span><span class="constant">PASTEMODE_Andrew</span><span class="plain">)) {</span>
|
|
<span class="functiontext"><a href="2-haj.html#SP19">HTMLUtilities::paste_script</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-haj.html#SP19">HTMLUtilities::create_script</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">top</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP16">§16</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP16_1_1"></a><b>§16.1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Write the HTML footer for the formatted file</span> <span class="cwebmacronumber">16.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">tail</span><span class="plain">);</span>
|
|
<span class="functiontext"><a href="2-haj.html#SP24">HTMLUtilities::get_tt_matter</a></span><span class="plain">(</span><span class="identifier">tail</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext"><a href="4-sm.html#SP8">Str::len</a></span><span class="plain">(</span><span class="identifier">tail</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">tail</span><span class="plain">); }</span>
|
|
<span class="reserved">else</span><span class="plain"> { </span><span class="functiontext"><a href="5-htm.html#SP12">HTML::end_body</a></span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">); }</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">tail</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP16_1">§16.1</a>.</p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="2-exm.html">Back to 'Examples'</a></li><li><a href="2-rr.html">Continue with 'Rawtext Reader'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
<script>
|
|
function togglePopup(material_id) {
|
|
var popup = document.getElementById(material_id);
|
|
popup.classList.toggle("show");
|
|
}
|
|
</script>
|
|
|
|
<link href="Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|