• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

rocs/App

  • sources
  • kde-4.14
  • kdeedu
  • rocs
  • App
  • InterfacePlugins
  • ApiDoc
ApiDocManager.cpp
Go to the documentation of this file.
1 /*
2  This file is part of Rocs.
3  Copyright 2013 Andreas Cord-Landwehr <cola@uni-paderborn.de>
4 
5  This program is free software; you can redistribute it and/or
6  modify it under the terms of the GNU General Public License as
7  published by the Free Software Foundation; either version 2 of
8  the License, or (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #include "ApiDocManager.h"
20 #include "ObjectDocumentation.h"
21 #include "PropertyDocumentation.h"
22 #include "MethodDocumentation.h"
23 #include "ParameterDocumentation.h"
24 
25 #include <grantlee_core.h>
26 
27 #include <QIODevice>
28 #include <QFile>
29 #include <QPointer>
30 #include <QXmlSchema>
31 #include <QXmlSchemaValidator>
32 #include <QDomDocument>
33 
34 #include <KGlobal>
35 #include <KStandardDirs>
36 #include <KDebug>
37 #include <KUrl>
38 #include <KLocale>
39 
40 ApiDocManager::ApiDocManager(QObject *parent)
41  : QObject(parent)
42 {
43 }
44 
45 void ApiDocManager::loadLocalData()
46 {
47  QStringList apiDocFiles = KGlobal::dirs()->findAllResources("appdata", QString("engineapi/*.xml"));
48  foreach (const QString &file, apiDocFiles) {
49  loadObjectApi(KUrl::fromLocalFile(file));
50  }
51 }
52 
53 QList< ObjectDocumentation* > ApiDocManager::objectApiList() const
54 {
55  return _objectApiList;
56 }
57 
58 ObjectDocumentation * ApiDocManager::objectApi(int index) const
59 {
60  Q_ASSERT (index >= 0 && index < _objectApiList.count());
61  return _objectApiList.at(index);
62 }
63 
64 QString ApiDocManager::objectApiDocument(const QString &identifier)
65 {
66  if (_objectApiDocuments.contains(identifier)) {
67  return _objectApiDocuments.value(identifier);
68  }
69 
70  // get object API object
71  ObjectDocumentation *objectApi = 0;
72  foreach (ObjectDocumentation *obj, _objectApiList) {
73  if (obj->id() == identifier) {
74  objectApi = obj;
75  break;
76  }
77  }
78  if (!objectApi) {
79  kError() << "Could not find Object API with ID " << identifier;
80  return QString();
81  }
82 
83  // initialize Grantlee engine
84  Grantlee::Engine *engine = new Grantlee::Engine( this );
85  Grantlee::FileSystemTemplateLoader::Ptr loader = Grantlee::FileSystemTemplateLoader::Ptr(
86  new Grantlee::FileSystemTemplateLoader() );
87  loader->setTemplateDirs(KGlobal::dirs()->resourceDirs("appdata"));
88  engine->addTemplateLoader(loader);
89  Grantlee::Template t = engine->loadByName("plugin/apidoc/objectApi.html");
90  Grantlee::registerMetaType<ParameterDocumentation*>();
91 
92  // create mapping
93  QVariantHash mapping;
94 
95  // if parent object exists, find it
96  ObjectDocumentation *parentObjectApi = 0;
97  if (!objectApi->objectParent().isEmpty()) {
98  foreach (ObjectDocumentation *obj, _objectApiList) {
99  if (obj->id() == objectApi->objectParent()) {
100  parentObjectApi = obj;
101  break;
102  }
103  }
104  }
105 
106  // object
107  QVariant objectVar = QVariant::fromValue<QObject*>(objectApi);
108  mapping.insert("object", objectVar);
109 
110  // properties
111  // we use QHash to override parent properties
112  QHash<QString, QVariant> propertyList;
113  if (parentObjectApi) { // add properties from parent
114  foreach (PropertyDocumentation *property, parentObjectApi->properties()) {
115  propertyList.insert(property->name(), QVariant::fromValue<QObject*>(property));
116  }
117  }
118  foreach (PropertyDocumentation *property, objectApi->properties()) {
119  // override parent properties, if necessary
120  propertyList.insert(property->name(), QVariant::fromValue<QObject*>(property));
121  }
122  mapping.insert("properties", propertyList.values());
123 
124  // properties
125  QVariantList methodList;
126  if (parentObjectApi) {
127  foreach (MethodDocumentation *method, parentObjectApi->methods()) {
128  methodList.append(QVariant::fromValue<QObject*>(method));
129  }
130  }
131  foreach (MethodDocumentation *method, objectApi->methods()) {
132  // TODO override parent methods
133  methodList.append(QVariant::fromValue<QObject*>(method));
134  }
135  mapping.insert("methods", methodList);
136 
137  mapping.insert("i18nSyntax", i18nc("@title", "Syntax"));
138  mapping.insert("i18nProperties", i18nc("@title", "Properties"));
139  mapping.insert("i18nParameters", i18nc("@title", "Parameters"));
140  mapping.insert("i18nParameter", i18nc("@title", "Parameter"));
141  mapping.insert("i18nMethods", i18nc("@title", "Methods"));
142  mapping.insert("i18nType", i18nc("@title", "Type"));
143  mapping.insert("i18nReturnType", i18nc("@title", "Return Type"));
144  mapping.insert("i18nDetailedDescription", i18nc("@title", "Detailed Description"));
145  mapping.insert("i18nDescription", i18nc("@title", "Description"));
146 
147  Grantlee::Context c(mapping);
148 
149  // create and cache HTML file
150  _objectApiDocuments.insert(objectApi->id(), t->render(&c));
151 
152  return _objectApiDocuments.value(identifier);
153 }
154 
155 bool ApiDocManager::loadObjectApi(const KUrl &path)
156 {
157  if (!path.isLocalFile()) {
158  kWarning() << "Cannot open API file at " << path.toLocalFile() << ", aborting.";
159  return false;
160  }
161 
162  QXmlSchema schema = loadXmlSchema("engineApi");
163  if (!schema.isValid()) {
164  return false;
165  }
166 
167  QDomDocument document = loadDomDocument(path, schema);
168  if (document.isNull()) {
169  kWarning() << "Could not parse document " << path.toLocalFile() << ", aborting.";
170  return false;
171  }
172 
173  QDomElement root(document.documentElement());
174 
175  // this addition must be performed for every object before any HTML documentation page
176  // is created
177  _objectApiCache.append(root.firstChildElement("id").text());
178 
179  // create object documentation
180  ObjectDocumentation *objectApi = new ObjectDocumentation(this);
181  _objectApiList.append(objectApi);
182  emit objectApiAboutToBeAdded(objectApi, _objectApiList.count() - 1);
183 
184  objectApi->setTitle(root.firstChildElement("name").text());
185  objectApi->setId(root.firstChildElement("id").text());
186  objectApi->setComponentType(root.firstChildElement("componentType").text());
187  objectApi->setSyntaxExample(root.firstChildElement("syntax").text());
188  objectApi->setObjectParent(root.attribute("inherit"));
189  QStringList paragraphs;
190  for (QDomElement descriptionNode = root.firstChildElement("description").firstChildElement("para");
191  !descriptionNode.isNull();
192  descriptionNode = descriptionNode.nextSiblingElement())
193  {
194  paragraphs.append(i18nc("Scripting API Description", descriptionNode.text().toUtf8()));
195  }
196  objectApi->setDescription(paragraphs);
197 
198  // set property documentation
199  for (QDomElement propertyNode = root.firstChildElement("properties").firstChildElement();
200  !propertyNode.isNull();
201  propertyNode = propertyNode.nextSiblingElement())
202  {
203  PropertyDocumentation *property = new PropertyDocumentation(objectApi);
204  property->setName(propertyNode.firstChildElement("name").text());
205  property->setType(propertyNode.firstChildElement("type").text());
206 
207  QStringList paragraphs;
208  for (QDomElement descriptionNode = propertyNode.firstChildElement("description").firstChildElement("para");
209  !descriptionNode.isNull();
210  descriptionNode = descriptionNode.nextSiblingElement())
211  {
212  paragraphs.append(i18nc("Scripting API Description", descriptionNode.text().toUtf8()));
213  }
214  property->setDescription(paragraphs);
215  if (_objectApiCache.contains(property->type())) {
216  property->setTypeLink(property->type());
217  }
218 
219  objectApi->addProperty(property);
220  }
221 
222  // set method documentation
223  for (QDomElement methodNode = root.firstChildElement("methods").firstChildElement();
224  !methodNode.isNull();
225  methodNode = methodNode.nextSiblingElement())
226  {
227  MethodDocumentation *method = new MethodDocumentation(objectApi);
228  method->setName(methodNode.firstChildElement("name").text());
229  method->setReturnType(methodNode.firstChildElement("returnType").text());
230  if (_objectApiCache.contains(method->returnType())) {
231  method->setReturnTypeLink(method->returnType());
232  }
233 
234  QStringList paragraphs;
235  for (QDomElement descriptionNode = methodNode.firstChildElement("description").firstChildElement("para");
236  !descriptionNode.isNull();
237  descriptionNode = descriptionNode.nextSiblingElement())
238  {
239  paragraphs.append(i18nc("Scripting API Description", descriptionNode.text().toUtf8()));
240  }
241  method->setDescription(paragraphs);
242 
243  for (QDomElement parameterNode = methodNode.firstChildElement("parameters").firstChildElement();
244  !parameterNode.isNull();
245  parameterNode = parameterNode.nextSiblingElement())
246  {
247  QString typeLink;
248  if (_objectApiCache.contains(parameterNode.firstChildElement("type").text())) {
249  typeLink = parameterNode.firstChildElement("type").text();
250  }
251  method->addParameter(
252  parameterNode.firstChildElement("name").text(),
253  parameterNode.firstChildElement("type").text(),
254  parameterNode.firstChildElement("info").text(),
255  typeLink);
256  }
257 
258  objectApi->addMethod(method);
259  }
260 
261  emit objectApiAdded();
262  return true;
263 }
264 
265 QString ApiDocManager::apiOverviewDocument() const
266 {
267  // initialize Grantlee engine
268  Grantlee::Engine engine;
269  Grantlee::FileSystemTemplateLoader::Ptr loader = Grantlee::FileSystemTemplateLoader::Ptr(
270  new Grantlee::FileSystemTemplateLoader() );
271  loader->setTemplateDirs(KGlobal::dirs()->resourceDirs("appdata"));
272  engine.addTemplateLoader(loader);
273  Grantlee::Template t = engine.loadByName("plugin/apidoc/overview.html");
274  Grantlee::registerMetaType<ParameterDocumentation*>();
275 
276  // create mapping
277  QVariantHash mapping;
278 
279  // objects
280  QVariantList engineComponentList;
281  QVariantList dataStructureComopnentList;
282  foreach (ObjectDocumentation *object, _objectApiList) {
283  switch (object->componentType()) {
284  case ObjectDocumentation::EngineComponent:
285  engineComponentList.append(QVariant::fromValue<QObject*>(object));
286  break;
287  case ObjectDocumentation::DataStructure:
288  dataStructureComopnentList.append(QVariant::fromValue<QObject*>(object));
289  break;
290  case ObjectDocumentation::Pointer:
291  dataStructureComopnentList.append(QVariant::fromValue<QObject*>(object));
292  break;
293  case ObjectDocumentation::Data:
294  dataStructureComopnentList.append(QVariant::fromValue<QObject*>(object));
295  break;
296  }
297  }
298  mapping.insert("engineComponents", engineComponentList);
299  mapping.insert("dataStructureComponents", dataStructureComopnentList);
300 
301  // localized strings
302  mapping.insert("i18nScriptEngineApi", i18nc("@title", "Script Engine API"));
303  mapping.insert("i18nObjects", i18nc("@title", "Objects"));
304  mapping.insert("i18nDataStructures", i18nc("@title", "Data Structures"));
305  mapping.insert("i18nEngineComponents", i18nc("@title", "Script Engine Components"));
306 
307  Grantlee::Context c(mapping);
308 
309  // create HTML file
310  return t->render(&c);
311 }
312 
313 QXmlSchema ApiDocManager::loadXmlSchema(const QString &schemeName) const
314 {
315  QString relPath = QString("schemes/%1.xsd").arg(schemeName);
316  KUrl file = KUrl::fromLocalFile(KGlobal::dirs()->findResource("appdata", relPath));
317 
318  QXmlSchema schema;
319  if (schema.load(file) == false) {
320  kWarning() << "Schema at file " << file.toLocalFile() << " is invalid.";
321  }
322  return schema;
323 }
324 
325 QDomDocument ApiDocManager::loadDomDocument(const KUrl &path, const QXmlSchema &schema) const
326 {
327  QDomDocument document;
328  QXmlSchemaValidator validator(schema);
329  if (!validator.validate(path)) {
330  kWarning() << "Schema is not valid, aborting loading of XML document:" << path.toLocalFile();
331  return document;
332  }
333 
334  QString errorMsg;
335  QFile file(path.toLocalFile());
336  if (file.open(QIODevice::ReadOnly)) {
337  if (!document.setContent(&file, &errorMsg)) {
338  kWarning() << errorMsg;
339  }
340  } else {
341  kWarning() << "Could not open XML document " << path.toLocalFile() << " for reading, aborting.";
342  }
343  return document;
344 }
ObjectDocumentation::objectParent
QString objectParent() const
Definition: ObjectDocumentation.cpp:130
ObjectDocumentation
Definition: ObjectDocumentation.h:30
ObjectDocumentation.h
PropertyDocumentation
Definition: PropertyDocumentation.h:28
ApiDocManager::objectApiAdded
void objectApiAdded()
QHash::insert
iterator insert(const Key &key, const T &value)
MethodDocumentation::setName
void setName(const QString &name)
Definition: MethodDocumentation.cpp:28
ObjectDocumentation::addMethod
void addMethod(MethodDocumentation *method)
Definition: ObjectDocumentation.cpp:115
ApiDocManager::loadObjectApi
bool loadObjectApi(const KUrl &path)
Load documenation object specification from locally stored XML file.
Definition: ApiDocManager.cpp:155
ObjectDocumentation::setComponentType
void setComponentType(const QString &compenentTypeName)
Definition: ObjectDocumentation.cpp:42
ApiDocManager::objectApiDocument
QString objectApiDocument(const QString &identifier)
Generates HTML document with the API documentation for the specified object.
Definition: ApiDocManager.cpp:64
ApiDocManager::ApiDocManager
ApiDocManager(QObject *parent=0)
Definition: ApiDocManager.cpp:40
ObjectDocumentation::Data
Definition: ObjectDocumentation.h:42
QXmlSchemaValidator
ObjectDocumentation::setSyntaxExample
void setSyntaxExample(const QString &syntaxExample)
Definition: ObjectDocumentation.cpp:95
ApiDocManager::objectApiAboutToBeAdded
void objectApiAboutToBeAdded(ObjectDocumentation *, int)
QList::at
const T & at(int i) const
ObjectDocumentation::setDescription
void setDescription(const QStringList &description)
Definition: ObjectDocumentation.cpp:81
QDomDocument::documentElement
QDomElement documentElement() const
ObjectDocumentation::properties
QList< PropertyDocumentation * > properties() const
Definition: ObjectDocumentation.cpp:110
MethodDocumentation::returnType
QString returnType
Definition: MethodDocumentation.h:35
ObjectDocumentation::addProperty
void addProperty(PropertyDocumentation *property)
Definition: ObjectDocumentation.cpp:105
ObjectDocumentation::id
QString id
Definition: ObjectDocumentation.h:33
QFile
ObjectDocumentation::setTitle
void setTitle(const QString &title)
Definition: ObjectDocumentation.cpp:71
MethodDocumentation::addParameter
void addParameter(const QString &name, const QString &type, const QString &info, const QString &typeLink)
Definition: MethodDocumentation.cpp:62
QList::count
int count(const T &value) const
QList::append
void append(const T &value)
QObject::property
QVariant property(const char *name) const
ObjectDocumentation::setObjectParent
void setObjectParent(const QString &id)
Definition: ObjectDocumentation.cpp:125
ObjectDocumentation::DataStructure
Definition: ObjectDocumentation.h:40
QHash
QObject
PropertyDocumentation.h
QString::isEmpty
bool isEmpty() const
ApiDocManager::objectApiList
QList< ObjectDocumentation * > objectApiList() const
Definition: ApiDocManager.cpp:53
MethodDocumentation::setDescription
void setDescription(const QStringList &description)
Definition: MethodDocumentation.cpp:38
QString
QList< ObjectDocumentation * >
QStringList
QHash::value
const T value(const Key &key) const
ApiDocManager.h
QDomDocument
QList::contains
bool contains(const T &value) const
QDomNode::isNull
bool isNull() const
MethodDocumentation
Definition: MethodDocumentation.h:29
ObjectDocumentation::setId
void setId(const QString &id)
Definition: ObjectDocumentation.cpp:32
ParameterDocumentation.h
QXmlSchema::isValid
bool isValid() const
MethodDocumentation::setReturnType
void setReturnType(const QString &type)
Definition: MethodDocumentation.cpp:52
QDomNode::firstChildElement
QDomElement firstChildElement(const QString &tagName) const
QXmlSchema::load
bool load(const QUrl &source)
QHash::values
QList< T > values() const
PropertyDocumentation::name
QString name
Definition: PropertyDocumentation.h:31
ApiDocManager::objectApi
ObjectDocumentation * objectApi(int index) const
Definition: ApiDocManager.cpp:58
ObjectDocumentation::Pointer
Definition: ObjectDocumentation.h:41
ObjectDocumentation::componentType
ComponentType componentType() const
Definition: ObjectDocumentation.cpp:66
QHash::contains
bool contains(const Key &key) const
ObjectDocumentation::methods
QList< MethodDocumentation * > methods() const
Definition: ObjectDocumentation.cpp:120
ApiDocManager::apiOverviewDocument
QString apiOverviewDocument() const
Generates HTML document with the an overview over all available API objects.
Definition: ApiDocManager.cpp:265
QXmlSchema
QVariant::type
Type type() const
ApiDocManager::loadLocalData
void loadLocalData()
This method loads all api documentation files.
Definition: ApiDocManager.cpp:45
QDomElement
ObjectDocumentation::EngineComponent
Definition: ObjectDocumentation.h:43
MethodDocumentation::setReturnTypeLink
void setReturnTypeLink(const QString &link)
Definition: MethodDocumentation.cpp:87
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
QDomDocument::setContent
bool setContent(const QByteArray &data, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn)
QVariant
MethodDocumentation.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:16:13 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

rocs/App

Skip menu "rocs/App"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal