1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 16:44:21 +03:00
inform7/docs/inblorb/1-mn.html
2020-03-23 21:42:00 +00:00

428 lines
46 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>1/bsc</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html">compiler</a></li>
<li><a href="../other.html"><b>other tools</b></a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Other Tools</h2>
<ul>
<li><a href="../inblorb/index.html">inblorb</a></li>
<li><a href="../indoc/index.html">indoc</a></li>
<li><a href="../inpolicy/index.html">inpolicy</a></li>
<li><a href="../inrtps/index.html">inrtps</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '1/mn' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../other.html">Other Tools</a></li><li><a href="index.html">inblorb</a></li><li><a href="index.html#1">Chapter 1: Blurbs</a></li><li><b>Main</b></li></ul><p class="purpose">To parse command-line arguments, then start the Blurb interpreter, then report back to the user.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Some globals</a></li><li><a href="#SP3">&#167;3. Main</a></li><li><a href="#SP5">&#167;5. Opening and closing banners</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Some globals. </b>The following variables record HTML and Javascript-related points where
Inblorb needs to behave differently on the different platforms. The default
values here aren't actually correct for any platform as they stand: in the
<code class="display"><span class="extract">main</span></code> routine below, we set them as needed.
</p>
<pre class="display">
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">FONT_TAG</span><span class="plain"> = </span><span class="identifier">L</span><span class="string">"size=2"</span><span class="plain">; </span> <span class="comment">contents of a <code class="display"><span class="extract">&lt;font&gt;</span></code> tag</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">JAVASCRIPT_PRELUDE</span><span class="plain"> = </span><span class="identifier">L</span><span class="string">"javascript:window.Project."</span><span class="plain">; </span> <span class="comment">calling prefix</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">escape_openUrl</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">escape_fileUrl</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">reverse_slash_openUrl</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">reverse_slash_fileUrl</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Some global variables:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">error_count</span><span class="plain"> = 0; </span> <span class="comment">number of error messages produced so far</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">verbose_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">; </span> <span class="comment">print diagnostics to <code class="display"><span class="extract">stdout</span></code> while running?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">current_year_AD</span><span class="plain"> = 0; </span> <span class="comment">e.g., 2008</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">blorb_file_size</span><span class="plain"> = 0; </span> <span class="comment">size in bytes of the blorb file written</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_pictures_included</span><span class="plain"> = 0; </span> <span class="comment">number of picture resources included in the blorb</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_sounds_included</span><span class="plain"> = 0; </span> <span class="comment">number of sound resources included in the blorb</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">HTML_pages_created</span><span class="plain"> = 0; </span> <span class="comment">number of pages created in the website, if any</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">source_HTML_pages_created</span><span class="plain"> = 0; </span> <span class="comment">number of those holding source</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">sound_resource_num</span><span class="plain"> = 3; </span> <span class="comment">current sound resource number we're working on</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">picture_resource_num</span><span class="plain"> = 1; </span> <span class="comment">current picture resource number we're working on</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">use_css_code_styles</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">; </span> <span class="comment">use <code class="display"><span class="extract">&lt;span class="X"&gt;</span></code> markings when setting code</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">project_folder</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">pathname of I7 project folder, if any</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">release_folder</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">pathname of folder for website to write, if any</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">status_template</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">filename of report HTML page template, if any</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">status_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">filename of report HTML page to write, if any</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cover_exists</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">; </span> <span class="comment">an image is specified as cover art</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_cover_used</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">; </span> <span class="comment">but it's only the default supplied by Inform</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">cover_is_in_JPEG_format</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">; </span> <span class="comment">as opposed to <code class="display"><span class="extract">PNG</span></code> format</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Main. </b>Like most programs, this one parses command-line arguments, sets things up,
reads the input and then writes the output.
</p>
<p class="inwebparagraph">That's a little over-simplified, though, because it also produces auxiliary
outputs along the way, in the course of parsing the blurb file. The blorb
file is only the main output &mdash; there might also be a web page and a solution
file, for instance.
</p>
<pre class="display">
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">blurb_filename</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">blorb_filename</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">argv</span><span class="plain">[]) {</span>
<span class="functiontext">Foundation::start</span><span class="plain">();</span>
<span class="functiontext">Basics::register_mreasons</span><span class="plain">();</span>
<span class="identifier">blurb_filename</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Release.blurb"</span><span class="plain">);</span>
<span class="identifier">blorb_filename</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"story.zblorb"</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Make the default settings</span> <span class="cwebmacronumber">3.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Parse command-line arguments</span> <span class="cwebmacronumber">3.3</span>&gt;<span class="plain">;</span>
<span class="functiontext">Placeholders::initialise</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">blurb_filename</span><span class="plain">) {</span>
<span class="functiontext">Main::print_banner</span><span class="plain">();</span>
<span class="functiontext">Parser::parse_blurb_file</span><span class="plain">(</span><span class="identifier">blurb_filename</span><span class="plain">);</span>
<span class="functiontext">Writer::write_blorb_file</span><span class="plain">(</span><span class="identifier">blorb_filename</span><span class="plain">);</span>
<span class="functiontext">Requests::create_requested_material</span><span class="plain">();</span>
<span class="functiontext">Main::print_report</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="functiontext">Foundation::end</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">error_count</span><span class="plain"> &gt; 0) </span><span class="reserved">return</span><span class="plain"> 1;</span>
<span class="reserved">return</span><span class="plain"> 0;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function main is used in 3/rls (<a href="3-rls.html#SP12">&#167;12</a>).</p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make the default settings</span> <span class="cwebmacronumber">3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">release_folder</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">project_folder</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">status_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">status_template</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP3_2"></a><b>&#167;3.2. </b>We use Foundation's standard command-line routines.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">VERBOSE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">PROJECT_CLSW</span>
</pre>
<p class="inwebparagraph"><a id="SP3_3"></a><b>&#167;3.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Parse command-line arguments</span> <span class="cwebmacronumber">3.3</span>&gt; =
</code></p>
<pre class="displaydefn">
&lt;<span class="cwebmacro">Read the command-line switches</span> <span class="cwebmacronumber">3.3.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Set platform-dependent HTML and Javascript variables</span> <span class="cwebmacronumber">3.3.3</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">verbose_mode</span><span class="plain">)</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"! Blurb in: &lt;%f&gt;\</span><span class="plain">n</span><span class="string">! Blorb out: &lt;%f&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">blurb_filename</span><span class="plain">, </span><span class="identifier">blorb_filename</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP3_3_1"></a><b>&#167;3.3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Read the command-line switches</span> <span class="cwebmacronumber">3.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">CommandLine::declare_heading</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"inblorb: a releaser and packager for IF story files\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span>
<span class="identifier">L</span><span class="string">"usage: inblorb [-options] [blurbfile [blorbfile]]\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_boolean_switch</span><span class="plain">(</span><span class="constant">VERBOSE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"verbose"</span><span class="plain">, 1,</span>
<span class="identifier">L</span><span class="string">"print running notes on what's happening"</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">PROJECT_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"project"</span><span class="plain">, 2,</span>
<span class="identifier">L</span><span class="string">"work within Inform project X"</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bare_words</span><span class="plain"> = 0;</span>
<span class="functiontext">CommandLine::read</span><span class="plain">(</span><span class="identifier">argc</span><span class="plain">, </span><span class="identifier">argv</span><span class="plain">, &amp;</span><span class="identifier">bare_words</span><span class="plain">, &amp;</span><span class="functiontext">Main::switch</span><span class="plain">, &amp;</span><span class="functiontext">Main::bareword</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project_folder</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bare_words</span><span class="plain"> &gt; 0) </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"if -project is used, no other filenames should be given"</span><span class="plain">);</span>
<span class="identifier">blurb_filename</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">project_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Release.blurb"</span><span class="plain">);</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">Build</span><span class="plain"> = </span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">project_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Build"</span><span class="plain">);</span>
<span class="identifier">blorb_filename</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">Build</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"output.zblorb"</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">bare_words</span><span class="plain"> == 0) </span><span class="identifier">blurb_filename</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_3">&#167;3.3</a>.</p>
<p class="inwebparagraph"><a id="SP3_3_2"></a><b>&#167;3.3.2. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::switch</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">id</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">VERBOSE_CLSW</span><span class="plain">: </span><span class="identifier">verbose_mode</span><span class="plain"> = </span><span class="identifier">val</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PROJECT_CLSW</span><span class="plain">: </span><span class="identifier">project_folder</span><span class="plain"> = </span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unimplemented switch"</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">Main::bareword</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> *</span><span class="identifier">bare_words</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="plain">(*</span><span class="identifier">bare_words</span><span class="plain">)++;</span>
<span class="reserved">switch</span><span class="plain"> (*</span><span class="identifier">bare_words</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> 1: </span><span class="identifier">blurb_filename</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">opt</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 2: </span><span class="identifier">blorb_filename</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">opt</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"bad command line usage (see -help)"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Main::switch is used in <a href="#SP3_3_1">&#167;3.3.1</a>.</p>
<p class="endnote">The function Main::bareword is used in <a href="#SP3_3_1">&#167;3.3.1</a>.</p>
<p class="inwebparagraph"><a id="SP3_3_3"></a><b>&#167;3.3.3. </b>Now let's set the platform-dependent variables.
</p>
<p class="inwebparagraph">Inblorb generates quite a variety of HTML, for instance to create websites,
but the tricky points below affect only one special page not browsed by
the general public: the results page usually called <code class="display"><span class="extract">StatusCblorb.html</span></code>
(though this depends on how the <code class="display"><span class="extract">status</span></code> command is used in the blurb).
The results page is intended only for viewing within the Inform user
interface, and it expects to have two Javascript functions available,
<code class="display"><span class="extract">openUrl</span></code> and <code class="display"><span class="extract">fileUrl</span></code>. Because the object structure has needed to be
different for the Windows and OS X user interface implementations of
Javascript, we abstract the prefix for these function calls into the
<code class="display"><span class="extract">JAVASCRIPT_PRELUDE</span></code>. Thus
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">&lt;a href="***openUrl"&gt;...&lt;/a&gt;</span>
</pre>
<p class="inwebparagraph">causes a link, when clicked, to call the <code class="display"><span class="extract">openUrl</span></code> function, where <code class="display"><span class="extract">***</span></code>
is the prelude; similarly for <code class="display"><span class="extract">fileUrl</span></code>. The first opens a URL in the local
operating system's default web browser, the second opens a file (identified
by a <code class="display"><span class="extract">file:...</span></code> URL) in the local operating system. These two URLs may
need treatment to handle special characters:
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(a) "escaping", where spaces in the URL are escaped to <code class="display"><span class="extract">%2520</span></code>, which
within a Javascript string literal produces <code class="display"><span class="extract">%20</span></code>, the standard way to
represent a space in a web URL;
</li></ul>
<ul class="items"><li>(b) "reversing slashes", where backslashes are converted to forward
slashes &mdash; useful if the separation character is a backslash, as on Windows,
since backslashes are escape characters in Javascript literals.
</li></ul>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Set platform-dependent HTML and Javascript variables</span> <span class="cwebmacronumber">3.3.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="constant">WINDOWS_JAVASCRIPT</span>
<span class="identifier">FONT_TAG</span><span class="plain"> = </span><span class="identifier">L</span><span class="string">"face=\</span><span class="plain">"</span><span class="string">lucida grande,geneva,arial,tahoma,verdana,helvetica,helv\</span><span class="plain">"</span><span class="string"> size=2"</span><span class="plain">;</span>
<span class="identifier">escape_openUrl</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">; </span> <span class="comment">we want <code class="display"><span class="extract">openUrl</span></code> to escape, and <code class="display"><span class="extract">fileUrl</span></code> not to</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="constant">WINDOWS_JAVASCRIPT</span>
<span class="identifier">JAVASCRIPT_PRELUDE</span><span class="plain"> = </span><span class="identifier">L</span><span class="string">"javascript:external.Project."</span><span class="plain">;</span>
<span class="identifier">reverse_slash_openUrl</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">; </span><span class="identifier">reverse_slash_fileUrl</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_3">&#167;3.3</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The placeholder variable [YEAR] is initialised to the year in which Inblorb
runs, according to the host operating system, at least. (It can of course then
be overridden by commands in the blurb file, and Inform always does this in
the blurb files it writes. But it leaves [DATESTAMP] and [TIMESTAMP] alone.)
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::initialise_time_variables</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">datestamp</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">infocom</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">timestamp</span><span class="plain">);</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">weekdays</span><span class="plain">[] = { </span><span class="string">"Sunday"</span><span class="plain">, </span><span class="string">"Monday"</span><span class="plain">, </span><span class="string">"Tuesday"</span><span class="plain">, </span><span class="string">"Wednesday"</span><span class="plain">,</span>
<span class="string">"Thursday"</span><span class="plain">, </span><span class="string">"Friday"</span><span class="plain">, </span><span class="string">"Saturday"</span><span class="plain"> };</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">months</span><span class="plain">[] = { </span><span class="string">"January"</span><span class="plain">, </span><span class="string">"February"</span><span class="plain">, </span><span class="string">"March"</span><span class="plain">, </span><span class="string">"April"</span><span class="plain">, </span><span class="string">"May"</span><span class="plain">, </span><span class="string">"June"</span><span class="plain">,</span>
<span class="string">"July"</span><span class="plain">, </span><span class="string">"August"</span><span class="plain">, </span><span class="string">"September"</span><span class="plain">, </span><span class="string">"October"</span><span class="plain">, </span><span class="string">"November"</span><span class="plain">, </span><span class="string">"December"</span><span class="plain"> };</span>
<span class="functiontext">Placeholders::set_to_number</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"YEAR"</span><span class="plain">, </span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_year</span><span class="plain">+1900);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">datestamp</span><span class="plain">, </span><span class="string">"%s %d %s %d"</span><span class="plain">, </span><span class="identifier">weekdays</span><span class="plain">[</span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_wday</span><span class="plain">],</span>
<span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_mday</span><span class="plain">, </span><span class="identifier">months</span><span class="plain">[</span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_mon</span><span class="plain">], </span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_year</span><span class="plain">+1900);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">infocom</span><span class="plain">, </span><span class="string">"%02d%02d%02d"</span><span class="plain">,</span>
<span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_year</span><span class="plain">-100, </span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_mon</span><span class="plain"> + 1, </span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_mday</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">timestamp</span><span class="plain">, </span><span class="string">"%02d:%02d.%02d"</span><span class="plain">, </span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_hour</span><span class="plain">,</span>
<span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_min</span><span class="plain">, </span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_sec</span><span class="plain">);</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"DATESTAMP"</span><span class="plain">, </span><span class="identifier">datestamp</span><span class="plain">, 0);</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"INFOCOMDATESTAMP"</span><span class="plain">, </span><span class="identifier">infocom</span><span class="plain">, 0);</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"TIMESTAMP"</span><span class="plain">, </span><span class="identifier">timestamp</span><span class="plain">, 0);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">datestamp</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">infocom</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">timestamp</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Main::initialise_time_variables is used in 3/plc (<a href="3-plc.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Opening and closing banners. </b>Note that Inblorb customarily prints informational messages with an initial
<code class="display"><span class="extract">!</span></code>, so that the piped output from Inblorb could be used as an <code class="display"><span class="extract">Include</span></code>
file in I6 code, where <code class="display"><span class="extract">!</span></code> is the comment character; that isn't in fact how
I7 uses Inblorb, but it's traditional for blorbing programs to do this.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::print_banner</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ver</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"inblorb [[Build Number]]"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">fix_time_mode</span><span class="plain">) </span><span class="identifier">ver</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"inblorb 99.99"</span><span class="plain">;</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"! %S [executing on %S at %S]\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">ver</span><span class="plain">, </span><span class="functiontext">Placeholders::read</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"DATESTAMP"</span><span class="plain">), </span><span class="functiontext">Placeholders::read</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"TIMESTAMP"</span><span class="plain">));</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"! The blorb spell (safely protect a small object "</span><span class="plain">);</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"as though in a strong box).\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Main::print_banner is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>The concluding banner is much smaller &mdash; empty if all went well, a single
comment line if not. But we also generate the status report page (if that has
been requested) &mdash; a single HTML file generated from a template by expanding
placeholders in the template. All of the meat of the report is in those
placeholders, of course; the template contains only some fancy formatting.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::print_report</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">error_count</span><span class="plain"> &gt; 0) </span><span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"! Completed: %d error(s)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">error_count</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Set a whole pile of placeholders which will be needed to generate the status page</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">status_template</span><span class="plain">) </span><span class="functiontext">Websites::web_copy</span><span class="plain">(</span><span class="identifier">status_template</span><span class="plain">, </span><span class="identifier">status_file</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Main::print_report is used in <a href="#SP3">&#167;3</a>, 1/be (<a href="1-be.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b>If it isn't apparent what these placeholders do, take a look at
the template file called <code class="display"><span class="extract">CblorbModel.html</span></code> in the Inform application &mdash;
that's where they're used.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Set a whole pile of placeholders which will be needed to generate the status page</span> <span class="cwebmacronumber">6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">error_count</span><span class="plain"> &gt; 0) {</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"CBLORBSTATUS"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Failed"</span><span class="plain">, 0);</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"CBLORBSTATUSIMAGE"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inform:/outcome_images/cblorb_failed.png"</span><span class="plain">, 0);</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"CBLORBSTATUSTEXT"</span><span class="plain">,</span>
<span class="functiontext">Str::literal</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"Inform translated your source text as usual, to manufacture a 'story "</span>
<span class="identifier">L</span><span class="string">"file': all of that worked fine. But the Release then went wrong, for "</span>
<span class="identifier">L</span><span class="string">"the following reason:&lt;p&gt;&lt;ul&gt;[CBLORBERRORS]&lt;/ul&gt;"</span><span class="plain">), 0</span>
<span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"CBLORBERRORS"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"No problems occurred"</span><span class="plain">, 0);</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"CBLORBSTATUS"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Succeeded"</span><span class="plain">, 0);</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"CBLORBSTATUSIMAGE"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"file://[SMALLCOVER]"</span><span class="plain">, 0);</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"CBLORBSTATUSTEXT"</span><span class="plain">,</span>
<span class="functiontext">Str::literal</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"All went well. I've put the released material into the 'Release' subfolder "</span>
<span class="identifier">L</span><span class="string">"of the Materials folder for the project: you can take a look with "</span>
<span class="identifier">L</span><span class="string">"the menu option &lt;b&gt;Release &amp;gt; Open Materials Folder&lt;/b&gt; or by clicking "</span>
<span class="identifier">L</span><span class="string">"the blue folders above.&lt;p&gt;"</span>
<span class="identifier">L</span><span class="string">"Releases can range in size from a single blorb file to a medium-sized website. "</span>
<span class="identifier">L</span><span class="string">"Here's what we currently have:&lt;p&gt;"</span><span class="plain">), 0</span>
<span class="plain">);</span>
<span class="functiontext">Requests::report_requested_material</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"CBLORBSTATUSTEXT"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">blorb_file_size</span><span class="plain"> &gt; 0) {</span>
<span class="functiontext">Placeholders::set_to_number</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"BLORBFILESIZE"</span><span class="plain">, </span><span class="identifier">blorb_file_size</span><span class="plain">/1024);</span>
<span class="functiontext">Placeholders::set_to_number</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"BLORBFILEPICTURES"</span><span class="plain">, </span><span class="identifier">no_pictures_included</span><span class="plain">);</span>
<span class="functiontext">Placeholders::set_to_number</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"BLORBFILESOUNDS"</span><span class="plain">, </span><span class="identifier">no_sounds_included</span><span class="plain">);</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"! Completed: wrote blorb file with "</span><span class="plain">);</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"%d picture(s), %d sound(s)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">no_pictures_included</span><span class="plain">, </span><span class="identifier">no_sounds_included</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Placeholders::set_to_number</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"BLORBFILESIZE"</span><span class="plain">, 0);</span>
<span class="functiontext">Placeholders::set_to_number</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"BLORBFILEPICTURES"</span><span class="plain">, 0);</span>
<span class="functiontext">Placeholders::set_to_number</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"BLORBFILESOUNDS"</span><span class="plain">, 0);</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"! Completed: no blorb output requested\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-bsc.html">Back to 'Basics'</a></li><li><a href="1-be.html">Continue with 'Blorb Errors'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>