BibTeX support

git-svn-id: svn://svn.code.sf.net/p/writer2latex/code/trunk@227 f0f2a975-2e09-46c8-9428-3b39399b9f3c
This commit is contained in:
henrikjust 2015-02-09 14:16:34 +00:00
parent 53c84ca717
commit 9f9b9bd7a7
5 changed files with 356 additions and 144 deletions
source
distro
java/org/openoffice/da/comp/writer2latex
oxt/writer2latex/W4LDialogs
readme-source.txt

View file

@ -14,5 +14,5 @@ Bugs and feature requests should be reported to
writer2latex (at) gmail.com
November 2014
February 2015
Henrik Just

View file

@ -13,7 +13,7 @@ Items marked with * are work in progress
[w2x] New boolean option embed_img (default false). If set to true, the binary contents of img elements are included
directly on the src attribute as base64.
[w2l] *Added new BibTeX dialog to insert a bibliographic reference to a BibTeX file. The BibTeX files are located as
[w2l] Added new BibTeX dialog to insert a bibliographic reference to a BibTeX file. The BibTeX files are located as
defined in the configuration, and the reference is inserted as an ordinary reference mark.
[w2l] Various improvements to the log viewer dialog: Reduced height to better accommodate small screen resolutions.

View file

@ -16,11 +16,11 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
* Copyright: 2002-2014 by Henrik Just
* Copyright: 2002-2015 by Henrik Just
*
* All Rights Reserved.
*
* Version 1.6 (2014-12-27)
* Version 1.6 (2015-02-09)
*
*/
@ -31,7 +31,15 @@ import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import com.sun.star.awt.XDialog;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.frame.XFrame;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.text.XDependentTextField;
import com.sun.star.text.XText;
import com.sun.star.text.XTextDocument;
import com.sun.star.text.XTextViewCursor;
import com.sun.star.text.XTextViewCursorSupplier;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
@ -45,20 +53,18 @@ import writer2latex.office.BibMark.EntryType;
/** This class provides a UNO dialog to insert a BibTeX bibliographic reference
*/
public class BibTeXDialog extends DialogBase implements com.sun.star.lang.XInitialization {
// **** Data used for component registration
/** The component will be registered under this name.
/** The component will be registered under this service name
*/
public static String __serviceName = "org.openoffice.da.writer2latex.BibTeXDialog";
/** The component should also have an implementation name.
/** The implementation name of the component
*/
public static String __implementationName = "org.openoffice.da.comp.writer2latex.BibTeXDialog";
/** Return the name of the library containing the dialog
*/
public String getDialogLibraryName() {
return "W4LDialogs";
}
// **** Member variables
// The current frame (passed at initialization)
XFrame xFrame = null;
@ -72,27 +78,10 @@ public class BibTeXDialog extends DialogBase implements com.sun.star.lang.XIniti
// Cache of the current BibTeX file
BibTeXReader currentFile = null;
/** Return the name of the dialog within the library
*/
public String getDialogName() {
return "BibTeXEntry";
}
public void initialize() {
refresh();
}
public void endDialog() {
}
/** Create a new BibTeXDialog */
public BibTeXDialog(XComponentContext xContext) {
super(xContext);
}
// Implement com.sun.star.lang.XInitialization
// **** Implement com.sun.star.lang.XInitialization
// We expect to get the current frame and a comma separated list of BibTeX files to use
public void initialize( Object[] objects )
@Override public void initialize( Object[] objects )
throws com.sun.star.uno.Exception {
for (Object object : objects) {
if (object instanceof XFrame) {
@ -103,9 +92,36 @@ public class BibTeXDialog extends DialogBase implements com.sun.star.lang.XIniti
}
}
}
// **** Extend DialogBase
/** Create a new BibTeXDialog */
public BibTeXDialog(XComponentContext xContext) {
super(xContext);
}
/** Return the name of the library containing the dialog
*/
@Override public String getDialogLibraryName() {
return "W4LDialogs";
}
/** Return the name of the dialog within the library
*/
@Override public String getDialogName() {
return "BibTeXEntry";
}
@Override public void initialize() {
refresh();
}
@Override public void endDialog() {
}
// Implement XDialogEventHandler
public boolean callHandlerMethod(XDialog xDialog, Object event, String sMethod) {
// **** Implement XDialogEventHandler
@Override public boolean callHandlerMethod(XDialog xDialog, Object event, String sMethod) {
if (sMethod.equals("FileChange")) {
fileChange();
}
@ -124,11 +140,13 @@ public class BibTeXDialog extends DialogBase implements com.sun.star.lang.XIniti
return true;
}
public String[] getSupportedMethodNames() {
@Override public String[] getSupportedMethodNames() {
String[] sNames = { "FileChange", "EntryChange", "InsertReference", "Edit", "Refresh" };
return sNames;
}
// **** Implement the UI functions
// (Re)load the list of BibTeX files
private void refresh() {
// Remember current file selection, if any
@ -264,12 +282,21 @@ public class BibTeXDialog extends DialogBase implements com.sun.star.lang.XIniti
// Insert the currently selected entry as a reference in the text document
private void insertReference() {
if (xFrame!=null) {
MessageBox msgBox = new MessageBox(xContext, xFrame);
msgBox.showMessage("Writer2LaTeX","This feature has not been implemented yet");
insertReference(getCurrentEntry());
}
}
// Get the currently selected entry, or null if none is selected
// Edit the currently selected BibTeX file, if any
private void edit() {
int nFile = getListBoxSelectedItem("File");
if (nFile>=0) {
if (files[nFile].exists()) {
edit(files[nFile]);
}
}
}
// Helper function: Get the currently selected entry, or null if none is selected
private BibMark getCurrentEntry() {
BibMark bibMark = null;
int nEntry = getListBoxSelectedItem("Entry");
@ -281,26 +308,260 @@ public class BibTeXDialog extends DialogBase implements com.sun.star.lang.XIniti
return bibMark;
}
// Edit the current BibTeX file
private void edit() {
int nFile = getListBoxSelectedItem("File");
if (nFile>=0) {
if (files[nFile].exists()) {
// Open the file in the default application on this system (if any)
if (Desktop.isDesktopSupported()) {
Desktop desktop = Desktop.getDesktop();
try {
desktop.open(files[nFile]);
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
else if (xFrame!=null) {
// **** Implement core functions
// Edit a BibTeX files using the systems default application, if any
private void edit(File file) {
if (Desktop.isDesktopSupported()) {
Desktop desktop = Desktop.getDesktop();
try {
desktop.open(file);
} catch (IOException e) {
if (xFrame!=null) {
MessageBox msgBox = new MessageBox(xContext, xFrame);
msgBox.showMessage("Writer2LaTeX","Error: No BibTeX editor was found");
}
}
msgBox.showMessage("Writer2LaTeX","Error: Failed to open file with BibTeX editor");
}
}
}
else if (xFrame!=null) {
MessageBox msgBox = new MessageBox(xContext, xFrame);
msgBox.showMessage("Writer2LaTeX","Error: No BibTeX editor was found");
}
}
// Insert a bibliographic reference from a BibMark
private void insertReference(BibMark bibMark) {
if (xFrame!=null) {
try {
// To be able to manipulate the text we need to get the XText interface of the model
XTextDocument xTextDoc = (XTextDocument) UnoRuntime.queryInterface(
XTextDocument.class, xFrame.getController().getModel());
XText xText = xTextDoc.getText();
// To locate the current position, we need to get the XTextViewCursor from the controller
XTextViewCursorSupplier xViewCursorSupplier = (XTextViewCursorSupplier) UnoRuntime.queryInterface(
XTextViewCursorSupplier.class, xFrame.getController());
XTextViewCursor xViewCursor = xViewCursorSupplier.getViewCursor();
// To create a new bibliographic field, we need to get the document service factory
XMultiServiceFactory xDocFactory = (XMultiServiceFactory) UnoRuntime.queryInterface(
XMultiServiceFactory.class, xFrame.getController().getModel());
// Use the service factory to create a bibliography field
XDependentTextField xBibField = (XDependentTextField) UnoRuntime.queryInterface (
XDependentTextField.class, xDocFactory.createInstance("com.sun.star.text.textfield.Bibliography"));
// Create a field master for the field
XPropertySet xMasterPropSet = (XPropertySet) UnoRuntime.queryInterface(
XPropertySet.class, xDocFactory.createInstance("com.sun.star.text.fieldmaster.Bibliography"));
// Populate the bibliography field
XPropertySet xPropSet = (XPropertySet) UnoRuntime.queryInterface(
XPropertySet.class, xBibField);
PropertyValue[] fields = createBibliographyFields(bibMark);
xPropSet.setPropertyValue("Fields", fields);
// Attach the field master to the bibliography field
xBibField.attachTextFieldMaster(xMasterPropSet);
// Finally, insert the field at the end of the cursor
xText.insertTextContent(xViewCursor.getEnd(), xBibField, false);
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
}
}
// Create fields from a BibMark
private PropertyValue[] createBibliographyFields(BibMark bibMark) {
EntryType[] entryTypes = EntryType.values();
PropertyValue[] fields = new PropertyValue[entryTypes.length+2];
fields[0] = new PropertyValue();
fields[0].Name="Identifier";
fields[0].Value=bibMark.getIdentifier();
fields[1] = new PropertyValue();
fields[1].Name="BibiliographicType"; // sic!
fields[1].Value=new Short(getBibliographicType(bibMark.getEntryType()));
int i=1;
for (EntryType entryType : entryTypes) {
fields[++i] = new PropertyValue();
fields[i].Name = getFieldName(entryType);
String sValue = bibMark.getField(entryType);
fields[i].Value = sValue!=null ? bibMark.getField(entryType) : "";
}
return fields;
}
// Translate entry type to field name
private String getFieldName(EntryType entryType) {
switch(entryType) {
case address: return "Address";
case annote: return "Annote";
case author: return "Author";
case booktitle: return "Booktitle";
case chapter : return "Chapter";
case edition: return "Edition";
case editor: return "Editor";
case howpublished: return "Howpublished";
case institution: return "Institution";
case journal: return "Journal";
case month: return "Month";
case note: return "Note";
case number: return "Number";
case organizations: return "Organizations";
case pages: return "Pages";
case publisher: return "Publisher";
case school: return "School";
case series: return "Series";
case title: return "Title";
case report_type: return "Report_Type";
case volume: return "Volume";
case year: return "Year";
case url: return "URL";
case custom1: return "Custom1";
case custom2: return "Custom2";
case custom3: return "Custom3";
case custom4: return "Custom4";
case custom5: return "Custom5";
case isbn: return "ISBN";
default: return null;
}
}
// Translate bibliographic type to internal code
private short getBibliographicType(String sBibType) {
String s = sBibType.toUpperCase();
if ("ARTICLE".equals(s)) {
return (short)0;
}
else if ("BOOK".equals(s)) {
return (short)1;
}
else if ("BOOKLET".equals(s)) {
return (short)2;
}
else if ("CONFERENCE".equals(s)) {
return (short)3;
}
else if ("INBOOK".equals(s)) {
return (short)4;
}
else if ("INCOLLECTION".equals(s)) {
return (short)5;
}
else if ("INPROCEEDINGS".equals(s)) {
return (short)6;
}
else if ("JOURNAL".equals(s)) {
return (short)7;
}
else if ("MANUAL".equals(s)) {
return (short)8;
}
else if ("MASTERSTHESIS".equals(s)) {
return (short)9;
}
else if ("MISC".equals(s)) {
return (short)10;
}
else if ("PHDTHESIS".equals(s)) {
return (short)11;
}
else if ("PROCEEDINGS".equals(s)) {
return (short)12;
}
else if ("TECHREPORT".equals(s)) {
return (short)13;
}
else if ("UNPUBLISHED".equals(s)) {
return (short)14;
}
else if ("EMAIL".equals(s)) {
return (short)15;
}
else if ("WWW".equals(s)) {
return (short)16;
}
else if ("CUSTOM1".equals(s)) {
return (short)17;
}
else if ("CUSTOM2".equals(s)) {
return (short)18;
}
else if ("CUSTOM3".equals(s)) {
return (short)19;
}
else if ("CUSTOM4".equals(s)) {
return (short)20;
}
else if ("CUSTOM5".equals(s)) {
return (short)21;
}
else {
return (short)10; // misc
}
}
}
// Some test code kept for future reference: Traverse all existing bibliography fields
/* private void test() {
XTextFieldsSupplier xSupplier = (XTextFieldsSupplier) UnoRuntime.queryInterface(
XTextFieldsSupplier.class, xFrame.getController().getModel());
XEnumerationAccess fields = xSupplier.getTextFields();
XEnumeration enumeration = fields.createEnumeration();
while (enumeration.hasMoreElements()) {
try {
Object elm = enumeration.nextElement();
System.out.println("************");
if (AnyConverter.isObject(elm)) {
XTextField xTextField = (XTextField) AnyConverter.toObject(XTextField.class, elm);
if (xTextField!=null) {
XPropertySet xPropSet = (XPropertySet) UnoRuntime.queryInterface(
XPropertySet.class, xTextField);
if (xPropSet!=null) {
try {
Object propsobj = xPropSet.getPropertyValue("Fields");
if (propsobj!=null && propsobj instanceof PropertyValue[]) {
PropertyValue[] props = (PropertyValue[]) propsobj;
for (PropertyValue prop : props) {
if (prop.Value instanceof String) {
System.out.println("String "+prop.Name+"=>"+(String)prop.Value);
}
else if (prop.Value instanceof Short) {
System.out.println("Short "+prop.Name+"=>"+(Short)prop.Value);
}
else {
System.out.println("Other "+prop.Name+"=>"+prop.Value.getClass().getName());
}
}
}
else {
System.out.println("Unexpected type of fields");
}
} catch (UnknownPropertyException e) {
System.out.println("Unknown property?");
}
}
else {
System.out.println("No properties");
}
}
else {
System.out.println("Found something unexpected");
}
}
else {
System.out.println("Found nothing");
}
} catch (NoSuchElementException e) {
e.printStackTrace();
} catch (WrappedTargetException e) {
e.printStackTrace();
}
}
}
*/

View file

@ -1,83 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:name="Addons" oor:package="org.openoffice.Office">
<!-- Defines the menus and toolbars provided by Writer2LaTeX -->
<node oor:name="AddonUI">
<node oor:name="OfficeToolBar">
<node oor:name="org.openoffice.da.writer2latex.OfficeToolBar" oor:op="replace">
<node oor:name="button1" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en-US">Insert BibTeX citation</value>
<value xml:lang="da">Indsæt BibTeX-reference</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>org.openoffice.da.writer2latex:InsertBibTeX</value>
</prop>
<prop oor:name="ImageIdentifier" oor:type="xs:string">
<value>%origin%/icons/bibtex</value>
</prop>
</node>
<node oor:name="button2" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en-US">Publish to LaTeX</value>
<value xml:lang="da">Publicer til LaTeX</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>org.openoffice.da.writer2latex:ProcessDocument</value>
</prop>
<prop oor:name="ImageIdentifier" oor:type="xs:string">
<value>%origin%/icons/latex</value>
</prop>
</node>
<node oor:name="button3" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en-US">View log files</value>
<value xml:lang="da">Vis logfiler</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>org.openoffice.da.writer2latex:ViewLog</value>
</prop>
<prop oor:name="ImageIdentifier" oor:type="xs:string">
<value>%origin%/icons/log</value>
</prop>
</node>
<node oor:name="button4" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en-US">Edit custom format</value>
<value xml:lang="da">Rediger brugerdefineret format</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>.uno:OptionsTreeDialog?OptionsPageURL:string=%origin%/W2LDialogs2/Documentclass.xdl</value>
</prop>
<prop oor:name="ImageIdentifier" oor:type="xs:string">
<value>%origin%/icons/custom</value>
</prop>
</node>
</node>
</node>
</node>
</oor:component-data>

View file

@ -1,7 +1,7 @@
Writer2LaTeX source version 1.5.2 alpha
=======================================
Writer2LaTeX is (c) 2002-2014 by Henrik Just.
Writer2LaTeX is (c) 2002-2015 by Henrik Just.
The source is available under the terms and conditions of the
GNU LESSER GENERAL PUBLIC LICENSE, version 2.1.
Please see the file COPYING.TXT for details.
@ -24,10 +24,12 @@ Currently parts of the source for Writer2LaTeX are somewhat messy and
undocumented. This situation tends to improve over time :-)
Third-party software
--------------------
Third-party software: JSON.org
------------------------------
The JSON library org.json.* from JSON.org is included in binary form as json-20140107.jar.
The source code is available from JSON.org.
The classes org.json.* from JSON.org are included as json-20140107.jar. The source code is available from JSON.org.
Copyright notice:
The classes org.json.* are copyright (c) 2002 JSON.org and is used subject to the following notice
@ -47,6 +49,38 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRA
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Third-party software:
---------------------------
Villu Ruusmanns Java BibTeX API is included in binary form as jbibtex-1.0.14.jar.
The source code is available from https://code.google.com/p/java-bibtex/
Copyright notice:
Copyright (c) 2012, University of Tartu
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that
the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
following disclaimer in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Building Writer2LaTeX
---------------------
@ -90,7 +124,7 @@ In addition to oxt, the build file supports the following targets:
clean
Henrik Just, November 2014
Henrik Just, February 2015
Thanks to Michael Niedermair for writing the original ant build file