add lisp packages
This commit is contained in:
1
lisp/org/contrib/scripts/staticmathjax/.gitignore
vendored
Normal file
1
lisp/org/contrib/scripts/staticmathjax/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
*~
|
||||
79
lisp/org/contrib/scripts/staticmathjax/README.org
Normal file
79
lisp/org/contrib/scripts/staticmathjax/README.org
Normal file
@@ -0,0 +1,79 @@
|
||||
Static MathJax v0.1 README
|
||||
#+AUTHOR: Jan Böcker <jan.boecker@jboecker.de>
|
||||
|
||||
Static MathJax is a XULRunner application which loads a HTML input
|
||||
file that uses MathJax into a browser, waits until MathJax is done
|
||||
processing, and then writes the formatted result to an output HTML
|
||||
file.
|
||||
|
||||
I have only tested exports from Emacs Org-mode as input files. (As of
|
||||
2010-08-14, MathJax is used by default with HTML exports in the
|
||||
current Org development version.)
|
||||
|
||||
Optionally, references to the math fonts used will be converted to
|
||||
"data:" URIs, thus embedding the font data into the HTML file itself.
|
||||
(see [[http://en.wikipedia.org/wiki/Data_URI_scheme]])
|
||||
|
||||
The code is licensed under the GNU General Public License version
|
||||
2, or, at your option, any later version.
|
||||
|
||||
|
||||
* Usage
|
||||
To run Static MathJax, an existing XULRunner installation is
|
||||
required. From the directory to which you unpacked Static MathJax,
|
||||
run:
|
||||
|
||||
xulrunner application.ini <--embed-fonts | --final-mathjax-url <URL>>
|
||||
<input file> <output file>
|
||||
|
||||
If you prefer to call "staticmathjax" instead of "xulrunner
|
||||
application.ini", link xulrunner-stub into the directory:
|
||||
ln /usr/lib/xulrunner-1.9.2.8/xulrunner-stub ./staticmathjax
|
||||
|
||||
- input file ::
|
||||
name of the input file (the result of a HTML export
|
||||
from Org-mode). It is assumed that this file uses the
|
||||
UTF-8 character encoding.
|
||||
|
||||
- output file ::
|
||||
name of the output file.
|
||||
|
||||
- --embed-fonts ::
|
||||
if specified, the math fonts will be embedded into
|
||||
the output file using data: URIs
|
||||
|
||||
- --final-mathjax-url <URL> ::
|
||||
if --embed-fonts is not specified, this
|
||||
must be the URL to a MathJax installation folder (e.g. "MathJax"
|
||||
if MathJax is installed in a subdirectory, or
|
||||
"https://orgmode.org/mathjax" to use the version hosted on the Org
|
||||
website.
|
||||
|
||||
All references to math fonts in the output file will point to
|
||||
this directory.
|
||||
|
||||
* Caveats
|
||||
|
||||
The input file must not use a MathJax installation on the
|
||||
web. Otherwise, due to a security feature of Firefox, MathJax will
|
||||
fallback to image fonts. If you have unpacked MathJax to a
|
||||
subdirectory "MathJax", specify the following in your Org file:
|
||||
|
||||
#+MathJax: path:"MathJax"
|
||||
|
||||
The math is rendered in Firefox, so MathJax applies its
|
||||
Firefox-specific settings. When viewing the output files in other
|
||||
browsers, it will look slightly different than the result that
|
||||
running MathJax in that browser would produce.
|
||||
|
||||
Internet Explorer does not use the correct font, because it only
|
||||
supports the EOT font format. For all other browsers (including
|
||||
Firefox), MathJax uses the OTF font format.
|
||||
|
||||
Embedding fonts into the HTML file wastes some space due to the
|
||||
base64 encoding used in data: URIs.
|
||||
|
||||
I have found no way to access stdout or set an exit code in an
|
||||
XULRunner app, so any code which calls Static MathJax has no idea if
|
||||
processing was successful and when an error occurs, graphical
|
||||
message boxes are displayed.
|
||||
11
lisp/org/contrib/scripts/staticmathjax/application.ini
Normal file
11
lisp/org/contrib/scripts/staticmathjax/application.ini
Normal file
@@ -0,0 +1,11 @@
|
||||
[App]
|
||||
Vendor=Jan Boecker
|
||||
Name=StaticMathJax
|
||||
Version=0.2
|
||||
BuildID=2
|
||||
Copyright=Copyright (c) 2010, 2013 Jan Boecker
|
||||
ID=xulapp@jboecker.de
|
||||
|
||||
[Gecko]
|
||||
MinVersion=1.8
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
content staticmathjax file:content/
|
||||
198
lisp/org/contrib/scripts/staticmathjax/chrome/content/main.js
Normal file
198
lisp/org/contrib/scripts/staticmathjax/chrome/content/main.js
Normal file
@@ -0,0 +1,198 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0"?>
|
||||
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
|
||||
|
||||
<window onload="init();" id="main" title="Static MathJax" width="300" height="300"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||
|
||||
<script language="JavaScript" src="chrome://staticmathjax/content/main.js"/>
|
||||
|
||||
<browser flex="1" id="docFrame" src="" style="background-color:white;"/>
|
||||
<textbox flex="1" id="logtextbox" multiline="true" style="display:none;"/>
|
||||
</window>
|
||||
@@ -0,0 +1 @@
|
||||
pref("toolkit.defaultChromeURI", "chrome://staticmathjax/content/main.xul");
|
||||
Reference in New Issue
Block a user