w2x: Recognize display equations + add MathJax support
git-svn-id: svn://svn.code.sf.net/p/writer2latex/code/trunk@148 f0f2a975-2e09-46c8-9428-3b39399b9f3c
This commit is contained in:
parent
ac7f03f44f
commit
e330b3dfab
15 changed files with 254 additions and 40 deletions
|
@ -20,7 +20,7 @@
|
|||
*
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Version 1.4 (2012-03-23)
|
||||
* Version 1.4 (2012-04-07)
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -31,15 +31,24 @@ import java.io.FileInputStream;
|
|||
import java.io.FileNotFoundException;
|
||||
import java.io.InputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
import writer2latex.api.GraphicConverter;
|
||||
import writer2latex.api.Converter;
|
||||
import writer2latex.api.ConverterResult;
|
||||
import writer2latex.api.OutputFile;
|
||||
import writer2latex.office.EmbeddedObject;
|
||||
import writer2latex.office.EmbeddedXMLObject;
|
||||
import writer2latex.office.ImageLoader;
|
||||
import writer2latex.office.MIMETypes;
|
||||
import writer2latex.office.MetaData;
|
||||
import writer2latex.office.OfficeDocument;
|
||||
import writer2latex.office.OfficeReader;
|
||||
import writer2latex.office.XMLString;
|
||||
import writer2latex.util.Misc;
|
||||
|
||||
/**<p>Abstract base implementation of <code>writer2latex.api.Converter</code></p>
|
||||
*/
|
||||
|
@ -57,6 +66,10 @@ public abstract class ConverterBase implements Converter {
|
|||
// The output file(s)
|
||||
protected String sTargetFileName;
|
||||
protected ConverterResultImpl converterResult;
|
||||
|
||||
// Result of latest parsing of a display equation
|
||||
private Element theEquation = null;
|
||||
private Element theSequence = null;
|
||||
|
||||
// Constructor
|
||||
public ConverterBase() {
|
||||
|
@ -137,6 +150,139 @@ public abstract class ConverterBase implements Converter {
|
|||
public EmbeddedObject getEmbeddedObject(String sHref) {
|
||||
return odDoc.getEmbeddedObject(sHref);
|
||||
}
|
||||
|
||||
/** Get the equation found by the last invocation of <code>parseDisplayEquation</code>
|
||||
*
|
||||
* @return the equation or null if no equation was found
|
||||
*/
|
||||
public Element getEquation() {
|
||||
return theEquation;
|
||||
}
|
||||
|
||||
/** Get the sequence number found by the last invocation of <code>parseDisplayEquation</code>
|
||||
*
|
||||
* @return the sequence number or null if no sequence number was found
|
||||
*/
|
||||
public Element getSequence() {
|
||||
return theSequence;
|
||||
}
|
||||
|
||||
/** Determine whether or not a paragraph contains a display equation.
|
||||
* A paragraph is a display equation if it contains a single formula and no text content except whitespace
|
||||
* and an optional sequence number which may be in brackets.
|
||||
* As a side effect, this method keeps a reference to the equation and the sequence number
|
||||
*
|
||||
* @param node the paragraph
|
||||
* @return true if this is a display equation
|
||||
*/
|
||||
public boolean parseDisplayEquation(Node node) {
|
||||
theEquation = null;
|
||||
theSequence = null;
|
||||
return doParseDisplayEquation(node);
|
||||
}
|
||||
|
||||
private boolean doParseDisplayEquation(Node node) {
|
||||
Node child = node.getFirstChild();
|
||||
while (child!=null) {
|
||||
Node equation = getFormula(child);
|
||||
if (equation!=null) {
|
||||
if (theEquation==null) {
|
||||
theEquation = (Element) equation;
|
||||
}
|
||||
else { // two or more equations -> not a display
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (Misc.isElement(child)) {
|
||||
String sName = child.getNodeName();
|
||||
if (XMLString.TEXT_SEQUENCE.equals(sName)) {
|
||||
if (theSequence==null) {
|
||||
theSequence = (Element) child;
|
||||
}
|
||||
else { // two sequence numbers -> not a display
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (XMLString.TEXT_SPAN.equals(sName)) {
|
||||
if (!doParseDisplayEquation(child)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (XMLString.TEXT_S.equals(sName)) {
|
||||
// Spaces are allowed
|
||||
}
|
||||
else if (XMLString.TEXT_TAB.equals(sName)) {
|
||||
// Tab stops are allowed
|
||||
}
|
||||
else if (XMLString.TEXT_TAB_STOP.equals(sName)) { // old
|
||||
// Tab stops are allowed
|
||||
}
|
||||
else if (XMLString.TEXT_SOFT_PAGE_BREAK.equals(sName)) { // since ODF 1.1
|
||||
// Soft page breaks are allowed
|
||||
}
|
||||
else {
|
||||
// Other elements -> not a display
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (Misc.isText(child)) {
|
||||
String s = child.getNodeValue();
|
||||
int nLen = s.length();
|
||||
for (int i=0; i<nLen; i++) {
|
||||
char c = s.charAt(i);
|
||||
if (c!='(' && c!=')' && c!='[' && c!=']' && c!='{' && c!='}' && c!=' ' && c!='\u00A0') {
|
||||
// Characters except brackets and whitespace -> not a display
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
child = child.getNextSibling();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// TODO: Extend OfficeReader to handle frames
|
||||
private Node getFormula(Node node) {
|
||||
if (Misc.isElement(node,XMLString.DRAW_FRAME)) {
|
||||
node=Misc.getFirstChildElement(node);
|
||||
}
|
||||
|
||||
String sHref = Misc.getAttribute(node,XMLString.XLINK_HREF);
|
||||
|
||||
if (sHref!=null) { // Embedded object in package or linked object
|
||||
if (ofr.isInPackage(sHref)) { // Embedded object in package
|
||||
if (sHref.startsWith("#")) { sHref=sHref.substring(1); }
|
||||
if (sHref.startsWith("./")) { sHref=sHref.substring(2); }
|
||||
EmbeddedObject object = getEmbeddedObject(sHref);
|
||||
if (object!=null) {
|
||||
if (MIMETypes.MATH.equals(object.getType()) || MIMETypes.ODF.equals(object.getType())) { // Formula!
|
||||
try {
|
||||
Document formuladoc = ((EmbeddedXMLObject) object).getContentDOM();
|
||||
Element formula = Misc.getChildByTagName(formuladoc,XMLString.MATH); // Since OOo 3.2
|
||||
if (formula==null) {
|
||||
formula = Misc.getChildByTagName(formuladoc,XMLString.MATH_MATH);
|
||||
}
|
||||
return formula;
|
||||
}
|
||||
catch (org.xml.sax.SAXException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
catch (java.io.IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else { // flat XML, object is contained in node
|
||||
Element formula = Misc.getChildByTagName(node,XMLString.MATH); // Since OOo 3.2
|
||||
if (formula==null) {
|
||||
formula = Misc.getChildByTagName(node,XMLString.MATH_MATH);
|
||||
}
|
||||
return formula;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue