@@ -546,16 +546,16 @@ std::string WsjcppYamlNode::toString(std::string sIntent) {
546546 std::string sVal = pNode->toString ();
547547 sVal = WsjcppCore::trim (sVal );
548548 if (sVal .length () > 0 ) { // empty string have content
549- sRet += sIntent + pNode->getStringNodeDiffIntent ();
549+ sRet += sIntent + pNode->getStringNodeLastIntent ();
550550 }
551551 sRet += sVal ;
552552 } else if (pNode->isMap ()) {
553- sRet += sIntent + pNode->getStringNodeDiffIntent ();
554- std::string s = pNode->toString (sIntent + m_sNodeDiffIntent );
553+ sRet += sIntent + pNode->getStringNodeLastIntent ();
554+ std::string s = pNode->toString (sIntent + pNode-> getStringNodeLastIntent () );
555555 WsjcppCore::trim (s);
556556 sRet += " - " + s;
557557 } else {
558- sRet += sIntent + pNode->getStringNodeDiffIntent ();
558+ sRet += sIntent + pNode->getStringNodeLastIntent ();
559559 sRet += " - " + pNode->toString ();
560560 }
561561 sRet += " \n " ;
@@ -568,34 +568,38 @@ std::string WsjcppYamlNode::toString(std::string sIntent) {
568568 sRet += pNode->toString (sIntent );
569569 sRet += " \n " ;
570570 } else if (pNode->isUndefined ()) {
571- sRet += sIntent + pNode->getStringNodeDiffIntent ()
571+ sRet += sIntent + pNode->getStringNodeLastIntent ()
572572 + pNode->getSerializedName () + " :\n " + pNode->toString ();
573573 } else if (pNode->isArray () || pNode->isMap ()) {
574- sRet += sIntent + pNode->getStringNodeDiffIntent ()
574+ sRet += sIntent + pNode->getStringNodeLastIntent ()
575575 + pNode->getSerializedName () + " :" ;
576576 if (pNode->getComment ().length () > 0 ) {
577577 sRet += " # " + pNode->getComment ();
578578 }
579579 sRet += " \n " ;
580- sRet += pNode->toString (sIntent + pNode->getStringNodeDiffIntent ());
580+ sRet += pNode->toString (sIntent + pNode->getStringNodeLastIntent ());
581581 } else {
582582 std::string sVal = pNode->toString ();
583583 std::string sVal_ = sVal ;
584584 sVal_ = WsjcppCore::trim (sVal_ );
585585 if (sVal_ .length () > 0 ) {
586586 sVal = " " + sVal ;
587587 }
588- sRet += sIntent + pNode->getStringNodeDiffIntent ()
588+ sRet += sIntent + pNode->getStringNodeLastIntent ()
589589 + pNode->getSerializedName () + " :" + sVal ;
590590 sRet += " \n " ;
591591 }
592592 }
593593 } else {
594594 sRet = " " ; // undefined element must be empty
595595 }
596- /* if (sIntent == "") {
597- WsjcppCore::trim(sRet);
598- }*/
596+
597+ if (m_pParent == nullptr ) {
598+ int nLen = sRet .length ();
599+ if (nLen > 0 && sRet [nLen - 1 ] == ' \n ' ) {
600+ sRet = sRet .substr (0 , nLen - 1 );
601+ }
602+ }
599603 return sRet ;
600604}
601605
@@ -622,24 +626,34 @@ std::string WsjcppYamlNode::getForLogFormat() {
622626
623627// ---------------------------------------------------------------------
624628
625- void WsjcppYamlNode::setNodeDiffIntent (int nNodeDiffIntent) {
626- m_nNodeDiffIntent = nNodeDiffIntent;
627- m_sNodeDiffIntent = " " ;
628- for (int i = 0 ; i < m_nNodeDiffIntent; i++) {
629- m_sNodeDiffIntent += " " ;
630- }
629+ int WsjcppYamlNode::getNodeLastIntent () {
630+ return m_nNodeDiffIntent;
631631}
632632
633633// ---------------------------------------------------------------------
634634
635- int WsjcppYamlNode::getNodeDiffIntent () {
636- return m_nNodeDiffIntent ;
635+ std::string WsjcppYamlNode::getStringNodeLastIntent () {
636+ return m_sNodeDiffIntent ;
637637}
638638
639639// ---------------------------------------------------------------------
640640
641- std::string WsjcppYamlNode::getStringNodeDiffIntent () {
642- return m_sNodeDiffIntent;
641+ void WsjcppYamlNode::setNodeIntents (const std::vector<int > & vNodeIntents) {
642+ m_nNodeDiffIntent = vNodeIntents.back ();
643+ m_sNodeDiffIntent = " " ;
644+ for (int i = 0 ; i < m_nNodeDiffIntent; i++) {
645+ m_sNodeDiffIntent += " " ;
646+ }
647+ m_nNodeIntent = 0 ;
648+ for (int i = 0 ; i < vNodeIntents.size (); i++) {
649+ m_nNodeIntent += vNodeIntents[i];
650+ }
651+ }
652+
653+ // ---------------------------------------------------------------------
654+
655+ int WsjcppYamlNode::getNodeIntent () {
656+ return m_nNodeIntent;
643657}
644658
645659// ---------------------------------------------------------------------
@@ -1317,26 +1331,23 @@ bool WsjcppYaml::parse(const std::string &sFileName, const std::string &sBuffer,
13171331 if (nDiffIntent > 0 ) {
13181332 m_vStackDiffNodeIntents.push_back (nDiffIntent);
13191333 m_nParseCurrentIntent = m_parseLine.getIntent ();
1320- // std::cout << "add new DiffNodeIntents " << nDiffIntent << std::endl;
13211334 }
13221335
1323- // std::cout << nLine << ": " << m_nParseCurrentIntent << ", " << nLineIntent << " ; line:[" << m_parsePlaceInFile.getLine() << "]" << std::endl;
1324-
13251336 if (m_parseLine.isEmptyLine ()) {
13261337 if (m_pParseCurrentParentNode != nullptr ) {
13271338 if (m_pParseCurrentParentNode->isArray () || m_pParseCurrentParentNode->isMap () || m_pParseCurrentParentNode->isUndefined ()) {
13281339 WsjcppYamlNode *pNode = new WsjcppYamlNode (
13291340 m_pParseCurrentParentNode, m_parsePlaceInFile,
13301341 WSJCPP_YAML_NODE_EMPTY
13311342 );
1332- pNode->setNodeDiffIntent (m_vStackDiffNodeIntents. back () );
1343+ pNode->setNodeIntents (m_vStackDiffNodeIntents);
13331344 m_pParseCurrentParentNode->appendElement (pNode);
13341345 } else if (m_pParseCurrentParentNode->getParent () != nullptr && (m_pParseCurrentParentNode->getParent ()->isArray () || m_pParseCurrentParentNode->getParent ()->isMap ())) {
13351346 WsjcppYamlNode *pNode = new WsjcppYamlNode (
13361347 m_pParseCurrentParentNode->getParent (), m_parsePlaceInFile,
13371348 WSJCPP_YAML_NODE_EMPTY
13381349 );
1339- pNode->setNodeDiffIntent (m_vStackDiffNodeIntents. back () );
1350+ pNode->setNodeIntents (m_vStackDiffNodeIntents);
13401351 m_pParseCurrentParentNode->getParent ()->appendElement (pNode);
13411352 } else {
13421353 throw std::runtime_error (TAG + " : Empty element can be added only to map or to array" );
@@ -1364,11 +1375,9 @@ bool WsjcppYaml::parse(const std::string &sFileName, const std::string &sBuffer,
13641375 sError = " Parent of current node is nullptr, line: " + std::to_string (nLine);
13651376 return false ;
13661377 }
1367- // m_nParseCurrentIntent = m_nParseCurrentIntent - m_pParseCurrentParentNode->getParent()->getNodeDiffIntent();
13681378 m_nParseCurrentIntent = m_nParseCurrentIntent - m_vStackDiffNodeIntents.back ();
13691379 m_vStackDiffNodeIntents.pop_back ();
13701380 m_pParseCurrentParentNode = m_pParseCurrentParentNode->getParent ();
1371- // std::cout << "up to [" << m_pParseCurrentParentNode->getName() << "]" << std::endl;
13721381 if (m_nParseCurrentIntent < m_parseLine.getIntent ()) {
13731382 sError = " Wrong intent, expected "
13741383 " '" + std::to_string (m_parseLine.getIntent ()) + " ',"
@@ -1378,24 +1387,8 @@ bool WsjcppYaml::parse(const std::string &sFileName, const std::string &sBuffer,
13781387 }
13791388
13801389 if (m_nParseCurrentIntent == m_parseLine.getIntent ()) {
1381- // if (m_pParseCurrentParentNode->getParent() != nullptr) {
1382- // m_pParseCurrentParentNode = m_pParseCurrentParentNode->getParent();
1383- // }
13841390 break ;
13851391 }
1386-
1387- /* std::cout << nLine << ": nDiffIntent = " << nDiffIntent << std::endl;
1388- std::cout << nLine << ": m_pParseCurrentParentNode = " << m_pParseCurrentParentNode->getNodeDiffIntent() << std::endl;
1389- std::cout << nLine << ": m_pParseCurrentParentNode = " << m_pParseCurrentParentNode->getName() << std::endl;
1390- int nNodeDiffIntent = m_pParseCurrentParentNode->getNodeDiffIntent();
1391- if (nNodeDiffIntent == 0) {
1392- sError = "Node diff intent cann't be 0 ";
1393- return false;
1394- }
1395- m_pParseCurrentParentNode = m_pParseCurrentParentNode->getParent();
1396- m_nParseCurrentIntent = m_nParseCurrentIntent - nNodeDiffIntent;
1397- nDiffIntent = nLineIntent - m_nParseCurrentIntent;
1398- */
13991392 }
14001393
14011394 if (m_parseLine.isEmptyName ()) {
@@ -1439,6 +1432,11 @@ void WsjcppYaml::process_hasName_emptyValue_arrayItem() {
14391432// ---------------------------------------------------------------------
14401433
14411434void WsjcppYaml::process_hasName_emptyValue_noArrayItem () {
1435+ if (m_parseLine.getIntent () == m_pParseCurrentParentNode->getNodeIntent ()) {
1436+ if (m_pParseCurrentParentNode->getParent () != nullptr ) {
1437+ m_pParseCurrentParentNode = m_pParseCurrentParentNode->getParent ();
1438+ }
1439+ }
14421440 // std::cout << "process_hasName_emptyValue_noArrayItem " << std::endl;
14431441 WsjcppYamlNode *pNode = new WsjcppYamlNode (
14441442 m_pParseCurrentParentNode, m_parsePlaceInFile,
@@ -1451,9 +1449,19 @@ void WsjcppYaml::process_hasName_emptyValue_noArrayItem() {
14511449 int nDiffIntent = m_parseLine.getIntent () - m_nParseCurrentIntent;
14521450 pNode->setName (m_parseLine.getName (), m_parseLine.getNameQuotes ());
14531451 pNode->setComment (m_parseLine.getComment ());
1454- pNode->setNodeDiffIntent (m_vStackDiffNodeIntents. back () );
1452+ pNode->setNodeIntents (m_vStackDiffNodeIntents);
14551453 // std::cout << "current node [" << m_vStackDiffNodeIntents.back() << "]" << std::endl;
1456-
1454+
1455+ /* if (nDiffIntent == 0 && m_pParseCurrentParentNode->isUndefined()) {
1456+ std::cout << "shit nDiffIntent = " << nDiffIntent << std::endl;
1457+ std::cout << "shit m_pParseCurrentParentNode->getName() = " << m_pParseCurrentParentNode->getName() << std::endl;
1458+ if (m_pParseCurrentParentNode->getParent() != nullptr) {
1459+ std::cout << "shit "
1460+ << " {" << m_pParseCurrentParentNode->getPlaceInFile().getLine() << "} "
1461+ << " {" << m_parsePlaceInFile.getLine() << "} " << std::endl;
1462+ }
1463+ }
1464+ */
14571465 m_pParseCurrentParentNode->setElement (m_parseLine.getName (), pNode);
14581466 m_pParseCurrentParentNode = pNode;
14591467}
@@ -1471,7 +1479,7 @@ void WsjcppYaml::process_hasName_hasValue_arrayItem() {
14711479 );
14721480 m_pParseCurrentParentNode->appendElement (pMapItem);
14731481 m_pParseCurrentParentNode = pMapItem;
1474- pMapItem->setNodeDiffIntent (m_vStackDiffNodeIntents. back () );
1482+ pMapItem->setNodeIntents (m_vStackDiffNodeIntents);
14751483
14761484 WsjcppYamlNode *pNode = new WsjcppYamlNode (
14771485 m_pParseCurrentParentNode, m_parsePlaceInFile,
@@ -1481,23 +1489,26 @@ void WsjcppYaml::process_hasName_hasValue_arrayItem() {
14811489 pNode->setValue (m_parseLine.getValue (), m_parseLine.getValueQuotes ());
14821490 pNode->setName (m_parseLine.getName (), m_parseLine.getNameQuotes ());
14831491 pMapItem->setElement (m_parseLine.getName (), pNode);
1484- // pNode->setNodeDiffIntent(m_vStackDiffNodeIntents.back());
1492+
1493+ // next intents must be for map
1494+ m_vStackDiffNodeIntents.push_back (2 );
1495+ m_nParseCurrentIntent += 2 ;
14851496}
14861497
14871498// ---------------------------------------------------------------------
14881499
14891500void WsjcppYaml::process_hasName_hasValue_noArrayItem () {
1490- // std::cout << "process_hasName_hasValue_noArrayItem " << std::endl;
14911501 WsjcppYamlNode *pNode = new WsjcppYamlNode (
14921502 m_pParseCurrentParentNode, m_parsePlaceInFile,
14931503 WSJCPP_YAML_NODE_VALUE
14941504 );
14951505 // std::cout << "m_parseLine.getName(): " << m_parseLine.getName() << std::endl;
1506+ // std::cout << "m_pParseCurrentParentNode: " << m_pParseCurrentParentNode->getPlaceInFile().getLine() << std::endl;
14961507 pNode->setComment (m_parseLine.getComment ());
14971508 pNode->setValue (m_parseLine.getValue (), m_parseLine.getValueQuotes ());
14981509 pNode->setName (m_parseLine.getName (), m_parseLine.getNameQuotes ());
1510+ pNode->setNodeIntents (m_vStackDiffNodeIntents);
14991511 m_pParseCurrentParentNode->setElement (m_parseLine.getName (), pNode);
1500- pNode->setNodeDiffIntent (m_vStackDiffNodeIntents.back ());
15011512
15021513 // m_pParseCurrentParentNode = pItem;
15031514}
@@ -1517,7 +1528,7 @@ void WsjcppYaml::process_emptyName_hasValue_arrayItem() {
15171528 pNode->setValue (m_parseLine.getValue (), m_parseLine.getValueQuotes ());
15181529 m_pParseCurrentParentNode->appendElement (pNode);
15191530 // m_pParseCurrentParentNode = pNode;
1520- pNode->setNodeDiffIntent (m_vStackDiffNodeIntents. back () );
1531+ pNode->setNodeIntents (m_vStackDiffNodeIntents);
15211532}
15221533
15231534// ---------------------------------------------------------------------
@@ -1531,7 +1542,6 @@ void WsjcppYaml::process_emptyName_hasValue_noArrayItem() {
15311542// ---------------------------------------------------------------------
15321543
15331544void WsjcppYaml::process_emptyName_emptyValue_arrayItem () {
1534- // std::cout << "process_emptyName_emptyValue_arrayItem " << std::endl;
15351545 if (m_pParseCurrentParentNode->isUndefined ()) {
15361546 m_pParseCurrentParentNode->doArray ();
15371547 }
@@ -1541,9 +1551,8 @@ void WsjcppYaml::process_emptyName_emptyValue_arrayItem() {
15411551 );
15421552 pNode->setComment (m_parseLine.getComment ());
15431553 pNode->setValue (m_parseLine.getValue (), m_parseLine.getValueQuotes ());
1554+ pNode->setNodeIntents (m_vStackDiffNodeIntents);
15441555 m_pParseCurrentParentNode->appendElement (pNode);
1545- pNode->setNodeDiffIntent (m_vStackDiffNodeIntents.back ());
1546- m_pParseCurrentParentNode = pNode;
15471556}
15481557
15491558// ---------------------------------------------------------------------
@@ -1555,7 +1564,7 @@ void WsjcppYaml::process_emptyName_emptyValue_noArrayItem() {
15551564 WSJCPP_YAML_NODE_EMPTY
15561565 );
15571566 pNode->setComment (m_parseLine.getComment ());
1558- pNode->setNodeDiffIntent (m_vStackDiffNodeIntents. back () );
1567+ pNode->setNodeIntents (m_vStackDiffNodeIntents);
15591568 m_pParseCurrentParentNode->appendElement (pNode);
15601569}
15611570
0 commit comments