क्यूटी के भीतर कुछ भी सार्वजनिक नहीं है। आप निश्चित रूप से क्यूटी के निजी सीएसएस पार्सर का उपयोग करने के लिए स्वतंत्र हैं - आप इसे कॉपी कर सकते हैं और अपनी आवश्यकताओं के अनुरूप संशोधित कर सकते हैं।
देखें, qtbase/src/gui/text
में।
अच्छी खबर यह है कि उदाहरण के लिए आपने ऊपर दिखाया है, संशोधन बहुत मामूली होगा। क्यूटी का सीएसएस पार्सर पहले से ही @import
का समर्थन करता है, इसलिए हमारे पास केवल nested selector syntax है। उस वाक्यविन्यास के बिना, आप QCss::Parser
का उपयोग कर सकते हैं। पार्सर को एक लचीली फैशन में लिखा गया था, जहां आपको औपचारिक सीएसएस कीवर्ड के बारे में चिंता करने की आवश्यकता नहीं है: यह आपको अभी भी सभी घोषणाओं तक पहुंचने देगा, भले ही वे औपचारिक सीएसएस दृष्टिकोण से समझें या नहीं।
int main() {
QCss::Parser parser(pss);
QCss::StyleSheet styleSheet;
if (!parser.parse(&styleSheet))
return 1;
for (auto rule : styleSheet.styleRules) {
qDebug() << "** Rule **";
for (auto sel : rule.selectors) {
for (auto bSel : sel.basicSelectors)
qDebug() << bSel;
}
for (auto decl : rule.declarations)
qDebug() << decl;
}
}
उत्पादन हम क्या उम्मीद थी है:
पार्स पेड़ पुनरावृत्ति के रूप में यह हो जाता है के रूप में सरल है
** Rule **
BasicSelector "propertyID"="1230000"
Declaration "fillColor" = '#f3f1ed' % QColor(ARGB 1, 0.952941, 0.945098, 0.929412)
Declaration "minSize" = '5' % 5
Declaration "lineWidth" = '3'
** Rule **
BasicSelector "propertyID"="124???|123000"
Declaration "lineType" = 'dotted'
** Rule **
BasicSelector "propertyID"="125???"
Declaration "lineType" = 'thinline'
** Rule **
BasicSelector "propertyID"="133???"
Declaration "lineType" = 'thickline'
हम QCss
कक्षाओं के लिए डिबग धारा ऑपरेटरों को लागू करना अपने आप को :
QDebug operator<<(QDebug dbg, const QCss::AttributeSelector & sel) {
QDebugStateSaver saver(dbg);
dbg.noquote().nospace() << "\"" << sel.name << "\"";
switch (sel.valueMatchCriterium) {
case QCss::AttributeSelector::MatchEqual:
dbg << "="; break;
case QCss::AttributeSelector::MatchContains:
dbg << "~="; break;
case QCss::AttributeSelector::MatchBeginsWith:
dbg << "^="; break;
case QCss::AttributeSelector::NoMatch:
break;
}
if (sel.valueMatchCriterium != QCss::AttributeSelector::NoMatch && !sel.value.isEmpty())
dbg << "\"" << sel.value << "\"";
return dbg;
}
QDebug operator<<(QDebug dbg, const QCss::BasicSelector & sel) {
QDebugStateSaver saver(dbg);
dbg.noquote().nospace() << "BasicSelector";
if (!sel.elementName.isEmpty())
dbg << " #" << sel.elementName;
for (auto & id : sel.ids)
dbg << " id:" << id;
for (auto & aSel : sel.attributeSelectors)
dbg << " " << aSel;
return dbg;
}
घोषणा को पार करते समय, QCss::parser
पहले से ही हमारे लिए कुछ मानक मानों का व्याख्या करता है, उदा। रंग, पूर्णांकों, आदि
QDebug operator<<(QDebug dbg, const QCss::Declaration & decl) {
QDebugStateSaver saver(dbg);
dbg.noquote().nospace() << "Declaration";
dbg << " \"" << decl.d->property << "\" = ";
bool first = true;
for (auto value : decl.d->values) {
if (!first) dbg << ", ";
dbg << "\'" << value.toString() << "\'";
first = false;
}
if (decl.d->property == "fillColor")
dbg << " % " << decl.colorValue();
else if (decl.d->property == "minSize") {
int i;
if (decl.intValue(&i)) dbg << " % " << i;
}
return dbg;
}
अंत में, बॉयलरप्लेट और स्टाइलशीट पार्स किया जा सकता: नेस्टेड चयनकर्ताओं के लिए
// https://github.com/KubaO/stackoverflown/tree/master/questions/css-like-parser-31583622
#include <QtGui>
#include <private/qcssparser_p.h>
const char pss[] =
"/* @include \"otherStyleSheet.pss\"; */ \
[propertyID=\"1230000\"] { \
fillColor : #f3f1ed; \
minSize : 5; \
lineWidth : 3; \
} \
\
/* sphere */ \
[propertyID=\"124???|123000\"] { \
lineType : dotted; \
} \
\
/* square */ \
[propertyID=\"125???\"] { \
lineType : thinline; \
} \
\
/* ring */ \
[propertyID=\"133???\"] { \
lineType : thickline; \
/*[hasInnerRing=true] { \
innerLineType : thinline; \
}*/ \
}";
सहायता/नियम पार्सर स्रोत को संशोधित करके लागू किया जा सकता। Parser::parseRuleset
रिकर्सिव बनाने के लिए आवश्यक परिवर्तन बहुत मामूली है। मैं इसे पाठक के लिए अभ्यास के रूप में छोड़ दूंगा :)
सब कुछ, मुझे लगता है कि मौजूदा पार्सर का पुन: उपयोग करना आपके खुद को रोल करने से कहीं अधिक आसान है, खासकर जब आपके उपयोगकर्ता अनिवार्य रूप से आपको अधिक समर्थन देना चाहते हैं और सीएसएस स्पेक के अधिक।
मुझे उपलब्ध कुछ भी पता नहीं है। क्या वह बाहर जंगली सीएसएस या सीएसएस पर नियंत्रण रखेगा? –
@ फ्रैंकऑस्टरफेल्ड क्षमा करें, मुझे जंगली अंतर में अंतर नहीं है और इसका नियंत्रण है? मैंने अपना प्रश्न संपादित किया .. Thnx –
फ्रैंक का क्या अर्थ है: क्या सीएसएस आपके एप्लिकेशन का एक हिस्सा है, ताकि आप इसे संपादित कर सकें और इसे प्रबंधित कर सकें, या यह इंटरनेट पर संभावित रूप से दुर्भावनापूर्ण स्रोतों से आता है? याद रखें कि अगर आपके सीएसएस पार्सर में बग हैं, तो दुर्भावनापूर्ण सीएसएस उनका फायदा उठा सकता है और आपका आवेदन ले सकता है। आधुनिक सी ++ (या सी) कोड से कम, इस तरह की बग अपवाद से अधिक मानक हैं। क्यूटी का अपना पार्सर दुर्भावनापूर्ण सीएसएस के खिलाफ लचीला होने के लिए डिज़ाइन नहीं किया गया है - इसे कभी भी इंटरनेट से यादृच्छिक इनपुट स्वीकार करने के लिए डिज़ाइन नहीं किया गया था। इसमें बहुत सारे सुरक्षा छेद हैं, मुझे यकीन है। –