Commit 49da566f authored by Gérard Huet's avatar Gérard Huet

New style |> Html et Web

parent 0fb78fd9
This source diff could not be displayed because it is too large. You can view the blob instead.
No preview for this file type
......@@ -12,7 +12,6 @@
(* Generate the page displaying a view of the given corpus subdirectory.
The output channel is as always either [stdout] for CGI output or
a static HTML file (according to the "magic switch"
Web.output_channel). NB: No error handling is done by this
function. *)
[Web.output_channel]). NB: No error handling is done by this function. *)
value mk_page : string -> Web_corpus.permission -> unit
;
......@@ -76,9 +76,9 @@ value transducer = fun
| Vocc -> transducers.vocc (* consonant-initial vocatives *)
| Iiy -> transducers.iiy (* iic avyayiibhava *)
| Avy -> transducers.avya (* ifc avyayiibhava *)
| Inftu -> transducers.inftu (* infinitives in -tu *)
| Kama -> transducers.kama (* forms of kaama *)
| Sfx -> transducers.sfx (* ifc taddhita suffixes *)
| Inftu -> transducers.inftu (* infinitives in -tu iic. Renou HLS 72 *)
| Kama -> transducers.kama (* ifcs of kaama/manas: tyaktukaama dra.s.tumanas *)
| Sfx -> transducers.sfx (* ifc taddhita suffixes *)
| Isfx -> transducers.isfx (* iifc taddhita suffixes *)
| Cache -> transducers.cache (* cached forms *)
| Noun | Iic | Iik | Voca | Krid | Pvk | Vok
......
......@@ -423,14 +423,14 @@ value check_sentence translit us text_orig checkpoints sentence
] in do
{ make_visual cur_chunk.offset
; find_conflict 0
; pl html_break
; pl (html_latin16 "Sentence: ")
; ps (deva16_blue devainput) (* devanagari *)
; pl html_break
; ps (div_begin Latin16)
; pl (table_begin Spacing20)
; pl tr_begin
; ps (td_wrap (call_undo text checkpoints ^ "Undo"))
; html_break |> pl
; html_latin16 "Sentence: " |> pl
; deva16_blue devainput |> ps (* devanagari *)
; html_break |> ps
; div_begin Latin16 |> ps
; table_begin Spacing20 |> pl
; tr_begin |> pl
; td_wrap (call_undo text checkpoints ^ "Undo") |> ps
; let call_scl_parser n = (* invocation of scl parser *)
if scl_toggle then
ps (td_wrap (call_reader text cpts "o" ^ "UoH Analysis Mode"))
......@@ -438,34 +438,34 @@ value check_sentence translit us text_orig checkpoints sentence
match count with
[ Num.Int n -> if n > max_count then
(* too many solutions would choke the parsers *)
ps (td_wrap ("(" ^ string_of_int n ^ " Solutions)"))
td_wrap ("(" ^ string_of_int n ^ " Solutions)") |> ps
else if n=1 (* Unique remaining solution *) then do
{ ps (td_wrap (call_parser text cpts ^ "Unique Solution"))
; call_scl_parser 1
}
{ td_wrap (call_parser text cpts ^ "Unique Solution") |> ps
; call_scl_parser 1
}
else do
{ ps (td_wrap (call_reader text cpts "p" ^ "Filtered Solutions"))
; let info = string_of_int n ^ if flag then "" else " Partial" in
ps (td_wrap (call_reader text cpts "t" ^ "All " ^ info ^ " Solutions"))
; call_scl_parser n
}
| _ -> ps (td_wrap "(More than 2^32 Solutions!)")
{ td_wrap (call_reader text cpts "p" ^ "Filtered Solutions") |> ps
; let info = string_of_int n ^ if flag then "" else " Partial" in
td_wrap (call_reader text cpts "t" ^ "All " ^ info ^ " Solutions") |> ps
; call_scl_parser n
}
| _ -> td_wrap "(More than 2^32 Solutions!)" |> ps
]
; pl tr_end
; pl table_end
; ps div_end (* Latin16 *)
; pl html_break
; ps (div_begin Latin12)
; pl (table_begin Tcenter)
; ps tr_begin
; tr_end |> pl
; table_end |> pl
; div_end |> ps (* Latin16 *)
; html_break |> pl
; div_begin Latin12 |> ps
; table_begin Tcenter |> pl
; tr_begin |> ps
; List.iter update_col_length chunks
; if Paths.platform="Station" then print_all text checkpoints chunks 0
else List.iter print_first_server chunks
; pl tr_end
; tr_end |> pl
; print_interf text checkpoints ()
; pl table_end
; ps div_end (* Latin12 *)
; pl html_break
; table_end |> pl
; div_end |> ps (* Latin12 *)
; html_break |> pl
; reset_graph ()
; reset_visual ()
; set_cur_offset 0
......@@ -632,8 +632,8 @@ value graph_engine () = do
(* Save sentence button *)
; if corpus_permission = Web_corpus.Annotator then
(* TODO: use segment_all to compute the nb of sols instead of
passing 0 as nb_sols. *)
(* TODO: use [segment_all] to compute the nb of sols instead of
passing 0 to [nb_sols]. *)
save_button query (Num.num_of_int 0) |> pl
else
()
......
......@@ -173,7 +173,7 @@ value tags_of phase word =
as sup kridanta forms with preverbs. The preverbs are packed in pv. *)
| Tad (ph,sfx_ph) form sfx -> (* tag inherited from fake suffix entry *)
let sfx_tag = Deco.assoc sfx (morpho_tags sfx_ph) in
(* let stem_tag = Deco.assoc sfx (morpho_tags ph) in - possible extension *)
(* [let stem_tag = Deco.assoc sfx (morpho_tags ph) in] - possible extension *)
Taddhita (ph,form) [ 0 :: sfx ] sfx_ph sfx_tag (* 0 = "-" *)
| _ -> Atomic (Deco.assoc word (morpho_tags phase))
(* NB Atomic comprises tin verbal forms of roots as well as sup atomic forms
......
......@@ -48,18 +48,17 @@ value populate_corpus dirname file =
in
let rec aux i =
try
(* let line = input_line ch in *)
(* let state = *)
(* [ (Params.corpus_dir, dirname) *)
(* ; (Params.sentence_no, string_of_int i) *)
(* ; ("t", Paths.default_transliteration) *)
(* ] *)
(* in *)
failwith "TODO"
(* do *)
(* { extract_citation state (Corp.save_sentence True Web.graph_cgi) line i *)
(* ; aux (i + 1) *)
(* } *)
(* [let line = input_line ch in
let state =
[ (Params.corpus_dir, dirname)
; (Params.sentence_no, string_of_int i)
; ("t", Paths.default_transliteration)
] in] *)
failwith "TODO"
(* [do
{ extract_citation state (Corp.save_sentence True Web.graph_cgi) line i
; aux (i + 1)
}] *)
with
[ End_of_file -> () ]
in
......@@ -79,12 +78,12 @@ value populate_corpus dirname file =
(* Entry point *)
(***************)
value main =
let dirname = ref "" in
let opts =
Arg.align
[ ("-d", Arg.Set_string dirname,
" Specify the destination directory") ]
in
let dirname = ref "" in
let opts =
Arg.align
[ ("-d", Arg.Set_string dirname,
" Specify the destination directory") ]
in
let usage_msg =
Filename.basename Sys.argv.(0) ^ " -d <dest_dir> <citation_file>"
in
......
......@@ -57,7 +57,7 @@ value analysis_of_env env =
let cpts =
env
|> Cgi.decoded_get "cpts" ""
(* |> Checkpoints.parse_cpts *)
(* [|> Checkpoints.parse_cpts] *)
in
let nb_sols =
env
......
......@@ -88,7 +88,7 @@ and participle = (* participles *)
| Pfutm (* middle future participle *)
| Pfutp of kritya (* passive future/potential participle/gerundive 3 forms *)
| Action_noun (* generative only for auxiliaries, for cvi compounds *)
(*| Agent_noun, etc. -- non generative, must be lexicalized; see nominal *)
(*| [Agent_noun], etc. -- non generative, must be lexicalized; see nominal *)
]
;
(* Invariable verbal forms.
......@@ -149,7 +149,7 @@ and krit = (* coarser than Paninian krit suffixes *)
| Action_ti (* ktin \Pan{3,3,94} -ti f. *)
| Action_i (* ki \Pan{3,3,92-93} -i f. *)
| Action_root (* unknown krit of non-agent noun *)
| Object_root (* we should probably lump action and object in Non_agent *)
| Object_root (* we should probably lump action and object in [Non_agent] *)
| Object_a (* ka -a n. *)
| Instrument (* ka \Pan{3,1,136} 0/amui n. *)
| Instra (* .s.tran -tra n. -trii f. traa f. *)
......
......@@ -892,7 +892,7 @@ EXTEND Gram (* skt to nat *)
| LETTER "S" -> 148
| LETTER "H" -> 149
(* duplication with lower necessary in order to get proper sharing of prefix *)
| "\""; LETTER "m" -> 41
| "\""; LETTER "m" -> 15
| "\""; LETTER "n" -> 36
| LETTER "f" -> 36
| "\""; LETTER "s" -> 48
......
......@@ -13,7 +13,7 @@
(* Terminology. record functions will build the forms needed by Conjugation
and Stemming. After change of this file, and "make releasecgi", these tables
are updated. But the Reader/Parser needs a full pass of generation, with
"make scratch", in order to rebuild the full automata. *)
"make scratch" from Dictionary, in order to rebuild the full automata. *)
(*i module Verbs = struct i*)
......@@ -21,7 +21,7 @@ open List; (* map, length, rev *)
open Phonetics; (* [vowel, homonasal, duhify, mrijify, nahify, light, nasal,
gana, mult, aug, trunc_a, trunc_u, trunc_aa] *)
open Skt_morph;
open Inflected; (* [Conju, roots, enter1, morpho_gen, admits_aa] *)
open Inflected; (* [Conju, Invar, Inftu, roots, enter1, morpho_gen, admits_aa] *)
open Parts; (* [memo_part, record_part, cau_gana, fix, fix_augment, rfix,
compute_participles] *)
(* This module also uses modules [List2 Word Control Canon Encode Int_sandhi]
......@@ -3460,7 +3460,7 @@ value compute_perfect entry =
| "zvaa" -> let (strong, weak,_,_,_) = redup_perf "zuu" in (* \Pan{6,1,30} *)
compute_perfect_v strong weak entry (* Whitney 794b zizvaaya *)
(* Whitney 794b also jyaa pyaa vyaa hvaa; we treat vyaa above, and hvaa is huu.
Thus pyaa is covered by pii. jyaa#1 as jii gives jijyau same WR *)
Thus pyaa is covered by pii. jyaa1 as jii gives jijyau same WR *)
| "indh" -> compute_perfectm Primary (revcode "iidh") entry
| "mah" -> let (strong, weak, _, _, _) = redup_perf entry in
compute_perfectm Primary strong entry (* ZZ Atma for Para root *)
......@@ -4303,6 +4303,10 @@ value build_infinitive c inf_stem root = do
bhaavitum have to be entered as supplements; see Witney§1051c. *)
{ enter1 root (Invar (c,Infi) (fix inf_stem "tum"))
; enter1 root (Inftu c (fix inf_stem "tu")) (* Xtu-kaama compounds *)
(* NB. bahuv cpds in -kaama and -manas constructed with infinitives in -tu
See Renou HLS p72 from Patanjali; also Assimil p194 eg tyaktukaama
anu.s.thaatukaama "desirious to proceed" vaktukaama "who wants to speak"
dra.s.tumanas "inclined to see" *)
}
;
value perif conj perstem entry = do
......
......@@ -8,4 +8,4 @@
(**************************************************************************)
(* Generated by make version - see main Makefile *)
value version="3.02" and version_date="2017-10-05";
value version="3.02" and version_date="2017-10-13";
......@@ -349,8 +349,8 @@ value ps s = output_string output_channel.val s
and pc c = output_char output_channel.val c
and pi i = output_string output_channel.val (string_of_int i)
;
value line () = pc '\n'
and sp () = ps " "
value line () = pc '\n'
and sp () = ps " "
and pl s = ps (s ^ "\n")
;
value meta_program l = List.iter pl (List.map meta_prefix l)
......@@ -393,17 +393,17 @@ value favicon dyn =
"<link rel=\"shortcut icon\" href=\"" ^ path ^ "\">"
;
value page_begin_dyn dyn title = do
{ pl doctype
; ps (xml_begin_with_att "html" [])
; pl (xml_begin "head") (* ( *)
; meta_program contents_instructions (* . *)
; pl title (* . *)
; meta_program title_instructions (* . *)
; pl (css_link dyn) (* . *)
; pl (favicon dyn) (* . *)
; pl (deva_read_script dyn) (* devanagari input *)(* . *)
; pl (js_util_script dyn)
; pl (xml_end "head") (* ) *)
{ doctype |> pl
; xml_begin_with_att "html" [] |> ps
; xml_begin "head" |> pl (* ( *)
; meta_program contents_instructions (* . *)
; title |> pl (* . *)
; meta_program title_instructions (* . *)
; css_link dyn |> pl (* . *)
; favicon dyn |> pl (* . *)
; deva_read_script dyn |> pl (* devanagari input *)(* . *)
; js_util_script dyn |> pl (* . *)
; xml_end "head" |> pl (* ) *)
}
;
value open_html_file f title = do (* for building the Web services pages *)
......@@ -421,31 +421,31 @@ value version lang =
h3_begin B3 ^ Date.version ^ lang_str ^ h3_end
;
value print_title lang title = do
{ pl (table_begin Centered)
; ps tr_begin
; ps th_begin
; pl title
; pl (version lang)
; ps th_end
; ps tr_end
; pl table_end
{ table_begin Centered |> pl
; tr_begin |> ps
; th_begin |> ps
; title |> pl
; version lang |> pl
; th_end |> ps
; tr_end |> ps
; table_end |> pl
}
and print_title_solid color lang title = do
{ pl (table_begin (centered color))
; ps tr_begin
; ps th_begin
; pl title
; pl (version lang)
; ps th_end
; ps tr_end
; pl table_end
{ table_begin (centered color) |> pl
; tr_begin |> ps
; th_begin |> ps
; title |> pl
; version lang |> pl
; th_end |> ps
; tr_end |> ps
; table_end |> pl
}
;
value print_transliteration_help lang =
if narrow_screen then ()
else do
{ ps "Transliteration help "
; pl (anchor_ref (rel_faq_page_url lang ^ "#transliteration") "here")
{ "Transliteration help " |> ps
; anchor_ref (rel_faq_page_url lang ^ "#transliteration") "here" |> pl
}
;
value transliteration_switch_default dft id =
......@@ -459,59 +459,59 @@ value transliteration_switch_default dft id =
]
;
value print_transliteration_switch id =
ps (transliteration_switch_default Paths.default_transliteration id)
transliteration_switch_default Paths.default_transliteration id |> pl
;
value print_lexicon_select lexicon = do
{ ps "Lexicon Access "
; pl (option_select_default "lex"
{ "Lexicon Access " |> ps
; option_select_default "lex"
[ (" Heritage ","SH","SH"=lexicon) (* Sanskrit Heritage *)
; (" Monier-Williams ","MW","MW"=lexicon) (* Monier-Williams *)
])
] |> pl
}
;
value print_index_help lang =
if narrow_screen then () else do
{ pl (par_begin G2)
; pl html_break
; ps "Search for an entry matching an initial pattern:"
; pl html_break
{ par_begin G2 |> pl
; html_break |> pl
; "Search for an entry matching an initial pattern:" |> ps
; html_break |> pl
; print_transliteration_help lang
; pl par_end (* G2 *)
; par_end |> pl (* G2 *)
}
;
value print_dummy_help_en () =
if narrow_screen then () else do
{ pl (par_begin G2)
; ps "The simplified interface below allows search without diacritics"
; pl html_break
; pl "Proper names may be entered with an initial capital"
; pl par_end (* G2 *)
{ par_begin G2 |> pl
; "The simplified interface below allows search without diacritics" |> ps
; html_break |> pl
; "Proper names may be entered with an initial capital" |> pl
; par_end |> pl (* G2 *)
}
;
value print_stemmer_help_en () =
if narrow_screen then () else do
{ ps (par_begin G2)
; pl "Submit candidate form and category"
; pl html_break
; pl "Forms ended in r should not be entered with final visarga"
; pl html_break
; pl "Compound words may be recognized with the Reader interface"
; pl html_break
; pl par_end (* G2 *)
{ par_begin G2 |> ps
; "Submit candidate form and category" |> pl
; html_break |> pl
; "Forms ended in r should not be entered with final visarga" |> pl
; html_break |> pl
; "Compound words may be recognized with the Reader interface" |> pl
; html_break |> pl
; par_end |> pl (* G2 *)
}
;
value open_page_with_margin width =
let margin = string_of_int width ^ "pt" in
let attr = [ noborder; nopadding; ("cellspacing",margin); fullwidth ] in do
{ pl (table_begin_style (background Chamois) attr)
; ps tr_begin (* closed by [close_page_with_margin] *)
; pl td_begin
{ table_begin_style (background Chamois) attr |> pl
; tr_begin |> ps (* closed by [close_page_with_margin] *)
; td_begin |> pl
}
and close_page_with_margin () = do
{ pl html_break
; ps td_end
; ps tr_end
; pl table_end
{ html_break |> pl
; td_end |> ps
; tr_end |> ps
; table_end |> pl
}
;
value indexer_page l = dico_page (dico_index_page l) (* [mk_index_page] *)
......@@ -523,85 +523,86 @@ and corpus_page l = dico_page (dico_corpus_page l) (* [mk_corpus_page] *)
value print_site_map dyn lang = (* the various Web services of the site *)
if dyn then do
{ ps (anchor_ref (sanskrit_page_url lang) (emph "Top")); pl " | "
; ps (anchor_ref (indexer_page_url lang) (emph "Index")); pl " | "
; ps (anchor_ref (indexer_page_url lang ^ "#stemmer") (emph "Stemmer")); pl " | "
; ps (anchor_ref (grammar_page_url lang) (emph "Grammar")); pl " | "
; ps (anchor_ref (sandhi_page_url lang) (emph "Sandhi")); pl " | "
; ps (anchor_ref (reader_page_url lang) (emph "Reader")); pl " | "
; ps (anchor_ref (corpus_page_url lang) (emph "Corpus")); pl " | "
; ps (anchor_ref (faq_page_url lang) (emph "Help")); pl " | "
; pl (anchor_ref (portal_page_url lang) (emph "Portal"))
{ anchor_ref (sanskrit_page_url lang) (emph "Top") |> ps; " | " |> pl
; anchor_ref (indexer_page_url lang) (emph "Index") |> ps; " | " |> pl
; anchor_ref (indexer_page_url lang ^ "#stemmer") (emph "Stemmer") |> ps; " | " |> pl
; anchor_ref (grammar_page_url lang) (emph "Grammar") |> ps; " | " |> pl
; anchor_ref (sandhi_page_url lang) (emph "Sandhi") |> ps; " | " |> pl
; anchor_ref (reader_page_url lang) (emph "Reader") |> ps; " | " |> pl
; anchor_ref (corpus_page_url lang) (emph "Corpus") |> ps; " | " |> pl
; anchor_ref (faq_page_url lang) (emph "Help") |> ps; " | " |> pl
; anchor_ref (portal_page_url lang) (emph "Portal") |> pl
}
else do
{ ps (anchor_ref (rel_sanskrit_page_url lang) (emph "Top")); pl " | "
; ps (anchor_ref (dico_index_page lang) (emph "Index")); pl " | "
; ps (anchor_ref (dico_index_page lang ^ "#stemmer") (emph "Stemmer")); pl " | "
; ps (anchor_ref (dico_grammar_page lang) (emph "Grammar")); pl " | "
; ps (anchor_ref (dico_sandhi_page lang) (emph "Sandhi")); pl " | "
; ps (anchor_ref (dico_reader_page lang) (emph "Reader")); pl " | "
; ps (anchor_ref (dico_corpus_page lang) (emph "Corpus")); pl " | "
; ps (anchor_ref (rel_faq_page_url lang) (emph "Help")); pl " | "
; pl (anchor_ref (rel_portal_page_url lang) (emph "Portal"))
{ anchor_ref (rel_sanskrit_page_url lang) (emph "Top") |> ps; " | " |> pl
; anchor_ref (dico_index_page lang) (emph "Index") |> ps; " | " |> pl
; anchor_ref (dico_index_page lang ^ "#stemmer") (emph "Stemmer") |> ps; " | " |> pl
; anchor_ref (dico_grammar_page lang) (emph "Grammar") |> ps; " | " |> pl
; anchor_ref (dico_sandhi_page lang) (emph "Sandhi") |> ps; " | " |> pl
; anchor_ref (dico_reader_page lang) (emph "Reader") |> ps; " | " |> pl
; anchor_ref (dico_corpus_page lang) (emph "Corpus") |> ps; " | " |> pl
; anchor_ref (rel_faq_page_url lang) (emph "Help") |> ps; " | " |> pl
; anchor_ref (rel_portal_page_url lang) (emph "Portal") |> pl
}
;
value pad () = do (* ad-hoc vertical padding to make room for the bandeau *)
{ pl (table_begin Pad60)
; ps tr_begin
; ps (xml_begin "td" ^ xml_end "td")
; ps tr_end
; pl table_end
{ table_begin Pad60 |> pl
; tr_begin |> ps
; td_begin |> ps
; td_end |> ps
; tr_end |> ps
; table_end |> pl
}
;
value print_bandeau_enpied_dyn dyn lang color = do
{ pad () (* necessary padding to avoid hiding by bandeau *)
; pl (elt_begin "div" Enpied)
; ps (table_begin Bandeau)
; ps tr_begin (* main row begin *)
; pl td_begin
; pl (caml_inside dyn)
; ps td_end
; pl td_begin
; pl (table_begin Tcenter)
; ps tr_begin
; pl td_begin
; elt_begin "div" Enpied |> pl
; table_begin Bandeau |> ps
; tr_begin |> ps (* main row begin *)
; td_begin |> pl
; caml_inside dyn |> pl
; td_end |> ps
; td_begin |> pl
; table_begin Tcenter |> pl
; tr_begin |> ps
; td_begin |> pl
; print_site_map dyn lang
; ps td_end
; ps tr_end
; ps tr_begin
; pl td_begin
; ps copyright
; ps td_end
; ps tr_end (* copyright row end *)
; ps table_end
; ps td_end
; pl td_begin
; pl (inria_inside dyn)
; ps html_break
; ps td_end
; ps tr_end
; ps table_end (* Bandeau *)
; pl (xml_end "div") (* end Enpied *)
; td_end |> ps
; tr_end |> ps
; tr_begin |> ps
; td_begin |> pl
; copyright |> ps
; td_end |> ps
; tr_end |> ps (* copyright row end *)
; table_end |> ps
; td_end |> ps
; td_begin |> pl
; inria_inside dyn |> pl
; html_break |> ps
; td_end |> ps
; tr_end |> ps
; table_end |> ps (* Bandeau *)
; xml_end "div" |> pl (* end Enpied *)
}
;
(* Simputer - legacy code - could be reused for smartphones *)
value print_bandeau_entete color =
let margin_bottom height = "margin-bottom:" ^ points height in
let interval height = do
{ ps tr_begin
; pl (td [ ("width","100%"); ("style",margin_bottom height) ])
; ps tr_end
{ tr_begin |> ps
; td [ ("width","100%"); ("style",margin_bottom height) ] |> pl
; tr_end |> ps
} in do
{ pl (table_begin_style (background color)
[ noborder; nopadding; ("cellspacing","5pt"); fullwidth ])
{ table_begin_style (background color)
[ noborder; nopadding; ("cellspacing","5pt"); fullwidth ] |> pl
; interval 10
; ps tr_begin
; pl (xml_begin_with_att "td" [ fullwidth; ("align","center") ])
; tr_begin |> ps
; xml_begin_with_att "td" [ fullwidth; ("align","center") ] |> pl
; print_site_map True Html.English
; ps td_end
; ps tr_end
; td_end |> ps
; tr_end |> ps
; interval 10
; pl table_end
; table_end |> pl
}
;
value page_end_dyn dyn lang bandeau = do
......@@ -610,8 +611,8 @@ value page_end_dyn dyn lang bandeau = do
| Html.Computer | Html.Station | Html.Server
-> if bandeau then print_bandeau_enpied_dyn dyn lang Cyan else ()
]
; pl body_end
; pl (xml_end "html")
; body_end |> pl
; xml_end "html" |> pl
}
;
value page_end = page_end_dyn True
......@@ -626,7 +627,7 @@ value http_header = "Content-Type: text/html\n"
(* Print the HTTP header only when it is required, i.e. only if it is
a CGI output. *)
value maybe_http_header () =
if output_channel.val = stdout then pl http_header else ()
if output_channel.val = stdout then http_header |> pl else ()
;
value javascript_tooltip ="wz_tooltip.js"
;
......@@ -660,13 +661,13 @@ value interaction_modes =
(* NB Interface and Parser have their own prelude. *)
(* [reader_prelude] is invoked by Parser through Rank and by [Mk_reader_page] *)
value reader_prelude title = do
{ pl http_header