From e02f738e85876c9d9f786fec53a4b05cc8e2f7b6 Mon Sep 17 00:00:00 2001 From: henrikjust Date: Thu, 16 Dec 2010 09:22:24 +0000 Subject: [PATCH] Polyglossia + EPUB meta data git-svn-id: svn://svn.code.sf.net/p/writer2latex/code/trunk@80 f0f2a975-2e09-46c8-9428-3b39399b9f3c --- source/distro/changelog.txt | 17 +- source/distro/doc/user-manual.odt | Bin 48904 -> 49098 bytes .../writer2latex/ConfigurationDialog.java | 682 ++++++------------ .../comp/writer2latex/LaTeXOptionsDialog.java | 10 +- .../writer2latex/api/ConverterFactory.java | 4 +- source/java/writer2latex/api/MetaData.java | 39 +- .../java/writer2latex/epub/EPUBConverter.java | 4 +- source/java/writer2latex/epub/EPUBWriter.java | 9 +- source/java/writer2latex/epub/OPFWriter.java | 143 +++- .../java/writer2latex/latex/LaTeXConfig.java | 4 +- .../writer2latex/latex/i18n/ClassicI18n.java | 7 +- source/java/writer2latex/latex/i18n/I18n.java | 4 +- .../writer2latex/latex/i18n/Polyglossia.java | 217 ++++++ .../writer2latex/latex/i18n/XeTeXI18n.java | 27 +- source/java/writer2latex/office/MetaData.java | 66 +- .../java/writer2latex/office/XMLString.java | 5 +- source/java/writer2latex/xhtml/Converter.java | 2 + .../java/writer2latex/xhtml/CssDocument.java | 2 +- source/oxt/writer2latex/Options.xcu | 2 +- .../export.xhp | 3 +- 20 files changed, 727 insertions(+), 520 deletions(-) create mode 100644 source/java/writer2latex/latex/i18n/Polyglossia.java diff --git a/source/distro/changelog.txt b/source/distro/changelog.txt index 7aa2880..d538d71 100644 --- a/source/distro/changelog.txt +++ b/source/distro/changelog.txt @@ -2,7 +2,22 @@ Changelog for Writer2LaTeX version 1.0 -> 1.2 ---------- version 1.1.9 ---------- -[all] Custom config ui: Style controls are now disabled if there are no definitions for the current style famlily +[w2x] EPUB export now uses user-defined meta data to support meta data features that are not defined in ODF + +[w2x] The option use_dublin_core now also works for EPUB export + +[all] API extension: The metadata interface now provides title, subject, keywords, description, creator, language, date + and all user defined metadata + +[w2l] The default value for wrap_lines_after is changed to 120 + +[w2l] Bugfix: Norwegian Nynorsk and Bokmål are exported correctly to babel languages + +[w2l] Added support for polyglossia.sty (if backend=xetex and multilingual=true) + +[w2l] The option "Use greek letters as symbols" is now disabled in the ui if the backend is XeTeX + +[all] Custom config ui: Style controls are now disabled if there are no definitions for the current style family [w2l] Custom config ui: The table and figure sequence name can now be selected from existing field masters diff --git a/source/distro/doc/user-manual.odt b/source/distro/doc/user-manual.odt index e20be04516c7acc7d21f852f2d969f7354740f91..32d6a1ac233d4b403932eb03052dac562c99a634 100644 GIT binary patch delta 41536 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 bifwqf%5pG&HW~mx|8vp*apHT&-`4*Cy3Uy; delta 41345 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 aQ3w3}Zy}BrFnTK attr) { + if (!attr.containsKey("before")) { attr.put("before", ""); } + if (!attr.containsKey("after")) { attr.put("after", ""); } + dlg.setTextFieldText("Before", attr.get("before")); + dlg.setTextFieldText("After", attr.get("after")); + } + + @Override protected void getControls(DialogAccess dlg, Map attr) { + attr.put("before", dlg.getComboBoxText("Before")); + attr.put("after", dlg.getComboBoxText("After")); + } + + @Override protected void prepareControls(DialogAccess dlg, boolean bEnable) { + dlg.setControlEnabled("BeforeLabel", bEnable); + dlg.setControlEnabled("Before", bEnable); + dlg.setControlEnabled("AfterLabel", bEnable); + dlg.setControlEnabled("After", bEnable); + } + + @Override protected boolean handleEvent(DialogAccess dlg, String sMethod) { if (sMethod.equals("UseSoulChange")) { useSoulChange(dlg); return true; } - else if (sMethod.equals("FormattingAttributeChange")) { - formattingAttributeChange(dlg); - return true; + else { + return super.handleEvent(dlg, sMethod); } - else if (sMethod.equals("CustomAttributeChange")) { - customAttributeChange(dlg); - return true; - } - return false; } private void useSoulChange(DialogAccess dlg) { @@ -552,49 +552,7 @@ public final class ConfigurationDialog extends ConfigurationDialogBase implement //boolean bUseSoul = dlg.getCheckBoxStateAsBoolean("UseSoul"); //dlg.setControlEnabled("UseUlem", !bUseSoul); } - - private void formattingAttributeChange(DialogAccess dlg) { - updateAttributeMap(dlg); - - short nNewAttribute = dlg.getListBoxSelectedItem("FormattingAttribute"); - if (nNewAttribute>-1) { - String sName = sAttributeNames[nNewAttribute]; - if (attributeMap.containsKey(sName)) { - Map attr = attributeMap.get(sName); - dlg.setCheckBoxStateAsBoolean("CustomAttribute", !attr.containsKey("deleted")); - dlg.setTextFieldText("Before", attr.containsKey("before") ? attr.get("before") : ""); - dlg.setTextFieldText("After", attr.containsKey("after") ? attr.get("after") : ""); - } - else { - dlg.setCheckBoxStateAsBoolean("CustomAttribute", false); - dlg.setTextFieldText("Before", ""); - dlg.setTextFieldText("After", ""); - } - customAttributeChange(dlg); // setCheckBoxStateAsBoolean does not trigger this - nCurrentAttribute = nNewAttribute; - } - } - private void customAttributeChange(DialogAccess dlg) { - boolean bCustom = dlg.getCheckBoxStateAsBoolean("CustomAttribute"); - dlg.setControlEnabled("Before", bCustom); - dlg.setControlEnabled("After", bCustom); - } - - private void updateAttributeMap(DialogAccess dlg) { - // Save the current attribute map, if any - if (nCurrentAttribute>-1) { - Map attr = new HashMap(); - if (!dlg.getCheckBoxStateAsBoolean("CustomAttribute")) { - // don't delete the map now, but defer this to the dialog is closed - attr.put("deleted", "true"); - } - attr.put("before", dlg.getTextFieldText("Before")); - attr.put("after", dlg.getTextFieldText("After")); - attributeMap.put(sAttributeNames[nCurrentAttribute], attr); - } - } - } // The page "Fonts" @@ -846,399 +804,203 @@ public final class ConfigurationDialog extends ConfigurationDialogBase implement } - - /* - - - private XComponentContext xContext; - private XSimpleFileAccess2 sfa2; - private String sConfigFileName = null; - Config config; - // Local cache of complex options - ComplexOption[] styleMap; - ComplexOption mathSymbols; - ComplexOption stringReplace; - short nCurrentFamily = -1; - String sCurrentStyleName = null; - String sCurrentMathSymbol = null; - String sCurrentText = null; - private String sTitle = null; - private DialogAccess dlg = null; - private StyleNameProvider styleNameProvider = null; - private CustomSymbolNameProvider customSymbolNameProvider = null; - - /** Create a new ConfigurationDialog */ - /*public ConfigurationDialog(XComponentContext xContext) { - this.xContext = xContext; - - // Get the SimpleFileAccess service - 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) - } - - // Create the config file name - XStringSubstitution xPathSub = null; - try { - Object psObject = xContext.getServiceManager().createInstanceWithContext( - "com.sun.star.util.PathSubstitution", xContext); - xPathSub = (XStringSubstitution) UnoRuntime.queryInterface(XStringSubstitution.class, psObject); - sConfigFileName = xPathSub.substituteVariables("$(user)/writer2latex.xml", false); - } - catch (com.sun.star.uno.Exception e) { - // failed to get PathSubstitution service (should not happen) - } - - // Create the configuration - config = ConverterFactory.createConverter("application/x-latex").getConfig(); - - // Initialize the local cache of complex options - styleMap = new ComplexOption[5]; - for (int i=0; i<5; i++) { styleMap[i]=new ComplexOption(); } - mathSymbols = new ComplexOption(); - stringReplace = new ComplexOption(); - - styleNameProvider = new StyleNameProvider(xContext); - customSymbolNameProvider = new CustomSymbolNameProvider(xContext); - }*/ - - - - /*// Display a dialog - private XDialog getDialog(String sDialogName) { - XMultiComponentFactory xMCF = xContext.getServiceManager(); - try { - Object provider = xMCF.createInstanceWithContext( - "com.sun.star.awt.DialogProvider2", xContext); - XDialogProvider2 xDialogProvider = (XDialogProvider2) - UnoRuntime.queryInterface(XDialogProvider2.class, provider); - String sDialogUrl = "vnd.sun.star.script:"+sDialogName+"?location=application"; - return xDialogProvider.createDialogWithHandler(sDialogUrl, this); - } - catch (Exception e) { - return null; - } - } - - private boolean deleteItem(String sName) { - XDialog xDialog=getDialog("W2LDialogs2.DeleteDialog"); - if (xDialog!=null) { - DialogAccess ddlg = new DialogAccess(xDialog); - String sLabel = ddlg.getLabelText("DeleteLabel"); - sLabel = sLabel.replaceAll("%s", sName); - ddlg.setLabelText("DeleteLabel", sLabel); - boolean bDelete = xDialog.execute()==ExecutableDialogResults.OK; - xDialog.endExecute(); - return bDelete; - } - return false; - } - - private boolean deleteCurrentItem(String sListName) { - String[] sItems = dlg.getListBoxStringItemList(sListName); - short nSelected = dlg.getListBoxSelectedItem(sListName); - if (nSelected>=0 && deleteItem(sItems[nSelected])) { - int nOldLen = sItems.length; - String[] sNewItems = new String[nOldLen-1]; - if (nSelected>0) { - System.arraycopy(sItems, 0, sNewItems, 0, nSelected); - } - if (nSelected suggestions) { - XDialog xDialog=getDialog("W2LDialogs2.NewDialog"); - if (xDialog!=null) { - int nCount = suggestions.size(); - String[] sItems = new String[nCount]; - int i=0; - for (String s : suggestions) { - sItems[i++] = s; - } - sortStringArray(sItems); - DialogAccess ndlg = new DialogAccess(xDialog); - ndlg.setListBoxStringItemList("Name", sItems); - String sResult = null; - if (xDialog.execute()==ExecutableDialogResults.OK) { - DialogAccess dlg = new DialogAccess(xDialog); - sResult = dlg.getTextFieldText("Name"); - } - xDialog.endExecute(); - return sResult; - } - return null; - } - - private String appendItem(String sListName, Set suggestions) { - String[] sItems = dlg.getListBoxStringItemList(sListName); - String sNewItem = newItem(suggestions); - if (sNewItem!=null) { - int nOldLen = sItems.length; - for (short i=0; i attr = new HashMap(); - attr.put("latex", dlg.getTextFieldText("MathLaTeX")); - mathSymbols.put(sCurrentMathSymbol, attr); - } - - // Save the current string replace in our cache - if (sCurrentText!=null) { - Map attr = new HashMap(); - attr.put("latex-code", dlg.getTextFieldText("LaTeX")); - attr.put("fontenc", "any"); - stringReplace.put(sCurrentText, attr); - } - } - - private void updateTextAndMathControls() { - updateTextAndMathMaps(); - - // Get the current math symbol, if any - short nSymbolItem = dlg.getListBoxSelectedItem("MathSymbolName"); - if (nSymbolItem>=0) { - sCurrentMathSymbol = dlg.getListBoxStringItemList("MathSymbolName")[nSymbolItem]; - - Map attributes = mathSymbols.get(sCurrentMathSymbol); - dlg.setTextFieldText("MathLaTeX", attributes.get("latex")); - dlg.setControlEnabled("DeleteSymbolButton", true); - } - else { + @Override protected void setControls(DialogAccess dlg) { + // Get math symbols from config + if (mathSymbols!=null) { mathSymbols.clear(); } + else { mathSymbols = new ComplexOption(); } + mathSymbols.copyAll(config.getComplexOption("math-symbol-map")); sCurrentMathSymbol = null; - dlg.setTextFieldText("MathLaTeX", ""); - dlg.setControlEnabled("DeleteSymbolButton", false); + dlg.setListBoxStringItemList("MathSymbolName", sortStringSet(mathSymbols.keySet())); + // This triggers an onchange event + dlg.setListBoxSelectedItem("MathSymbolName", (short)Math.min(0,mathSymbols.keySet().size()-1)); + + // Get string replace from config + if (stringReplace!=null) { stringReplace.clear(); } + else { stringReplace = new ComplexOption(); } + stringReplace.copyAll(config.getComplexOption("string-replace")); + sCurrentText = null; + dlg.setListBoxStringItemList("TextInput", sortStringSet(stringReplace.keySet())); + // This triggers an onchange event + dlg.setListBoxSelectedItem("TextInput", (short)Math.min(0,stringReplace.keySet().size()-1)); + + // Get other options from config + checkBoxFromConfig(dlg,"UseOoomath","use_ooomath"); + textFieldFromConfig(dlg,"TabStopLaTeX", "tabstop"); } - // Get the current input string, if any - short nItem = dlg.getListBoxSelectedItem("TextInput"); - if (nItem>=0) { - sCurrentText = dlg.getListBoxStringItemList("TextInput")[nItem]; - - Map attributes = stringReplace.get(sCurrentText); - dlg.setTextFieldText("LaTeX", attributes.get("latex-code")); - //dlg.setTextFieldText("Fontenc", attributes.get("fontenc")); - dlg.setControlEnabled("DeleteTextButton", - !"\u00A0!".equals(sCurrentText) && !"\u00A0?".equals(sCurrentText) && - !"\u00A0:".equals(sCurrentText) && !"\u00A0;".equals(sCurrentText) && - !"\u00A0\u2014".equals(sCurrentText)); - } - else { - sCurrentText = null; - dlg.setTextFieldText("LaTeX", ""); - //dlg.setTextFieldText("Fontenc", "any"); - dlg.setControlEnabled("DeleteTextButton", false); + @Override protected void getControls(DialogAccess dlg) { + // Save math symbols to config + updateSymbol(dlg); + config.getComplexOption("math-symbol-map").clear(); + config.getComplexOption("math-symbol-map").copyAll(mathSymbols); + + // Save string replace to config + updateText(dlg); + config.getComplexOption("string-replace").clear(); + config.getComplexOption("string-replace").copyAll(stringReplace); + + // Save other options to config + checkBoxToConfig(dlg,"UseOoomath","use_ooomath"); + textFieldToConfig(dlg,"TabStopLaTeX", "tabstop"); } - } - - private void newSymbolClick() { - String sNewName = appendItem("MathSymbolName",customSymbolNameProvider.getNames()); - if (sNewName!=null) { - Map attr = new HashMap(); - attr.put("latex", ""); - mathSymbols.put(sNewName, attr); - saveTextAndMath(); - dlg.setTextFieldText("MathLaTeX", ""); - updateTextAndMathControls(); + @Override protected boolean handleEvent(DialogAccess dlg, String sMethod) { + if (sMethod.equals("MathSymbolNameChange")) { + mathSymbolNameChange(dlg); + return true; + } + else if (sMethod.equals("NewSymbolClick")) { + newSymbolClick(dlg); + return true; + } + else if (sMethod.equals("DeleteSymbolClick")) { + deleteSymbolClick(dlg); + return true; + } + else if (sMethod.equals("TextInputChange")) { + textInputChange(dlg); + return true; + } + else if (sMethod.equals("NewTextClick")) { + newTextClick(dlg); + return true; + } + else if (sMethod.equals("DeleteTextClick")) { + deleteTextClick(dlg); + return true; + } + return false; + } + + private void mathSymbolNameChange(DialogAccess dlg) { + updateSymbol(dlg); + updateSymbolControls(dlg); + } + + private void newSymbolClick(DialogAccess dlg) { + // This triggers an onchange event + appendItem(dlg,"MathSymbolName",customSymbolNameProvider.getNames()); + } + + private void deleteSymbolClick(DialogAccess dlg) { + String sMathSymbol = sCurrentMathSymbol; + // This triggers an onchange event + if (deleteCurrentItem(dlg,"MathSymbolName")) { + mathSymbols.remove(sMathSymbol); + } + } + + private void updateSymbol(DialogAccess dlg) { + // Save the current math symbol in our cache + if (sCurrentMathSymbol!=null) { + Map attr = new HashMap(); + attr.put("latex", dlg.getTextFieldText("MathLaTeX")); + mathSymbols.put(sCurrentMathSymbol, attr); + } + } + + // Update symbol controls based on currently selected list item + private void updateSymbolControls(DialogAccess dlg) { + short nSymbolItem = dlg.getListBoxSelectedItem("MathSymbolName"); + if (nSymbolItem>=0) { + sCurrentMathSymbol = dlg.getListBoxStringItemList("MathSymbolName")[nSymbolItem]; + Map attributes; + if (mathSymbols.containsKey(sCurrentMathSymbol)) { + attributes = mathSymbols.get(sCurrentMathSymbol); + } + else { // New symbol, add empty definition to cache + attributes = new HashMap(); + attributes.put("latex", ""); + mathSymbols.put(sCurrentMathSymbol, attributes); + } + dlg.setTextFieldText("MathLaTeX", attributes.get("latex")); + dlg.setControlEnabled("MathLaTeX", true); + dlg.setControlEnabled("DeleteSymbolButton", true); + } + else { // The list is empty, or nothing is selected + sCurrentMathSymbol = null; + dlg.setTextFieldText("MathLaTeX", ""); + dlg.setControlEnabled("MathLaTeX", false); + dlg.setControlEnabled("DeleteSymbolButton", false); + } + } + + private void textInputChange(DialogAccess dlg) { + updateText(dlg); + updateTextControls(dlg); + } + + private void newTextClick(DialogAccess dlg) { + // This triggers an onchange event + appendItem(dlg, "TextInput", new HashSet()); + } + + private void deleteTextClick(DialogAccess dlg) { + String sText = sCurrentText; + // This triggers an onchange event + if (deleteCurrentItem(dlg, "TextInput")) { + stringReplace.remove(sText); + } + } + + private void updateText(DialogAccess dlg) { + // Save the current string replace in our cache + if (sCurrentText!=null) { + Map attr = new HashMap(); + attr.put("latex-code", dlg.getTextFieldText("LaTeX")); + attr.put("fontenc", "any"); + stringReplace.put(sCurrentText, attr); + } + } + + // Update text controls based on currently selected list item + private void updateTextControls(DialogAccess dlg) { + // Get the current input string, if any + short nItem = dlg.getListBoxSelectedItem("TextInput"); + if (nItem>=0) { + sCurrentText = dlg.getListBoxStringItemList("TextInput")[nItem]; + + Map attributes; + if (stringReplace.containsKey(sCurrentText)) { + attributes = stringReplace.get(sCurrentText); + } + else { // New string replace, add empty definition to cache + attributes = new HashMap(); + attributes.put("latex-code", ""); + attributes.put("fontenc", "any"); + stringReplace.put(sCurrentText, attributes); + } + + dlg.setTextFieldText("LaTeX", attributes.get("latex-code")); + //dlg.setTextFieldText("Fontenc", attributes.get("fontenc")); + dlg.setControlEnabled("LaTeX", true); + dlg.setControlEnabled("DeleteTextButton", + !"\u00A0!".equals(sCurrentText) && !"\u00A0?".equals(sCurrentText) && + !"\u00A0:".equals(sCurrentText) && !"\u00A0;".equals(sCurrentText) && + !"\u00A0\u2014".equals(sCurrentText)); + } + else { // The list is empty, or nothing is selected + sCurrentText = null; + dlg.setTextFieldText("LaTeX", ""); + //dlg.setTextFieldText("Fontenc", "any"); + dlg.setControlEnabled("DeleteTextButton", false); + } } } - private void deleteSymbolClick() { - if (deleteCurrentItem("MathSymbolName")) { - mathSymbols.remove(sCurrentMathSymbol); - sCurrentMathSymbol = null; - updateTextAndMathControls(); - } - } - - private void newTextClick() { - String sNewName = appendItem("TextInput", new HashSet()); - if (sNewName!=null) { - Map attr = new HashMap(); - attr.put("latex-code", ""); - attr.put("fontenc", "any"); - stringReplace.put(sNewName, attr); - dlg.setTextFieldText("LaTeX", ""); - saveTextAndMath(); - updateTextAndMathControls(); - } - } - - private void deleteTextClick() { - if (deleteCurrentItem("TextInput")) { - stringReplace.remove(sCurrentText); - sCurrentText = null; - updateTextAndMathControls(); - } - } - - // Utilities - private String[] sortStringSet(Set theSet) { - String[] theArray = new String[theSet.size()]; - int i=0; - for (String s : theSet) { - theArray[i++] = s; - } - sortStringArray(theArray); - return theArray; - } - - private void sortStringArray(String[] theArray) { - // TODO: Get locale from OOo rather than the system - Collator collator = Collator.getInstance(); - Arrays.sort(theArray, collator); - } - */ } diff --git a/source/java/org/openoffice/da/comp/writer2latex/LaTeXOptionsDialog.java b/source/java/org/openoffice/da/comp/writer2latex/LaTeXOptionsDialog.java index e18a72e..c592a95 100644 --- a/source/java/org/openoffice/da/comp/writer2latex/LaTeXOptionsDialog.java +++ b/source/java/org/openoffice/da/comp/writer2latex/LaTeXOptionsDialog.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-2010 by Henrik Just * * All Rights Reserved. * - * Version 1.2 (2009-03-31) + * Version 1.2 (2010-12-14) * */ @@ -37,7 +37,7 @@ import com.sun.star.uno.XComponentContext; import org.openoffice.da.comp.w2lcommon.helper.PropertyHelper; import org.openoffice.da.comp.w2lcommon.filter.OptionsDialogBase; -/** This class provides a uno component which implements a filter ui for the +/** This class provides a UNO component which implements a filter ui for the * LaTeX export */ public class LaTeXOptionsDialog extends OptionsDialogBase { @@ -241,6 +241,10 @@ public class LaTeXOptionsDialog extends OptionsDialogBase { // backend=xetex locks the encoding to utf8 return getListBoxSelectedItem("Backend")==3 || super.isLocked(sOptionName); } + else if ("greek_math".equals(sOptionName)) { + // this option has no effect if backend=xetex + return getListBoxSelectedItem("Backend")==3 || super.isLocked(sOptionName); + } else if ("additional_symbols".equals(sOptionName)) { // additional_symbols is disabled for custom config (where the 5 // individual options can be set independently) diff --git a/source/java/writer2latex/api/ConverterFactory.java b/source/java/writer2latex/api/ConverterFactory.java index b8af8bc..1f25989 100644 --- a/source/java/writer2latex/api/ConverterFactory.java +++ b/source/java/writer2latex/api/ConverterFactory.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.2 (2010-12-08) + * Version 1.2 (2010-12-16) * */ @@ -33,7 +33,7 @@ public class ConverterFactory { // Version information private static final String VERSION = "1.1.9"; - private static final String DATE = "2010-12-08"; + private static final String DATE = "2010-12-16"; /** Return the Writer2LaTeX version in the form * (major version).(minor version).(patch level)
diff --git a/source/java/writer2latex/api/MetaData.java b/source/java/writer2latex/api/MetaData.java index ddb64be..8e74331 100644 --- a/source/java/writer2latex/api/MetaData.java +++ b/source/java/writer2latex/api/MetaData.java @@ -20,12 +20,14 @@ * * All Rights Reserved. * - * Version 1.2 (2010-03-15) + * Version 1.2 (2010-12-15) * */ package writer2latex.api; +import java.util.Map; + /** This interface provides access to the predefined meta data of the * source document (currently incomplete) */ @@ -36,10 +38,45 @@ public interface MetaData { */ public String getTitle(); + /** Get the subject of the source document + * + * @return the subject (may return an empty string) + */ + public String getSubject(); + + /** Get the keywords of the source document + * + * @return the keywords as a comma separated list (may return an empty string) + */ + public String getKeywords(); + + /** Get the description of the source document + * + * @return the description (may return an empty string) + */ + public String getDescription(); + + /** Get the creator of the source document (or the initial creator if none is specified) + * + * @return the creator (may return an empty string) + */ + public String getCreator(); + /** Get the (main) language of the document * * @return the language */ public String getLanguage(); + /** Get the date of the source document + * + * @return the date (may return an empty string) + */ + public String getDate(); + + /** Get the user-defined meta data + * + * @return the user-defined meta data as a name-value map + */ + public Map getUserDefinedMetaData(); } diff --git a/source/java/writer2latex/epub/EPUBConverter.java b/source/java/writer2latex/epub/EPUBConverter.java index 9c238f7..3f19968 100644 --- a/source/java/writer2latex/epub/EPUBConverter.java +++ b/source/java/writer2latex/epub/EPUBConverter.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * version 1.2 (2010-03-28) + * version 1.2 (2010-12-15) * */ @@ -48,7 +48,7 @@ public final class EPUBConverter extends Xhtml11Converter { ConverterResult xhtmlResult = super.convert(is, sTargetFileName); ConverterResultImpl epubResult = new ConverterResultImpl(); - epubResult.addDocument(new EPUBWriter(xhtmlResult,sTargetFileName)); + epubResult.addDocument(new EPUBWriter(xhtmlResult,sTargetFileName,getXhtmlConfig())); epubResult.setMetaData(xhtmlResult.getMetaData()); return epubResult; } diff --git a/source/java/writer2latex/epub/EPUBWriter.java b/source/java/writer2latex/epub/EPUBWriter.java index 7235c08..0f70b65 100644 --- a/source/java/writer2latex/epub/EPUBWriter.java +++ b/source/java/writer2latex/epub/EPUBWriter.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * version 1.2 (2010-03-31) + * version 1.2 (2010-12-15) * */ @@ -37,6 +37,7 @@ import java.util.zip.ZipOutputStream; import writer2latex.api.ConverterResult; import writer2latex.api.OutputFile; import writer2latex.util.Misc; +import writer2latex.xhtml.XhtmlConfig; /** This class repackages an XHTML document into EPUB format. * Some filenames are hard wired in this implementation: The main directory is OEBPS and @@ -49,10 +50,12 @@ public class EPUBWriter implements OutputFile { private ConverterResult xhtmlResult; private String sFileName; + private XhtmlConfig config; - public EPUBWriter(ConverterResult xhtmlResult, String sFileName) { + public EPUBWriter(ConverterResult xhtmlResult, String sFileName, XhtmlConfig config) { this.xhtmlResult = xhtmlResult; this.sFileName = Misc.removeExtension(sFileName); + this.config = config; } public String getFileName() { @@ -90,7 +93,7 @@ public class EPUBWriter implements OutputFile { zos.closeEntry(); // Then manifest - OutputFile manifest = new OPFWriter(xhtmlResult, sUUID); + OutputFile manifest = new OPFWriter(xhtmlResult, sUUID, config.xhtmlUseDublinCore()); ZipEntry manifestEntry = new ZipEntry("OEBPS/book.opf"); zos.putNextEntry(manifestEntry); writeZipEntry(manifest,zos); diff --git a/source/java/writer2latex/epub/OPFWriter.java b/source/java/writer2latex/epub/OPFWriter.java index 8a23f6c..8e28b5f 100644 --- a/source/java/writer2latex/epub/OPFWriter.java +++ b/source/java/writer2latex/epub/OPFWriter.java @@ -20,13 +20,14 @@ * * All Rights Reserved. * - * version 1.2 (2010-07-02) + * version 1.2 (2010-12-16) * */ package writer2latex.epub; import java.util.Iterator; +import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -47,7 +48,7 @@ import writer2latex.xmerge.NewDOMDocument; */ public class OPFWriter extends NewDOMDocument { - public OPFWriter(ConverterResult cr, String sUUID) { + public OPFWriter(ConverterResult cr, String sUUID, boolean bUseDublinCore) { super("book", "opf"); // create DOM @@ -83,11 +84,139 @@ public class OPFWriter extends NewDOMDocument { metadata.appendChild(language); language.appendChild(contentDOM.createTextNode(cr.getMetaData().getLanguage())); - Element identifier = contentDOM.createElement("dc:identifier"); - identifier.setAttribute("id", "BookId"); - identifier.setAttribute("opf:scheme", "UUID"); - metadata.appendChild(identifier); - identifier.appendChild(contentDOM.createTextNode(sUUID)); + // Additional meta data + if (bUseDublinCore) { + // Subject and keywords in ODF both map to Dublin core subjects + if (cr.getMetaData().getSubject().length()>0) { + Element subject = contentDOM.createElement("dc:subject"); + metadata.appendChild(subject); + subject.appendChild(contentDOM.createTextNode(cr.getMetaData().getSubject())); + } + if (cr.getMetaData().getKeywords().length()>0) { + String[] sKeywords = cr.getMetaData().getKeywords().split(","); + for (String sKeyword : sKeywords) { + Element subject = contentDOM.createElement("dc:subject"); + metadata.appendChild(subject); + subject.appendChild(contentDOM.createTextNode(sKeyword.trim())); + } + } + if (cr.getMetaData().getDescription().length()>0) { + Element description = contentDOM.createElement("dc:description"); + metadata.appendChild(description); + description.appendChild(contentDOM.createTextNode(cr.getMetaData().getDescription())); + } + } + + // User defined meta data + // The identifier, creator, contributor and date has an optional attribute and there may be multiple instances of + // the first three. The key can be in any of the forms name, name.attribute, name.attribute.id, name..id + // where the id is some unique id amongst the instances with the same name + // Thus you can have e.g. creator.aut.1="John Doe" and creator.aut.2="Jane Doe" + boolean bHasIdentifier = false; + boolean bHasCreator = false; + boolean bHasDate = false; + Map userDefined = cr.getMetaData().getUserDefinedMetaData(); + for (String sKey : userDefined.keySet()) { + if (sKey.length()>0) { + String[] sKeyElements = sKey.toLowerCase().split("\\."); + String sValue = userDefined.get(sKey); + if ("identifier".equals(sKeyElements[0])) { + Element identifier = contentDOM.createElement("dc:identifier"); + identifier.setAttribute("id", "BookId"); + if (sKeyElements.length>1 && sKeyElements[1].length()>0) { + identifier.setAttribute("opf:scheme", sKeyElements[1]); + } + metadata.appendChild(identifier); + identifier.appendChild(contentDOM.createTextNode(sValue)); + bHasIdentifier = true; + } + else if ("creator".equals(sKeyElements[0])) { + Element creator = contentDOM.createElement("dc:creator"); + if (sKeyElements.length>1 && sKeyElements[1].length()>0) { + creator.setAttribute("opf:role", sKeyElements[1]); + } + metadata.appendChild(creator); + creator.appendChild(contentDOM.createTextNode(sValue)); + bHasCreator = true; + } + else if ("contributor".equals(sKeyElements[0])) { + Element contributor = contentDOM.createElement("dc:contributor"); + if (sKeyElements.length>1 && sKeyElements[1].length()>0) { + contributor.setAttribute("opf:role", sKeyElements[1]); + } + metadata.appendChild(contributor); + contributor.appendChild(contentDOM.createTextNode(sValue)); + } + else if ("date".equals(sKeyElements[0])) { + Element date = contentDOM.createElement("dc:date"); + if (sKeyElements.length>1 && sKeyElements[1].length()>0) { + date.setAttribute("opf:event", sKeyElements[1]); + } + metadata.appendChild(date); + date.appendChild(contentDOM.createTextNode(sValue)); + bHasDate = true; + } + else if (sKeyElements.length==1) { + // Remaining meta data elements must be unique + if ("publisher".equals(sKeyElements[0])) { + Element publisher = contentDOM.createElement("dc:publisher"); + metadata.appendChild(publisher); + publisher.appendChild(contentDOM.createTextNode(sValue)); + } + else if ("type".equals(sKeyElements[0])) { + Element type = contentDOM.createElement("dc:type"); + metadata.appendChild(type); + type.appendChild(contentDOM.createTextNode(sValue)); + } + else if ("format".equals(sKeyElements[0])) { + Element format = contentDOM.createElement("dc:format"); + metadata.appendChild(format); + format.appendChild(contentDOM.createTextNode(sValue)); + } + else if ("source".equals(sKeyElements[0])) { + Element source = contentDOM.createElement("dc:source"); + metadata.appendChild(source); + source.appendChild(contentDOM.createTextNode(sValue)); + } + else if ("relation".equals(sKeyElements[0])) { + Element relation = contentDOM.createElement("dc:relation"); + metadata.appendChild(relation); + relation.appendChild(contentDOM.createTextNode(sValue)); + } + else if ("coverage".equals(sKeyElements[0])) { + Element coverage = contentDOM.createElement("dc:coverage"); + metadata.appendChild(coverage); + coverage.appendChild(contentDOM.createTextNode(sValue)); + } + else if ("rights".equals(sKeyElements[0])) { + Element rights = contentDOM.createElement("dc:rights"); + metadata.appendChild(rights); + rights.appendChild(contentDOM.createTextNode(sValue)); + } + } + } + } + + // Fall back values for creator and date + if (bUseDublinCore) { + if (!bHasIdentifier) { + Element identifier = contentDOM.createElement("dc:identifier"); + identifier.setAttribute("id", "BookId"); + identifier.setAttribute("opf:scheme", "UUID"); + metadata.appendChild(identifier); + identifier.appendChild(contentDOM.createTextNode(sUUID)); + } + if (!bHasCreator && cr.getMetaData().getCreator().length()>0) { + Element creator = contentDOM.createElement("dc:creator"); + metadata.appendChild(creator); + creator.appendChild(contentDOM.createTextNode(cr.getMetaData().getCreator())); + } + if (!bHasDate && cr.getMetaData().getDate().length()>0) { + Element date = contentDOM.createElement("dc:date"); + metadata.appendChild(date); + date.appendChild(contentDOM.createTextNode(cr.getMetaData().getDate())); + } + } // Manifest must contain references to all the files in the XHTML converter result // Spine should contain references to all the master documents within the converter result diff --git a/source/java/writer2latex/latex/LaTeXConfig.java b/source/java/writer2latex/latex/LaTeXConfig.java index 57fe60d..0f1d4cc 100644 --- a/source/java/writer2latex/latex/LaTeXConfig.java +++ b/source/java/writer2latex/latex/LaTeXConfig.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.2 (2010-10-09) + * Version 1.2 (2010-12-15) * */ @@ -308,7 +308,7 @@ public class LaTeXConfig extends writer2latex.base.ConfigBase { }; options[METADATA] = new BooleanOption("metadata","true"); options[TABSTOP] = new Option("tabstop",""); - options[WRAP_LINES_AFTER] = new IntegerOption("wrap_lines_after","72") { + options[WRAP_LINES_AFTER] = new IntegerOption("wrap_lines_after","120") { public void setString(String sValue) { super.setString(sValue); nValue = Misc.getPosInteger(sValue,0); diff --git a/source/java/writer2latex/latex/i18n/ClassicI18n.java b/source/java/writer2latex/latex/i18n/ClassicI18n.java index fc6ec27..00f57a0 100644 --- a/source/java/writer2latex/latex/i18n/ClassicI18n.java +++ b/source/java/writer2latex/latex/i18n/ClassicI18n.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.2 (2010-05-11) + * Version 1.2 (2010-12-15) * */ @@ -359,7 +359,7 @@ public class ClassicI18n extends I18n { } /** Apply a language language - * @param style the OOo style to read attributesfrom + * @param style the OOo style to read attributes from * @param bDecl true if declaration form is required * @param bInherit true if inherited properties should be used * @param ba the BeforeAfter to add LaTeX code to. @@ -662,7 +662,8 @@ public class ClassicI18n extends I18n { babelLanguages.put("is", "icelandic"); // latin1 babelLanguages.put("it", "italian"); // latin1 babelLanguages.put("nl", "dutch"); // latin1 - babelLanguages.put("no", "norsk"); // latin1 + babelLanguages.put("nb", "norsk"); // latin1 + babelLanguages.put("nn", "nynorsk"); // latin1 babelLanguages.put("pl", "polish"); // latin2 babelLanguages.put("pt", "portuges"); // latin1 babelLanguages.put("ro", "romanian"); // latin2 diff --git a/source/java/writer2latex/latex/i18n/I18n.java b/source/java/writer2latex/latex/i18n/I18n.java index 2ebdd7a..6bf7f5a 100644 --- a/source/java/writer2latex/latex/i18n/I18n.java +++ b/source/java/writer2latex/latex/i18n/I18n.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.2 (2010-10-30) + * Version 1.2 (2010-12-14) * */ @@ -118,7 +118,7 @@ public abstract class I18n { /** Get the default language (either the document language or the most used language) * - * @param the default language + * @return the default language */ public String getDefaultLanguage() { return sDefaultLanguage; diff --git a/source/java/writer2latex/latex/i18n/Polyglossia.java b/source/java/writer2latex/latex/i18n/Polyglossia.java new file mode 100644 index 0000000..709e225 --- /dev/null +++ b/source/java/writer2latex/latex/i18n/Polyglossia.java @@ -0,0 +1,217 @@ +/************************************************************************ + * + * XeTeXI18n.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-2010 by Henrik Just + * + * All Rights Reserved. + * + * Version 1.2 (2010-12-15) + * + */ + +package writer2latex.latex.i18n; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class Polyglossia { + private static Map languageMap; + private static Map variantMap; + + static { + languageMap = new HashMap(); + languageMap.put("am", "amharic"); + languageMap.put("ar", "arabic"); + languageMap.put("ast", "asturian"); + languageMap.put("bg", "bulgarian"); + languageMap.put("bn", "bengali"); + languageMap.put("br", "breton"); + languageMap.put("ca", "catalan"); + languageMap.put("cop", "coptic"); + languageMap.put("cs", "czech"); + languageMap.put("cy", "welsh"); + languageMap.put("da", "danish"); + languageMap.put("de", "german"); + languageMap.put("dsb", "lsorbian"); + languageMap.put("dv", "divehi"); + languageMap.put("el", "greek"); + languageMap.put("en", "english"); + languageMap.put("eo", "esperanto"); + languageMap.put("es", "spanish"); + languageMap.put("et", "estonian"); + languageMap.put("eu", "basque"); + languageMap.put("fa", "farsi"); + languageMap.put("fi", "finnish"); + languageMap.put("fr", "french"); + languageMap.put("ga", "irish"); + languageMap.put("gd", "scottish"); + languageMap.put("gl", "galician"); + languageMap.put("grc", "greek"); + languageMap.put("he", "hebrew"); + languageMap.put("hi", "hindi"); + languageMap.put("hr", "croatian"); + languageMap.put("hsb", "usorbian"); + languageMap.put("hu", "magyar"); + languageMap.put("hy", "armenian"); + languageMap.put("id", "bahasai"); // Bahasa Indonesia + languageMap.put("ie", "interlingua"); + languageMap.put("is", "icelandic"); + languageMap.put("it", "italian"); + languageMap.put("la", "latin"); + languageMap.put("lo", "lao"); + languageMap.put("lt", "lithuanian"); + languageMap.put("lv", "latvian"); + languageMap.put("ml", "malayalam"); + languageMap.put("mr", "marathi"); + languageMap.put("ms", "bahasam"); // Bahasa Melayu + languageMap.put("nb", "norsk"); + languageMap.put("nl", "dutch"); + languageMap.put("nn", "nynorsk"); + languageMap.put("oc", "occitan"); + languageMap.put("pl", "polish"); + languageMap.put("pt", "portuges"); + languageMap.put("pt-BR", "brazilian"); + languageMap.put("ro", "romanian"); + languageMap.put("ru", "russian"); + languageMap.put("sa", "sanskrit"); + languageMap.put("sk", "slovak"); + languageMap.put("sl", "slovenian"); + languageMap.put("sq", "albanian"); + languageMap.put("sr", "serbian"); + languageMap.put("sv", "swedish"); + languageMap.put("syr", "syriac"); + languageMap.put("ta", "tamil"); + languageMap.put("te", "telugu"); + languageMap.put("th", "thai"); + languageMap.put("tk", "turkmen"); + languageMap.put("tr", "turkish"); + languageMap.put("uk", "ukrainian"); + languageMap.put("ur", "urdu"); + languageMap.put("vi", "vietnamese"); + // TODO: Which language is samin?? One guess could be sami with the n for north? + //languageMap.put("??", "samin"); + + variantMap = new HashMap(); + // English variants + variantMap.put("en-US", "american"); + variantMap.put("en-GB", "british"); + variantMap.put("en-AU", "australian"); + variantMap.put("en-NZ", "newzealand"); + // Greek variants + variantMap.put("el", "monotonic"); + variantMap.put("grc", "ancient"); // Supported in OOo since 3.2 + } + + private static String getEntry(Map map, String sLocale, String sLang) { + if (map.containsKey(sLocale)) { + return map.get(sLocale); + } + else if (map.containsKey(sLang)) { + return map.get(sLang); + } + return null; + } + + // This ended the static part of Polyglossia + + private Set languages = new HashSet(); + private List declarations = new ArrayList(); + private Map commands = new HashMap(); + + /**

Get the declarations for the applied languages, in the form

+ *

\\usepackage{polyglossia}

+ *

\\setdefaultlanguage{language1}

+ *

\\setotherlanguage{language2}

+ *

\\setotherlanguage{language3}

+ *

...

+ * + * @return the declarations as a string array + */ + public String[] getDeclarations() { + return declarations.toArray(new String[declarations.size()]); + } + + /**

Add the given locale to the list of applied locales and return definitions for applying the + * language to a text portion:

+ *
    + *
  • A command of the forn \textlanguage[variant=languagevariant]
  • + *
  • An environment in the form + * \begin{language}[variant=languagevariant]...\end{language}
  • + *
+ *

The first applied language is the default language

+ * + * @param sLang The language + * @param sCountry The country (may be null) + * @return a string array containing definitions to apply the language: Entry 0 contains a command + * and Entry 1 and 2 contains an environment + */ + public String[] applyLanguage(String sLang, String sCountry) { + String sLocale = sCountry!=null ? sLang+"-"+sCountry : sLang; + if (commands.containsKey(sLocale)) { + return commands.get(sLocale); + } + else { + // Get the Polyglossia language and variant + String sPolyLang = getEntry(languageMap,sLocale,sLang); + if (sPolyLang!=null) { + String sVariant = getEntry(variantMap,sLocale,sLang); + if (sVariant!=null) { + sVariant = "[variant="+sVariant+"]"; + } + else { + sVariant = ""; + } + + if (languages.size()==0) { + // First language, load Polyglossia and make the language default + declarations.add("\\usepackage{polyglossia}"); + declarations.add("\\setdefaultlanguage"+sVariant+"{"+sPolyLang+"}"); + languages.add(sPolyLang); + sVariant = ""; // Do not apply variant directly + } + else if (!languages.contains(sPolyLang)) { + // New language, add to declarations + declarations.add("\\setotherlanguage"+sVariant+"{"+sPolyLang+"}"); + languages.add(sPolyLang); + sVariant = ""; // Do not apply variant directly + } + + String[] sCommand = new String[3]; + sCommand[0] = "\\text"+sPolyLang+sVariant; + if ("arabic".equals(sPolyLang)) { sPolyLang="Arabic"; } + sCommand[1] = "\\begin{"+sPolyLang+"}"+sVariant; + sCommand[2] = "\\end{"+sPolyLang+"}"; + commands.put(sLocale, sCommand); + return sCommand; + } + else { + // Unknown language + String[] sCommand = new String[3]; + sCommand[0] = ""; + sCommand[1] = ""; + sCommand[2] = ""; + commands.put(sLocale, sCommand); + return sCommand; + } + } + } +} diff --git a/source/java/writer2latex/latex/i18n/XeTeXI18n.java b/source/java/writer2latex/latex/i18n/XeTeXI18n.java index 09d585c..4a85a10 100644 --- a/source/java/writer2latex/latex/i18n/XeTeXI18n.java +++ b/source/java/writer2latex/latex/i18n/XeTeXI18n.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.2 (2010-11-30) + * Version 1.2 (2010-12-15) * */ @@ -36,7 +36,7 @@ import writer2latex.latex.util.BeforeAfter; */ public class XeTeXI18n extends I18n { - // **** Constructors **** + private Polyglossia polyglossia; /** Construct a new XeTeXI18n as ConverterHelper * @param ofr the OfficeReader to get language information from @@ -45,6 +45,7 @@ public class XeTeXI18n extends I18n { */ public XeTeXI18n(OfficeReader ofr, LaTeXConfig config, ConverterPalette palette) { super(ofr,config,palette); + polyglossia = new Polyglossia(); } /** Add declarations to the preamble to load the required packages @@ -56,17 +57,33 @@ public class XeTeXI18n extends I18n { .append("\\usepackage{fontspec}").nl() .append("\\usepackage{xunicode}").nl() .append("\\usepackage{xltxtra}").nl(); - + String[] polyglossiaDeclarations = polyglossia.getDeclarations(); + for (String s: polyglossiaDeclarations) { + pack.append(s).nl(); + } } /** Apply a language language - * @param style the OOo style to read attributesfrom + * @param style the OOo style to read attributes from * @param bDecl true if declaration form is required * @param bInherit true if inherited properties should be used * @param ba the BeforeAfter to add LaTeX code to. */ public void applyLanguage(StyleWithProperties style, boolean bDecl, boolean bInherit, BeforeAfter ba) { - // TODO (polyglossia) + if (!bAlwaysUseDefaultLang && style!=null) { + // TODO: Support CTL and CJK + String sISOLang = style.getProperty(XMLString.FO_LANGUAGE,bInherit); + String sISOCountry = style.getProperty(XMLString.FO_COUNTRY, bInherit); + if (sISOLang!=null) { + String[] sCommand = polyglossia.applyLanguage(sISOLang, sISOCountry); + if (bDecl) { + ba.add(sCommand[1],sCommand[2]); + } + else { + ba.add(sCommand[0]+"{","}"); + } + } + } } /** Push a font to the font stack diff --git a/source/java/writer2latex/office/MetaData.java b/source/java/writer2latex/office/MetaData.java index 111aba8..d78c7b5 100644 --- a/source/java/writer2latex/office/MetaData.java +++ b/source/java/writer2latex/office/MetaData.java @@ -26,6 +26,9 @@ package writer2latex.office; +import java.util.HashMap; +import java.util.Map; + import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -49,6 +52,8 @@ public class MetaData implements writer2latex.api.MetaData { private String sSubject = ""; // Keywords private String sKeywords = ""; + // User-defined + private Map userdefined = new HashMap(); /**

Construct a new instance from an OOo Writer document.

* @param oooDoc is the OOo document @@ -74,28 +79,28 @@ public class MetaData implements writer2latex.api.MetaData { if (XMLString.DC_TITLE.equals(sName)) { sTitle = getContent(child); } - if (XMLString.DC_CREATOR.equals(sName)) { + else if (XMLString.DC_CREATOR.equals(sName)) { sCreator = getContent(child); } - if (XMLString.DC_DATE.equals(sName)) { + else if (XMLString.DC_DATE.equals(sName)) { sDate = getContent(child); } - if (XMLString.DC_DESCRIPTION.equals(sName)) { + else if (XMLString.DC_DESCRIPTION.equals(sName)) { sDescription = getContent(child); } - if (XMLString.DC_LANGUAGE.equals(sName)) { + else if (XMLString.DC_LANGUAGE.equals(sName)) { sLanguage = getContent(child); } - if (XMLString.DC_SUBJECT.equals(sName)) { + else if (XMLString.DC_SUBJECT.equals(sName)) { sSubject = getContent(child); } - if (XMLString.META_INITIAL_CREATOR.equals(sName)) { + else if (XMLString.META_INITIAL_CREATOR.equals(sName)) { sInitialCreator = getContent(child); } - if (XMLString.META_KEYWORD.equals(sName)) { // oasis + else if (XMLString.META_KEYWORD.equals(sName)) { // oasis keywords.addValue(getContent(child)); } - if (XMLString.META_KEYWORDS.equals(sName)) { + else if (XMLString.META_KEYWORDS.equals(sName)) { // Old format: Keywords are contained within meta:keywords if (child.hasChildNodes()) { // traverse the keywords @@ -109,36 +114,42 @@ public class MetaData implements writer2latex.api.MetaData { } } } + else if (XMLString.META_USER_DEFINED.equals(sName)) { + String sPropertyName = Misc.getAttribute(child, XMLString.META_NAME); + if (sPropertyName!=null) { + userdefined.put(sPropertyName,getContent(child)); + } + } } sKeywords = keywords.toString(); } - /**

Get the title of this document (may be null)

+ /**

Get the title of this document (may be empty)

* @return the title of the document */ public String getTitle() { return sTitle; } - /**

Get the creator of this document (may be null)

+ /**

Get the creator of this document (may be empty)

* @return the creator of the document (or the initial creator if none is specified) */ public String getCreator() { return sCreator==null ? sInitialCreator : sCreator; } - /**

Get the initial creator of this document (may be null)

+ /**

Get the initial creator of this document (may be empty)

* @return the initial creator of the document */ public String getInitialCreator() { return sInitialCreator; } - /**

Get the date of this document (may be null)

+ /**

Get the date of this document (may be empty)

* @return the date of the document */ public String getDate() { return sDate; } - /**

Get the description of this document (may be null)

+ /**

Get the description of this document (may be empty)

* @return the description of the document */ public String getDescription() { return sDescription; } - /**

Get the language of this document (may be null)

+ /**

Get the language of this document (may be empty)

* @return the language of the document */ public String getLanguage() { return sLanguage; } @@ -147,27 +158,32 @@ public class MetaData implements writer2latex.api.MetaData { this.sLanguage = sLanguage; } - /**

Get the subject of this document (may be null)

+ /**

Get the subject of this document (may be empty)

* @return the subject of the document */ public String getSubject() { return sSubject; } - /**

Get the keywords of this document as a comma separated list (may be null)

+ /**

Get the keywords of this document as a comma separated list (may be epmty)

* @return the keywords of the document */ public String getKeywords() { return sKeywords; } + /** Get the user-defined meta data + * + * @return the user-defined meta data as a name-value map + */ + public Map getUserDefinedMetaData() { return userdefined; } + private String getContent(Node node) { - if (!node.hasChildNodes()) { return null; } - String s=""; - NodeList list = node.getChildNodes(); - int nLen = list.getLength(); - for (int i=0; iDocument name. + * @param sName Document name. */ public CssDocument(String sName) { this.sName = sName; diff --git a/source/oxt/writer2latex/Options.xcu b/source/oxt/writer2latex/Options.xcu index 9c63f38..0515edc 100644 --- a/source/oxt/writer2latex/Options.xcu +++ b/source/oxt/writer2latex/Options.xcu @@ -36,7 +36,7 @@ true - 72 + 120 false diff --git a/source/oxt/writer2latex/help/en/org.openoffice.da.writer2latex.oxt/export.xhp b/source/oxt/writer2latex/help/en/org.openoffice.da.writer2latex.oxt/export.xhp index cf0ba98..85a702d 100644 --- a/source/oxt/writer2latex/help/en/org.openoffice.da.writer2latex.oxt/export.xhp +++ b/source/oxt/writer2latex/help/en/org.openoffice.da.writer2latex.oxt/export.xhp @@ -118,7 +118,8 @@ Use greek letters as symbols Check this treat greek characters as symbols rather than as text Greek letters used in latin text are often used as symbols, such as the - number π or the word γ-radiation. By checking this option, all greek letters used within latin or cyrillic text + number π or the word γ-radiation. By checking this option (not available if XeTeX is the backend), + all greek letters used within latin or cyrillic text will be treated as mathematical symbols, which will produce a slightly better result – and also not require that greek text fonts are available in the LaTeX installation. This option has no effect on greek text (provided the language is set correctly in the %PRODUCTNAME Writer document).