From 170fc68da10e8aad79e7498502a62a3dd70fb557 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 30 Aug 2024 19:56:29 +0530 Subject: [PATCH 01/49] Initial commit --- .../org/jabref/gui/openoffice/OOBibBase.java | 16 +- .../gui/openoffice/OpenOfficePanel.java | 7 +- .../oocsltext/CSLCitationOOAdapter.java | 10 +- .../oocsltext/CSLReferenceMark.java | 97 +++++----- .../oocsltext/CSLReferenceMarkManager.java | 165 +++++++++++++----- .../oocsltext/CSLUpdateBibliography.java | 4 +- 6 files changed, 194 insertions(+), 105 deletions(-) diff --git a/src/main/java/org/jabref/gui/openoffice/OOBibBase.java b/src/main/java/org/jabref/gui/openoffice/OOBibBase.java index f24b98d8712..83563f5e9f2 100644 --- a/src/main/java/org/jabref/gui/openoffice/OOBibBase.java +++ b/src/main/java/org/jabref/gui/openoffice/OOBibBase.java @@ -55,7 +55,6 @@ import com.sun.star.lang.WrappedTargetException; import com.sun.star.text.XTextCursor; import com.sun.star.text.XTextDocument; -import com.sun.star.uno.Exception; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -90,12 +89,12 @@ public OOBibBase(Path loPath, DialogService dialogService) this.alwaysAddCitedOnPages = false; } - private void initializeCitationAdapter(XTextDocument doc) throws WrappedTargetException, NoSuchElementException { + private void initializeCitationAdapter(XTextDocument doc) throws Exception { this.cslCitationOOAdapter = new CSLCitationOOAdapter(doc); this.cslCitationOOAdapter.readExistingMarks(); } - public void guiActionSelectDocument(boolean autoSelectForSingle) throws WrappedTargetException, NoSuchElementException { + public void guiActionSelectDocument(boolean autoSelectForSingle) throws Exception { final String errorTitle = Localization.lang("Problem connecting"); try { @@ -643,7 +642,8 @@ public void guiActionInsertEntry(List<BibEntry> entries, | NotRemoveableException ex) { LOGGER.warn("Could not insert entry", ex); OOError.fromMisc(ex).setTitle(errorTitle).showErrorDialog(dialogService); - } catch (Exception e) { + } catch ( + Exception e) { throw new RuntimeException(e); } finally { UnoUndo.leaveUndoContext(doc); @@ -947,13 +947,15 @@ public void guiActionUpdateDocument(List<BibDatabase> databases, OOStyle style) } catch (NoDocumentException | NoSuchElementException e) { throw new RuntimeException(e); + } catch ( + Exception e) { + throw new RuntimeException(e); } finally { UnoUndo.leaveUndoContext(doc); fcursor.get().restore(doc); } - } catch (CreationException - | WrappedTargetException - | com.sun.star.lang.IllegalArgumentException ex) { + } catch ( + com.sun.star.lang.IllegalArgumentException ex) { LOGGER.warn("Could not update CSL bibliography", ex); OOError.fromMisc(ex).setTitle(errorTitle).showErrorDialog(dialogService); } diff --git a/src/main/java/org/jabref/gui/openoffice/OpenOfficePanel.java b/src/main/java/org/jabref/gui/openoffice/OpenOfficePanel.java index 4e51e6ec5c1..19eb692c4ac 100644 --- a/src/main/java/org/jabref/gui/openoffice/OpenOfficePanel.java +++ b/src/main/java/org/jabref/gui/openoffice/OpenOfficePanel.java @@ -210,6 +210,9 @@ private void initPanel() { } catch (WrappedTargetException | NoSuchElementException ex) { throw new RuntimeException(ex); + } catch ( + Exception ex) { + throw new RuntimeException(ex); } }); @@ -433,8 +436,8 @@ protected OOBibBase call() throws BootstrapException, CreationException { try { ooBase.guiActionSelectDocument(true); - } catch (WrappedTargetException - | NoSuchElementException e) { + } catch ( + Exception e) { throw new RuntimeException(e); } diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java index 11b2f9d0053..31a4114c1fe 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java @@ -1,6 +1,5 @@ package org.jabref.logic.openoffice.oocsltext; -import java.io.IOException; import java.util.Comparator; import java.util.Iterator; import java.util.List; @@ -24,7 +23,6 @@ import com.sun.star.lang.WrappedTargetException; import com.sun.star.text.XTextCursor; import com.sun.star.text.XTextDocument; -import com.sun.star.uno.Exception; /** * This class processes CSL citations in JabRef and interacts directly with LibreOffice using an XTextDocument instance. @@ -50,7 +48,7 @@ public void readExistingMarks() throws WrappedTargetException, NoSuchElementExce * Comparable to LaTeX's \cite command. */ public void insertCitation(XTextCursor cursor, CitationStyle selectedStyle, List<BibEntry> entries, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager bibEntryTypesManager) - throws CreationException, IOException, Exception { + throws java.lang.Exception { String style = selectedStyle.getSource(); boolean isAlphanumeric = isAlphanumericStyle(selectedStyle); @@ -79,7 +77,7 @@ public void insertCitation(XTextCursor cursor, CitationStyle selectedStyle, List * @implNote Very similar to the {@link #insertCitation(XTextCursor, CitationStyle, List, BibDatabaseContext, BibEntryTypesManager)} method.insertInText method */ public void insertInTextCitation(XTextCursor cursor, CitationStyle selectedStyle, List<BibEntry> entries, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager bibEntryTypesManager) - throws IOException, CreationException, Exception { + throws java.lang.Exception { String style = selectedStyle.getSource(); boolean isAlphanumeric = isAlphanumericStyle(selectedStyle); @@ -128,7 +126,7 @@ public void insertInTextCitation(XTextCursor cursor, CitationStyle selectedStyle * Adds the entries to the list for which bibliography is to be generated. */ public void insertEmpty(XTextCursor cursor, List<BibEntry> entries) - throws CreationException, Exception { + throws java.lang.Exception { for (BibEntry entry : entries) { CSLReferenceMark mark = markManager.createReferenceMark(entry); OOText emptyOOText = OOFormat.setLocaleNone(OOText.fromString("")); @@ -188,7 +186,7 @@ public void insertBibliography(XTextCursor cursor, CitationStyle selectedStyle, * Thus, in case of citations for a group of entries, we first insert the citation (text), then insert the invisible reference marks for each entry separately after it. */ private void insertMultipleReferenceMarks(XTextCursor cursor, List<BibEntry> entries, OOText ooText) - throws CreationException, Exception { + throws java.lang.Exception { boolean preceedingSpaceExists; XTextCursor checkCursor = cursor.getText().createTextCursorByRange(cursor.getStart()); diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java index 49f11127c0c..da5a91f39f1 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java @@ -17,76 +17,67 @@ import com.sun.star.uno.Exception; import com.sun.star.uno.UnoRuntime; import io.github.thibaultmeyer.cuid.CUID; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import static org.jabref.logic.openoffice.backend.NamedRangeReferenceMark.safeInsertSpacesBetweenReferenceMarks; -/** - * Class to handle a reference mark. See {@link CSLReferenceMarkManager} for the management of all reference marks. - */ public class CSLReferenceMark { - - private static final Logger LOGGER = LoggerFactory.getLogger(CSLReferenceMark.class); - private final ReferenceMark referenceMark; - private final XTextContent textContent; + private XTextContent textContent; + private final String citationKey; + private int citationNumber; public CSLReferenceMark(XNamed named, ReferenceMark referenceMark) { this.referenceMark = referenceMark; - textContent = UnoRuntime.queryInterface(XTextContent.class, named); - } - - public CSLReferenceMark(XNamed named, String name, String citationKey, Integer citationNumber, String uniqueId) { - referenceMark = new ReferenceMark(name, citationKey, citationNumber, uniqueId); this.textContent = UnoRuntime.queryInterface(XTextContent.class, named); + this.citationKey = referenceMark.getCitationKey(); + this.citationNumber = referenceMark.getCitationNumber(); } - public static CSLReferenceMark of(String citationKey, Integer citationNumber, XMultiServiceFactory factory) throws Exception { + public static CSLReferenceMark of(String citationKey, int citationNumber, XMultiServiceFactory factory) throws Exception { String uniqueId = CUID.randomCUID2(8).toString(); String name = "JABREF_" + citationKey + " CID_" + citationNumber + " " + uniqueId; XNamed named = UnoRuntime.queryInterface(XNamed.class, factory.createInstance("com.sun.star.text.ReferenceMark")); named.setName(name); - return new CSLReferenceMark(named, name, citationKey, citationNumber, uniqueId); + ReferenceMark referenceMark = new ReferenceMark(name, citationKey, citationNumber, uniqueId); + return new CSLReferenceMark(named, referenceMark); + } + + public String getCitationKey() { + return citationKey; + } + + public int getCitationNumber() { + return citationNumber; + } + + public void setCitationNumber(int number) { + this.citationNumber = number; + } + + public XTextContent getTextContent() { + return textContent; + } + + public String getName() { + return referenceMark.getName(); } public void insertReferenceIntoOO(XTextDocument doc, XTextCursor position, OOText ooText, boolean insertSpaceBefore, boolean insertSpaceAfter, boolean withoutBrackets) throws CreationException, WrappedTargetException { - // Ensure the cursor is at the end of its range position.collapseToEnd(); - - // Insert spaces safely XTextCursor cursor = safeInsertSpacesBetweenReferenceMarks(position.getEnd(), 2); - - // Cursors before the first and after the last space XTextCursor cursorBefore = cursor.getText().createTextCursorByRange(cursor.getStart()); XTextCursor cursorAfter = cursor.getText().createTextCursorByRange(cursor.getEnd()); - cursor.collapseToStart(); cursor.goRight((short) 1, false); - // Now we are between two spaces - - // Store the start position XTextRange startRange = cursor.getStart(); - - // Insert the OOText content OOTextIntoOO.write(doc, cursor, ooText); - - // Store the end position XTextRange endRange = cursor.getEnd(); - - // Move cursor to wrap the entire inserted content cursor.gotoRange(startRange, false); cursor.gotoRange(endRange, true); - - // Create DocumentAnnotation and attach it DocumentAnnotation documentAnnotation = new DocumentAnnotation(doc, referenceMark.getName(), cursor, true); UnoReferenceMark.create(documentAnnotation); - - // Move cursor to the end of the inserted content cursor.gotoRange(endRange, false); - - // Remove extra spaces if (!insertSpaceBefore) { cursorBefore.goRight((short) 1, true); cursorBefore.setString(""); @@ -95,16 +86,36 @@ public void insertReferenceIntoOO(XTextDocument doc, XTextCursor position, OOTex cursorAfter.goLeft((short) 1, true); cursorAfter.setString(""); } - - // Move the original position cursor to the end of the inserted content position.gotoRange(cursorAfter.getEnd(), false); } - public XTextContent getTextContent() { - return textContent; + public void delete() throws Exception { + XTextRange range = textContent.getAnchor(); + range.setString(""); + XTextContent xTextContent = UnoRuntime.queryInterface(XTextContent.class, textContent); + range.getText().removeTextContent(xTextContent); } - public String getName() { - return referenceMark.getName(); + public void select() throws Exception { + XTextRange range = textContent.getAnchor(); + XTextCursor cursor = range.getText().createTextCursorByRange(range); + cursor.gotoRange(range, true); + } + + public void setText(String textString, boolean isRich) throws Exception, CreationException { + XTextRange range = textContent.getAnchor(); + XTextCursor cursor = range.getText().createTextCursorByRange(range); + cursor.setString(""); + if (isRich) { + // Get the XTextDocument from the cursor's text + XTextDocument xTextDocument = UnoRuntime.queryInterface(XTextDocument.class, cursor.getText()); + OOTextIntoOO.write(xTextDocument, cursor, OOText.fromString(textString)); + } else { + cursor.setString(textString); + } + } + + public void updateTextContent(XTextContent newTextContent) { + this.textContent = newTextContent; } } diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 42440572166..d121eef67f6 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -1,89 +1,164 @@ package org.jabref.logic.openoffice.oocsltext; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; -import java.util.IdentityHashMap; +import java.util.List; import java.util.Map; -import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.jabref.logic.openoffice.ReferenceMark; import org.jabref.model.entry.BibEntry; -import com.sun.star.container.NoSuchElementException; import com.sun.star.container.XNameAccess; import com.sun.star.container.XNamed; import com.sun.star.lang.WrappedTargetException; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.text.XReferenceMarksSupplier; +import com.sun.star.text.XText; +import com.sun.star.text.XTextContent; +import com.sun.star.text.XTextCursor; import com.sun.star.text.XTextDocument; -import com.sun.star.uno.Exception; +import com.sun.star.text.XTextRange; import com.sun.star.uno.UnoRuntime; import io.github.thibaultmeyer.cuid.CUID; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class CSLReferenceMarkManager { - private static final Logger LOGGER = LoggerFactory.getLogger(CSLReferenceMarkManager.class); - private final HashMap<String, CSLReferenceMark> marksByName; - private final ArrayList<CSLReferenceMark> marksByID; - private final IdentityHashMap<CSLReferenceMark, Integer> idsByMark; private final XTextDocument document; private final XMultiServiceFactory factory; - private final HashMap<String, Integer> citationKeyToNumber; - private int highestCitationNumber = 0; - private final Map<String, Integer> citationOrder = new HashMap<>(); + private final Map<String, CSLReferenceMark> marksByName = new HashMap<>(); + private final List<CSLReferenceMark> marksInOrder = new ArrayList<>(); + private Map<String, Integer> citationKeyToNumber = new HashMap<>(); public CSLReferenceMarkManager(XTextDocument document) { this.document = document; this.factory = UnoRuntime.queryInterface(XMultiServiceFactory.class, document); - this.marksByName = new HashMap<>(); - this.marksByID = new ArrayList<>(); - this.idsByMark = new IdentityHashMap<>(); - this.citationKeyToNumber = new HashMap<>(); } public CSLReferenceMark createReferenceMark(BibEntry entry) throws Exception { String citationKey = entry.getCitationKey().orElse(CUID.randomCUID2(8).toString()); - int citationNumber = getCitationNumber(citationKey); - CSLReferenceMark referenceMark = CSLReferenceMark.of(citationKey, citationNumber, factory); - addMark(referenceMark); + CSLReferenceMark referenceMark = CSLReferenceMark.of(citationKey, 0, factory); + marksByName.put(referenceMark.getName(), referenceMark); + marksInOrder.add(referenceMark); + updateAllCitationNumbers(); return referenceMark; } - public void addMark(CSLReferenceMark mark) { - marksByName.put(mark.getName(), mark); - idsByMark.put(mark, marksByID.size()); - marksByID.add(mark); - updateCitationInfo(mark.getName()); + public void updateAllCitationNumbers() throws Exception { + sortMarksInOrder(); + Map<String, Integer> newCitationKeyToNumber = new HashMap<>(); + int currentNumber = 1; + + for (CSLReferenceMark mark : marksInOrder) { + String citationKey = mark.getCitationKey(); + int assignedNumber; + if (newCitationKeyToNumber.containsKey(citationKey)) { + assignedNumber = newCitationKeyToNumber.get(citationKey); + } else { + assignedNumber = currentNumber; + newCitationKeyToNumber.put(citationKey, assignedNumber); + currentNumber++; + } + mark.setCitationNumber(assignedNumber); + updateMarkText(mark, assignedNumber); + } + + citationKeyToNumber = newCitationKeyToNumber; + } + + private void sortMarksInOrder() { + Collections.sort(marksInOrder, this::compareTextRanges); + } + + private int compareTextRanges(CSLReferenceMark m1, CSLReferenceMark m2) { + XTextRange r1 = m1.getTextContent().getAnchor(); + XTextRange r2 = m2.getTextContent().getAnchor(); + + if (r1 == null || r2 == null) { + return 0; + } + + XText text = r1.getText(); + if (text == null) { + return 0; + } + + try { + XTextCursor cursor = text.createTextCursorByRange(r1); + cursor.gotoRange(r2, false); + return cursor.goLeft((short) 1, true) ? 1 : -1; + } catch (Exception e) { + System.err.println("Error comparing text ranges: " + e.getMessage()); + return 0; + } + } + + private void updateMarkText(CSLReferenceMark mark, int newNumber) throws Exception { + XTextContent oldContent = mark.getTextContent(); + XTextRange range = oldContent.getAnchor(); + + if (range != null) { + String currentText = range.getString(); + String updatedText = updateCitationText(currentText, newNumber); + + // Remove the old reference mark + XText text = range.getText(); + text.removeTextContent(oldContent); + + // Insert new text + range.setString(updatedText); + + // Create and insert a new reference mark + XNamed newNamed = UnoRuntime.queryInterface(XNamed.class, + factory.createInstance("com.sun.star.text.ReferenceMark")); + newNamed.setName(mark.getName()); + XTextContent newContent = UnoRuntime.queryInterface(XTextContent.class, newNamed); + newContent.attach(range); + + // Update our internal reference to the new text content + mark.updateTextContent(newContent); + } + } + + private String updateCitationText(String currentText, int newNumber) { + Pattern pattern = Pattern.compile("(\\D*)(\\d+)(\\D*)"); + Matcher matcher = pattern.matcher(currentText); + if (matcher.find()) { + String prefix = matcher.group(1); + String suffix = matcher.group(3); + return prefix + newNumber + suffix; + } + return currentText; + } + + public int getCitationNumber(String citationKey) { + return citationKeyToNumber.getOrDefault(citationKey, 0); } - public void readExistingMarks() throws WrappedTargetException, NoSuchElementException { + public void readExistingMarks() throws WrappedTargetException, com.sun.star.container.NoSuchElementException { + marksByName.clear(); + marksInOrder.clear(); + citationKeyToNumber.clear(); + XReferenceMarksSupplier supplier = UnoRuntime.queryInterface(XReferenceMarksSupplier.class, document); XNameAccess marks = supplier.getReferenceMarks(); - citationOrder.clear(); - int citationCounter = 0; - for (String name : marks.getElementNames()) { - Optional<ReferenceMark> referenceMark = ReferenceMark.of(name); - if (!referenceMark.isEmpty()) { - citationOrder.putIfAbsent(referenceMark.map(ReferenceMark::getCitationKey).get(), ++citationCounter); + if (name.startsWith("JABREF_")) { XNamed named = UnoRuntime.queryInterface(XNamed.class, marks.getByName(name)); - CSLReferenceMark mark = new CSLReferenceMark(named, referenceMark.get()); - addMark(mark); + String citationKey = name.split(" ")[0].substring(7); + CSLReferenceMark mark = new CSLReferenceMark(named, new ReferenceMark(name, citationKey, 0, "")); + marksByName.put(name, mark); + marksInOrder.add(mark); } } - } - private void updateCitationInfo(String name) { - Optional<ReferenceMark> referenceMark = ReferenceMark.of(name); - if (referenceMark.isPresent()) { - int citationNumber = referenceMark.get().getCitationNumber(); - citationKeyToNumber.put(referenceMark.get().getCitationKey(), citationNumber); - highestCitationNumber = Math.max(highestCitationNumber, citationNumber); - } else { - LOGGER.warn("Could not parse ReferenceMark name: {}", name); + try { + updateAllCitationNumbers(); + } catch (Exception e) { + e.printStackTrace(); } } @@ -91,7 +166,7 @@ public boolean hasCitationForKey(String citationKey) { return citationKeyToNumber.containsKey(citationKey); } - public int getCitationNumber(String citationKey) { - return citationKeyToNumber.computeIfAbsent(citationKey, k -> ++highestCitationNumber); + public List<CSLReferenceMark> getAllMarks() { + return new ArrayList<>(marksInOrder); } } diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLUpdateBibliography.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLUpdateBibliography.java index 21cb87b6cf6..f6acca42a47 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLUpdateBibliography.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLUpdateBibliography.java @@ -41,7 +41,7 @@ public void rebuildCSLBibliography(XTextDocument doc, CitationStyle citationStyle, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager bibEntryTypesManager) - throws WrappedTargetException, NoDocumentException, CreationException { + throws Exception { LOGGER.debug("Starting to rebuild CSL bibliography"); // Ensure the bibliography section exists @@ -87,7 +87,7 @@ private void populateCSLBibTextSection(XTextDocument doc, CitationStyle citationStyle, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager bibEntryTypesManager) - throws WrappedTargetException, NoDocumentException, CreationException { + throws Exception { LOGGER.debug("Populating CSL bibliography section"); Optional<XTextRange> sectionRange = getBibliographyRange(doc); From 73f7be89152fd404bce63b190b16f4a8dd0b96f7 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 30 Aug 2024 20:07:08 +0530 Subject: [PATCH 02/49] Semi-fix: 0-based index --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index d121eef67f6..d7b2a8af9ea 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -39,7 +39,7 @@ public CSLReferenceMarkManager(XTextDocument document) { public CSLReferenceMark createReferenceMark(BibEntry entry) throws Exception { String citationKey = entry.getCitationKey().orElse(CUID.randomCUID2(8).toString()); - CSLReferenceMark referenceMark = CSLReferenceMark.of(citationKey, 0, factory); + CSLReferenceMark referenceMark = CSLReferenceMark.of(citationKey, 1, factory); marksByName.put(referenceMark.getName(), referenceMark); marksInOrder.add(referenceMark); updateAllCitationNumbers(); @@ -149,7 +149,7 @@ public void readExistingMarks() throws WrappedTargetException, com.sun.star.cont if (name.startsWith("JABREF_")) { XNamed named = UnoRuntime.queryInterface(XNamed.class, marks.getByName(name)); String citationKey = name.split(" ")[0].substring(7); - CSLReferenceMark mark = new CSLReferenceMark(named, new ReferenceMark(name, citationKey, 0, "")); + CSLReferenceMark mark = new CSLReferenceMark(named, new ReferenceMark(name, citationKey, 1, "")); marksByName.put(name, mark); marksInOrder.add(mark); } From 5d7d4cdaa484b240444a025b5a874c5b89316625 Mon Sep 17 00:00:00 2001 From: Siedlerchr <siedlerkiller@gmail.com> Date: Fri, 6 Sep 2024 11:56:24 +0200 Subject: [PATCH 03/49] add method for getting multiple citations --- .../org/jabref/logic/citationstyle/CSLAdapter.java | 10 +++++++--- .../logic/citationstyle/CitationStyleGenerator.java | 4 ++++ .../citationstyle/CitationStyleGeneratorTest.java | 10 ++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java b/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java index 422b83b7078..824ea5bc8eb 100644 --- a/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java +++ b/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java @@ -17,12 +17,12 @@ /** * Provides an adapter class to CSL. It holds a CSL instance under the hood that is only recreated when * the style changes. - * + * <p> * Note on the API: The first call to {@link #makeBibliography} is expensive since the * CSL instance will be created. As long as the style stays the same, we can reuse this instance. On style-change, the * engine is re-instantiated. Therefore, the use-case of this class is many calls to {@link #makeBibliography} with the * same style. Changing the output format is cheap. - * + * <p> * Note on the implementation: * The main function {@link #makeBibliography} will enforce * synchronized calling. The main CSL engine under the hood is not thread-safe. Since this class is usually called from @@ -52,10 +52,14 @@ public synchronized List<String> makeBibliography(List<BibEntry> bibEntries, Str } public synchronized Citation makeInText(List<BibEntry> bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) throws IOException { + return makeInTextMulti(bibEntries, style, outputFormat, databaseContext, entryTypesManager).getFirst(); + } + + public synchronized List<Citation> makeInTextMulti(List<BibEntry> bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) throws IOException { dataProvider.setData(bibEntries, databaseContext, entryTypesManager); initialize(style, outputFormat); cslInstance.registerCitationItems(dataProvider.getIds()); - return cslInstance.makeCitation(bibEntries.stream().map(entry -> entry.getCitationKey().orElse("")).toList()).getFirst(); + return cslInstance.makeCitation(bibEntries.stream().map(entry -> entry.getCitationKey().orElse("")).toList()); } /** diff --git a/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java b/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java index 6e285e1d6d9..19ddadd0d7e 100644 --- a/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java +++ b/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java @@ -57,6 +57,10 @@ public static Citation generateInText(List<BibEntry> bibEntries, String style, C return CSL_ADAPTER.makeInText(bibEntries, style, outputFormat, databaseContext, entryTypesManager); } + public static List<Citation> generateInTextMulti(List<BibEntry> bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) throws IOException { + return CSL_ADAPTER.makeInTextMulti(bibEntries, style, outputFormat, databaseContext, entryTypesManager); + } + /** * Generates the citation for multiple entries at once. * diff --git a/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java b/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java index 3ee3a339fc0..e415eb4c5a4 100644 --- a/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java +++ b/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java @@ -1,6 +1,8 @@ package org.jabref.logic.citationstyle; import java.io.IOException; +import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.stream.Stream; @@ -75,6 +77,14 @@ void din1502AlphanumericInTextCitation() throws IOException { assertEquals("[Smit2016]", inTextCitationText); } + @Test + void testMultiNumeric() throws Exception { + context.setMode(BibDatabaseMode.BIBLATEX); + CitationStyle style = CitationStyle.getDefault(); + List<String> citations = CitationStyleGenerator.generateInTextMulti(List.of(testEntry, TestEntry.getTestEntryBook() ), style.getSource(), CitationStyleOutputFormat.HTML, context, bibEntryTypesManager).stream().map(Citation::getText).toList(); + assertEquals(List.of("[1], [2]"), citations ); + } + @Test void ignoreNewLine() { BibEntry entry = new BibEntry(); From 5f9dbf07a1a38cc85b0cbadebb4b4489814104c0 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 6 Sep 2024 20:22:07 +0530 Subject: [PATCH 04/49] Use XTextRangeCompare --- .../oocsltext/CSLReferenceMarkManager.java | 26 +++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index d7b2a8af9ea..da97eae1d15 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -18,9 +18,9 @@ import com.sun.star.text.XReferenceMarksSupplier; import com.sun.star.text.XText; import com.sun.star.text.XTextContent; -import com.sun.star.text.XTextCursor; import com.sun.star.text.XTextDocument; import com.sun.star.text.XTextRange; +import com.sun.star.text.XTextRangeCompare; import com.sun.star.uno.UnoRuntime; import io.github.thibaultmeyer.cuid.CUID; @@ -31,10 +31,12 @@ public class CSLReferenceMarkManager { private final Map<String, CSLReferenceMark> marksByName = new HashMap<>(); private final List<CSLReferenceMark> marksInOrder = new ArrayList<>(); private Map<String, Integer> citationKeyToNumber = new HashMap<>(); + private XTextRangeCompare textRangeCompare; public CSLReferenceMarkManager(XTextDocument document) { this.document = document; this.factory = UnoRuntime.queryInterface(XMultiServiceFactory.class, document); + this.textRangeCompare = UnoRuntime.queryInterface(XTextRangeCompare.class, document.getText()); } public CSLReferenceMark createReferenceMark(BibEntry entry) throws Exception { @@ -69,27 +71,13 @@ public void updateAllCitationNumbers() throws Exception { } private void sortMarksInOrder() { - Collections.sort(marksInOrder, this::compareTextRanges); + Collections.sort(marksInOrder, (m1, m2) -> compareTextRanges(m1.getTextContent().getAnchor(), m2.getTextContent().getAnchor())); } - private int compareTextRanges(CSLReferenceMark m1, CSLReferenceMark m2) { - XTextRange r1 = m1.getTextContent().getAnchor(); - XTextRange r2 = m2.getTextContent().getAnchor(); - - if (r1 == null || r2 == null) { - return 0; - } - - XText text = r1.getText(); - if (text == null) { - return 0; - } - + private int compareTextRanges(XTextRange r1, XTextRange r2) { try { - XTextCursor cursor = text.createTextCursorByRange(r1); - cursor.gotoRange(r2, false); - return cursor.goLeft((short) 1, true) ? 1 : -1; - } catch (Exception e) { + return textRangeCompare.compareRegionStarts(r1, r2); + } catch (com.sun.star.lang.IllegalArgumentException e) { System.err.println("Error comparing text ranges: " + e.getMessage()); return 0; } From 10412467bcd9abc746815e259826fd8ca9b75fa6 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 6 Sep 2024 20:42:43 +0530 Subject: [PATCH 05/49] Fix update order --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index da97eae1d15..70e3ae1033b 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -71,7 +71,7 @@ public void updateAllCitationNumbers() throws Exception { } private void sortMarksInOrder() { - Collections.sort(marksInOrder, (m1, m2) -> compareTextRanges(m1.getTextContent().getAnchor(), m2.getTextContent().getAnchor())); + Collections.sort(marksInOrder, (m1, m2) -> compareTextRanges(m2.getTextContent().getAnchor(), m1.getTextContent().getAnchor())); } private int compareTextRanges(XTextRange r1, XTextRange r2) { From 345af089384202e0f2434b1e8c68a6ee85d3ee9a Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 6 Sep 2024 22:49:44 +0530 Subject: [PATCH 06/49] Remove dead code, undo ai refactor changes --- .../oocsltext/CSLReferenceMark.java | 23 +++++++++++++++++++ .../oocsltext/CSLReferenceMarkManager.java | 4 ---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java index da5a91f39f1..44ff04c2819 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java @@ -64,20 +64,41 @@ public String getName() { public void insertReferenceIntoOO(XTextDocument doc, XTextCursor position, OOText ooText, boolean insertSpaceBefore, boolean insertSpaceAfter, boolean withoutBrackets) throws CreationException, WrappedTargetException { + // Ensure the cursor is at the end of its range position.collapseToEnd(); + + // Insert spaces safely XTextCursor cursor = safeInsertSpacesBetweenReferenceMarks(position.getEnd(), 2); + + // Cursors before the first and after the last space XTextCursor cursorBefore = cursor.getText().createTextCursorByRange(cursor.getStart()); XTextCursor cursorAfter = cursor.getText().createTextCursorByRange(cursor.getEnd()); + cursor.collapseToStart(); cursor.goRight((short) 1, false); + // Now we are between two spaces + + // Store the start position XTextRange startRange = cursor.getStart(); + + // Insert the OOText content OOTextIntoOO.write(doc, cursor, ooText); + + // Store the end position XTextRange endRange = cursor.getEnd(); + + // Move cursor to wrap the entire inserted content cursor.gotoRange(startRange, false); cursor.gotoRange(endRange, true); + + // Create DocumentAnnotation and attach it DocumentAnnotation documentAnnotation = new DocumentAnnotation(doc, referenceMark.getName(), cursor, true); UnoReferenceMark.create(documentAnnotation); + + // Move cursor to the end of the inserted content cursor.gotoRange(endRange, false); + + // Remove extra spaces if (!insertSpaceBefore) { cursorBefore.goRight((short) 1, true); cursorBefore.setString(""); @@ -86,6 +107,8 @@ public void insertReferenceIntoOO(XTextDocument doc, XTextCursor position, OOTex cursorAfter.goLeft((short) 1, true); cursorAfter.setString(""); } + + // Move the original position cursor to the end of the inserted content position.gotoRange(cursorAfter.getEnd(), false); } diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 70e3ae1033b..5fe94c9efeb 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -153,8 +153,4 @@ public void readExistingMarks() throws WrappedTargetException, com.sun.star.cont public boolean hasCitationForKey(String citationKey) { return citationKeyToNumber.containsKey(citationKey); } - - public List<CSLReferenceMark> getAllMarks() { - return new ArrayList<>(marksInOrder); - } } From 1f4b76198d3aacf7d72c21d200039b6b2727274e Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 6 Sep 2024 23:00:49 +0530 Subject: [PATCH 07/49] Fix remaining order issues, Remove dead code, undo ai refactor changes --- .../oocsltext/CSLReferenceMark.java | 6 ++- .../oocsltext/CSLReferenceMarkManager.java | 38 +++++++++++++++---- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java index 44ff04c2819..a32e3a57e9f 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java @@ -21,7 +21,7 @@ import static org.jabref.logic.openoffice.backend.NamedRangeReferenceMark.safeInsertSpacesBetweenReferenceMarks; public class CSLReferenceMark { - private final ReferenceMark referenceMark; + private ReferenceMark referenceMark; private XTextContent textContent; private final String citationKey; private int citationNumber; @@ -141,4 +141,8 @@ public void setText(String textString, boolean isRich) throws Exception, Creatio public void updateTextContent(XTextContent newTextContent) { this.textContent = newTextContent; } + + public void updateName(String newName) { + this.referenceMark = new ReferenceMark(newName, this.citationKey, this.citationNumber, this.referenceMark.getUniqueId()); + } } diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 5fe94c9efeb..69d1653e8dc 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -18,6 +18,7 @@ import com.sun.star.text.XReferenceMarksSupplier; import com.sun.star.text.XText; import com.sun.star.text.XTextContent; +import com.sun.star.text.XTextCursor; import com.sun.star.text.XTextDocument; import com.sun.star.text.XTextRange; import com.sun.star.text.XTextRangeCompare; @@ -88,26 +89,47 @@ private void updateMarkText(CSLReferenceMark mark, int newNumber) throws Excepti XTextRange range = oldContent.getAnchor(); if (range != null) { + XText text = range.getText(); + + // Store the position of the mark + XTextCursor cursor = text.createTextCursorByRange(range); + + // Get the current text content String currentText = range.getString(); + + // Update the citation number in the text String updatedText = updateCitationText(currentText, newNumber); - // Remove the old reference mark - XText text = range.getText(); + // Remove the old reference mark without removing the text text.removeTextContent(oldContent); - // Insert new text - range.setString(updatedText); + // Update the text + cursor.setString(updatedText); - // Create and insert a new reference mark + // Create a new reference mark with updated name + String updatedName = updateReferenceName(mark.getName(), newNumber); XNamed newNamed = UnoRuntime.queryInterface(XNamed.class, factory.createInstance("com.sun.star.text.ReferenceMark")); - newNamed.setName(mark.getName()); + newNamed.setName(updatedName); XTextContent newContent = UnoRuntime.queryInterface(XTextContent.class, newNamed); - newContent.attach(range); - // Update our internal reference to the new text content + // Attach the new reference mark to the cursor range + newContent.attach(cursor); + + // Update our internal reference to the new text content and name mark.updateTextContent(newContent); + mark.updateName(updatedName); + mark.setCitationNumber(newNumber); + } + } + + private String updateReferenceName(String oldName, int newNumber) { + String[] parts = oldName.split(" "); + if (parts.length >= 2) { + parts[1] = "CID_" + newNumber; + return String.join(" ", parts); } + return oldName; } private String updateCitationText(String currentText, int newNumber) { From 78f0b6d8413f5f3873ae8e54d18dafe4bbb641ad Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 6 Sep 2024 23:06:31 +0530 Subject: [PATCH 08/49] Restore exceptions: UpdateCSLBibliography --- .../logic/openoffice/oocsltext/CSLUpdateBibliography.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLUpdateBibliography.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLUpdateBibliography.java index f6acca42a47..21cb87b6cf6 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLUpdateBibliography.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLUpdateBibliography.java @@ -41,7 +41,7 @@ public void rebuildCSLBibliography(XTextDocument doc, CitationStyle citationStyle, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager bibEntryTypesManager) - throws Exception { + throws WrappedTargetException, NoDocumentException, CreationException { LOGGER.debug("Starting to rebuild CSL bibliography"); // Ensure the bibliography section exists @@ -87,7 +87,7 @@ private void populateCSLBibTextSection(XTextDocument doc, CitationStyle citationStyle, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager bibEntryTypesManager) - throws Exception { + throws WrappedTargetException, NoDocumentException, CreationException { LOGGER.debug("Populating CSL bibliography section"); Optional<XTextRange> sectionRange = getBibliographyRange(doc); From fbe83273f8865897424fec8b08c33c85875240da Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 6 Sep 2024 23:11:34 +0530 Subject: [PATCH 09/49] Refine --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 69d1653e8dc..c25dee914a3 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -1,7 +1,6 @@ package org.jabref.logic.openoffice.oocsltext; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -72,7 +71,7 @@ public void updateAllCitationNumbers() throws Exception { } private void sortMarksInOrder() { - Collections.sort(marksInOrder, (m1, m2) -> compareTextRanges(m2.getTextContent().getAnchor(), m1.getTextContent().getAnchor())); + marksInOrder.sort((m1, m2) -> compareTextRanges(m2.getTextContent().getAnchor(), m1.getTextContent().getAnchor())); } private int compareTextRanges(XTextRange r1, XTextRange r2) { @@ -144,7 +143,7 @@ private String updateCitationText(String currentText, int newNumber) { } public int getCitationNumber(String citationKey) { - return citationKeyToNumber.getOrDefault(citationKey, 0); + return citationKeyToNumber.getOrDefault(citationKey, 1); } public void readExistingMarks() throws WrappedTargetException, com.sun.star.container.NoSuchElementException { From 0f4667f4cbcbb4fd65f4c43adf6a7a8a1935e511 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 6 Sep 2024 23:18:02 +0530 Subject: [PATCH 10/49] Fix checkstyle --- .../logic/citationstyle/CitationStyleGeneratorTest.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java b/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java index e415eb4c5a4..d9bbe4f250b 100644 --- a/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java +++ b/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java @@ -1,8 +1,6 @@ package org.jabref.logic.citationstyle; import java.io.IOException; -import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.stream.Stream; @@ -78,11 +76,11 @@ void din1502AlphanumericInTextCitation() throws IOException { } @Test - void testMultiNumeric() throws Exception { + void testMultiNumeric() throws IOException { context.setMode(BibDatabaseMode.BIBLATEX); CitationStyle style = CitationStyle.getDefault(); - List<String> citations = CitationStyleGenerator.generateInTextMulti(List.of(testEntry, TestEntry.getTestEntryBook() ), style.getSource(), CitationStyleOutputFormat.HTML, context, bibEntryTypesManager).stream().map(Citation::getText).toList(); - assertEquals(List.of("[1], [2]"), citations ); + List<String> citations = CitationStyleGenerator.generateInTextMulti(List.of(testEntry, TestEntry.getTestEntryBook()), style.getSource(), CitationStyleOutputFormat.HTML, context, bibEntryTypesManager).stream().map(Citation::getText).toList(); + assertEquals(List.of("[1], [2]"), citations); } @Test From 300fee985ad44b4f62e14ad0571d38495325dd27 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 6 Sep 2024 23:21:43 +0530 Subject: [PATCH 11/49] Remove experiment --- .../logic/citationstyle/CitationStyleGeneratorTest.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java b/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java index d9bbe4f250b..3ee3a339fc0 100644 --- a/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java +++ b/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java @@ -75,14 +75,6 @@ void din1502AlphanumericInTextCitation() throws IOException { assertEquals("[Smit2016]", inTextCitationText); } - @Test - void testMultiNumeric() throws IOException { - context.setMode(BibDatabaseMode.BIBLATEX); - CitationStyle style = CitationStyle.getDefault(); - List<String> citations = CitationStyleGenerator.generateInTextMulti(List.of(testEntry, TestEntry.getTestEntryBook()), style.getSource(), CitationStyleOutputFormat.HTML, context, bibEntryTypesManager).stream().map(Citation::getText).toList(); - assertEquals(List.of("[1], [2]"), citations); - } - @Test void ignoreNewLine() { BibEntry entry = new BibEntry(); From 5a9a9046c8a85d917d94c61860814e160caf1c78 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 6 Sep 2024 23:44:43 +0530 Subject: [PATCH 12/49] Fix OOBibBase.java exceptions --- .../org/jabref/gui/openoffice/OOBibBase.java | 42 +++++++++---------- .../logic/citationstyle/CSLAdapter.java | 6 +-- .../citationstyle/CitationStyleGenerator.java | 4 -- .../oocsltext/CSLCitationOOAdapter.java | 12 +++--- .../oocsltext/CSLReferenceMarkManager.java | 1 + 5 files changed, 28 insertions(+), 37 deletions(-) diff --git a/src/main/java/org/jabref/gui/openoffice/OOBibBase.java b/src/main/java/org/jabref/gui/openoffice/OOBibBase.java index 01b7d11570b..96a073468f5 100644 --- a/src/main/java/org/jabref/gui/openoffice/OOBibBase.java +++ b/src/main/java/org/jabref/gui/openoffice/OOBibBase.java @@ -55,6 +55,7 @@ import com.sun.star.lang.WrappedTargetException; import com.sun.star.text.XTextCursor; import com.sun.star.text.XTextDocument; +import com.sun.star.uno.Exception; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -85,12 +86,12 @@ public OOBibBase(Path loPath, DialogService dialogService) this.alwaysAddCitedOnPages = false; } - private void initializeCitationAdapter(XTextDocument doc) throws Exception { - this.cslCitationOOAdapter = new CSLCitationOOAdapter(doc); - this.cslCitationOOAdapter.readExistingMarks(); + private void initializeCitationAdapter(XTextDocument doc) throws WrappedTargetException, NoSuchElementException { + this.cslCitationOOAdapter = new CSLCitationOOAdapter(doc); + this.cslCitationOOAdapter.readExistingMarks(); } - public void guiActionSelectDocument(boolean autoSelectForSingle) throws Exception { + public void guiActionSelectDocument(boolean autoSelectForSingle) throws WrappedTargetException, NoSuchElementException { final String errorTitle = Localization.lang("Problem connecting"); try { @@ -160,9 +161,9 @@ void showDialog(String errorTitle, OOError err) { OOVoidResult<OOError> collectResults(String errorTitle, List<OOVoidResult<OOError>> results) { String msg = results.stream() - .filter(OOVoidResult::isError) - .map(e -> e.getError().getLocalizedMessage()) - .collect(Collectors.joining("\n\n")); + .filter(OOVoidResult::isError) + .map(e -> e.getError().getLocalizedMessage()) + .collect(Collectors.joining("\n\n")); if (msg.isEmpty()) { return OOVoidResult.ok(); } else { @@ -232,10 +233,10 @@ private static OOVoidResult<OOError> checkRangeOverlaps(XTextDocument doc, OOFro int maxReportedOverlaps = 10; try { return frontend.checkRangeOverlaps(doc, - new ArrayList<>(), - requireSeparation, - maxReportedOverlaps) - .mapError(OOError::from); + new ArrayList<>(), + requireSeparation, + maxReportedOverlaps) + .mapError(OOError::from); } catch (NoDocumentException ex) { return OOVoidResult.error(OOError.from(ex).setTitle(errorTitle)); } catch (WrappedTargetException ex) { @@ -321,7 +322,7 @@ OOResult<OOFrontend, OOError> getFrontend(XTextDocument doc) { } catch (NoDocumentException ex) { return OOResult.error(OOError.from(ex).setTitle(errorTitle)); } catch (WrappedTargetException - | RuntimeException ex) { + | RuntimeException ex) { return OOResult.error(OOError.fromMisc(ex).setTitle(errorTitle)); } } @@ -633,8 +634,7 @@ public void guiActionInsertEntry(List<BibEntry> entries, | NotRemoveableException ex) { LOGGER.warn("Could not insert entry", ex); OOError.fromMisc(ex).setTitle(errorTitle).showErrorDialog(dialogService); - } catch ( - Exception e) { + } catch (Exception e) { throw new RuntimeException(e); } finally { UnoUndo.leaveUndoContext(doc); @@ -813,7 +813,7 @@ public Optional<BibDatabase> exportCitedHelper(List<BibDatabase> databases, bool } catch (DisposedException ex) { OOError.from(ex).setTitle(errorTitle).showErrorDialog(dialogService); } catch (WrappedTargetException - | com.sun.star.lang.IllegalArgumentException ex) { + | com.sun.star.lang.IllegalArgumentException ex) { LOGGER.warn("Problem generating new database.", ex); OOError.fromMisc(ex).setTitle(errorTitle).showErrorDialog(dialogService); } @@ -881,8 +881,8 @@ public void guiActionUpdateDocument(List<BibDatabase> databases, OOStyle style) } catch (DisposedException ex) { OOError.from(ex).setTitle(errorTitle).showErrorDialog(dialogService); } catch (CreationException - | WrappedTargetException - | com.sun.star.lang.IllegalArgumentException ex) { + | WrappedTargetException + | com.sun.star.lang.IllegalArgumentException ex) { LOGGER.warn("Could not update JStyle bibliography", ex); OOError.fromMisc(ex).setTitle(errorTitle).showErrorDialog(dialogService); } @@ -938,15 +938,13 @@ public void guiActionUpdateDocument(List<BibDatabase> databases, OOStyle style) } catch (NoDocumentException | NoSuchElementException e) { throw new RuntimeException(e); - } catch ( - Exception e) { - throw new RuntimeException(e); } finally { UnoUndo.leaveUndoContext(doc); fcursor.get().restore(doc); } - } catch ( - com.sun.star.lang.IllegalArgumentException ex) { + } catch (CreationException + | WrappedTargetException + | com.sun.star.lang.IllegalArgumentException ex) { LOGGER.warn("Could not update CSL bibliography", ex); OOError.fromMisc(ex).setTitle(errorTitle).showErrorDialog(dialogService); } diff --git a/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java b/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java index 824ea5bc8eb..f32a8e52fa8 100644 --- a/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java +++ b/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java @@ -52,14 +52,10 @@ public synchronized List<String> makeBibliography(List<BibEntry> bibEntries, Str } public synchronized Citation makeInText(List<BibEntry> bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) throws IOException { - return makeInTextMulti(bibEntries, style, outputFormat, databaseContext, entryTypesManager).getFirst(); - } - - public synchronized List<Citation> makeInTextMulti(List<BibEntry> bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) throws IOException { dataProvider.setData(bibEntries, databaseContext, entryTypesManager); initialize(style, outputFormat); cslInstance.registerCitationItems(dataProvider.getIds()); - return cslInstance.makeCitation(bibEntries.stream().map(entry -> entry.getCitationKey().orElse("")).toList()); + return cslInstance.makeCitation(bibEntries.stream().map(entry -> entry.getCitationKey().orElse("")).toList()).getFirst(); } /** diff --git a/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java b/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java index 19ddadd0d7e..6e285e1d6d9 100644 --- a/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java +++ b/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java @@ -57,10 +57,6 @@ public static Citation generateInText(List<BibEntry> bibEntries, String style, C return CSL_ADAPTER.makeInText(bibEntries, style, outputFormat, databaseContext, entryTypesManager); } - public static List<Citation> generateInTextMulti(List<BibEntry> bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) throws IOException { - return CSL_ADAPTER.makeInTextMulti(bibEntries, style, outputFormat, databaseContext, entryTypesManager); - } - /** * Generates the citation for multiple entries at once. * diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java index 9c6f9716cf0..fa89ff157c9 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java @@ -1,5 +1,6 @@ package org.jabref.logic.openoffice.oocsltext; +import java.io.IOException; import java.util.Comparator; import java.util.Iterator; import java.util.List; @@ -23,6 +24,7 @@ import com.sun.star.lang.WrappedTargetException; import com.sun.star.text.XTextCursor; import com.sun.star.text.XTextDocument; +import com.sun.star.uno.Exception; /** * This class processes CSL citations in JabRef and interacts directly with LibreOffice using an XTextDocument instance. @@ -48,7 +50,7 @@ public void readExistingMarks() throws WrappedTargetException, NoSuchElementExce * Comparable to LaTeX's \cite command. */ public void insertCitation(XTextCursor cursor, CitationStyle selectedStyle, List<BibEntry> entries, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager bibEntryTypesManager) - throws java.lang.Exception { + throws CreationException, IOException, Exception { String style = selectedStyle.getSource(); boolean isAlphanumeric = isAlphanumericStyle(selectedStyle); @@ -77,7 +79,7 @@ public void insertCitation(XTextCursor cursor, CitationStyle selectedStyle, List * @implNote Very similar to the {@link #insertCitation(XTextCursor, CitationStyle, List, BibDatabaseContext, BibEntryTypesManager)} method.insertInText method */ public void insertInTextCitation(XTextCursor cursor, CitationStyle selectedStyle, List<BibEntry> entries, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager bibEntryTypesManager) - throws java.lang.Exception { + throws IOException, CreationException, Exception { String style = selectedStyle.getSource(); boolean isAlphanumeric = isAlphanumericStyle(selectedStyle); @@ -125,8 +127,7 @@ public void insertInTextCitation(XTextCursor cursor, CitationStyle selectedStyle * Inserts "empty" citations for a list of entries at the cursor to the document. * Adds the entries to the list for which bibliography is to be generated. */ - public void insertEmpty(XTextCursor cursor, List<BibEntry> entries) - throws java.lang.Exception { + public void insertEmpty(XTextCursor cursor, List<BibEntry> entries) throws Exception, CreationException { for (BibEntry entry : entries) { CSLReferenceMark mark = markManager.createReferenceMark(entry); OOText emptyOOText = OOFormat.setLocaleNone(OOText.fromString("")); @@ -191,8 +192,7 @@ public void insertBibliography(XTextCursor cursor, CitationStyle selectedStyle, * Furthermore, it is also difficult to generate a "single" reference mark for a group of entries. * Thus, in case of citations for a group of entries, we first insert the citation (text), then insert the invisible reference marks for each entry separately after it. */ - private void insertMultipleReferenceMarks(XTextCursor cursor, List<BibEntry> entries, OOText ooText) - throws java.lang.Exception { + private void insertMultipleReferenceMarks(XTextCursor cursor, List<BibEntry> entries, OOText ooText) throws Exception, CreationException { boolean preceedingSpaceExists; XTextCursor checkCursor = cursor.getText().createTextCursorByRange(cursor.getStart()); diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index c25dee914a3..20238025ca8 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -21,6 +21,7 @@ import com.sun.star.text.XTextDocument; import com.sun.star.text.XTextRange; import com.sun.star.text.XTextRangeCompare; +import com.sun.star.uno.Exception; import com.sun.star.uno.UnoRuntime; import io.github.thibaultmeyer.cuid.CUID; From d862b25fb52c31a6ad54f36a995eaf52cf97ee1f Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 6 Sep 2024 23:46:55 +0530 Subject: [PATCH 13/49] Fix OpenOfficePanel.java exceptions --- .../java/org/jabref/gui/openoffice/OpenOfficePanel.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jabref/gui/openoffice/OpenOfficePanel.java b/src/main/java/org/jabref/gui/openoffice/OpenOfficePanel.java index 91469035786..c4416876ed8 100644 --- a/src/main/java/org/jabref/gui/openoffice/OpenOfficePanel.java +++ b/src/main/java/org/jabref/gui/openoffice/OpenOfficePanel.java @@ -210,9 +210,6 @@ private void initPanel() { } catch (WrappedTargetException | NoSuchElementException ex) { throw new RuntimeException(ex); - } catch ( - Exception ex) { - throw new RuntimeException(ex); } }); @@ -436,8 +433,8 @@ protected OOBibBase call() throws BootstrapException, CreationException { try { ooBase.guiActionSelectDocument(true); - } catch ( - Exception e) { + } catch (WrappedTargetException + | NoSuchElementException e) { throw new RuntimeException(e); } From 3ab9297b018b1925ae2c295a7319cc9cb01e46fe Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 6 Sep 2024 23:51:33 +0530 Subject: [PATCH 14/49] Fix adapter exception indent --- .../logic/openoffice/oocsltext/CSLCitationOOAdapter.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java index fa89ff157c9..235eb634007 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java @@ -127,7 +127,8 @@ public void insertInTextCitation(XTextCursor cursor, CitationStyle selectedStyle * Inserts "empty" citations for a list of entries at the cursor to the document. * Adds the entries to the list for which bibliography is to be generated. */ - public void insertEmpty(XTextCursor cursor, List<BibEntry> entries) throws Exception, CreationException { + public void insertEmpty(XTextCursor cursor, List<BibEntry> entries) + throws Exception, CreationException { for (BibEntry entry : entries) { CSLReferenceMark mark = markManager.createReferenceMark(entry); OOText emptyOOText = OOFormat.setLocaleNone(OOText.fromString("")); @@ -192,7 +193,8 @@ public void insertBibliography(XTextCursor cursor, CitationStyle selectedStyle, * Furthermore, it is also difficult to generate a "single" reference mark for a group of entries. * Thus, in case of citations for a group of entries, we first insert the citation (text), then insert the invisible reference marks for each entry separately after it. */ - private void insertMultipleReferenceMarks(XTextCursor cursor, List<BibEntry> entries, OOText ooText) throws Exception, CreationException { + private void insertMultipleReferenceMarks(XTextCursor cursor, List<BibEntry> entries, OOText ooText) + throws Exception, CreationException { boolean preceedingSpaceExists; XTextCursor checkCursor = cursor.getText().createTextCursorByRange(cursor.getStart()); From 797d04463f3b4ed56bee2e408430d770745bc6a2 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 6 Sep 2024 23:52:53 +0530 Subject: [PATCH 15/49] Fix adapter exception order --- .../logic/openoffice/oocsltext/CSLCitationOOAdapter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java index 235eb634007..9b529754431 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java @@ -128,7 +128,7 @@ public void insertInTextCitation(XTextCursor cursor, CitationStyle selectedStyle * Adds the entries to the list for which bibliography is to be generated. */ public void insertEmpty(XTextCursor cursor, List<BibEntry> entries) - throws Exception, CreationException { + throws CreationException, Exception { for (BibEntry entry : entries) { CSLReferenceMark mark = markManager.createReferenceMark(entry); OOText emptyOOText = OOFormat.setLocaleNone(OOText.fromString("")); @@ -194,7 +194,7 @@ public void insertBibliography(XTextCursor cursor, CitationStyle selectedStyle, * Thus, in case of citations for a group of entries, we first insert the citation (text), then insert the invisible reference marks for each entry separately after it. */ private void insertMultipleReferenceMarks(XTextCursor cursor, List<BibEntry> entries, OOText ooText) - throws Exception, CreationException { + throws CreationException, Exception { boolean preceedingSpaceExists; XTextCursor checkCursor = cursor.getText().createTextCursorByRange(cursor.getStart()); From 079a251140c7064dab6051d46646f3acdcb918df Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Fri, 6 Sep 2024 23:54:43 +0530 Subject: [PATCH 16/49] Restore javadoc --- .../jabref/logic/openoffice/oocsltext/CSLReferenceMark.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java index a32e3a57e9f..f289c988bf0 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java @@ -20,6 +20,9 @@ import static org.jabref.logic.openoffice.backend.NamedRangeReferenceMark.safeInsertSpacesBetweenReferenceMarks; +/** + * Class to handle a reference mark. See {@link CSLReferenceMarkManager} for the management of all reference marks. + */ public class CSLReferenceMark { private ReferenceMark referenceMark; private XTextContent textContent; From 3c05da3acb0c45c3e9d8714cf6cb2ac3399f40aa Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 00:04:43 +0530 Subject: [PATCH 17/49] Restore javadoc, remove dead code --- .../oocsltext/CSLCitationOOAdapter.java | 6 ++-- .../oocsltext/CSLReferenceMark.java | 28 +------------------ 2 files changed, 4 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java index 9b529754431..50636cbbb90 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java @@ -132,7 +132,7 @@ public void insertEmpty(XTextCursor cursor, List<BibEntry> entries) for (BibEntry entry : entries) { CSLReferenceMark mark = markManager.createReferenceMark(entry); OOText emptyOOText = OOFormat.setLocaleNone(OOText.fromString("")); - mark.insertReferenceIntoOO(document, cursor, emptyOOText, false, false, true); + mark.insertReferenceIntoOO(document, cursor, emptyOOText, false, false); } // Move the cursor to the end of the inserted text - although no need as we don't insert any text, but a good practice @@ -213,7 +213,7 @@ private void insertMultipleReferenceMarks(XTextCursor cursor, List<BibEntry> ent if (entries.size() == 1) { CSLReferenceMark mark = markManager.createReferenceMark(entries.getFirst()); - mark.insertReferenceIntoOO(document, cursor, ooText, !preceedingSpaceExists, false, true); + mark.insertReferenceIntoOO(document, cursor, ooText, !preceedingSpaceExists, false); } else { if (!preceedingSpaceExists) { cursor.getText().insertString(cursor, " ", false); @@ -222,7 +222,7 @@ private void insertMultipleReferenceMarks(XTextCursor cursor, List<BibEntry> ent for (BibEntry entry : entries) { CSLReferenceMark mark = markManager.createReferenceMark(entry); OOText emptyOOText = OOFormat.setLocaleNone(OOText.fromString("")); - mark.insertReferenceIntoOO(document, cursor, emptyOOText, false, false, true); + mark.insertReferenceIntoOO(document, cursor, emptyOOText, false, false); } } diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java index f289c988bf0..ccfe7619422 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java @@ -65,7 +65,7 @@ public String getName() { return referenceMark.getName(); } - public void insertReferenceIntoOO(XTextDocument doc, XTextCursor position, OOText ooText, boolean insertSpaceBefore, boolean insertSpaceAfter, boolean withoutBrackets) + public void insertReferenceIntoOO(XTextDocument doc, XTextCursor position, OOText ooText, boolean insertSpaceBefore, boolean insertSpaceAfter) throws CreationException, WrappedTargetException { // Ensure the cursor is at the end of its range position.collapseToEnd(); @@ -115,32 +115,6 @@ public void insertReferenceIntoOO(XTextDocument doc, XTextCursor position, OOTex position.gotoRange(cursorAfter.getEnd(), false); } - public void delete() throws Exception { - XTextRange range = textContent.getAnchor(); - range.setString(""); - XTextContent xTextContent = UnoRuntime.queryInterface(XTextContent.class, textContent); - range.getText().removeTextContent(xTextContent); - } - - public void select() throws Exception { - XTextRange range = textContent.getAnchor(); - XTextCursor cursor = range.getText().createTextCursorByRange(range); - cursor.gotoRange(range, true); - } - - public void setText(String textString, boolean isRich) throws Exception, CreationException { - XTextRange range = textContent.getAnchor(); - XTextCursor cursor = range.getText().createTextCursorByRange(range); - cursor.setString(""); - if (isRich) { - // Get the XTextDocument from the cursor's text - XTextDocument xTextDocument = UnoRuntime.queryInterface(XTextDocument.class, cursor.getText()); - OOTextIntoOO.write(xTextDocument, cursor, OOText.fromString(textString)); - } else { - cursor.setString(textString); - } - } - public void updateTextContent(XTextContent newTextContent) { this.textContent = newTextContent; } From 3ba0f9659c2399031bfeec342f495a67d44d035f Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 00:12:59 +0530 Subject: [PATCH 18/49] Remove dead code --- .../jabref/logic/openoffice/oocsltext/CSLReferenceMark.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java index ccfe7619422..4c9fb9cb706 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java @@ -49,10 +49,6 @@ public String getCitationKey() { return citationKey; } - public int getCitationNumber() { - return citationNumber; - } - public void setCitationNumber(int number) { this.citationNumber = number; } From 1162a2a9fc35b4122af4325a63062c2edf891330 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 00:20:21 +0530 Subject: [PATCH 19/49] Improve implementation (general changes) --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 20238025ca8..16677cbeb2b 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -42,7 +42,8 @@ public CSLReferenceMarkManager(XTextDocument document) { public CSLReferenceMark createReferenceMark(BibEntry entry) throws Exception { String citationKey = entry.getCitationKey().orElse(CUID.randomCUID2(8).toString()); - CSLReferenceMark referenceMark = CSLReferenceMark.of(citationKey, 1, factory); + int citationNumber = getCitationNumber(citationKey); + CSLReferenceMark referenceMark = CSLReferenceMark.of(citationKey, citationNumber, factory); marksByName.put(referenceMark.getName(), referenceMark); marksInOrder.add(referenceMark); updateAllCitationNumbers(); From 26b4889b00f9ff48aca40cd14afec2a285c8abc9 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 00:30:53 +0530 Subject: [PATCH 20/49] Change printStackTrace->Logger --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 16677cbeb2b..7e713c9b80d 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -24,8 +24,11 @@ import com.sun.star.uno.Exception; import com.sun.star.uno.UnoRuntime; import io.github.thibaultmeyer.cuid.CUID; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class CSLReferenceMarkManager { + private static final Logger LOGGER = LoggerFactory.getLogger(CSLReferenceMarkManager.class); private final XTextDocument document; private final XMultiServiceFactory factory; @@ -169,7 +172,7 @@ public void readExistingMarks() throws WrappedTargetException, com.sun.star.cont try { updateAllCitationNumbers(); } catch (Exception e) { - e.printStackTrace(); + LOGGER.warn("Error updating citation numbers: {}", e.getMessage(), e); } } From c01925f6642c6e3daa07e40a9bb65a81e3b8d540 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 00:48:47 +0530 Subject: [PATCH 21/49] Fix readExistingMarks() --- .../openoffice/oocsltext/CSLReferenceMarkManager.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 7e713c9b80d..22957f7402b 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -162,8 +162,13 @@ public void readExistingMarks() throws WrappedTargetException, com.sun.star.cont for (String name : marks.getElementNames()) { if (name.startsWith("JABREF_")) { XNamed named = UnoRuntime.queryInterface(XNamed.class, marks.getByName(name)); - String citationKey = name.split(" ")[0].substring(7); - CSLReferenceMark mark = new CSLReferenceMark(named, new ReferenceMark(name, citationKey, 1, "")); + String[] parts = name.split(" "); + String citationKey = parts[0].substring(7); + int citationNumber = Integer.parseInt(parts[1].substring(4)); + String uniqueId = parts[2]; + System.out.println(citationNumber); + System.out.println(uniqueId); + CSLReferenceMark mark = new CSLReferenceMark(named, new ReferenceMark(name, citationKey, citationNumber, uniqueId)); marksByName.put(name, mark); marksInOrder.add(mark); } From f2caf8ee13c1ff9190c63e397e3ba055fe50e164 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 00:49:06 +0530 Subject: [PATCH 22/49] Remove logs --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 22957f7402b..29052620be5 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -166,8 +166,6 @@ public void readExistingMarks() throws WrappedTargetException, com.sun.star.cont String citationKey = parts[0].substring(7); int citationNumber = Integer.parseInt(parts[1].substring(4)); String uniqueId = parts[2]; - System.out.println(citationNumber); - System.out.println(uniqueId); CSLReferenceMark mark = new CSLReferenceMark(named, new ReferenceMark(name, citationKey, citationNumber, uniqueId)); marksByName.put(name, mark); marksInOrder.add(mark); From 52c0d20f7dcaa39d900856b1c835185575786e27 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 01:02:35 +0530 Subject: [PATCH 23/49] Finish CSLReferenceMarkManager --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 29052620be5..1798d7a49f4 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -36,6 +36,7 @@ public class CSLReferenceMarkManager { private final List<CSLReferenceMark> marksInOrder = new ArrayList<>(); private Map<String, Integer> citationKeyToNumber = new HashMap<>(); private XTextRangeCompare textRangeCompare; + private int highestCitationNumber = 0; public CSLReferenceMarkManager(XTextDocument document) { this.document = document; @@ -148,7 +149,7 @@ private String updateCitationText(String currentText, int newNumber) { } public int getCitationNumber(String citationKey) { - return citationKeyToNumber.getOrDefault(citationKey, 1); + return citationKeyToNumber.computeIfAbsent(citationKey, k -> ++highestCitationNumber); } public void readExistingMarks() throws WrappedTargetException, com.sun.star.container.NoSuchElementException { @@ -169,6 +170,7 @@ public void readExistingMarks() throws WrappedTargetException, com.sun.star.cont CSLReferenceMark mark = new CSLReferenceMark(named, new ReferenceMark(name, citationKey, citationNumber, uniqueId)); marksByName.put(name, mark); marksInOrder.add(mark); + highestCitationNumber = Math.max(highestCitationNumber, citationNumber); } } From 8f49698216f8dd305f67b2b2f6571006d32fa173 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 01:36:18 +0530 Subject: [PATCH 24/49] openRewrite --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 1798d7a49f4..33099ef79f9 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -10,8 +10,10 @@ import org.jabref.logic.openoffice.ReferenceMark; import org.jabref.model.entry.BibEntry; +import com.sun.star.container.NoSuchElementException; import com.sun.star.container.XNameAccess; import com.sun.star.container.XNamed; +import com.sun.star.lang.IllegalArgumentException; import com.sun.star.lang.WrappedTargetException; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.text.XReferenceMarksSupplier; @@ -83,7 +85,7 @@ private void sortMarksInOrder() { private int compareTextRanges(XTextRange r1, XTextRange r2) { try { return textRangeCompare.compareRegionStarts(r1, r2); - } catch (com.sun.star.lang.IllegalArgumentException e) { + } catch (IllegalArgumentException e) { System.err.println("Error comparing text ranges: " + e.getMessage()); return 0; } @@ -152,7 +154,7 @@ public int getCitationNumber(String citationKey) { return citationKeyToNumber.computeIfAbsent(citationKey, k -> ++highestCitationNumber); } - public void readExistingMarks() throws WrappedTargetException, com.sun.star.container.NoSuchElementException { + public void readExistingMarks() throws WrappedTargetException, NoSuchElementException { marksByName.clear(); marksInOrder.clear(); citationKeyToNumber.clear(); From 4850a602af3dd7b32331b5a2d0c377ec2441f15a Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 01:48:14 +0530 Subject: [PATCH 25/49] fix unit test (std streams -> logger) --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 33099ef79f9..6684c9e22e4 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -86,7 +86,7 @@ private int compareTextRanges(XTextRange r1, XTextRange r2) { try { return textRangeCompare.compareRegionStarts(r1, r2); } catch (IllegalArgumentException e) { - System.err.println("Error comparing text ranges: " + e.getMessage()); + LOGGER.warn("Error comparing text ranges: {}", e.getMessage()); return 0; } } From b4e3209d20e589f08fe0a231c7b1b647c481ed92 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 02:01:05 +0530 Subject: [PATCH 26/49] Redundant log --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 6684c9e22e4..c62c69aa0e8 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -179,7 +179,7 @@ public void readExistingMarks() throws WrappedTargetException, NoSuchElementExce try { updateAllCitationNumbers(); } catch (Exception e) { - LOGGER.warn("Error updating citation numbers: {}", e.getMessage(), e); + LOGGER.warn("Error updating citation numbers", e); } } From 3a227f0a55f4fd616ed73fd894f776454762dd43 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 03:56:19 +0530 Subject: [PATCH 27/49] Safety, refactoring --- .../logic/openoffice/ReferenceMark.java | 4 ++++ .../oocsltext/CSLReferenceMark.java | 2 +- .../oocsltext/CSLReferenceMarkManager.java | 23 +++++++++++-------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java b/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java index e8b466d6965..dbe84c67cf0 100644 --- a/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java +++ b/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java @@ -9,6 +9,10 @@ import org.slf4j.LoggerFactory; public class ReferenceMark { + public static final String[] PREFIXES = {"JABREF_", "CID_"}; + public static final int CITATION_KEY_BEGIN_POSITION = 7; + public static final int CITATION_ID_BEGIN_POSITION = 4; + private static final Logger LOGGER = LoggerFactory.getLogger(ReferenceMark.class); private static final Pattern REFERENCE_MARK_FORMAT = Pattern.compile("^JABREF_(\\w+) CID_(\\w+) (\\w+)$"); diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java index 4c9fb9cb706..b9a116b40cc 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java @@ -38,7 +38,7 @@ public CSLReferenceMark(XNamed named, ReferenceMark referenceMark) { public static CSLReferenceMark of(String citationKey, int citationNumber, XMultiServiceFactory factory) throws Exception { String uniqueId = CUID.randomCUID2(8).toString(); - String name = "JABREF_" + citationKey + " CID_" + citationNumber + " " + uniqueId; + String name = ReferenceMark.PREFIXES[0] + citationKey + " " + ReferenceMark.PREFIXES[1] + citationNumber + " " + uniqueId; XNamed named = UnoRuntime.queryInterface(XNamed.class, factory.createInstance("com.sun.star.text.ReferenceMark")); named.setName(name); ReferenceMark referenceMark = new ReferenceMark(name, citationKey, citationNumber, uniqueId); diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index c62c69aa0e8..bfa83e12485 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -132,8 +132,8 @@ private void updateMarkText(CSLReferenceMark mark, int newNumber) throws Excepti private String updateReferenceName(String oldName, int newNumber) { String[] parts = oldName.split(" "); - if (parts.length >= 2) { - parts[1] = "CID_" + newNumber; + if (parts.length == 3) { + parts[1] = ReferenceMark.PREFIXES[1] + newNumber; return String.join(" ", parts); } return oldName; @@ -163,16 +163,19 @@ public void readExistingMarks() throws WrappedTargetException, NoSuchElementExce XNameAccess marks = supplier.getReferenceMarks(); for (String name : marks.getElementNames()) { - if (name.startsWith("JABREF_")) { + if (name.startsWith(ReferenceMark.PREFIXES[0]) && name.contains(ReferenceMark.PREFIXES[1])) { XNamed named = UnoRuntime.queryInterface(XNamed.class, marks.getByName(name)); + String[] parts = name.split(" "); - String citationKey = parts[0].substring(7); - int citationNumber = Integer.parseInt(parts[1].substring(4)); - String uniqueId = parts[2]; - CSLReferenceMark mark = new CSLReferenceMark(named, new ReferenceMark(name, citationKey, citationNumber, uniqueId)); - marksByName.put(name, mark); - marksInOrder.add(mark); - highestCitationNumber = Math.max(highestCitationNumber, citationNumber); + if (parts.length == 3 && parts[0].startsWith(ReferenceMark.PREFIXES[0]) && parts[1].startsWith(ReferenceMark.PREFIXES[1])) { + String citationKey = parts[0].substring(ReferenceMark.CITATION_KEY_BEGIN_POSITION); + int citationNumber = Integer.parseInt(parts[1].substring(ReferenceMark.CITATION_ID_BEGIN_POSITION)); + String uniqueId = parts[2]; + CSLReferenceMark mark = new CSLReferenceMark(named, new ReferenceMark(name, citationKey, citationNumber, uniqueId)); + marksByName.put(name, mark); + marksInOrder.add(mark); + highestCitationNumber = Math.max(highestCitationNumber, citationNumber); + } } } From 17fe8dec2cc2bb680eb7b4b969af2e3c98521d77 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 04:01:50 +0530 Subject: [PATCH 28/49] Add log --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index bfa83e12485..1d1b4bdb374 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -175,6 +175,8 @@ public void readExistingMarks() throws WrappedTargetException, NoSuchElementExce marksByName.put(name, mark); marksInOrder.add(mark); highestCitationNumber = Math.max(highestCitationNumber, citationNumber); + } else { + LOGGER.error("Invalid reference mark: {}", name); } } } From 400b7fc097a5903cde09e9b5dd0f39d15931ba2a Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 04:08:09 +0530 Subject: [PATCH 29/49] Better log --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 1d1b4bdb374..5d2ec5dd581 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -176,7 +176,7 @@ public void readExistingMarks() throws WrappedTargetException, NoSuchElementExce marksInOrder.add(mark); highestCitationNumber = Math.max(highestCitationNumber, citationNumber); } else { - LOGGER.error("Invalid reference mark: {}", name); + LOGGER.error("Cannot parse reference mark - invalid format: {}", name); } } } From bf406d9945eaa5f90ef5c7a818f00c918f623d6a Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 04:12:26 +0530 Subject: [PATCH 30/49] Change log level (non-breaking) --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 5d2ec5dd581..9560519806c 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -176,7 +176,7 @@ public void readExistingMarks() throws WrappedTargetException, NoSuchElementExce marksInOrder.add(mark); highestCitationNumber = Math.max(highestCitationNumber, citationNumber); } else { - LOGGER.error("Cannot parse reference mark - invalid format: {}", name); + LOGGER.warn("Cannot parse reference mark - invalid format: {}", name); } } } From 774bc48331c29f2d34f553a3f80bdc5ea624e8d9 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 06:15:26 +0530 Subject: [PATCH 31/49] Add handling for multiple entries --- .../logic/openoffice/ReferenceMark.java | 84 ++++++----- .../oocsltext/CSLCitationOOAdapter.java | 18 +-- .../oocsltext/CSLReferenceMark.java | 39 +++-- .../oocsltext/CSLReferenceMarkManager.java | 133 +++++++++++++----- .../logic/openoffice/ReferenceMarkTest.java | 4 +- 5 files changed, 171 insertions(+), 107 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java b/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java index dbe84c67cf0..267759ea325 100644 --- a/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java +++ b/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java @@ -1,5 +1,7 @@ package org.jabref.logic.openoffice; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -10,68 +12,68 @@ public class ReferenceMark { public static final String[] PREFIXES = {"JABREF_", "CID_"}; - public static final int CITATION_KEY_BEGIN_POSITION = 7; - public static final int CITATION_ID_BEGIN_POSITION = 4; private static final Logger LOGGER = LoggerFactory.getLogger(ReferenceMark.class); - private static final Pattern REFERENCE_MARK_FORMAT = Pattern.compile("^JABREF_(\\w+) CID_(\\w+) (\\w+)$"); - private final String name; + private static final Pattern REFERENCE_MARK_FORMAT = Pattern.compile("^((?:JABREF_\\w+ CID_\\w+(?:,\\s*)?)+)(\\s*\\w+)?$"); + private static final Pattern ENTRY_PATTERN = Pattern.compile("JABREF_(\\w+) CID_(\\w+)"); - private String citationKey; - private Integer citationNumber; + private final String name; + private List<String> citationKeys; + private List<Integer> citationNumbers; private String uniqueId; - /** - * @param name Format: <code>JABREF_{citationKey} CID_{citationNumber} {uniqueId}</code> - */ public ReferenceMark(String name) { this.name = name; + parse(name); + } - Matcher matcher = getMatcher(name); + public ReferenceMark(String name, List<String> citationKeys, List<Integer> citationNumbers, String uniqueId) { + this.name = name; + this.citationKeys = citationKeys; + this.citationNumbers = citationNumbers; + this.uniqueId = uniqueId; + } + + private void parse(String name) { + Matcher matcher = REFERENCE_MARK_FORMAT.matcher(name); if (!matcher.matches()) { - LOGGER.warn("CSLReferenceMark: name={} does not match pattern. Assuming random values", name); - this.citationKey = CUID.randomCUID2(8).toString(); - this.citationNumber = 0; - this.uniqueId = this.citationKey; + LOGGER.warn("CSLReferenceMark: name={} does not match pattern. Unable to parse.", name); + this.citationKeys = new ArrayList<>(); + this.citationNumbers = new ArrayList<>(); + this.uniqueId = CUID.randomCUID2(8).toString(); return; } - this.citationKey = matcher.group(1); - this.citationNumber = Integer.parseInt(matcher.group(2)); - this.uniqueId = matcher.group(3); + String entriesString = matcher.group(1).trim(); + this.uniqueId = matcher.group(2) != null ? matcher.group(2).trim() : CUID.randomCUID2(8).toString(); - LOGGER.debug("CSLReferenceMark: citationKey={} citationNumber={} uniqueId={}", getCitationKey(), getCitationNumber(), getUniqueId()); - } + this.citationKeys = new ArrayList<>(); + this.citationNumbers = new ArrayList<>(); - public ReferenceMark(String name, String citationKey, Integer citationNumber, String uniqueId) { - this.name = name; - this.citationKey = citationKey; - this.citationNumber = citationNumber; - this.uniqueId = uniqueId; - } + Matcher entryMatcher = ENTRY_PATTERN.matcher(entriesString); + while (entryMatcher.find()) { + this.citationKeys.add(entryMatcher.group(1)); + this.citationNumbers.add(Integer.parseInt(entryMatcher.group(2))); + } - private ReferenceMark(String name, String citationKey, String citationNumber, String uniqueId) { - this(name, citationKey, Integer.parseInt(citationNumber), uniqueId); - } + if (this.citationKeys.isEmpty() || this.citationNumbers.isEmpty()) { + LOGGER.warn("CSLReferenceMark: Failed to parse any entries from name={}. Reference mark is empty.", name); + } - private static Matcher getMatcher(String name) { - return REFERENCE_MARK_FORMAT.matcher(name); + LOGGER.debug("CSLReferenceMark: citationKeys={} citationNumbers={} uniqueId={}", getCitationKeys(), getCitationNumbers(), getUniqueId()); } public String getName() { return name; } - /** - * The BibTeX citation key - */ - public String getCitationKey() { - return citationKey; + public List<String> getCitationKeys() { + return citationKeys; } - public int getCitationNumber() { - return citationNumber; + public List<Integer> getCitationNumbers() { + return citationNumbers; } public String getUniqueId() { @@ -79,11 +81,7 @@ public String getUniqueId() { } public static Optional<ReferenceMark> of(String name) { - Matcher matcher = getMatcher(name); - if (!matcher.matches()) { - return Optional.empty(); - } - - return Optional.of(new ReferenceMark(name, matcher.group(1), matcher.group(2), matcher.group(3))); + ReferenceMark mark = new ReferenceMark(name); + return mark.citationKeys.isEmpty() ? Optional.empty() : Optional.of(mark); } } diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java index 50636cbbb90..d3e326e05ef 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java @@ -129,11 +129,9 @@ public void insertInTextCitation(XTextCursor cursor, CitationStyle selectedStyle */ public void insertEmpty(XTextCursor cursor, List<BibEntry> entries) throws CreationException, Exception { - for (BibEntry entry : entries) { - CSLReferenceMark mark = markManager.createReferenceMark(entry); - OOText emptyOOText = OOFormat.setLocaleNone(OOText.fromString("")); - mark.insertReferenceIntoOO(document, cursor, emptyOOText, false, false); - } + CSLReferenceMark mark = markManager.createReferenceMark(entries); + OOText emptyOOText = OOFormat.setLocaleNone(OOText.fromString("")); + mark.insertReferenceIntoOO(document, cursor, emptyOOText, false, false); // Move the cursor to the end of the inserted text - although no need as we don't insert any text, but a good practice cursor.collapseToEnd(); @@ -212,18 +210,14 @@ private void insertMultipleReferenceMarks(XTextCursor cursor, List<BibEntry> ent } if (entries.size() == 1) { - CSLReferenceMark mark = markManager.createReferenceMark(entries.getFirst()); + CSLReferenceMark mark = markManager.createReferenceMark(entries); mark.insertReferenceIntoOO(document, cursor, ooText, !preceedingSpaceExists, false); } else { if (!preceedingSpaceExists) { cursor.getText().insertString(cursor, " ", false); } - OOTextIntoOO.write(document, cursor, ooText); - for (BibEntry entry : entries) { - CSLReferenceMark mark = markManager.createReferenceMark(entry); - OOText emptyOOText = OOFormat.setLocaleNone(OOText.fromString("")); - mark.insertReferenceIntoOO(document, cursor, emptyOOText, false, false); - } + CSLReferenceMark mark = markManager.createReferenceMark(entries); + mark.insertReferenceIntoOO(document, cursor, ooText, false, false); } // Move the cursor to the end of the inserted text diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java index b9a116b40cc..85df85be987 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMark.java @@ -1,5 +1,7 @@ package org.jabref.logic.openoffice.oocsltext; +import java.util.List; + import org.jabref.logic.openoffice.ReferenceMark; import org.jabref.model.openoffice.DocumentAnnotation; import org.jabref.model.openoffice.ootext.OOText; @@ -26,31 +28,44 @@ public class CSLReferenceMark { private ReferenceMark referenceMark; private XTextContent textContent; - private final String citationKey; - private int citationNumber; + private final List<String> citationKeys; + private List<Integer> citationNumbers; public CSLReferenceMark(XNamed named, ReferenceMark referenceMark) { this.referenceMark = referenceMark; this.textContent = UnoRuntime.queryInterface(XTextContent.class, named); - this.citationKey = referenceMark.getCitationKey(); - this.citationNumber = referenceMark.getCitationNumber(); + this.citationKeys = referenceMark.getCitationKeys(); + this.citationNumbers = referenceMark.getCitationNumbers(); } - public static CSLReferenceMark of(String citationKey, int citationNumber, XMultiServiceFactory factory) throws Exception { + public static CSLReferenceMark of(List<String> citationKeys, List<Integer> citationNumbers, XMultiServiceFactory factory) throws Exception { String uniqueId = CUID.randomCUID2(8).toString(); - String name = ReferenceMark.PREFIXES[0] + citationKey + " " + ReferenceMark.PREFIXES[1] + citationNumber + " " + uniqueId; + String name = buildReferenceName(citationKeys, citationNumbers, uniqueId); XNamed named = UnoRuntime.queryInterface(XNamed.class, factory.createInstance("com.sun.star.text.ReferenceMark")); named.setName(name); - ReferenceMark referenceMark = new ReferenceMark(name, citationKey, citationNumber, uniqueId); + ReferenceMark referenceMark = new ReferenceMark(name, citationKeys, citationNumbers, uniqueId); return new CSLReferenceMark(named, referenceMark); } - public String getCitationKey() { - return citationKey; + private static String buildReferenceName(List<String> citationKeys, List<Integer> citationNumbers, String uniqueId) { + StringBuilder nameBuilder = new StringBuilder(); + for (int i = 0; i < citationKeys.size(); i++) { + if (i > 0) { + nameBuilder.append(", "); + } + nameBuilder.append(ReferenceMark.PREFIXES[0]).append(citationKeys.get(i)) + .append(" ").append(ReferenceMark.PREFIXES[1]).append(citationNumbers.get(i)); + } + nameBuilder.append(" ").append(uniqueId); + return nameBuilder.toString(); + } + + public List<String> getCitationKeys() { + return citationKeys; } - public void setCitationNumber(int number) { - this.citationNumber = number; + public void setCitationNumbers(List<Integer> numbers) { + this.citationNumbers = numbers; } public XTextContent getTextContent() { @@ -116,6 +131,6 @@ public void updateTextContent(XTextContent newTextContent) { } public void updateName(String newName) { - this.referenceMark = new ReferenceMark(newName, this.citationKey, this.citationNumber, this.referenceMark.getUniqueId()); + this.referenceMark = new ReferenceMark(newName, this.citationKeys, this.citationNumbers, this.referenceMark.getUniqueId()); } } diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 9560519806c..496c6efe47f 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -6,6 +6,7 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import org.jabref.logic.openoffice.ReferenceMark; import org.jabref.model.entry.BibEntry; @@ -46,10 +47,16 @@ public CSLReferenceMarkManager(XTextDocument document) { this.textRangeCompare = UnoRuntime.queryInterface(XTextRangeCompare.class, document.getText()); } - public CSLReferenceMark createReferenceMark(BibEntry entry) throws Exception { - String citationKey = entry.getCitationKey().orElse(CUID.randomCUID2(8).toString()); - int citationNumber = getCitationNumber(citationKey); - CSLReferenceMark referenceMark = CSLReferenceMark.of(citationKey, citationNumber, factory); + public CSLReferenceMark createReferenceMark(List<BibEntry> entries) throws Exception { + List<String> citationKeys = entries.stream() + .map(entry -> entry.getCitationKey().orElse(CUID.randomCUID2(8).toString())) + .collect(Collectors.toList()); + + List<Integer> citationNumbers = citationKeys.stream() + .map(this::getCitationNumber) + .collect(Collectors.toList()); + + CSLReferenceMark referenceMark = CSLReferenceMark.of(citationKeys, citationNumbers, factory); marksByName.put(referenceMark.getName(), referenceMark); marksInOrder.add(referenceMark); updateAllCitationNumbers(); @@ -62,28 +69,56 @@ public void updateAllCitationNumbers() throws Exception { int currentNumber = 1; for (CSLReferenceMark mark : marksInOrder) { - String citationKey = mark.getCitationKey(); - int assignedNumber; - if (newCitationKeyToNumber.containsKey(citationKey)) { - assignedNumber = newCitationKeyToNumber.get(citationKey); - } else { - assignedNumber = currentNumber; - newCitationKeyToNumber.put(citationKey, assignedNumber); - currentNumber++; + List<String> citationKeys = mark.getCitationKeys(); + List<Integer> assignedNumbers = new ArrayList<>(); + + for (String citationKey : citationKeys) { + int assignedNumber; + if (newCitationKeyToNumber.containsKey(citationKey)) { + assignedNumber = newCitationKeyToNumber.get(citationKey); + } else { + assignedNumber = currentNumber; + newCitationKeyToNumber.put(citationKey, assignedNumber); + currentNumber++; + } + assignedNumbers.add(assignedNumber); } - mark.setCitationNumber(assignedNumber); - updateMarkText(mark, assignedNumber); + + mark.setCitationNumbers(assignedNumbers); + updateMarkText(mark, assignedNumbers); } citationKeyToNumber = newCitationKeyToNumber; } private void sortMarksInOrder() { - marksInOrder.sort((m1, m2) -> compareTextRanges(m2.getTextContent().getAnchor(), m1.getTextContent().getAnchor())); + List<CSLReferenceMark> validMarks = new ArrayList<>(); + for (CSLReferenceMark mark : marksInOrder) { + if (isValidMark(mark)) { + validMarks.add(mark); + } + } + + validMarks.sort((m1, m2) -> compareTextRanges(m2.getTextContent().getAnchor(), m1.getTextContent().getAnchor())); + + marksInOrder.clear(); + marksInOrder.addAll(validMarks); + } + + private boolean isValidMark(CSLReferenceMark mark) { + XTextContent content = mark.getTextContent(); + if (content == null) { + return false; + } + XTextRange range = content.getAnchor(); + return range != null && range.getText() != null; } private int compareTextRanges(XTextRange r1, XTextRange r2) { try { + if (r1 == null || r2 == null) { + throw new IllegalArgumentException("One of the text ranges is null"); + } return textRangeCompare.compareRegionStarts(r1, r2); } catch (IllegalArgumentException e) { LOGGER.warn("Error comparing text ranges: {}", e.getMessage()); @@ -91,7 +126,7 @@ private int compareTextRanges(XTextRange r1, XTextRange r2) { } } - private void updateMarkText(CSLReferenceMark mark, int newNumber) throws Exception { + private void updateMarkText(CSLReferenceMark mark, List<Integer> newNumbers) throws Exception { XTextContent oldContent = mark.getTextContent(); XTextRange range = oldContent.getAnchor(); @@ -104,8 +139,8 @@ private void updateMarkText(CSLReferenceMark mark, int newNumber) throws Excepti // Get the current text content String currentText = range.getString(); - // Update the citation number in the text - String updatedText = updateCitationText(currentText, newNumber); + // Update the citation numbers in the text + String updatedText = updateCitationText(currentText, newNumbers); // Remove the old reference mark without removing the text text.removeTextContent(oldContent); @@ -114,7 +149,7 @@ private void updateMarkText(CSLReferenceMark mark, int newNumber) throws Excepti cursor.setString(updatedText); // Create a new reference mark with updated name - String updatedName = updateReferenceName(mark.getName(), newNumber); + String updatedName = updateReferenceName(mark.getName(), newNumbers); XNamed newNamed = UnoRuntime.queryInterface(XNamed.class, factory.createInstance("com.sun.star.text.ReferenceMark")); newNamed.setName(updatedName); @@ -126,28 +161,42 @@ private void updateMarkText(CSLReferenceMark mark, int newNumber) throws Excepti // Update our internal reference to the new text content and name mark.updateTextContent(newContent); mark.updateName(updatedName); - mark.setCitationNumber(newNumber); + mark.setCitationNumbers(newNumbers); } } - private String updateReferenceName(String oldName, int newNumber) { + private String updateReferenceName(String oldName, List<Integer> newNumbers) { String[] parts = oldName.split(" "); - if (parts.length == 3) { - parts[1] = ReferenceMark.PREFIXES[1] + newNumber; - return String.join(" ", parts); + if (parts.length >= 3) { + StringBuilder newName = new StringBuilder(); + for (int i = 0; i < parts.length - 1; i += 2) { + if (i > 0) { + newName.append(", "); + } + newName.append(parts[i]).append(" "); + newName.append(ReferenceMark.PREFIXES[1]).append(newNumbers.get(i / 2)); + } + newName.append(" ").append(parts[parts.length - 1]); + return newName.toString(); } return oldName; } - private String updateCitationText(String currentText, int newNumber) { + private String updateCitationText(String currentText, List<Integer> newNumbers) { Pattern pattern = Pattern.compile("(\\D*)(\\d+)(\\D*)"); Matcher matcher = pattern.matcher(currentText); - if (matcher.find()) { - String prefix = matcher.group(1); - String suffix = matcher.group(3); - return prefix + newNumber + suffix; + StringBuilder result = new StringBuilder(); + int lastEnd = 0; + int numberIndex = 0; + + while (matcher.find()) { + result.append(currentText, lastEnd, matcher.start(2)); + result.append(newNumbers.get(numberIndex++)); + lastEnd = matcher.end(2); } - return currentText; + result.append(currentText.substring(lastEnd)); + + return result.toString(); } public int getCitationNumber(String citationKey) { @@ -166,21 +215,29 @@ public void readExistingMarks() throws WrappedTargetException, NoSuchElementExce if (name.startsWith(ReferenceMark.PREFIXES[0]) && name.contains(ReferenceMark.PREFIXES[1])) { XNamed named = UnoRuntime.queryInterface(XNamed.class, marks.getByName(name)); - String[] parts = name.split(" "); - if (parts.length == 3 && parts[0].startsWith(ReferenceMark.PREFIXES[0]) && parts[1].startsWith(ReferenceMark.PREFIXES[1])) { - String citationKey = parts[0].substring(ReferenceMark.CITATION_KEY_BEGIN_POSITION); - int citationNumber = Integer.parseInt(parts[1].substring(ReferenceMark.CITATION_ID_BEGIN_POSITION)); - String uniqueId = parts[2]; - CSLReferenceMark mark = new CSLReferenceMark(named, new ReferenceMark(name, citationKey, citationNumber, uniqueId)); + ReferenceMark referenceMark = new ReferenceMark(name); + List<String> citationKeys = referenceMark.getCitationKeys(); + List<Integer> citationNumbers = referenceMark.getCitationNumbers(); + + if (!citationKeys.isEmpty() && !citationNumbers.isEmpty()) { + CSLReferenceMark mark = new CSLReferenceMark(named, referenceMark); marksByName.put(name, mark); marksInOrder.add(mark); - highestCitationNumber = Math.max(highestCitationNumber, citationNumber); + + for (int i = 0; i < citationKeys.size(); i++) { + String key = citationKeys.get(i); + int number = citationNumbers.get(i); + citationKeyToNumber.put(key, number); + highestCitationNumber = Math.max(highestCitationNumber, number); + } } else { - LOGGER.warn("Cannot parse reference mark - invalid format: {}", name); + LOGGER.warn("Unable to parse - invalid format of reference mark: {}", name); } } } + LOGGER.debug("Read {} existing marks", marksByName.size()); + try { updateAllCitationNumbers(); } catch (Exception e) { diff --git a/src/test/java/org/jabref/logic/openoffice/ReferenceMarkTest.java b/src/test/java/org/jabref/logic/openoffice/ReferenceMarkTest.java index 7ac3f127dec..17d7381e1c0 100644 --- a/src/test/java/org/jabref/logic/openoffice/ReferenceMarkTest.java +++ b/src/test/java/org/jabref/logic/openoffice/ReferenceMarkTest.java @@ -17,8 +17,8 @@ class ReferenceMarkTest { void validParsing(String name, String expectedCitationKey, String expectedCitationNumber, String expectedUniqueId) { ReferenceMark referenceMark = new ReferenceMark(name); - assertEquals(expectedCitationKey, referenceMark.getCitationKey()); - assertEquals(expectedCitationNumber, String.valueOf(referenceMark.getCitationNumber())); + assertEquals(expectedCitationKey, referenceMark.getCitationKeys()); + assertEquals(expectedCitationNumber, String.valueOf(referenceMark.getCitationNumbers())); assertEquals(expectedUniqueId, referenceMark.getUniqueId()); } From 23255b7376d72fb78709c6662d85391cbe7c050b Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 06:47:29 +0530 Subject: [PATCH 32/49] Better log --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 496c6efe47f..806d3deddcb 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -231,7 +231,7 @@ public void readExistingMarks() throws WrappedTargetException, NoSuchElementExce highestCitationNumber = Math.max(highestCitationNumber, number); } } else { - LOGGER.warn("Unable to parse - invalid format of reference mark: {}", name); + LOGGER.warn("Cannot parse reference mark - invalid format: {}", name); } } } From 47031783c27822b4fc9c086ee9065385ed21a79e Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 06:49:54 +0530 Subject: [PATCH 33/49] Restore javadoc --- src/main/java/org/jabref/logic/openoffice/ReferenceMark.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java b/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java index 267759ea325..10ac82a4e2e 100644 --- a/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java +++ b/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java @@ -68,6 +68,9 @@ public String getName() { return name; } + /** + * The BibTeX citation keys + */ public List<String> getCitationKeys() { return citationKeys; } From e5b84abc94d894d373b26c0dbf48a4bae3b088ea Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 06:53:40 +0530 Subject: [PATCH 34/49] Restore javadoc --- src/main/java/org/jabref/logic/openoffice/ReferenceMark.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java b/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java index 10ac82a4e2e..91d0dcb942a 100644 --- a/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java +++ b/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java @@ -23,6 +23,9 @@ public class ReferenceMark { private List<Integer> citationNumbers; private String uniqueId; + /** + * @param name Format: <code>JABREF_{citationKey} CID_{citationNumber} {uniqueId}</code> + */ public ReferenceMark(String name) { this.name = name; parse(name); From b1505ae095b8e2ba10e3bd40af9872bad01c6dfb Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 07:02:12 +0530 Subject: [PATCH 35/49] Use list instead of singleton --- .../org/jabref/logic/openoffice/ReferenceMark.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java b/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java index 91d0dcb942a..a4f1bdae054 100644 --- a/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java +++ b/src/main/java/org/jabref/logic/openoffice/ReferenceMark.java @@ -41,10 +41,10 @@ public ReferenceMark(String name, List<String> citationKeys, List<Integer> citat private void parse(String name) { Matcher matcher = REFERENCE_MARK_FORMAT.matcher(name); if (!matcher.matches()) { - LOGGER.warn("CSLReferenceMark: name={} does not match pattern. Unable to parse.", name); - this.citationKeys = new ArrayList<>(); - this.citationNumbers = new ArrayList<>(); - this.uniqueId = CUID.randomCUID2(8).toString(); + LOGGER.warn("CSLReferenceMark: name={} does not match pattern. Assuming random values", name); + this.citationKeys = List.of(CUID.randomCUID2(8).toString()); + this.citationNumbers = List.of(0); + this.uniqueId = this.citationKeys.getFirst(); return; } @@ -61,7 +61,9 @@ private void parse(String name) { } if (this.citationKeys.isEmpty() || this.citationNumbers.isEmpty()) { - LOGGER.warn("CSLReferenceMark: Failed to parse any entries from name={}. Reference mark is empty.", name); + LOGGER.warn("CSLReferenceMark: Failed to parse any entries from name={}. Assuming random values", name); + this.citationKeys = List.of(CUID.randomCUID2(8).toString()); + this.citationNumbers = List.of(0); } LOGGER.debug("CSLReferenceMark: citationKeys={} citationNumbers={} uniqueId={}", getCitationKeys(), getCitationNumbers(), getUniqueId()); From d8b23e08d9b98de6a8363e5dbd8cc9ab41a421bb Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 07:13:10 +0530 Subject: [PATCH 36/49] Adapt test --- .../logic/openoffice/ReferenceMarkTest.java | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/jabref/logic/openoffice/ReferenceMarkTest.java b/src/test/java/org/jabref/logic/openoffice/ReferenceMarkTest.java index 17d7381e1c0..a23895b1f93 100644 --- a/src/test/java/org/jabref/logic/openoffice/ReferenceMarkTest.java +++ b/src/test/java/org/jabref/logic/openoffice/ReferenceMarkTest.java @@ -1,5 +1,6 @@ package org.jabref.logic.openoffice; +import java.util.List; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; @@ -14,19 +15,35 @@ class ReferenceMarkTest { @ParameterizedTest @MethodSource @DisplayName("Test parsing of valid reference marks") - void validParsing(String name, String expectedCitationKey, String expectedCitationNumber, String expectedUniqueId) { + void validParsing(String name, List<String> expectedCitationKeys, List<Integer> expectedCitationNumbers, String expectedUniqueId) { ReferenceMark referenceMark = new ReferenceMark(name); - assertEquals(expectedCitationKey, referenceMark.getCitationKeys()); - assertEquals(expectedCitationNumber, String.valueOf(referenceMark.getCitationNumbers())); + assertEquals(expectedCitationKeys, referenceMark.getCitationKeys()); + assertEquals(expectedCitationNumbers, referenceMark.getCitationNumbers()); assertEquals(expectedUniqueId, referenceMark.getUniqueId()); } private static Stream<Arguments> validParsing() { return Stream.of( - Arguments.of("JABREF_key1 CID_12345 uniqueId1", "key1", "12345", "uniqueId1"), - Arguments.of("JABREF_key2 CID_67890 uniqueId2", "key2", "67890", "uniqueId2"), - Arguments.of("JABREF_key3 CID_54321 uniqueId3", "key3", "54321", "uniqueId3") + // Single citation cases + Arguments.of( + "JABREF_key1 CID_12345 uniqueId1", + List.of("key1"), List.of(12345), "uniqueId1" + ), + Arguments.of( + "JABREF_key2 CID_67890 uniqueId2", + List.of("key2"), List.of(67890), "uniqueId2" + ), + + // Multiple citation cases + Arguments.of( + "JABREF_key3 CID_54321, JABREF_key4 CID_98765 uniqueId3", + List.of("key3", "key4"), List.of(54321, 98765), "uniqueId3" + ), + Arguments.of( + "JABREF_key5 CID_11111, JABREF_key6 CID_22222, JABREF_key7 CID_33333 uniqueId4", + List.of("key5", "key6", "key7"), List.of(11111, 22222, 33333), "uniqueId4" + ) ); } } From ec52189ca2043ab01fd8de045ea8ba618c44f4da Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 07:16:02 +0530 Subject: [PATCH 37/49] Add comment --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 806d3deddcb..cb32231032e 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -170,6 +170,7 @@ private String updateReferenceName(String oldName, List<Integer> newNumbers) { if (parts.length >= 3) { StringBuilder newName = new StringBuilder(); for (int i = 0; i < parts.length - 1; i += 2) { + // Each iteration of the loop (incrementing by 2) represents one full citation (key + number) if (i > 0) { newName.append(", "); } From f9df5a566be43cddd9d37a239e5687ac1aec1277 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 07:19:11 +0530 Subject: [PATCH 38/49] Add stricter conditions for update --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index cb32231032e..62ed37d1acb 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -167,7 +167,7 @@ private void updateMarkText(CSLReferenceMark mark, List<Integer> newNumbers) thr private String updateReferenceName(String oldName, List<Integer> newNumbers) { String[] parts = oldName.split(" "); - if (parts.length >= 3) { + if (oldName.startsWith("JABREF_") && oldName.contains("CID") && parts.length >= 3) { StringBuilder newName = new StringBuilder(); for (int i = 0; i < parts.length - 1; i += 2) { // Each iteration of the loop (incrementing by 2) represents one full citation (key + number) From c5e580f4a4984a50ae095487f929c0dc147b1a58 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 07:28:05 +0530 Subject: [PATCH 39/49] Add stricter conditions for reading --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 62ed37d1acb..ed286673291 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -213,7 +213,7 @@ public void readExistingMarks() throws WrappedTargetException, NoSuchElementExce XNameAccess marks = supplier.getReferenceMarks(); for (String name : marks.getElementNames()) { - if (name.startsWith(ReferenceMark.PREFIXES[0]) && name.contains(ReferenceMark.PREFIXES[1])) { + if (name.startsWith(ReferenceMark.PREFIXES[0]) && name.contains(ReferenceMark.PREFIXES[1]) && name.split(" ").length >= 3) { XNamed named = UnoRuntime.queryInterface(XNamed.class, marks.getByName(name)); ReferenceMark referenceMark = new ReferenceMark(name); From 06200fd174b9275c435f8295507c5cac15d82335 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 07:51:00 +0530 Subject: [PATCH 40/49] Make xtextcompare final --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index ed286673291..91d12e35219 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -38,7 +38,7 @@ public class CSLReferenceMarkManager { private final Map<String, CSLReferenceMark> marksByName = new HashMap<>(); private final List<CSLReferenceMark> marksInOrder = new ArrayList<>(); private Map<String, Integer> citationKeyToNumber = new HashMap<>(); - private XTextRangeCompare textRangeCompare; + private final XTextRangeCompare textRangeCompare; private int highestCitationNumber = 0; public CSLReferenceMarkManager(XTextDocument document) { From 1f18e4bf727d52fe7c283270161725d20ccb1378 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 08:02:59 +0530 Subject: [PATCH 41/49] Null handling --- .../oocsltext/CSLReferenceMarkManager.java | 26 ++----------------- 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 91d12e35219..53b7e80f79a 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -92,34 +92,12 @@ public void updateAllCitationNumbers() throws Exception { } private void sortMarksInOrder() { - List<CSLReferenceMark> validMarks = new ArrayList<>(); - for (CSLReferenceMark mark : marksInOrder) { - if (isValidMark(mark)) { - validMarks.add(mark); - } - } - - validMarks.sort((m1, m2) -> compareTextRanges(m2.getTextContent().getAnchor(), m1.getTextContent().getAnchor())); - - marksInOrder.clear(); - marksInOrder.addAll(validMarks); - } - - private boolean isValidMark(CSLReferenceMark mark) { - XTextContent content = mark.getTextContent(); - if (content == null) { - return false; - } - XTextRange range = content.getAnchor(); - return range != null && range.getText() != null; + marksInOrder.sort((m1, m2) -> compareTextRanges(m2.getTextContent().getAnchor(), m1.getTextContent().getAnchor())); } private int compareTextRanges(XTextRange r1, XTextRange r2) { try { - if (r1 == null || r2 == null) { - throw new IllegalArgumentException("One of the text ranges is null"); - } - return textRangeCompare.compareRegionStarts(r1, r2); + return r1 != null && r2 != null ? textRangeCompare.compareRegionStarts(r1, r2) : 0; } catch (IllegalArgumentException e) { LOGGER.warn("Error comparing text ranges: {}", e.getMessage()); return 0; From 46f7adb9b01ba60a666740eb38d27b89cc65d0b8 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 08:04:12 +0530 Subject: [PATCH 42/49] Update javadoc --- .../logic/openoffice/oocsltext/CSLCitationOOAdapter.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java index d3e326e05ef..51671ce03be 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java @@ -185,11 +185,6 @@ public void insertBibliography(XTextCursor cursor, CitationStyle selectedStyle, /** * Inserts multiple references and also adds a space before the citation if not already present ("smart space"). - * - * @implNote It is difficult to "segment" a single citation generated for a group of entries into distinct parts based on the entries such that each entry can be draped with its corresponding reference mark. - * This is because of the sheer variety in the styles of citations and the separators between them (when grouped) in case of Citation Style Language. - * Furthermore, it is also difficult to generate a "single" reference mark for a group of entries. - * Thus, in case of citations for a group of entries, we first insert the citation (text), then insert the invisible reference marks for each entry separately after it. */ private void insertMultipleReferenceMarks(XTextCursor cursor, List<BibEntry> entries, OOText ooText) throws CreationException, Exception { From ebd2630ad7e1e38289de84bb5f7b6edc5fdaa97b Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 08:14:27 +0530 Subject: [PATCH 43/49] Refactor --- .../gui/preview/CopyCitationAction.java | 2 +- .../logic/citationstyle/CSLAdapter.java | 2 +- .../citationstyle/CitationStyleGenerator.java | 18 ++++++------- .../CitationStylePreviewLayout.java | 2 +- .../oocsltext/CSLCitationOOAdapter.java | 16 ++++++------ .../openoffice/oocsltext/CSLFormatUtils.java | 6 ++--- .../CitationStyleGeneratorTest.java | 26 +++++++++---------- .../citationstyle/CitationStyleTest.java | 2 +- .../oocsltext/CSLFormatUtilsTest.java | 16 ++++++------ 9 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/main/java/org/jabref/gui/preview/CopyCitationAction.java b/src/main/java/org/jabref/gui/preview/CopyCitationAction.java index dd67b61d861..313782f5bba 100644 --- a/src/main/java/org/jabref/gui/preview/CopyCitationAction.java +++ b/src/main/java/org/jabref/gui/preview/CopyCitationAction.java @@ -88,7 +88,7 @@ private List<String> generateCitations() throws IOException { } if (styleSource != null) { - return CitationStyleGenerator.generateCitations( + return CitationStyleGenerator.generateBibliographies( selectedEntries, styleSource, outputFormat, diff --git a/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java b/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java index f32a8e52fa8..734690679bb 100644 --- a/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java +++ b/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java @@ -51,7 +51,7 @@ public synchronized List<String> makeBibliography(List<BibEntry> bibEntries, Str return Arrays.asList(bibliography.getEntries()); } - public synchronized Citation makeInText(List<BibEntry> bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) throws IOException { + public synchronized Citation makeCitation(List<BibEntry> bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) throws IOException { dataProvider.setData(bibEntries, databaseContext, entryTypesManager); initialize(style, outputFormat); cslInstance.registerCitationItems(dataProvider.getIds()); diff --git a/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java b/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java index 6e285e1d6d9..0a5a079c86e 100644 --- a/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java +++ b/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java @@ -31,8 +31,8 @@ private CitationStyleGenerator() { * * @implNote the citation is generated using JavaScript which may take some time, better call it from outside the main Thread */ - protected static String generateCitation(List<BibEntry> bibEntries, CitationStyle style, BibEntryTypesManager entryTypesManager) { - return generateCitation(bibEntries, style.getSource(), entryTypesManager); + protected static String generateBibliography(List<BibEntry> bibEntries, CitationStyle style, BibEntryTypesManager entryTypesManager) { + return generateBibliography(bibEntries, style.getSource(), entryTypesManager); } /** @@ -40,8 +40,8 @@ protected static String generateCitation(List<BibEntry> bibEntries, CitationStyl * * @implNote the citation is generated using JavaScript which may take some time, better call it from outside the main Thread */ - protected static String generateCitation(List<BibEntry> bibEntries, String style, BibEntryTypesManager entryTypesManager) { - return generateCitation(bibEntries, style, CitationStyleOutputFormat.HTML, new BibDatabaseContext(), entryTypesManager).getFirst(); + protected static String generateBibliography(List<BibEntry> bibEntries, String style, BibEntryTypesManager entryTypesManager) { + return generateBibliography(bibEntries, style, CitationStyleOutputFormat.HTML, new BibDatabaseContext(), entryTypesManager).getFirst(); } /** @@ -49,12 +49,12 @@ protected static String generateCitation(List<BibEntry> bibEntries, String style * * @implNote the citation is generated using JavaScript which may take some time, better call it from outside the main Thread */ - public static List<String> generateCitation(List<BibEntry> bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) { - return generateCitations(bibEntries, style, outputFormat, databaseContext, entryTypesManager); + public static List<String> generateBibliography(List<BibEntry> bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) { + return generateBibliographies(bibEntries, style, outputFormat, databaseContext, entryTypesManager); } - public static Citation generateInText(List<BibEntry> bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) throws IOException { - return CSL_ADAPTER.makeInText(bibEntries, style, outputFormat, databaseContext, entryTypesManager); + public static Citation generateCitation(List<BibEntry> bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) throws IOException { + return CSL_ADAPTER.makeCitation(bibEntries, style, outputFormat, databaseContext, entryTypesManager); } /** @@ -62,7 +62,7 @@ public static Citation generateInText(List<BibEntry> bibEntries, String style, C * * @implNote The citations are generated using JavaScript which may take some time, better call it from outside the main thread. */ - public static List<String> generateCitations(List<BibEntry> bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) { + public static List<String> generateBibliographies(List<BibEntry> bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) { try { return CSL_ADAPTER.makeBibliography(bibEntries, style, outputFormat, databaseContext, entryTypesManager); } catch (IllegalArgumentException e) { diff --git a/src/main/java/org/jabref/logic/citationstyle/CitationStylePreviewLayout.java b/src/main/java/org/jabref/logic/citationstyle/CitationStylePreviewLayout.java index 9a584765aaf..12feae5483e 100644 --- a/src/main/java/org/jabref/logic/citationstyle/CitationStylePreviewLayout.java +++ b/src/main/java/org/jabref/logic/citationstyle/CitationStylePreviewLayout.java @@ -18,7 +18,7 @@ public CitationStylePreviewLayout(CitationStyle citationStyle, BibEntryTypesMana @Override public String generatePreview(BibEntry entry, BibDatabaseContext databaseContext) { - return CitationStyleGenerator.generateCitation(List.of(entry), citationStyle.getSource(), CitationStyleOutputFormat.HTML, databaseContext, bibEntryTypesManager).getFirst(); + return CitationStyleGenerator.generateBibliography(List.of(entry), citationStyle.getSource(), CitationStyleOutputFormat.HTML, databaseContext, bibEntryTypesManager).getFirst(); } @Override diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java index 51671ce03be..a37ad301ed7 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java @@ -58,7 +58,7 @@ public void insertCitation(XTextCursor cursor, CitationStyle selectedStyle, List if (isAlphanumeric) { inTextCitation = CSLFormatUtils.generateAlphanumericCitation(entries, bibDatabaseContext); } else { - inTextCitation = CitationStyleGenerator.generateInText(entries, style, CSLFormatUtils.OUTPUT_FORMAT, bibDatabaseContext, bibEntryTypesManager).getText(); + inTextCitation = CitationStyleGenerator.generateCitation(entries, style, CSLFormatUtils.OUTPUT_FORMAT, bibDatabaseContext, bibEntryTypesManager).getText(); } String formattedCitation = CSLFormatUtils.transformHTML(inTextCitation); @@ -68,7 +68,7 @@ public void insertCitation(XTextCursor cursor, CitationStyle selectedStyle, List } OOText ooText = OOFormat.setLocaleNone(OOText.fromString(formattedCitation)); - insertMultipleReferenceMarks(cursor, entries, ooText); + insertReferences(cursor, entries, ooText); cursor.collapseToEnd(); } @@ -98,7 +98,7 @@ public void insertInTextCitation(XTextCursor cursor, CitationStyle selectedStyle // Combine author name with the citation inTextCitation = authorName + " " + inTextCitation; } else { - inTextCitation = CitationStyleGenerator.generateInText(List.of(currentEntry), style, CSLFormatUtils.OUTPUT_FORMAT, bibDatabaseContext, bibEntryTypesManager).getText(); + inTextCitation = CitationStyleGenerator.generateCitation(List.of(currentEntry), style, CSLFormatUtils.OUTPUT_FORMAT, bibDatabaseContext, bibEntryTypesManager).getText(); } String formattedCitation = CSLFormatUtils.transformHTML(inTextCitation); String finalText; @@ -118,7 +118,7 @@ public void insertInTextCitation(XTextCursor cursor, CitationStyle selectedStyle finalText += ","; } OOText ooText = OOFormat.setLocaleNone(OOText.fromString(finalText)); - insertMultipleReferenceMarks(cursor, List.of(currentEntry), ooText); + insertReferences(cursor, List.of(currentEntry), ooText); cursor.collapseToEnd(); } } @@ -156,7 +156,7 @@ public void insertBibliography(XTextCursor cursor, CitationStyle selectedStyle, entries.sort(Comparator.comparingInt(entry -> markManager.getCitationNumber(entry.getCitationKey().orElse("")))); for (BibEntry entry : entries) { - String citation = CitationStyleGenerator.generateCitation(List.of(entry), style, CSLFormatUtils.OUTPUT_FORMAT, bibDatabaseContext, bibEntryTypesManager).getFirst(); + String citation = CitationStyleGenerator.generateBibliography(List.of(entry), style, CSLFormatUtils.OUTPUT_FORMAT, bibDatabaseContext, bibEntryTypesManager).getFirst(); String citationKey = entry.getCitationKey().orElse(""); int currentNumber = markManager.getCitationNumber(citationKey); @@ -172,7 +172,7 @@ public void insertBibliography(XTextCursor cursor, CitationStyle selectedStyle, } } else { // Ordering will be according to citeproc item data provider (default) - List<String> citations = CitationStyleGenerator.generateCitation(entries, style, CSLFormatUtils.OUTPUT_FORMAT, bibDatabaseContext, bibEntryTypesManager); + List<String> citations = CitationStyleGenerator.generateBibliography(entries, style, CSLFormatUtils.OUTPUT_FORMAT, bibDatabaseContext, bibEntryTypesManager); for (String citation : citations) { String formattedCitation = CSLFormatUtils.transformHTML(citation); @@ -184,9 +184,9 @@ public void insertBibliography(XTextCursor cursor, CitationStyle selectedStyle, } /** - * Inserts multiple references and also adds a space before the citation if not already present ("smart space"). + * Inserts references and also adds a space before the citation if not already present ("smart space"). */ - private void insertMultipleReferenceMarks(XTextCursor cursor, List<BibEntry> entries, OOText ooText) + private void insertReferences(XTextCursor cursor, List<BibEntry> entries, OOText ooText) throws CreationException, Exception { boolean preceedingSpaceExists; XTextCursor checkCursor = cursor.getText().createTextCursorByRange(cursor.getStart()); diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtils.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtils.java index 0ae50cb4716..1ac64172287 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtils.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtils.java @@ -36,7 +36,7 @@ public class CSLFormatUtils { /** * Transforms provided HTML into a format that can be fully parsed and inserted into an OO document. - * Context: The HTML produced by {@link org.jabref.logic.citationstyle.CitationStyleGenerator#generateCitation(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateCitation} or {@link org.jabref.logic.citationstyle.CitationStyleGenerator#generateInText(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateInText} is not directly (completely) parsable by by {@link OOTextIntoOO#write(XTextDocument, XTextCursor, OOText) write}. + * Context: The HTML produced by {@link org.jabref.logic.citationstyle.CitationStyleGenerator#generateBibliography(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateBibliography} or {@link org.jabref.logic.citationstyle.CitationStyleGenerator#generateCitation(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateCitation} is not directly (completely) parsable by by {@link OOTextIntoOO#write(XTextDocument, XTextCursor, OOText) write}. * For more details, read the documentation for the {@link OOTextIntoOO} class. * <a href="https://devdocs.jabref.org/code-howtos/openoffice/code-reorganization.html">Additional Information</a>. * @@ -76,7 +76,7 @@ public static String transformHTML(String html) { } /** - * Alphanumeric citations are not natively supported by citeproc-java (see {@link org.jabref.logic.citationstyle.CitationStyleGenerator#generateInText(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateInText}). + * Alphanumeric citations are not natively supported by citeproc-java (see {@link org.jabref.logic.citationstyle.CitationStyleGenerator#generateCitation(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateCitation}). * Thus, we manually format a citation to produce its alphanumeric form. * * @param entries the list of entries for which the alphanumeric citation is to be generated. @@ -113,7 +113,7 @@ public static String generateAlphanumericCitation(List<BibEntry> entries, BibDat /** * Method to update citation number of a bibliographic entry (to be inserted in the list of references). - * By default, citeproc-java ({@link org.jabref.logic.citationstyle.CitationStyleGenerator#generateCitation(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateCitation} always start the numbering of a list of citations with "1". + * By default, citeproc-java ({@link org.jabref.logic.citationstyle.CitationStyleGenerator#generateBibliography(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateBibliography} always start the numbering of a list of citations with "1". * If a citation doesn't correspond to the first cited entry, the number should be changed to the relevant current citation number. * If an entries has been cited before, the colder number should be reused. * The number can be enclosed in different formats, such as "1", "1.", "1)", "(1)" or "[1]". diff --git a/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java b/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java index 3ee3a339fc0..d1a6891e874 100644 --- a/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java +++ b/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java @@ -34,7 +34,7 @@ class CitationStyleGeneratorTest { void aCMCitation() { context.setMode(BibDatabaseMode.BIBLATEX); CitationStyle style = styleList.stream().filter(e -> "ACM SIGGRAPH".equals(e.getTitle())).findAny().get(); - String citation = CitationStyleGenerator.generateCitation(List.of(testEntry), style.getSource(), CitationStyleOutputFormat.HTML, context, bibEntryTypesManager).getFirst(); + String citation = CitationStyleGenerator.generateBibliography(List.of(testEntry), style.getSource(), CitationStyleOutputFormat.HTML, context, bibEntryTypesManager).getFirst(); // if the acm-siggraph.csl citation style changes this has to be modified String expected = " <div class=\"csl-entry\">" @@ -49,7 +49,7 @@ void aCMCitation() { void aPACitation() { context.setMode(BibDatabaseMode.BIBLATEX); CitationStyle style = styleList.stream().filter(e -> "American Psychological Association 7th edition".equals(e.getTitle())).findAny().get(); - String citation = CitationStyleGenerator.generateCitation(List.of(testEntry), style.getSource(), CitationStyleOutputFormat.HTML, context, bibEntryTypesManager).getFirst(); + String citation = CitationStyleGenerator.generateBibliography(List.of(testEntry), style.getSource(), CitationStyleOutputFormat.HTML, context, bibEntryTypesManager).getFirst(); // if the apa-7th-citation.csl citation style changes this has to be modified String expected = " <div class=\"csl-entry\">" @@ -61,7 +61,7 @@ void aPACitation() { } /** - * Fails due to citeproc-java ({@link CitationStyleGenerator#generateInText(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateInText}) returning an empty citation. + * Fails due to citeproc-java ({@link CitationStyleGenerator#generateCitation(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateCitation}) returning an empty citation. * Alphanumeric citations are thus, currently manually generated by formatting (see {@link org.jabref.logic.openoffice.oocsltext.CSLFormatUtils#generateAlphanumericCitation(List, BibDatabaseContext) generateAlphaNumericCitation}). */ @Test @@ -69,7 +69,7 @@ void aPACitation() { void din1502AlphanumericInTextCitation() throws IOException { context.setMode(BibDatabaseMode.BIBLATEX); CitationStyle style = styleList.stream().filter(e -> "DIN 1505-2 (alphanumeric, Deutsch) - standard superseded by ISO-690".equals(e.getTitle())).findAny().get(); - Citation citation = CitationStyleGenerator.generateInText(List.of(testEntry), style.getSource(), CitationStyleOutputFormat.HTML, context, bibEntryTypesManager); + Citation citation = CitationStyleGenerator.generateCitation(List.of(testEntry), style.getSource(), CitationStyleOutputFormat.HTML, context, bibEntryTypesManager); String inTextCitationText = citation.getText(); assertEquals("[Smit2016]", inTextCitationText); @@ -84,7 +84,7 @@ void ignoreNewLine() { String expected = " <div class=\"csl-entry\">\n" + " <div class=\"csl-left-margin\">[1]</div><div class=\"csl-right-inline\">F. Last and J. Doe, </div>\n" + " </div>\n"; - String citation = CitationStyleGenerator.generateCitation(List.of(entry), CitationStyle.getDefault(), bibEntryTypesManager); + String citation = CitationStyleGenerator.generateBibliography(List.of(entry), CitationStyle.getDefault(), bibEntryTypesManager); assertEquals(expected, citation); } @@ -97,14 +97,14 @@ void ignoreCarriageReturnNewLine() { String expected = " <div class=\"csl-entry\">\n" + " <div class=\"csl-left-margin\">[1]</div><div class=\"csl-right-inline\">F. Last and J. Doe, </div>\n" + " </div>\n"; - String citation = CitationStyleGenerator.generateCitation(List.of(entry), CitationStyle.getDefault(), bibEntryTypesManager); + String citation = CitationStyleGenerator.generateBibliography(List.of(entry), CitationStyle.getDefault(), bibEntryTypesManager); assertEquals(expected, citation); } @Test void missingCitationStyle() { String expected = Localization.lang("Cannot generate preview based on selected citation style."); - String citation = CitationStyleGenerator.generateCitation(List.of(new BibEntry()), "faulty citation style", bibEntryTypesManager); + String citation = CitationStyleGenerator.generateBibliography(List.of(new BibEntry()), "faulty citation style", bibEntryTypesManager); assertEquals(expected, citation); } @@ -117,7 +117,7 @@ void htmlFormat() { String style = CitationStyle.getDefault().getSource(); CitationStyleOutputFormat format = CitationStyleOutputFormat.HTML; - String actualCitation = CitationStyleGenerator.generateCitation(List.of(testEntry), style, format, context, bibEntryTypesManager).getFirst(); + String actualCitation = CitationStyleGenerator.generateBibliography(List.of(testEntry), style, format, context, bibEntryTypesManager).getFirst(); assertEquals(expectedCitation, actualCitation); } @@ -128,7 +128,7 @@ void textFormat() { String style = CitationStyle.getDefault().getSource(); CitationStyleOutputFormat format = CitationStyleOutputFormat.TEXT; - String actualCitation = CitationStyleGenerator.generateCitation(List.of(testEntry), style, format, context, bibEntryTypesManager).getFirst(); + String actualCitation = CitationStyleGenerator.generateBibliography(List.of(testEntry), style, format, context, bibEntryTypesManager).getFirst(); assertEquals(expectedCitation, actualCitation); } @@ -142,7 +142,7 @@ void handleDiacritics() { String expected = " <div class=\"csl-entry\">\n" + " <div class=\"csl-left-margin\">[1]</div><div class=\"csl-right-inline\">F. Läst and J. Doe, </div>\n" + " </div>\n"; - String citation = CitationStyleGenerator.generateCitation(List.of(entry), CitationStyle.getDefault(), bibEntryTypesManager); + String citation = CitationStyleGenerator.generateBibliography(List.of(entry), CitationStyle.getDefault(), bibEntryTypesManager); assertEquals(expected, citation); } @@ -153,7 +153,7 @@ void handleAmpersand() { String style = CitationStyle.getDefault().getSource(); CitationStyleOutputFormat format = CitationStyleOutputFormat.TEXT; - String actualCitation = CitationStyleGenerator.generateCitation(List.of(testEntry), style, format, context, bibEntryTypesManager).getFirst(); + String actualCitation = CitationStyleGenerator.generateBibliography(List.of(testEntry), style, format, context, bibEntryTypesManager).getFirst(); assertEquals(expectedCitation, actualCitation); } @@ -178,7 +178,7 @@ void handleCrossRefFields() { BibDatabaseContext bibDatabaseContext = new BibDatabaseContext(new BibDatabase(List.of(firstEntry, secondEntry))); String style = CitationStyle.getDefault().getSource(); - String actualCitation = CitationStyleGenerator.generateCitation(List.of(firstEntry), style, CitationStyleOutputFormat.TEXT, bibDatabaseContext, bibEntryTypesManager).getFirst(); + String actualCitation = CitationStyleGenerator.generateBibliography(List.of(firstEntry), style, CitationStyleOutputFormat.TEXT, bibDatabaseContext, bibEntryTypesManager).getFirst(); assertEquals(expectedCitation, actualCitation); } @@ -591,7 +591,7 @@ static Stream<Arguments> cslMapping() { void cslMapping(String expected, BibDatabaseMode mode, BibEntry entry, String cslFileName) { context.setMode(mode); - String citation = CitationStyleGenerator.generateCitation( + String citation = CitationStyleGenerator.generateBibliography( List.of(entry), CitationStyle.createCitationStyleFromFile(cslFileName).orElseThrow().getSource(), CitationStyleOutputFormat.TEXT, diff --git a/src/test/java/org/jabref/logic/citationstyle/CitationStyleTest.java b/src/test/java/org/jabref/logic/citationstyle/CitationStyleTest.java index 8423e534659..d6ac7203d9b 100644 --- a/src/test/java/org/jabref/logic/citationstyle/CitationStyleTest.java +++ b/src/test/java/org/jabref/logic/citationstyle/CitationStyleTest.java @@ -30,7 +30,7 @@ void getDefault() { void defaultCitation() { BibDatabaseContext context = new BibDatabaseContext(new BibDatabase(List.of(TestEntry.getTestEntry()))); context.setMode(BibDatabaseMode.BIBLATEX); - String citation = CitationStyleGenerator.generateCitation(List.of(TestEntry.getTestEntry()), CitationStyle.getDefault().getSource(), CitationStyleOutputFormat.HTML, context, new BibEntryTypesManager()).getFirst(); + String citation = CitationStyleGenerator.generateBibliography(List.of(TestEntry.getTestEntry()), CitationStyle.getDefault().getSource(), CitationStyleOutputFormat.HTML, context, new BibEntryTypesManager()).getFirst(); // if the default citation style changes this has to be modified String expected = """ diff --git a/src/test/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtilsTest.java b/src/test/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtilsTest.java index ada5ac67c42..57e054027fa 100644 --- a/src/test/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtilsTest.java +++ b/src/test/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtilsTest.java @@ -143,13 +143,13 @@ static Stream<Arguments> ooHTMLTransformFromRawHTML() { /** * Test to check correct transformation of raw CSL bibliography generated by citeproc-java methods into OO-ready text. * <p> - * <b>Precondition:</b> This test assumes that {@link CitationStyleGenerator#generateCitation(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateCitation} works as expected. + * <b>Precondition:</b> This test assumes that {@link CitationStyleGenerator#generateBibliography(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateBibliography} works as expected. * </p> */ @ParameterizedTest @MethodSource void ooHTMLTransformFromRawBibliography(String expected, CitationStyle style) { - String citation = CitationStyleGenerator.generateCitation(List.of(testEntry), style.getSource(), CSLFormatUtils.OUTPUT_FORMAT, context, bibEntryTypesManager).getFirst(); + String citation = CitationStyleGenerator.generateBibliography(List.of(testEntry), style.getSource(), CSLFormatUtils.OUTPUT_FORMAT, context, bibEntryTypesManager).getFirst(); String actual = CSLFormatUtils.transformHTML(citation); assertEquals(expected, actual); } @@ -275,13 +275,13 @@ static Stream<Arguments> ooHTMLTransformFromRawBibliography() { /** * Test to check correct transformation of raw CSL citation with a single entry generated by citeproc-java methods into OO-ready text. * <p> - * <b>Precondition:</b> This test assumes that {@link CitationStyleGenerator#generateInText(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateInText} works as expected. + * <b>Precondition:</b> This test assumes that {@link CitationStyleGenerator#generateCitation(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateCitation} works as expected. * </p> */ @ParameterizedTest @MethodSource void ooHTMLTransformFromCitationWithSingleEntry(String expected, CitationStyle style) throws IOException { - Citation citation = CitationStyleGenerator.generateInText(List.of(testEntry), style.getSource(), CSLFormatUtils.OUTPUT_FORMAT, context, bibEntryTypesManager); + Citation citation = CitationStyleGenerator.generateCitation(List.of(testEntry), style.getSource(), CSLFormatUtils.OUTPUT_FORMAT, context, bibEntryTypesManager); String inTextCitationText = citation.getText(); String actual = CSLFormatUtils.transformHTML(inTextCitationText); OOText ooText = OOText.fromString(actual); @@ -377,7 +377,7 @@ static Stream<Arguments> ooHTMLTransformFromCitationWithSingleEntry() { /** * Test to check correct transformation of raw CSL citations with multiple entries generated by citeproc-java methods into OO-ready text. * <p> - * <b>Precondition:</b> This test assumes that {@link CitationStyleGenerator#generateInText(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateInText} works as expected. + * <b>Precondition:</b> This test assumes that {@link CitationStyleGenerator#generateCitation(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateCitation} works as expected. * </p> */ @ParameterizedTest @@ -408,7 +408,7 @@ void ooHTMLTransformFromCitationWithMultipleEntries(String expected, CitationSty List<BibEntry> entries = List.of(entry1, entry2); BibDatabaseContext context = new BibDatabaseContext(new BibDatabase(entries)); context.setMode(BibDatabaseMode.BIBLATEX); - Citation citation = CitationStyleGenerator.generateInText(entries, style.getSource(), CSLFormatUtils.OUTPUT_FORMAT, context, bibEntryTypesManager); + Citation citation = CitationStyleGenerator.generateCitation(entries, style.getSource(), CSLFormatUtils.OUTPUT_FORMAT, context, bibEntryTypesManager); String inTextCitationText = citation.getText(); String actual = CSLFormatUtils.transformHTML(inTextCitationText); assertEquals(expected, actual); @@ -503,14 +503,14 @@ static Stream<Arguments> ooHTMLTransformFromCitationWithMultipleEntries() { * The numeric index should change to the provided "current number". * The rest of the citation should stay as it is (other numbers in the body shouldn't be affected). * <p> - * <b>Precondition 1:</b> This test assumes that {@link CitationStyleGenerator#generateCitation(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateCitation} works as expected.<br> + * <b>Precondition 1:</b> This test assumes that {@link CitationStyleGenerator#generateBibliography(List, String, CitationStyleOutputFormat, BibDatabaseContext, BibEntryTypesManager) generateBibliography} works as expected.<br> * <b>Precondition 2:</b> This test assumes that the method {@link CSLFormatUtils#transformHTML(String) transformHTML} works as expected.<br> * <b>Precondition 3:</b> Run this test ONLY on numeric Citation Styles.</p> */ @ParameterizedTest @MethodSource void updateSingleNumericCitation(String expected, CitationStyle style) { - String citation = CitationStyleGenerator.generateCitation(List.of(testEntry), style.getSource(), CSLFormatUtils.OUTPUT_FORMAT, context, bibEntryTypesManager).getFirst(); + String citation = CitationStyleGenerator.generateBibliography(List.of(testEntry), style.getSource(), CSLFormatUtils.OUTPUT_FORMAT, context, bibEntryTypesManager).getFirst(); String transformedCitation = CSLFormatUtils.transformHTML(citation); String actual = CSLFormatUtils.updateSingleBibliographyNumber(transformedCitation, 3); assertEquals(expected, actual); From ffb7bfcc1f6bce64c71e21a221b7eaca8070f5bb Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 08:22:34 +0530 Subject: [PATCH 44/49] Remove redundant condition --- .../openoffice/oocsltext/CSLCitationOOAdapter.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java index a37ad301ed7..ebe76ff07e2 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java @@ -204,16 +204,8 @@ private void insertReferences(XTextCursor cursor, List<BibEntry> entries, OOText } } - if (entries.size() == 1) { - CSLReferenceMark mark = markManager.createReferenceMark(entries); - mark.insertReferenceIntoOO(document, cursor, ooText, !preceedingSpaceExists, false); - } else { - if (!preceedingSpaceExists) { - cursor.getText().insertString(cursor, " ", false); - } - CSLReferenceMark mark = markManager.createReferenceMark(entries); - mark.insertReferenceIntoOO(document, cursor, ooText, false, false); - } + CSLReferenceMark mark = markManager.createReferenceMark(entries); + mark.insertReferenceIntoOO(document, cursor, ooText, !preceedingSpaceExists, false); // Move the cursor to the end of the inserted text cursor.collapseToEnd(); From 6a0c54f8473c7cf638a71eff98340e0745519594 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 09:44:18 +0530 Subject: [PATCH 45/49] Fix non-numeric side effect --- .../org/jabref/gui/openoffice/OOBibBase.java | 4 +-- .../oocsltext/CSLCitationOOAdapter.java | 18 ++++++++++--- .../oocsltext/CSLReferenceMarkManager.java | 25 ++++++++++++------- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/jabref/gui/openoffice/OOBibBase.java b/src/main/java/org/jabref/gui/openoffice/OOBibBase.java index 96a073468f5..40a37a69d9f 100644 --- a/src/main/java/org/jabref/gui/openoffice/OOBibBase.java +++ b/src/main/java/org/jabref/gui/openoffice/OOBibBase.java @@ -88,7 +88,7 @@ public OOBibBase(Path loPath, DialogService dialogService) private void initializeCitationAdapter(XTextDocument doc) throws WrappedTargetException, NoSuchElementException { this.cslCitationOOAdapter = new CSLCitationOOAdapter(doc); - this.cslCitationOOAdapter.readExistingMarks(); + this.cslCitationOOAdapter.readAndUpdateExistingMarks(); } public void guiActionSelectDocument(boolean autoSelectForSingle) throws WrappedTargetException, NoSuchElementException { @@ -601,7 +601,7 @@ public void guiActionInsertEntry(List<BibEntry> entries, this.cslCitationOOAdapter.insertInTextCitation(cursor.get(), citationStyle, entries, bibDatabaseContext, bibEntryTypesManager); } else if (citationType == CitationType.INVISIBLE_CIT) { // "Insert empty citation" - this.cslCitationOOAdapter.insertEmpty(cursor.get(), entries); + this.cslCitationOOAdapter.insertEmpty(cursor.get(), citationStyle, entries); } // If "Automatically sync bibliography when inserting citations" is enabled diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java index ebe76ff07e2..821595fe192 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java @@ -41,8 +41,8 @@ public CSLCitationOOAdapter(XTextDocument doc) { this.markManager = new CSLReferenceMarkManager(doc); } - public void readExistingMarks() throws WrappedTargetException, NoSuchElementException { - markManager.readExistingMarks(); + public void readAndUpdateExistingMarks() throws WrappedTargetException, NoSuchElementException { + markManager.readAndUpdateExistingMarks(); } /** @@ -70,6 +70,10 @@ public void insertCitation(XTextCursor cursor, CitationStyle selectedStyle, List OOText ooText = OOFormat.setLocaleNone(OOText.fromString(formattedCitation)); insertReferences(cursor, entries, ooText); cursor.collapseToEnd(); + if (selectedStyle.isNumericStyle()) { + markManager.setUpdateRequired(true); + } + readAndUpdateExistingMarks(); } /** @@ -120,6 +124,10 @@ public void insertInTextCitation(XTextCursor cursor, CitationStyle selectedStyle OOText ooText = OOFormat.setLocaleNone(OOText.fromString(finalText)); insertReferences(cursor, List.of(currentEntry), ooText); cursor.collapseToEnd(); + if (selectedStyle.isNumericStyle()) { + markManager.setUpdateRequired(true); + } + readAndUpdateExistingMarks(); } } @@ -127,7 +135,7 @@ public void insertInTextCitation(XTextCursor cursor, CitationStyle selectedStyle * Inserts "empty" citations for a list of entries at the cursor to the document. * Adds the entries to the list for which bibliography is to be generated. */ - public void insertEmpty(XTextCursor cursor, List<BibEntry> entries) + public void insertEmpty(XTextCursor cursor, CitationStyle selectedStyle, List<BibEntry> entries) throws CreationException, Exception { CSLReferenceMark mark = markManager.createReferenceMark(entries); OOText emptyOOText = OOFormat.setLocaleNone(OOText.fromString("")); @@ -135,6 +143,10 @@ public void insertEmpty(XTextCursor cursor, List<BibEntry> entries) // Move the cursor to the end of the inserted text - although no need as we don't insert any text, but a good practice cursor.collapseToEnd(); + if (selectedStyle.isNumericStyle()) { + markManager.setUpdateRequired(true); + } + readAndUpdateExistingMarks(); } /** diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 53b7e80f79a..6b6286a4ff2 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -40,11 +40,13 @@ public class CSLReferenceMarkManager { private Map<String, Integer> citationKeyToNumber = new HashMap<>(); private final XTextRangeCompare textRangeCompare; private int highestCitationNumber = 0; + private boolean isUpdateRequired; public CSLReferenceMarkManager(XTextDocument document) { this.document = document; this.factory = UnoRuntime.queryInterface(XMultiServiceFactory.class, document); this.textRangeCompare = UnoRuntime.queryInterface(XTextRangeCompare.class, document.getText()); + this.isUpdateRequired = false; } public CSLReferenceMark createReferenceMark(List<BibEntry> entries) throws Exception { @@ -59,10 +61,13 @@ public CSLReferenceMark createReferenceMark(List<BibEntry> entries) throws Excep CSLReferenceMark referenceMark = CSLReferenceMark.of(citationKeys, citationNumbers, factory); marksByName.put(referenceMark.getName(), referenceMark); marksInOrder.add(referenceMark); - updateAllCitationNumbers(); return referenceMark; } + public void setUpdateRequired(boolean isNumeric) { + this.isUpdateRequired = isNumeric; + } + public void updateAllCitationNumbers() throws Exception { sortMarksInOrder(); Map<String, Integer> newCitationKeyToNumber = new HashMap<>(); @@ -85,7 +90,7 @@ public void updateAllCitationNumbers() throws Exception { } mark.setCitationNumbers(assignedNumbers); - updateMarkText(mark, assignedNumbers); + updateMarkAndText(mark, assignedNumbers); } citationKeyToNumber = newCitationKeyToNumber; @@ -104,7 +109,7 @@ private int compareTextRanges(XTextRange r1, XTextRange r2) { } } - private void updateMarkText(CSLReferenceMark mark, List<Integer> newNumbers) throws Exception { + private void updateMarkAndText(CSLReferenceMark mark, List<Integer> newNumbers) throws Exception { XTextContent oldContent = mark.getTextContent(); XTextRange range = oldContent.getAnchor(); @@ -120,7 +125,7 @@ private void updateMarkText(CSLReferenceMark mark, List<Integer> newNumbers) thr // Update the citation numbers in the text String updatedText = updateCitationText(currentText, newNumbers); - // Remove the old reference mark without removing the text + // Remove the old reference mark without removing the text (The only way to edit a reference mark is to remove it and add a new one) text.removeTextContent(oldContent); // Update the text @@ -182,7 +187,7 @@ public int getCitationNumber(String citationKey) { return citationKeyToNumber.computeIfAbsent(citationKey, k -> ++highestCitationNumber); } - public void readExistingMarks() throws WrappedTargetException, NoSuchElementException { + public void readAndUpdateExistingMarks() throws WrappedTargetException, NoSuchElementException { marksByName.clear(); marksInOrder.clear(); citationKeyToNumber.clear(); @@ -217,10 +222,12 @@ public void readExistingMarks() throws WrappedTargetException, NoSuchElementExce LOGGER.debug("Read {} existing marks", marksByName.size()); - try { - updateAllCitationNumbers(); - } catch (Exception e) { - LOGGER.warn("Error updating citation numbers", e); + if (isUpdateRequired) { + try { + updateAllCitationNumbers(); + } catch (Exception e) { + LOGGER.warn("Error updating citation numbers", e); + } } } From ef11cef62446dfb196b4b7a8dd4737d54caa1880 Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 10:04:13 +0530 Subject: [PATCH 46/49] Enhance implementation --- .../oocsltext/CSLCitationOOAdapter.java | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java index 821595fe192..d5c78cae867 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java @@ -68,12 +68,8 @@ public void insertCitation(XTextCursor cursor, CitationStyle selectedStyle, List } OOText ooText = OOFormat.setLocaleNone(OOText.fromString(formattedCitation)); - insertReferences(cursor, entries, ooText); + insertReferences(cursor, entries, ooText, selectedStyle.isNumericStyle()); cursor.collapseToEnd(); - if (selectedStyle.isNumericStyle()) { - markManager.setUpdateRequired(true); - } - readAndUpdateExistingMarks(); } /** @@ -122,12 +118,8 @@ public void insertInTextCitation(XTextCursor cursor, CitationStyle selectedStyle finalText += ","; } OOText ooText = OOFormat.setLocaleNone(OOText.fromString(finalText)); - insertReferences(cursor, List.of(currentEntry), ooText); + insertReferences(cursor, List.of(currentEntry), ooText, selectedStyle.isNumericStyle()); cursor.collapseToEnd(); - if (selectedStyle.isNumericStyle()) { - markManager.setUpdateRequired(true); - } - readAndUpdateExistingMarks(); } } @@ -137,16 +129,11 @@ public void insertInTextCitation(XTextCursor cursor, CitationStyle selectedStyle */ public void insertEmpty(XTextCursor cursor, CitationStyle selectedStyle, List<BibEntry> entries) throws CreationException, Exception { - CSLReferenceMark mark = markManager.createReferenceMark(entries); OOText emptyOOText = OOFormat.setLocaleNone(OOText.fromString("")); - mark.insertReferenceIntoOO(document, cursor, emptyOOText, false, false); + insertReferences(cursor, entries, emptyOOText, selectedStyle.isNumericStyle()); // Move the cursor to the end of the inserted text - although no need as we don't insert any text, but a good practice cursor.collapseToEnd(); - if (selectedStyle.isNumericStyle()) { - markManager.setUpdateRequired(true); - } - readAndUpdateExistingMarks(); } /** @@ -198,7 +185,7 @@ public void insertBibliography(XTextCursor cursor, CitationStyle selectedStyle, /** * Inserts references and also adds a space before the citation if not already present ("smart space"). */ - private void insertReferences(XTextCursor cursor, List<BibEntry> entries, OOText ooText) + private void insertReferences(XTextCursor cursor, List<BibEntry> entries, OOText ooText, boolean isNumericStyle) throws CreationException, Exception { boolean preceedingSpaceExists; XTextCursor checkCursor = cursor.getText().createTextCursorByRange(cursor.getStart()); @@ -221,6 +208,9 @@ private void insertReferences(XTextCursor cursor, List<BibEntry> entries, OOText // Move the cursor to the end of the inserted text cursor.collapseToEnd(); + markManager.setUpdateRequired(isNumericStyle); + readAndUpdateExistingMarks(); + cursor.collapseToEnd(); } /** From 39592bce446c1e3db4a6955cf825fc18227bec4a Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 10:05:09 +0530 Subject: [PATCH 47/49] Add newline --- .../jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java index d5c78cae867..9f932c9a341 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java @@ -208,6 +208,7 @@ private void insertReferences(XTextCursor cursor, List<BibEntry> entries, OOText // Move the cursor to the end of the inserted text cursor.collapseToEnd(); + markManager.setUpdateRequired(isNumericStyle); readAndUpdateExistingMarks(); cursor.collapseToEnd(); From 85cd4886e7346c23cb5ae3db11beb2a2f4f6c51c Mon Sep 17 00:00:00 2001 From: subhramit <subhramit.bb@live.in> Date: Sat, 7 Sep 2024 10:12:14 +0530 Subject: [PATCH 48/49] Bug fix: no sync in refresh bibliography --- .../logic/openoffice/oocsltext/CSLCitationOOAdapter.java | 4 +++- .../logic/openoffice/oocsltext/CSLUpdateBibliography.java | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java index 9f932c9a341..865806947f3 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java @@ -141,7 +141,9 @@ public void insertEmpty(XTextCursor cursor, CitationStyle selectedStyle, List<Bi * The list is generated based on the existing citations, in-text citations and empty citations in the document. */ public void insertBibliography(XTextCursor cursor, CitationStyle selectedStyle, List<BibEntry> entries, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager bibEntryTypesManager) - throws WrappedTargetException, CreationException { + throws WrappedTargetException, CreationException, NoSuchElementException { + markManager.setUpdateRequired(selectedStyle.isNumericStyle()); + readAndUpdateExistingMarks(); OOText title = OOFormat.paragraph(OOText.fromString(CSLFormatUtils.DEFAULT_BIBLIOGRAPHY_TITLE), CSLFormatUtils.DEFAULT_BIBLIOGRAPHY_HEADER_PARAGRAPH_FORMAT); OOTextIntoOO.write(document, cursor, OOText.fromString(title.toString())); diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLUpdateBibliography.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLUpdateBibliography.java index 21cb87b6cf6..107974934b4 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLUpdateBibliography.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLUpdateBibliography.java @@ -12,6 +12,7 @@ import org.jabref.model.openoffice.uno.NoDocumentException; import org.jabref.model.openoffice.uno.UnoTextSection; +import com.sun.star.container.NoSuchElementException; import com.sun.star.lang.WrappedTargetException; import com.sun.star.text.XTextCursor; import com.sun.star.text.XTextDocument; @@ -41,7 +42,7 @@ public void rebuildCSLBibliography(XTextDocument doc, CitationStyle citationStyle, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager bibEntryTypesManager) - throws WrappedTargetException, NoDocumentException, CreationException { + throws WrappedTargetException, NoDocumentException, CreationException, NoSuchElementException { LOGGER.debug("Starting to rebuild CSL bibliography"); // Ensure the bibliography section exists @@ -87,7 +88,7 @@ private void populateCSLBibTextSection(XTextDocument doc, CitationStyle citationStyle, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager bibEntryTypesManager) - throws WrappedTargetException, NoDocumentException, CreationException { + throws WrappedTargetException, NoDocumentException, CreationException, NoSuchElementException { LOGGER.debug("Populating CSL bibliography section"); Optional<XTextRange> sectionRange = getBibliographyRange(doc); From 9db142cd77d329aa0a14cc0a041ef35f88f97d36 Mon Sep 17 00:00:00 2001 From: Siedlerchr <siedlerkiller@gmail.com> Date: Sat, 7 Sep 2024 14:23:53 +0200 Subject: [PATCH 49/49] fix logger openrewrite --- .../logic/openoffice/oocsltext/CSLReferenceMarkManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 6b6286a4ff2..66ceb6d36ba 100644 --- a/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -104,7 +104,7 @@ private int compareTextRanges(XTextRange r1, XTextRange r2) { try { return r1 != null && r2 != null ? textRangeCompare.compareRegionStarts(r1, r2) : 0; } catch (IllegalArgumentException e) { - LOGGER.warn("Error comparing text ranges: {}", e.getMessage()); + LOGGER.warn("Error comparing text ranges: {}", e.getMessage(), e); return 0; } }