From 934dd306965e516a455962e682bf91ebe3665d48 Mon Sep 17 00:00:00 2001 From: henrikjust Date: Wed, 22 Oct 2014 11:57:55 +0000 Subject: [PATCH] Second draft of w2x toolbar git-svn-id: svn://svn.code.sf.net/p/writer2latex/code/trunk@185 f0f2a975-2e09-46c8-9428-3b39399b9f3c --- source/distro/changelog.txt | 5 +- .../comp/w2lcommon/filter/UNOPublisher.java | 253 ++++++++++++++++++ .../da/comp/writer2xhtml/Writer2xhtml.java | 240 ++++------------- .../writer2latex/api/ConverterFactory.java | 4 +- source/java/writer2latex/util/Misc.java | 13 +- source/oxt/writer2xhtml/Addons.xcu | 72 +++-- source/oxt/writer2xhtml/icons/customh_16.bmp | Bin 0 -> 890 bytes source/oxt/writer2xhtml/icons/customh_26.bmp | Bin 0 -> 2202 bytes source/oxt/writer2xhtml/icons/epub_16.bmp | Bin 890 -> 890 bytes source/oxt/writer2xhtml/icons/epub_16h.bmp | Bin 890 -> 890 bytes source/oxt/writer2xhtml/icons/epub_26.bmp | Bin 2202 -> 2202 bytes source/oxt/writer2xhtml/icons/epub_26h.bmp | Bin 2202 -> 2202 bytes source/oxt/writer2xhtml/icons/html5_16.bmp | Bin 890 -> 890 bytes source/oxt/writer2xhtml/icons/html5_16h.bmp | Bin 890 -> 890 bytes source/oxt/writer2xhtml/icons/html5_26.bmp | Bin 2202 -> 2202 bytes source/oxt/writer2xhtml/icons/html5_26h.bmp | Bin 2202 -> 2202 bytes source/oxt/writer2xhtml/icons/metadata_16.bmp | Bin 0 -> 890 bytes .../oxt/writer2xhtml/icons/metadata_16h.bmp | Bin 0 -> 890 bytes source/oxt/writer2xhtml/icons/metadata_26.bmp | Bin 0 -> 2202 bytes .../oxt/writer2xhtml/icons/metadata_26h.bmp | Bin 0 -> 2202 bytes 20 files changed, 365 insertions(+), 222 deletions(-) create mode 100644 source/java/org/openoffice/da/comp/w2lcommon/filter/UNOPublisher.java create mode 100755 source/oxt/writer2xhtml/icons/customh_16.bmp create mode 100755 source/oxt/writer2xhtml/icons/customh_26.bmp create mode 100755 source/oxt/writer2xhtml/icons/metadata_16.bmp create mode 100755 source/oxt/writer2xhtml/icons/metadata_16h.bmp create mode 100755 source/oxt/writer2xhtml/icons/metadata_26.bmp create mode 100755 source/oxt/writer2xhtml/icons/metadata_26h.bmp diff --git a/source/distro/changelog.txt b/source/distro/changelog.txt index 3e4a1c7..4e1b200 100644 --- a/source/distro/changelog.txt +++ b/source/distro/changelog.txt @@ -2,6 +2,9 @@ Changelog for Writer2LaTeX version 1.4 -> 1.6 ---------- version 1.5.1 ---------- -[w2x] Added toolbar with two buttons to publish directly to XHTML/EPUB. +[w2x] Added toolbar with four buttons: Publish directly to XHTML, publish directly to EPUB, edit EPUB metadata + and edit custom configuration. Publishing directly implies that the export dialog is not displayed. Instead + the document will be exported to the same directory as the currently open document and with the same name. + This feature bypasses the filter logic, which gives a significant performance gain for large documents. [all] Filter: Refactored filter code, the actual conversion has been separated from the XExportFilter implementation \ No newline at end of file diff --git a/source/java/org/openoffice/da/comp/w2lcommon/filter/UNOPublisher.java b/source/java/org/openoffice/da/comp/w2lcommon/filter/UNOPublisher.java new file mode 100644 index 0000000..9d9e621 --- /dev/null +++ b/source/java/org/openoffice/da/comp/w2lcommon/filter/UNOPublisher.java @@ -0,0 +1,253 @@ +/************************************************************************ + * + * UNOPublisher.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-2014 by Henrik Just + * + * All Rights Reserved. + * + * Version 1.6 (2014-10-22) + * + */ +package org.openoffice.da.comp.w2lcommon.filter; + +import java.io.IOException; + +import org.openoffice.da.comp.w2lcommon.helper.MessageBox; +import writer2latex.util.Misc; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertyAccess; +import com.sun.star.frame.XController; +import com.sun.star.frame.XFrame; +import com.sun.star.frame.XModel; +import com.sun.star.frame.XStorable; +import com.sun.star.io.XInputStream; +import com.sun.star.task.XStatusIndicator; +import com.sun.star.task.XStatusIndicatorFactory; +import com.sun.star.ucb.XSimpleFileAccess2; +import com.sun.star.ui.dialogs.ExecutableDialogResults; +import com.sun.star.ui.dialogs.XExecutableDialog; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; +import com.sun.star.util.XModifiable; + +/** This class converts an open office document to another format + */ +public class UNOPublisher { + + public enum TargetFormat { xhtml, xhtml11, xhtml_mathml, html5, epub, latex }; + + private XComponentContext xContext; + private XFrame xFrame; + private XModel xModel=null; + private PropertyValue[] mediaProps = null; + + /** Create a new UNOPublisher based on a loaded office document + * + * @param xContext the component context from which new UNO services are instantiated + * @param xFrame the current frame + */ + public UNOPublisher(XComponentContext xContext, XFrame xFrame) { + this.xContext = xContext; + this.xFrame = xFrame; + // Get the model for the document from the frame + XController xController = xFrame.getController(); + if (xController!=null) { + xModel = xController.getModel(); + } + } + + /** Publish the document associated with this UNOPublisher. This involves four steps: + * (1) Check that the document is saved in the local file system. + * (2) Display the options dialog. + * (3) Save the document (if the modified flag is true). + * (4) Convert the document. + * + * @param format the target format + * @return the URL of the converted document, or null if the document was not converted + */ + public String publish(TargetFormat format) { + if (documentSaved() && updateMediaProperties(format)) { + // Create a (somewhat coarse grained) status indicator/progress bar + XStatusIndicatorFactory xFactory = (com.sun.star.task.XStatusIndicatorFactory) + UnoRuntime.queryInterface(com.sun.star.task.XStatusIndicatorFactory.class, xFrame); + XStatusIndicator xStatus = xFactory.createStatusIndicator(); + xStatus.start("Writer2xhtml",10); + xStatus.setValue(1); // At least we have started, that's 10% :-) + + try { + // Save document if required + saveDocument(); + xStatus.setValue(4); + + // Convert to desired format + UNOConverter converter = new UNOConverter(mediaProps, xContext); + // Initialize the file access (to read the office document) + XSimpleFileAccess2 sfa2 = null; + try { + Object sfaObject = xContext.getServiceManager().createInstanceWithContext( + "com.sun.star.ucb.SimpleFileAccess", xContext); + sfa2 = (XSimpleFileAccess2) UnoRuntime.queryInterface(XSimpleFileAccess2.class, sfaObject); + } + catch (com.sun.star.uno.Exception e) { + // failed to get SimpleFileAccess service (should not happen) + } + XInputStream xis = sfa2.openFileRead(xModel.getURL()); + converter.convert(xis); + xis.closeInput(); + } + catch (IOException e) { + xStatus.end(); + MessageBox msgBox = new MessageBox(xContext, xFrame); + msgBox.showMessage("Writer2xhtml","Error: Failed to export document"); + return null; + } + catch (com.sun.star.uno.Exception e) { + xStatus.end(); + MessageBox msgBox = new MessageBox(xContext, xFrame); + msgBox.showMessage("Writer2xhtml","Error: Failed to export document"); + return null; + } + xStatus.setValue(10); // Export is finished (The user will usually not see this...) + xStatus.end(); + return getTargetURL(format); + } + return null; + } + + private boolean documentSaved() { + String sDocumentUrl = xModel.getURL(); + if (sDocumentUrl.length()==0) { // The document has no location + MessageBox msgBox = new MessageBox(xContext, xFrame); + msgBox.showMessage("Writer2xhtml","Please save the document before publishing the file"); + return false; + } + else if (!".odt".equals(Misc.getFileExtension(sDocumentUrl)) && !".fodt".equals(Misc.getFileExtension(sDocumentUrl))) { + MessageBox msgBox = new MessageBox(xContext, xFrame); + msgBox.showMessage("Writer2xhtml","Please save the document in OpenDocument format (.odt)"); + return false; + } + else if (!sDocumentUrl.startsWith("file:")) { + MessageBox msgBox = new MessageBox(xContext, xFrame); + msgBox.showMessage("Writer2xhtml","Please save the document in the local file system"); + return false; + } + return true; + } + + private boolean saveDocument() { + XModifiable xModifiable = (XModifiable) UnoRuntime.queryInterface(XModifiable.class, xModel); + if (xModifiable.isModified()) { // The document is modified and need to be saved + XStorable xStorable = (XStorable) UnoRuntime.queryInterface(XStorable.class, xModel); + try { + xStorable.store(); + } catch (com.sun.star.io.IOException e) { + return false; + } + } + return true; + } + + // Some utility methods + private String getTargetURL(TargetFormat format) { + return Misc.removeExtension(xModel.getURL())+getTargetExtension(format); + } + + private void prepareMediaProperties(TargetFormat format) { + // Create inital media properties + mediaProps = new PropertyValue[2]; + mediaProps[0] = new PropertyValue(); + mediaProps[0].Name = "FilterName"; + mediaProps[0].Value = getFilterName(format); + mediaProps[1] = new PropertyValue(); + mediaProps[1].Name = "URL"; + mediaProps[1].Value = getTargetURL(format); + } + + private boolean updateMediaProperties(TargetFormat format) { + prepareMediaProperties(format); + + try { + // Display options dialog + Object dialog = xContext.getServiceManager() + .createInstanceWithContext(getDialogName(format), xContext); + + XPropertyAccess xPropertyAccess = (XPropertyAccess) + UnoRuntime.queryInterface(XPropertyAccess.class, dialog); + xPropertyAccess.setPropertyValues(mediaProps); + + XExecutableDialog xDialog = (XExecutableDialog) + UnoRuntime.queryInterface(XExecutableDialog.class, dialog); + if (xDialog.execute()==ExecutableDialogResults.OK) { + mediaProps = xPropertyAccess.getPropertyValues(); + return true; + } + else { + mediaProps = null; + return false; + } + } + catch (com.sun.star.beans.UnknownPropertyException e) { + // setPropertyValues will not fail.. + mediaProps = null; + return false; + } + catch (com.sun.star.uno.Exception e) { + // getServiceManager will not fail.. + mediaProps = null; + return false; + } + } + + private static String getTargetExtension(TargetFormat format) { + switch (format) { + case xhtml: return ".html"; + case xhtml11: return ".xhtml"; + case xhtml_mathml: return ".xhtml"; + case html5: return ".html"; + case epub: return ".epub"; + case latex: return ".tex"; + default: return ""; + } + } + + private static String getDialogName(TargetFormat format) { + switch (format) { + case xhtml: return "org.openoffice.da.comp.writer2xhtml.XhtmlOptionsDialog"; + case xhtml11: return "org.openoffice.da.comp.writer2xhtml.XhtmlOptionsDialog"; + case xhtml_mathml: return "org.openoffice.da.comp.writer2xhtml.XhtmlOptionsDialogMath"; + case html5: return "org.openoffice.da.comp.writer2xhtml.XhtmlOptionsDialogMath"; + case epub: return "org.openoffice.da.comp.writer2xhtml.EpubOptionsDialog"; + case latex: return "org.openoffice.da.comp.writer2xhtml.LaTeXOptionsDialog"; + default: return ""; + } + } + + private static String getFilterName(TargetFormat format) { + switch (format) { + case xhtml: return "org.openoffice.da.writer2xhtml"; + case xhtml11: return "org.openoffice.da.writer2xhtml11"; + case xhtml_mathml: return "org.openoffice.da.writer2xhtml.mathml"; + case html5: return "org.openoffice.da.writer2xhtml5"; + case epub: return "org.openoffice.da.writer2xhtml.epub"; + case latex: return "org.openoffice.da.writer2latex.latex"; + default: return ""; + } + } + +} diff --git a/source/java/org/openoffice/da/comp/writer2xhtml/Writer2xhtml.java b/source/java/org/openoffice/da/comp/writer2xhtml/Writer2xhtml.java index 7467b29..50d30f7 100644 --- a/source/java/org/openoffice/da/comp/writer2xhtml/Writer2xhtml.java +++ b/source/java/org/openoffice/da/comp/writer2xhtml/Writer2xhtml.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.6 (2014-10-09) + * Version 1.6 (2014-10-21) * */ @@ -33,27 +33,20 @@ import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; + import com.sun.star.beans.PropertyValue; -import com.sun.star.beans.XPropertyAccess; -import com.sun.star.frame.XController; +import com.sun.star.frame.XDispatchHelper; +import com.sun.star.frame.XDispatchProvider; import com.sun.star.frame.XFrame; -import com.sun.star.frame.XModel; -import com.sun.star.frame.XStorable; -import com.sun.star.io.XInputStream; +import com.sun.star.lang.XComponent; import com.sun.star.lib.uno.helper.WeakBase; -import com.sun.star.task.XStatusIndicator; -import com.sun.star.task.XStatusIndicatorFactory; -import com.sun.star.ucb.XSimpleFileAccess2; -import com.sun.star.ui.dialogs.ExecutableDialogResults; import com.sun.star.ui.dialogs.XExecutableDialog; +import com.sun.star.uno.Exception; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; -import com.sun.star.util.XModifiable; - -import org.openoffice.da.comp.w2lcommon.filter.UNOConverter; +import org.openoffice.da.comp.w2lcommon.filter.UNOPublisher; +import org.openoffice.da.comp.w2lcommon.filter.UNOPublisher.TargetFormat; import org.openoffice.da.comp.w2lcommon.helper.MessageBox; - -import writer2latex.util.Misc; /** This class implements the ui (dispatch) commands provided by Writer2xhtml. */ @@ -65,56 +58,19 @@ public final class Writer2xhtml extends WeakBase private static final String PROTOCOL = "org.openoffice.da.writer2xhtml:"; - private enum TargetFormat { xhtml, xhtml11, xhtml_mathml, html5, epub }; - // From constructor+initialization private final XComponentContext m_xContext; private XFrame m_xFrame; - private XModel xModel = null; + private UNOPublisher unoPublisher = null; // Global data - private PropertyValue[] mediaProps = null; - public static final String __implementationName = Writer2xhtml.class.getName(); public static final String __serviceName = "com.sun.star.frame.ProtocolHandler"; private static final String[] m_serviceNames = { __serviceName }; // TODO: These should be configurable private TargetFormat xhtmlFormat = TargetFormat.xhtml_mathml; - private TargetFormat epubFormat = TargetFormat.epub; - - private String getTargetExtension(TargetFormat format) { - switch (format) { - case xhtml: return ".html"; - case xhtml11: return ".xhtml"; - case xhtml_mathml: return ".xhtml"; - case html5: return ".html"; - case epub: return ".epub"; - default: return ""; - } - } - - private String getDialogName(TargetFormat format) { - switch (format) { - case xhtml: return "org.openoffice.da.comp.writer2xhtml.XhtmlOptionsDialog"; - case xhtml11: return "org.openoffice.da.comp.writer2xhtml.XhtmlOptionsDialog"; - case xhtml_mathml: return "org.openoffice.da.comp.writer2xhtml.XhtmlOptionsDialogMath"; - case html5: return "org.openoffice.da.comp.writer2xhtml.XhtmlOptionsDialogMath"; - case epub: return "org.openoffice.da.comp.writer2xhtml.EpubOptionsDialog"; - default: return ""; - } - } - - private String getFilterName(TargetFormat format) { - switch (format) { - case xhtml: return "org.openoffice.da.writer2xhtml"; - case xhtml11: return "org.openoffice.da.writer2xhtml11"; - case xhtml_mathml: return "org.openoffice.da.writer2xhtml.mathml"; - case html5: return "org.openoffice.da.writer2xhtml5"; - case epub: return "org.openoffice.da.writer2xhtml.epub"; - default: return ""; - } - } + private TargetFormat epubFormat = TargetFormat.epub; public Writer2xhtml(XComponentContext xContext) { m_xContext = xContext; @@ -127,11 +83,6 @@ public final class Writer2xhtml extends WeakBase // The first item is the current frame m_xFrame = (com.sun.star.frame.XFrame) UnoRuntime.queryInterface( com.sun.star.frame.XFrame.class, object[0]); - // Get the model for the document from the frame - XController xController = m_xFrame.getController(); - if (xController!=null) { - xModel = xController.getModel(); - } } } @@ -163,6 +114,8 @@ public final class Writer2xhtml extends WeakBase return this; else if ( aURL.Path.compareTo("PublishAsEPUB") == 0 ) return this; + else if ( aURL.Path.compareTo("EditEPUBDocumentProperties") == 0 ) + return this; } return null; } @@ -186,7 +139,6 @@ public final class Writer2xhtml extends WeakBase public void dispatch( com.sun.star.util.URL aURL, com.sun.star.beans.PropertyValue[] aArguments ) { if ( aURL.Protocol.compareTo(PROTOCOL) == 0 ) { - System.out.println(aURL.Protocol+" "+aURL.Path); if ( aURL.Path.compareTo("PublishAsXHTML") == 0 ) { publish(xhtmlFormat); return; @@ -195,6 +147,10 @@ public final class Writer2xhtml extends WeakBase publish(epubFormat); return; } + else if ( aURL.Path.compareTo("EditEPUBDocumentProperties") == 0 ) { + editDocumentProperties(); + return; + } } } @@ -207,141 +163,43 @@ public final class Writer2xhtml extends WeakBase } // The actual commands... + private void editDocumentProperties() { + Object dialog; + try { + dialog = m_xContext.getServiceManager().createInstanceWithContext("org.openoffice.da.writer2xhtml.EpubMetadataDialog", m_xContext); + XExecutableDialog xDialog = (XExecutableDialog) UnoRuntime.queryInterface(XExecutableDialog.class, dialog); + xDialog.execute(); + // Dispose the dialog after execution (to free up the memory) + XComponent xComponent = (XComponent) UnoRuntime.queryInterface(XComponent.class, dialog); + if (xComponent!=null) { + xComponent.dispose(); + } + } catch (Exception e) { + // Failed to get dialog + } + } private void publish(TargetFormat format) { - if (saveDocument() && updateMediaProperties(xhtmlFormat)) { - // Create a (somewhat coarse grained) status indicator/progress bar - XStatusIndicatorFactory xFactory = (com.sun.star.task.XStatusIndicatorFactory) - UnoRuntime.queryInterface(com.sun.star.task.XStatusIndicatorFactory.class, m_xFrame); - XStatusIndicator xStatus = xFactory.createStatusIndicator(); - xStatus.start("Writer2xhtml",10); - xStatus.setValue(1); // At least we have started, that's 10% :-) - - System.out.println("Document location "+xModel.getURL()); - - try { - // Convert to desired format - UNOConverter converter = new UNOConverter(mediaProps, m_xContext); - // Initialize the file access (to read the office document) - XSimpleFileAccess2 sfa2 = null; - try { - Object sfaObject = m_xContext.getServiceManager().createInstanceWithContext( - "com.sun.star.ucb.SimpleFileAccess", m_xContext); - sfa2 = (XSimpleFileAccess2) UnoRuntime.queryInterface(XSimpleFileAccess2.class, sfaObject); + if (unoPublisher==null) { + unoPublisher = new UNOPublisher(m_xContext,m_xFrame); + } + String sTargetURL = unoPublisher.publish(format); + // Display the result + File file = urlToFile(sTargetURL); + if (file.exists()) { + // Open the file in the default application on this system (if any) + if (Desktop.isDesktopSupported()) { + Desktop desktop = Desktop.getDesktop(); + try { + desktop.open(file); + } catch (IOException e) { + System.err.println(e.getMessage()); } - catch (com.sun.star.uno.Exception e) { - // failed to get SimpleFileAccess service (should not happen) - } - XInputStream xis = sfa2.openFileRead(xModel.getURL()); - converter.convert(xis); - xis.closeInput(); - } - catch (IOException | com.sun.star.uno.Exception e) { - xStatus.end(); - MessageBox msgBox = new MessageBox(m_xContext, m_xFrame); - msgBox.showMessage("Writer2xhtml Error","Failed to export document"); - return; - } - xStatus.setValue(6); // Export is finished, that's more than half :-) - - if (xModel.getURL().startsWith("file:")) { - File file = urlToFile(getTargetURL(format)); - if (file.exists()) { - // Open the file in the default application on this system (if any) - if (Desktop.isDesktopSupported()) { - Desktop desktop = Desktop.getDesktop(); - try { - desktop.open(file); - } catch (IOException e) { - System.err.println(e.getMessage()); - } - } - } - else { - MessageBox msgBox = new MessageBox(m_xContext, m_xFrame); - msgBox.showMessage("Writer2xhtml Error","Failed to open exported document"); - } - } - else { - MessageBox msgBox = new MessageBox(m_xContext, m_xFrame); - msgBox.showMessage("Writer2xhtml Error","Cannot open document on the location "+getTargetURL(format)); - } - - xStatus.setValue(10); // The user will usually not see this... - - xStatus.end(); + } } - } - - private boolean saveDocument() { - String sDocumentUrl = xModel.getURL(); - if (sDocumentUrl.length()!=0) { // The document has a location - XModifiable xModifiable = (XModifiable) UnoRuntime.queryInterface(XModifiable.class, xModel); - if (xModifiable.isModified()) { // It is modified and need to be saved - XStorable xStorable = (XStorable) UnoRuntime.queryInterface(XStorable.class, xModel); - try { - xStorable.store(); - } catch (com.sun.star.io.IOException e) { - return false; - } - } - } - else { // No location, ask the user to save the document + else { MessageBox msgBox = new MessageBox(m_xContext, m_xFrame); - msgBox.showMessage("Document not saved!","Please save the document before publishing the file"); - return false; - } - return true; - } - - // Some utility methods - private String getTargetURL(TargetFormat format) { - return Misc.removeExtension(xModel.getURL())+getTargetExtension(format); - } - - private void prepareMediaProperties(TargetFormat format) { - // Create inital media properties - mediaProps = new PropertyValue[2]; - mediaProps[0] = new PropertyValue(); - mediaProps[0].Name = "FilterName"; - mediaProps[0].Value = getFilterName(format); - mediaProps[1] = new PropertyValue(); - mediaProps[1].Name = "URL"; - mediaProps[1].Value = getTargetURL(format); - } - - private boolean updateMediaProperties(TargetFormat format) { - prepareMediaProperties(format); - - try { - // Display options dialog - Object dialog = m_xContext.getServiceManager() - .createInstanceWithContext(getDialogName(format), m_xContext); - - XPropertyAccess xPropertyAccess = (XPropertyAccess) - UnoRuntime.queryInterface(XPropertyAccess.class, dialog); - xPropertyAccess.setPropertyValues(mediaProps); - - XExecutableDialog xDialog = (XExecutableDialog) - UnoRuntime.queryInterface(XExecutableDialog.class, dialog); - if (xDialog.execute()==ExecutableDialogResults.OK) { - mediaProps = xPropertyAccess.getPropertyValues(); - return true; - } - else { - mediaProps = null; - return false; - } - } - catch (com.sun.star.beans.UnknownPropertyException e) { - // setPropertyValues will not fail.. - mediaProps = null; - return false; - } - catch (com.sun.star.uno.Exception e) { - // getServiceManager will not fail.. - mediaProps = null; - return false; + msgBox.showMessage("Writer2xhtml","Error: Failed to open exported document"); } } @@ -353,6 +211,8 @@ public final class Writer2xhtml extends WeakBase return new File("."); } } + + } \ No newline at end of file diff --git a/source/java/writer2latex/api/ConverterFactory.java b/source/java/writer2latex/api/ConverterFactory.java index 2b59025..8ce439f 100644 --- a/source/java/writer2latex/api/ConverterFactory.java +++ b/source/java/writer2latex/api/ConverterFactory.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.6 (2014-10-06) + * Version 1.6 (2014-10-22) * */ @@ -33,7 +33,7 @@ public class ConverterFactory { // Version information private static final String VERSION = "1.5.1"; - private static final String DATE = "2014-10-06"; + private static final String DATE = "2014-10-22"; /** Return the Writer2LaTeX version in the form * (major version).(minor version).(patch level)
diff --git a/source/java/writer2latex/util/Misc.java b/source/java/writer2latex/util/Misc.java index a45f6b4..8790e15 100644 --- a/source/java/writer2latex/util/Misc.java +++ b/source/java/writer2latex/util/Misc.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.4 (2014-10-10) + * Version 1.4 (2014-10-21) * */ @@ -33,7 +33,6 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.lang.Math; import java.net.URI; -import java.net.URISyntaxException; import java.net.URLEncoder; import java.net.URLDecoder; import java.text.Collator; @@ -44,7 +43,6 @@ import java.util.Arrays; import java.util.Date; import java.util.Locale; import java.util.Set; -//import java.util.Hashtable; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -303,14 +301,7 @@ public class Misc{ * @return the file name */ public static final String getFileName(String sURL) { - try { - URI uri = new URI(sURL); - String sPath = uri.getPath(); - return sPath.substring(sPath.lastIndexOf('/')+1); - } catch (URISyntaxException e) { - e.printStackTrace(); - return ""; - } + return sURL.substring(sURL.lastIndexOf('/')+1); } /** Get the file extension from an URL diff --git a/source/oxt/writer2xhtml/Addons.xcu b/source/oxt/writer2xhtml/Addons.xcu index 41bfb93..169d50e 100644 --- a/source/oxt/writer2xhtml/Addons.xcu +++ b/source/oxt/writer2xhtml/Addons.xcu @@ -8,24 +8,6 @@ com.sun.star.text.TextDocument - - Publish as EPUB - Publicer som EPUB - - - _self - - - org.openoffice.da.writer2xhtml:PublishAsEPUB - - - %origin%/icons/epub - - - - - com.sun.star.text.TextDocument - Publish as XHTML Publicer som XHTML @@ -40,6 +22,60 @@ %origin%/icons/html5 + + + com.sun.star.text.TextDocument + + + Publish as EPUB + Publicer som EPUB + + + _self + + + org.openoffice.da.writer2xhtml:PublishAsEPUB + + + %origin%/icons/epub + + + + + com.sun.star.text.TextDocument + + + Edit EPUB document properties + Rediger EPUB-dokumentegenskaber + + + _self + + + org.openoffice.da.writer2xhtml:EditEPUBDocumentProperties + + + %origin%/icons/metadata + + + + + com.sun.star.text.TextDocument + + + Edit custom style + Rediger brugerdefineret typografi + + + _self + + + .uno:OptionsTreeDialog?OptionsPageURL:string=%origin%/W2XDialogs2/General.xdl + + + %origin%/icons/customh + + diff --git a/source/oxt/writer2xhtml/icons/customh_16.bmp b/source/oxt/writer2xhtml/icons/customh_16.bmp new file mode 100755 index 0000000000000000000000000000000000000000..5fbc697635193b4a4e5b215f53bb93352348f734 GIT binary patch literal 890 zcmZ?rtzu>XgDN1I1H=MQ%*Y@C7H0s;3v)v-M1X<8$vvnT#wM0#LR0u*Py&b}flh-n zke!Js2p54f@Tf;tgUrUI1z8O;8>@OW1rRQpAVecpDP%z)o1hiQCR2+Iv=nX>gaId! RU5>|XaP7F%BkLVlHUME*1GxYI literal 0 HcmV?d00001 diff --git a/source/oxt/writer2xhtml/icons/customh_26.bmp b/source/oxt/writer2xhtml/icons/customh_26.bmp new file mode 100755 index 0000000000000000000000000000000000000000..c502eca0de4dbbe95ec441f26cb4ee6597220b61 GIT binary patch literal 2202 zcmeHFF%H5&3=2$1j4X(Ww{&4*;T>#jeG0Ga6NqwGEBGRjtI7nG?&>&>Wu+ai&z;ya z>V4O9s%Ild@+ zuT9f3nTT_~cDiNKe&J|HezdfF;V4KC5`K`A7CZrxm69}8k}#4~j+9zDv9G)kk}fi_ zzka_kVlp4eI{!bKZiCEzQ3t~eumLn2<6vzU23i8pD?kgR%SU}^J-{4^!N2=~UJU+z Ji&tlZA};_7W`qC$ literal 0 HcmV?d00001 diff --git a/source/oxt/writer2xhtml/icons/epub_16.bmp b/source/oxt/writer2xhtml/icons/epub_16.bmp index 0446323b4872e3b00b287d2fd7e06b200e1d9000..01e99e31094e53652af22c7add13046bf671837b 100644 GIT binary patch literal 890 zcma)%OG^S_6o#i-wh2P%2h^^DTD1rQH?GpuwpL4!5nqgfFBR)F3r*Yb9r-|thbq0QW zD;*LTMxz~>`^o?NZI*#wis!MA>+`H5kSI*KkS`Ux-3FCQk3fP_PBhesV!lU&)tnxI z7L*Vhkb0Ug7yCUMYK{eFc?wuk0TsGjEJRp!PRuf&?-)g}{W(IeJrk+6a4akUQp;PZ zFyP(BSWGjg{F08uoV=mM004uMD;0X(#wyIQd+A$(_cLMX7KoSw02ttjkPSJ)l&noY zdf`d2rbE<@TWB%Bn+YFW3?KBF$SqXLofoV0FOJtJi92XQaz}$!a)%DtlC!)+0+h+p{WXgDN1I1H=MQ%*Y@C7H0s;3v)v-M1X<8$vvnT#wM0#LR0vk;XfLBB=*60 z!DJu;GSH+jxu3Xx=q{Tmy1fO6fD9lPQw?0?neZpQ#S=w$w218lAs_?D1q#9yATvI5 z{xF$8MQleaP}wrqi$Ej_)U~}8Cz&+$7AVcSoi1(E&1 z`df8%55zBfP3}Mh7kL1+w9fTC4dm9P?S{xkHm`ulzUTP{cjN}Us}R9GFug!-d;9@l z1Oat9PMQ6W;U7@s57S?@)xAIwAUdRfAEE`BY)IY%aaeT2N{Dz=;|hpKRr*e3m2h@> z_70!|AoA{A07MW+R%GpfE5KwlC+>x~0iv-baUZ4{G?DC*jSy$#6mLY6!o{5taAHQ_ HNvyH}&!NM< diff --git a/source/oxt/writer2xhtml/icons/epub_16h.bmp b/source/oxt/writer2xhtml/icons/epub_16h.bmp index da608c3928d52d1f209381ed3ceefce9a8f10d3a..27e6954dfeffc0181fdd7afb8e1b77a8b38a83c1 100644 GIT binary patch literal 890 zcma)%%}WAN6vd}nwh`J$1hr`uv~4eh5wvMl`+}f|qE`L^E+&SIFd>w%m61?wq7PaX zCearbZrWH9pMQ{csy7I$sw%-ms=;yfB7gAC7QCxGQWk<=Bq0UBE_r47!Ah9A1+;71 zhX`m%>n$}A05CWimg_UOsL!@~OK?=Vk17wOVG1?tUSNR7jeQP_>spe4n35tVQZKLH zA^{e)1T`P3go)3wg3H{Xo^j=w%z&DNv!*3*oYzk&J8JAvHX}EN+)?kyj4Mwhu&XgDN1I1H=MQ%*Y@C7H0s;3v)v-M1X<8$vvnT#wM0#LR0vk;XfLBApb$} z-b^3@GSH+jxgYs{NIjjw_^%6yfD9lPQw?0?iS#F#$I}@8cfk>m3lxMaKxTa6{i$?! zCgZPkr1-LknF*EHV&?7)8paP&WpvZfH?{W{PL(EwceGQ^`P4JC1!8ajnpdiD4ki9@< zK*jzWHh>j(%}9ruyxHe2L}YmcR6ER;UZCR1Ip-jT>s_1=G4KcbZ=tu7AZBj&xCarO zm3k2uAdbwL uycbyw8oQ$XAjAz2jg@VO(G*~E;}&j(I3s?+R!mu}BK-xY`wPxsl>z`dbl4yO diff --git a/source/oxt/writer2xhtml/icons/epub_26.bmp b/source/oxt/writer2xhtml/icons/epub_26.bmp index 06f1ffacbdfd14770aab9d6308098d77876b154b..ee3a0f9c1a1c377ce179b60f8c54d392f2b40c65 100644 GIT binary patch literal 2202 zcma)+%}*0S7{*smCLT>2f(S*qcv6p^)Ec8Enix)^9{k{Bl#4gKZfjdWEgDnWDAA-O zmP9mBv)!!}`z26>*rXrUsKgir=?8y;Pj}eq+iiDCGdq1|=6Qbmb~?NE^Zs3e`WZ%l z3s>jXwL|Do=WSTuvzuM&1Umca{yUo9?)OfeakJgWnT=S(4vQp0wDWEXg1N<$n+1$D zATc!eoASnTQ4ZtCv3%47Y0P_=|A>NgJT`ogpEE)l@E#RnfH5BW!?WXuqFz1(6^53` zRy^O=1QIL_(Wi|5tCZ0WL`GPBtoId@&B!L+s35|%Nr~Qu|MMBRYJh5LpJh) z-_x`Lo9zCh!B`H%Ud7ElKq5ksgg5O7($?7@2R1Qhl%0LJBmCWpP&b)hK%{>UOKai4oT``D?`gOG;t~spow#- zNm}CVl^MDU-NeJ(^>oNW-Y;j9&sgY8@+rR+49&;UfQRYJ3sV$%;nQ=pI!tn0S)5`w z(e!-vK^SO$P3he)N0CNM-yd04+hk&=jg;H9(_?RW@*QL9oC VjrNR!x50z`aUqUIb4FSa{sVqH1gZc4 literal 2202 zcma)+dq`7J9LG;jgZi%~B3bLD(%Qhs zdaQ?}t39gK9T-7H%cP$j~gKMc|H3^U`WH`%^uquJ){n=-})9X)6)bG^#=dd zqFZj!M5k}>XjWu4o`3f{j!C$YrNThx#QZ6gwf9|U@=nzLJ?}G-8N7SNA1Q40gO1-h zlROW>nqY@;i3JRne9|D(d7*8e6Vvk|OXi^SSIz{@Kyy{dnRKaKBBW3O;YGKMrNKgu z@r6leGy|RHu!AC_o5zGe&&NT|}dC^xfXo}eZ zn`YCLQQI7;X$sRG2v$VeP5gM2g#!WsWAXLhgfqYj9=6jw#MR9q2rwZ6%}~LkHnDJM zfMTpd8W6m^Xsafp{?y}?b=iLWOpprTaygLd5dy{7ozf4vvD7;#47g|p;u6m_dhJe} zO>_BY!QcF7YvK~gcA%8~>$Qzg*b@*s33!f zj!VaeDYDq(qZbG9c29qD4a!aFs(h(I5`TQ8u`Zg(P~ZKo?i)12=DbZUHq=MyDB=tr z`l?TdOv=v`2bXpFc~Y6{rkDqUnvCnH!$bFx3jvBe&~_Ik1(PKR_#~P-n?Ei&)G{cJ zTN6~Z3~4Z;sn3I?>f%u9c#@C6ZU94yArIq+DN?rUEpvAMxC)GfOTf-&-!lP2@IQZC N>$8rc&^*1Ev3~&qqQd|H diff --git a/source/oxt/writer2xhtml/icons/epub_26h.bmp b/source/oxt/writer2xhtml/icons/epub_26h.bmp index fe561d657ccd01261cbf3a2f90cadfe87774ea83..6c7f22ba4d171e037af96a8d774e2552928d759d 100644 GIT binary patch literal 2202 zcma)+O=uHA7>36p)>@H(AR<(}dGiN6^x#2q5r29KT2Df~3ku#!4`QLh=*HE8r9w4I zMO(2IMWL6XR_Y&!h=Mmy^{>@#vDsv^$;5YNc9O5V*-gXjeS=C}yj-Z*=VJum4zVJf9 zz>`P}ll6(be)lDT1;~DPCIK1G8*pEtpa@S=2jY=2Jg#9v@dWRv40lwnGcyE|yR!|e zY{awO*Rrg@ZKcHEZ|4tMO4v-Or&hh~zKJ3uyrKL%3fm;?@6LkuA;8ew2c`3&{QD4c zCGTebgM{fOtc~KzoHI`y7$O-|sdgL|Dj>Yk<&PBBF0wyNWz>NrrYI7|n!xZLEPtxQ zs@4XPop=7$RG|P<5YXL+U27C?a``ivSE&Q>o^p;JyNowU1wWmIwLr?l$|XvE4=%bh6uG4`NF9jx`nS!o!-DY>E0N!p zejy16lxBY~xcH8!w@WR?_R4SsdCOEOOF311N(En*=Je3;FzPK#*O9{7SstMdEY+_1 zgUdUgElyEEgonhL;uJ;hF6ZdMQOJ>C_0`Vy6{bT-QlFmbDPlwMF$muKeSVHQ_WO6u zlq|8wdrW5$M|j8`(+AFcUpoC!ZR+&z7?`|U^f<=wkUm-(S5?X)z&POFL!+>+(zw1! zsBcuCmK-XLNm!$HxHJ~R)Q0gqNZ_k)PXOi#Fjx|Km_H&PTs^hqajZkFl!iew9!zR2 Wf#h*(M!~D#L4L`dMWepBn6dvA;5rfj literal 2202 zcma)+Ur19?9LLWJYi&hnFA{-1_f`?~U=UJB57qJ|Df2~GL4$-vLefk4V5iN^G;$`C zPFYd9{vnnRNzy-4%l<$Vq2NPLN|rnwws;Y>;I+0(&K@48xAs z()dQgz!OL;?e(_2fPb98a>#)Htqsze7iyS5LnfY}h8ir97QA-fBw&t=;9)MC?JAq? z)R#!M`=$zZS%??$zE>DI2a6Xv{;W%56fd+nGNL~0y4_mRRj{|qNwDdj_e zCFzp))O|7_^Le+AeF01jG_h$hwB*jgln+ZJRew^(VWCLEi+jFN*v4O>PU?@bnv?lL*QNtrHazJ$`GIg0X==#l}7TO9+)9T?n<;}92v@}jSkgDAJYs3 zu0$(ofdc{oW6$@_(X=xerar_c`W{IEM_?#9lex`S1c72z!}oOF+H|YIQQ!T9wq6r^ zNCoI}{qGf|K(X%n55y5HnZHUMh<8my)$XggCYJZblg__IsershT%g47LHKOmt5y2r zngO|cyidD!=!T!{%|p(YEF%dBT-y0wIfvhomAAEg=7tH`t91z(KYe|K3g)&gs-?!m z>e9s*Iuh3HpKnqJwra-|MFtyNMybHWL*o49QHtC-8KoCTB5$d~Q@u7fy)+<6f2wk- z69<}m<6+wKDoP#up4}neI_QlI(<)*U54q$0;=<_%P%#!$ri!tC4JPi0`8rzgkUlyX zr^x*ycQGiedLXX;iD53(pOPGYFaTu1apeA>0i!Rid62-TACCs+HZWLhd8m8h6v?p< hdMgEk|M6gwdnxX))t*uCDtM50oOy>qeO57J{{SVu*vbF^ diff --git a/source/oxt/writer2xhtml/icons/html5_16.bmp b/source/oxt/writer2xhtml/icons/html5_16.bmp index ad2b2f66255e75054b00b6860b3282e4845aceff..16714101c5c9d89b1efb1b89b8de19bf73c54805 100644 GIT binary patch delta 398 zcmeyx_KR&oRs9E4u=T*3ivAaN2~X`4pHxnGvF+d+RCy?G-n!QT`OnmRpFohR_hXH? zx9XuUfLv9d$NqUwfeMf{TE#wvD^~G&EbID6A>pHX%12G{w2vBz@72RzTE;v<)-YLs zQHjszF^Z4_qY4jP;KAeflM8?X51+h;h@HLscJczC0FZ_V>^S^p@&%v(kcJ2>-t>AB zlM2t0%}}RJSoCVL0h5XikcKFzne-CqO84}qpFX^vw)};h`(p+7$I3|`l@mTd5YWXy zrvjBh)TcK+pF9C*B9Mj%1Q$M=d;lmARPYoc01U{8BiHSy^7CcS=UDj2_Mx{K5B}mebh*NuO9l+ z+T|&-hRFhqN_^grQG^^ARe0b6?^yp#E&vL=XZ;HiyUF`&@&cd$kcJ2x7X3c?0#E=* zLj=~!e3`_g!m~~W>a-aupC%hHsn`H%h=L}a_dr*=r$7Dl;q|oTFXY@GE4V*aPWq^v z@BxB=E(SUks0^Y$$N0_U2|yEpG(;fG`qktEK!H%}mk5XQ%oBcLEcnh=apNh1M~==lN(ifE;vrPzc>K(x{>g;)j~QG68^HiGzU z#Ku}}EUnc)!AI0!xci*l*$d|jTxQ?Dnf-Qm21oPNq)VRLIj;4lR#8N+6Yqy>rOE=) z;K;;+KmKoTeFGoAmV?7$X1Ww>cH>QMHdi`2E`HrNvz67iR9Bg7X!D3bZJ>y!rWR72 zWd?$dkp`D+y{iGmcYyjq10V+!^&(L>$eYN7@D%oMA>|TiS<^iGTHbe_4ED35cJPT6 z{_gHc#rOGGR*fkQXVoSKwQSC1Hn5N|@jkSO)CErv%MbDe(!# C+wmO$ literal 890 zcma)4Peg-Z82`28J4Bi>6WzuRV@6^|ril)Tj6|1RI}}-xO`=QJE-~@xwqthLWk%PS z?-G-kk&&I#Wg@?x_x--t`<0nJp7)RE`MuBc{C?izZfzdgYO){8S`OA65;_ja#}@tN z2Y}*s>CD_`JtO~t3q*tfu}W+(U176N-@0U>L7Wr&M4l)RX$_9?s>N}Dnta@ih#exM zE9WO;{zY*@WEI{i*-Zb3xhfGQO5AJNxZIX*h;@Ze9@)4e;=4?nBN8^1aWxAtTM2?A zYOp9EPc}8dl*LOs#ahIPD`gb@lqoKF8CBRN_-$UCdO`honXbqCE?sd?-=Enb+vHGWSRxI3b3U0yZDNC~yMdv5Kp-v^2Tb*44M4%1>UFPF>IUjxukA z`FKHp4~xDC2=p1xg(rlszKL3Bt)d4eQ6{~%^>p$A z=JDSVLDINmD2|-1JsrHjO^EQ+P8t9F{inKrT%?iKkOvmZjI&>rzA=HG0>eU?@vHac zeItzi0K-C=@w2588cql8p@-||0Vc?5OaK4? delta 943 zcmZvaPfQa*6vj)bb|q1}p;j#fNldp}Fd#+OCM`wRS}D7VjgdqyHbJ=t}c$NLvN=sWSwzW|Fwq*@#n@skb@BQYz?96*h^b-B}{`|IO zyLr_twX(HVux%|nDvQ26&ufvh+9I1@aa0fl!hz;2L@ZdQdJ0wjNSB}W7H%^M-&OE4UA{Y%jgO=UV#-btloBL;i4vPw zXQwjW$utvJ8^M7wIUY*Q4rP(}uj;OP581p&ysZCEqZ+ard)*3>Z>He8RbX%C+36gc z$a$yMyjL|w)PMdFn{QR{-e8uzZ{yt1R`|x5AH-$l+=;+iD=dtr$c&Zi7Q$L9%%4*k zk-WD0dqf%iXgc!Kwl#7dHz!oPzgv{U5e<>XDdWzo9o66kl}xsC?qEb+-M91B2L5ue z!bKJG0vHNs&VGBSIJF%`nLn zyaG{d0hb^pJq0s-a3V*B_k^4a{W&w3JGo940OpM6u3x0mR>P=~uK-XuB-H^1SMR{_ zy&)$$0B3-dee+r{O=bb0Y5S%DzIRmhro00f4{LA+__qJgD6f)Ed&mieGr+Q=j3Fn} y_RwJ{oB=*`mih&KbjWq8i>%mt=)Q3YL4&_>m68;H0AfU5cKsq(D4v4WLw^D1Qse0W diff --git a/source/oxt/writer2xhtml/icons/html5_26h.bmp b/source/oxt/writer2xhtml/icons/html5_26h.bmp index 1a93e055d4913ff386e1315197a1187bc74fad1d..9a19d1f6b40bc2497ce373e2bd3b36074614f9bf 100644 GIT binary patch literal 2202 zcma)-T}TvB6vt0X+osl*8D^Sgu^?v2(g%qUeh@`OA4pM3;9Fl5sTF<@K`%Y@^+>FlRSJRey3yV zW!Q*B#?#y#yl~h!dVD6hBaz`Z6+@6rX-wOhicKms$GMAabZL`Nt%)oJu>fkjt zPb)Q+AdoPy41j8;N~YaR6-+x#3NYm;#Z8x|-FPSJW^4c!Xc>4uX?q<=P{GC*ip2-v z=*Fw6o>e@MAgEBNDQ)JbLu|DV%$1Lst}q>wDuFB&ysABMH(trsgwmA5*Sa~TDDJm= zBTNUF$^>uomV_IxXk(JRrchSl&Pbc33rs=qOk~qM-jCsEK_Rk3@O-tl=TMT%+nBPM zYWYaFJ&%$91~x|U3N|F+ZZ*BX0|OIl)+DYv0w8149Bh~ld0={82XKTx7M56z@dJ=|A9lWemQ>6Junjey7gH#A2Z@o4@EqL1=v^H-xyMliMQP^2xTV5iahOyb|Gc`dlnkU){+W zbvW|b&@0-A>9pn^a&>H+#aQVka9 zH1Lqp#Bc`$P4ZB3t7!Z{xm+WD<4-SeWBK3XzIAIr;1Gc_@j(pc8FM~@;6M$&m+jkR%>*ZmCK9q9= z8Wq!Nm_b!&Ni`J0{gUTrxC5ejy}gF`^&se0%FOMla{xT3X@*H`NiM@35Y2n`-0)_~ zWVVp=dl}c1WN{`=9(#QzAP$~NzWF3;#)<<%;cD_%n#O}4oc_kMp5leSnU^*156w&! ANdN!< literal 2202 zcma)-Pe@cz6voeeGozU?WD}y26kpJ#ulbGK% zj_3KW$^Mm8ne|=VPn6rgS>VuhBzeirH+uC#H$qToe+54UUj;J?S3J~3v0GtK;kD9> z+~N&|UR)7c-p*&ibHP0iClt0RhzE(8vCNDf5(+03?t6Hlu$1qc&wDB8i=Z`%%~8jQ zK`CvT+6uJ?Y6m24LVaT3m_LR zm1CX+sl0sr5+rlUt#>pYhaJTB1CHHB4G$Q!PF>RE(VY;6(CA~!?aA?4eBSsXrkAx% zEnyLP#t@HwhnzMgL-&a8+m5#^IFRFQ?B%r&l>t-ao_7D@^F9dt=F;oy`|qsurs0*L zNr4cj@2y~GP9NJj1I>;ZG_J5K4CWgf;ZehjYj;8%@0FNO4})$?#)dUC5>IN#xY()R zPky-walC0kiEXA9SvayTNeUKAa9)KH1wtI}84pVjThfIvE1Gdw%gm>g5XXDWqgkh- PFuQ0UxYig0A%^!4i9C-+ diff --git a/source/oxt/writer2xhtml/icons/metadata_16.bmp b/source/oxt/writer2xhtml/icons/metadata_16.bmp new file mode 100755 index 0000000000000000000000000000000000000000..32924a536eb6a32a4ab0d94518bbbd61a45f2881 GIT binary patch literal 890 zcma)%PfG$}5XQGUb_qi13v{cXP91{4OQ$YDMIWF}UHSu&6m)QJf%XsW8jB!BkXi0R zXl?~&3Tqawp_R5o+S>LJdfcgX*)3?9_w|`)elzdr8g;iZ`sc@}gD;6FVR= zE%0y&pLmEs;ffXm01Qq=t@g!y4On3Jiq|y6;E}?_900%oPo;v;2!Ek58Q4r?B7wK9~ zpjU>)fTn41>e@&5**fMRqUAekG2hGC6Ka`Ea>K6cMB5D8t literal 0 HcmV?d00001 diff --git a/source/oxt/writer2xhtml/icons/metadata_16h.bmp b/source/oxt/writer2xhtml/icons/metadata_16h.bmp new file mode 100755 index 0000000000000000000000000000000000000000..b39510a6fa75158ca95f19240f06a154ba671311 GIT binary patch literal 890 zcma)&O-lk%6ozlLY$LRh2x`+R=tl@)1Z`T?z91-~sFgp!#f?isln_eL%1Ed-(Fd&x zb5Rf$ZrWH9kxKq3GVLRc9v-)elwZ$6TIS668 zke1AAg(17M__c6dz(lIWDfOhksm=nO_l$cgv4uTLAO*lFdDaTUwV0i%i-^2|Pdr3K zrtNQOZ~(yIZTL literal 0 HcmV?d00001 diff --git a/source/oxt/writer2xhtml/icons/metadata_26.bmp b/source/oxt/writer2xhtml/icons/metadata_26.bmp new file mode 100755 index 0000000000000000000000000000000000000000..796713a94ca5d9fed01be02242b58737c14a4f7a GIT binary patch literal 2202 zcma)+%TE(g6vjtaCN51If(XU9aiuO@X-JGNWW!3-g|C%SHtujct!)*xXiR|^5|fe$ ziD;r`I)fA`G(Z(%lRm6bi7^W4i$B3{<~paRx1A}InLFp+^L@WLbMKw$>mT2zSjRBh zTev#^Uwf1eYutzYf&JpL2GI1K9k^r1yS?v~ggfnyKz7a>_j@!IK|Ae^qPR=Kxp~0E z2_(AidRN{^EM?@i#f1xYTa5eL%?u?yakX0y)oL}7N88N9AOwd@WPPgxVu_7kIjRh>u6U40A|T%N z^t6=f((id~Bp^U3%D~DC;&o^N$#L`ZE8^iDuB2ab0jfNx2gnYTqKp?)-gx~xIAYxA z4#dP0zN?MM?P|GG517-XsT0MNwH}fD0!JSG@Q@=V9;`P$&2YhHc?%O2DVQIjy}l3d zA7NkXiNvUI5DbB+4?LVh8?QOCu>ITC)385laOBCwXOu#KsXCP$BP4>mnfF{EV!J-k z8_vAr$kWL&zHvkW7+VPOT$dQ_gdBC8{;aZ>YfnipusZMjo@w?zb{ literal 0 HcmV?d00001 diff --git a/source/oxt/writer2xhtml/icons/metadata_26h.bmp b/source/oxt/writer2xhtml/icons/metadata_26h.bmp new file mode 100755 index 0000000000000000000000000000000000000000..1199cfd39466a636db1b23a9fcdf9a1f4fa5ca2a GIT binary patch literal 2202 zcma)+O=uHA6vxLR)>;uk5D_Zgyy?Y*2T!?(AH9T%C!yX21#hJXu~1=jV^pwIs06WK zE4E-!=%uKY`UN7Q;LTJ0puui2*<|xE@jo*=J1@K0O^4mhoA=)Tw{PA|HZypCJ5yr> z&x^SC2lp1XPx%ibzNcT`%7I7bMD~iYH~ZTYNp!o7(aKBKa#)MQ=$7j;mY#C8@=C$L zlSoX{^HX_a-fIF2kYnC*3No2D?!7@lF`lH3CnFPhT*HLo2|m!A9BAHSW(p+tRytPM ziI?}@%CfXNvU@_UT0QgLyErn&n<#&_crfRh2^1J63NfCBY$lCffEq*axJ~);X7jg ztp}Qu+HYa7bhlI~7pl+cJHKtLn*7i`QdzP{;T&pAg&`Pd)!{~gAf3zAMVg>(bN=+~ zQgx9ck2DJO;3(u&(0x_wXk{saZ08|3TwRcgU}?_LdLdjgqQ~pgCM26P>_6+qLwv}e zQ%KcLfXz5oe`sLxw8f7jw6Xg1`_9y6Ezr`!~BMi=D z9)i%>?Fqm<1=fv+_-VOt)kw+X=mVT7Beg!QQ@sR|C-sctH^D>t4Q~Y()g{@C{RhAj B(*ghh literal 0 HcmV?d00001