14.06.2023

This commit is contained in:
Plotnikov
2023-06-14 18:08:32 +03:00
parent b0a0566f19
commit bdf6eab9ec
221 changed files with 203557 additions and 585 deletions

View File

@@ -121,7 +121,7 @@ bool LyX::Import(S1000D_Manager* _SM, QString fileName, SplashForm* _splash) {
curChapterItem = curSectionItem = curSubsectionItem = -1;
tocItemNum = acrListItemNum = -1;
tableOfContentsRoot.childs.clear(); domTableOfContentsNode.clear(); domAcronymListNode.clear();
labelList.clear(); acronymList.clear(); refList.clear();
labelList.clear(); acronymList.clear();
cntTable = cntFigure = cntPar = 0;
tableTitle = ""; tableID = "";
flags.align = ""; flags.bold = false; flags.italic = false; flags.underlined = false;
@@ -176,20 +176,8 @@ bool LyX::readLyXFile(QString fileName) {
parseBlock(i+1, findTagEnd(i)-1, domRootNode); // поехали
//if(lyxLog.count() == 2) lyxLog.append("#Завершено без ошибок.");
if(lyxLog.count() == 2) lyxLog.append("#Завершено без ошибок."); //SM->item->
if(curSubsectionItem != -1) SM->items[curSubsectionItem].lyxLog = lyxLog;
//for(int i=0;i<SM->items.count();i++)
// qDebug() << i << SM->items[i].fileName << SM->items[i].doc.namedItem("dmodule").nodeName() << SM->items[i].doc.namedItem("dmodule").childNodes().count();
//qDebug() << "";
//SM->SaveProject();
connectRefsWithLabels();
for(int i=0;i<SM->items.count();i++)
if(SM->items[i].lyxLog.count() == 2) SM->items[i].lyxLog.append("#Завершено без ошибок.");
return true;
}
@@ -271,7 +259,7 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
appendChapter(title);
checkForOldIdent();
SM->item->importedFromLyX = curLyXFileName;
domCurLevelNode = SM->item->doc.namedItem("pm").namedItem("content");
domCurLevelNode.clear();
continue;
}
@@ -293,7 +281,7 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
appendSection(title);
checkForOldIdent();
SM->item->importedFromLyX = curLyXFileName;
domCurLevelNode = SM->item->doc.namedItem("pm").namedItem("content");
domCurLevelNode.clear();
continue;
}
@@ -313,13 +301,12 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
//if(DBG) qDebug() << " " + title;
//qDebug() << internalRefList.count();
/*
for(int j=0;j<internalRefList.count();j++) {
QString id = internalRefList[j];
lyxLog.append("![] Некорректная ссылка ("+id+")");
//SM->item->isQualifyed = false; ???
}
internalRefList.clear(); */
internalRefList.clear();
if(docChapter == -1) appendChapter("");
if(docSection == -1) appendSection("");
@@ -547,67 +534,26 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
}
if(itemName == "\\begin_layout Enumerate" || itemName == "\\begin_layout Itemize") { //
// QDomNode titleNodeClone;
// if(domCurLevelNode.hasChildNodes())
// if(domCurLevelNode.lastChild().nodeName() == "para") {
// titleNodeClone = domCurLevelNode.lastChild().cloneNode();
// domCurLevelNode.removeChild(domCurLevelNode.lastChild());
// titleNodeClone.toElement().setTagName("title");
// }
QDomNode lastPara;
QDomNode titleNodeClone;
if(domCurLevelNode.hasChildNodes())
if(domCurLevelNode.lastChild().nodeName() == "para")
lastPara = domCurLevelNode.lastChild();
if(domCurLevelNode.lastChild().nodeName() == "para") {
titleNodeClone = domCurLevelNode.lastChild().cloneNode();
domCurLevelNode.removeChild(domCurLevelNode.lastChild());
titleNodeClone.toElement().setTagName("title");
}
QDomNode listNode;
if(itemName == "\\begin_layout Enumerate") listNode = SM->item->doc.createElement("sequentialList");
if(itemName == "\\begin_layout Itemize") listNode = SM->item->doc.createElement("randomList");
domCurLevelNode.appendChild(listNode);
// QDomNode titleNode;
// if(titleNodeClone.isNull()) {
// //titleNode = SM->item->doc.createElement("title");
// //titleNode.appendChild(SM->item->doc.createTextNode(""));
// //listNode.appendChild(titleNode);
// }
// else {
// titleNode = SM->item->doc.importNode(titleNodeClone, true);
// listNode.appendChild(titleNode);
// }
if(!lastPara.isNull()) // вышестоящий абзац берем как заголовок, делаем из para -> title
{
QDomNode titleNode = SM->item->doc.createElement("title");
while(lastPara.hasChildNodes()) {
QDomNode ch = lastPara.removeChild(lastPara.firstChild());
titleNode.appendChild(ch);
}
QDomNode titleNode;
if(titleNodeClone.isNull()) {
//titleNode = SM->item->doc.createElement("title");
//titleNode.appendChild(SM->item->doc.createTextNode(""));
//listNode.appendChild(titleNode);
}
else {
titleNode = SM->item->doc.importNode(titleNodeClone, true);
listNode.appendChild(titleNode);
lastPara.parentNode().removeChild(lastPara);
QList<QDomNode> list;
QDomNode node;
list.append(titleNode);
while(!list.isEmpty()) { // обновляем refList и labelList для перемещенных узлов
node = list.takeFirst();
if(node.nodeName().startsWith("blankRefNode")) {
for(int n=0;refList.count();n++)
if(refList[n].nodeXPath.endsWith(node.nodeName())) {
refList[n].nodeXPath = SM->makeNodeXPath(node);
break;
}
}
QString nodeID = node.attributes().namedItem("id").nodeValue();
if(nodeID != "")
for(int n=0;labelList.count();n++)
if(labelList[n].id == nodeID) {
labelList[n].nodeXPath = SM->makeNodeXPath(node);
break;
}
for(int n=0;n<node.childNodes().count();n++)
list.append(node.childNodes().at(n));
}
}
int _childBeg, _childEnd=i;
@@ -815,11 +761,10 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
footnoteRef.toElement().setAttribute("internalRefId", acronymList[acroNum].id);
domCurLevelNode.appendChild(footnoteRef);
} else { // внутренняя ссылка
/*
int foundLabel = -1;
for(int j=0;j<labelList.count();j++)
if(refID == labelList[j].lyxLabel) { foundLabel = j; break; }
QDomNode internalRef = SM->item->doc.createElement("internalRef");
if(foundLabel == -1) {
if(internalRefList.indexOf(refID) == -1)
internalRefList.append(refID);
@@ -829,20 +774,19 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
//qDebug() << "internalRef foundLabel: "+refID+" -> "+labelList[foundLabel].id;
refID = labelList[foundLabel].id;
}
*/
QDomNode internalRef = SM->item->doc.createElement("blankRefNode"+QString::number(refList.count()));
internalRef.toElement().setAttribute("xlink:actuate", "onRequest");
internalRef.toElement().setAttribute("xlink:show", "replace");
internalRef.toElement().setAttribute("xlink:href", "#"+refID); //labelList[foundLabel].id
internalRef.toElement().setAttribute("internalRefId", refID); //labelList[foundLabel].id
QString refTarget = "irtt07";
if(refID.left(3) == "fig") refTarget = "irtt01";
if(refID.left(3) == "tab") refTarget = "irtt02";
if(refID.left(3) == "par") refTarget = "irtt07";
if(refID.left(3) == "mma") refTarget = "irtt03";
if(refID.left(3) == "fig" && refID.mid(9,3) == "hot") refTarget = "irtt11";
internalRef.toElement().setAttribute("internalRefTargetType", refTarget);
domCurLevelNode.appendChild(internalRef);
refStruct ref;
ref.itemInd = SM->itemIndex;
ref.labelFound = false;
ref.lineNum = _insetBeg+lyxEmptyCnt[_insetBeg];
ref.lyxRef = refID;
//internalRef = domCurLevelNode.childNodes().at(domCurLevelNode.childNodes().count()-1);
ref.nodeXPath = SM->makeNodeXPath(internalRef);
refList.append(ref);
}
continue;
// <objectUse>attribute internalRefTargetType - Тип объекта внутренней ссылки [BRDP-S1-00100] (Глава 3.9.6.1, таблица 25)</objectUse>
@@ -967,17 +911,14 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
}
} else {
labelStruct lbl;
lbl.itemInd = SM->itemIndex;
lbl.lyxLabel = lyxID;
lbl.id = figureID; lbl.used = false;
lbl.lineNum = _insetBeg+lyxEmptyCnt[_insetBeg];
lbl.id = figureID;
labelList.append(lbl); foundLabel = labelList.count()-1;
//qDebug() << "+fig: lyx="+lyxID+" id="+figureID+" internalRefList.count()="+QString::number(internalRefList.count());
}
labelList[foundLabel].defined = true;
/*
for(int j=0;j<internalRefList.count();j++) {
QString id = internalRefList[j];
if(id == lyxID) {
@@ -1019,7 +960,7 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
//qDebug() << " "+QString::number(j)+": "+id+" != "+lyxID;
}
}
*/
}
if(_graphicsBeg == -1 || _graphicsEnd == -1)
lyxLog.append("!["+QString::number(_insetBeg+lyxEmptyCnt[_insetBeg])+"] Ошибка вставки плавающего рисунка \""+figureTitle+"\"");
@@ -1040,7 +981,7 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
}
if(filename == "") {
lyxLog.append("!["+QString::number(_insetBeg+lyxEmptyCnt[_insetBeg])+"] Ошибка чтения LyX Graphics ("+figureTitle+")");
SM->item->isQualifyed = false; figureID = "";
SM->item->isQualifyed = false;
continue;
}
if(filename.startsWith("../")) filename = filename.mid(3);
@@ -1055,7 +996,7 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
}
if(oldfilename == "") {
lyxLog.append("!["+QString::number(_insetBeg+lyxEmptyCnt[_insetBeg])+"] Файл изображения не найден "+filename+" ("+figureTitle+")");
SM->item->isQualifyed = false; figureID = "";
SM->item->isQualifyed = false;
continue;
}
newfilename = SM->projectPath+"/"+ QString::number(docChapter+1) + "." + QString::number(docSection+1) + "." + QString::number(docSubsection+1) +
@@ -1081,12 +1022,6 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
figure.appendChild(graphic);
graphic.toElement().setAttribute("infoEntityIdent", QFileInfo(newfilename).fileName());
int labelInd = -1;
for(int j=0;j<labelList.count();j++)
if(figureID == labelList[j].id) {labelInd = j; break;}
if(labelInd != -1)
labelList[labelInd].nodeXPath = SM->makeNodeXPath(figure);
// если есть файл .txt с хотспотами - копируем его и файлы в нем указанные
QString txtoldfilename = oldfilename; txtoldfilename.replace(".svg", ".txt");
QString txtnewfilename = newfilename; txtnewfilename.replace(".svg", ".txt");
@@ -1183,7 +1118,7 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
}
if(insetName == "CommandInset label") {
lyxLog.append("!["+QString::number(_insetBeg+lyxEmptyCnt[_insetBeg])+"] Использование меток допускается только в сносках и плавающих таблицах/рисунках.");
lyxLog.append("!["+QString::number(_insetBeg+lyxEmptyCnt[_insetBeg])+"] Команда <метка> вне слоя, обратитесь к разработчику");
SM->item->isQualifyed = false;
continue;
}
@@ -1230,15 +1165,13 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
}
} else {
labelStruct lbl;
lbl.itemInd = SM->itemIndex;
lbl.lyxLabel = lyxID;
lbl.id = tableID; lbl.used = false;
lbl.lineNum = _insetBeg+lyxEmptyCnt[_insetBeg];
lbl.id = tableID; // в дальнейшем возможно пересмотреть и присваивать номера (tab-0001)
labelList.append(lbl); foundLabel = labelList.count()-1;
}
labelList[foundLabel].defined = true;
/*
for(int j=0;j<internalRefList.count();j++) {
QString id = internalRefList[j];
if(id == lyxID) {
@@ -1267,7 +1200,7 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
internalRefList.removeAt(j); j--;
}
}
*/
}
if(_tabularBeg == -1 || _tabularEnd == -1)
@@ -1306,8 +1239,7 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
QDomNode table = SM->item->doc.createElement("table");
domCurLevelNode.appendChild(table);
table.toElement().setAttribute("frame", "topbot");
if(tableID != "")
table.toElement().setAttribute("id", tableID);
if(tableID != "") table.toElement().setAttribute("id", tableID);
table.toElement().setAttribute("colsep", "0");
table.toElement().setAttribute("rowsep", "0");
table.toElement().setAttribute("tocentry", "1");
@@ -1327,12 +1259,6 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
tgroup.appendChild(colspec); //<colspec colname="col2" colwidth="1*"/>
}
int labelInd = -1;
for(int j=0;j<labelList.count();j++)
if(tableID == labelList[j].id) {labelInd = j; break;}
if(labelInd != -1)
labelList[labelInd].nodeXPath = SM->makeNodeXPath(table);
QList<QList<cellStruct>> tableArr;
// cellStruct** tableArr = new cellStruct*[rows];
@@ -1441,15 +1367,6 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
for(int j=0;j<rows;j++) {
QDomNode row = SM->item->doc.createElement("row");
//if(!multiRowFlag) rowToHead = false;
if(j <= lastHeadRow) { //j==0 || rowToHead
row.toElement().setAttribute("rowsep", "1");
thead.appendChild(row);
} else {
row.toElement().setAttribute("rowsep", "0");
tbody.appendChild(row);
}
//bool multiRowFlag = false;
for(int k=0;k<cols;k++) {
if (tableArr[j][k].createS1000D_entry) {
@@ -1466,6 +1383,15 @@ void LyX::parseBlock(int _beg, int _end, QDomNode _domCurLevelNode) {
} //cols
//if(tableArr[j][k].multiRow != "") multiRowFlag = true;
}
//if(!multiRowFlag) rowToHead = false;
if(j <= lastHeadRow) { //j==0 || rowToHead
row.toElement().setAttribute("rowsep", "1");
thead.appendChild(row);
} else {
row.toElement().setAttribute("rowsep", "0");
tbody.appendChild(row);
}
} //rows
// for(int j=0;j<rows;j++)
@@ -1634,11 +1560,12 @@ void LyX::appendChapter(QString title) {
// }
docChapter++; docSection = docSubsection = -1;
cntTable = cntFigure = cntPar = 0;
//if(lyxLog.count() == 2) lyxLog.append("#Завершено без ошибок.");
if(lyxLog.count() == 2) lyxLog.append("#Завершено без ошибок.");
if(curSubsectionItem != -1) SM->items[curSubsectionItem].lyxLog = lyxLog;
curChapterItem = SM->createPM(-1, -1);
SM->setCurItem(curChapterItem);
curSectionItem = curSubsectionItem = -1;
SM->item->origTitle = title;
SM->item->fileName = QString::number(docChapter+1) + " " + title + ".xml"; // SM->projectPath + "/" +
SM->setNodeText("identAndStatusSection.pmAddress.pmAddressItems.pmTitle", title);
@@ -1654,11 +1581,12 @@ void LyX::appendSection(QString title) {
// lyxLog.append("!Ошибка в структуре заголовков: "+title);
// }
docSection++; docSubsection = -1;
//if(lyxLog.count() == 2) lyxLog.append("#Завершено без ошибок.");
if(lyxLog.count() == 2) lyxLog.append("#Завершено без ошибок.");
if(curSubsectionItem != -1) SM->items[curSubsectionItem].lyxLog = lyxLog;
curSectionItem = SM->createPM(curChapterItem, SM->items[curChapterItem].child.count()-1);
SM->setCurItem(curSectionItem);
curSubsectionItem = -1;
SM->item->origTitle = title;
SM->item->fileName = QString::number(docChapter+1) + "." + QString::number(docSection+1) + " " + title + ".xml";
SM->setNodeText("identAndStatusSection.pmAddress.pmAddressItems.pmTitle", title);
@@ -1674,7 +1602,7 @@ void LyX::appendSubsection(QString title) {
// lyxLog.append("!Ошибка в структуре заголовков: "+title);
// }
docSubsection++;
//if(lyxLog.count() == 2) lyxLog.append("#Завершено без ошибок.");
if(lyxLog.count() == 2) lyxLog.append("#Завершено без ошибок.");
if(curSubsectionItem != -1) SM->items[curSubsectionItem].lyxLog = lyxLog;
//SM->item->fileName = QString::number(docChapter+1) + "." + QString::number(docSection+1) + "." + QString::number(docSubsection+1) + " " + title + ".xml";
if(title.startsWith("~")) {
@@ -1683,6 +1611,7 @@ void LyX::appendSubsection(QString title) {
} else
curSubsectionItem = SM->createDM(curSectionItem, SM->items[curSectionItem].child.count()-1, "DESCRIPT");
SM->setCurItem(curSubsectionItem);
SM->item->origTitle = title;
SM->item->fileName = QString::number(docChapter+1) + "." + QString::number(docSection+1) + "." + QString::number(docSubsection+1) + " " + title + ".xml";
SM->setNodeText("identAndStatusSection.dmAddress.dmAddressItems.dmTitle.techName", title);
@@ -1937,117 +1866,6 @@ void LyX::addQuestInteraction(QDomNode domLearnNode, QString question, QStringLi
}
}
void LyX::connectRefsWithLabels() {
int i, j;
for(i=0;i<refList.count();i++) {
refList[i].labelFound = false;
for(j=0;j<labelList.count();j++)
if(refList[i].lyxRef == labelList[j].lyxLabel)
break;
QDomNode refNode, labelNode;
if(j >= labelList.count()) {
SM->items[refList[i].itemInd].lyxLog.append("!["+QString::number(refList[i].lineNum)+"] Ссылка на неизвестную метку: "+refList[i].lyxRef);
qDebug() << "Ref to unknown label["+QString::number(refList[i].lineNum)+"]: "+refList[i].lyxRef;
}
else {
labelList[j].used = true; refList[i].labelFound = true;
SM->setCurItem(refList[i].itemInd);
QDomNode oldrefNode = SM->getNodeFromXPath(refList[i].nodeXPath);
if(oldrefNode.isNull()) {
qDebug() << "ref "+refList[i].lyxRef+" ignored - refNode.isNull():" << refList[i].nodeXPath << SM->items[refList[i].itemInd].fileName;
refNode = SM->getNodeFromXPath(refList[i].nodeXPath, true);
continue;
}
if(!oldrefNode.nodeName().startsWith("blankRefNode"))
qDebug() << "Rename "+oldrefNode.nodeName()+" to REF("+refList[i].nodeXPath+")";
if(refList[i].itemInd == labelList[j].itemInd) {
QString refID = labelList[j].id; // ссылка внутри модуля данных
refNode = SM->item->doc.createElement("internalRef");
oldrefNode.parentNode().replaceChild(refNode, oldrefNode);
refNode.toElement().setAttribute("xlink:actuate", "onRequest");
refNode.toElement().setAttribute("xlink:show", "replace");
refNode.toElement().setAttribute("xlink:href", "#"+refID);
refNode.toElement().setAttribute("internalRefId", refID);
QString refTarget = "irtt07";
if(refID.left(3) == "fig") refTarget = "irtt01";
if(refID.left(3) == "tab") refTarget = "irtt02";
if(refID.left(3) == "par") refTarget = "irtt07";
if(refID.left(3) == "mma") refTarget = "irtt03";
if(refID.left(3) == "fig" && refID.mid(9,3) == "hot") refTarget = "irtt11";
refNode.toElement().setAttribute("internalRefTargetType", refTarget);
//qDebug() << "Internal ref["+QString::number(refList[i].lineNum)+"]:" << labelList[j].id;
} else { // ссылка на внешний модуль
refNode = SM->item->doc.createElement("dmSegmentRef");
oldrefNode.parentNode().replaceChild(refNode, oldrefNode);
//QString tPath = "//"+labelList[j].nodeName+"[@id='"+labelList[j].id+"']"; //SM->makeXPathToNode(labelNode); // //title[@lang='en']
refNode.toElement().setAttribute("targetPath", labelList[j].nodeXPath);
SM->setCurItem(refList[i].itemInd);
QDomElement dmRefIdent = SM->item->doc.createElement("dmRefIdent");
refNode.appendChild(dmRefIdent);
QDomElement dmCode = SM->item->doc.createElement("dmCode");
dmRefIdent.appendChild(dmCode);
SM->setCurItem(labelList[j].itemInd);
QDomNode labelDMNode = SM->findElement("identAndStatusSection.dmAddress.dmIdent.dmCode");
SM->setCurItem(refList[i].itemInd);
for(int k=0;k<labelDMNode.toElement().attributes().count();k++)
dmCode.setAttribute(labelDMNode.toElement().attributes().item(k).nodeName(),
labelDMNode.toElement().attributes().item(k).nodeValue());
QDomElement issueInfo = SM->item->doc.createElement("issueInfo");
dmRefIdent.appendChild(issueInfo);
issueInfo.setAttribute("inWork", SM->ru_const.inWork);
issueInfo.setAttribute("issueNumber", SM->ru_const.issueNumber);
QDomElement language = SM->item->doc.createElement("language");
dmRefIdent.appendChild(language);
language.setAttribute("languageIsoCode", SM->ru_const.languageIsoCode);
language.setAttribute("countryIsoCode", SM->ru_const.countryIsoCode);
SM->setCurItem(labelList[j].itemInd);
QString techName = SM->findElement("identAndStatusSection.dmAddress.dmAddressItems.dmTitle.techName").childNodes().at(0).toText().data();
QString infoName = SM->findElement("identAndStatusSection.dmAddress.dmAddressItems.dmTitle.infoName").childNodes().at(0).toText().data();
SM->setCurItem(refList[i].itemInd);
QDomElement dmRefAddressItems = SM->item->doc.createElement("dmRefAddressItems");
refNode.appendChild(dmRefAddressItems);
QDomElement dmTitle = SM->item->doc.createElement("dmTitle");
dmRefAddressItems.appendChild(dmTitle);
QDomElement dmTechName = SM->item->doc.createElement("techName");
dmTitle.appendChild(dmTechName);
dmTechName.appendChild(SM->item->doc.createTextNode(techName));
QDomElement dmInfoName = SM->item->doc.createElement("infoName");
dmTitle.appendChild(dmInfoName);
dmInfoName.appendChild(SM->item->doc.createTextNode(infoName));
//qDebug() << "External ref["+QString::number(refList[i].lineNum)+"]:" << labelList[j].id << labelList[j].lyxLabel << labelList[j].itemInd << refList[i].itemInd;
}
}
}
for(j=0;j<labelList.count();j++)
if(!labelList[j].used) {
SM->items[labelList[j].itemInd].lyxLog.append("#["+QString::number(labelList[j].lineNum)+"] Неиспользуемая метка: "+labelList[j].lyxLabel);
//qDebug() << "Label not used ["+QString::number(labelList[j].lineNum)+"]: "+labelList[j].id;
}
}
//QString LyX::questLyXtoHTML(QString answer) {
// // функция пока не используется
// qDebug() << answer;