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 }