uses jeuclid to convert mathml into svg git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@194741 13f79535-47bb-0310-9956-ffa450edef68tags/fop-0_20_4-doc
@@ -0,0 +1 @@ | |||
build |
@@ -0,0 +1,10 @@ | |||
FOP MathML Readme | |||
This directory contains an extension for MathML that can be used with FOP. | |||
This extension works with jeuclid which is available from: | |||
http://sourceforge.net/projects/jeuclid/ | |||
This simply uses jeuclid to convert the mathml xml into svg. | |||
The svg is then handled as normal. | |||
@@ -0,0 +1,26 @@ | |||
#!/bin/sh | |||
echo | |||
echo "MathML Build System" | |||
echo "----------------" | |||
echo | |||
if [ "$JAVA_HOME" = "" ] ; then | |||
echo "ERROR: JAVA_HOME not found in your environment." | |||
echo | |||
echo "Please, set the JAVA_HOME variable in your environment to match the" | |||
echo "location of the Java Virtual Machine you want to use." | |||
exit 1 | |||
fi | |||
LIBDIR=../../lib | |||
LOCALCLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/classes.zip:$LIBDIR/ant.jar:$LIBDIR/batik.jar:$LIBDIR/buildtools.jar:$LIBDIR/xerces-1.4.3.jar:$LIBDIR/xalan-2.2D11.jar:../../build/fop.jar:$LIBDIR/avalon-framework-cvs-20020315.jar:lib/jeuclid.jar | |||
ANT_HOME=$LIBDIR | |||
echo | |||
CP=$LOCALCLASSPATH | |||
echo Building with classpath $CP | |||
echo Starting Ant... | |||
echo | |||
$JAVA_HOME/bin/java -Dant.home=$ANT_HOME -classpath "$CP" org.apache.tools.ant.Main $* |
@@ -0,0 +1,134 @@ | |||
<?xml version="1.0"?> | |||
<!-- =========================================================================== | |||
============================================================================ --> | |||
<project default="package" basedir="."> | |||
<!-- =================================================================== --> | |||
<!-- Initialization target --> | |||
<!-- =================================================================== --> | |||
<target name="init"> | |||
<tstamp/> | |||
<property name="Name" value="MathML-FOP"/> | |||
<property name="name" value="mathml-fop"/> | |||
<property name="version" value="0.1-CVS"/> | |||
<filter token="version" value="${version}"/> | |||
<property name="year" value="2002"/> | |||
<echo message="------------------- ${Name} ${version} [${year}] ----------------"/> | |||
<property name="build.compiler" value="classic"/> | |||
<property name="debug" value="off"/> | |||
<property name="optimize" value="on"/> | |||
<property name="deprecation" value="off"/> | |||
<property name="src.dir" value="./src"/> | |||
<property name="lib.dir" value="./lib"/> | |||
<property name="packages" value="org.apache.fop.*"/> | |||
<property name="build.dir" value="./build"/> | |||
<property name="build.src" value="./build/src"/> | |||
<property name="build.dest" value="./build/classes"/> | |||
<property name="resource.dir" value="resources"/> | |||
<property name="mathml.dir" value="org/apache/fop/mathml"/> | |||
<property name="xslt" value="org.apache.xalan.xslt.Process"/> | |||
</target> | |||
<!-- =================================================================== --> | |||
<!-- Help on usage --> | |||
<!-- =================================================================== --> | |||
<target name="usage"> | |||
<echo message=""/> | |||
<echo message=""/> | |||
<echo message="${Name} Build file"/> | |||
<echo message="-------------------------------------------------------------"/> | |||
<echo message=""/> | |||
<echo message=" available targets are:"/> | |||
<echo message=""/> | |||
<echo message=" package --> generates the ${name}.jar file (default)"/> | |||
<echo message=" compile --> compiles the source code"/> | |||
<echo message=" clean --> cleans up the directory"/> | |||
<echo message=" site --> generates the ${Name} web site (not yet implemented)"/> | |||
<echo message=""/> | |||
<echo message=" See the comments inside the build.xml file for more details."/> | |||
<echo message="-------------------------------------------------------------"/> | |||
<echo message=""/> | |||
<echo message=""/> | |||
</target> | |||
<!-- =================================================================== --> | |||
<!-- Prepares the build directory --> | |||
<!-- =================================================================== --> | |||
<target name="prepare" depends="init"> | |||
<!-- create directories --> | |||
<echo message="Preparing the build directories"/> | |||
<mkdir dir="${build.dir}"/> | |||
<mkdir dir="${build.src}"/> | |||
<mkdir dir="${build.src}/${mathml.dir}"/> | |||
</target> | |||
<!-- =================================================================== --> | |||
<!-- Prepares the source code --> | |||
<!-- =================================================================== --> | |||
<target name="prepare-src" depends="prepare"> | |||
<!-- copy src files --> | |||
<copy todir="${build.src}"> | |||
<fileset dir="${src.dir}" | |||
excludes="**/Makefile*, **/package.html"/> | |||
</copy> | |||
<copy todir="${build.dest}/"> | |||
<fileset dir="${resource.dir}"/> | |||
</copy> | |||
</target> | |||
<!-- =================================================================== --> | |||
<!-- Compiles the source directory --> | |||
<!-- =================================================================== --> | |||
<target name="compile" depends="prepare-src"> | |||
<echo message="Compiling the sources "/> | |||
<!-- create directories --> | |||
<mkdir dir="${build.dest}"/> | |||
<javac srcdir="${build.src}" | |||
destdir="${build.dest}" | |||
debug="${debug}" | |||
deprecation="${deprecation}" | |||
optimize="${optimize}" | |||
excludes=""/> | |||
</target> | |||
<!-- =================================================================== --> | |||
<!-- Creates the class package --> | |||
<!-- =================================================================== --> | |||
<target name="package" depends="compile"> | |||
<echo message="Creating the jar file ${build.dir}/${name}.jar"/> | |||
<tstamp> | |||
<format property="ts" pattern="yyyyMMdd-HHmmss-z"/> | |||
</tstamp> | |||
<jar jarfile="${build.dir}/${name}.jar" | |||
basedir="${build.dest}" | |||
includes="**"> | |||
<manifest> | |||
<attribute name="Implementation-Title" value="${Name}"/> | |||
<attribute name="Implementation-Version" value="${version}"/> | |||
<attribute name="Implementation-Vendor" value="Apache Software Foundation (http://xml.apache.org/fop/)"/> | |||
<attribute name="Build-Id" value="${ts} (${user.name} [${os.name} ${os.version} ${os.arch}])"/> | |||
</manifest> | |||
</jar> | |||
</target> | |||
<!-- =================================================================== --> | |||
<!-- Clean targets --> | |||
<!-- =================================================================== --> | |||
<target name="clean" depends="init"> | |||
<delete dir="${build.dir}"/> | |||
</target> | |||
</project> | |||
@@ -0,0 +1,63 @@ | |||
<?xml version="1.0" encoding="ISO-8859-1"?> | |||
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="display"> | |||
<mrow> | |||
<mo stretchy="false">{</mo> | |||
<munder> | |||
<mrow> | |||
<mover> | |||
<mrow> | |||
<mpadded width="0"/> | |||
<!--mpadded width="0">(</mpadded--> | |||
<!-- \mathstrut -ugly hack a la TeX --> | |||
<mi>a</mi> | |||
<mo>,</mo> | |||
<mo>...</mo> | |||
<mo>,</mo> | |||
<mi>a</mi> | |||
</mrow> | |||
<mover> | |||
<mo>︷</mo> | |||
<mrow> | |||
<mi>k</mi> | |||
<mtext> </mtext> | |||
<mi>a</mi> | |||
<mtext>'s</mtext> | |||
</mrow> | |||
</mover> | |||
</mover> | |||
<mo>,</mo> | |||
<mover> | |||
<mrow> | |||
<mpadded/> | |||
<!--mpadded width="0">(</mpadded--> | |||
<!-- \mathstrut -ugly hack a la TeX --> | |||
<mi>b</mi> | |||
<mo>,</mo> | |||
<mo>...</mo> | |||
<mo>,</mo> | |||
<mi>b</mi> | |||
</mrow> | |||
<mover> | |||
<mo>︷</mo> | |||
<mrow> | |||
<mi>ℓ</mi> | |||
<mtext> </mtext> | |||
<mi>b</mi> | |||
<mtext>'s</mtext> | |||
</mrow> | |||
</mover> | |||
</mover> | |||
</mrow> | |||
<munder> | |||
<mo>︸</mo> | |||
<mrow> | |||
<mi>k</mi> | |||
<mo>+</mo> | |||
<mi>ℓ</mi> | |||
<mtext> elements</mtext> | |||
</mrow> | |||
</munder> | |||
</munder> | |||
<mo stretchy="false">}</mo> | |||
</mrow> | |||
</math> |
@@ -0,0 +1,172 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> | |||
<fo:layout-master-set> | |||
<fo:simple-page-master | |||
margin-right="1.5cm" | |||
margin-left="1.5cm" | |||
margin-bottom="2cm" | |||
margin-top="1cm" | |||
page-width="21cm" | |||
page-height="29.7cm" | |||
master-name="first"> | |||
<fo:region-before extent="1cm"/> | |||
<fo:region-body margin-top="1cm"/> | |||
<fo:region-after extent="1.5cm"/> | |||
</fo:simple-page-master> | |||
</fo:layout-master-set> | |||
<fo:page-sequence master-reference="first"> | |||
<fo:static-content flow-name="xsl-region-before"> | |||
<fo:block line-height="14pt" font-size="10pt" | |||
text-align="end">Plan Extension</fo:block> | |||
</fo:static-content> | |||
<fo:static-content flow-name="xsl-region-after"> | |||
<fo:block line-height="14pt" font-size="10pt" | |||
text-align="end">Page <fo:page-number/></fo:block> | |||
</fo:static-content> | |||
<fo:flow flow-name="xsl-region-body"> | |||
<fo:block space-before.optimum="3pt" space-after.optimum="15pt"> | |||
The MathML Extension | |||
</fo:block> | |||
<fo:block space-before.optimum="3pt" space-after.optimum="15pt"> | |||
The mathml extension is an addition to FOP that can be used to draw mathml | |||
expressions. | |||
</fo:block> | |||
<fo:block space-before.optimum="3pt" space-after.optimum="15pt"> | |||
Examples | |||
</fo:block> | |||
<fo:block space-before.optimum="3pt" space-after.optimum="15pt"> | |||
<fo:block space-after.optimum="5pt"> | |||
<fo:instream-foreign-object> | |||
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="inline"> | |||
<mrow> | |||
<mi>I</mi> | |||
<mrow> | |||
<mo>(</mo> | |||
<mi>x</mi> | |||
<mo>)</mo> | |||
</mrow> | |||
<mo>=</mo> | |||
<mi>F</mi> | |||
<mo stretchy="false">(</mo> | |||
<mi>x</mi> | |||
<mo stretchy="false">)</mo> | |||
<mo>+</mo> | |||
<mi>C</mi> | |||
</mrow> | |||
</math> | |||
</fo:instream-foreign-object> | |||
</fo:block> | |||
</fo:block> | |||
<fo:block space-before.optimum="3pt" space-after.optimum="15pt"> | |||
<fo:block space-after.optimum="5pt"> | |||
<fo:instream-foreign-object> | |||
<math xmlns="http://www.w3.org/1998/Math/MathML" mode="inline"> | |||
<mrow> | |||
<mo>(</mo> | |||
<mtable> | |||
<mtr> | |||
<mtd columnalign="center"> | |||
<mrow> | |||
<mo>(</mo> | |||
<mtable> | |||
<mtr> | |||
<mtd columnalign="center"> | |||
<mi>a</mi> | |||
</mtd> | |||
<mtd columnalign="center"> | |||
<mi>b</mi> | |||
</mtd> | |||
</mtr> | |||
<mtr> | |||
<mtd columnalign="center"> | |||
<mi>c</mi> | |||
</mtd> | |||
<mtd columnalign="center"> | |||
<mi>d</mi> | |||
</mtd> | |||
</mtr> | |||
</mtable> | |||
<mo>)</mo> | |||
</mrow> | |||
</mtd> | |||
<mtd columnalign="center"> | |||
<mrow> | |||
<mo>(</mo> | |||
<mtable> | |||
<mtr> | |||
<mtd columnalign="center"> | |||
<mi>e</mi> | |||
</mtd> | |||
<mtd columnalign="center"> | |||
<mi>f</mi> | |||
</mtd> | |||
</mtr> | |||
<mtr> | |||
<mtd columnalign="center"> | |||
<mi>g</mi> | |||
</mtd> | |||
<mtd columnalign="center"> | |||
<mi>h</mi> | |||
</mtd> | |||
</mtr> | |||
</mtable> | |||
<mo>)</mo> | |||
</mrow> | |||
</mtd> | |||
</mtr> | |||
<mtr> | |||
<mtd columnalign="center"> | |||
<mn>0</mn> | |||
</mtd> | |||
<mtd columnalign="center"> | |||
<mrow> | |||
<mo>(</mo> | |||
<mtable> | |||
<mtr> | |||
<mtd columnalign="center"> | |||
<mi>i</mi> | |||
</mtd> | |||
<mtd columnalign="center"> | |||
<mi>j</mi> | |||
</mtd> | |||
</mtr> | |||
<mtr> | |||
<mtd columnalign="center"> | |||
<mi>k</mi> | |||
</mtd> | |||
<mtd columnalign="center"> | |||
<mi>l</mi> | |||
</mtd> | |||
</mtr> | |||
</mtable> | |||
<mo>)</mo> | |||
</mrow> | |||
</mtd> | |||
</mtr> | |||
</mtable> | |||
<mo>)</mo> | |||
</mrow> | |||
</math> | |||
</fo:instream-foreign-object> | |||
</fo:block> | |||
</fo:block> | |||
<fo:block> | |||
An external mathml document. | |||
</fo:block> | |||
<fo:block> | |||
<fo:external-graphic src="example.mml"/> | |||
</fo:block> | |||
</fo:flow> | |||
</fo:page-sequence> | |||
</fo:root> | |||
@@ -0,0 +1 @@ | |||
Put jeuclid.jar in this directory! |
@@ -0,0 +1,2 @@ | |||
org.apache.fop.mathml.MathMLElementMapping | |||
@@ -0,0 +1,124 @@ | |||
/* $Id$ | |||
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved. | |||
* For details on use and redistribution please refer to the | |||
* LICENSE file included with these sources. | |||
*/ | |||
package org.apache.fop.mathml; | |||
import java.awt.Color; | |||
import java.awt.Dimension; | |||
import java.awt.geom.Point2D; | |||
import org.apache.fop.fo.FONode; | |||
import org.apache.fop.apps.FOPException; | |||
import org.w3c.dom.Document; | |||
import org.w3c.dom.*; | |||
import org.xml.sax.Attributes; | |||
import org.apache.batik.svggen.SVGGraphics2D; | |||
import org.apache.batik.dom.svg.SVGDOMImplementation; | |||
import net.sourceforge.jeuclid.MathBase; | |||
import net.sourceforge.jeuclid.DOMMathBuilder; | |||
public class MathMLElement extends MathMLObj { | |||
Document svgDoc = null; | |||
float width; | |||
float height; | |||
boolean converted = false; | |||
public MathMLElement(FONode parent) { | |||
super(parent); | |||
} | |||
public void handleAttrs(Attributes attlist) throws FOPException { | |||
super.handleAttrs(attlist); | |||
createBasicDocument(); | |||
} | |||
public void convertToSVG() { | |||
try { | |||
if (!converted) { | |||
converted = true; | |||
String fontname = "Helvetica"; | |||
int fontstyle = 0; | |||
int inlinefontstyle = 0; | |||
int displayfontsize = 12; | |||
int inlinefontsize = 12; | |||
MathBase base = new MathBase( | |||
(new DOMMathBuilder(doc)).getMathRootElement(), | |||
fontname, fontstyle, inlinefontsize, | |||
displayfontsize); | |||
base.setDebug(false); | |||
svgDoc = createSVG(base); | |||
width = base.getWidth(); | |||
height = base.getHeight(); | |||
doc = svgDoc; | |||
} | |||
} catch (Throwable t) { | |||
log.error("Could not convert MathML to SVG", t); | |||
width = 0; | |||
height = 0; | |||
} | |||
} | |||
public static Document createSVG(MathBase base) { | |||
DOMImplementation impl = | |||
SVGDOMImplementation.getDOMImplementation(); | |||
String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI; | |||
Document svgdocument = impl.createDocument(svgNS, "svg", null); | |||
SVGGraphics2D g = new SVGGraphics2D(svgdocument); | |||
g.setSVGCanvasSize( | |||
new Dimension(base.getWidth(), base.getHeight())); | |||
//g.setColor(Color.white); | |||
//g.fillRect(0, 0, base.getWidth(), base.getHeight()); | |||
g.setColor(Color.black); | |||
base.paint(g); | |||
//if (antialiasing) | |||
//element.setAttribute("text-rendering", "optimizeLegibility"); | |||
//else | |||
//element.setAttribute("text-rendering", "geometricPrecision"); | |||
// this should be done in a better way | |||
Element root = g.getRoot(); | |||
svgdocument = impl.createDocument(svgNS, "svg", null); | |||
Node node = svgdocument.importNode(root, true); | |||
((org.apache.batik.dom.svg.SVGOMDocument) svgdocument). | |||
getRootElement().appendChild(node); | |||
return svgdocument; | |||
} | |||
public Document getDocument() { | |||
convertToSVG(); | |||
return doc; | |||
} | |||
public String getDocumentNamespace() { | |||
if (svgDoc == null) { | |||
return MathMLElementMapping.URI; | |||
} | |||
return "http://www.w3.org/2000/svg"; | |||
} | |||
public Point2D getDimension(Point2D view) { | |||
convertToSVG(); | |||
return new Point2D.Float(width, height); | |||
} | |||
} | |||
@@ -0,0 +1,87 @@ | |||
/* $Id$ | |||
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved. | |||
* For details on use and redistribution please refer to the | |||
* LICENSE file included with these sources. | |||
*/ | |||
package org.apache.fop.mathml; | |||
import org.apache.fop.fo.FOTreeBuilder; | |||
import org.apache.fop.fo.FONode; | |||
import org.apache.fop.fo.ElementMapping; | |||
import org.apache.fop.image.analyser.XMLReader; | |||
import org.apache.fop.image.FopImage; | |||
import org.w3c.dom.Document; | |||
import java.util.HashMap; | |||
import net.sourceforge.jeuclid.MathBase; | |||
import net.sourceforge.jeuclid.DOMMathBuilder; | |||
public class MathMLElementMapping implements ElementMapping { | |||
public static final String URI = "http://www.w3.org/1998/Math/MathML"; | |||
private static HashMap foObjs = null; | |||
private static synchronized void setupMathML() { | |||
if (foObjs == null) { | |||
foObjs = new HashMap(); | |||
foObjs.put("math", new ME()); | |||
foObjs.put(DEFAULT, new MathMLMaker()); | |||
XMLReader.setConverter(URI, new MathMLConverter()); | |||
} | |||
} | |||
public void addToBuilder(FOTreeBuilder builder) { | |||
setupMathML(); | |||
builder.addMapping(URI, foObjs); | |||
} | |||
static class MathMLMaker extends ElementMapping.Maker { | |||
public FONode make(FONode parent) { | |||
return new MathMLObj(parent); | |||
} | |||
} | |||
static class ME extends ElementMapping.Maker { | |||
public FONode make(FONode parent) { | |||
return new MathMLElement(parent); | |||
} | |||
} | |||
static class MathMLConverter implements XMLReader.Converter { | |||
public FopImage.ImageInfo convert(Document doc) { | |||
try { | |||
FopImage.ImageInfo info = new FopImage.ImageInfo(); | |||
String fontname = "Helvetica"; | |||
int fontstyle = 0; | |||
int inlinefontstyle = 0; | |||
int inlinefontsize = 12; | |||
int displayfontsize = 12; | |||
MathBase base = new MathBase( | |||
(new DOMMathBuilder(doc)).getMathRootElement(), | |||
fontname, fontstyle, inlinefontsize, | |||
displayfontsize); | |||
base.setDebug(false); | |||
info.data = MathMLElement.createSVG(base); | |||
info.width = base.getWidth(); | |||
info.height = base.getHeight(); | |||
info.mimeType = "image/svg+xml"; | |||
info.str = "http://www.w3.org/2000/svg"; | |||
return info; | |||
} catch (Throwable t) { | |||
} | |||
return null; | |||
} | |||
} | |||
} |
@@ -0,0 +1,26 @@ | |||
/* $Id$ | |||
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved. | |||
* For details on use and redistribution please refer to the | |||
* LICENSE file included with these sources. | |||
*/ | |||
package org.apache.fop.mathml; | |||
// FOP | |||
import org.apache.fop.fo.FONode; | |||
import org.apache.fop.fo.XMLObj; | |||
/** | |||
* Catch all MathML object as default element. | |||
*/ | |||
public class MathMLObj extends XMLObj { | |||
public MathMLObj(FONode parent) { | |||
super(parent); | |||
} | |||
public String getNameSpace() { | |||
return MathMLElementMapping.URI; | |||
} | |||
} | |||