| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 | 
							- var docFrame;
 
- var logtextbox;
 
- var destFile;
 
- var embedFonts = false;
 
- var finalMathJaxURL = null;
 
- function log(text)
 
- {
 
- 	logtextbox.setAttribute("value", logtextbox.getAttribute("value") + "\n" + text);
 
- }
 
- function init()
 
- {
 
- 	try {
 
- 		docFrame = document.getElementById("docFrame");
 
- 		logtextbox = document.getElementById("logtextbox");
 
- 		// parse command line arguments
 
- 		var cmdLine = window.arguments[0];
 
- 		cmdLine = cmdLine.QueryInterface(Components.interfaces.nsICommandLine);
 
- 		
 
- 		embedFonts = cmdLine.handleFlag("embed-fonts", false);
 
- 		finalMathJaxURL = cmdLine.handleFlagWithParam("final-mathjax-url", false);
 
- 		
 
- 		if (!embedFonts && !finalMathJaxURL) {
 
- 			alert("You must eiher specify --embed-fonts or --final-mathjax-url");
 
- 			window.close();
 
- 			return;
 
- 		}
 
- 		
 
- 		sourceFilePath = cmdLine.getArgument(0);
 
- 		destFilePath = cmdLine.getArgument(1);
 
- 		if ( !sourceFilePath || !destFilePath ) {
 
- 			alert("Not enough parameters, expecting two arguments:\nInput file, output file");
 
- 			window.close();
 
- 			return;
 
- 		}
 
- 		
 
- 		sourceFile = cmdLine.resolveFile(sourceFilePath);
 
- 		if (! (sourceFile.exists() && sourceFile.isFile()) ) {
 
- 			alert("Invalid source file path.");
 
- 			window.close();
 
- 			return;
 
- 		}
 
- 		sourceURI = cmdLine.resolveURI(sourceFilePath);
 
- 		
 
- 		// create a nsIFile object for the output file
 
- 		try{
 
- 			destFile = cmdLine.resolveURI(destFilePath).QueryInterface(Components.interfaces.nsIFileURL).file;
 
- 		}catch(e){
 
- 			alert("Invalid destination file.\n\nException:\n" + e);
 
- 			window.close();
 
- 			return;
 
- 		}
 
- 		
 
- 		// add iframeLoaded() as an onload event handler, then navigate to the source file
 
- 		docFrame.addEventListener("DOMContentLoaded", iframeLoaded, true);
 
- 		docFrame.setAttribute("src", sourceURI.spec);
 
- 	} catch (e) {
 
- 		alert("Error in init():\n\n" + e);
 
- 		window.close();
 
- 		return;
 
- 	}
 
- }
 
- function iframeLoaded()
 
- {
 
- 	/*
 
- 	// print every MathJax signal to the log
 
- 	docFrame.contentWindow.MathJax.Hub.Startup.signal.Interest(
 
- 	function (message) {log("Startup: "+message)}
 
- 	);
 
- 	docFrame.contentWindow.MathJax.Hub.signal.Interest(
 
- 	function (message) {log("Hub: "+message)}
 
- 	);
 
- 	*/
 
- 	// tell MathJax to call serialize() when finished
 
- 	docFrame.contentWindow.MathJax.Hub.Register.StartupHook("End", function() {serialize();});
 
- }
 
- function fileURLtoDataURI(url)
 
- {
 
- 	var ios = Components.classes["@mozilla.org/network/io-service;1"]
 
- 		.getService(Components.interfaces.nsIIOService);
 
- 	var url_object = ios.newURI(url, "", null);
 
- 	var file = url_object.QueryInterface(Components.interfaces.nsIFileURL).file;
 
- 								
 
- 	var data = "";  
 
- 	var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"].  
 
- 		createInstance(Components.interfaces.nsIFileInputStream);
 
- 	fstream.init(file, -1, -1, false);
 
- 	var bstream = Components.classes["@mozilla.org/binaryinputstream;1"].  
 
- 		createInstance(Components.interfaces.nsIBinaryInputStream);  
 
- 	bstream.setInputStream(fstream);  
 
- 				
 
- 	var bytes = bstream.readBytes(bstream.available());
 
- 	b64bytes = btoa(bytes);
 
- 	return "data:;base64," + b64bytes;
 
- }
 
- function serialize()
 
- {
 
- 	var MathJaxURL = docFrame.contentWindow.MathJax.Hub.config.root;
 
- 	var searchURIList = new Array();
 
- 	var replacementURIList = new Array();
 
- 	
 
- 	log("serialize: preprocessing");
 
- 	// remove the MathJax status message window
 
- 	msgdiv = docFrame.contentDocument.getElementById("MathJax_Message");
 
- 	msgdiv.parentNode.removeChild(msgdiv);
 
- 	
 
- 	/* Loop through all CSS rules to find all @font-face rules.
 
- 	   At this point, they refer to local absolute paths using file:// URLs.
 
- 	   Replace them either with appropriate URLs relative to finalMathJaxURL
 
- 	   or with data URIs. */
 
- 	
 
- 	for (var i = 0; i<docFrame.contentDocument.styleSheets.length; i++) {
 
- 		var stylesheet = docFrame.contentDocument.styleSheets[i];
 
- 		
 
- 		for (var j=0; j< stylesheet.cssRules.length; j++) {
 
- 			var rule = stylesheet.cssRules[j];
 
- 			if (rule.cssText.match("font-face")) {
 
- 				url = rule.style.getPropertyValue("src");
 
- 				url = url.match(/url\(\"(.+)\"\)/)[1];
 
- 				
 
- 				// Since the properties seem read-only here, we populate
 
- 				// searchURIList and replacementURIList to do text substitution
 
- 				// after serialization
 
- 				searchURIList.push(url);
 
- 				if (embedFonts) {
 
- 					replacementURIList.push(fileURLtoDataURI(url));
 
- 				} else {
 
- 					replacementURIList.push(url.replace(MathJaxURL, finalMathJaxURL));
 
- 				}				
 
- 			}
 
- 		}
 
- 	}
 
- 	// find and remove the MathJax <script> tag
 
- 	try{
 
- 		var scriptTags = docFrame.contentDocument.getElementsByTagName("script");
 
- 		for (var i=0; i<scriptTags.length; i++) {
 
- 			if (scriptTags[i].getAttribute("src") && scriptTags[i].getAttribute("src").match(/MathJax.js/i))
 
- 				scriptTags[i].parentNode.removeChild(scriptTags[i]);
 
- 		}
 
- 	}catch(e){alert(e);}
 
- 	log("serialize: serializing");
 
- 	var serializer = new XMLSerializer();
 
- 	var xhtml = serializer.serializeToString(docFrame.contentDocument);
 
- 	
 
- 	log("serialize: postprocessing");
 
- 	// make the MathJax URL relative again
 
- 	//	xhtml = xhtml.replace(findMathJaxURL, "MathJax");
 
- 	
 
- 	try{
 
- 		r1 = RegExp("<!--/\\*--><!\\[CDATA\\[/\\*><!--\\*/", "g");
 
- 		xhtml = xhtml.replace(r1, "");
 
- 		r2 = RegExp("/\\*\\]\\]>\\*/-->", "g");
 
- 		xhtml = xhtml.replace(r2, "");
 
- 		r3 = RegExp("/\\*\\]\\]>\\*///-->", "g");
 
- 		xhtml = xhtml.replace(r3, "");
 
- 	}catch(e){alert(e);}
 
- 	for (var i=0; i<searchURIList.length; i++)
 
- 		xhtml = xhtml.replace(searchURIList[i], replacementURIList[i]);
 
- 	
 
- 	save(xhtml);
 
- 	window.close();
 
- }
 
- function save(xhtml)
 
- {
 
- 	try {
 
- 		var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].
 
- 			createInstance(Components.interfaces.nsIFileOutputStream);
 
- 		foStream.init(destFile, 0x02 | 0x08 | 0x20, 0666, 0); 
 
- 		// write, create, truncate
 
- 		// write in UTF-8 encoding
 
- 		var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].
 
- 			createInstance(Components.interfaces.nsIConverterOutputStream);
 
- 		converter.init(foStream, "UTF-8", 0, 0);
 
- 		converter.writeString(xhtml);
 
- 		converter.close(); // this closes foStream
 
- 	} catch (e) {
 
- 		alert("Error in save():\n\n" + e);
 
- 	}
 
- }
 
 
  |