From e3a808f820bd2611d9ebe379b01e2dca4330c080 Mon Sep 17 00:00:00 2001 From: henrikjust Date: Mon, 19 Mar 2012 21:01:15 +0000 Subject: [PATCH] Localization improvements and removing some unused code git-svn-id: svn://svn.code.sf.net/p/writer2latex/code/trunk@143 f0f2a975-2e09-46c8-9428-3b39399b9f3c --- build.xml | 5 +- source/distro/changelog.txt | 3 + source/distro/doc/user-manual.odt | Bin 52494 -> 52502 bytes .../writer2latex/api/ConverterFactory.java | 4 +- source/java/writer2latex/base/ConfigBase.java | 10 +- .../writer2latex/epub/ContainerWriter.java | 8 +- source/java/writer2latex/epub/NCXWriter.java | 6 +- source/java/writer2latex/epub/OPFWriter.java | 6 +- .../xhtml/BatchConverterImpl.java | 1 + source/java/writer2latex/xhtml/Converter.java | 1 + source/java/writer2latex/xhtml/L10n.java | 325 ------------ .../writer2latex/xhtml/TextConverter.java | 1 + source/java/writer2latex/xhtml/l10n/L10n.java | 88 ++++ .../xhtml/l10n/XhtmlStrings.properties | 11 + .../xhtml/l10n/XhtmlStrings_ca.properties | 11 + .../xhtml/l10n/XhtmlStrings_cs.properties | 11 + .../xhtml/l10n/XhtmlStrings_da.properties | 11 + .../xhtml/l10n/XhtmlStrings_de.properties | 11 + .../xhtml/l10n/XhtmlStrings_en.properties | 11 + .../xhtml/l10n/XhtmlStrings_es.properties | 11 + .../xhtml/l10n/XhtmlStrings_fa.properties | 11 + .../xhtml/l10n/XhtmlStrings_fi.properties | 11 + .../xhtml/l10n/XhtmlStrings_fr.properties | 11 + .../xhtml/l10n/XhtmlStrings_hr.properties | 11 + .../xhtml/l10n/XhtmlStrings_it.properties | 11 + .../xhtml/l10n/XhtmlStrings_nl.properties | 11 + .../xhtml/l10n/XhtmlStrings_nn.properties | 11 + .../xhtml/l10n/XhtmlStrings_pl.properties | 11 + .../xhtml/l10n/XhtmlStrings_pt_BR.properties | 11 + .../xhtml/l10n/XhtmlStrings_ru.properties | 11 + .../xhtml/l10n/XhtmlStrings_tr.properties | 11 + .../xhtml/l10n/XhtmlStrings_uk.properties | 11 + .../java/writer2latex/xmerge/DOMDocument.java | 213 ++++---- .../xmerge/EmbeddedBinaryObject.java | 40 +- .../writer2latex/xmerge/EmbeddedObject.java | 23 +- .../xmerge/EmbeddedXMLObject.java | 89 +--- .../writer2latex/xmerge/NewDOMDocument.java | 160 ------ .../writer2latex/xmerge/OfficeDocument.java | 482 +----------------- .../java/writer2latex/xmerge/OfficeZip.java | 203 +------- 39 files changed, 435 insertions(+), 1442 deletions(-) delete mode 100644 source/java/writer2latex/xhtml/L10n.java create mode 100644 source/java/writer2latex/xhtml/l10n/L10n.java create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_ca.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_cs.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_da.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_de.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_en.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_es.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_fa.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_fi.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_fr.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_hr.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_it.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_nl.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_nn.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_pl.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_pt_BR.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_ru.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_tr.properties create mode 100644 source/java/writer2latex/xhtml/l10n/XhtmlStrings_uk.properties delete mode 100644 source/java/writer2latex/xmerge/NewDOMDocument.java diff --git a/build.xml b/build.xml index 6757c99..7d893c7 100644 --- a/build.xml +++ b/build.xml @@ -2,7 +2,7 @@ ############################################################################ # This is the Ant build file for writer2latex # Original: Sep 2004 (mgn) - # version 1.4 (2012-03-13) + # version 1.4 (2012-03-16) ############################################################################ --> @@ -76,6 +76,7 @@ + @@ -91,6 +92,7 @@ + @@ -166,6 +168,7 @@ + diff --git a/source/distro/changelog.txt b/source/distro/changelog.txt index b7a3409..09b8930 100644 --- a/source/distro/changelog.txt +++ b/source/distro/changelog.txt @@ -2,3 +2,6 @@ Changelog for Writer2LaTeX version 1.2 -> 1.4 ---------- version 1.3.1 alpha ---------- +[all] Removed unused code in writer2latex.xmerge + +[w2x] Moved localized strings to .properties files \ No newline at end of file diff --git a/source/distro/doc/user-manual.odt b/source/distro/doc/user-manual.odt index fc4000eee8195687de6adc92dabfe6f4b661755e..4c0025071688468cb25add87b0a7ab8f1e427047 100644 GIT binary patch delta 43731 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 delta 43786 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 diff --git a/source/java/writer2latex/base/ConfigBase.java b/source/java/writer2latex/base/ConfigBase.java index 66d8d7b..eeab8d0 100644 --- a/source/java/writer2latex/base/ConfigBase.java +++ b/source/java/writer2latex/base/ConfigBase.java @@ -16,11 +16,11 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * - * Copyright: 2002-2009 by Henrik Just + * Copyright: 2002-2012 by Henrik Just * * All Rights Reserved. * - * Version 1.2 (2009-09-24) + * Version 1.4 (2012-03-19) * */ @@ -46,7 +46,7 @@ import org.w3c.dom.Element; import org.w3c.dom.DOMImplementation; import writer2latex.api.ComplexOption; -import writer2latex.xmerge.NewDOMDocument; +import writer2latex.xmerge.DOMDocument; public abstract class ConfigBase implements writer2latex.api.Config { @@ -112,7 +112,7 @@ public abstract class ConfigBase implements writer2latex.api.Config { * @param is the input stream to read the configuration from */ public void read(InputStream is) throws IOException { - NewDOMDocument doc = new NewDOMDocument("config",".xml"); + DOMDocument doc = new DOMDocument("config",".xml"); doc.read(is); // may throw an IOException Document dom = doc.getContentDOM(); if (dom==null) { @@ -147,7 +147,7 @@ public abstract class ConfigBase implements writer2latex.api.Config { protected abstract void readInner(Element elm); public void write(OutputStream os) throws IOException { - NewDOMDocument doc = new NewDOMDocument("config",".xml"); + DOMDocument doc = new DOMDocument("config",".xml"); Document dom = null; try { DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); diff --git a/source/java/writer2latex/epub/ContainerWriter.java b/source/java/writer2latex/epub/ContainerWriter.java index 7ef3682..a817db2 100644 --- a/source/java/writer2latex/epub/ContainerWriter.java +++ b/source/java/writer2latex/epub/ContainerWriter.java @@ -16,11 +16,11 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * - * Copyright: 2001-2010 by Henrik Just + * Copyright: 2001-2012 by Henrik Just * * All Rights Reserved. * - * version 1.2 (2010-03-29) + * version 1.4 (2012-03-19) * */ @@ -35,12 +35,12 @@ import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; -import writer2latex.xmerge.NewDOMDocument; +import writer2latex.xmerge.DOMDocument; /** This class creates the required META-INF/container.xml file for an EPUB package * (see http://www.idpf.org/ocf/ocf1.0/download/ocf10.htm). */ -public class ContainerWriter extends NewDOMDocument { +public class ContainerWriter extends DOMDocument { public ContainerWriter() { super("container", "xml"); diff --git a/source/java/writer2latex/epub/NCXWriter.java b/source/java/writer2latex/epub/NCXWriter.java index 4e49844..7e14697 100644 --- a/source/java/writer2latex/epub/NCXWriter.java +++ b/source/java/writer2latex/epub/NCXWriter.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * version 1.2 (2012-02-22) + * version 1.4 (2012-03-19) * */ @@ -40,12 +40,12 @@ import org.w3c.dom.Element; import writer2latex.api.ContentEntry; import writer2latex.api.ConverterResult; import writer2latex.util.Misc; -import writer2latex.xmerge.NewDOMDocument; +import writer2latex.xmerge.DOMDocument; /** This class creates the required NXC file for an EPUB document * (see http://www.idpf.org/2007/opf/OPF_2.0_final_spec.html#Section2.4). */ -public class NCXWriter extends NewDOMDocument { +public class NCXWriter extends DOMDocument { public NCXWriter(ConverterResult cr, String sUUID) { super("book", "ncx"); diff --git a/source/java/writer2latex/epub/OPFWriter.java b/source/java/writer2latex/epub/OPFWriter.java index c2e93ec..3ecc045 100644 --- a/source/java/writer2latex/epub/OPFWriter.java +++ b/source/java/writer2latex/epub/OPFWriter.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * version 1.2 (2012-02-26) + * version 1.4 (2012-03-19) * */ @@ -44,11 +44,11 @@ import writer2latex.api.ContentEntry; import writer2latex.api.ConverterResult; import writer2latex.api.OutputFile; import writer2latex.util.Misc; -import writer2latex.xmerge.NewDOMDocument; +import writer2latex.xmerge.DOMDocument; /** This class writes an OPF-file for an EPUB document (see http://www.idpf.org/2007/opf/OPF_2.0_final_spec.html). */ -public class OPFWriter extends NewDOMDocument { +public class OPFWriter extends DOMDocument { private String sUID=null; public OPFWriter(ConverterResult cr) { diff --git a/source/java/writer2latex/xhtml/BatchConverterImpl.java b/source/java/writer2latex/xhtml/BatchConverterImpl.java index 37bb9c8..db3e7b3 100644 --- a/source/java/writer2latex/xhtml/BatchConverterImpl.java +++ b/source/java/writer2latex/xhtml/BatchConverterImpl.java @@ -37,6 +37,7 @@ import org.w3c.dom.Element; import writer2latex.api.IndexPageEntry; import writer2latex.api.OutputFile; import writer2latex.base.BatchConverterBase; +import writer2latex.xhtml.l10n.L10n; /** * Implementation of writer2latex.api.BatchConverter for diff --git a/source/java/writer2latex/xhtml/Converter.java b/source/java/writer2latex/xhtml/Converter.java index 7267ef6..f0bc129 100644 --- a/source/java/writer2latex/xhtml/Converter.java +++ b/source/java/writer2latex/xhtml/Converter.java @@ -60,6 +60,7 @@ import writer2latex.office.StyleWithProperties; import writer2latex.office.XMLString; import writer2latex.util.ExportNameCollection; import writer2latex.util.Misc; +import writer2latex.xhtml.l10n.L10n; /** *

This class converts an OpenDocument file to an XHTML(+MathML) or EPUB document.

diff --git a/source/java/writer2latex/xhtml/L10n.java b/source/java/writer2latex/xhtml/L10n.java deleted file mode 100644 index d965c76..0000000 --- a/source/java/writer2latex/xhtml/L10n.java +++ /dev/null @@ -1,325 +0,0 @@ -/************************************************************************ - * - * L10n.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-2011 by Henrik Just - * - * All Rights Reserved. - * - * Version 1.2 (2011-07-25) - * - */ - -package writer2latex.xhtml; - -import java.util.Locale; - -// This class handles localized strings (used for navigation) -public class L10n { - public final static int UP = 0; - public final static int FIRST = 1; - public final static int PREVIOUS = 2; - public final static int NEXT = 3; - public final static int LAST = 4; - public final static int CONTENTS = 5; - public final static int INDEX = 6; - public final static int HOME = 7; - public final static int DIRECTORY = 8; - public final static int DOCUMENT = 9; - - private Locale locale = null; - private String sLocale="en-US"; - - public void setLocale(String sLanguage, String sCountry) { - if (sLanguage!=null) { - if (sCountry!=null) { - locale = new Locale(sLanguage,sCountry); - } - else { - locale = new Locale(sLanguage); - } - } - else { - locale = Locale.getDefault(); - } - - if (locale.getCountry().length()>0) { - sLocale = locale.getLanguage()+"-"+locale.getCountry(); - } - else { - sLocale = locale.getLanguage(); - } - } - - public Locale getLocale() { - return locale; - } - - public String get(int nString) { - if (sLocale.startsWith("de")) { // German - switch (nString) { - case UP: return "Nach oben"; - case FIRST : return "Anfang"; - case PREVIOUS : return "Vorheriges"; - case NEXT : return "N\u00e4chstes"; - case LAST : return "Ende"; - case CONTENTS : return "Inhalte"; - case INDEX : return "Index"; - case HOME : return "Home"; - case DIRECTORY: return "Verzeichnis"; - case DOCUMENT: return "Dokument"; - } - } - if (sLocale.startsWith("fr")) { // French - switch (nString) { - case UP: return "Haut"; - case FIRST : return "D\u00e9but"; - case PREVIOUS : return "Pr\u00e9c\u00e9dent"; - case NEXT : return "Suivant"; - case LAST : return "Dernier"; - case CONTENTS : return "Contenus"; - case INDEX : return "Index"; - case HOME : return "Documents Personnels"; - case DIRECTORY: return "R\u00e9pertoire"; - case DOCUMENT: return "Document"; - } - } - if (sLocale.startsWith("es")) { // Spanish - switch (nString) { - case UP: return "Arriba"; - case FIRST : return "Primero"; - case PREVIOUS : return "Previo"; - case NEXT : return "Siguiente"; - case LAST : return "\u00daltimo"; - case CONTENTS : return "Contenido"; - case INDEX : return "\u00cdndice"; - case HOME : return "Inicio"; - case DIRECTORY: return "Directorio"; - case DOCUMENT: return "Documento"; - } - } - if (sLocale.startsWith("it")) { // Italian - switch (nString) { - case UP: return "Su"; - case FIRST : return "Inizio"; - case PREVIOUS : return "Precedente"; - case NEXT : return "Successivo"; - case LAST : return "Fine"; - case CONTENTS : return "Sommario"; - case INDEX : return "Indice"; - case HOME : return "Home"; - case DIRECTORY: return "Cartella"; - case DOCUMENT: return "Documento"; - } - } - if (sLocale.startsWith("pt")) { // (Brazilian) Portuguese - switch (nString) { - case UP: return "Acima"; - case FIRST : return "Primeiro"; - case PREVIOUS : return "Anterior"; - case NEXT : return "Pr\u00f3ximo"; - case LAST : return "\u00daltimo"; - case CONTENTS : return "Conte\u00fado"; - case INDEX : return "\u00cdndice"; - case HOME : return "Home"; - case DIRECTORY: return "Diret\u00f3rio"; - case DOCUMENT: return "Documento"; - } - } - if (sLocale.startsWith("cs")) { // Czech - switch (nString) { - case UP: return "Nahoru"; - case FIRST : return "Prvn\u00ed"; - case PREVIOUS : return "P\u0159edchoz\u00ed"; - case NEXT : return "Dal\u0161\u00ed"; - case LAST : return "Posledn\u00ed"; - case CONTENTS : return "Obsah"; - case INDEX : return "Rejst\u0159\u00edk"; - case HOME : return "Dom\u016f"; - case DIRECTORY: return "Adres\u00e1\u0159 (slo\u017eka)"; - case DOCUMENT: return "Dokument"; - } - } - if (sLocale.startsWith("nl")) { // Dutch - switch (nString) { - case UP: return "Omhoog"; - case FIRST : return "Eerste"; - case PREVIOUS : return "Vorige"; - case NEXT : return "Volgende"; - case LAST : return "Laatste"; - case CONTENTS : return "Inhoud"; - case INDEX : return "Index"; - case HOME : return "Hoofdpagina"; - case DIRECTORY: return "Directory"; - case DOCUMENT: return "Document"; - } - } - if (sLocale.startsWith("da")) { // Danish - switch (nString) { - case UP: return "Op"; - case FIRST : return "F\u00F8rste"; - case PREVIOUS : return "Forrige"; - case NEXT : return "N\u00E6ste"; - case LAST : return "Sidste"; - case CONTENTS : return "Indhold"; - case INDEX : return "Stikord"; - case HOME : return "Hjem"; - case DIRECTORY: return "Mappe"; - case DOCUMENT: return "Dokument"; - } - } - if (sLocale.startsWith("nn")) { // Nynorsk - switch (nString) { - case UP: return "Opp"; - case FIRST : return "F\u00f8rste"; - case PREVIOUS : return "Forrige"; - case NEXT : return "Neste"; - case LAST : return "Siste"; - case CONTENTS : return "Innhald"; - case INDEX : return "Register"; - case HOME : return "Heim"; - case DIRECTORY: return "Mappe"; - case DOCUMENT: return "Dokument"; - } - } - if (sLocale.startsWith("pl")) { // Polish - switch (nString) { - case UP: return "W g\u00f3r\u0119"; - case FIRST : return "Pierwsza"; - case PREVIOUS : return "Poprzednia"; - case NEXT : return "Nast\u0119pna"; - case LAST : return "Ostatnia"; - case CONTENTS : return "Spis tre\u015bci"; - case INDEX : return "Indeks"; - case HOME : return "Pocz\u0105tek"; - case DIRECTORY: return "Katalog"; - case DOCUMENT: return "Dokument"; - } - } - if (sLocale.startsWith("fi")) { // Finnish - switch (nString) { - case UP: return "Yl\u00f6s"; - case FIRST : return "Ensimm\u00e4inen"; - case PREVIOUS : return "Edellinen"; - case NEXT : return "Seuraava"; - case LAST : return "Viimeinen"; - case CONTENTS : return "Sis\u00e4lt\u00f6"; - case INDEX : return "Indeksi"; - case HOME : return "Koti"; - case DIRECTORY: return "Hakemisto"; - case DOCUMENT: return "Dokumentti"; - } - } - if (sLocale.startsWith("ca")) { // Catalan - switch (nString) { - case UP: return "Amunt"; - case FIRST : return "Comen\u00e7ament"; - case PREVIOUS : return "Precedent"; - case NEXT : return "Seg\u00fcent"; - case LAST: return "Darrer"; - case CONTENTS : return "Contingut"; - case INDEX : return "\u00cdndex"; - case HOME : return "Arrel"; - case DIRECTORY: return "Directori"; - case DOCUMENT: return "Document"; - } - } - if (sLocale.startsWith("ru")) { // Russian - switch (nString) { - case UP: return "\u0412\u0432\u0435\u0440\u0445"; - case FIRST : return "\u041f\u0435\u0440\u0432\u0430\u044f"; - case PREVIOUS : return "\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f"; - case NEXT : return "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f"; - case LAST : return "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f"; - case CONTENTS : return "\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435"; - case INDEX : return "\u0421\u043f\u0438\u0441\u043e\u043a"; - case HOME : return "\u0414\u043e\u043c\u043e\u0439"; - case DIRECTORY: return "\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f"; - case DOCUMENT: return "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442"; - } - } - if (sLocale.startsWith("uk")) { // Ukrainian - switch (nString) { - case UP: return "\u041d\u0430\u0433\u043e\u0440\u0443"; - case FIRST : return "\u041f\u0435\u0440\u0448\u0430"; - case PREVIOUS : return "\u041f\u043e\u043f\u0435\u0440\u0435\u0434\u043d\u044f"; - case NEXT : return "\u041d\u0430\u0441\u0442\u0443\u043f\u043d\u0430"; - case LAST : return "\u041e\u0441\u0442\u0430\u043d\u043d\u044f"; - case CONTENTS : return "\u0417\u043c\u0456\u0441\u0442"; - case INDEX : return "\u0421\u043f\u0438\u0441\u043e\u043a"; - case HOME : return "\u0414\u043e\u0434\u043e\u043c\u0443"; - case DIRECTORY: return "\u0422\u0435\u043a\u0430"; - case DOCUMENT: return "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442"; - } - } - if (sLocale.startsWith("tr")) { // Turkish - switch (nString) { - case UP: return "Yukar\u0131"; - case FIRST : return "\u0130lk"; - case PREVIOUS : return "\u00d6nceki"; - case NEXT : return "Sonraki"; - case LAST : return "Son"; - case CONTENTS : return "\u0130\u00e7indekiler"; - case INDEX : return "\u0130ndeks"; - case HOME : return "Ev"; - case DIRECTORY: return "Klas\u00f6r"; - case DOCUMENT: return "D\u00f6k\u00fcman"; - } - } - if (sLocale.startsWith("hr")) { // Croatian - switch (nString) { - case UP: return "Up"; - case FIRST : return "Prvi"; - case PREVIOUS : return "Prethodan"; - case NEXT : return "slijede\u0107i"; - case LAST : return "Zadnji"; - case CONTENTS : return "Sadr\u017Eaj"; - case INDEX : return "Indeks"; - case DIRECTORY: return "Directory"; - case DOCUMENT: return "Document"; - } - } - if (sLocale.startsWith("fa")) { // Farsi - switch (nString) { - case UP: return "\u0628\u0627\u0644\u0627"; - case FIRST : return "\u0627\u0648\u0644"; - case PREVIOUS : return "\u0642\u0628\u0644\u06cc"; - case NEXT : return "\u0628\u0639\u062f\u06cc"; - case LAST : return "\u0627\u062e\u0631\u06cc\u0646"; - //case CONTENTS : return "??"; - case INDEX : return "\u0641\u0647\u0631\u0633\u062a"; - case HOME : return "\u062e\u0627\u0646\u0647"; - case DIRECTORY: return "\u067e\u0648\u0634\u0647"; - case DOCUMENT: return "\u0645\u0633\u062a\u0646\u062f"; - } - } - // English - default - switch (nString) { - case UP: return "Up"; - case FIRST : return "First"; - case PREVIOUS : return "Previous"; - case NEXT : return "Next"; - case LAST: return "Last"; - case CONTENTS : return "Contents"; - case INDEX : return "Index"; - case HOME : return "Home"; - case DIRECTORY: return "Directory"; - case DOCUMENT: return "Document"; - } - return "???"; - } -} diff --git a/source/java/writer2latex/xhtml/TextConverter.java b/source/java/writer2latex/xhtml/TextConverter.java index 591ecf3..87928f9 100644 --- a/source/java/writer2latex/xhtml/TextConverter.java +++ b/source/java/writer2latex/xhtml/TextConverter.java @@ -40,6 +40,7 @@ import org.w3c.dom.NodeList; import org.w3c.dom.Element; import writer2latex.util.Misc; +import writer2latex.xhtml.l10n.L10n; import writer2latex.office.FontDeclaration; import writer2latex.office.OfficeStyle; import writer2latex.office.XMLString; diff --git a/source/java/writer2latex/xhtml/l10n/L10n.java b/source/java/writer2latex/xhtml/l10n/L10n.java new file mode 100644 index 0000000..0eb0946 --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/L10n.java @@ -0,0 +1,88 @@ +/************************************************************************ + * + * L10n.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-2012 by Henrik Just + * + * All Rights Reserved. + * + * Version 1.4 (2012-03-16) + * + */ + +package writer2latex.xhtml.l10n; + +import java.util.Locale; +import java.util.ResourceBundle; + +/* This class handles localized strings (used for navigation links in the exported document) + * Note that the US-English strings need duplicated due to ResourceBundles' search order. + * Default strings are needed for the special case that neither strings for the document language, + * nor for the system default language are available. + * US-English strings are needed if the document language is English and the system locale is not. + */ +public class L10n { + public final static int UP = 0; + public final static int FIRST = 1; + public final static int PREVIOUS = 2; + public final static int NEXT = 3; + public final static int LAST = 4; + public final static int CONTENTS = 5; + public final static int INDEX = 6; + public final static int HOME = 7; + public final static int DIRECTORY = 8; + public final static int DOCUMENT = 9; + + private ResourceBundle resourceBundle = ResourceBundle.getBundle("writer2latex.xhtml.l10n.XhtmlStrings",Locale.getDefault()); + private Locale locale = null; + + public void setLocale(String sLanguage, String sCountry) { + if (sLanguage!=null) { + if (sCountry!=null) { + locale = new Locale(sLanguage,sCountry); + } + else { + locale = new Locale(sLanguage); + } + } + else { + locale = Locale.getDefault(); + } + + resourceBundle = ResourceBundle.getBundle("writer2latex.xhtml.l10n.XhtmlStrings",locale); + } + + public Locale getLocale() { + return locale; + } + + public String get(int nString) { + switch (nString) { + case UP: return resourceBundle.getString("up"); + case FIRST : return resourceBundle.getString("first"); + case PREVIOUS : return resourceBundle.getString("previous"); + case NEXT : return resourceBundle.getString("next"); + case LAST : return resourceBundle.getString("last"); + case CONTENTS : return resourceBundle.getString("contents"); + case INDEX : return resourceBundle.getString("index"); + case HOME : return resourceBundle.getString("home"); + case DIRECTORY: return resourceBundle.getString("directory"); + case DOCUMENT: return resourceBundle.getString("document"); + default: return "???"; + } + } +} diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings.properties new file mode 100644 index 0000000..6eb3ec7 --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Up +first=First +previous=Previous +next=Next +last=Last +contents=Contents +index=Index +home=Home +directory=Directory +document=Document diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_ca.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_ca.properties new file mode 100644 index 0000000..3527740 --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_ca.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Amunt +first=Comen\u00e7ament +previous=Precedent +next=Seg\u00fcent +last=Darrer +contents=Contingut +index=\u00cdndex +home=Arrel +directory=Directori +document=Document diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_cs.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_cs.properties new file mode 100644 index 0000000..baaf1e1 --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_cs.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Nahoru +first=Prvn\u00ed +previous=P\u0159edchoz\u00ed +next=Dal\u0161\u00ed +last=Posledn\u00ed +contents=Obsah +index=Rejst\u0159\u00edk +home=Dom\u016f +directory=Adres\u00e1\u0159 (slo\u017eka) +document=Dokument diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_da.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_da.properties new file mode 100644 index 0000000..5560d9c --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_da.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Op +first=F\u00F8rste +previous=Forrige +next=N\u00E6ste +last=Sidste +contents=Indhold +index=Stikord +home=Hjem +directory=Mappe +document=Dokument diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_de.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_de.properties new file mode 100644 index 0000000..305fd07 --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_de.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Nach oben +first=Anfang +previous=Vorheriges +next=N\u00e4chstes +last=Ende +contents=Inhalte +index=Index +home=Home +directory=Verzeichnis +document=Dokument \ No newline at end of file diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_en.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_en.properties new file mode 100644 index 0000000..6eb3ec7 --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_en.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Up +first=First +previous=Previous +next=Next +last=Last +contents=Contents +index=Index +home=Home +directory=Directory +document=Document diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_es.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_es.properties new file mode 100644 index 0000000..4f816ce --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_es.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Arriba +first=Primero +previous=Previo +next=Siguiente +last=\u00daltimo +contents=Contenido +index=\u00cdndice +home=Inicio +directory=Directorio +document=Documento diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_fa.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_fa.properties new file mode 100644 index 0000000..5d97925 --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_fa.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=\u0628\u0627\u0644\u0627 +first=\u0627\u0648\u0644 +previous=\u0642\u0628\u0644\u06cc +next=\u0628\u0639\u062f\u06cc +last=\u0627\u062e\u0631\u06cc\u0646 +contents=Contents +index=\u0641\u0647\u0631\u0633\u062a +home=\u062e\u0627\u0646\u0647 +directory=\u067e\u0648\u0634\u0647 +document=\u0645\u0633\u062a\u0646\u062f diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_fi.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_fi.properties new file mode 100644 index 0000000..c86eaf4 --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_fi.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Yl\u00f6s +first=Ensimm\u00e4inen +previous=Edellinen +next=Seuraava +last=Viimeinen +contents=Sis\u00e4lt\u00f6 +index=Indeksi +home=Koti +directory=Hakemisto +document=Dokumentti diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_fr.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_fr.properties new file mode 100644 index 0000000..020bbeb --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_fr.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Haut +first=D\u00e9but +previous=Pr\u00e9c\u00e9dent +next=Suivant +last=Dernier +contents=Contenus +index=Index +home=Documents Personnels +directory=R\u00e9pertoire +document=Document diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_hr.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_hr.properties new file mode 100644 index 0000000..9af6c19 --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_hr.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Up +first=Prvi +previous=Prethodan +next=slijede\u0107i +last=Zadnji +contents=Sadr\u017Eaj +index=Indeks +home=Home +directory=Directory +document=Document diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_it.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_it.properties new file mode 100644 index 0000000..d6f7df8 --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_it.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Su +first=Inizio +previous=Precedente +next=Successivo +last=Fine +contents=Sommario +index=Indice +home=Home +directory=Cartella +document=Documento diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_nl.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_nl.properties new file mode 100644 index 0000000..b135ca5 --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_nl.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Omhoog +first=Eerste +previous=Vorige +next=Volgende +last=Laatste +contents=Inhoud +index=Index +home=Hoofdpagina +directory=Directory +document=Document diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_nn.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_nn.properties new file mode 100644 index 0000000..53e41bc --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_nn.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Opp +first=F\u00f8rste +previous=Forrige +next=Neste +last=Siste +contents=Innhald +index=Register +home=Heim +directory=Mappe +document=Dokument diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_pl.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_pl.properties new file mode 100644 index 0000000..90e56b3 --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_pl.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=W g\u00f3r\u0119 +first=Pierwsza +previous=Poprzednia +next=Nast\u0119pna +last=Ostatnia +contents=Spis tre\u015bci +index=Indeks +home=Pocz\u0105tek +directory=Katalog +document=Dokument diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_pt_BR.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_pt_BR.properties new file mode 100644 index 0000000..5430643 --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_pt_BR.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Acima +first=Primeiro +previous=Anterior +next=Pr\u00f3ximo +last=\u00daltimo +contents=Conte\u00fado +index=\u00cdndice +home=Home +directory=Diret\u00f3rio +document=Documento diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_ru.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_ru.properties new file mode 100644 index 0000000..f95b19b --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_ru.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=\u0412\u0432\u0435\u0440\u0445 +first=\u041f\u0435\u0440\u0432\u0430\u044f +previous=\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f +next=\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f +last=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f +contents=\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 +index=\u0421\u043f\u0438\u0441\u043e\u043a +home=\u0414\u043e\u043c\u043e\u0439 +directory=\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f +document=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_tr.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_tr.properties new file mode 100644 index 0000000..a8b97d8 --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_tr.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=Yukar\u0131 +first=\u0130lk +previous=\u00d6nceki +next=Sonraki +last=Son +contents=\u0130\u00e7indekiler +index=\u0130ndeks +home=Ev +directory=Klas\u00f6r +document=D\u00f6k\u00fcman diff --git a/source/java/writer2latex/xhtml/l10n/XhtmlStrings_uk.properties b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_uk.properties new file mode 100644 index 0000000..d40391b --- /dev/null +++ b/source/java/writer2latex/xhtml/l10n/XhtmlStrings_uk.properties @@ -0,0 +1,11 @@ +# XHTML specific strings for Writer2LaTeX +up=\u041d\u0430\u0433\u043e\u0440\u0443 +first=\u041f\u0435\u0440\u0448\u0430 +previous=\u041f\u043e\u043f\u0435\u0440\u0435\u0434\u043d\u044f +next=\u041d\u0430\u0441\u0442\u0443\u043f\u043d\u0430 +last=\u041e\u0441\u0442\u0430\u043d\u043d\u044f +contents=\u0417\u043c\u0456\u0441\u0442 +index=\u0421\u043f\u0438\u0441\u043e\u043a +home=\u0414\u043e\u0434\u043e\u043c\u0443 +directory=\u0422\u0435\u043a\u0430 +document=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 diff --git a/source/java/writer2latex/xmerge/DOMDocument.java b/source/java/writer2latex/xmerge/DOMDocument.java index 3ab26d0..7103fca 100644 --- a/source/java/writer2latex/xmerge/DOMDocument.java +++ b/source/java/writer2latex/xmerge/DOMDocument.java @@ -37,26 +37,24 @@ ************************************************************************/ // This version is adapted for writer2latex -// Version 1.2 (2010-03-15) +// Version 1.4 (2012-03-19) package writer2latex.xmerge; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; -//import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; -//import java.io.ByteArrayInputStream; -//import java.io.IOException; - +import java.io.OutputStreamWriter; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.ParserConfigurationException; +import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.Element; import org.w3c.dom.Document; +import org.w3c.dom.NodeList; import org.xml.sax.SAXException; //import org.xml.sax.SAXParseException; @@ -221,133 +219,106 @@ public class DOMDocument } } - /** * Write out content to the supplied OutputStream. - * + * (with pretty printing) * @param os XML OutputStream. - * * @throws IOException If any I/O error occurs. */ public void write(OutputStream os) throws IOException { - - // set bytes for writing to output stream - byte contentBytes[] = docToBytes(contentDoc); - - os.write(contentBytes); + OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8"); + osw.write("\n"); + write(getContentDOM().getDocumentElement(),0,osw); + osw.flush(); + osw.close(); } - - /** - *

Write out a org.w3c.dom.Document object into a - * byte array.

- * - *

TODO: remove dependency on com.sun.xml.tree.XmlDocument - * package!

- * - * @param Document DOM Document object. - * - * @return byte array of DOM Document - * object. - * - * @throws IOException If any I/O error occurs. - */ - private byte[] docToBytes(Document doc) - throws IOException { - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - java.lang.reflect.Constructor con; - java.lang.reflect.Method meth; - - String domImpl = doc.getClass().getName(); - - /* - * We may have multiple XML parsers in the Classpath. - * Depending on which one is first, the actual type of - * doc may vary. Need a way to find out which API is being - * used and use an appropriate serialization method. - */ - try { - // First of all try for JAXP 1.0 - if (domImpl.equals("com.sun.xml.tree.XmlDocument")) { - Class jaxpDoc = Class.forName("com.sun.xml.tree.XmlDocument"); - - // The method is in the XMLDocument class itself, not a helper - meth = jaxpDoc.getMethod("write", - new Class[] { Class.forName("java.io.OutputStream") } ); - - meth.invoke(doc, new Object [] { baos } ); - } - else if (domImpl.equals("org.apache.crimson.tree.XmlDocument")) - { - Class crimsonDoc = Class.forName("org.apache.crimson.tree.XmlDocument"); - // The method is in the XMLDocument class itself, not a helper - meth = crimsonDoc.getMethod("write", - new Class[] { Class.forName("java.io.OutputStream") } ); - - meth.invoke(doc, new Object [] { baos } ); - } - else if (domImpl.equals("org.apache.xerces.dom.DocumentImpl") - || domImpl.equals("org.apache.xerces.dom.DeferredDocumentImpl")) { - // Try for Xerces - Class xercesSer = - Class.forName("org.apache.xml.serialize.XMLSerializer"); - - // Get the OutputStream constructor - // May want to use the OutputFormat parameter at some stage too - con = xercesSer.getConstructor(new Class [] - { Class.forName("java.io.OutputStream"), - Class.forName("org.apache.xml.serialize.OutputFormat") } ); - - - // Get the serialize method - meth = xercesSer.getMethod("serialize", - new Class [] { Class.forName("org.w3c.dom.Document") } ); - - - // Get an instance - Object serializer = con.newInstance(new Object [] { baos, null } ); - - - // Now call serialize to write the document - meth.invoke(serializer, new Object [] { doc } ); - } - else if (domImpl.equals("gnu.xml.dom.DomDocument")) { - - Class gnuSer = Class.forName("gnu.xml.dom.ls.DomLSSerializer"); - - // Get the serialize method - meth = gnuSer.getMethod("serialize", - new Class [] { Class.forName("org.w3c.dom.Node"), - Class.forName("java.io.OutputStream") } ); - - // Get an instance - Object serializer = gnuSer.newInstance(); - - // Now call serialize to write the document - meth.invoke(serializer, new Object [] { doc, baos } ); - } - else { - // We dont have another parser - throw new IOException("No appropriate API (JAXP/Xerces) to serialize XML document: " + domImpl); - } + // Write nodes; we only need element, text and comment nodes + private void write(Node node, int nLevel, OutputStreamWriter osw) throws IOException { + short nType = node.getNodeType(); + switch (nType) { + case Node.ELEMENT_NODE: + if (node.hasChildNodes()) { + // Block pretty print from this node? + NodeList list = node.getChildNodes(); + int nLen = list.getLength(); + boolean bBlockPrettyPrint = false; + if (nLevel>=0) { + for (int i = 0; i < nLen; i++) { + bBlockPrettyPrint |= list.item(i).getNodeType()==Node.TEXT_NODE; + } + } + // Print start tag + if (nLevel>=0) { writeSpaces(nLevel,osw); } + osw.write("<"+node.getNodeName()); + writeAttributes(node,osw); + osw.write(">"); + if (nLevel>=0 && !bBlockPrettyPrint) { osw.write("\n"); } + // Print children + for (int i = 0; i < nLen; i++) { + int nNextLevel; + if (bBlockPrettyPrint || nLevel<0) { nNextLevel=-1; } + else { nNextLevel=nLevel+1; } + write(list.item(i),nNextLevel,osw); + } + // Print end tag + if (nLevel>=0 && !bBlockPrettyPrint) { writeSpaces(nLevel,osw); } + osw.write(""); + if (nLevel>=0) { osw.write("\n"); } + } + else { // empty element + if (nLevel>=0) { writeSpaces(nLevel,osw); } + osw.write("<"+node.getNodeName()); + writeAttributes(node,osw); + osw.write(" />"); + if (nLevel>=0) { osw.write("\n"); } + } + break; + case Node.TEXT_NODE: + write(node.getNodeValue(),osw); + break; + case Node.COMMENT_NODE: + if (nLevel>=0) { writeSpaces(nLevel,osw); } + osw.write(""); + if (nLevel>=0) { osw.write("\n"); } } - catch (ClassNotFoundException cnfe) { - throw new IOException(cnfe.toString()); + } + + private void writeAttributes(Node node, OutputStreamWriter osw) throws IOException { + NamedNodeMap attr = node.getAttributes(); + int nLen = attr.getLength(); + for (int i=0; i'): osw.write(">"); break; + case ('&'): osw.write("&"); break; + case ('"'): osw.write("""); break; + case ('\''): osw.write( "'"); break; + default: osw.write(c); + } + } + } + /** * Initializes a new DOM Document with the content * containing minimum XML tags. diff --git a/source/java/writer2latex/xmerge/EmbeddedBinaryObject.java b/source/java/writer2latex/xmerge/EmbeddedBinaryObject.java index 6f31b38..7a2dc51 100644 --- a/source/java/writer2latex/xmerge/EmbeddedBinaryObject.java +++ b/source/java/writer2latex/xmerge/EmbeddedBinaryObject.java @@ -38,15 +38,10 @@ ************************************************************************/ // This version is adapted for Writer2LaTeX -// Version 1.0 (2008-11-22) +// Version 1.4 (2012-03-19) package writer2latex.xmerge; -import org.w3c.dom.Document; -import org.w3c.dom.DOMException; -import org.w3c.dom.Element; -//import org.w3c.dom.Node; - /** * This class represents embedded object's in an OpenOffice.org document that @@ -105,39 +100,10 @@ public class EmbeddedBinaryObject extends EmbeddedObject { * * @param data A byte array containing data for the object. */ - public void setBinaryData(byte[] data) { + /*public void setBinaryData(byte[] data) { objData = data; hasChanged = true; - } - - /** - * Package private method for writing the data of the EmbeddedObject to a - * SX? file. - * - * @param zip An OfficeZip instance representing the file - * the data is to be written to. - */ - void write(OfficeZip zip) { - if (hasChanged) { - zip.setNamedBytes(objName, objData); - } - } - - - /** - * Package private method that constructs the manifest.xml entries for this - * embedded object. - * - * @return Document Document containing the manifest entries. - */ - void writeManifestData(Document manifestDoc) throws DOMException { - Element objNode = manifestDoc.createElement(OfficeConstants.TAG_MANIFEST_FILE); - - objNode.setAttribute(OfficeConstants.ATTRIBUTE_MANIFEST_FILE_TYPE, objType); - objNode.setAttribute(OfficeConstants.ATTRIBUTE_MANIFEST_FILE_PATH, objName); - - manifestDoc.getDocumentElement().appendChild(objNode); - } + }*/ } diff --git a/source/java/writer2latex/xmerge/EmbeddedObject.java b/source/java/writer2latex/xmerge/EmbeddedObject.java index 1d8cad8..afd815e 100644 --- a/source/java/writer2latex/xmerge/EmbeddedObject.java +++ b/source/java/writer2latex/xmerge/EmbeddedObject.java @@ -37,15 +37,10 @@ ************************************************************************/ // This version is adapted for Writer2LaTeX +// Version 1.4 (2012-03-19) package writer2latex.xmerge; -import java.io.IOException; - -import org.w3c.dom.Document; -import org.w3c.dom.DOMException; - - public abstract class EmbeddedObject { protected String objName; protected String objType; @@ -110,20 +105,4 @@ public abstract class EmbeddedObject { return objType; } - /** - * Package private method for writing the data of the EmbeddedObject to a - * SX? file. - * - * @param zip An OfficeZip instance representing the file - * the data is to be written to. - */ - abstract void write(OfficeZip zip) throws IOException; - - /** - * Package private method that constructs the manifest.xml entries for this - * embedded object. - * - * @return Document Document containing the manifest entries. - */ - abstract void writeManifestData(Document manifestDoc) throws DOMException; } \ No newline at end of file diff --git a/source/java/writer2latex/xmerge/EmbeddedXMLObject.java b/source/java/writer2latex/xmerge/EmbeddedXMLObject.java index 6f497e7..f44c229 100644 --- a/source/java/writer2latex/xmerge/EmbeddedXMLObject.java +++ b/source/java/writer2latex/xmerge/EmbeddedXMLObject.java @@ -37,7 +37,7 @@ ************************************************************************/ // This version is adapted for Writer2LaTeX -// Version 1.0 (2008-11-23) +// Version 1.4 (2012-03-19) package writer2latex.xmerge; @@ -49,9 +49,6 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; -import org.w3c.dom.DOMException; -import org.w3c.dom.Element; -import org.w3c.dom.Node; //import org.xml.sax.EntityResolver; //import org.xml.sax.InputSource; @@ -128,10 +125,10 @@ public class EmbeddedXMLObject extends EmbeddedObject { * * @param content DOM representation of the object's content. */ - public void setContentDOM(Document content) { + /*public void setContentDOM(Document content) { contentDOM = content; hasChanged = true; - } + }*/ /** @@ -157,10 +154,10 @@ public class EmbeddedXMLObject extends EmbeddedObject { * * @param settings DOM representation of the object's settings. */ - public void setSettingsDOM(Document settings) { + /*public void setSettingsDOM(Document settings) { settingsDOM = settings; hasChanged = true; - } + }*/ /** @@ -186,10 +183,10 @@ public class EmbeddedXMLObject extends EmbeddedObject { * * @param styles DOM representation of the object's styles. */ - public void setStylesDOM(Document styles) { + /*public void setStylesDOM(Document styles) { stylesDOM = styles; hasChanged = true; - } + }*/ /** @@ -238,75 +235,5 @@ public class EmbeddedXMLObject extends EmbeddedObject { } - /** - * Package private method for writing the data of the EmbeddedObject to a - * SX? file. - * - * @param zip An OfficeZip instance representing the file - * the data is to be written to. - */ - void write(OfficeZip zip) throws IOException { - if (hasChanged == true) { - if (contentDOM != null) { - zip.setNamedBytes(new String(objName + "/content.xml"), - OfficeDocument.docToBytes(contentDOM)); - } - if (settingsDOM != null) { - zip.setNamedBytes(new String(objName + "/settings.xml"), - OfficeDocument.docToBytes(settingsDOM)); - } - if (stylesDOM != null) { - zip.setNamedBytes(new String(objName + "/styles.xml"), - OfficeDocument.docToBytes(stylesDOM)); - } - } - } - - /** - * Package private method that constructs the manifest.xml entries for this - * embedded object. - * - * @param manifestDoc Document containing the manifest entries. - */ - void writeManifestData(Document manifestDoc) throws DOMException { - Node root = manifestDoc.getDocumentElement(); - - if (contentDOM != null) { - Element contentNode = manifestDoc.createElement(OfficeConstants.TAG_MANIFEST_FILE); - - contentNode.setAttribute(OfficeConstants.ATTRIBUTE_MANIFEST_FILE_TYPE, "text/xml"); - contentNode.setAttribute(OfficeConstants.ATTRIBUTE_MANIFEST_FILE_PATH, - new String(objName + "/content.xml")); - - root.appendChild(contentNode); - } - - if (settingsDOM != null) { - Element settingsNode = manifestDoc.createElement(OfficeConstants.TAG_MANIFEST_FILE); - - settingsNode.setAttribute(OfficeConstants.ATTRIBUTE_MANIFEST_FILE_TYPE, "text/xml"); - settingsNode.setAttribute(OfficeConstants.ATTRIBUTE_MANIFEST_FILE_PATH, - new String(objName + "/settings.xml")); - - root.appendChild(settingsNode); - } - - if (stylesDOM != null) { - Element stylesNode = manifestDoc.createElement(OfficeConstants.TAG_MANIFEST_FILE); - - stylesNode.setAttribute(OfficeConstants.ATTRIBUTE_MANIFEST_FILE_TYPE, "text/xml"); - stylesNode.setAttribute(OfficeConstants.ATTRIBUTE_MANIFEST_FILE_PATH, - new String(objName + "/styles.xml")); - } - - - Element objectNode = manifestDoc.createElement(OfficeConstants.TAG_MANIFEST_FILE); - - objectNode.setAttribute(OfficeConstants.ATTRIBUTE_MANIFEST_FILE_TYPE, objType); - objectNode.setAttribute(OfficeConstants.ATTRIBUTE_MANIFEST_FILE_PATH, - new String(objName + "/")); - - root.appendChild(objectNode); - } - + } \ No newline at end of file diff --git a/source/java/writer2latex/xmerge/NewDOMDocument.java b/source/java/writer2latex/xmerge/NewDOMDocument.java deleted file mode 100644 index 5bd28f3..0000000 --- a/source/java/writer2latex/xmerge/NewDOMDocument.java +++ /dev/null @@ -1,160 +0,0 @@ -/************************************************************************ - * - * NewDOMDocument.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-2006 by Henrik Just - * - * All Rights Reserved. - * - * Version 0.5 (2006-10-01) - * - */ - -package writer2latex.xmerge; - -import org.w3c.dom.NodeList; -import org.w3c.dom.Node; -import org.w3c.dom.NamedNodeMap; - -import writer2latex.xmerge.DOMDocument; - -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.IOException; - -/** - * An extension of DOMDocument - * that overrides the write method. - * (This method fails with the version of xerces shipped with jre 1.5) - */ -public class NewDOMDocument extends DOMDocument { - - /** Constructor - */ - public NewDOMDocument(String sFileName, String sExtension) { - super(sFileName,sExtension); - } - - /** - * Write out content to the supplied OutputStream. - * (with pretty printing) - * @param os XML OutputStream. - * @throws IOException If any I/O error occurs. - */ - public void write(OutputStream os) throws IOException { - OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8"); - osw.write("\n"); - write(getContentDOM().getDocumentElement(),0,osw); - osw.flush(); - osw.close(); - } - - // Write nodes; we only need element, text and comment nodes - private void write(Node node, int nLevel, OutputStreamWriter osw) throws IOException { - short nType = node.getNodeType(); - switch (nType) { - case Node.ELEMENT_NODE: - if (node.hasChildNodes()) { - // Block pretty print from this node? - NodeList list = node.getChildNodes(); - int nLen = list.getLength(); - boolean bBlockPrettyPrint = false; - if (nLevel>=0) { - for (int i = 0; i < nLen; i++) { - bBlockPrettyPrint |= list.item(i).getNodeType()==Node.TEXT_NODE; - } - } - // Print start tag - if (nLevel>=0) { writeSpaces(nLevel,osw); } - osw.write("<"+node.getNodeName()); - writeAttributes(node,osw); - osw.write(">"); - if (nLevel>=0 && !bBlockPrettyPrint) { osw.write("\n"); } - // Print children - for (int i = 0; i < nLen; i++) { - int nNextLevel; - if (bBlockPrettyPrint || nLevel<0) { nNextLevel=-1; } - else { nNextLevel=nLevel+1; } - write(list.item(i),nNextLevel,osw); - } - // Print end tag - if (nLevel>=0 && !bBlockPrettyPrint) { writeSpaces(nLevel,osw); } - osw.write(""); - if (nLevel>=0) { osw.write("\n"); } - } - else { // empty element - if (nLevel>=0) { writeSpaces(nLevel,osw); } - osw.write("<"+node.getNodeName()); - writeAttributes(node,osw); - osw.write(" />"); - if (nLevel>=0) { osw.write("\n"); } - } - break; - case Node.TEXT_NODE: - write(node.getNodeValue(),osw); - break; - case Node.COMMENT_NODE: - if (nLevel>=0) { writeSpaces(nLevel,osw); } - osw.write(""); - if (nLevel>=0) { osw.write("\n"); } - } - } - - private void writeAttributes(Node node, OutputStreamWriter osw) throws IOException { - NamedNodeMap attr = node.getAttributes(); - int nLen = attr.getLength(); - for (int i=0; i'): osw.write(">"); break; - case ('&'): osw.write("&"); break; - case ('"'): osw.write("""); break; - case ('\''): osw.write( "'"); break; - default: osw.write(c); - } - } - } - -} - - - - - - - - diff --git a/source/java/writer2latex/xmerge/OfficeDocument.java b/source/java/writer2latex/xmerge/OfficeDocument.java index e3f5d49..f18aa30 100644 --- a/source/java/writer2latex/xmerge/OfficeDocument.java +++ b/source/java/writer2latex/xmerge/OfficeDocument.java @@ -37,22 +37,17 @@ ************************************************************************/ // This version is adapted for Writer2LaTeX -// Version 1.2 (2010-03-28) +// Version 1.4 (2012-03-19) package writer2latex.xmerge; import java.io.InputStream; -import java.io.OutputStream; import java.io.Reader; import java.io.BufferedReader; import java.io.StringReader; import java.io.InputStreamReader; -//import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; import java.io.ByteArrayInputStream; import java.io.IOException; -//import java.util.zip.ZipEntry; -//import java.util.zip.ZipInputStream; import java.util.Iterator; import java.util.Map; import java.util.HashMap; @@ -64,26 +59,19 @@ import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Node; import org.w3c.dom.Element; import org.w3c.dom.Document; -import org.w3c.dom.DOMImplementation; -import org.w3c.dom.DocumentType; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.w3c.dom.NamedNodeMap; import org.xml.sax.SAXException; -//import org.xml.sax.SAXParseException; import writer2latex.office.MIMETypes; import writer2latex.util.Misc; -//import org.openoffice.xmerge.util.Resources; -//import org.openoffice.xmerge.util.Debug; - /** - * An implementation of Document for - * StarOffice documents. + * This class implements reading of ODF files */ public class OfficeDocument - implements writer2latex.xmerge.Document, OfficeConstants { + implements OfficeConstants { /** Factory for DocumentBuilder objects. */ private static DocumentBuilderFactory factory = @@ -107,9 +95,6 @@ public class OfficeDocument private String documentName = null; private String fileName = null; - /** Resources object. */ - //private Resources res = null; - /** * OfficeZip object to store zip contents from * read InputStream. Note that this member @@ -224,46 +209,6 @@ public class OfficeDocument } - /** - * Sets the content tree of the document. - * - * @param newDom Node containing the new content tree. - */ - public void setContentDOM( Node newDom) { - contentDoc = (Document)newDom; - } - - - /** - * Sets the meta tree of the document. - * - * @param newDom Node containing the new meta tree. - */ - public void setMetaDOM (Node newDom) { - metaDoc = (Document)newDom; - } - - - /** - * Sets the settings tree of the document. - * - * @param newDom Node containing the new settings tree. - */ - public void setSettingsDOM (Node newDom) { - settingsDoc = (Document)newDom; - } - - - /** - * Sets the style tree of the document. - * - * @param newDom Node containing the new style tree. - */ - public void setStyleDOM (Node newDom) { - styleDoc = (Document)newDom; - } - - /** * Return a DOM Document object of the style.xml file. * Note that this may return null if there is no style DOM. @@ -413,7 +358,7 @@ public class OfficeDocument * * @param embObj An instance of EmbeddedObject. */ - public void addEmbeddedObject(EmbeddedObject embObj) { + /*public void addEmbeddedObject(EmbeddedObject embObj) { if (embObj == null) { return; } @@ -423,7 +368,7 @@ public class OfficeDocument } embeddedObjects.put(embObj.getName(), embObj); - } + }*/ /** @@ -706,383 +651,6 @@ public class OfficeDocument } - /** - * Method to return the MIME type of the document. - * - * @return String The document's MIME type. - */ - // not really used... - protected String getDocumentMimeType() { return ""; } - - - /** - * Write out Office ZIP file format. - * - * @param os XML OutputStream. - * - * @throws IOException If any I/O error occurs. - */ - public void write(OutputStream os) throws IOException { - if (zip == null) { - zip = new OfficeZip(); - } - - initManifestDOM(); - - Element domEntry; - Element manifestRoot = manifestDoc.getDocumentElement(); - - // The EmbeddedObjects come first. - Iterator embObjs = getEmbeddedObjects(); - while (embObjs.hasNext()) { - EmbeddedObject obj = embObjs.next(); - obj.writeManifestData(manifestDoc); - - obj.write(zip); - } - - // Add in the entry for the Pictures directory. Always present. - domEntry = manifestDoc.createElement(TAG_MANIFEST_FILE); - domEntry.setAttribute(ATTRIBUTE_MANIFEST_FILE_PATH, "Pictures/"); - domEntry.setAttribute(ATTRIBUTE_MANIFEST_FILE_TYPE, ""); - manifestRoot.appendChild(domEntry); - - // Write content to the Zip file and then write any of the optional - // data, if it exists. - zip.setContentXMLBytes(docToBytes(contentDoc)); - - domEntry = manifestDoc.createElement(TAG_MANIFEST_FILE); - domEntry.setAttribute(ATTRIBUTE_MANIFEST_FILE_PATH, "content.xml"); - domEntry.setAttribute(ATTRIBUTE_MANIFEST_FILE_TYPE, "text/xml"); - - manifestRoot.appendChild(domEntry); - - if (styleDoc != null) { - zip.setStyleXMLBytes(docToBytes(styleDoc)); - - domEntry = manifestDoc.createElement(TAG_MANIFEST_FILE); - domEntry.setAttribute(ATTRIBUTE_MANIFEST_FILE_PATH, "styles.xml"); - domEntry.setAttribute(ATTRIBUTE_MANIFEST_FILE_TYPE, "text/xml"); - manifestRoot.appendChild(domEntry); - } - - if (metaDoc != null) { - zip.setMetaXMLBytes(docToBytes(metaDoc)); - - domEntry = manifestDoc.createElement(TAG_MANIFEST_FILE); - domEntry.setAttribute(ATTRIBUTE_MANIFEST_FILE_PATH, "meta.xml"); - domEntry.setAttribute(ATTRIBUTE_MANIFEST_FILE_TYPE, "text/xml"); - manifestRoot.appendChild(domEntry); - } - - if (settingsDoc != null) { - zip.setSettingsXMLBytes(docToBytes(settingsDoc)); - - domEntry = manifestDoc.createElement(TAG_MANIFEST_FILE); - domEntry.setAttribute(ATTRIBUTE_MANIFEST_FILE_PATH, "settings.xml"); - domEntry.setAttribute(ATTRIBUTE_MANIFEST_FILE_TYPE, "text/xml"); - manifestRoot.appendChild(domEntry); - } - - zip.setManifestXMLBytes(docToBytes(manifestDoc)); - - zip.write(os); - } - - - /** - * Write out Office ZIP file format. - * - * @param os XML OutputStream. - * @param isZip boolean - * - * @throws IOException If any I/O error occurs. - */ - public void write(OutputStream os, boolean isZip) throws IOException { - - // Create an OfficeZip object if one does not exist. - if (isZip){ - write(os); - } - else{ - try{ - DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder= builderFactory.newDocumentBuilder(); - DOMImplementation domImpl = builder.getDOMImplementation(); - domImpl.createDocumentType("office:document","-//OpenOffice.org//DTD OfficeDocument 1.0//EN",null); - org.w3c.dom.Document newDoc = domImpl.createDocument("http://openoffice.org/2000/office","office:document",null); - - - Element rootElement=newDoc.getDocumentElement(); - rootElement.setAttribute("xmlns:office","http://openoffice.org/2000/office"); - rootElement.setAttribute("xmlns:style","http://openoffice.org/2000/style" ); - rootElement.setAttribute("xmlns:text","http://openoffice.org/2000/text"); - rootElement.setAttribute("xmlns:table","http://openoffice.org/2000/table"); - - rootElement.setAttribute("xmlns:draw","http://openoffice.org/2000/drawing"); - rootElement.setAttribute("xmlns:fo","http://www.w3.org/1999/XSL/Format" ); - rootElement.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink" ); - rootElement.setAttribute("xmlns:dc","http://purl.org/dc/elements/1.1/" ); - rootElement.setAttribute("xmlns:meta","http://openoffice.org/2000/meta" ); - rootElement.setAttribute("xmlns:number","http://openoffice.org/2000/datastyle" ); - rootElement.setAttribute("xmlns:svg","http://www.w3.org/2000/svg" ); - rootElement.setAttribute("xmlns:chart","http://openoffice.org/2000/chart" ); - rootElement.setAttribute("xmlns:dr3d","http://openoffice.org/2000/dr3d" ); - rootElement.setAttribute("xmlns:math","http://www.w3.org/1998/Math/MathML" ); - rootElement.setAttribute("xmlns:form","http://openoffice.org/2000/form" ); - rootElement.setAttribute("xmlns:script","http://openoffice.org/2000/script" ); - rootElement.setAttribute("xmlns:config","http://openoffice.org/2001/config" ); - // #i41033# OASIS format needs the "office:class" set. - if(getDocumentMimeType() == SXC_MIME_TYPE) - rootElement.setAttribute("office:class","spreadsheet" ); - else if(getDocumentMimeType() == SXW_MIME_TYPE) - rootElement.setAttribute("office:class","text" ); - rootElement.setAttribute("office:version","1.0"); - - - NodeList nodeList; - Node tmpNode; - Node rootNode = (Node)rootElement; - if (metaDoc !=null){ - nodeList= metaDoc.getElementsByTagName(TAG_OFFICE_META); - if (nodeList.getLength()>0){ - tmpNode = newDoc.importNode(nodeList.item(0),true); - rootNode.appendChild(tmpNode); - } - }if (styleDoc !=null){ - nodeList= styleDoc.getElementsByTagName(TAG_OFFICE_STYLES); - if (nodeList.getLength()>0){ - tmpNode = newDoc.importNode(nodeList.item(0),true); - rootNode.appendChild(tmpNode); - } - - }if (settingsDoc !=null){ - nodeList= settingsDoc.getElementsByTagName(TAG_OFFICE_SETTINGS); - if (nodeList.getLength()>0){ - tmpNode = newDoc.importNode(nodeList.item(0),true); - rootNode.appendChild(tmpNode); - } - } - if (contentDoc !=null){ - nodeList= contentDoc.getElementsByTagName(TAG_OFFICE_AUTOMATIC_STYLES); - if (nodeList.getLength()>0){ - tmpNode = newDoc.importNode(nodeList.item(0),true); - rootNode.appendChild(tmpNode); - } - - nodeList= contentDoc.getElementsByTagName(TAG_OFFICE_BODY); - if (nodeList.getLength()>0){ - tmpNode = newDoc.importNode(nodeList.item(0),true); - rootNode.appendChild(tmpNode); - } - } - - byte contentBytes[] = docToBytes(newDoc); - os.write(contentBytes); - } - catch(Exception exc){ - System.err.println("\nException in OfficeDocument.write():" +exc); - } - //byte contentBytes[] = docToBytes(contentDoc); - } - } - - - /** - *

Write out a org.w3c.dom.Document object into a - * byte array.

- * - *

TODO: remove dependency on com.sun.xml.tree.XmlDocument - * package!

- * - * @param Document DOM Document object. - * - * @return byte array of DOM Document - * object. - * - * @throws IOException If any I/O error occurs. - */ - static byte[] docToBytes(Document doc) - throws IOException { - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - java.lang.reflect.Constructor con; - java.lang.reflect.Method meth; - - String domImpl = doc.getClass().getName(); - - /* - * We may have multiple XML parsers in the Classpath. - * Depending on which one is first, the actual type of - * doc may vary. Need a way to find out which API is being - * used and use an appropriate serialization method. - */ - try { - // First of all try for JAXP 1.0 - if (domImpl.equals("com.sun.xml.tree.XmlDocument")) { - - // Debug.log(Debug.INFO, "Using JAXP"); - - Class jaxpDoc = Class.forName("com.sun.xml.tree.XmlDocument"); - - // The method is in the XMLDocument class itself, not a helper - meth = jaxpDoc.getMethod("write", - new Class[] { Class.forName("java.io.OutputStream") } ); - - meth.invoke(doc, new Object [] { baos } ); - } - else if (domImpl.equals("org.apache.crimson.tree.XmlDocument")) - { - // Debug.log(Debug.INFO, "Using Crimson"); - - Class crimsonDoc = Class.forName("org.apache.crimson.tree.XmlDocument"); - // The method is in the XMLDocument class itself, not a helper - meth = crimsonDoc.getMethod("write", - new Class[] { Class.forName("java.io.OutputStream") } ); - - meth.invoke(doc, new Object [] { baos } ); - } - else if (domImpl.equals("org.apache.xerces.dom.DocumentImpl") - || domImpl.equals("org.apache.xerces.dom.DeferredDocumentImpl")) { - - // Debug.log(Debug.INFO, "Using Xerces"); - - // Try for Xerces - Class xercesSer = - Class.forName("org.apache.xml.serialize.XMLSerializer"); - - // Get the OutputStream constructor - // May want to use the OutputFormat parameter at some stage too - con = xercesSer.getConstructor(new Class [] - { Class.forName("java.io.OutputStream"), - Class.forName("org.apache.xml.serialize.OutputFormat") } ); - - - // Get the serialize method - meth = xercesSer.getMethod("serialize", - new Class [] { Class.forName("org.w3c.dom.Document") } ); - - - // Get an instance - Object serializer = con.newInstance(new Object [] { baos, null } ); - - - // Now call serialize to write the document - meth.invoke(serializer, new Object [] { doc } ); - } - else { - // We don't have another parser - throw new IOException("No appropriate API (JAXP/Xerces) to serialize XML document: " + domImpl); - } - } - catch (ClassNotFoundException cnfe) { - throw new IOException(cnfe.toString()); - } - catch (Exception e) { - // We may get some other errors, but the bottom line is that - // the steps being executed no longer work - throw new IOException(e.toString()); - } - - byte bytes[] = baos.toByteArray(); - - return bytes; - } - - - /** - * Initializes a new DOM Document with the content - * containing minimum OpenOffice XML tags. - * - * @throws IOException If any I/O error occurs. - */ - public final void initContentDOM() throws IOException { - - contentDoc = createDOM(TAG_OFFICE_DOCUMENT_CONTENT); - - // this is a work-around for a bug in Office6.0 - not really - // needed but StarCalc 6.0 will crash without this tag. - Element root = contentDoc.getDocumentElement(); - - Element child = contentDoc.createElement(TAG_OFFICE_FONT_DECLS); - root.appendChild(child); - - child = contentDoc.createElement(TAG_OFFICE_AUTOMATIC_STYLES); - root.appendChild(child); - - child = contentDoc.createElement(TAG_OFFICE_BODY); - root.appendChild(child); - } - - /** - * Initializes a new DOM Document with the content - * containing minimum OpenOffice XML tags. - * - * @throws IOException If any I/O error occurs. - */ - public final void initSettingsDOM() throws IOException { - - settingsDoc = createSettingsDOM(TAG_OFFICE_DOCUMENT_SETTINGS); - - // this is a work-around for a bug in Office6.0 - not really - // needed but StarCalc 6.0 will crash without this tag. - Element root = settingsDoc.getDocumentElement(); - - Element child = settingsDoc.createElement(TAG_OFFICE_SETTINGS); - root.appendChild(child); - } - - /** - * Initializes a new DOM Document with styles - * containing minimum OpenOffice XML tags. - * - * @throws IOException If any I/O error occurs. - */ - public final void initStyleDOM() throws IOException { - - styleDoc = createDOM(TAG_OFFICE_DOCUMENT_STYLES); - } - - /** - *

Creates a new DOM Document containing minimum - * OpenOffice XML tags.

- * - *

This method uses the subclass - * getOfficeClassAttribute method to get the - * attribute for office:class.

- * - * @param rootName root name of Document. - * - * @throws IOException If any I/O error occurs. - */ - private final Document createSettingsDOM(String rootName) throws IOException { - - Document doc = null; - - try { - - DocumentBuilder builder = factory.newDocumentBuilder(); - doc = builder.newDocument(); - - } catch (ParserConfigurationException ex) { - - throw new OfficeDocumentException(ex); - - } - - Element root = (Element) doc.createElement(rootName); - doc.appendChild(root); - - root.setAttribute("xmlns:office", "http://openoffice.org/2000/office"); - root.setAttribute("xmlns:xlink", "http://openoffice.org/1999/xlink"); - root.setAttribute("xmlns:config", "http://openoffice.org/2001/config"); - root.setAttribute("office:version", "1.0"); - - return doc; - } - - /** *

Creates a new DOM Document containing minimum * OpenOffice XML tags.

@@ -1252,45 +820,5 @@ public class OfficeDocument } - /** - * Method to create the initial entries in the manifest.xml file stored - * in an SX? file. - */ - private void initManifestDOM() throws IOException { - - try { - DocumentBuilder builder = factory.newDocumentBuilder(); - DOMImplementation domImpl = builder.getDOMImplementation(); - - DocumentType docType = domImpl.createDocumentType(TAG_MANIFEST_ROOT, - "-//OpenOffice.org//DTD Manifest 1.0//EN", - "Manifest.dtd"); - manifestDoc = domImpl.createDocument("manifest", TAG_MANIFEST_ROOT, docType); - } catch (ParserConfigurationException ex) { - throw new OfficeDocumentException(ex); - } - - // Add the entry - Element manifestRoot = manifestDoc.getDocumentElement(); - - manifestRoot.setAttribute("xmlns:manifest", "http://openoffice.org/2001/manifest"); - - Element docRoot = manifestDoc.createElement(TAG_MANIFEST_FILE); - - docRoot.setAttribute(ATTRIBUTE_MANIFEST_FILE_PATH, "/"); - docRoot.setAttribute(ATTRIBUTE_MANIFEST_FILE_TYPE, getDocumentMimeType()); - - manifestRoot.appendChild(docRoot); - } - - // TODO: We need these because we implement OutputFile (but in fact we shouldn't) - public String getMIMEType() { - return ""; - } - - public boolean isMasterDocument() { - return false; - } - } diff --git a/source/java/writer2latex/xmerge/OfficeZip.java b/source/java/writer2latex/xmerge/OfficeZip.java index a9abe1d..e10b0e2 100644 --- a/source/java/writer2latex/xmerge/OfficeZip.java +++ b/source/java/writer2latex/xmerge/OfficeZip.java @@ -37,28 +37,22 @@ ************************************************************************/ // This version is adapted for Writer2LaTeX -// Version 1.0 (2008-11-22) +// Version 1.4 (2012-03-19) package writer2latex.xmerge; import java.util.List; -import java.util.ListIterator; import java.util.LinkedList; import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; import java.util.zip.ZipEntry; -import java.util.zip.CRC32; import java.io.InputStream; -import java.io.OutputStream; import java.io.IOException; import java.io.ByteArrayOutputStream; -//import org.openoffice.xmerge.util.Debug; - /** * Class used by {@link * org.openoffice.xmerge.converter.OfficeDocument - * OfficeDocument} to handle reading and writing + * OfficeDocument} to handle reading * from a ZIP file, as well as storing ZIP entries. * * @author Herbie Ong @@ -113,9 +107,6 @@ class OfficeZip { while ((ze = zis.getNextEntry()) != null) { String name = ze.getName(); - //System.out.println("Found "+name); - - // Debug.log(Debug.TRACE, "reading entry: " + name); ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -240,31 +231,6 @@ class OfficeZip { } - /** - * This method sets the bytes for the named entry. It searches for a - * matching entry in the LinkedList. If no entry is found, a new one is - * created. - * - * Writing of data is defferred to setEntryBytes(). - * - * @param name The name of the entry to search for. - * @param bytes The new data to write. - */ - void setNamedBytes(String name, byte[] bytes) { - for (int i = 0; i < entryList.size(); i++) { - Entry e = entryList.get(i); - - if (e.zipEntry.getName().equals(name)) { - setEntryBytes(i, bytes, name); - return; - } - } - - // If we're here, no entry was found. Call setEntryBytes with an index - // of -1 to insert a new entry. - setEntryBytes(-1, bytes, name); - } - /** * Used by the getContentXMLBytes method and the * getStyleXMLBytes method to return the @@ -289,171 +255,6 @@ class OfficeZip { return bytes; } - - /** - * Set or replace the byte array for the - * CONTENTXML file. - * - * @param bytes byte array for the - * CONTENTXML file. - */ - void setContentXMLBytes(byte bytes[]) { - - contentIndex = setEntryBytes(contentIndex, bytes, CONTENTXML); - } - - - /** - * Set or replace the byte array for the - * STYLEXML file. - * - * @param bytes byte array for the - * STYLEXML file. - */ - void setStyleXMLBytes(byte bytes[]) { - - styleIndex = setEntryBytes(styleIndex, bytes, STYLEXML); - } - - - /** - * Set or replace the byte array for the - * METAXML file. - * - * @param bytes byte array for the - * METAXML file. - */ - void setMetaXMLBytes(byte bytes[]) { - - metaIndex = setEntryBytes(metaIndex, bytes, METAXML); - } - - - /** - * Set or replace the byte array for the - * SETTINGSXML file. - * - * @param bytes byte array for the - * SETTINGSXML file. - */ - void setSettingsXMLBytes(byte bytes[]) { - - settingsIndex = setEntryBytes(settingsIndex, bytes, SETTINGSXML); - } - - - /** - * Set or replace the byte array for the MANIFESTXML file. - * - * @param bytes byte array for the MANIFESTXML file. - */ - void setManifestXMLBytes(byte bytes[]) { - manifestIndex = setEntryBytes(manifestIndex, bytes, MANIFESTXML); - } - - /** - *

Used by the setContentXMLBytes method and - * the setStyleXMLBytes to either replace an - * existing Entry, or create a new entry in - * entryList.

- * - *

If there is an Entry object within - * entryList that corresponds to the index, replace the - * ZipEntry info.

- * - * @param index Index of Entry to modify. - * @param bytes Entry value. - * @param name Name of Entry. - * - * @return Index of value added or modified in entryList - */ - private int setEntryBytes(int index, byte bytes[], String name) { - - if (index > -1) { - - // replace existing entry in entryList - - Entry entry = entryList.get(index); - name = entry.zipEntry.getName(); - int method = entry.zipEntry.getMethod(); - - ZipEntry ze = createZipEntry(name, bytes, method); - - entry.zipEntry = ze; - entry.bytes= bytes; - - } else { - - // add a new entry into entryList - ZipEntry ze = createZipEntry(name, bytes, ZipEntry.DEFLATED); - Entry entry = new Entry(ze, bytes); - entryList.add(entry); - index = entryList.size() - 1; - } - - return index; - } - - - /** - * Write out the ZIP entries into the OutputStream - * object. - * - * @param os OutputStream object to write ZIP. - * - * @throws IOException If any ZIP I/O error occurs. - */ - void write(OutputStream os) throws IOException { - - // Debug.log(Debug.TRACE, "Writing out the following entries into zip."); - - ZipOutputStream zos = new ZipOutputStream(os); - - ListIterator iterator = entryList.listIterator(); - - while (iterator.hasNext()) { - - Entry entry = iterator.next(); - ZipEntry ze = entry.zipEntry; - - //String name = ze.getName(); - - // Debug.log(Debug.TRACE, "... " + name); - - zos.putNextEntry(ze); - zos.write(entry.bytes); - } - - zos.close(); - } - - - /** - * Creates a ZipEntry object based on the given params. - * - * @param name Name for the ZipEntry. - * @param bytes byte array for ZipEntry. - * @param method ZIP method to be used for ZipEntry. - * - * @return A ZipEntry object. - */ - private ZipEntry createZipEntry(String name, byte bytes[], int method) { - - ZipEntry ze = new ZipEntry(name); - - ze.setMethod(method); - ze.setSize(bytes.length); - - CRC32 crc = new CRC32(); - crc.reset(); - crc.update(bytes); - ze.setCrc(crc.getValue()); - - ze.setTime(System.currentTimeMillis()); - - return ze; - } - /** * This inner class is used as a data structure for holding * a ZipEntry info and its corresponding bytes.