src/Pure/Thy/to_html.ML
changeset 1291 e173be970d27
parent 1290 ee8f41456d28
child 1292 f55472745044
--- a/src/Pure/Thy/to_html.ML	Tue Oct 24 13:41:06 1995 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,273 +0,0 @@
-(*  ID:         $Id$
-    Author:	Mateja Jamnik, University of Cambridge
-    Copyright   1995  University of Cambridge
-
-   Convert the Isabelle theory files to .html format for hypertext browsing
-*)
-
-val htmlpath = "/homes/lcp/html_isa/";
-
-(* --------------------
-   Exception declaration in case that there is a lexical
-   error occurs.
-   -------------------- *)
-
-exception lex_err;
-
-(* --------------------
-   Get the list of all the theory files and the
-   path to access them in their directories
-   -------------------- *)
-
-print_depth 1000;
-val theory_list = !loaded_thys;
-val files = Symtab.alist_of (theory_list);
-
-(* --------------------
-   The function move_eachf is going to move all the theory
-   files in isabelle to their html format. It takes 
-   for arguments the name of the theory (tname) and
-   other theory information such as path (path), theorems (thms)
-   proved, ... It is the main driver of the program, and basically
-   contains all other functions. It contains the following
-   subfunctions:
-     - create_pure
-     - gettext
-     - move_onef
-     - transform
-   -------------------- *)
-
-fun move_eachf (tname, ThyInfo{path,thms,...}) =
-    let val intext = path^tname^".thy";
-	val outtext = htmlpath^tname^".html";
-	    
-(* --------------------
-   The function gettext takes an instrem from the auxilliary 
-   file .thy whose name and path are specified in the existent
-   Isabelle structure, treats the inputted string with all the
-   necessary modifications for html format and puts it into the
-   file with the same name but .html extension. The subfunctions
-   it contains are:
-      - after_first_c
-      - filter
-      - first_comment
-      - format_link
-      - getstring
-      - get_word
-      - he
-      - html
-      - html_escape
-      - insert_link
-      - leading_comment
-      - lc_exists
-      - modify_body
-      - remove_lc
-      - rest
-      - thy_name
-   -------------------- *)
-
-	fun gettext is  =
-	    let 
-		val head = "<HTML>\n<HEAD>\n<TITLE>"^intext^
-		    "</TITLE>\n</HEAD>\n\n"^"<BODY>\n";
-		val title = "<H1>"^tname^".thy"^"</H1></P>\n\n"^
-		    "<BR>\n<A HREF = \""^htmlpath^
-		    "00-chart.html\">Dependency Chart</A>\n"^
-		    ": display of dependencies between the theories.\n"^
-		    "<BR>\n<HR>\n\n<PRE>\n";
-		val tail = "</PRE>"^"</BODY>\n"^"</HTML>";
-		
-
-	     (* --------------------
-		The function he (html escape) is going to take
-		every single characterof the input stream and check
-		for ">", "<" and "&" characters that have a special
-		meaning in html and convert them into their corresponding
-		escape sequences.   
-		-------------------- *)
-		fun he [] r = r
-		  | he ("<"::sl) r = he sl (r@["&","l","t"])
-		  | he (">"::sl) r = he sl (r@["&","g","t"])
-		  | he ("&"::sl) r = he sl (r@["&","a","m","p"])
-		  | he (c::sl) r = he sl (r@[c]);
-
-		fun html_escape sl = he sl [];
-
-	     (* --------------------
-		The function first_comment is a pattern checking for
-		nested comments. The argument d will keep track of how
-		deep we are in the nested comment. The function will
-		return the first comment extracted from the input stream,
-		so that we can copy it into the output stream. Lexical
-		error is raised if we open an empty file to read from.
-		-------------------- *)
-		fun first_comment ("*"::")"::cs) co 1 = co@["*",")"]
-		  | first_comment ("*"::")"::cs) co d =
-		    first_comment cs (co@["*",")"]) (d-1)
-		  | first_comment ("("::"*"::cs) co d =
-		    first_comment cs (co@["(","*"]) (d+1)
-		  | first_comment (c::cs) co d =
-		    if d>0 then first_comment cs (co@[c]) d
-		    else first_comment cs co d
-		  | first_comment [] _ _ = raise lex_err;
-		    
-	     (* --------------------
-	        The function lc_exists leading comment exists?)
-		checks whether in the input file at the very beginning
-		there is a comment, which needs to be extracted and put
-		into the output file. We also need to check whether there
-		might be a space, a new line or a tab, which do not
-		exclude the possibility that there is a leading comment.
-		The function returns a boolean value. 
-		-------------------- *)
-		fun lc_exists ("("::"*"::_) = true
-		  | lc_exists (" "::cs) = lc_exists cs
-		  | lc_exists ("\n"::cs) = lc_exists cs
-		  | lc_exists ("\t"::cs) = lc_exists cs
-		  | lc_exists _ = false;
-		    
-	     (* --------------------
-	        In the case that there is a leading comment, this
-		function leading_comment extracts it> It also need
-		to check for any html escape sequences in the comment.
-		-------------------- *)
-		fun leading_comment sl =
-		    if (lc_exists sl) then
-			(html_escape (first_comment sl [] 0))
-		    else
-			[""];
-			
-	     (* --------------------
-	        The function thy_name checks for the parent theory
-		names apearing after the leading comment. The function
-		returns a boolean value indicating if the word is a
-		theory name, so that a link can be inserted and can look
-		for another potential theory name. If the word is not a
-		theory name then continue to modify the rest of the body.
-		-------------------- *)
-		fun thy_name word = 
-		    is_some (Symtab.lookup (theory_list, word));
-		    
-	     (* --------------------
-	        Creates the right html format when inserting the link.
-		-------------------- *)
-		fun format_link s = 
-		    let in
-			output(std_out,"\n"^s);
-			"<A HREF = \""^htmlpath^s^".html\">"^s^"</A>"
-		    end;
-
-	     (* --------------------
-		-------------------- *)
-
-		fun insert_link w = (explode (format_link (implode w)))
-	     (* --------------------
-		-------------------- *)
-
-		fun html ( " "::l) r = html l (r@[ " "])
-		  | html ( "+"::l) r = html l (r@[ "+"])
-		  | html ("\n"::l) r = html l (r@["\n"])
-		  | html ("\t"::l) r = html l (r@["\t"])
-		  | html l r = r@(get_word l [])
-	     (* --------------------
-		-------------------- *)
-		and get_word ( " "::l) w = 
-		    if (thy_name (implode w)) 
-			then (insert_link w)@[ " "]@(html l [])
-		    else w@[" "]@(html_escape l)
-		  | get_word ( "+"::l) w = 
-		    if (thy_name (implode w))
-			then (insert_link w)@[ "+"]@(html l [])
-		    else w@["+"]@(html_escape l)
-		  | get_word ("\n"::l) w = 
-		    if (thy_name (implode w))
-			then (insert_link w)@[ "\n"]@(html l [])
-		    else w@["\n"]@(html_escape l)
-		  | get_word ("\t"::l) w = 
-		    if (thy_name (implode w))
-			then (insert_link w)@[ "\t"]@(html l [])
-		    else w@["\t"]@(html_escape l)
-		  | get_word (c::l) w = (get_word l (w@[c]))
-		  | get_word [] [] = []
-		  | get_word [] w = 
-		    if (thy_name (implode w))
-			then (insert_link w)
-		    else w;
-			
-	     (* --------------------
-		-------------------- *)
-		fun modify_body ("="::l) r = r@["="]@(html l [])
-		  | modify_body (c::l) r = modify_body l (r@[c])
-		  | modify_body [] r = r;
-		    
-	     (* --------------------
-		-------------------- *)
-		fun after_first_c ("*"::")"::cs) 1 = cs
-		  | after_first_c ("*"::")"::cs) d = after_first_c cs (d-1)
-		  | after_first_c ("("::"*"::cs) d = after_first_c cs (d+1)
-		  | after_first_c (c::cs) d = after_first_c cs d
-		  | after_first_c cs 0 = cs
-		  | after_first_c [] _ = raise lex_err;
-		    
-	     (* --------------------
-		-------------------- *)
-		fun remove_lc sl =
-		    if (lc_exists sl) then (after_first_c sl 0) else sl;
-			
-	     (* --------------------
-		-------------------- *)
-		fun rest sl = modify_body (remove_lc sl) [];
-		    
-	     (* --------------------
-		-------------------- *)
-		fun filter sl = (leading_comment sl) @ (rest sl);
-		    
-	     (* --------------------
-		-------------------- *)
-		fun getstring s =
-		    case input (is, 1) of
-			"" => head^title^(implode(filter(explode(s))))^tail
-		      | "\n" => getstring (s^"\n")
-		      | c  => getstring (s^c)
-	    in
-		getstring ""
-	    end;
-
-     (* --------------------
-      	-------------------- *)
-	fun transform t =
-	    let
-		val infile = open_in intext;
-		val outfile = open_out outtext
-	    in
-		output(std_out,"\nTheory: "^t);
-		output (outfile, gettext(infile));
-		close_in (infile);
-		close_out (outfile)
-	    end;
-
-     (* --------------------
-      	-------------------- *)
-	fun create_pure p =
-	    let
-		val outfile = open_out outtext
-	    in
-		output(std_out, "\nCreating Pure.html ...");
-		output (outfile, "<HTML>\n<HEAD>\n<TITLE>"^intext^
-			"</TITLE>\n</HEAD>\n\n"^"<BODY>\n"^
-			"<H1>"^tname^".thy"^"</H1></P>\n\n"^"<PRE>\n"^
-			"This is a theory file called Pure.\n"^
-			"Its children are all other Isabelle theories."^
-			"</PRE>"^"</BODY>\n"^"</HTML>");
-		close_out (outfile)
-	    end
-	
-    in
-	if (tname <> "Pure") then (transform tname)
-	else (create_pure tname)
-    end;
-
-(* --------------------
-   -------------------- *)
-map move_eachf (files);
-