From ef9f25aa4d465c471a63bd2f1fd373591c02b809 Mon Sep 17 00:00:00 2001 From: Daria Ermakova Date: Mon, 19 Jan 2026 16:04:31 +0300 Subject: [PATCH] Fix bug 75486 --- MsBinaryFile/DocFile/DocumentMapping.cpp | 86 ++++++++++++++++++++---- MsBinaryFile/DocFile/DocumentMapping.h | 2 +- MsBinaryFile/DocFile/Plex.h | 6 +- 3 files changed, 78 insertions(+), 16 deletions(-) diff --git a/MsBinaryFile/DocFile/DocumentMapping.cpp b/MsBinaryFile/DocFile/DocumentMapping.cpp index d0f9dc6c61..8ea4aa5c8c 100644 --- a/MsBinaryFile/DocFile/DocumentMapping.cpp +++ b/MsBinaryFile/DocFile/DocumentMapping.cpp @@ -270,6 +270,7 @@ namespace DocFileFormat int cp = initialCp; int fc = m_document->FindFileCharPos(cp); int fcEnd = m_document->FindFileCharPos(cpEnd); + bool PBookmark = false; ParagraphPropertyExceptions* papx = findValidPapx(fc); @@ -406,13 +407,17 @@ namespace DocFileFormat { for (std::vector >::iterator iter = runs->begin(); iter != runs->end(); ++iter) { - if (writeBookmarks(cp)) + if (writeBookmarks(cp, PBookmark)) { cp = writeRun(&(*iter), chpxs->at(it), cp); } + PBookmark = true; + if (cp == m_document->FIB->m_RgLw97.ccpText - 1) + writeBookmarks(cp, PBookmark); } RELEASEOBJECT(runs); + PBookmark = false; } } else @@ -1971,22 +1976,77 @@ namespace DocFileFormat } return true; } - bool DocumentMapping::writeBookmarks(int cp) + bool DocumentMapping::writeBookmarks(int cp, bool para) { bool result = true; + static std::vector openedInThisPara; + static std::set allClosedIds; + static int nextIdForSequence = 0; - for (size_t b = 0; b < m_document->BookmarkStartEndCPs.size(); ++b) - { - if (m_document->BookmarkStartEndCPs[b].start == cp) - { - result = writeBookmarkStart(b); - } + for (size_t b = 0; b < m_document->BookmarkStartEndCPs.size(); ++b) + { + if (m_document->BookmarkStartEndCPs[b].start == cp) + { + int xmlId = b; - if (m_document->BookmarkStartEndCPs[b].end == cp) - { - result = writeBookmarkEnd(b); - } - } + result = writeBookmarkStart(xmlId); + openedInThisPara.push_back(xmlId); + } + } + + bool hasPositionClosings = false; + int positionClosingCount = 0; + + for (size_t b = 0; b < m_document->BookmarkStartEndCPs.size(); ++b) + { + if (m_document->BookmarkStartEndCPs[b].end == cp) + { + hasPositionClosings = true; + positionClosingCount++; + } + } + + if (hasPositionClosings) + { + + for (int i = 0; i < positionClosingCount; i++) + { + if (!openedInThisPara.empty()) + { + int idToClose = openedInThisPara[0]; + result = writeBookmarkEnd(idToClose); + allClosedIds.insert(idToClose); + openedInThisPara.erase(openedInThisPara.begin()); + } + else + { + while (allClosedIds.find(nextIdForSequence) != allClosedIds.end()) + { + nextIdForSequence++; + } + + result = writeBookmarkEnd(nextIdForSequence); + allClosedIds.insert(nextIdForSequence); + nextIdForSequence++; + } + } + } + else if (para) + { + while (allClosedIds.find(nextIdForSequence) != allClosedIds.end()) + { + nextIdForSequence++; + } + + result = writeBookmarkEnd(nextIdForSequence); + allClosedIds.insert(nextIdForSequence); + nextIdForSequence++; + } + + if (para) + { + openedInThisPara.clear(); + } return result; } diff --git a/MsBinaryFile/DocFile/DocumentMapping.h b/MsBinaryFile/DocFile/DocumentMapping.h index 6678542dca..dc019d9072 100644 --- a/MsBinaryFile/DocFile/DocumentMapping.h +++ b/MsBinaryFile/DocFile/DocumentMapping.h @@ -118,7 +118,7 @@ namespace DocFileFormat std::vector searchAnnotation(std::vector* chars, int initialCp); std::vector searchPermission(std::vector* chars, int initialCp); - bool writeBookmarks ( int cp ); + bool writeBookmarks ( int cp, bool para ); bool writeBookmarkStart ( short id ); bool writeBookmarkEnd ( short id ); diff --git a/MsBinaryFile/DocFile/Plex.h b/MsBinaryFile/DocFile/Plex.h index 14a305b32f..a022b12d73 100644 --- a/MsBinaryFile/DocFile/Plex.h +++ b/MsBinaryFile/DocFile/Plex.h @@ -74,9 +74,11 @@ namespace DocFileFormat { n = totalSize / elementSize; - if (totalSize % elementSize != 0) + if (totalSize % elementSize != 0 && structureLength == 6) { - n += 1; + structureLength = 4; + elementSize = structureLength + CP_LENGTH; + n = totalSize/elementSize; } } }