This commit is contained in:
Elena.Subbotina
2022-12-13 20:40:57 +03:00
parent 791c786bf7
commit 4cd3b71c07
9 changed files with 481 additions and 242 deletions

View File

@ -45,7 +45,7 @@ namespace DocFileFormat
{
DocumentMapping::DocumentMapping(ConversionContext* context, IMapping* caller) : _skipRuns(0), _lastValidPapx(NULL), _lastValidSepx(NULL),
AbstractOpenXmlMapping( new XMLTools::CStringXmlWriter() ), _sectionNr(0), _footnoteNr(0),
_endnoteNr(0), _commentNr(1), _caller(caller)
_endnoteNr(0), _commentNr(1), _caller(caller), _permissionNr(1)
{
m_document = NULL;
m_context = context;
@ -296,12 +296,10 @@ namespace DocFileFormat
fcChpxEnd = fcEnd;
}
//read the chars that are formatted via this CHPX
std::vector<wchar_t>* chpxChars = m_document->GetChars(fcChpxStart, fcChpxEnd, cp);
//search for bookmarks in the chars
std::vector<int> annot = searchAnnot(chpxChars, cp);
if (!annot.empty())
std::vector<int> annot = searchAnnotation(chpxChars, cp);
if (false == annot.empty())
{
std::list<std::vector<wchar_t>>* runs = splitCharList(chpxChars, &annot);
if (runs)
@ -319,11 +317,9 @@ namespace DocFileFormat
}
else
{
//search for bookmarks in the chars
std::vector<int> bookmarks = searchBookmarks(chpxChars, cp);
//if there are bookmarks in this run, split the run into several runs
if (!bookmarks.empty())
if (false == bookmarks.empty())
{
std::list<std::vector<wchar_t>>* runs = splitCharList(chpxChars, &bookmarks);
if (runs)
@ -341,7 +337,28 @@ namespace DocFileFormat
}
else
{
cp = writeRun(chpxChars, *cpeIter, cp);
std::vector<int> permissions = searchPermission(chpxChars, cp);
if (false == permissions.empty())
{
std::list<std::vector<wchar_t>>* runs = splitCharList(chpxChars, &permissions);
if (runs)
{
for (std::list<std::vector<wchar_t> >::iterator iter = runs->begin(); iter != runs->end(); ++iter)
{
if (writePermissions(cp))
{
cp = writeRun(&(*iter), *cpeIter, cp);
}
}
RELEASEOBJECT(runs);
}
}
else
{
cp = writeRun(chpxChars, *cpeIter, cp);
}
}
}
@ -1086,11 +1103,11 @@ namespace DocFileFormat
}
else
{
std::map<int, int>::iterator pFind = m_document->mapCommentsBookmarks.find(atrdPre10->m_BookmarkId);
if (pFind == m_document->mapCommentsBookmarks.end())
std::map<int, int>::iterator pFind = m_document->mapAnnotBookmarks.find(atrdPre10->m_BookmarkId);
if (pFind == m_document->mapAnnotBookmarks.end())
{
atrdPre10->m_CommentId = _commentNr++;
m_document->mapCommentsBookmarks.insert(std::make_pair(atrdPre10->m_BookmarkId, atrdPre10->m_CommentId));
m_document->mapAnnotBookmarks.insert(std::make_pair(atrdPre10->m_BookmarkId, atrdPre10->m_CommentId));
}
else
{
@ -1211,8 +1228,7 @@ namespace DocFileFormat
return ret;
}
// Searches for bookmarks in the list of characters.
std::vector<int> DocumentMapping::searchAnnot(std::vector<wchar_t>* chars, int initialCp)
std::vector<int> DocumentMapping::searchAnnotation(std::vector<wchar_t>* chars, int initialCp)
{
std::vector<int> ret;
@ -1235,7 +1251,27 @@ namespace DocFileFormat
return ret;
}
std::vector<int> DocumentMapping::searchPermission(std::vector<wchar_t>* chars, int initialCp)
{
std::vector<int> ret;
if (m_document->BookmarkProtStartPlex->IsValid())
{
int cp = initialCp;
size_t count = chars->size();
for (size_t i = 0; i < count; ++i)
{
if ((m_document->BookmarkProtStartPlex->IsCpExists(cp)) || (m_document->BookmarkProtEndPlex->IsCpExists(cp)))
{
ret.push_back(i);
}
++cp;
}
}
return ret;
}
ParagraphPropertyExceptions* DocumentMapping::findValidPapx(int fc)
{
ParagraphPropertyExceptions* ret = NULL;
@ -1841,16 +1877,15 @@ namespace DocFileFormat
bool DocumentMapping::writeBookmarks(int cp)
{
bool result = true;
int count = (int)m_document->BookmarkStartEndCPs.size();
for (int b = 0; b < count; ++b)
for (size_t b = 0; b < m_document->BookmarkStartEndCPs.size(); ++b)
{
if (m_document->BookmarkStartEndCPs[b].first == cp)
if (m_document->BookmarkStartEndCPs[b].start == cp)
{
result = writeBookmarkStart(b);
}
if (m_document->BookmarkStartEndCPs[b].second == cp)
if (m_document->BookmarkStartEndCPs[b].end == cp)
{
result = writeBookmarkEnd(b);
}
@ -1867,11 +1902,11 @@ namespace DocFileFormat
if (m_document->AnnotStartEndCPs[i].start == cp)
{
int index = -1;
std::map<int, int>::iterator pFind = m_document->mapCommentsBookmarks.find(m_document->AnnotStartEndCPs[i].bookmarkId);
if (pFind == m_document->mapCommentsBookmarks.end())
std::map<int, int>::iterator pFind = m_document->mapAnnotBookmarks.find(m_document->AnnotStartEndCPs[i].bookmarkId);
if (pFind == m_document->mapAnnotBookmarks.end())
{
index = _commentNr++;
m_document->mapCommentsBookmarks.insert(std::make_pair(m_document->AnnotStartEndCPs[i].bookmarkId, index ));
m_document->mapAnnotBookmarks.insert(std::make_pair(m_document->AnnotStartEndCPs[i].bookmarkId, index ));
}
else index = pFind->second;
@ -1881,11 +1916,11 @@ namespace DocFileFormat
if (m_document->AnnotStartEndCPs[i].end == cp)
{
int index = -1;
std::map<int, int>::iterator pFind = m_document->mapCommentsBookmarks.find(m_document->AnnotStartEndCPs[i].bookmarkId);
if (pFind == m_document->mapCommentsBookmarks.end())
std::map<int, int>::iterator pFind = m_document->mapAnnotBookmarks.find(m_document->AnnotStartEndCPs[i].bookmarkId);
if (pFind == m_document->mapAnnotBookmarks.end())
{
index = _commentNr++;
m_document->mapCommentsBookmarks.insert(std::make_pair(m_document->AnnotStartEndCPs[i].bookmarkId, index ));
m_document->mapAnnotBookmarks.insert(std::make_pair(m_document->AnnotStartEndCPs[i].bookmarkId, index ));
}
else index = pFind->second;
@ -1895,10 +1930,45 @@ namespace DocFileFormat
return result;
}
bool DocumentMapping::writePermissions(int cp)
{
bool result = true;
for (size_t i = 0; i < m_document->BookmarkProtStartEndCPs.size(); i++)
{
if (m_document->BookmarkProtStartEndCPs[i].start == cp)
{
int index = -1;
std::map<int, int>::iterator pFind = m_document->mapProtBookmarks.find(m_document->BookmarkProtStartEndCPs[i].bookmarkId);
if (pFind == m_document->mapProtBookmarks.end())
{
index = _permissionNr++;
m_document->mapProtBookmarks.insert(std::make_pair(m_document->BookmarkProtStartEndCPs[i].bookmarkId, index));
}
else index = pFind->second;
result = writePermissionStart(index, i);
}
if (m_document->BookmarkProtStartEndCPs[i].end == cp)
{
int index = -1;
std::map<int, int>::iterator pFind = m_document->mapProtBookmarks.find(m_document->BookmarkProtStartEndCPs[i].bookmarkId);
if (pFind == m_document->mapProtBookmarks.end())
{
index = _permissionNr++;
m_document->mapProtBookmarks.insert(std::make_pair(m_document->BookmarkProtStartEndCPs[i].bookmarkId, index));
}
else index = pFind->second;
result = writePermissionEnd(index);
}
}
return result;
}
bool DocumentMapping::writeBookmarkStart(short id)
{
// write bookmark start
WideString* bookmarkName = static_cast<WideString*>(m_document->BookmarkNames->operator [](id));
if ((bookmarkName != NULL) && (*bookmarkName != L"_PictureBullets"))
@ -1912,7 +1982,6 @@ namespace DocFileFormat
return true;
}
return false;
}
@ -1936,25 +2005,64 @@ namespace DocFileFormat
bool DocumentMapping::writeAnnotationStart(short id)
{
XMLTools::XMLElement bookmarkElem(L"w:commentRangeStart");
bookmarkElem.AppendAttribute(L"w:id", FormatUtils::IntToWideString(id));
m_pXmlWriter->WriteString(bookmarkElem.GetXMLString());
return true;
}
bool DocumentMapping::writeAnnotationEnd(short id)
{
XMLTools::XMLElement bookmarkElem( L"w:commentRangeEnd" );
bookmarkElem.AppendAttribute( L"w:id", FormatUtils::IntToWideString( id ));
m_pXmlWriter->WriteString( bookmarkElem.GetXMLString());
XMLTools::XMLElement bookmarkElem(L"w:commentRangeEnd");
bookmarkElem.AppendAttribute(L"w:id", FormatUtils::IntToWideString(id));
m_pXmlWriter->WriteString(bookmarkElem.GetXMLString());
return true;
}
bool DocumentMapping::writePermissionStart(short id, size_t index)
{
XMLTools::XMLElement bookmarkElem(L"w:permStart");
bookmarkElem.AppendAttribute(L"w:id", FormatUtils::IntToWideString(id));
ProtInfoBookmark *prot = static_cast<ProtInfoBookmark*>(m_document->BkmkProt->operator[](index));
BookmarkFirst *prot_base = static_cast<BookmarkFirst*>(m_document->BookmarkProtStartPlex->GetStruct(index));
if (prot_base && prot_base->fCol)
{
bookmarkElem.AppendAttribute(L"w:colFirst", FormatUtils::IntToWideString(prot_base->itcFirst));
bookmarkElem.AppendAttribute(L"w:colLast", FormatUtils::IntToWideString(prot_base->itcLim - 1));
}
if (prot && (prot->uidSel == 0 || prot->uidSel > 0xfff0))
{
switch (prot->uidSel)
{
case 0xFFFF: bookmarkElem.AppendAttribute(L"w:edGrp", L"everyone");
case 0xFFFE: bookmarkElem.AppendAttribute(L"w:edGrp", L"administrators");
case 0xFFFD: bookmarkElem.AppendAttribute(L"w:edGrp", L"contributors");
case 0xFFFC: bookmarkElem.AppendAttribute(L"w:edGrp", L"owners");
case 0xFFFB: bookmarkElem.AppendAttribute(L"w:edGrp", L"editors");
case 0xFFFA: bookmarkElem.AppendAttribute(L"w:edGrp", L"current");
case 0x0000: bookmarkElem.AppendAttribute(L"w:edGrp", L"none");
}
}
if (prot && (prot->uidSel > 0 && prot->uidSel < 0xfff0))
{
WideString* user = static_cast<WideString*>(m_document->BkmkProtUser->operator[](prot->uidSel - 1));
if (user && false == user->empty())
bookmarkElem.AppendAttribute(L"w:ed", *user);
}
m_pXmlWriter->WriteString(bookmarkElem.GetXMLString());
return true;
}
bool DocumentMapping::writePermissionEnd(short id)
{
XMLTools::XMLElement bookmarkElem(L"w:permEnd");
bookmarkElem.AppendAttribute(L"w:id", FormatUtils::IntToWideString(id));
m_pXmlWriter->WriteString(bookmarkElem.GetXMLString());
return true;
}
// Checks if the CHPX is special
bool DocumentMapping::isSpecial(CharacterPropertyExceptions* chpx)
{
if (!chpx) return false;