Skip to content

Commit 9b1dbfc

Browse files
committed
Fixed #14 bug with intents
1 parent 623fdd1 commit 9b1dbfc

9 files changed

+116
-97
lines changed

src/wsjcpp_yaml.cpp

Lines changed: 64 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -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

14411434
void 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

14891500
void 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

15331544
void 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

src/wsjcpp_yaml.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
// ---------------------------------------------------------------------
1313

1414
enum WsjcppYamlNodeType {
15-
WSJCPP_YAML_NODE_UNDEFINED,
16-
WSJCPP_YAML_NODE_EMPTY,
17-
WSJCPP_YAML_NODE_ARRAY,
18-
WSJCPP_YAML_NODE_MAP,
19-
WSJCPP_YAML_NODE_VALUE
15+
WSJCPP_YAML_NODE_UNDEFINED = 0,
16+
WSJCPP_YAML_NODE_EMPTY = 1,
17+
WSJCPP_YAML_NODE_ARRAY = 2,
18+
WSJCPP_YAML_NODE_MAP = 3,
19+
WSJCPP_YAML_NODE_VALUE = 4
2020
};
2121

2222
// ---------------------------------------------------------------------
@@ -122,9 +122,10 @@ class WsjcppYamlNode {
122122
std::string getItemTypeAsString();
123123

124124
std::string getForLogFormat();
125-
void setNodeDiffIntent(int nDiffIntent);
126-
int getNodeDiffIntent();
127-
std::string getStringNodeDiffIntent();
125+
int getNodeLastIntent();
126+
std::string getStringNodeLastIntent();
127+
void setNodeIntents(const std::vector<int> & vNodeIntents);
128+
int getNodeIntent();
128129

129130
private:
130131
void throw_error(const std::string &sError);
@@ -141,6 +142,7 @@ class WsjcppYamlNode {
141142
std::string m_sComment;
142143
int m_nNodeDiffIntent;
143144
std::string m_sNodeDiffIntent;
145+
int m_nNodeIntent;
144146
};
145147

146148
// ---------------------------------------------------------------------
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# simple array test
2+
param1: none value1 # it's value for something # olala
3+
array-test2 : # some comment 2
4+
- value21 # comment v21
5+
- value22 # comment v22
6+
- true # comment true
7+
# some
8+
- falsesome
9+
- free@free
10+
- # empty
11+
- 1
12+
param2: val2 # value 2
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Some comment 1
2+
3+
arr1:
4+
5+
- name: i1
6+
var2: 2
7+
- name: i2
8+
- name: i3
9+
- very different array items type

unit-tests.wsjcpp/parser_yaml.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
14
import yaml
25

36

47
a_yaml_file = open("./data-tests/read-write-file/docker-compose.yml")
58

69
parsed_yaml_file = yaml.load(a_yaml_file, Loader=yaml.FullLoader)
710

8-
print(parsed_yaml_file)
11+
print(parsed_yaml_file)
12+
13+
a_yaml_file2 = open("./data-tests/parser-simple-array/file.yml")
14+
15+
parsed_yaml_file2 = yaml.load(a_yaml_file2, Loader=yaml.FullLoader)
16+
17+
print(parsed_yaml_file2)

0 commit comments

Comments
 (0)