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&auml;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;
         }
     }