add lisp packages

This commit is contained in:
2020-12-05 21:29:49 +01:00
parent 85e20365ae
commit a6e2395755
7272 changed files with 1363243 additions and 0 deletions

View File

@@ -0,0 +1 @@
*~

View 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.

View 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

View File

@@ -0,0 +1 @@
content staticmathjax file:content/

View 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("&lt;!--/\\*--&gt;&lt;!\\[CDATA\\[/\\*&gt;&lt;!--\\*/", "g");
xhtml = xhtml.replace(r1, "");
r2 = RegExp("/\\*\\]\\]&gt;\\*/--&gt;", "g");
xhtml = xhtml.replace(r2, "");
r3 = RegExp("/\\*\\]\\]&gt;\\*///--&gt;", "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);
}
}

View File

@@ -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>

View File

@@ -0,0 +1 @@
pref("toolkit.defaultChromeURI", "chrome://staticmathjax/content/main.xul");