File indexing completed on 2024-04-28 04:34:23
0001 /* 0002 Copyright (C) 2009 Niko Sams <niko.sams@gmail.com> 0003 0004 This library is free software; you can redistribute it and/or 0005 modify it under the terms of the GNU Library General Public 0006 License version 2 as published by the Free Software Foundation. 0007 0008 This library is distributed in the hope that it will be useful, 0009 but WITHOUT ANY WARRANTY; without even the implied warranty of 0010 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0011 Library General Public License for more details. 0012 0013 You should have received a copy of the GNU Library General Public License 0014 along with this library; see the file COPYING.LIB. If not, write to 0015 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0016 Boston, MA 02110-1301, USA. 0017 */ 0018 0019 #include "contentassistdata.h" 0020 0021 #include <QXmlStreamReader> 0022 #include <QFile> 0023 0024 namespace Css { 0025 0026 ContentAssistData* ContentAssistData::self() 0027 { 0028 static ContentAssistData* ret = nullptr; 0029 if (!ret) ret = new ContentAssistData; 0030 return ret; 0031 } 0032 0033 ContentAssistData::ContentAssistData() 0034 { 0035 QFile f(QStringLiteral(":/kdevcsssupport/completion/CSS.xml")); 0036 Q_ASSERT(f.exists()); 0037 f.open(QIODevice::ReadOnly); 0038 QXmlStreamReader xml(&f); 0039 0040 while (!xml.atEnd()) { 0041 xml.readNext(); 0042 if (xml.isStartElement() && xml.name() == "elements") { 0043 while (!xml.atEnd()) { 0044 xml.readNext(); 0045 if (xml.isEndElement() && xml.name() == "elements") break; 0046 if (xml.isStartElement() && xml.name() == "element") { 0047 Element el; 0048 el.name = xml.attributes().value("name").toString(); 0049 el.fullName = xml.attributes().value("full-name").toString(); 0050 while (!xml.atEnd()) { 0051 xml.readNext(); 0052 if (xml.isEndElement() && xml.name() == "element") break; 0053 if (xml.isStartElement() && xml.name() == "description") { 0054 el.description = xml.readElementText(); 0055 } 0056 if (xml.isStartElement() && xml.name() == "browsers") { 0057 el.browsers = readBrowsers(xml); 0058 } 0059 if (xml.isStartElement() && xml.name() == "example") { 0060 el.example = xml.readElementText(); 0061 } 0062 if (xml.isStartElement() && xml.name() == "remarks") { 0063 el.remarks = xml.readElementText(); 0064 } 0065 if (xml.isStartElement() && xml.name() == "fields") { 0066 while (!xml.atEnd()) { 0067 xml.readNext(); 0068 if (xml.isEndElement() && xml.name() == "fields") break; 0069 if (xml.isStartElement() && xml.name() == "field") { 0070 el.fields << xml.attributes().value("name").toString(); 0071 } 0072 } 0073 } 0074 m_elements[el.name] = el; 0075 } 0076 } 0077 } 0078 } 0079 0080 if (xml.isStartElement() && xml.name() == "fields") { 0081 while (!xml.atEnd()) { 0082 xml.readNext(); 0083 if (xml.isEndElement() && xml.name() == "fields") break; 0084 if (xml.isStartElement() && xml.name() == "field") { 0085 Field field; 0086 field.name = xml.attributes().value("name").toString(); 0087 while (!xml.atEnd()) { 0088 xml.readNext(); 0089 if (xml.isEndElement() && xml.name() == "field") break; 0090 if (xml.isStartElement() && xml.name() == "description") { 0091 field.description = xml.readElementText(); 0092 } 0093 if (xml.isStartElement() && xml.name() == "hint") { 0094 field.hint = xml.readElementText(); 0095 } 0096 if (xml.isStartElement() && xml.name() == "browsers") { 0097 field.browsers = readBrowsers(xml); 0098 } 0099 if (xml.isStartElement() && xml.name() == "example") { 0100 field.example = xml.readElementText(); 0101 } 0102 if (xml.isStartElement() && xml.name() == "remarks") { 0103 field.remarks = xml.readElementText(); 0104 } 0105 if (xml.isStartElement() && xml.name() == "values") { 0106 while (!xml.atEnd()) { 0107 xml.readNext(); 0108 if (xml.isEndElement() && xml.name() == "values") break; 0109 if (xml.isStartElement() && xml.name() == "value") { 0110 Value v; 0111 v.name = xml.attributes().value("name").toString(); 0112 v.description = xml.attributes().value("description").toString(); 0113 field.values[v.name] = v; 0114 } 0115 } 0116 } 0117 m_fields[field.name] = field; 0118 } 0119 } 0120 } 0121 } 0122 } 0123 } 0124 0125 QList<ContentAssistData::Browser> ContentAssistData::readBrowsers(QXmlStreamReader& xml) 0126 { 0127 QList<Browser> ret; 0128 Q_ASSERT(xml.isStartElement() && xml.name() == "browsers"); 0129 while (!xml.atEnd()) { 0130 xml.readNext(); 0131 if (xml.isEndElement() && xml.name() == "browsers") break; 0132 if (xml.isStartElement() && xml.name() == "browser") { 0133 Browser br; 0134 br.platform = xml.attributes().value("platform").toString(); 0135 br.version = xml.attributes().value("version").toString(); 0136 br.os = xml.attributes().value("os").toString(); 0137 while (!xml.atEnd()) { 0138 xml.readNext(); 0139 if (xml.isEndElement() && xml.name() == "browser") break; 0140 if (xml.isStartElement() && xml.name() == "description") { 0141 br.description = xml.readElementText(); 0142 } 0143 } 0144 ret << br; 0145 } 0146 } 0147 return ret; 0148 } 0149 0150 ContentAssistData::Element ContentAssistData::element(const QString& name) 0151 { 0152 const QString lower = name.toLower(); 0153 if (!m_elements.contains(lower)) { 0154 return Element(); 0155 } 0156 return m_elements[lower]; 0157 } 0158 0159 ContentAssistData::Field ContentAssistData::field(const QString& name) 0160 { 0161 if (!m_fields.contains(name)) { 0162 return Field(); 0163 } 0164 return m_fields[name]; 0165 } 0166 0167 QStringList ContentAssistData::elements() 0168 { 0169 return m_elements.keys(); 0170 } 0171 0172 0173 }