1 /*******************************************************************
2 
3 Part of the Fritzing project - http://fritzing.org
4 Copyright (c) 2007-2014 Fachhochschule Potsdam - http://fh-potsdam.de
5 
6 Fritzing is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10 
11 Fritzing is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with Fritzing.  If not, see <http://www.gnu.org/licenses/>.
18 
19 ********************************************************************
20 
21 $Revision: 6984 $:
22 $Author: irascibl@gmail.com $:
23 $Date: 2013-04-22 23:44:56 +0200 (Mo, 22. Apr 2013) $
24 
25 ********************************************************************/
26 
27 #ifndef TEXTUTILS_H
28 #define TEXTUTILS_H
29 
30 #include <QPointF>
31 #include <QDomElement>
32 #include <QSet>
33 #include <QMatrix>
34 #include <QTransform>
35 #include <QXmlStreamReader>
36 
37 typedef QString (*CopyPinFunction)(int pin, const QString & argString, void * userData);
38 typedef QString (*MultiplyPinFunction)(int pin, double increment, double value);
39 
40 class TextUtils
41 {
42 
43 public:
44 	static QSet<QString> getRegexpCaptures(const QString &pattern, const QString &textToSearchIn);
45 	static QDomElement findElementWithAttribute(QDomElement element, const QString & attributeName, const QString & attributeValue);
46 	static void findElementsWithAttribute(QDomElement & element, const QString & att, QList<QDomElement> & elements);
47 	static double convertToInches(const QString & string, bool * ok, bool isIllustrator);
48 	static double convertToInches(const QString & string);
49 	static QString convertToPowerPrefix(double);
50 	static double convertFromPowerPrefix(const QString & val, const QString & symbol);
51 	static double convertFromPowerPrefixU(QString & val, const QString & symbol);
52 
53 	static QString replaceTextElement(const QString & svg, const QString & id, const QString &  newValue);
54 	static QByteArray replaceTextElement(const QByteArray & svg, const QString & id, const QString &  newValue);
55 	static QString replaceTextElements(const QString & svg, const QHash<QString, QString> &);
56     static bool squashElement(QDomDocument &, const QString & elementName, const QString & attName, const QRegExp & matchContent);
57     static QString mergeSvg(const QString & svg1, const QString & svg2, const QString & id, bool flip);
58 	static QString mergeSvgFinish(QDomDocument & doc);
59 	static bool mergeSvg(QDomDocument & doc1, const QString & svg, const QString & id);
60 	static QString makeSVGHeader(double printerscale, double dpi, double width, double height);
61 	static bool isIllustratorFile(const QString &fileContent);
62 	static bool isIllustratorFile(const QByteArray &fileContent);
63 	static bool isIllustratorDoc(const QDomDocument & doc);
64 	static QString removeXMLEntities(QString svgContent);
65 	static bool cleanSodipodi(QString &bytes);
66 	static bool fixPixelDimensionsIn(QString &fileContent);
67 	static bool addCopper1(const QString & filename, QDomDocument & doc, const QString & srcAtt, const QString & destAtt);
68 	static void setSVGTransform(QDomElement &, QMatrix &);
69 	static QString svgMatrix(const QMatrix &);
70 	static QString svgMatrix(const QTransform &);
71 	static QString svgTransform(const QString & svg, QTransform & transform, bool translate, const QString extra);
72 	static bool getSvgSizes(QDomDocument & doc, double & sWidth, double & sHeight, double & vbWidth, double & vbHeight);
73 	static bool findText(const QDomNode & node, QString & text);
74 	static QString stripNonValidXMLCharacters(const QString & str);
75 	static QString convertExtendedChars(const QString & str);
76 	static QString escapeAnd(const QString &);
77 	static QMatrix elementToMatrix(QDomElement & element);
78 	static QMatrix transformStringToMatrix(const QString & transform);
79     static QList<double> getTransformFloats(QDomElement & element);
80 	static QList<double> getTransformFloats(const QString & transform);
81 	static QString svgNSOnly(QString svgContent);
82 	static QString killXMLNS(QString svgContent);
83 	static void gWrap(QDomDocument & domDocument, const QHash<QString, QString> & attributes);
84 	static void slamStrokeAndFill(QDomElement &, const QString & stroke, const QString & strokeWidth, const QString & fill);
85 	static QString slamStrokeAndFill(const QString & svg, const QString & stroke, const QString & strokeWidth, const QString & fill);
86 	static QString incrementTemplate(const QString & filename, int pins, double unitIncrement, MultiplyPinFunction, CopyPinFunction, void * userData);
87 	static QString incrementTemplateString(const QString & templateString, int pins, double increment, MultiplyPinFunction, CopyPinFunction, void * userData);
88 	static QString standardCopyPinFunction(int pin, const QString & argString, void * userData);
89 	static QString standardMultiplyPinFunction(int pin, double increment, double value);
90 	static QString noCopyPinFunction(int pin, const QString & argString, void * userData);
91 	static QString incMultiplyPinFunction(int pin, double increment, double value);
92 	static QString incCopyPinFunction(int pin, const QString & argString, void * userData);
93 	static QString negIncCopyPinFunction(int pin, const QString & argString, void * userData);
94 	static double getViewBoxCoord(const QString & svg, int coord);
95 	static QString makeLineSVG(QPointF p1, QPointF p2, double width, QString colorString, double dpi, double printerScale, bool blackOnly, bool dashed, const QVector<qreal> &);
96 	static QString makeCubicBezierSVG(const QPolygonF & controlPoints, double width, QString colorString, double dpi, double printerScale, bool blackOnly, bool dashed, const QVector<qreal> &);
97 	static QString makeRectSVG(QRectF r, QPointF offset, double dpi, double printerscale);
98 	static QString makePolySVG(const QPolygonF & poly, QPointF offset, double width, QString colorString, double dpi, double printerScale, bool blackOnly);
99 	static QPolygonF polygonFromElement(QDomElement & element);
100 	static QString pointToSvgString(QPointF p, QPointF offset, double dpi, double printerScale);
101 	static void replaceChildText(QDomNode & node, const QString & text);
102 	static void replaceElementChildText(QDomElement & root, const QString & elementName, const QString & text);
103 	static QString removeSVGHeader(QString & string);
104 	//static QString getMacAddress();
105 	static QString expandAndFill(const QString & svg, const QString & color, double expandBy);
106 	static void expandAndFillAux(QDomElement &, const QString & color, double expandBy);
107     static bool writeUtf8(const QString & fileName, const QString & text);
108     static int getPinsAndSpacing(const QString & expectedFileName, QString & spacingString);
109 	static QSizeF parseForWidthAndHeight(QXmlStreamReader &, QRectF & viewBox, bool getViewBox);
110 	static QSizeF parseForWidthAndHeight(QXmlStreamReader &);
111 	static QSizeF parseForWidthAndHeight(const QString & svg, QRectF & viewBox, bool getViewBox);
112 	static QSizeF parseForWidthAndHeight(const QString & svg);
113     static void gornTree(QDomDocument &);
114     static bool elevateTransform(QDomElement &);
115     static bool fixMuch(QString &svg, bool fixStrokeWidth);
116 	static bool fixInternalUnits(QString & svg);
117 	static bool fixFonts(QString & svg, const QString & destFont, bool & reallyFixed);
118 	static void fixStyleAttribute(QDomElement & element);
119     static QString parseForModuleID(const QString & fzp);
120 	static QString getRandText();
121     static bool ensureViewBox(QDomDocument doc, double dpi, QRectF & rect, bool toInches, double & w, double & h, bool getwh);
122     static QString findAnchor(const QDomElement & text);
123     static double getStrokeWidth(QDomElement &, double defaultValue);
124     static void resplit(QStringList & names, const QString & split);
125 
126 public:
127 	static const QRegExp FindWhitespace;
128 	static const QString SMDFlipSuffix;
129 	static const QString MicroSymbol;
130     static const ushort MicroSymbolCode;
131 	static const QString PowerPrefixesString;
132 	static const QString CreatedWithFritzingString;
133 	static const QString CreatedWithFritzingXmlComment;
134 	static void collectLeaves(QDomElement & element, int & index, QVector<QDomElement> & leaves);
135 	static void collectLeaves(QDomElement & element, QList<QDomElement> & leaves);
136 	static const QRegExp floatingPointMatcher;
137 	static const QString RegexFloatDetector;
138 	static const QString AdobeIllustratorIdentifier;
139 
140 protected:
141 	static bool pxToInches(QDomElement &elem, const QString &attrName, bool isIllustrator);
142     static void squashNotElement(QDomElement & element, const QString & elementName, const QString & attName, const QRegExp & matchContent, bool & result);
143 	static void initPowerPrefixes();
144 	static QDomElement copyText(QDomDocument & svgDom, QDomElement & parent, QDomElement & text, const QString & defaultX, const QString & defaultY, bool copyAttributes);
145     static void gornTreeAux(QDomElement &);
146     static bool noPatternAux(QDomDocument & svgDom, const QString & tag);
147     static bool noUseAux(QDomDocument & svgDom);
148     static bool tspanRemoveAux(QDomDocument & svgDom);
149     static void fixStyleAttribute(QDomElement & element, QString & style, const QString & attributeName);
150     static bool fixStrokeWidth(QDomDocument & svgDoc);
151     static bool fixViewBox(QDomElement & root);
152     static void chopNotDigits(QString &);
153     static void collectTransforms(QDomElement & root, QList<QDomElement> & transforms);
154 
155 };
156 
157 #endif
158