Skip to content

Commit

Permalink
[TD]encode Xml characters in spreadsheet
Browse files Browse the repository at this point in the history
  • Loading branch information
WandererFan committed Oct 4, 2022
1 parent 2575f08 commit a85f751
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 3 deletions.
32 changes: 31 additions & 1 deletion src/Mod/TechDraw/App/DrawUtil.cpp
Expand Up @@ -854,7 +854,37 @@ int DrawUtil::countSubShapes(TopoDS_Shape shape, TopAbs_ShapeEnum subShape)
return count;
}


//https://stackoverflow.com/questions/5665231/most-efficient-way-to-escape-xml-html-in-c-string
//for every character in inoutText, check if it is on the list of characters to be substituted and
//replace it with the encoding string
void DrawUtil::encodeXmlSpecialChars(std::string& inoutText)
{
std::string buffer;
buffer.reserve(inoutText.size());
for(size_t cursor = 0; cursor != inoutText.size(); ++cursor) {
switch(inoutText.at(cursor)) {
case '&':
buffer.append("&");
break;
case '\"':
buffer.append(""");
break;
case '\'':
buffer.append("'");
break;
case '<':
buffer.append("&lt;");
break;
case '>':
buffer.append("&gt;");
break;
default:
buffer.append(&inoutText.at(cursor), 1); //not a special character
break;
}
}
inoutText.swap(buffer);
}

// Supplementary mathematical functions
// ====================================
Expand Down
1 change: 1 addition & 0 deletions src/Mod/TechDraw/App/DrawUtil.h
Expand Up @@ -140,6 +140,7 @@ class TechDrawExport DrawUtil {
static Base::Vector3d getFaceCenter(TopoDS_Face f);
static bool circulation(Base::Vector3d A, Base::Vector3d B, Base::Vector3d C);
static int countSubShapes(TopoDS_Shape shape, TopAbs_ShapeEnum subShape);
static void encodeXmlSpecialChars(std::string& inoutText);


// Supplementary mathematical functions
Expand Down
9 changes: 7 additions & 2 deletions src/Mod/TechDraw/App/DrawViewSpreadsheet.cpp
Expand Up @@ -42,6 +42,7 @@
#include <Base/Parameter.h>

#include "Preferences.h"
#include "DrawUtil.h"
#include "DrawViewSpreadsheet.h"

#include <Mod/Spreadsheet/App/Cell.h>
Expand Down Expand Up @@ -287,9 +288,13 @@ std::string DrawViewSpreadsheet::getSheetImage()
prop->isDerivedFrom(App::PropertyFloat::getClassTypeId()) ||
prop->isDerivedFrom(App::PropertyInteger::getClassTypeId())
) {
field << cell->getFormattedQuantity();
std::string temp = cell->getFormattedQuantity(); //writable
DrawUtil::encodeXmlSpecialChars(temp);
field << temp;
} else if (prop->isDerivedFrom(App::PropertyString::getClassTypeId())) {
field << static_cast<App::PropertyString*>(prop)->getValue();
std::string temp = static_cast<App::PropertyString*>(prop)->getValue();
DrawUtil::encodeXmlSpecialChars(temp);
field << temp;
} else {
Base::Console().Error("DVSS: Unknown property type\n");
}
Expand Down

0 comments on commit a85f751

Please sign in to comment.