Embedding of YouTube, Vimeo, SoundCloud

This commit is contained in:
Graham Nelson 2020-04-10 16:23:50 +01:00
parent c66f5c1fae
commit 0c47e8b9e2
25 changed files with 1995 additions and 1079 deletions

View file

@ -146,4 +146,5 @@ some of these fell into disuse in version 2 syntax.
@e PAGEBREAK_CMD @e PAGEBREAK_CMD
@e GRAMMAR_INDEX_CMD @e GRAMMAR_INDEX_CMD
@e FIGURE_CMD @e FIGURE_CMD
@e EMBED_CMD
@e TAG_CMD @e TAG_CMD

View file

@ -423,6 +423,16 @@ division in the current section.
code_lcat_for_body = COMMENT_BODY_LCAT; code_lcat_for_body = COMMENT_BODY_LCAT;
L->text_operand = Str::duplicate(mr2.exp[0]); L->text_operand = Str::duplicate(mr2.exp[0]);
comment_mode = TRUE; comment_mode = TRUE;
} else if ((current_paragraph) &&
((Regexp::match(&mr2, mr.exp[0], L"%(embedded (%C+) video (%c+)%)")) ||
(Regexp::match(&mr2, mr.exp[0], L"%(embedded (%C+) audio (%c+)%)")))) {
Tags::add_by_name(L->owning_paragraph, I"Figures");
L->command_code = EMBED_CMD;
L->category = COMMAND_LCAT;
code_lcat_for_body = COMMENT_BODY_LCAT;
L->text_operand = Str::duplicate(mr2.exp[0]);
L->text_operand2 = Str::duplicate(mr2.exp[1]);
comment_mode = TRUE;
} else { } else {
Main::error_in_web(I"unknown bracketed annotation", L); Main::error_in_web(I"unknown bracketed annotation", L);
} }

View file

@ -172,6 +172,7 @@ at us; but we don't weave them into the output, that's for sure.
if (L->command_code == PAGEBREAK_CMD) Formats::pagebreak(OUT, wv); if (L->command_code == PAGEBREAK_CMD) Formats::pagebreak(OUT, wv);
if (L->command_code == GRAMMAR_INDEX_CMD) InCSupport::weave_grammar_index(OUT); if (L->command_code == GRAMMAR_INDEX_CMD) InCSupport::weave_grammar_index(OUT);
if (L->command_code == FIGURE_CMD) @<Weave a figure@>; if (L->command_code == FIGURE_CMD) @<Weave a figure@>;
if (L->command_code == EMBED_CMD) @<Embed some Internet material@>;
/* Otherwise assume it was a tangler command, and ignore it here */ /* Otherwise assume it was a tangler command, and ignore it here */
continue; continue;
} }
@ -201,6 +202,9 @@ at us; but we don't weave them into the output, that's for sure.
} }
Regexp::dispose_of(&mr); Regexp::dispose_of(&mr);
@<Embed some Internet material@> =
Formats::embed(OUT, wv, L->text_operand, L->text_operand2);
@h Headings. @h Headings.
The purpose is set with a little heading. Its operand is that part of The purpose is set with a little heading. Its operand is that part of
the purpose-text which is on the opening line; the rest follows on the purpose-text which is on the opening line; the rest follows on

View file

@ -0,0 +1,196 @@
[Structures::] Structures and Functions.
Basic support for languages to recognise structure and function declarations.
@ For each |typedef struct| we find, we will make one of these:
=
typedef struct c_structure {
struct text_stream *structure_name;
int tangled; /* whether the structure definition has been tangled out */
struct source_line *structure_header_at; /* opening line of |typedef| */
struct source_line *typedef_ends; /* closing line, where |}| appears */
struct linked_list *incorporates; /* of |c_structure| */
struct linked_list *elements; /* of |structure_element| */
struct c_structure *next_cst_alphabetically;
MEMORY_MANAGEMENT
} c_structure;
@ =
c_structure *first_cst_alphabetically = NULL;
c_structure *Structures::new_struct(web *W, text_stream *name, source_line *L) {
c_structure *str = CREATE(c_structure);
@<Initialise the C structure structure@>;
Analyser::mark_reserved_word_for_section(L->owning_section, str->structure_name, RESERVED_COLOUR);
@<Add this to the lists for its web and its paragraph@>;
@<Insertion-sort this into the alphabetical list of all structures found@>;
return str;
}
@<Initialise the C structure structure@> =
str->structure_name = Str::duplicate(name);
str->structure_header_at = L;
str->tangled = FALSE;
str->typedef_ends = NULL;
str->incorporates = NEW_LINKED_LIST(c_structure);
str->elements = NEW_LINKED_LIST(structure_element);
@<Add this to the lists for its web and its paragraph@> =
ADD_TO_LINKED_LIST(str, c_structure, W->c_structures);
ADD_TO_LINKED_LIST(str, c_structure, L->owning_paragraph->structures);
@<Insertion-sort this into the alphabetical list of all structures found@> =
str->next_cst_alphabetically = NULL;
if (first_cst_alphabetically == NULL) first_cst_alphabetically = str;
else {
int placed = FALSE;
c_structure *last = NULL;
for (c_structure *seq = first_cst_alphabetically; seq;
seq = seq->next_cst_alphabetically) {
if (Str::cmp(str->structure_name, seq->structure_name) < 0) {
if (seq == first_cst_alphabetically) {
str->next_cst_alphabetically = first_cst_alphabetically;
first_cst_alphabetically = str;
} else {
last->next_cst_alphabetically = str;
str->next_cst_alphabetically = seq;
}
placed = TRUE;
break;
}
last = seq;
}
if (placed == FALSE) last->next_cst_alphabetically = str;
}
@ A language can also create an instance of |structure_element| to record the
existence of the element |val|, and add it to the linked list of elements of
the structure being defined.
In InC, only, certain element names used often in Inform's source code are
given mildly special treatment. This doesn't amount to much. |allow_sharing|
has no effect on tangling, so it doesn't change the program. It simply
affects the reports in the woven code about where structures are used.
=
typedef struct structure_element {
struct text_stream *element_name;
struct source_line *element_created_at;
int allow_sharing;
MEMORY_MANAGEMENT
} structure_element;
@ =
structure_element *Structures::new_element(c_structure *str, text_stream *elname,
source_line *L) {
Analyser::mark_reserved_word_for_section(L->owning_section, elname, ELEMENT_COLOUR);
structure_element *elt = CREATE(structure_element);
elt->element_name = Str::duplicate(elname);
elt->allow_sharing = FALSE;
elt->element_created_at = L;
if (LanguageMethods::share_element(L->owning_section->sect_language, elname))
elt->allow_sharing = TRUE;
ADD_TO_LINKED_LIST(elt, structure_element, str->elements);
return elt;
}
@ =
c_structure *Structures::find_structure(web *W, text_stream *name) {
c_structure *str;
LOOP_OVER_LINKED_LIST(str, c_structure, W->c_structures)
if (Str::eq(name, str->structure_name))
return str;
return NULL;
}
@h Functions.
Each function definition found results in one of these structures being made:
=
typedef struct function {
struct text_stream *function_name; /* e.g., |"cultivate"| */
struct text_stream *function_type; /* e.g., |"tree *"| */
struct text_stream *function_arguments; /* e.g., |"int rainfall)"|: note |)| */
struct source_line *function_header_at; /* where the first line of the header begins */
int within_namespace; /* written using InC namespace dividers */
int called_from_other_sections;
int call_freely;
int no_conditionals;
struct source_line *within_conditionals[MAX_CONDITIONAL_COMPILATION_STACK];
MEMORY_MANAGEMENT
} function;
@ =
function *Structures::new_function(text_stream *fname, source_line *L) {
Analyser::mark_reserved_word_for_section(L->owning_section, fname, FUNCTION_COLOUR);
function *fn = CREATE(function);
@<Initialise the function structure@>;
@<Add the function to its paragraph and line@>;
if (L->owning_section->sect_language->supports_namespaces)
@<Check that the function has its namespace correctly declared@>;
return fn;
}
@ Note that we take a snapshot of the conditional compilation stack as
part of the function structure. We'll need it when predeclaring the function.
@<Initialise the function structure@> =
fn->function_name = Str::duplicate(fname);
fn->function_arguments = Str::new();
fn->function_type = Str::new();
fn->within_namespace = FALSE;
fn->called_from_other_sections = FALSE;
fn->call_freely = FALSE;
fn->function_header_at = L;
fn->no_conditionals = 0;
@<Add the function to its paragraph and line@> =
paragraph *P = L->owning_paragraph;
if (P) ADD_TO_LINKED_LIST(fn, function, P->functions);
L->function_defined = fn;
@<Check that the function has its namespace correctly declared@> =
text_stream *declared_namespace = NULL;
text_stream *ambient_namespace = L->owning_section->sect_namespace;
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, fname, L"(%c+::)%c*")) {
declared_namespace = mr.exp[0];
fn->within_namespace = TRUE;
} else if ((Str::eq_wide_string(fname, L"main")) &&
(Str::eq_wide_string(ambient_namespace, L"Main::")))
declared_namespace = I"Main::";
if ((Str::ne(declared_namespace, ambient_namespace)) &&
(L->owning_paragraph->placed_very_early == FALSE)) {
TEMPORARY_TEXT(err_mess);
if (Str::len(declared_namespace) == 0)
WRITE_TO(err_mess, "Function '%S' should have namespace prefix '%S'",
fname, ambient_namespace);
else if (Str::len(ambient_namespace) == 0)
WRITE_TO(err_mess, "Function '%S' declared in a section with no namespace",
fname);
else
WRITE_TO(err_mess, "Function '%S' declared in a section with the wrong namespace '%S'",
fname, ambient_namespace);
Main::error_in_web(err_mess, L);
DISCARD_TEXT(err_mess);
}
Regexp::dispose_of(&mr);
@h Cataloguing.
This implements the additional information in the |-structures| and |-functions|
forms of section catalogue.
=
void Structures::catalogue(section *S, int functions_too) {
c_structure *str;
LOOP_OVER(str, c_structure)
if (str->structure_header_at->owning_section == S)
PRINT(" %S ", str->structure_name);
if (functions_too) {
function *fn;
LOOP_OVER(fn, function)
if (fn->function_header_at->owning_section == S)
PRINT("\n %S", fn->function_name);
}
}

View file

@ -293,6 +293,21 @@ void Formats::figure(OUTPUT_STREAM, weave_target *wv, text_stream *figname,
VMETHOD_CALL(wf, FIGURE_FOR_MTID, OUT, wv, figname, w, h, pl); VMETHOD_CALL(wf, FIGURE_FOR_MTID, OUT, wv, figname, w, h, pl);
} }
@ |EMBED_FOR_MTID| has to embed some Internet-sourced content. |service|
here is something like |YouTube| or |Soundcloud|, and |ID| is whatever code
that service uses to identify the video/audio in question.
@e EMBED_FOR_MTID
=
VMETHOD_TYPE(EMBED_FOR_MTID, weave_format *wf, text_stream *OUT, weave_target *wv,
text_stream *service, text_stream *ID)
void Formats::embed(OUTPUT_STREAM, weave_target *wv, text_stream *service,
text_stream *ID) {
weave_format *wf = wv->format;
VMETHOD_CALL(wf, EMBED_FOR_MTID, OUT, wv, service, ID);
}
@ This method weaves an angle-bracketed paragraph macro name. |defn| is set @ This method weaves an angle-bracketed paragraph macro name. |defn| is set
if and only if this is the place where the macro is defined -- the usual if and only if this is the place where the macro is defined -- the usual
thing is to render some sort of equals sign after it, if so. thing is to render some sort of equals sign after it, if so.

View file

@ -31,6 +31,7 @@ void HTMLFormat::create(void) {
METHOD_ADD(wf, ITEM_FOR_MTID, HTMLFormat::item); METHOD_ADD(wf, ITEM_FOR_MTID, HTMLFormat::item);
METHOD_ADD(wf, BAR_FOR_MTID, HTMLFormat::bar); METHOD_ADD(wf, BAR_FOR_MTID, HTMLFormat::bar);
METHOD_ADD(wf, FIGURE_FOR_MTID, HTMLFormat::figure); METHOD_ADD(wf, FIGURE_FOR_MTID, HTMLFormat::figure);
METHOD_ADD(wf, EMBED_FOR_MTID, HTMLFormat::embed);
METHOD_ADD(wf, PARA_MACRO_FOR_MTID, HTMLFormat::para_macro); METHOD_ADD(wf, PARA_MACRO_FOR_MTID, HTMLFormat::para_macro);
METHOD_ADD(wf, PAGEBREAK_FOR_MTID, HTMLFormat::pagebreak); METHOD_ADD(wf, PAGEBREAK_FOR_MTID, HTMLFormat::pagebreak);
METHOD_ADD(wf, BLANK_LINE_FOR_MTID, HTMLFormat::blank_line); METHOD_ADD(wf, BLANK_LINE_FOR_MTID, HTMLFormat::blank_line);
@ -446,6 +447,47 @@ void HTMLFormat::figure(weave_format *self, text_stream *OUT, weave_target *wv,
WRITE("\n"); WRITE("\n");
} }
@ =
void HTMLFormat::embed(weave_format *self, text_stream *OUT, weave_target *wv,
text_stream *service, text_stream *ID) {
text_stream *CH = I"405";
text_stream *CW = I"720";
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, ID, L"(%c+) at (%c+) by (%c+)")) {
CW = Str::duplicate(mr.exp[1]);
CH = Str::duplicate(mr.exp[2]);
ID = mr.exp[0];
} else if (Regexp::match(&mr, ID, L"(%c+) at (%c+)")) {
CH = Str::duplicate(mr.exp[1]);
ID = mr.exp[0];
}
HTMLFormat::exit_current_paragraph(OUT);
TEMPORARY_TEXT(embed_leaf);
WRITE_TO(embed_leaf, "%S.html", service);
filename *F =
Filenames::in_folder(
Pathnames::subfolder(wv->weave_web->md->path_to_web, I"Embedding"), embed_leaf);
if (TextFiles::exists(F) == FALSE)
F = Filenames::in_folder(
Pathnames::subfolder(path_to_inweb, I"Embedding"), embed_leaf);
DISCARD_TEXT(embed_leaf);
if (TextFiles::exists(F) == FALSE) {
PRINT("Tried %f\n", F);
Main::error_in_web(I"This is not a supported service", current_weave_line);
return;
}
Bibliographic::set_datum(wv->weave_web->md, I"Content ID", ID);
Bibliographic::set_datum(wv->weave_web->md, I"Content Width", CW);
Bibliographic::set_datum(wv->weave_web->md, I"Content Height", CH);
HTML_OPEN("center");
Indexer::run(wv->weave_web, I"", F, NULL, OUT, wv->pattern, NULL, NULL, NULL, FALSE, TRUE);
HTML_CLOSE("center");
WRITE("\n");
Regexp::dispose_of(&mr);
}
@ = @ =
void HTMLFormat::para_macro(weave_format *self, text_stream *OUT, weave_target *wv, void HTMLFormat::para_macro(weave_format *self, text_stream *OUT, weave_target *wv,
para_macro *pmac, int defn) { para_macro *pmac, int defn) {

View file

@ -0,0 +1 @@
<iframe width="100%" height="[[Content Height]]" scrolling="no" frameborder="no" allow="autoplay" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/[[Content ID]]&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true"></iframe>

1
Embedding/Vimeo.html Normal file
View file

@ -0,0 +1 @@
<iframe src="https://player.vimeo.com/video/[[Content ID]]" width="[[Content Width]]" height="[[Content Height]]" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>

1
Embedding/YouTube.html Normal file
View file

@ -0,0 +1 @@
<iframe width="[[Content Width]]" height="[[Content Height]]" src="https://www.youtube.com/embed/[[Content ID]]" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

BIN
Figures/mars.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

View file

@ -451,6 +451,48 @@ In these examples, we constrain the width or the height of the image
to be exactly that given: it is scaled accordingly. (They can't both be to be exactly that given: it is scaled accordingly. (They can't both be
constrained, so you can't change the aspect ratio.) constrained, so you can't change the aspect ratio.)
@h Embedded video.
This makes sense only for some HTML-like weave formats, but we can also
cause videos to be embedded:
= (text as Inweb)
= (embedded YouTube video GR3aImy7dWw)
=
With results like so:
= (embedded YouTube video GR3aImy7dWw)
The YouTube ID number |GR3aImy7dWw| can be read from its Share URL, which in
this case was |https://youtu.be/GR3aImy7dWw|.
Similarly for Vimeo:
= (text as Inweb)
= (embedded Vimeo video 204519)
=
With results like so:
= (embedded Vimeo video 204519)
For audio, you may like to try SoundCloud:
= (text as Inweb)
= (embedded SoundCloud audio 42803139)
=
With results like so:
= (embedded SoundCloud audio 42803139)
@ Adding width and height is straightforward; by default the dimensions are
720 by 405.
= (text as Inweb)
= (embedded Vimeo video 204519 at 400 by 300)
= (embedded SoundCloud audio 42803139 at 200)
=
The latter sets just the height (of the displayed waveform, that is --
arguably music has width and not height, but SoundCloud thinks otherwise).
@ It's easy to add services. These are all handled by using prototype code
for a suitable HTML |<iframe>|, and those prototypes are stored in the
|Embedding| subdirectory of the Inweb installation. But you can use your
own prototypes instead, by creating an |Embedding| subdirectory of your own
web; this overrides the ones built in. If your service is, say, |WebTubeo|,
then the file would be |W/Embedding/WebTubeo.html|.
@h Mathematics notation. @h Mathematics notation.
Mathematical formulae can be typed in TeX notation between dollar signs, Mathematical formulae can be typed in TeX notation between dollar signs,
as usual for TeX formulae. This can of course only really be rendered if as usual for TeX formulae. This can of course only really be rendered if

File diff suppressed because it is too large Load diff

View file

@ -517,7 +517,7 @@ source:
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function Main::error_in_web is used in 1/cnf (<a href="1-cnf.html#SP5">&#167;5</a>), 2/tp (<a href="2-tp.html#SP1_1_6_3">&#167;1.1.6.3</a>, <a href="2-tp.html#SP1_1_6_4">&#167;1.1.6.4</a>, <a href="2-tp.html#SP1_1_6_7">&#167;1.1.6.7</a>, <a href="2-tp.html#SP1_1_6_7_1">&#167;1.1.6.7.1</a>, <a href="2-tp.html#SP1_1_6_5_1">&#167;1.1.6.5.1</a>, <a href="2-tp.html#SP1_1_6_5_1_1">&#167;1.1.6.5.1.1</a>, <a href="2-tp.html#SP1_1_6_5_1_2">&#167;1.1.6.5.1.2</a>, <a href="2-tp.html#SP1_1_6_5_1_3">&#167;1.1.6.5.1.3</a>, <a href="2-tp.html#SP1_1_6_5_1_4">&#167;1.1.6.5.1.4</a>, <a href="2-tp.html#SP1_1_6_5_1_7">&#167;1.1.6.5.1.7</a>, <a href="2-tp.html#SP3">&#167;3</a>), 2/ec (<a href="2-ec.html#SP3_1">&#167;3.1</a>, <a href="2-ec.html#SP3_2">&#167;3.2</a>, <a href="2-ec.html#SP3_3">&#167;3.3</a>), 3/ta (<a href="3-ta.html#SP4_1">&#167;4.1</a>), 3/tt (<a href="3-tt.html#SP1_1_1_1">&#167;1.1.1.1</a>, <a href="3-tt.html#SP3_1">&#167;3.1</a>), 4/saf (<a href="4-saf.html#SP7_3">&#167;7.3</a>), 4/lm (<a href="4-lm.html#SP8">&#167;8</a>), 4/cl (<a href="4-cl.html#SP2">&#167;2</a>, <a href="4-cl.html#SP2_1">&#167;2.1</a>, <a href="4-cl.html#SP2_4_2_1">&#167;2.4.2.1</a>, <a href="4-cl.html#SP8">&#167;8</a>), 5/fm (<a href="5-fm.html#SP24">&#167;24</a>).</p> <p class="endnote">The function Main::error_in_web is used in 1/cnf (<a href="1-cnf.html#SP5">&#167;5</a>), 2/tp (<a href="2-tp.html#SP1_1_6_3">&#167;1.1.6.3</a>, <a href="2-tp.html#SP1_1_6_4">&#167;1.1.6.4</a>, <a href="2-tp.html#SP1_1_6_7">&#167;1.1.6.7</a>, <a href="2-tp.html#SP1_1_6_7_1">&#167;1.1.6.7.1</a>, <a href="2-tp.html#SP1_1_6_5_1">&#167;1.1.6.5.1</a>, <a href="2-tp.html#SP1_1_6_5_1_1">&#167;1.1.6.5.1.1</a>, <a href="2-tp.html#SP1_1_6_5_1_2">&#167;1.1.6.5.1.2</a>, <a href="2-tp.html#SP1_1_6_5_1_3">&#167;1.1.6.5.1.3</a>, <a href="2-tp.html#SP1_1_6_5_1_4">&#167;1.1.6.5.1.4</a>, <a href="2-tp.html#SP1_1_6_5_1_7">&#167;1.1.6.5.1.7</a>, <a href="2-tp.html#SP3">&#167;3</a>), 2/ec (<a href="2-ec.html#SP3_1">&#167;3.1</a>, <a href="2-ec.html#SP3_2">&#167;3.2</a>, <a href="2-ec.html#SP3_3">&#167;3.3</a>), 3/ta (<a href="3-ta.html#SP4_1">&#167;4.1</a>), 3/tt (<a href="3-tt.html#SP1_1_1_1">&#167;1.1.1.1</a>, <a href="3-tt.html#SP3_1">&#167;3.1</a>), 4/saf (<a href="4-saf.html#SP7_3">&#167;7.3</a>), 4/lm (<a href="4-lm.html#SP8">&#167;8</a>), 4/cl (<a href="4-cl.html#SP2">&#167;2</a>, <a href="4-cl.html#SP2_1">&#167;2.1</a>, <a href="4-cl.html#SP2_4_2_1">&#167;2.4.2.1</a>, <a href="4-cl.html#SP8">&#167;8</a>), 5/fm (<a href="5-fm.html#SP25">&#167;25</a>), 5/hf (<a href="5-hf.html#SP17">&#167;17</a>).</p>
<hr class="tocbar"> <hr class="tocbar">
<ul class="toc"><li><a href="1-bsc.html">Back to 'Basics'</a></li><li><a href="1-cnf.html">Continue with 'Configuration'</a></li></ul><hr class="tocbar"> <ul class="toc"><li><a href="1-bsc.html">Back to 'Basics'</a></li><li><a href="1-cnf.html">Continue with 'Configuration'</a></li></ul><hr class="tocbar">

View file

@ -331,7 +331,7 @@ from each other then this routine will lock up into an infinite loop.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function Patterns::obtain_filename is used in <a href="#SP6">&#167;6</a>, 3/ts (<a href="3-ts.html#SP3">&#167;3</a>), 3/ti (<a href="3-ti.html#SP1">&#167;1</a>, <a href="3-ti.html#SP2">&#167;2</a>, <a href="3-ti.html#SP2_1_3">&#167;2.1.3</a>, <a href="3-ti.html#SP5_1">&#167;5.1</a>), 5/tf (<a href="5-tf.html#SP3_1">&#167;3.1</a>), 5/hf (<a href="5-hf.html#SP6">&#167;6</a>, <a href="5-hf.html#SP9">&#167;9</a>, <a href="5-hf.html#SP28">&#167;28</a>).</p> <p class="endnote">The function Patterns::obtain_filename is used in <a href="#SP6">&#167;6</a>, 3/ts (<a href="3-ts.html#SP3">&#167;3</a>), 3/ti (<a href="3-ti.html#SP1">&#167;1</a>, <a href="3-ti.html#SP2">&#167;2</a>, <a href="3-ti.html#SP2_1_3">&#167;2.1.3</a>, <a href="3-ti.html#SP5_1">&#167;5.1</a>), 5/tf (<a href="5-tf.html#SP3_1">&#167;3.1</a>), 5/hf (<a href="5-hf.html#SP6">&#167;6</a>, <a href="5-hf.html#SP9">&#167;9</a>, <a href="5-hf.html#SP29">&#167;29</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>When we eventually want to deal with the <code class="display"><span class="extract">use P</span></code> commands, which call <p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>When we eventually want to deal with the <code class="display"><span class="extract">use P</span></code> commands, which call
for payloads to be copied into weave, we make good use of the above: for payloads to be copied into weave, we make good use of the above:

View file

@ -193,6 +193,7 @@ some of these fell into disuse in version 2 syntax.
<span class="definitionkeyword">enum</span> <span class="constant">PAGEBREAK_CMD</span> <span class="definitionkeyword">enum</span> <span class="constant">PAGEBREAK_CMD</span>
<span class="definitionkeyword">enum</span> <span class="constant">GRAMMAR_INDEX_CMD</span> <span class="definitionkeyword">enum</span> <span class="constant">GRAMMAR_INDEX_CMD</span>
<span class="definitionkeyword">enum</span> <span class="constant">FIGURE_CMD</span> <span class="definitionkeyword">enum</span> <span class="constant">FIGURE_CMD</span>
<span class="definitionkeyword">enum</span> <span class="constant">EMBED_CMD</span>
<span class="definitionkeyword">enum</span> <span class="constant">TAG_CMD</span> <span class="definitionkeyword">enum</span> <span class="constant">TAG_CMD</span>
</pre> </pre>
<hr class="tocbar"> <hr class="tocbar">

View file

@ -662,6 +662,16 @@ division in the current section.
<span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">COMMENT_BODY_LCAT</span><span class="plain">;</span> <span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">COMMENT_BODY_LCAT</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span> <span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span> <span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">current_paragraph</span><span class="plain">) &amp;&amp;</span>
<span class="plain">((</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr2</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">"%(embedded (%C+) video (%c+)%)"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr2</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">"%(embedded (%C+) audio (%c+)%)"</span><span class="plain">)))) {</span>
<span class="functiontext">Tags::add_by_name</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Figures"</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> = </span><span class="constant">EMBED_CMD</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> = </span><span class="constant">COMMAND_LCAT</span><span class="plain">;</span>
<span class="identifier">code_lcat_for_body</span><span class="plain"> = </span><span class="constant">COMMENT_BODY_LCAT</span><span class="plain">;</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand2</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr2</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="identifier">comment_mode</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span> <span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"unknown bracketed annotation"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span> <span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"unknown bracketed annotation"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="plain">}</span> <span class="plain">}</span>

View file

@ -459,7 +459,7 @@ tangled for.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function Reader::woven_folder is used in 1/ptt (<a href="1-ptt.html#SP7">&#167;7</a>), 3/ts (<a href="3-ts.html#SP2_2">&#167;2.2</a>), 3/ti (<a href="3-ti.html#SP5_4">&#167;5.4</a>), 5/hf (<a href="5-hf.html#SP28">&#167;28</a>).</p> <p class="endnote">The function Reader::woven_folder is used in 1/ptt (<a href="1-ptt.html#SP7">&#167;7</a>), 3/ts (<a href="3-ts.html#SP2_2">&#167;2.2</a>), 3/ti (<a href="3-ti.html#SP5_4">&#167;5.4</a>), 5/hf (<a href="5-hf.html#SP29">&#167;29</a>).</p>
<p class="endnote">The function Reader::tangled_folder is used in 1/pc (<a href="1-pc.html#SP7_4_2">&#167;7.4.2</a>), 3/tt (<a href="3-tt.html#SP1_2">&#167;1.2</a>), 4/is (<a href="4-is.html#SP13">&#167;13</a>).</p> <p class="endnote">The function Reader::tangled_folder is used in 1/pc (<a href="1-pc.html#SP7_4_2">&#167;7.4.2</a>), 3/tt (<a href="3-tt.html#SP1_2">&#167;1.2</a>), 4/is (<a href="4-is.html#SP13">&#167;13</a>).</p>

View file

@ -51,7 +51,7 @@ to call the fuller indexing service if need be, using <code class="display"><spa
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function Indexer::cover_sheet_maker is used in <a href="#SP2_1_1">&#167;2.1.1</a>, 3/tw (<a href="3-tw.html#SP1_2">&#167;1.2</a>, <a href="3-tw.html#SP1_4">&#167;1.4</a>), 5/hf (<a href="5-hf.html#SP6">&#167;6</a>, <a href="5-hf.html#SP26">&#167;26</a>).</p> <p class="endnote">The function Indexer::cover_sheet_maker is used in <a href="#SP2_1_1">&#167;2.1.1</a>, 3/tw (<a href="3-tw.html#SP1_2">&#167;1.2</a>, <a href="3-tw.html#SP1_4">&#167;1.4</a>), 5/hf (<a href="5-hf.html#SP6">&#167;6</a>, <a href="5-hf.html#SP27">&#167;27</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b>The cover-sheet-maker has the ability to weave only the top half, or only <p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b>The cover-sheet-maker has the ability to weave only the top half, or only
the bottom half, of the template; they are divided by the marker <code class="display"><span class="extract">[[Code]]</span></code>. the bottom half, of the template; they are divided by the marker <code class="display"><span class="extract">[[Code]]</span></code>.
@ -353,7 +353,7 @@ being accessed directly.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function Indexer::run is used in <a href="#SP2_1_3">&#167;2.1.3</a>, <a href="#SP3">&#167;3</a>, 3/ts (<a href="3-ts.html#SP3">&#167;3</a>).</p> <p class="endnote">The function Indexer::run is used in <a href="#SP2_1_3">&#167;2.1.3</a>, <a href="#SP3">&#167;3</a>, 3/ts (<a href="3-ts.html#SP3">&#167;3</a>), 5/hf (<a href="5-hf.html#SP17">&#167;17</a>).</p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b><code class="display"> <p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make any necessary substitutions to turn tl into final output</span> <span class="cwebmacronumber">5.1</span>&gt; = &lt;<span class="cwebmacrodefn">Make any necessary substitutions to turn tl into final output</span> <span class="cwebmacronumber">5.1</span>&gt; =

View file

@ -310,6 +310,7 @@ at us; but we don't weave them into the output, that's for sure.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> == </span><span class="constant">PAGEBREAK_CMD</span><span class="plain">) </span><span class="functiontext">Formats::pagebreak</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> == </span><span class="constant">PAGEBREAK_CMD</span><span class="plain">) </span><span class="functiontext">Formats::pagebreak</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> == </span><span class="constant">GRAMMAR_INDEX_CMD</span><span class="plain">) </span><span class="functiontext">InCSupport::weave_grammar_index</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">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> == </span><span class="constant">GRAMMAR_INDEX_CMD</span><span class="plain">) </span><span class="functiontext">InCSupport::weave_grammar_index</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">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> == </span><span class="constant">FIGURE_CMD</span><span class="plain">) </span>&lt;<span class="cwebmacro">Weave a figure</span> <span class="cwebmacronumber">1.3.3.1.2.1</span>&gt;<span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> == </span><span class="constant">FIGURE_CMD</span><span class="plain">) </span>&lt;<span class="cwebmacro">Weave a figure</span> <span class="cwebmacronumber">1.3.3.1.2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> == </span><span class="constant">EMBED_CMD</span><span class="plain">) </span>&lt;<span class="cwebmacro">Embed some Internet material</span> <span class="cwebmacronumber">1.3.3.1.2.2</span>&gt;<span class="plain">;</span>
<span class="comment"> Otherwise assume it was a tangler command, and ignore it here</span> <span class="comment"> Otherwise assume it was a tangler command, and ignore it here</span>
<span class="reserved">continue</span><span class="plain">;</span> <span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span> <span class="plain">}</span>
@ -354,6 +355,19 @@ at us; but we don't weave them into the output, that's for sure.
<p class="endnote">This code is used in <a href="#SP1_3_3_1_2">&#167;1.3.3.1.2</a>.</p> <p class="endnote">This code is used in <a href="#SP1_3_3_1_2">&#167;1.3.3.1.2</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_2_2"></a><b>&#167;1.3.3.1.2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Embed some Internet material</span> <span class="cwebmacronumber">1.3.3.1.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Formats::embed</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand2</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_2">&#167;1.3.3.1.2</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_3"></a><b>&#167;1.3.3.1.3. Headings. </b>The purpose is set with a little heading. Its operand is that part of <p class="inwebparagraph"><a id="SP1_3_3_1_3"></a><b>&#167;1.3.3.1.3. Headings. </b>The purpose is set with a little heading. Its operand is that part of
the purpose-text which is on the opening line; the rest follows on the purpose-text which is on the opening line; the rest follows on
subsequent lines until the next blank. subsequent lines until the next blank.

343
docs/inweb/4-saf.html Normal file
View file

@ -0,0 +1,343 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Structures and Functions</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="../inweb/index.html">inweb</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../foundation-module/index.html">foundation-module</a></li>
<li><a href="../foundation-test/index.html">foundation-test</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Structures and Functions' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#4">Chapter 4: Languages</a></li><li><b>Structures and Functions</b></li></ul><p class="purpose">Basic support for languages to recognise structure and function declarations.</p>
<ul class="toc"><li><a href="#SP6">&#167;6. Functions</a></li><li><a href="#SP8">&#167;8. Cataloguing</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>For each <code class="display"><span class="extract">typedef struct</span></code> we find, we will make one of these:
</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">c_structure</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">structure_name</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tangled</span><span class="plain">; </span><span class="comment"> whether the structure definition has been tangled out</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">structure_header_at</span><span class="plain">; </span><span class="comment"> opening line of <code class="display"><span class="extract">typedef</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">typedef_ends</span><span class="plain">; </span><span class="comment"> closing line, where <code class="display"><span class="extract">}</span></code> appears</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">incorporates</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">c_structure</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">elements</span><span class="plain">; </span><span class="comment"> of <code class="display"><span class="extract">structure_element</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">next_cst_alphabetically</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">c_structure</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure c_structure is accessed in 3/tw, 4/cl and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display">
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">first_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="functiontext">Structures::new_struct</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">str</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">c_structure</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Initialise the C structure structure</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
<span class="functiontext">Analyser::mark_reserved_word_for_section</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_name</span><span class="plain">, </span><span class="constant">RESERVED_COLOUR</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Add this to the lists for its web and its paragraph</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Insertion-sort this into the alphabetical list of all structures found</span> <span class="cwebmacronumber">2.3</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">str</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Structures::new_struct is used in 4/cl (<a href="4-cl.html#SP2_2">&#167;2.2</a>).</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Initialise the C structure structure</span> <span class="cwebmacronumber">2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_name</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_header_at</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">tangled</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">typedef_ends</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">incorporates</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">c_structure</span><span class="plain">);</span>
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">elements</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">structure_element</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add this to the lists for its web and its paragraph</span> <span class="cwebmacronumber">2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">str</span><span class="plain">, </span><span class="reserved">c_structure</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">c_structures</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">str</span><span class="plain">, </span><span class="reserved">c_structure</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">-&gt;</span><span class="element">structures</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_3"></a><b>&#167;2.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Insertion-sort this into the alphabetical list of all structures found</span> <span class="cwebmacronumber">2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">next_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">first_cst_alphabetically</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">first_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">str</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">placed</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">last</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">seq</span><span class="plain"> = </span><span class="identifier">first_cst_alphabetically</span><span class="plain">; </span><span class="identifier">seq</span><span class="plain">;</span>
<span class="identifier">seq</span><span class="plain"> = </span><span class="identifier">seq</span><span class="plain">-&gt;</span><span class="identifier">next_cst_alphabetically</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::cmp</span><span class="plain">(</span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_name</span><span class="plain">, </span><span class="identifier">seq</span><span class="plain">-&gt;</span><span class="element">structure_name</span><span class="plain">) &lt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">seq</span><span class="plain"> == </span><span class="identifier">first_cst_alphabetically</span><span class="plain">) {</span>
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">next_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">first_cst_alphabetically</span><span class="plain">;</span>
<span class="identifier">first_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">str</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">last</span><span class="plain">-&gt;</span><span class="element">next_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">str</span><span class="plain">;</span>
<span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">next_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">seq</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">placed</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">last</span><span class="plain"> = </span><span class="identifier">seq</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">placed</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="identifier">last</span><span class="plain">-&gt;</span><span class="element">next_cst_alphabetically</span><span class="plain"> = </span><span class="identifier">str</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>A language can also create an instance of <code class="display"><span class="extract">structure_element</span></code> to record the
existence of the element <code class="display"><span class="extract">val</span></code>, and add it to the linked list of elements of
the structure being defined.
</p>
<p class="inwebparagraph">In InC, only, certain element names used often in Inform's source code are
given mildly special treatment. This doesn't amount to much. <code class="display"><span class="extract">allow_sharing</span></code>
has no effect on tangling, so it doesn't change the program. It simply
affects the reports in the woven code about where structures are used.
</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">structure_element</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">element_name</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">element_created_at</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_sharing</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">structure_element</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure structure_element is accessed in 3/tw, 4/cl and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="display">
<span class="reserved">structure_element</span><span class="plain"> *</span><span class="functiontext">Structures::new_element</span><span class="plain">(</span><span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">str</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">elname</span><span class="plain">,</span>
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
<span class="functiontext">Analyser::mark_reserved_word_for_section</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain">, </span><span class="identifier">elname</span><span class="plain">, </span><span class="constant">ELEMENT_COLOUR</span><span class="plain">);</span>
<span class="reserved">structure_element</span><span class="plain"> *</span><span class="identifier">elt</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">structure_element</span><span class="plain">);</span>
<span class="identifier">elt</span><span class="plain">-&gt;</span><span class="element">element_name</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">elname</span><span class="plain">);</span>
<span class="identifier">elt</span><span class="plain">-&gt;</span><span class="element">allow_sharing</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">elt</span><span class="plain">-&gt;</span><span class="element">element_created_at</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="functiontext">LanguageMethods::share_element</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain">-&gt;</span><span class="element">sect_language</span><span class="plain">, </span><span class="identifier">elname</span><span class="plain">))</span>
<span class="identifier">elt</span><span class="plain">-&gt;</span><span class="element">allow_sharing</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">elt</span><span class="plain">, </span><span class="reserved">structure_element</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">elements</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">elt</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Structures::new_element is used in 4/cl (<a href="4-cl.html#SP2_2_1">&#167;2.2.1</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b></p>
<pre class="display">
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="functiontext">Structures::find_structure</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">str</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">str</span><span class="plain">, </span><span class="reserved">c_structure</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">c_structures</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_name</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">str</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="endnote">The function Structures::find_structure appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Functions. </b>Each function definition found results in one of these structures being made:
</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">function</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">function_name</span><span class="plain">; </span><span class="comment"> e.g., <code class="display"><span class="extract">"cultivate"</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">function_type</span><span class="plain">; </span><span class="comment"> e.g., <code class="display"><span class="extract">"tree *"</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">function_arguments</span><span class="plain">; </span><span class="comment"> e.g., <code class="display"><span class="extract">"int rainfall)"</span></code>: note <code class="display"><span class="extract">)</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">function_header_at</span><span class="plain">; </span><span class="comment"> where the first line of the header begins</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">within_namespace</span><span class="plain">; </span><span class="comment"> written using InC namespace dividers</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">called_from_other_sections</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">call_freely</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_conditionals</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">within_conditionals</span><span class="plain">[</span><span class="constant">MAX_CONDITIONAL_COMPILATION_STACK</span><span class="plain">];</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">function</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure function is accessed in 3/tw, 4/cl and here.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="display">
<span class="reserved">function</span><span class="plain"> *</span><span class="functiontext">Structures::new_function</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">fname</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
<span class="functiontext">Analyser::mark_reserved_word_for_section</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain">, </span><span class="identifier">fname</span><span class="plain">, </span><span class="constant">FUNCTION_COLOUR</span><span class="plain">);</span>
<span class="reserved">function</span><span class="plain"> *</span><span class="identifier">fn</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">function</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Initialise the function structure</span> <span class="cwebmacronumber">7.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Add the function to its paragraph and line</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain">-&gt;</span><span class="element">sect_language</span><span class="plain">-&gt;</span><span class="element">supports_namespaces</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Check that the function has its namespace correctly declared</span> <span class="cwebmacronumber">7.3</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">fn</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Structures::new_function is used in 4/cl (<a href="4-cl.html#SP2_4_2">&#167;2.4.2</a>).</p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b>Note that we take a snapshot of the conditional compilation stack as
part of the function structure. We'll need it when predeclaring the function.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Initialise the function structure</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_name</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">fname</span><span class="plain">);</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_arguments</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_type</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">within_namespace</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">called_from_other_sections</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">call_freely</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_header_at</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">no_conditionals</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_2"></a><b>&#167;7.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add the function to its paragraph and line</span> <span class="cwebmacronumber">7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</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="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">fn</span><span class="plain">, </span><span class="reserved">function</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">functions</span><span class="plain">);</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">function_defined</span><span class="plain"> = </span><span class="identifier">fn</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_3"></a><b>&#167;7.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Check that the function has its namespace correctly declared</span> <span class="cwebmacronumber">7.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">declared_namespace</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ambient_namespace</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain">-&gt;</span><span class="element">sect_namespace</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">fname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+::)%c*"</span><span class="plain">)) {</span>
<span class="identifier">declared_namespace</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">fn</span><span class="plain">-&gt;</span><span class="element">within_namespace</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">fname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"main"</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">ambient_namespace</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Main::"</span><span class="plain">)))</span>
<span class="identifier">declared_namespace</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"Main::"</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::ne</span><span class="plain">(</span><span class="identifier">declared_namespace</span><span class="plain">, </span><span class="identifier">ambient_namespace</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">-&gt;</span><span class="element">placed_very_early</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">err_mess</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">declared_namespace</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">err_mess</span><span class="plain">, </span><span class="string">"Function '%S' should have namespace prefix '%S'"</span><span class="plain">,</span>
<span class="identifier">fname</span><span class="plain">, </span><span class="identifier">ambient_namespace</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">ambient_namespace</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">err_mess</span><span class="plain">, </span><span class="string">"Function '%S' declared in a section with no namespace"</span><span class="plain">,</span>
<span class="identifier">fname</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err_mess</span><span class="plain">, </span><span class="string">"Function '%S' declared in a section with the wrong namespace '%S'"</span><span class="plain">,</span>
<span class="identifier">fname</span><span class="plain">, </span><span class="identifier">ambient_namespace</span><span class="plain">);</span>
<span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="identifier">err_mess</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err_mess</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Cataloguing. </b>This implements the additional information in the <code class="display"><span class="extract">-structures</span></code> and <code class="display"><span class="extract">-functions</span></code>
forms of section catalogue.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Structures::catalogue</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">int</span><span class="plain"> </span><span class="identifier">functions_too</span><span class="plain">) {</span>
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">str</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">str</span><span class="plain">, </span><span class="reserved">c_structure</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_header_at</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain"> == </span><span class="identifier">S</span><span class="plain">)</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">" %S "</span><span class="plain">, </span><span class="identifier">str</span><span class="plain">-&gt;</span><span class="element">structure_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">functions_too</span><span class="plain">) {</span>
<span class="reserved">function</span><span class="plain"> *</span><span class="identifier">fn</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">fn</span><span class="plain">, </span><span class="reserved">function</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_header_at</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain"> == </span><span class="identifier">S</span><span class="plain">)</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"\n %S"</span><span class="plain">, </span><span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Structures::catalogue is used in 3/ta (<a href="3-ta.html#SP2">&#167;2</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-pl.html">Back to 'Programming Languages'</a></li><li><a href="4-lm.html">Continue with 'Language Methods'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>

View file

@ -26,7 +26,7 @@
<!--Weave of 'Format Methods' generated by 7--> <!--Weave of 'Format Methods' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#5">Chapter 5: Formats</a></li><li><b>Format Methods</b></li></ul><p class="purpose">To characterise the relevant differences in behaviour between the various weaving formats offered, such as HTML, ePub, or TeX.</p> <ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#5">Chapter 5: Formats</a></li><li><b>Format Methods</b></li></ul><p class="purpose">To characterise the relevant differences in behaviour between the various weaving formats offered, such as HTML, ePub, or TeX.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Formats</a></li><li><a href="#SP3">&#167;3. Creation</a></li><li><a href="#SP4">&#167;4. Methods</a></li><li><a href="#SP30">&#167;30. Post-processing</a></li></ul><hr class="tocbar"> <ul class="toc"><li><a href="#SP1">&#167;1. Formats</a></li><li><a href="#SP3">&#167;3. Creation</a></li><li><a href="#SP4">&#167;4. Methods</a></li><li><a href="#SP31">&#167;31. Post-processing</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Formats. </b>Exactly as in the previous chapter, each format expresses its behaviour <p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Formats. </b>Exactly as in the previous chapter, each format expresses its behaviour
through optional method calls. through optional method calls.
@ -61,7 +61,7 @@ through optional method calls.
<p class="endnote">The function Formats::create_weave_format is used in 5/ptf (<a href="5-ptf.html#SP1">&#167;1</a>), 5/tf (<a href="5-tf.html#SP1_1">&#167;1.1</a>, <a href="5-tf.html#SP1_2">&#167;1.2</a>, <a href="5-tf.html#SP1_3">&#167;1.3</a>), 5/hf (<a href="5-hf.html#SP1_1">&#167;1.1</a>, <a href="5-hf.html#SP1_2">&#167;1.2</a>).</p> <p class="endnote">The function Formats::create_weave_format is used in 5/ptf (<a href="5-ptf.html#SP1">&#167;1</a>), 5/tf (<a href="5-tf.html#SP1_1">&#167;1.1</a>, <a href="5-tf.html#SP1_2">&#167;1.2</a>, <a href="5-tf.html#SP1_3">&#167;1.3</a>), 5/hf (<a href="5-hf.html#SP1_1">&#167;1.1</a>, <a href="5-hf.html#SP1_2">&#167;1.2</a>).</p>
<p class="endnote">The function Formats::find_by_name is used in <a href="#SP32">&#167;32</a>, 1/ptt (<a href="1-ptt.html#SP3_2">&#167;3.2</a>).</p> <p class="endnote">The function Formats::find_by_name is used in <a href="#SP33">&#167;33</a>, 1/ptt (<a href="1-ptt.html#SP3_2">&#167;3.2</a>).</p>
<p class="endnote">The structure weave_format is accessed in 3/ts and here.</p> <p class="endnote">The structure weave_format is accessed in 3/ts and here.</p>
@ -342,7 +342,7 @@ drably in a uniform <code class="display"><span class="extract">EXTRACT_COLOUR</
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function Formats::source_fragment is used in <a href="#SP23">&#167;23</a>.</p> <p class="endnote">The function Formats::source_fragment is used in <a href="#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>And this weaves a URL, hyperlinking it where possible. <p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>And this weaves a URL, hyperlinking it where possible.
</p> </p>
@ -368,7 +368,7 @@ drably in a uniform <code class="display"><span class="extract">EXTRACT_COLOUR</
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function Formats::url is used in <a href="#SP23_2">&#167;23.2</a>, <a href="#SP23_3_1">&#167;23.3.1</a>, 5/hf (<a href="5-hf.html#SP10_1">&#167;10.1</a>, <a href="5-hf.html#SP10_2_1">&#167;10.2.1</a>).</p> <p class="endnote">The function Formats::url is used in <a href="#SP24_2">&#167;24.2</a>, <a href="#SP24_3_1">&#167;24.3.1</a>, 5/hf (<a href="5-hf.html#SP10_1">&#167;10.1</a>, <a href="5-hf.html#SP10_2_1">&#167;10.2.1</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>This method produces the <code class="display"><span class="extract">&gt;&gt; Example</span></code> bits of example source text, really <p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>This method produces the <code class="display"><span class="extract">&gt;&gt; Example</span></code> bits of example source text, really
a convenience for Inform 7 code commentary. a convenience for Inform 7 code commentary.
@ -471,7 +471,31 @@ of the web.
<p class="endnote">The function Formats::figure is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_2_1">&#167;1.3.3.1.2.1</a>).</p> <p class="endnote">The function Formats::figure is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_2_1">&#167;1.3.3.1.2.1</a>).</p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>This method weaves an angle-bracketed paragraph macro name. <code class="display"><span class="extract">defn</span></code> is set <p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b><code class="display"><span class="extract">EMBED_FOR_MTID</span></code> has to embed some Internet-sourced content. <code class="display"><span class="extract">service</span></code>
here is something like <code class="display"><span class="extract">YouTube</span></code> or <code class="display"><span class="extract">Soundcloud</span></code>, and <code class="display"><span class="extract">ID</span></code> is whatever code
that service uses to identify the video/audio in question.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">EMBED_FOR_MTID</span>
</pre>
<pre class="display">
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">EMBED_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">service</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ID</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::embed</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">service</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ID</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">EMBED_FOR_MTID</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">service</span><span class="plain">, </span><span class="identifier">ID</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::embed is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_2_2">&#167;1.3.3.1.2.2</a>).</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>This method weaves an angle-bracketed paragraph macro name. <code class="display"><span class="extract">defn</span></code> is set
if and only if this is the place where the macro is defined &mdash; the usual if and only if this is the place where the macro is defined &mdash; the usual
thing is to render some sort of equals sign after it, if so. thing is to render some sort of equals sign after it, if so.
</p> </p>
@ -494,7 +518,7 @@ thing is to render some sort of equals sign after it, if so.
<p class="endnote">The function Formats::para_macro is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_9_6">&#167;1.3.3.1.9.6</a>).</p> <p class="endnote">The function Formats::para_macro is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_9_6">&#167;1.3.3.1.9.6</a>).</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>For many formats, page breaks are meaningless, and in that case this method <p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b>For many formats, page breaks are meaningless, and in that case this method
should not be provided. Inweb uses them only for cosmetic benefit (and rarely should not be provided. Inweb uses them only for cosmetic benefit (and rarely
at that), so no harm is done if there's no visual indication here. at that), so no harm is done if there's no visual indication here.
</p> </p>
@ -516,7 +540,7 @@ at that), so no harm is done if there's no visual indication here.
<p class="endnote">The function Formats::pagebreak is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_2">&#167;1.3.3.1.2</a>, <a href="3-tw.html#SP1_3_3_1_10_1">&#167;1.3.3.1.10.1</a>).</p> <p class="endnote">The function Formats::pagebreak is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_2">&#167;1.3.3.1.2</a>, <a href="3-tw.html#SP1_3_3_1_10_1">&#167;1.3.3.1.10.1</a>).</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b>"Blank line" here might better be called "vertical skip of some kind". The <p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. </b>"Blank line" here might better be called "vertical skip of some kind". The
following should render some kind of skip, and may want to take note of whether following should render some kind of skip, and may want to take note of whether
this happens in commentary or in code: the <code class="display"><span class="extract">in_comment</span></code> flag provides this this happens in commentary or in code: the <code class="display"><span class="extract">in_comment</span></code> flag provides this
information. information.
@ -540,7 +564,7 @@ information.
<p class="endnote">The function Formats::blank_line is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_8_2">&#167;1.3.3.1.8.2</a>, <a href="3-tw.html#SP1_3_3_1_9_2">&#167;1.3.3.1.9.2</a>).</p> <p class="endnote">The function Formats::blank_line is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_8_2">&#167;1.3.3.1.8.2</a>, <a href="3-tw.html#SP1_3_3_1_9_2">&#167;1.3.3.1.9.2</a>).</p>
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. </b>Another opportunity for vertical tidying-up. At the beginning of a code <p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b>Another opportunity for vertical tidying-up. At the beginning of a code
line which occurs after a run of <code class="display"><span class="extract">@d</span></code> or <code class="display"><span class="extract">@e</span></code> definitions, this method is line which occurs after a run of <code class="display"><span class="extract">@d</span></code> or <code class="display"><span class="extract">@e</span></code> definitions, this method is
called. It can then insert a little vertical gap to separate the code from called. It can then insert a little vertical gap to separate the code from
the definitions. the definitions.
@ -563,7 +587,7 @@ the definitions.
<p class="endnote">The function Formats::after_definitions is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_9">&#167;1.3.3.1.9</a>).</p> <p class="endnote">The function Formats::after_definitions is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_9">&#167;1.3.3.1.9</a>).</p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b>This method is called when the weaver changes "material" &mdash; for example, <p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b>This method is called when the weaver changes "material" &mdash; for example,
from <code class="display"><span class="extract">REGULAR_MATERIAL</span></code> to <code class="display"><span class="extract">CODE_MATERIAL</span></code>. The flag <code class="display"><span class="extract">content</span></code> is set if from <code class="display"><span class="extract">REGULAR_MATERIAL</span></code> to <code class="display"><span class="extract">CODE_MATERIAL</span></code>. The flag <code class="display"><span class="extract">content</span></code> is set if
the line on which this happens contains some content which will then be the line on which this happens contains some content which will then be
woven; it will be clear for blank lines, or lines intercepted by the woven; it will be clear for blank lines, or lines intercepted by the
@ -590,7 +614,7 @@ weaver and turned into something else (such as list items).
<p class="endnote">The function Formats::change_material is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_1">&#167;1.3.3.1.1</a>, <a href="3-tw.html#SP1_3_3_1_8_3">&#167;1.3.3.1.8.3</a>, <a href="3-tw.html#SP1_3_3_1_8_4">&#167;1.3.3.1.8.4</a>, <a href="3-tw.html#SP1_3_3_1_9_1">&#167;1.3.3.1.9.1</a>, <a href="3-tw.html#SP1_3_3_2">&#167;1.3.3.2</a>).</p> <p class="endnote">The function Formats::change_material is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_1">&#167;1.3.3.1.1</a>, <a href="3-tw.html#SP1_3_3_1_8_3">&#167;1.3.3.1.8.3</a>, <a href="3-tw.html#SP1_3_3_1_8_4">&#167;1.3.3.1.8.4</a>, <a href="3-tw.html#SP1_3_3_1_9_1">&#167;1.3.3.1.9.1</a>, <a href="3-tw.html#SP1_3_3_2">&#167;1.3.3.2</a>).</p>
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b>This is called on a change of colour. "Colour" is really a shorthand way <p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b>This is called on a change of colour. "Colour" is really a shorthand way
of saying something more like "style", but seemed less ambiguous. In HTML, of saying something more like "style", but seemed less ambiguous. In HTML,
this might trigger a change of CSS span style; in plain text, it would do this might trigger a change of CSS span style; in plain text, it would do
nothing. nothing.
@ -614,7 +638,7 @@ nothing.
<p class="endnote">The function Formats::change_colour is used in 5/tf (<a href="5-tf.html#SP8_2">&#167;8.2</a>, <a href="5-tf.html#SP15">&#167;15</a>), 5/hf (<a href="5-hf.html#SP10_3">&#167;10.3</a>).</p> <p class="endnote">The function Formats::change_colour is used in 5/tf (<a href="5-tf.html#SP8_2">&#167;8.2</a>, <a href="5-tf.html#SP15">&#167;15</a>), 5/hf (<a href="5-hf.html#SP10_3">&#167;10.3</a>).</p>
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b>The following takes text, divides it up at stroke-mark boundaries &mdash; <p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b>The following takes text, divides it up at stroke-mark boundaries &mdash;
that is, <code class="display"><span class="extract">this is inside</span></code>, this is outside &mdash; and sends contiguous pieces that is, <code class="display"><span class="extract">this is inside</span></code>, this is outside &mdash; and sends contiguous pieces
of it either to <code class="display"><span class="extract">Formats::source_fragment</span></code> or <code class="display"><span class="extract">Formats::text_fragment</span></code> of it either to <code class="display"><span class="extract">Formats::source_fragment</span></code> or <code class="display"><span class="extract">Formats::text_fragment</span></code>
as appropriate. as appropriate.
@ -633,13 +657,13 @@ as appropriate.
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">code_in_comments_notation</span><span class="plain"> =</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">code_in_comments_notation</span><span class="plain"> =</span>
<span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">,</span> <span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">comments</span><span class="plain">)?(</span><span class="identifier">I</span><span class="string">"Code In Code Comments Notation"</span><span class="plain">):(</span><span class="identifier">I</span><span class="string">"Code In Commentary Notation"</span><span class="plain">));</span> <span class="plain">(</span><span class="identifier">comments</span><span class="plain">)?(</span><span class="identifier">I</span><span class="string">"Code In Code Comments Notation"</span><span class="plain">):(</span><span class="identifier">I</span><span class="string">"Code In Commentary Notation"</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::ne</span><span class="plain">(</span><span class="identifier">code_in_comments_notation</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Off"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Split text and code extracts</span> <span class="cwebmacronumber">23.1</span>&gt;<span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::ne</span><span class="plain">(</span><span class="identifier">code_in_comments_notation</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Off"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Split text and code extracts</span> <span class="cwebmacronumber">24.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">within</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Recognose hyperlinks</span> <span class="cwebmacronumber">23.2</span>&gt;<span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">within</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Recognose hyperlinks</span> <span class="cwebmacronumber">24.2</span>&gt;<span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">xref_notation</span><span class="plain"> = </span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">,</span> <span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">xref_notation</span><span class="plain"> = </span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">,</span>
<span class="identifier">I</span><span class="string">"Cross-References Notation"</span><span class="plain">);</span> <span class="identifier">I</span><span class="string">"Cross-References Notation"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::ne</span><span class="plain">(</span><span class="identifier">xref_notation</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Off"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Recognise cross-references</span> <span class="cwebmacronumber">23.3</span>&gt;<span class="plain">;</span> <span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::ne</span><span class="plain">(</span><span class="identifier">xref_notation</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Off"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Recognise cross-references</span> <span class="cwebmacronumber">24.3</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">within</span><span class="plain">) {</span> <span class="reserved">if</span><span class="plain"> (</span><span class="identifier">within</span><span class="plain">) {</span>
<span class="functiontext">Formats::source_fragment</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">);</span> <span class="functiontext">Formats::source_fragment</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">);</span>
@ -655,10 +679,10 @@ as appropriate.
<p class="endnote">The function Formats::text_comment is used in 5/tf (<a href="5-tf.html#SP24_2">&#167;24.2</a>), 5/hf (<a href="5-hf.html#SP10">&#167;10</a>).</p> <p class="endnote">The function Formats::text_comment is used in 5/tf (<a href="5-tf.html#SP24_2">&#167;24.2</a>), 5/hf (<a href="5-hf.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Formats::text_r is used in <a href="#SP23_1">&#167;23.1</a>, <a href="#SP23_2">&#167;23.2</a>, <a href="#SP23_3_1">&#167;23.3.1</a>.</p> <p class="endnote">The function Formats::text_r is used in <a href="#SP24_1">&#167;24.1</a>, <a href="#SP24_2">&#167;24.2</a>, <a href="#SP24_3_1">&#167;24.3.1</a>.</p>
<p class="inwebparagraph"><a id="SP23_1"></a><b>&#167;23.1. </b><code class="display"> <p class="inwebparagraph"><a id="SP24_1"></a><b>&#167;24.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Split text and code extracts</span> <span class="cwebmacronumber">23.1</span>&gt; = &lt;<span class="cwebmacrodefn">Split text and code extracts</span> <span class="cwebmacronumber">24.1</span>&gt; =
</code></p> </code></p>
@ -682,10 +706,10 @@ as appropriate.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p> <p class="endnote">This code is used in <a href="#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP23_2"></a><b>&#167;23.2. </b><code class="display"> <p class="inwebparagraph"><a id="SP24_2"></a><b>&#167;24.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Recognose hyperlinks</span> <span class="cwebmacronumber">23.2</span>&gt; = &lt;<span class="cwebmacrodefn">Recognose hyperlinks</span> <span class="cwebmacronumber">24.2</span>&gt; =
</code></p> </code></p>
@ -714,10 +738,10 @@ as appropriate.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p> <p class="endnote">This code is used in <a href="#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP23_3"></a><b>&#167;23.3. </b><code class="display"> <p class="inwebparagraph"><a id="SP24_3"></a><b>&#167;24.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Recognise cross-references</span> <span class="cwebmacronumber">23.3</span>&gt; = &lt;<span class="cwebmacrodefn">Recognise cross-references</span> <span class="cwebmacronumber">24.3</span>&gt; =
</code></p> </code></p>
@ -735,7 +759,7 @@ as appropriate.
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">), </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">));</span> <span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">), </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">));</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">reference</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain"> + </span><span class="identifier">N</span><span class="plain">), </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">));</span> <span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">reference</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain"> + </span><span class="identifier">N</span><span class="plain">), </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">));</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">j</span><span class="plain"> + </span><span class="identifier">N</span><span class="plain">), </span><span class="functiontext">Str::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">));</span> <span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">j</span><span class="plain"> + </span><span class="identifier">N</span><span class="plain">), </span><span class="functiontext">Str::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">));</span>
&lt;<span class="cwebmacro">Attempt to resolve the cross-reference</span> <span class="cwebmacronumber">23.3.1</span>&gt;<span class="plain">;</span> &lt;<span class="cwebmacro">Attempt to resolve the cross-reference</span> <span class="cwebmacronumber">24.3.1</span>&gt;<span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span> <span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">reference</span><span class="plain">);</span> <span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">reference</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span> <span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
@ -749,10 +773,10 @@ as appropriate.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23">&#167;23</a>.</p> <p class="endnote">This code is used in <a href="#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP23_3_1"></a><b>&#167;23.3.1. </b><code class="display"> <p class="inwebparagraph"><a id="SP24_3_1"></a><b>&#167;24.3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Attempt to resolve the cross-reference</span> <span class="cwebmacronumber">23.3.1</span>&gt; = &lt;<span class="cwebmacrodefn">Attempt to resolve the cross-reference</span> <span class="cwebmacronumber">24.3.1</span>&gt; =
</code></p> </code></p>
@ -772,9 +796,9 @@ as appropriate.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP23_3">&#167;23.3</a>.</p> <p class="endnote">This code is used in <a href="#SP24_3">&#167;24.3</a>.</p>
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b>The following must decide what a reference like "Chapter 3" should refer <p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b>The following must decide what a reference like "Chapter 3" should refer
to: that is, whether it makes unamgiguous sense, and if so, what URL we should to: that is, whether it makes unamgiguous sense, and if so, what URL we should
link to, and what the full text of the link might be. link to, and what the full text of the link might be.
</p> </p>
@ -818,9 +842,9 @@ link to, and what the full text of the link might be.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function Formats::resolve_reference_in_weave is used in <a href="#SP23_3_1">&#167;23.3.1</a>, 5/hf (<a href="5-hf.html#SP10_2_1">&#167;10.2.1</a>).</p> <p class="endnote">The function Formats::resolve_reference_in_weave is used in <a href="#SP24_3_1">&#167;24.3.1</a>, 5/hf (<a href="5-hf.html#SP10_2_1">&#167;10.2.1</a>).</p>
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b><code class="display"><span class="extract">COMMENTARY_TEXT_FOR_MTID</span></code> straightforwardly weaves out a run of contiguous <p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b><code class="display"><span class="extract">COMMENTARY_TEXT_FOR_MTID</span></code> straightforwardly weaves out a run of contiguous
text. Ordinarily, any formulae written in TeX notation (i.e., in dollar signs text. Ordinarily, any formulae written in TeX notation (i.e., in dollar signs
used as brackets) will be transmogrified into a plain text paraphrase, but used as brackets) will be transmogrified into a plain text paraphrase, but
the <code class="display"><span class="extract">PRESERVE_MATH_MODE_FOR_MTID</span></code> can prevent this. (And of course the TeX the <code class="display"><span class="extract">PRESERVE_MATH_MODE_FOR_MTID</span></code> can prevent this. (And of course the TeX
@ -857,9 +881,9 @@ format does, because it wants to keep the formulae in all their glory.)
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function Formats::text_fragment is used in <a href="#SP23">&#167;23</a>.</p> <p class="endnote">The function Formats::text_fragment is used in <a href="#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b>The weaver has special typographical support for the stand-alone Inform <p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b>The weaver has special typographical support for the stand-alone Inform
document of Preform grammar, and this is the hook for it. Most formats document of Preform grammar, and this is the hook for it. Most formats
should ignore it. should ignore it.
</p> </p>
@ -888,7 +912,7 @@ should ignore it.
<p class="endnote">The function Formats::preform_document is used in 4/is (<a href="4-is.html#SP16">&#167;16</a>).</p> <p class="endnote">The function Formats::preform_document is used in 4/is (<a href="4-is.html#SP16">&#167;16</a>).</p>
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b>When the weaver adds one of its endnotes &mdash; "This function is used in...", <p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. </b>When the weaver adds one of its endnotes &mdash; "This function is used in...",
or some such &mdash; it calls this method twice, once before the start, with or some such &mdash; it calls this method twice, once before the start, with
<code class="display"><span class="extract">end</span></code> set to 1, and once after the end, with <code class="display"><span class="extract">end</span></code> set to 2. <code class="display"><span class="extract">end</span></code> set to 1, and once after the end, with <code class="display"><span class="extract">end</span></code> set to 2.
</p> </p>
@ -910,7 +934,7 @@ or some such &mdash; it calls this method twice, once before the start, with
<p class="endnote">The function Formats::endnote is used in 2/tgs (<a href="2-tgs.html#SP7">&#167;7</a>, <a href="2-tgs.html#SP7_1">&#167;7.1</a>), 3/tw (<a href="3-tw.html#SP2_1">&#167;2.1</a>, <a href="3-tw.html#SP2_2">&#167;2.2</a>, <a href="3-tw.html#SP2_3">&#167;2.3</a>).</p> <p class="endnote">The function Formats::endnote is used in 2/tgs (<a href="2-tgs.html#SP7">&#167;7</a>, <a href="2-tgs.html#SP7_1">&#167;7.1</a>), 3/tw (<a href="3-tw.html#SP2_1">&#167;2.1</a>, <a href="3-tw.html#SP2_2">&#167;2.2</a>, <a href="3-tw.html#SP2_3">&#167;2.3</a>).</p>
<p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. </b>"Locale" here isn't used in the Unix sense. It means text which describes <p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. </b>"Locale" here isn't used in the Unix sense. It means text which describes
a range of numbered paragraphs, from <code class="display"><span class="extract">par1</span></code> to <code class="display"><span class="extract">par2</span></code>, though <code class="display"><span class="extract">par2</span></code> can a range of numbered paragraphs, from <code class="display"><span class="extract">par1</span></code> to <code class="display"><span class="extract">par2</span></code>, though <code class="display"><span class="extract">par2</span></code> can
instead be null, in which case the description is of just one para. (This instead be null, in which case the description is of just one para. (This
is often used in endnotes.) is often used in endnotes.)
@ -934,7 +958,7 @@ is often used in endnotes.)
<p class="endnote">The function Formats::locale is used in 3/tw (<a href="3-tw.html#SP2_1">&#167;2.1</a>, <a href="3-tw.html#SP2_2_1">&#167;2.2.1</a>), 5/ptf (<a href="5-ptf.html#SP6">&#167;6</a>).</p> <p class="endnote">The function Formats::locale is used in 3/tw (<a href="3-tw.html#SP2_1">&#167;2.1</a>, <a href="3-tw.html#SP2_2_1">&#167;2.2.1</a>), 5/ptf (<a href="5-ptf.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. </b>And finally: the bottom of the woven file. The <code class="display"><span class="extract">comment</span></code> is, again, not <p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. </b>And finally: the bottom of the woven file. The <code class="display"><span class="extract">comment</span></code> is, again, not
intended for human eyes, and will be some sort of "End of weave" remark. intended for human eyes, and will be some sort of "End of weave" remark.
</p> </p>
@ -956,7 +980,7 @@ intended for human eyes, and will be some sort of "End of weave" remark.
<p class="endnote">The function Formats::tail is used in 3/tw (<a href="3-tw.html#SP1_5">&#167;1.5</a>).</p> <p class="endnote">The function Formats::tail is used in 3/tw (<a href="3-tw.html#SP1_5">&#167;1.5</a>).</p>
<p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. Post-processing. </b>Consider what happens when Inweb makes a PDF, via TeX. The initial weave is <p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. Post-processing. </b>Consider what happens when Inweb makes a PDF, via TeX. The initial weave is
to a TeX file; it's then "post-processing" which will turn this into a PDF. to a TeX file; it's then "post-processing" which will turn this into a PDF.
The following method calls allow such two-stage formats to function; in The following method calls allow such two-stage formats to function; in
this case, it would be the PDF format which provides the necessary methods this case, it would be the PDF format which provides the necessary methods
@ -979,7 +1003,7 @@ to turn TeX into PDF. The important method is this one:
<p class="endnote">The function Formats::post_process_weave is used in 3/ts (<a href="3-ts.html#SP2">&#167;2</a>).</p> <p class="endnote">The function Formats::post_process_weave is used in 3/ts (<a href="3-ts.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. </b>Optionally, a fancy report can be printed out, to describe what has been <p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. </b>Optionally, a fancy report can be printed out, to describe what has been
done: done:
</p> </p>
@ -999,7 +1023,7 @@ done:
<p class="endnote">The function Formats::report_on_post_processing is used in 3/ts (<a href="3-ts.html#SP2_3">&#167;2.3</a>).</p> <p class="endnote">The function Formats::report_on_post_processing is used in 3/ts (<a href="3-ts.html#SP2_3">&#167;2.3</a>).</p>
<p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. </b>After post-processing, an index file is sometimes needed. For example, if a <p class="inwebparagraph"><a id="SP33"></a><b>&#167;33. </b>After post-processing, an index file is sometimes needed. For example, if a
big web is woven to a swarm of PDFs, one for each section, then we also want big web is woven to a swarm of PDFs, one for each section, then we also want
to make an index page in HTML which provides annotated links to those PDFs. to make an index page in HTML which provides annotated links to those PDFs.
</p> </p>
@ -1024,7 +1048,7 @@ to make an index page in HTML which provides annotated links to those PDFs.
<p class="endnote">The function Formats::index_pdfs appears nowhere else.</p> <p class="endnote">The function Formats::index_pdfs appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP33"></a><b>&#167;33. </b>And in that index file, we may want to substitute in values for placeholder <p class="inwebparagraph"><a id="SP34"></a><b>&#167;34. </b>And in that index file, we may want to substitute in values for placeholder
text like <code class="display"><span class="extract">[[PDF Size]]</span></code> in the template file. This is the <code class="display"><span class="extract">detail</span></code>. text like <code class="display"><span class="extract">[[PDF Size]]</span></code> in the template file. This is the <code class="display"><span class="extract">detail</span></code>.
</p> </p>

View file

@ -26,7 +26,7 @@
<!--Weave of 'HTML Formats' generated by 7--> <!--Weave of 'HTML Formats' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#5">Chapter 5: Formats</a></li><li><b>HTML Formats</b></li></ul><p class="purpose">To provide for weaving into HTML and into EPUB books.</p> <ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#5">Chapter 5: Formats</a></li><li><b>HTML Formats</b></li></ul><p class="purpose">To provide for weaving into HTML and into EPUB books.</p>
<ul class="toc"><li><a href="#SP2">&#167;2. Current state</a></li><li><a href="#SP6">&#167;6. Methods</a></li><li><a href="#SP28">&#167;28. EPUB-only methods</a></li></ul><hr class="tocbar"> <ul class="toc"><li><a href="#SP2">&#167;2. Current state</a></li><li><a href="#SP6">&#167;6. Methods</a></li><li><a href="#SP29">&#167;29. EPUB-only methods</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p> <p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
@ -89,6 +89,7 @@
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">ITEM_FOR_MTID</span><span class="plain">, </span><span class="functiontext">HTMLFormat::item</span><span class="plain">);</span> <span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">ITEM_FOR_MTID</span><span class="plain">, </span><span class="functiontext">HTMLFormat::item</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">BAR_FOR_MTID</span><span class="plain">, </span><span class="functiontext">HTMLFormat::bar</span><span class="plain">);</span> <span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">BAR_FOR_MTID</span><span class="plain">, </span><span class="functiontext">HTMLFormat::bar</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">FIGURE_FOR_MTID</span><span class="plain">, </span><span class="functiontext">HTMLFormat::figure</span><span class="plain">);</span> <span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">FIGURE_FOR_MTID</span><span class="plain">, </span><span class="functiontext">HTMLFormat::figure</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">EMBED_FOR_MTID</span><span class="plain">, </span><span class="functiontext">HTMLFormat::embed</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PARA_MACRO_FOR_MTID</span><span class="plain">, </span><span class="functiontext">HTMLFormat::para_macro</span><span class="plain">);</span> <span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PARA_MACRO_FOR_MTID</span><span class="plain">, </span><span class="functiontext">HTMLFormat::para_macro</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PAGEBREAK_FOR_MTID</span><span class="plain">, </span><span class="functiontext">HTMLFormat::pagebreak</span><span class="plain">);</span> <span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PAGEBREAK_FOR_MTID</span><span class="plain">, </span><span class="functiontext">HTMLFormat::pagebreak</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">BLANK_LINE_FOR_MTID</span><span class="plain">, </span><span class="functiontext">HTMLFormat::blank_line</span><span class="plain">);</span> <span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">BLANK_LINE_FOR_MTID</span><span class="plain">, </span><span class="functiontext">HTMLFormat::blank_line</span><span class="plain">);</span>
@ -148,13 +149,13 @@ but in fact that's fine here.)
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function HTMLFormat::p is used in <a href="#SP7">&#167;7</a>, <a href="#SP9">&#167;9</a>, <a href="#SP11">&#167;11</a>, <a href="#SP13">&#167;13</a>, <a href="#SP19">&#167;19</a>, <a href="#SP20">&#167;20</a>, <a href="#SP22">&#167;22</a>, <a href="#SP23">&#167;23</a>.</p> <p class="endnote">The function HTMLFormat::p is used in <a href="#SP7">&#167;7</a>, <a href="#SP9">&#167;9</a>, <a href="#SP11">&#167;11</a>, <a href="#SP13">&#167;13</a>, <a href="#SP20">&#167;20</a>, <a href="#SP21">&#167;21</a>, <a href="#SP23">&#167;23</a>, <a href="#SP24">&#167;24</a>.</p>
<p class="endnote">The function HTMLFormat::cp is used in <a href="#SP4">&#167;4</a>, <a href="#SP7">&#167;7</a>, <a href="#SP13">&#167;13</a>, <a href="#SP22">&#167;22</a>.</p> <p class="endnote">The function HTMLFormat::cp is used in <a href="#SP4">&#167;4</a>, <a href="#SP7">&#167;7</a>, <a href="#SP13">&#167;13</a>, <a href="#SP23">&#167;23</a>.</p>
<p class="endnote">The function HTMLFormat::pre is used in <a href="#SP20">&#167;20</a>.</p> <p class="endnote">The function HTMLFormat::pre is used in <a href="#SP21">&#167;21</a>.</p>
<p class="endnote">The function HTMLFormat::cpre is used in <a href="#SP4">&#167;4</a>, <a href="#SP20">&#167;20</a>.</p> <p class="endnote">The function HTMLFormat::cpre is used in <a href="#SP4">&#167;4</a>, <a href="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Depth 1 means "inside a list entry"; depth 2, "inside an entry of a list <p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Depth 1 means "inside a list entry"; depth 2, "inside an entry of a list
which is itself inside a list entry"; and so on. which is itself inside a list entry"; and so on.
@ -203,7 +204,7 @@ which is itself inside a list entry"; and so on.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function HTMLFormat::exit_current_paragraph is used in <a href="#SP3">&#167;3</a>, <a href="#SP7">&#167;7</a>, <a href="#SP8">&#167;8</a>, <a href="#SP9">&#167;9</a>, <a href="#SP13">&#167;13</a>, <a href="#SP15">&#167;15</a>, <a href="#SP16">&#167;16</a>, <a href="#SP18">&#167;18</a>, <a href="#SP19">&#167;19</a>, <a href="#SP20">&#167;20</a>, <a href="#SP22">&#167;22</a>, <a href="#SP26">&#167;26</a>.</p> <p class="endnote">The function HTMLFormat::exit_current_paragraph is used in <a href="#SP3">&#167;3</a>, <a href="#SP7">&#167;7</a>, <a href="#SP8">&#167;8</a>, <a href="#SP9">&#167;9</a>, <a href="#SP13">&#167;13</a>, <a href="#SP15">&#167;15</a>, <a href="#SP16">&#167;16</a>, <a href="#SP17">&#167;17</a>, <a href="#SP19">&#167;19</a>, <a href="#SP20">&#167;20</a>, <a href="#SP21">&#167;21</a>, <a href="#SP23">&#167;23</a>, <a href="#SP27">&#167;27</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>"Breadcrumbs" are the chain of links in a horizontal list at the top of <p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>"Breadcrumbs" are the chain of links in a horizontal list at the top of
the page, and this drops one. the page, and this drops one.
@ -662,6 +663,54 @@ the page, and this drops one.
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b></p> <p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::embed</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">service</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ID</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">CH</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"405"</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">CW</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"720"</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">ID</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+) at (%c+) by (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">CW</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</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">CH</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2]);</span>
<span class="identifier">ID</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="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">ID</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+) at (%c+)"</span><span class="plain">)) {</span>
<span class="identifier">CH</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</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">ID</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="plain">}</span>
<span class="functiontext">HTMLFormat::exit_current_paragraph</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">embed_leaf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">embed_leaf</span><span class="plain">, </span><span class="string">"%S.html"</span><span class="plain">, </span><span class="identifier">service</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">Filenames::in_folder</span><span class="plain">(</span>
<span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">path_to_web</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Embedding"</span><span class="plain">), </span><span class="identifier">embed_leaf</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">)</span>
<span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span>
<span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">path_to_inweb</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Embedding"</span><span class="plain">), </span><span class="identifier">embed_leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">embed_leaf</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) {</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Tried %f\n"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"This is not a supported service"</span><span class="plain">, </span><span class="identifier">current_weave_line</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Content ID"</span><span class="plain">, </span><span class="identifier">ID</span><span class="plain">);</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Content Width"</span><span class="plain">, </span><span class="identifier">CW</span><span class="plain">);</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Content Height"</span><span class="plain">, </span><span class="identifier">CH</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"center"</span><span class="plain">);</span>
<span class="functiontext">Indexer::run</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">pattern</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">NULL</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"center"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLFormat::embed is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::para_macro</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::para_macro</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span>
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">defn</span><span class="plain">) {</span> <span class="reserved">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">defn</span><span class="plain">) {</span>
@ -682,7 +731,7 @@ the page, and this drops one.
<p class="endnote">The function HTMLFormat::para_macro is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p> <p class="endnote">The function HTMLFormat::para_macro is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b></p> <p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::pagebreak</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::pagebreak</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">) {</span>
@ -694,7 +743,7 @@ the page, and this drops one.
<p class="endnote">The function HTMLFormat::pagebreak is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p> <p class="endnote">The function HTMLFormat::pagebreak is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b></p> <p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::blank_line</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::blank_line</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span>
@ -714,7 +763,7 @@ the page, and this drops one.
<p class="endnote">The function HTMLFormat::blank_line is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p> <p class="endnote">The function HTMLFormat::blank_line is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. </b></p> <p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::change_material</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::change_material</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span>
@ -790,7 +839,7 @@ the page, and this drops one.
<p class="endnote">The function HTMLFormat::change_material is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p> <p class="endnote">The function HTMLFormat::change_material is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b></p> <p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::change_colour</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::change_colour</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span>
@ -818,7 +867,7 @@ the page, and this drops one.
<p class="endnote">The function HTMLFormat::change_colour is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p> <p class="endnote">The function HTMLFormat::change_colour is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b></p> <p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::endnote</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">end</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::endnote</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">end</span><span class="plain">) {</span>
@ -835,7 +884,7 @@ the page, and this drops one.
<p class="endnote">The function HTMLFormat::endnote is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p> <p class="endnote">The function HTMLFormat::endnote is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b></p> <p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::commentary_text</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::commentary_text</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span>
@ -863,7 +912,7 @@ the page, and this drops one.
<p class="endnote">The function HTMLFormat::commentary_text is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p> <p class="endnote">The function HTMLFormat::commentary_text is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b></p> <p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::locale</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::locale</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span>
@ -884,7 +933,7 @@ the page, and this drops one.
<p class="endnote">The function HTMLFormat::locale is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p> <p class="endnote">The function HTMLFormat::locale is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b></p> <p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::section_URL</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::section_URL</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
@ -922,11 +971,11 @@ the page, and this drops one.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function HTMLFormat::section_URL is used in 5/fm (<a href="5-fm.html#SP24">&#167;24</a>).</p> <p class="endnote">The function HTMLFormat::section_URL is used in 5/fm (<a href="5-fm.html#SP25">&#167;25</a>).</p>
<p class="endnote">The function HTMLFormat::xref is used in <a href="#SP8">&#167;8</a>, <a href="#SP9">&#167;9</a>, <a href="#SP24">&#167;24</a>.</p> <p class="endnote">The function HTMLFormat::xref is used in <a href="#SP8">&#167;8</a>, <a href="#SP9">&#167;9</a>, <a href="#SP25">&#167;25</a>.</p>
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b></p> <p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::tail</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::tail</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span>
@ -980,7 +1029,7 @@ the page, and this drops one.
<p class="endnote">The function HTMLFormat::tail is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p> <p class="endnote">The function HTMLFormat::tail is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b></p> <p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::sref</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span> <span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLFormat::sref</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
@ -996,9 +1045,9 @@ the page, and this drops one.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function HTMLFormat::sref is used in <a href="#SP26">&#167;26</a>.</p> <p class="endnote">The function HTMLFormat::sref is used in <a href="#SP27">&#167;27</a>.</p>
<p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. EPUB-only methods. </b></p> <p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. EPUB-only methods. </b></p>
<pre class="display"> <pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">HTMLFormat::begin_weaving_EPUB</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain">, </span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span> <span class="reserved">int</span><span class="plain"> </span><span class="functiontext">HTMLFormat::begin_weaving_EPUB</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain">, </span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span>

View file

@ -857,7 +857,7 @@ To do this, the weaver calls the following.
<p class="inwebparagraph"></p> <p class="inwebparagraph"></p>
<p class="endnote">The function TeX::remove_math_mode is used in 5/fm (<a href="5-fm.html#SP25">&#167;25</a>).</p> <p class="endnote">The function TeX::remove_math_mode is used in 5/fm (<a href="5-fm.html#SP26">&#167;26</a>).</p>
<p class="endnote">The function TeX::remove_math_mode_range is used in <a href="#SP28_1">&#167;28.1</a>, <a href="#SP28_2">&#167;28.2</a>, <a href="#SP28_3">&#167;28.3</a>.</p> <p class="endnote">The function TeX::remove_math_mode_range is used in <a href="#SP28_1">&#167;28.1</a>, <a href="#SP28_2">&#167;28.2</a>, <a href="#SP28_3">&#167;28.3</a>.</p>

View file

@ -26,7 +26,7 @@
<!--Weave of 'How to Write a Web' generated by 7--> <!--Weave of 'How to Write a Web' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#M">Manual</a></li><li><b>How to Write a Web</b></li></ul><p class="purpose">How to mark up code for literate programming.</p> <ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#M">Manual</a></li><li><b>How to Write a Web</b></li></ul><p class="purpose">How to mark up code for literate programming.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. The title of a section</a></li><li><a href="#SP2">&#167;2. Paragraphing</a></li><li><a href="#SP6">&#167;6. Conditional compilation</a></li><li><a href="#SP7">&#167;7. Commentary</a></li><li><a href="#SP12">&#167;12. Code samples and other extraneous matter</a></li><li><a href="#SP13">&#167;13. Links</a></li><li><a href="#SP14">&#167;14. Cross-references</a></li><li><a href="#SP15">&#167;15. Figures</a></li><li><a href="#SP16">&#167;16. Mathematics notation</a></li></ul><hr class="tocbar"> <ul class="toc"><li><a href="#SP1">&#167;1. The title of a section</a></li><li><a href="#SP2">&#167;2. Paragraphing</a></li><li><a href="#SP6">&#167;6. Conditional compilation</a></li><li><a href="#SP7">&#167;7. Commentary</a></li><li><a href="#SP12">&#167;12. Code samples and other extraneous matter</a></li><li><a href="#SP13">&#167;13. Links</a></li><li><a href="#SP14">&#167;14. Cross-references</a></li><li><a href="#SP15">&#167;15. Figures</a></li><li><a href="#SP16">&#167;16. Embedded video</a></li><li><a href="#SP19">&#167;19. Mathematics notation</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. The title of a section. </b>In any section file, there will be a few lines at the top which occur before <p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. The title of a section. </b>In any section file, there will be a few lines at the top which occur before
the first paragraph of code begins. (The first paragraph begins on the first the first paragraph of code begins. (The first paragraph begins on the first
@ -655,7 +655,71 @@ to be exactly that given: it is scaled accordingly. (They can't both be
constrained, so you can't change the aspect ratio.) constrained, so you can't change the aspect ratio.)
</p> </p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. Mathematics notation. </b>Mathematical formulae can be typed in TeX notation between dollar signs, <p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. Embedded video. </b>This makes sense only for some HTML-like weave formats, but we can also
cause videos to be embedded:
</p>
<pre class="display">
<span class="functiontext">= (embedded YouTube video GR3aImy7dWw)</span>
</pre>
<p class="inwebparagraph">With results like so:
</p>
<center><iframe width="720" height="405" src="https://www.youtube.com/embed/GR3aImy7dWw" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</center>
<p class="inwebparagraph">The YouTube ID number <code class="display"><span class="extract">GR3aImy7dWw</span></code> can be read from its Share URL, which in
this case was <code class="display"><span class="extract">https://youtu.be/GR3aImy7dWw</span></code>.
</p>
<p class="inwebparagraph">Similarly for Vimeo:
</p>
<pre class="display">
<span class="functiontext">= (embedded Vimeo video 204519)</span>
</pre>
<p class="inwebparagraph">With results like so:
</p>
<center><iframe src="https://player.vimeo.com/video/204519" width="720" height="405" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
</center>
<p class="inwebparagraph">For audio, you may like to try SoundCloud:
</p>
<pre class="display">
<span class="functiontext">= (embedded SoundCloud audio 42803139)</span>
</pre>
<p class="inwebparagraph">With results like so:
</p>
<center><iframe width="100%" height="405" scrolling="no" frameborder="no" allow="autoplay" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/42803139&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true"></iframe>
</center>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>Adding width and height is straightforward; by default the dimensions are
720 by 405.
</p>
<pre class="display">
<span class="functiontext">= (embedded Vimeo video 204519 at 400 by 300)</span>
<span class="functiontext">= (embedded SoundCloud audio 42803139 at 200)</span>
</pre>
<p class="inwebparagraph">The latter sets just the height (of the displayed waveform, that is &mdash;
arguably music has width and not height, but SoundCloud thinks otherwise).
</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>It's easy to add services. These are all handled by using prototype code
for a suitable HTML <code class="display"><span class="extract">&lt;iframe&gt;</span></code>, and those prototypes are stored in the
<code class="display"><span class="extract">Embedding</span></code> subdirectory of the Inweb installation. But you can use your
own prototypes instead, by creating an <code class="display"><span class="extract">Embedding</span></code> subdirectory of your own
web; this overrides the ones built in. If your service is, say, <code class="display"><span class="extract">WebTubeo</span></code>,
then the file would be <code class="display"><span class="extract">W/Embedding/WebTubeo.html</span></code>.
</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. Mathematics notation. </b>Mathematical formulae can be typed in TeX notation between dollar signs,
as usual for TeX formulae. This can of course only really be rendered if as usual for TeX formulae. This can of course only really be rendered if
the weave is to TeX, but a few very approximate attempts are made by Inweb the weave is to TeX, but a few very approximate attempts are made by Inweb
so that the HTML version may also make sense. For example, <code class="display"><span class="extract">$x \leq y$</span></code> would so that the HTML version may also make sense. For example, <code class="display"><span class="extract">$x \leq y$</span></code> would

BIN
docs/inweb/mars.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB