25 #include <grantlee_core.h>
31 #include <QXmlSchemaValidator>
32 #include <QDomDocument>
35 #include <KStandardDirs>
47 QStringList apiDocFiles = KGlobal::dirs()->findAllResources(
"appdata", QString(
"engineapi/*.xml"));
48 foreach (
const QString &file, apiDocFiles) {
55 return _objectApiList;
60 Q_ASSERT (index >= 0 && index < _objectApiList.count());
61 return _objectApiList.at(index);
66 if (_objectApiDocuments.contains(identifier)) {
67 return _objectApiDocuments.value(identifier);
73 if (obj->
id() == identifier) {
79 kError() <<
"Could not find Object API with ID " << identifier;
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*>();
100 parentObjectApi = obj;
107 QVariant objectVar = QVariant::fromValue<QObject*>(
objectApi);
108 mapping.insert(
"object", objectVar);
112 QHash<QString, QVariant> propertyList;
113 if (parentObjectApi) {
115 propertyList.insert(property->
name(), QVariant::fromValue<QObject*>(property));
120 propertyList.insert(property->
name(), QVariant::fromValue<QObject*>(property));
122 mapping.insert(
"properties", propertyList.values());
125 QVariantList methodList;
126 if (parentObjectApi) {
128 methodList.append(QVariant::fromValue<QObject*>(method));
133 methodList.append(QVariant::fromValue<QObject*>(method));
135 mapping.insert(
"methods", methodList);
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"));
147 Grantlee::Context c(mapping);
150 _objectApiDocuments.insert(objectApi->
id(), t->render(&c));
152 return _objectApiDocuments.value(identifier);
157 if (!path.isLocalFile()) {
158 kWarning() <<
"Cannot open API file at " << path.toLocalFile() <<
", aborting.";
162 QXmlSchema schema = loadXmlSchema(
"engineApi");
163 if (!schema.isValid()) {
167 QDomDocument document = loadDomDocument(path, schema);
168 if (document.isNull()) {
169 kWarning() <<
"Could not parse document " << path.toLocalFile() <<
", aborting.";
173 QDomElement root(document.documentElement());
177 _objectApiCache.append(root.firstChildElement(
"id").text());
181 _objectApiList.append(objectApi);
184 objectApi->
setTitle(root.firstChildElement(
"name").text());
185 objectApi->
setId(root.firstChildElement(
"id").text());
186 objectApi->
setComponentType(root.firstChildElement(
"componentType").text());
189 QStringList paragraphs;
190 for (QDomElement descriptionNode = root.firstChildElement(
"description").firstChildElement(
"para");
191 !descriptionNode.isNull();
192 descriptionNode = descriptionNode.nextSiblingElement())
194 paragraphs.append(i18nc(
"Scripting API Description", descriptionNode.text().toUtf8()));
199 for (QDomElement propertyNode = root.firstChildElement(
"properties").firstChildElement();
200 !propertyNode.isNull();
201 propertyNode = propertyNode.nextSiblingElement())
204 property->setName(propertyNode.firstChildElement(
"name").text());
205 property->setType(propertyNode.firstChildElement(
"type").text());
207 QStringList paragraphs;
208 for (QDomElement descriptionNode = propertyNode.firstChildElement(
"description").firstChildElement(
"para");
209 !descriptionNode.isNull();
210 descriptionNode = descriptionNode.nextSiblingElement())
212 paragraphs.append(i18nc(
"Scripting API Description", descriptionNode.text().toUtf8()));
214 property->setDescription(paragraphs);
215 if (_objectApiCache.contains(property->type())) {
216 property->setTypeLink(property->type());
223 for (QDomElement methodNode = root.firstChildElement(
"methods").firstChildElement();
224 !methodNode.isNull();
225 methodNode = methodNode.nextSiblingElement())
228 method->
setName(methodNode.firstChildElement(
"name").text());
229 method->
setReturnType(methodNode.firstChildElement(
"returnType").text());
230 if (_objectApiCache.contains(method->
returnType())) {
234 QStringList paragraphs;
235 for (QDomElement descriptionNode = methodNode.firstChildElement(
"description").firstChildElement(
"para");
236 !descriptionNode.isNull();
237 descriptionNode = descriptionNode.nextSiblingElement())
239 paragraphs.append(i18nc(
"Scripting API Description", descriptionNode.text().toUtf8()));
243 for (QDomElement parameterNode = methodNode.firstChildElement(
"parameters").firstChildElement();
244 !parameterNode.isNull();
245 parameterNode = parameterNode.nextSiblingElement())
248 if (_objectApiCache.contains(parameterNode.firstChildElement(
"type").text())) {
249 typeLink = parameterNode.firstChildElement(
"type").text();
252 parameterNode.firstChildElement(
"name").text(),
253 parameterNode.firstChildElement(
"type").text(),
254 parameterNode.firstChildElement(
"info").text(),
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*>();
277 QVariantHash mapping;
280 QVariantList engineComponentList;
281 QVariantList dataStructureComopnentList;
285 engineComponentList.append(QVariant::fromValue<QObject*>(
object));
288 dataStructureComopnentList.append(QVariant::fromValue<QObject*>(
object));
291 dataStructureComopnentList.append(QVariant::fromValue<QObject*>(
object));
294 dataStructureComopnentList.append(QVariant::fromValue<QObject*>(
object));
298 mapping.insert(
"engineComponents", engineComponentList);
299 mapping.insert(
"dataStructureComponents", dataStructureComopnentList);
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"));
307 Grantlee::Context c(mapping);
310 return t->render(&c);
313 QXmlSchema ApiDocManager::loadXmlSchema(
const QString &schemeName)
const
315 QString relPath = QString(
"schemes/%1.xsd").arg(schemeName);
316 KUrl file = KUrl::fromLocalFile(KGlobal::dirs()->findResource(
"appdata", relPath));
319 if (schema.load(file) ==
false) {
320 kWarning() <<
"Schema at file " << file.toLocalFile() <<
" is invalid.";
325 QDomDocument ApiDocManager::loadDomDocument(
const KUrl &path,
const QXmlSchema &schema)
const
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();
335 QFile file(path.toLocalFile());
336 if (file.open(QIODevice::ReadOnly)) {
337 if (!document.setContent(&file, &errorMsg)) {
338 kWarning() << errorMsg;
341 kWarning() <<
"Could not open XML document " << path.toLocalFile() <<
" for reading, aborting.";
QString objectParent() const
void setName(const QString &name)
void addMethod(MethodDocumentation *method)
bool loadObjectApi(const KUrl &path)
Load documenation object specification from locally stored XML file.
void setComponentType(const QString &compenentTypeName)
QString objectApiDocument(const QString &identifier)
Generates HTML document with the API documentation for the specified object.
ApiDocManager(QObject *parent=0)
void setSyntaxExample(const QString &syntaxExample)
void objectApiAboutToBeAdded(ObjectDocumentation *, int)
void setDescription(const QStringList &description)
QList< PropertyDocumentation * > properties() const
void addProperty(PropertyDocumentation *property)
void setTitle(const QString &title)
void addParameter(const QString &name, const QString &type, const QString &info, const QString &typeLink)
void setObjectParent(const QString &id)
QList< ObjectDocumentation * > objectApiList() const
void setDescription(const QStringList &description)
void setId(const QString &id)
void setReturnType(const QString &type)
ObjectDocumentation * objectApi(int index) const
ComponentType componentType() const
QList< MethodDocumentation * > methods() const
QString apiOverviewDocument() const
Generates HTML document with the an overview over all available API objects.
void loadLocalData()
This method loads all api documentation files.
void setReturnTypeLink(const QString &link)