diff --git a/README.md b/README.md index 27c5348b2..21d44d00e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Inform 7 -v10.1.0-beta+6V24 'Krypton' (16 June 2022) +v10.1.0-beta+6V25 'Krypton' (20 June 2022) ## About Inform 7 diff --git a/build.txt b/build.txt index 570a3dd1d..4713e9368 100644 --- a/build.txt +++ b/build.txt @@ -1,3 +1,3 @@ Prerelease: beta -Build Date: 16 June 2022 -Build Number: 6V24 +Build Date: 20 June 2022 +Build Number: 6V25 diff --git a/docs/assertions-module/5-ptd.html b/docs/assertions-module/5-ptd.html index b4198062a..db4681b96 100644 --- a/docs/assertions-module/5-ptd.html +++ b/docs/assertions-module/5-ptd.html @@ -940,9 +940,9 @@ match is shown. HTML_TAG("br"); WRITE("   "); HTML_OPEN("i"); - HTML::begin_colour(OUT, I"ff4040"); + HTML::begin_span(OUT, I"phrasetokenvaluetext"); WRITE("phrases"); - HTML::end_colour(OUT); + HTML::end_span(OUT); HTML_CLOSE("i"); } } @@ -974,11 +974,11 @@ match is shown. if ((p[i] == '/') && (tinted == FALSE)) { tinted = TRUE; if (paste_format == PASTE_PHRASE_FORMAT) break; - HTML::begin_colour(OUT, I"808080"); + HTML::begin_span(OUT, I"phraseword"); } WRITE("%c", p[i]); } - if ((paste_format != PASTE_PHRASE_FORMAT) && (tinted)) HTML::end_colour(OUT); + if ((paste_format != PASTE_PHRASE_FORMAT) && (tinted)) HTML::end_span(OUT);

§28.1.2. Describe a token in the word sequence28.1.2 = @@ -990,11 +990,13 @@ match is shown. if (writing_a_say == FALSE) WRITE("("); if (inv) { parse_node *found = Invocations::get_token_as_parsed(inv, ix); - text_stream *col = I"008000"; - if (Node::is(found, UNKNOWN_NT)) col = I"800000"; - HTML::begin_colour(OUT, col); + if (Node::is(found, UNKNOWN_NT)) { + HTML::begin_span(OUT, I"indexdullred"); + } else { + HTML::begin_span(OUT, I"indexdullgreen"); + } WRITE("%W", Node::get_text(found)); - HTML::end_colour(OUT); + HTML::end_span(OUT); WRITE(" - "); Dash::note_inv_token_text(found, (idtd->token_sequence[ix].construct == NEW_LOCAL_IDTC)?TRUE:FALSE); @@ -1016,56 +1018,56 @@ match is shown. case STANDARD_IDTC: { parse_node *spec = idtd->token_sequence[ix].to_match; if (Specifications::is_kind_like(spec)) { - HTML::begin_colour(OUT, I"4040ff"); + HTML::begin_span(OUT, I"phrasetokendesctext"); Kinds::Textual::write(OUT, Specifications::to_kind(spec)); - HTML::end_colour(OUT); + HTML::end_span(OUT); } else if ((Node::is(spec, CONSTANT_NT)) || (Specifications::is_description(spec))) { - HTML::begin_colour(OUT, I"4040ff"); + HTML::begin_span(OUT, I"phrasetokendesctext"); WRITE("%W", Node::get_text(spec)); - HTML::end_colour(OUT); + HTML::end_span(OUT); } else { HTML_OPEN("i"); - HTML::begin_colour(OUT, I"ff4040"); + HTML::begin_span(OUT, I"phrasetokenvaluetext"); Specifications::write_out_in_English(OUT, spec); - HTML::end_colour(OUT); + HTML::end_span(OUT); HTML_CLOSE("i"); } break; } case NEW_LOCAL_IDTC: - HTML::begin_colour(OUT, I"E00060"); + HTML::begin_span(OUT, I"phrasetokentext"); WRITE("a new name"); - HTML::end_colour(OUT); break; + HTML::end_span(OUT); break; case OLD_LOCAL_IDTC: - HTML::begin_colour(OUT, I"E00060"); + HTML::begin_span(OUT, I"phrasetokentext"); WRITE("a temporary named value"); if ((IDTypeData::token_kind(idtd, ix)) && (Kinds::eq(IDTypeData::token_kind(idtd, ix), K_value) == FALSE)) { WRITE(" holding "); Kinds::Textual::write_articled(OUT, IDTypeData::token_kind(idtd, ix)); } - HTML::end_colour(OUT); break; + HTML::end_span(OUT); break; case CONDITION_IDTC: - HTML::begin_colour(OUT, I"E00060"); + HTML::begin_span(OUT, I"phrasetokentext"); WRITE("a condition"); - HTML::end_colour(OUT); break; + HTML::end_span(OUT); break; case STORAGE_IDTC: - HTML::begin_colour(OUT, I"E00060"); + HTML::begin_span(OUT, I"phrasetokentext"); WRITE("a stored value"); - HTML::end_colour(OUT); break; + HTML::end_span(OUT); break; case TABLE_REF_IDTC: - HTML::begin_colour(OUT, I"E00060"); + HTML::begin_span(OUT, I"phrasetokentext"); WRITE("a table entry"); - HTML::end_colour(OUT); break; + HTML::end_span(OUT); break; case KIND_NAME_IDTC: - HTML::begin_colour(OUT, I"E00060"); + HTML::begin_span(OUT, I"phrasetokentext"); WRITE("name of kind"); - HTML::end_colour(OUT); break; + HTML::end_span(OUT); break; case VOID_IDTC: - HTML::begin_colour(OUT, I"E00060"); + HTML::begin_span(OUT, I"phrasetokentext"); WRITE("a phrase"); - HTML::end_colour(OUT); break; + HTML::end_span(OUT); break; }

diff --git a/docs/core-module/1-wtc.html b/docs/core-module/1-wtc.html index b036c7faf..1a1701d65 100644 --- a/docs/core-module/1-wtc.html +++ b/docs/core-module/1-wtc.html @@ -374,14 +374,18 @@ section for details. In addition we have: }

§12. The name of the unblorbed story file is chosen for us by Inbuild, so -we have to extract it from the build graph: +we have to extract it from the build graph. +

+ +

Note that this will return NULL if the current run of Inform is to +produce, say, a C program rather than a Glulx or Z-machine story file.

 filename *Task::storyfile_file(void) {
     if (inform7_task == NULL) internal_error("there is no current task");
     build_vertex *V = inform7_task->project->unblorbed_vertex;
-    if (V == NULL) internal_error("project graph not ready");
+    if (V == NULL) return NULL;
     return V->as_file;
 }
 
diff --git a/docs/html-module/2-dr.html b/docs/html-module/2-dr.html index 396a5f84c..6cd55ab8a 100644 --- a/docs/html-module/2-dr.html +++ b/docs/html-module/2-dr.html @@ -74,7 +74,7 @@ function togglePopup(material_id) {

To render a passage of extension documentation as HTML.

-
+

§1. Disclaimer. The following code originated as a port of a simplified version of an early form of the Inform documentation tool indoc: in general, that will do a @@ -113,7 +113,7 @@ by a number. I believe I can live with the guilt.

-void DocumentationRenderer::href_of_example(OUTPUT_STREAM, text_stream *base_leafname,
+void DocumentationRenderer::href_of_example(OUTPUT_STREAM, text_stream *base_leafname,
     int to_example_variant, int to_example_anchor) {
     for (int i=0, L = Str::len(base_leafname); i<L; i++) {
         if ((Str::includes_wide_string_at(base_leafname, L"-eg", i)) &&
@@ -238,14 +238,15 @@ extension, enabling them to be lettered as Example A to Example Z.)
 
 
 void DocumentationRenderer::table_of_contents(wording W, OUTPUT_STREAM, text_stream *base_leafname) {
-    int heading_count = 0, chapter_count = 0, section_count = 0, example_count = 0;
+    int heading_count = 0, chapter_count = 0, section_count = 0, example_count = 0, indentation = 0;
     LOOP_THROUGH_WORDING(i, W) {
         int edhl, asterisks;
         wording NW = EMPTY_WORDING, RUBW = EMPTY_WORDING;
         if (Lexer::word(i) == PARBREAK_V) {
             while (Lexer::word(i) == PARBREAK_V) i++;
             if (i>Wordings::last_wn(W)) break;
-            if (DocumentationRenderer::extension_documentation_heading(
+            Determine indentation of new paragraph7.3;
+            if (indentation == 0 && DocumentationRenderer::extension_documentation_heading(
                 Wordings::from(W, i), &edhl, &NW)) {
                 heading_count++;
                 if (heading_count == 1) {
@@ -295,19 +296,19 @@ These are the destinations of links from heading lines in the TOC.
 
     switch (edhl) {
         case 1:
-            HTML::begin_colour(OUT, I"000000");
+            HTML::begin_span(OUT, I"indexblack");
             HTML_OPEN("b");
             HTML_OPEN_WITH("a",
                 "style=\"text-decoration: none\" href=#docsec%d", heading_count);
             WRITE("Chapter %d: ", chapter_count);
             HTML_CLOSE("a");
             HTML_CLOSE("b");
-            HTML::end_colour(OUT);
+            HTML::end_span(OUT);
             break;
         case 2:
             if (chapter_count > 0)  if there are chapters as well as sections...
                 WRITE("&nbsp;&nbsp;&nbsp;");  ...then set an indentation before entry
-            HTML::begin_colour(OUT, I"000000");
+            HTML::begin_span(OUT, I"indexblack");
             HTML_OPEN_WITH("a", "style=\"text-decoration: none\" href=#docsec%d", heading_count);
             WRITE("Section ");
             if (chapter_count > 0)  if there are chapters as well as sections...
@@ -315,7 +316,7 @@ These are the destinations of links from heading lines in the TOC.
             else
                 WRITE("%d: ", section_count);  otherwise quote section number only
             HTML_CLOSE("a");
-            HTML::end_colour(OUT);
+            HTML::end_span(OUT);
             break;
         default: internal_error("unable to set this heading level in extension TOC");
     }
@@ -338,13 +339,13 @@ far as the user is concerned it opens the example and goes there.
     WRITE_TO(link, "style=\"text-decoration: none\" href=\"");
     DocumentationRenderer::href_of_example(link, base_leafname, example_count, example_count);
     WRITE_TO(link, "\"");
-    HTML::begin_colour(OUT, I"000000");
+    HTML::begin_span(OUT, I"indexblack");
     HTML_OPEN_WITH("a", "%S", link);
     PUT('A'+example_count-1);  the letter A to Z
     WRITE(" &mdash; ");
     DocumentationRenderer::set_body_text(NW, OUT, EDOC_FRAGMENT_ONLY, NULL);
     HTML_CLOSE("a");
-    HTML::end_colour(OUT);
+    HTML::end_span(OUT);
     HTML_TAG("br");
 
@@ -361,7 +362,7 @@ far as the user is concerned it opens the example and goes there. define EDOC_FRAGMENT_ONLY -2 must differ from this and from all example variant numbers
-int DocumentationRenderer::set_body_text(wording W, OUTPUT_STREAM,
+int DocumentationRenderer::set_body_text(wording W, OUTPUT_STREAM,
     int example_which_is_open, text_stream *base_leafname) {
     int heading_count = 0, chapter_count = 0, section_count = 0, example_count = 0;
     int mid_example = FALSE, skipping_text_of_an_example = FALSE,
@@ -374,29 +375,28 @@ far as the user is concerned it opens the example and goes there.
             Handle a paragraph break9.1;
             while (Lexer::word(i) == PARBREAK_V) i++;
             if (i>Wordings::last_wn(W)) break;  treat multiple paragraph breaks as one
-            Determine indentation of new paragraph9.2;
-            if (DocumentationRenderer::extension_documentation_heading(Wordings::from(W, i), &edhl, &NW)) {
+            Determine indentation of new paragraph7.3;
+            if (indentation == 0 && DocumentationRenderer::extension_documentation_heading(Wordings::from(W, i), &edhl, &NW)) {
                 heading_count++;
                 if (edhl == 1) {
                     chapter_count++; section_count = 0;
                     if (chapter_count > 1) {
-                        HTML_CLOSE("p");
                         HTML_TAG("hr");  rule a line between chapters
                     }
                 }
                 if (edhl == 2) section_count++;
-                Typeset the heading of this chapter or section9.6;
+                Typeset the heading of this chapter or section9.5;
                 i = Wordings::last_wn(NW); continue;
             }
             if ((example_count < 26) && (DocumentationRenderer::extension_documentation_example(
                     Wordings::from(W, i), &asterisks, &NW, &RUBW))) {
                 skipping_text_of_an_example = FALSE;
-                if (mid_example) Close the previous example's text9.9;
+                if (mid_example) Close the previous example's text9.8;
                 mid_example = FALSE;
                 example_count++;
-                Typeset the heading of this example9.7;
+                Typeset the heading of this example9.6;
                 if (example_count == example_which_is_open) {
-                    Open the new example's text9.8;
+                    Open the new example's text9.7;
                     mid_example = TRUE;
                 } else skipping_text_of_an_example = TRUE;
                 i = Wordings::last_wn(RUBW); continue;
@@ -404,12 +404,14 @@ far as the user is concerned it opens the example and goes there.
         }
         if (skipping_text_of_an_example) continue;
 
-        Handle a line or column break, if there is one9.4;
-        Transcribe an ordinary word of the documentation9.5;
+        Handle a line or column break, if there is one9.3;
+        Transcribe an ordinary word of the documentation9.4;
         if (close_I6_position == i) WRITE(" -)");
     }
-    if (mid_example) Close the previous example's text9.9;
-    if (example_which_is_open != EDOC_FRAGMENT_ONLY) Handle a paragraph break9.1;
+    if (mid_example) Close the previous example's text9.8;
+    if (example_which_is_open != EDOC_FRAGMENT_ONLY) {
+        Handle a paragraph break9.1;
+    }
     return example_count;
 }
 
@@ -423,10 +425,10 @@ break, and a chance to restore our tired variables.
     if (mid_displayed_source_text)  {
-        HTML::end_colour(OUT);
+        HTML::end_span(OUT);
         if (mid_I7_table) End I7 table in extension documentation9.1.1;
         HTML_CLOSE("blockquote");
-    } else {
+    }   else {
         HTML_CLOSE("p");
     }
     WRITE("\n");
@@ -434,7 +436,7 @@ break, and a chance to restore our tired variables.
     mid_displayed_source_text = FALSE; mid_I7_table = FALSE;
 
-

§9.2. The indentation setting is made here because a tab anywhere else does +

§7.3. The indentation setting is made here because a tab anywhere else does not mean a paragraph has been indented. Here i is at the number of the first word after the paragraph break; the break character corresponding to it is the one before that word, so describes the kind of whitespace @@ -442,14 +444,14 @@ between the paragraph break and the first nonwhitespace of the new paragraph.

-

Determine indentation of new paragraph9.2 = +

Determine indentation of new paragraph7.3 =

     indentation = 0; if (Lexer::break_before(i) == '\t') indentation = 1;
 
- -

§9.3. Positions for paste icons in extension documentation are marked with +

+

§9.2. Positions for paste icons in extension documentation are marked with asterisk and colon:

@@ -458,37 +460,37 @@ asterisk and colon: * : ...
-

§9.4. Two lower-level sorts of breaks can also occur in the middle of a paragraph: +

§9.3. Two lower-level sorts of breaks can also occur in the middle of a paragraph: line breaks, indicated by newlines plus some tabs, and column breaks inside I7 source tables, indicated by tabs. We have to deal with those before we can move on to the subsequent word.

-

Handle a line or column break, if there is one9.4 = +

Handle a line or column break, if there is one9.3 =

     if (Lexer::indentation_level(i) > 0) indentation = Lexer::indentation_level(i);
 
-    if (indentation > 0) Handle the start of a line which is indented9.4.2;
+    if (indentation > 0) Handle the start of a line which is indented9.3.2;
     if (<extension-documentation-paste-marker>(Wordings::from(W, i))) {
         wording W = GET_RW(<extension-documentation-paste-marker>, 1);
-        Incorporate an icon linking to a Javascript function to paste the text which follows9.4.1;
+        Incorporate an icon linking to a Javascript function to paste the text which follows9.3.1;
         i++; continue;
     }
     indentation = 0;
     if ((mid_I7_table) && ((Lexer::break_before(i) == '\t') || (Lexer::indentation_level(i) == 1))) {
         if (row_of_table_is_empty == FALSE)
-            End table cell for I7 table in extension documentation9.4.3;
-        Begin table cell for I7 table in extension documentation9.4.4;
+            End table cell for I7 table in extension documentation9.3.3;
+        Begin table cell for I7 table in extension documentation9.3.4;
         row_of_table_is_empty = FALSE;
     }
 
-

§9.5. See Javascript Pastes for further explanation of the general method here. +

§9.4. See Javascript Pastes for further explanation of the general method here.

-

Transcribe an ordinary word of the documentation9.5 = +

Transcribe an ordinary word of the documentation9.4 =

@@ -502,7 +504,7 @@ can move on to the subsequent word.
     if (Lexer::word(i) == OPENI6_V) close_I6_position = i+1;  ensure I6 literals are closed
 
-

§9.4.1. A paste causes the same material to be set twice: once in the argument to +

§9.3.1. A paste causes the same material to be set twice: once in the argument to the Javascript paste function (which is passed to the application when the user clicks on the paste icon, and thus ends up in the Source panel), and once also in the HTML documentation. That's why the code here ranges forward @@ -511,7 +513,7 @@ by further tabbed matter, or in other words, to the end of the display), but does not advance i commensurately.

-

Incorporate an icon linking to a Javascript function to paste the text which follows9.4.1 = +

Incorporate an icon linking to a Javascript function to paste the text which follows9.3.1 =

@@ -525,8 +527,8 @@ but does not advance i
         }
     PasteButtons::paste_W(OUT, Wordings::new(x, y));
 
- -

§9.4.2. The first step of indentation is handled using the <blockquote> tag; +

+

§9.3.2. The first step of indentation is handled using the <blockquote> tag; within that, further tab stops are simulated by printing a row of four non-breaking spaces for each indentation level above 1. A paragraph of indented (i.e., display matter) beginning with the word "Table" is @@ -535,7 +537,7 @@ take us past the titling line and into the table entries, which we will need to achieve with an HTML <table>.

-

Handle the start of a line which is indented9.4.2 = +

Handle the start of a line which is indented9.3.2 =

@@ -544,15 +546,15 @@ need to achieve with an HTML 
         if (start_table_next_line) {
             start_table_next_line = FALSE;
             mid_I7_table = TRUE;
-            Begin I7 table in extension documentation9.4.2.1;
+            Begin I7 table in extension documentation9.3.2.1;
         } else {
-            if (mid_I7_table) Begin new row of I7 table in extension documentation9.4.2.2
+            if (mid_I7_table) Begin new row of I7 table in extension documentation9.3.2.2
             else HTML_TAG("br");
         }
         if (mid_I7_table) row_of_table_is_empty = TRUE;
     } else {
         HTML_OPEN("blockquote");
-        HTML::begin_colour(OUT, I"000080");
+        HTML::begin_span(OUT, I"indexdullblue");
         mid_displayed_source_text = TRUE;
         if (<table-sentence>(Wordings::from(W, i)))
             start_table_next_line = TRUE;
@@ -560,25 +562,25 @@ need to achieve with an HTML 
     indentation--;
     for (j=0; j<indentation; j++) WRITE("&nbsp;&nbsp;&nbsp;&nbsp;");
 
- -

§9.6. Typesetting the headings. That is thankfully all for the tormented logic of all those changes of state: +

+

§9.5. Typesetting the headings. That is thankfully all for the tormented logic of all those changes of state: from here to the rest of the section, all we do is to generate pretty HTML, and without altering any variables or causing any side-effects at all. First, the headings. Recall that heading number N is required to be at anchor #docsecN.

-

Typeset the heading of this chapter or section9.6 = +

Typeset the heading of this chapter or section9.5 =

     HTML_OPEN("p");
     switch (edhl) {
         case 1:
-            HTML::begin_colour(OUT, I"800000");
+            HTML::begin_span(OUT, I"indexdullred");
             break;
         case 2:
-            HTML::begin_colour(OUT, I"000000");
+            HTML::begin_span(OUT, I"indexblack");
             break;
     }
     HTML_OPEN("b");
@@ -596,45 +598,46 @@ anchor #docsecN
     DocumentationRenderer::set_body_text(NW, OUT, EDOC_FRAGMENT_ONLY, NULL);
     HTML_CLOSE("span");
     HTML_CLOSE("b");
-    HTML::end_colour(OUT);
+    HTML::end_span(OUT);
     HTML_CLOSE("p");
 
-

§9.7. An example is set with a two-table header, and followed optionally by a +

§9.6. An example is set with a two-table header, and followed optionally by a table of its inset copy, shaded to distinguish it from the rest of the page. The heading is constructed with a main table of one row of two cells, in the following section. The left-hand cell then contains a further table, in the next section.

-

Typeset the heading of this example9.7 = +

Typeset the heading of this example9.6 =

-    HTML_OPEN("hr");  rule a line before the example heading
+    HTML_TAG("hr");  rule a line before the example heading
     HTML::begin_plain_html_table(OUT);
     HTML_OPEN("tr");
 
      Left hand cell: the oval icon
     HTML_OPEN_WITH("td", "halign=\"left\" valign=\"top\" cellpadding=0 cellspacing=0 width=38px");
     HTML_OPEN_WITH("span", "id=eg%d", example_count);  provide the anchor point
-    Typeset the lettered oval example icon9.7.1;
+    Typeset the lettered oval example icon9.6.1;
     HTML_CLOSE("span");  end the textual link
     HTML_CLOSE("td");
 
      Right hand cell: the asterisks and title, with rubric underneath
     HTML_OPEN_WITH("td", "cellpadding=0 cellspacing=0 halign=\"left\" valign=\"top\"");
-    Incorporate link to the example opened up9.7.2;
+    Incorporate link to the example opened up9.6.2;
     while (asterisks-- > 0)
         HTML_TAG_WITH("img", "border=\"0\" src='inform:/doc_images/asterisk.png'");
     HTML_OPEN("b");
-    HTML::begin_colour(OUT, I"505050");
+    HTML::begin_span(OUT, I"indexdarkgrey");
     WRITE("&nbsp;Example&nbsp;");
-    HTML::end_colour(OUT);
-    HTML::begin_colour(OUT, I"000000");
+    HTML::end_span(OUT);
+    HTML::begin_span(OUT, I"indexblack");
     DocumentationRenderer::set_body_text(NW, OUT, EDOC_FRAGMENT_ONLY, base_leafname);
-    HTML::end_colour(OUT);
+    HTML::end_span(OUT);
     HTML_CLOSE("b");
+    HTML_CLOSE("a");  Link does not cover body, only heading
     HTML_TAG("br");
     HTML_OPEN("p");
     DocumentationRenderer::set_body_text(RUBW, OUT, EDOC_FRAGMENT_ONLY, base_leafname);
@@ -645,7 +648,7 @@ in the next section.
     HTML::end_html_table(OUT);
 
-

§9.7.1. The little oval icon with its superimposed boldface letter is much harder to +

§9.6.1. The little oval icon with its superimposed boldface letter is much harder to get right on all browsers than it looks, and the following is the result of some pretty grim experimentation. Basically, we make a tight, borderless, one-cell-in-one-row table, use CSS to make a transparent PNG image of an oval @@ -654,33 +657,32 @@ of its one and only cell. (Things were even worse when IE6 for Windows still had its infamous PNG transparency bug.)

-

Typeset the lettered oval example icon9.7.1 = +

Typeset the lettered oval example icon9.6.1 =

     HTML::begin_plain_html_table(OUT);
     HTML_OPEN_WITH("tr", "class=\"oval\"");
     HTML_OPEN_WITH("td", "width=38px height=30px align=\"left\" valign=\"center\"");
-    Incorporate link to the example opened up9.7.2;
+    Incorporate link to the example opened up9.6.2;
     HTML_OPEN_WITH("div",
         "class=\"paragraph Body\" style=\"line-height: 1px; margin-bottom: 0px; "
-        "margin-top: 0px; padding-bottom: 0pt; padding-top: 0px; text-align: center; "
-        "color: #202020; font-size: 14px; line-height: 1px;\"");
-    HTML_OPEN("b");
+        "margin-top: 0px; padding-bottom: 0pt; padding-top: 0px; text-align: center;\"");
+    HTML::begin_span(OUT, I"extensionexampleletter");
     PUT('A' + example_count - 1);
-    HTML_CLOSE("b");
+    HTML::end_span(OUT);
     HTML_CLOSE("div");
     HTML_CLOSE("a");
     HTML_CLOSE("td");
     HTML_CLOSE("tr");
     HTML::end_html_table(OUT);
 
- -

§9.7.2. Clicking on the example banner opens it up, if it's currently closed, or +

+

§9.6.2. Clicking on the example banner opens it up, if it's currently closed, or closes it up, if it's currently open.

-

Incorporate link to the example opened up9.7.2 = +

Incorporate link to the example opened up9.6.2 =

@@ -694,44 +696,44 @@ closes it up, if it's currently open.
     HTML_OPEN_WITH("a", "%S", url);
     DISCARD_TEXT(url)
 
- -

§9.4.2.1. Typesetting I7 tables in displayed source text. Unsurprisingly, I7 tables are set (after their titling lines) as HTML tables, +

+

§9.3.2.1. Typesetting I7 tables in displayed source text. Unsurprisingly, I7 tables are set (after their titling lines) as HTML tables, and this is fiddly but elementary in the usual way of HTML tables:

-

Begin I7 table in extension documentation9.4.2.1 = +

Begin I7 table in extension documentation9.3.2.1 =

-    HTML::end_colour(OUT);
+    HTML::end_span(OUT);
     HTML_TAG("br");
     HTML::begin_plain_html_table(OUT);
     HTML::first_html_column(OUT, 0);
 
- -

§9.4.3. End table cell for I7 table in extension documentation9.4.3 = +

+

§9.3.3. End table cell for I7 table in extension documentation9.3.3 =

-    HTML::end_colour(OUT);
+    HTML::end_span(OUT);
     HTML::next_html_column(OUT, 0);
 
- -

§9.4.4. Begin table cell for I7 table in extension documentation9.4.4 = +

+

§9.3.4. Begin table cell for I7 table in extension documentation9.3.4 =

-    HTML::begin_colour(OUT, I"000080");
+    HTML::begin_span(OUT, I"indexdullblue");
 
- -

§9.4.2.2. Begin new row of I7 table in extension documentation9.4.2.2 = +

+

§9.3.2.2. Begin new row of I7 table in extension documentation9.3.2.2 =

     HTML::end_html_row(OUT);
     HTML::first_html_column(OUT, 0);
 
- +

§9.1.1. End I7 table in extension documentation9.1.1 =

@@ -740,31 +742,31 @@ and this is fiddly but elementary in the usual way of HTML tables: HTML::end_html_table(OUT); -

§9.8. Typesetting the body of an example. This is done just the way all other extension documentation material is +

§9.7. Typesetting the body of an example. This is done just the way all other extension documentation material is handled, except that it is inside an inset box: which is provided by a shaded HTML table, containing just one row, which contains just one cell. Here the inset table begins:

-

Open the new example's text9.8 = +

Open the new example's text9.7 =

-    HTML::begin_html_table(OUT, "#f0f0f0", TRUE, 0, 0, 0, 0, 0);
+    HTML::begin_html_table(OUT, I"extensionexample", TRUE, 0, 0, 0, 0, 0);
     HTML::first_html_column(OUT, 0);
     HTML_OPEN("p");
 
-

§9.9. And here the inset table ends: +

§9.8. And here the inset table ends:

-

Close the previous example's text9.9 = +

Close the previous example's text9.8 =

+    HTML_CLOSE("p");
     HTML::end_html_row(OUT);
     HTML::end_html_table(OUT);
-    HTML_OPEN("p");