From 9e78c8fc3d2fc7729974a22915281d89bd9be2bc Mon Sep 17 00:00:00 2001 From: henrikjust Date: Fri, 3 Jul 2009 08:28:43 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/writer2latex/code/trunk@26 f0f2a975-2e09-46c8-9428-3b39399b9f3c --- source/distro/doc/user-manual.odt | Bin 219443 -> 219545 bytes .../comp/w2lcommon/tex/tokenizer/Mouth.java | 333 ++++++++++++++++++ .../comp/w2lcommon/tex/tokenizer/Token.java | 157 +++++++++ .../writer4latex/ConfigurationDialog.java | 6 +- .../da/comp/writer4latex/DeTeXtive.java | 221 ++++++++++++ .../da/comp/writer4latex/ExternalApps.java | 24 +- .../comp/writer4latex/TeXDetectService.java | 105 +++++- .../da/comp/writer4latex/TeXImportFilter.java | 15 +- .../da/comp/writer4latex/Writer4LaTeX.java | 81 ++++- source/oxt/writer4latex/w4l_filters.xcu | 12 + source/oxt/writer4latex/w4l_types.xcu | 12 + 11 files changed, 932 insertions(+), 34 deletions(-) create mode 100644 source/java/org/openoffice/da/comp/w2lcommon/tex/tokenizer/Mouth.java create mode 100644 source/java/org/openoffice/da/comp/w2lcommon/tex/tokenizer/Token.java create mode 100644 source/java/org/openoffice/da/comp/writer4latex/DeTeXtive.java diff --git a/source/distro/doc/user-manual.odt b/source/distro/doc/user-manual.odt index ff2a33c89df30ffd9ed267bd3db22c2ddde570bd..bf4212d98b0aae505599ee9312d7d826584ca8b7 100644 GIT binary patch delta 42996 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 B;ne^D diff --git a/source/java/org/openoffice/da/comp/w2lcommon/tex/tokenizer/Mouth.java b/source/java/org/openoffice/da/comp/w2lcommon/tex/tokenizer/Mouth.java new file mode 100644 index 0000000..c427400 --- /dev/null +++ b/source/java/org/openoffice/da/comp/w2lcommon/tex/tokenizer/Mouth.java @@ -0,0 +1,333 @@ +/************************************************************************ + * + * Mouth.java + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * Copyright: 2002-2009 by Henrik Just + * + * All Rights Reserved. + * + * Version 1.2 (2009-06-18) + * + */ + +package org.openoffice.da.comp.w2lcommon.tex.tokenizer; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; + +enum State { + N, // new line + M, // middle of line + S; // ignoring spaces +} + +/**

The Mouth is the main class of this package. It is a tokenizer to TeX files: According to "The TeXBook", the + * "eyes" and "mouth" of TeX are responsible for turning the input to TeX into a sequence of tokens. + * We are not going to reimplement TeX, but rather providing a service for parsing high-level languages based on + * TeX (eg. LaTeX, ConTeXt). For this reason the tokenizer deviates slightly from TeX: We're not reading a stream + * of bytes but rather a stream of characters (which makes no difference for ASCII files).

+ * + *

In tribute to Donald E. Knuths digestive metaphors, we divide the process in four levels

+ *
    + *
  • The parser should provide a pair of glasses to translate the stream of bytes into a stream of characters
  • + *
  • The eyes sees the stream of characters as a sequence of lines
  • + *
  • The mouth chews a bit on the characters to turn them into tokens
  • + *
  • The tongue reports the "taste" of the token to the parser
  • + *
+ */ +public class Mouth { + private Reader reader; // The input + private CatcodeTable catcodes; // The current catcode table + private char cEndlinechar; // The current value of \endlinechar + private Token token; // The token object + private State state; // The current state of the tokenizer + private Eyes eyes; // sic! + + /** Construct a new Mouth based on a character stream + * + * @param reader the character stream to tokenize + * @throws IOException if we fail to read the character stream + */ + public Mouth(Reader reader) throws IOException { + this.reader = reader; + catcodes = new CatcodeTable(); + cEndlinechar = '\r'; + token = new Token(); + state = State.N; + eyes = new Eyes(); + } + + private class Eyes { + private BufferedReader br; // The inpuy + private String sLine; // The current line + private int nLen; // The length of the current line + private int nIndex; // The current index in the current line + + Eyes() throws IOException { + br = new BufferedReader(reader); + nextLine(); + } + + /** Start looking at the next line of input + * + * @throws IOException if we fail to read the underlying stream + */ + void nextLine() throws IOException { + sLine = br.readLine(); + if (sLine!=null) { + nLen = sLine.length(); + nIndex = 0; + // Delete trailing spaces + while (nLen>0 && sLine.charAt(nLen-1)==' ') { nLen--; } + } + else { // end of stream + nLen = 0; + nIndex = 1; + } + } + + /** Test whether the eyes are looking at a character + * + * @return true if the current line still has characters to look at + */ + boolean lookingAtChar() { + return nIndex<=nLen; + } + + /** Test whether the eyes a looking at a line + * + * @return true if a current line is available + */ + boolean lookingAtLine() { + return sLine!=null; + } + + /** Get the character that the eyes currently sees + * + * @return the character or U+FFFF if the eyes are not looking at a character + */ + char peekChar() { + return getChar(false); + } + + /** Get the character that the eyes currently sees and start looking at the next character + * + * @return the character or U+FFFF if the eyes are not looking at a character + */ + char getChar() { + return getChar(true); + } + + private char getChar(boolean bMove) { + if (nIndex insert a \par + token.setType(TokenType.COMMAND_SEQUENCE); + token.clearChars(); + token.addChar('p'); + token.addChar('a'); + token.addChar('r'); + return token; + case M: + // Replace with a space token + token.set(' ', TokenType.SPACE); + return token; + case S: + // ignore the character + } + break; + case PARAMETER: + token.set(c, TokenType.PARAMETER); + return token; + case SUPERSCRIPT: + token.set(c, TokenType.SUPERSCRIPT); + return token; + case SUBSCRIPT: + token.set(c, TokenType.SUBSCRIPT); + return token; + case IGNORED: + // ignore this character + break; + case SPACE: + if (state==State.M) { + state=State.S; + token.set(' ', TokenType.SPACE); + return token; + } + // In state N and S the space character is ignored + break; + case LETTER: + token.set(c, TokenType.LETTER); + return token; + case OTHER: + token.set(c, TokenType.OTHER); + return token; + case ACTIVE: + token.set(c, TokenType.ACTIVE); + return token; + case COMMENT: + // Skip rest of line + while (eyes.lookingAtChar()) { eyes.getChar(); } + break; + case INVALID: + // ignore this character (should issue an error message, but we ignore that) + } + } + eyes.nextLine(); + state = State.N; + } + // Nothing more to read + token.setType(TokenType.ENDINPUT); + token.clearChars(); + return token; + } + +} diff --git a/source/java/org/openoffice/da/comp/w2lcommon/tex/tokenizer/Token.java b/source/java/org/openoffice/da/comp/w2lcommon/tex/tokenizer/Token.java new file mode 100644 index 0000000..913c69a --- /dev/null +++ b/source/java/org/openoffice/da/comp/w2lcommon/tex/tokenizer/Token.java @@ -0,0 +1,157 @@ +/************************************************************************ + * + * Token.java + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * Copyright: 2002-2009 by Henrik Just + * + * All Rights Reserved. + * + * Version 1.2 (2009-06-18) + * + */ + +package org.openoffice.da.comp.w2lcommon.tex.tokenizer; + +/** This class represent a token in TeX + */ +public class Token implements Cloneable { + private TokenType type; + private char[] tokenChars; + private int nTokenLen; + private int nCapacity; + + /** Construct a new Token, initialized as a TokenTYPE.ENDINPUT-token + */ + public Token() { + type = TokenType.ENDINPUT; + tokenChars = new char[25]; + nCapacity = 25; + nTokenLen = 0; + } + + /** Set the type of this token to a specific TokenType + * (the character content is not changed) + * + * @param type the new TokenType + */ + protected void setType(TokenType type) { + this.type = type; + } + + /** Set the character content of this token to a single character + * (the type of the token is not changed) + * + * @param c the character + */ + protected void setChar(char c) { + tokenChars[0] = c; + nTokenLen = 1; + } + + /** Set this token as a character token with a specific TokenType + * + * @param c the character + * @param type the TokenType to use + */ + protected void set(char c, TokenType type) { + setType(type); + setChar(c); + } + + /** Delete the character content of this token + */ + protected void clearChars() { + nTokenLen = 0; + } + + /** Append a character to the character content of this token + * + * @param c the character to be appended + */ + protected void addChar(char c) { + if (nTokenLen == nCapacity) { + char[] temp = tokenChars; + nCapacity+=25; + tokenChars = new char[nCapacity]; + System.arraycopy(temp, 0, tokenChars, 0, temp.length); + } + tokenChars[nTokenLen++] = c; + } + + /** Test wether this token is a character token of the given type (that is, a single character + * with a token type that is neither COMMAND_SEQUENCE nor ENDINPUT) + * + * @param c the character to test + * @param type the TokenType to test + * @return true if the test was successful + */ + public boolean is(char c, TokenType type) { + return this.type==type && type!=TokenType.COMMAND_SEQUENCE && type!=TokenType.ENDINPUT && + nTokenLen==1 && tokenChars[0]==c; + } + + /** Test wether this token is a COMMAND_SEQUENCE token with a given name + * + * @param sName the name of the command sequence + * @return true if the test was successful + */ + public boolean isCS(String sName) { + if (type==TokenType.COMMAND_SEQUENCE && sName.length()==nTokenLen) { + for (int i=0; iTokenType of this token + * + * @return the type + */ + public TokenType getType() { + return type; + } + + /** Get the first character in this token + * + * @return the character or U+FFFF is no characters exist + */ + public char getChar() { + return nTokenLen>0 ? tokenChars[0] : '\uFFFF'; + } + + /** Get the character content of this token as a string + * + * @return the character content + */ + public String getString() { + return new String(tokenChars,0,nTokenLen); + } + + @Override public String toString() { + switch (type) { + case COMMAND_SEQUENCE: + return "\\"+getString(); + case ENDINPUT: + return ""; + default: + return Character.toString(getChar()); + } + } + +} diff --git a/source/java/org/openoffice/da/comp/writer4latex/ConfigurationDialog.java b/source/java/org/openoffice/da/comp/writer4latex/ConfigurationDialog.java index 2ab74bd..190c21d 100644 --- a/source/java/org/openoffice/da/comp/writer4latex/ConfigurationDialog.java +++ b/source/java/org/openoffice/da/comp/writer4latex/ConfigurationDialog.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.2 (2009-05-01) + * Version 1.2 (2009-06-19) * */ @@ -268,7 +268,7 @@ public final class ConfigurationDialog externalApps.setApplication(ExternalApps.DVIPS, "dvips", "%s"); externalApps.setApplication(ExternalApps.BIBTEX, "bibtex", "%s"); externalApps.setApplication(ExternalApps.MAKEINDEX, "makeindex", "%s"); - externalApps.setApplication(ExternalApps.MK4HT, "mk4ht", "oolatex %s"); + externalApps.setApplication(ExternalApps.MK4HT, "mk4ht", "%c %s"); externalApps.setApplication(ExternalApps.DVIVIEWER, "yap", "--single-instance %s"); // And assume gsview for pdf and ps // gsview32 may not be in the path, but at least this helps a bit @@ -282,7 +282,7 @@ public final class ConfigurationDialog configureApp(ExternalApps.DVIPS, "dvips", "%s"); configureApp(ExternalApps.BIBTEX, "bibtex", "%s"); configureApp(ExternalApps.MAKEINDEX, "makeindex", "%s"); - configureApp(ExternalApps.MK4HT, "mk4ht", "oolatex %s"); + configureApp(ExternalApps.MK4HT, "mk4ht", "%c %s"); // We have several possible viewers String[] sDviViewers = {"evince", "okular", "xdvi"}; configureApp(ExternalApps.DVIVIEWER, sDviViewers, "%s"); diff --git a/source/java/org/openoffice/da/comp/writer4latex/DeTeXtive.java b/source/java/org/openoffice/da/comp/writer4latex/DeTeXtive.java new file mode 100644 index 0000000..f8b3c9b --- /dev/null +++ b/source/java/org/openoffice/da/comp/writer4latex/DeTeXtive.java @@ -0,0 +1,221 @@ +/************************************************************************ + * + * DeTeXtive.java + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * Copyright: 2002-2009 by Henrik Just + * + * All Rights Reserved. + * + * Version 1.2 (2009-06-19) + * + */ + +package org.openoffice.da.comp.writer4latex; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.IOException; +import java.util.HashSet; + +import org.openoffice.da.comp.w2lcommon.tex.tokenizer.Mouth; +import org.openoffice.da.comp.w2lcommon.tex.tokenizer.Token; +import org.openoffice.da.comp.w2lcommon.tex.tokenizer.TokenType; + +/** This class analyzes a stream and detects if it is a TeX stream. + * Currently it is able to identify LaTeX and XeLaTeX (ConTeXt and plain TeX may be + * added later). + */ +public class DeTeXtive { + private Mouth mouth; + private Token token; + + private HashSet packages; + + /** Construct a new DeTeXtive + */ + public DeTeXtive() { + } + + /** Detect the format of a given stream + * + * @param is the input stream + * @return a string representing the detected format; null if the format is unknown. + * Currently the values "LaTeX", "XeLaTeX" are supported. + * @throws IOException if we fail to read the stream + */ + public String deTeXt(InputStream is) throws IOException { + // It makes no harm to assume that the stream uses ISO Latin1 - we only consider ASCII characters + mouth = new Mouth(new InputStreamReader(is,"ISO8859_1")); + token = mouth.getTokenObject(); + + packages = new HashSet(); + + mouth.getToken(); + + if (parseHeader() && parsePreamble()) { + if (packages.contains("xunicode")) { + return "XeLaTeX"; + } + else { + return "LaTeX"; + } + } + + // Unknown format + return null; + + } + + // The parser! + + // Parse a LaTeX header such as \documentclass[a4paper]{article} + // Return true in case of success + private boolean parseHeader() throws IOException { + skipBlanks(); + if (token.isCS("documentclass") || token.isCS("documentstyle")) { + // The first non-blank token is \documentclass or \documentstyle => could be a LaTeX document + System.out.println("** Found "+token.toString()); + mouth.getToken(); + skipSpaces(); + // Skip options, if any + if (token.is('[',TokenType.OTHER)) { + skipOptional(); + skipSpaces(); + } + if (token.getType()==TokenType.BEGIN_GROUP) { + // Get class name + String sClassName = parseArgumentAsString(); + System.out.println("** Found the class name "+sClassName); + // Accept any class name of one or more characters + if (sClassName.length()>0) { return true; } + } + } + System.out.println("** Doesn't look like LaTeX; failed to get class name"); + return false; + } + + // Parse a LaTeX preamble + // Return true in case of success (that is, \begin{document} was found) + private boolean parsePreamble() throws IOException { + while (token.getType()!=TokenType.ENDINPUT) { + if (token.isCS("usepackage")) { + // We collect the names of all used packages, but discard their options + // (Recall that this is only relevant for LaTeX 2e) + mouth.getToken(); + skipSpaces(); + if (token.is('[',TokenType.OTHER)) { + skipOptional(); + skipSpaces(); + } + String sName = parseArgumentAsString(); + System.out.println("** Found package "+sName); + packages.add(sName); + } + else if (token.getType()==TokenType.BEGIN_GROUP) { + // We ignore anything inside a group + skipGroup(); + } + else if (token.isCS("begin")) { + // This would usually indicate the end of the preamble + mouth.getToken(); + skipSpaces(); + if ("document".equals(parseArgumentAsString())) { + System.out.println("Found \\begin{document}"); + return true; + } + } + else { + // Any other content in the preamble is simply ignored + mouth.getToken(); + } + } + System.out.println("** Doesn't look like LaTeX; failed to find \\begin{document}"); + return false; + } + + private void skipBlanks() throws IOException { + while (token.getType()==TokenType.SPACE || token.isCS("par")) { + mouth.getToken(); + } + } + + private void skipSpaces() throws IOException { + // Actually, we will never get two space tokens in a row + while (token.getType()==TokenType.SPACE) { + mouth.getToken(); + } + } + + private void skipOptional() throws IOException { + assert token.is('[', TokenType.OTHER); + + mouth.getToken(); // skip the [ + while (!token.is(']',TokenType.OTHER) && token.getType()!=TokenType.ENDINPUT) { + if (token.getType()==TokenType.BEGIN_GROUP) { + skipGroup(); + } + else { + mouth.getToken(); // skip this token + } + } + mouth.getToken(); // skip the ] + } + + private void skipGroup() throws IOException { + assert token.getType()==TokenType.BEGIN_GROUP; + + mouth.getToken(); // skip the { + while (token.getType()!=TokenType.END_GROUP && token.getType()!=TokenType.ENDINPUT) { + if (token.getType()==TokenType.BEGIN_GROUP) { + skipGroup(); + } + else { + mouth.getToken(); // skip this token + } + } + mouth.getToken(); // skip the } + } + + private String parseArgumentAsString() throws IOException { + if (token.getType()==TokenType.BEGIN_GROUP) { + // Argument is contained in a group + mouth.getToken(); // skip the { + StringBuilder sb = new StringBuilder(); + while (token.getType()!=TokenType.END_GROUP && token.getType()!=TokenType.ENDINPUT) { + if (token.getType()!=TokenType.COMMAND_SEQUENCE) { + // should not include cs, ignore if it happens + sb.append(token.getChar()); + } + mouth.getToken(); + } + mouth.getToken(); // skip the } + return sb.toString(); + } + else { + // Argument is a single token + String s = ""; + if (token.getType()!=TokenType.COMMAND_SEQUENCE) { + // should not include cs, ignore if it happens + s = token.getString(); + } + mouth.getToken(); + return s; + } + } + + +} diff --git a/source/java/org/openoffice/da/comp/writer4latex/ExternalApps.java b/source/java/org/openoffice/da/comp/writer4latex/ExternalApps.java index 1033ecf..b9204d1 100644 --- a/source/java/org/openoffice/da/comp/writer4latex/ExternalApps.java +++ b/source/java/org/openoffice/da/comp/writer4latex/ExternalApps.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.2 (2009-03-30) + * Version 1.2 (2009-06-19) * */ @@ -95,7 +95,7 @@ public class ExternalApps { public String[] getApplication(String sAppName) { return apps.get(sAppName); } - + /** Execute an external application * @param sAppName the name of the application to execute * @param sFileName the file name to use @@ -104,6 +104,18 @@ public class ExternalApps { * @return error code */ public int execute(String sAppName, String sFileName, File workDir, boolean bWaitFor) { + return execute(sAppName, "", sFileName, workDir, bWaitFor); + } + + /** Execute an external application + * @param sAppName the name of the application to execute + * @param sCommand subcommand/option to pass to the command + * @param sFileName the file name to use + * @param workDir the working directory to use + * @param bWaitFor true if the method should wait for the execution to finish + * @return error code + */ + public int execute(String sAppName, String sCommand, String sFileName, File workDir, boolean bWaitFor) { // Assemble the command String[] sApp = getApplication(sAppName); if (sApp==null) { return 1; } @@ -113,19 +125,13 @@ public class ExternalApps { command.add(sApp[0]); String[] sArguments = sApp[1].split(" "); for (String s : sArguments) { - command.add(s.replace("%s",sFileName)); + command.add(s.replace("%c",sCommand).replace("%s",sFileName)); } ProcessBuilder pb = new ProcessBuilder(command); - //Map env = pb.environment(); - //env.put("VAR1", "myValue"); pb.directory(workDir); Process proc = pb.start(); - - //Runtime rt = Runtime.getRuntime(); - //Process proc = rt.exec(sCommand, new String[0], workDir); - // Gobble the error stream of the application StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR"); diff --git a/source/java/org/openoffice/da/comp/writer4latex/TeXDetectService.java b/source/java/org/openoffice/da/comp/writer4latex/TeXDetectService.java index 89b932d..2c98120 100644 --- a/source/java/org/openoffice/da/comp/writer4latex/TeXDetectService.java +++ b/source/java/org/openoffice/da/comp/writer4latex/TeXDetectService.java @@ -20,25 +20,33 @@ * * All Rights Reserved. * - * Version 1.2 (2009-05-20) + * Version 1.2 (2009-06-19) * */ package org.openoffice.da.comp.writer4latex; +import java.io.IOException; + +import com.sun.star.lib.uno.adapter.XInputStreamToInputStreamAdapter; import com.sun.star.lib.uno.helper.WeakBase; import com.sun.star.beans.PropertyValue; import com.sun.star.document.XExtendedFilterDetection; -import com.sun.star.task.XStatusIndicator; +import com.sun.star.lang.XServiceInfo; +import com.sun.star.io.XInputStream; +import com.sun.star.ucb.XSimpleFileAccess2; import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; + + /** This class provides detect services for TeX documents * It is thus an implementation of the service com.sun.star.document.ExtendedTypeDetection */ -public class TeXDetectService extends WeakBase implements XExtendedFilterDetection { +public class TeXDetectService extends WeakBase implements XExtendedFilterDetection, XServiceInfo { // Constants @@ -47,17 +55,40 @@ public class TeXDetectService extends WeakBase implements XExtendedFilterDetecti public static final String __serviceName = "com.sun.star.document.ExtendedTypeDetection"; private static final String[] m_serviceNames = { __serviceName }; + // The type names + private static final String LATEX_FILE = "org.openoffice.da.writer4latex.LaTeX_File"; + private static final String XELATEX_FILE = "org.openoffice.da.writer4latex.XeLaTeX_File"; + // From constructor+initialization - private final XComponentContext m_xContext; +private final XComponentContext m_xContext; /** Construct a new TeXDetectService * * @param xContext The Component Context */ public TeXDetectService( XComponentContext xContext ) { - m_xContext = xContext; - } + m_xContext = xContext; + } + // Implement com.sun.star.lang.XServiceInfo: + public String getImplementationName() { + return __implementationName; + } + + public boolean supportsService( String sService ) { + int len = m_serviceNames.length; + + for(int i=0; i < len; i++) { + if (sService.equals(m_serviceNames[i])) + return true; + } + return false; + } + + public String[] getSupportedServiceNames() { + return m_serviceNames; + } + // Implement XExtendedFilterDetection public String detect(PropertyValue[][] mediaDescriptor) { // Read the media properties @@ -80,10 +111,66 @@ public class TeXDetectService extends WeakBase implements XExtendedFilterDetecti } } - if ("org.openoffice.da.writer4latex.LaTeX_File".equals(sTypeName)) { - return sTypeName; + // If there's no URL, we cannot verify the type (this should never happen on proper use of the service) + if (sURL==null) { + System.out.println("No URL given!"); + return ""; } - else { + + System.out.println("Asked to verify the type "+sTypeName); + // Also, we can only verify LaTeX and XeLaTeX + if (sTypeName==null || !(sTypeName.equals(LATEX_FILE) || sTypeName.equals(XELATEX_FILE))) { + return ""; + } + + // Initialise the file access + XSimpleFileAccess2 sfa2 = null; + try { + Object sfaObject = m_xContext.getServiceManager().createInstanceWithContext( + "com.sun.star.ucb.SimpleFileAccess", m_xContext); + sfa2 = (XSimpleFileAccess2) UnoRuntime.queryInterface(XSimpleFileAccess2.class, sfaObject); + } + catch (com.sun.star.uno.Exception e) { + // failed to get SimpleFileAccess service (should not happen) + System.out.println("Failed to get SFA service"); + return ""; + } + + // Get the input stream + XInputStreamToInputStreamAdapter is = null; + try { + XInputStream xis = sfa2.openFileRead(sURL); + is = new XInputStreamToInputStreamAdapter(xis); + } + catch (com.sun.star.ucb.CommandAbortedException e) { + // Failed to create input stream, cannot verify the type + System.out.println("Failed to get input stream"); + return ""; + } + catch (com.sun.star.uno.Exception e) { + // Failed to create input stream, cannot verify the type + System.out.println("Failed to get input stream"); + return ""; + } + + // Ask the deTeXtive + DeTeXtive deTeXtive = new DeTeXtive(); + try { + String sType = deTeXtive.deTeXt(is); + System.out.println("The DeTeXtive returned the type "+sType); + if ("LaTeX".equals(sType)) { + return LATEX_FILE; + } + else if ("XeLaTeX".equals(sType)) { + return XELATEX_FILE; + } + else { + return ""; + } + } + catch (IOException e) { + // Failed to read the stream, cannot verify the type + System.out.println("Failed to read the input stream"); return ""; } diff --git a/source/java/org/openoffice/da/comp/writer4latex/TeXImportFilter.java b/source/java/org/openoffice/da/comp/writer4latex/TeXImportFilter.java index a377dde..f620f36 100644 --- a/source/java/org/openoffice/da/comp/writer4latex/TeXImportFilter.java +++ b/source/java/org/openoffice/da/comp/writer4latex/TeXImportFilter.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.2 (2009-05-19) + * Version 1.2 (2009-06-19) * */ @@ -32,6 +32,7 @@ import java.net.URI; import com.sun.star.lib.uno.helper.WeakBase; import com.sun.star.document.XDocumentInsertable; +import com.sun.star.lang.XServiceInfo; import com.sun.star.task.XStatusIndicator; import com.sun.star.text.XTextCursor; import com.sun.star.text.XTextDocument; @@ -48,7 +49,7 @@ import com.sun.star.document.XFilter; /** This class implements an import filter for TeX documents using TeX4ht * It is thus an implementation of the service com.sun.star.document.ImportFilter */ -public class TeXImportFilter extends WeakBase implements XInitialization, XNamed, XImporter, XFilter { +public class TeXImportFilter extends WeakBase implements XInitialization, XNamed, XImporter, XFilter, XServiceInfo { // Constants @@ -282,7 +283,15 @@ public class TeXImportFilter extends WeakBase implements XInitialization, XNamed if (xStatus!=null) { xStatus.setValue(++nStep); } - externalApps.execute(ExternalApps.MK4HT, file.getName(), file.getParentFile(), true); + // Default is the filter org.openoffice.da.writer4latex.latex + String sCommand = "oolatex"; + if ("org.openoffice.da.writer4latex.xelatex".equals(m_sFilterName)) { + sCommand = "ooxelatex"; + } + + System.out.println("Executing tex4ht with command "+sCommand+" on file "+file.getName()); + + externalApps.execute(ExternalApps.MK4HT, sCommand, file.getName(), file.getParentFile(), true); if (xStatus!=null) { nStep+=5; xStatus.setValue(nStep); } diff --git a/source/java/org/openoffice/da/comp/writer4latex/Writer4LaTeX.java b/source/java/org/openoffice/da/comp/writer4latex/Writer4LaTeX.java index 7b2a044..1820a5c 100644 --- a/source/java/org/openoffice/da/comp/writer4latex/Writer4LaTeX.java +++ b/source/java/org/openoffice/da/comp/writer4latex/Writer4LaTeX.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.2 (2009-05-18) + * Version 1.2 (2009-06-19) * */ @@ -505,17 +505,78 @@ public final class Writer4LaTeX extends WeakBase String sResult = ""; for (int i=0; i='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='-' || c=='.') { + if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9')) { sResult += Character.toString(c); } - // TODO: Create replacement table for other latin characters.. - else if (c==' ') { sResult += "-"; } - else if (c=='\u00c6') { sResult += "AE"; } - else if (c=='\u00d8') { sResult += "OE"; } - else if (c=='\u00c5') { sResult += "AA"; } - else if (c=='\u00e6') { sResult += "ae"; } - else if (c=='\u00f8') { sResult += "oe"; } - else if (c=='\u00e5') { sResult += "aa"; } + else { + switch (c) { + case '.': sResult += "."; break; + case '-': sResult += "-"; break; + case ' ' : sResult += "-"; break; + case '_' : sResult += "-"; break; + // Replace accented and national characters + case '\u00c0' : sResult += "A"; break; + case '\u00c1' : sResult += "A"; break; + case '\u00c2' : sResult += "A"; break; + case '\u00c3' : sResult += "A"; break; + case '\u00c4' : sResult += "AE"; break; + case '\u00c5' : sResult += "AA"; break; + case '\u00c6' : sResult += "AE"; break; + case '\u00c7' : sResult += "C"; break; + case '\u00c8' : sResult += "E"; break; + case '\u00c9' : sResult += "E"; break; + case '\u00ca' : sResult += "E"; break; + case '\u00cb' : sResult += "E"; break; + case '\u00cc' : sResult += "I"; break; + case '\u00cd' : sResult += "I"; break; + case '\u00ce' : sResult += "I"; break; + case '\u00cf' : sResult += "I"; break; + case '\u00d0' : sResult += "D"; break; + case '\u00d1' : sResult += "N"; break; + case '\u00d2' : sResult += "O"; break; + case '\u00d3' : sResult += "O"; break; + case '\u00d4' : sResult += "O"; break; + case '\u00d5' : sResult += "O"; break; + case '\u00d6' : sResult += "OE"; break; + case '\u00d8' : sResult += "OE"; break; + case '\u00d9' : sResult += "U"; break; + case '\u00da' : sResult += "U"; break; + case '\u00db' : sResult += "U"; break; + case '\u00dc' : sResult += "UE"; break; + case '\u00dd' : sResult += "Y"; break; + case '\u00df' : sResult += "sz"; break; + case '\u00e0' : sResult += "a"; break; + case '\u00e1' : sResult += "a"; break; + case '\u00e2' : sResult += "a"; break; + case '\u00e3' : sResult += "a"; break; + case '\u00e4' : sResult += "ae"; break; + case '\u00e5' : sResult += "aa"; break; + case '\u00e6' : sResult += "ae"; break; + case '\u00e7' : sResult += "c"; break; + case '\u00e8' : sResult += "e"; break; + case '\u00e9' : sResult += "e"; break; + case '\u00ea' : sResult += "e"; break; + case '\u00eb' : sResult += "e"; break; + case '\u00ec' : sResult += "i"; break; + case '\u00ed' : sResult += "i"; break; + case '\u00ee' : sResult += "i"; break; + case '\u00ef' : sResult += "i"; break; + case '\u00f0' : sResult += "d"; break; + case '\u00f1' : sResult += "n"; break; + case '\u00f2' : sResult += "o"; break; + case '\u00f3' : sResult += "o"; break; + case '\u00f4' : sResult += "o"; break; + case '\u00f5' : sResult += "o"; break; + case '\u00f6' : sResult += "oe"; break; + case '\u00f8' : sResult += "oe"; break; + case '\u00f9' : sResult += "u"; break; + case '\u00fa' : sResult += "u"; break; + case '\u00fb' : sResult += "u"; break; + case '\u00fc' : sResult += "ue"; break; + case '\u00fd' : sResult += "y"; break; + case '\u00ff' : sResult += "y"; break; + } + } } if (sResult.length()==0) { return "writer4latex"; } else { return sResult; } diff --git a/source/oxt/writer4latex/w4l_filters.xcu b/source/oxt/writer4latex/w4l_filters.xcu index 1b8851a..aecbcca 100644 --- a/source/oxt/writer4latex/w4l_filters.xcu +++ b/source/oxt/writer4latex/w4l_filters.xcu @@ -15,6 +15,18 @@ + + XeLaTeX + org.openoffice.da.writer4latex.XeLaTeX_File + com.sun.star.text.TextDocument + org.openoffice.da.comp.writer4latex.TeXImportFilter + + IMPORT TEMPLATE TEMPLATEPATH ALIEN 3RDPARTYFILTER + + 0 + + + diff --git a/source/oxt/writer4latex/w4l_types.xcu b/source/oxt/writer4latex/w4l_types.xcu index 2889305..abd1426 100644 --- a/source/oxt/writer4latex/w4l_types.xcu +++ b/source/oxt/writer4latex/w4l_types.xcu @@ -13,6 +13,18 @@ org.openoffice.da.comp.writer4latex.TeXDetectService org.openoffice.da.writer4latex.latex + + + XeLaTeX File + + + + tex + true + org.openoffice.da.comp.writer4latex.TeXDetectService + org.openoffice.da.writer4latex.xelatex + +