QXRD  0.11.16
qcepscriptengine.cpp
Go to the documentation of this file.
1 #include "qcepscriptengine.h"
3 #include <QMetaProperty>
4 #include <QScriptValueIterator>
5 
7  QScriptEngine(parent)
8 {
9 }
10 
11 QString QcepScriptEngine::documentationLink(QString base, QString subItem)
12 {
13  QString item = base.isEmpty() ? subItem : base+"."+subItem;
14  QString res = tr("<a href=\"qrc:/help/autohelp?%1\">%2</a>").arg(item).arg(item);
15 
16  QString proto = QcepDocumentationDictionary::get_Proto(item);
17  QString doc = QcepDocumentationDictionary::get_Doc(item);
18 
19  res.append("</td>\n<td width=\"75%\">\n");
20 
21  if (proto.length()) {
22  res.append(tr("<p><i>%1</i></p>\n").arg(proto));
23  }
24 
25  if (doc.length()) {
26  res.append(tr("<p>%1</p>\n").arg(doc));
27  }
28 
29  return res;
30 }
31 
33 {
34  return
35  "<table border=\"0\" cellpadding=\"0\" cellspacing=\"1\" bgcolor=\"black\" width=\"100%\">\n"
36  "<tr>\n"
37  "<td bgcolor=\"black\">\n"
38  "<table border=\"0\" cellpadding=\"1\" cellspacing=\"1\" bgcolor=\"black\" width=\"100%\">\n";
39 }
40 
42 {
43  return
44  "</table>\n"
45  "</td>\n"
46  "</tr>\n"
47  "</table>\n";
48 }
49 
51 {
52  // QScriptValue val=QScriptEngine::evaluate("global." + item, QString(), 1);
53 
54  QScriptValue val;
55  QString prefix = "";
56  QString itemName="Global";
57 
58  if (item.isEmpty()) {
59  val = globalObject();
60  } else {
61  val = globalObject().property(item);
62  prefix = item+".";
63  itemName = item;
64  }
65 
66  QString res;
67  // QString name = val.toString();
68  QString doc = QcepDocumentationDictionary::get_Doc(item);
69  QString proto = QcepDocumentationDictionary::get_Proto(item);
70  QString longDoc = QcepDocumentationDictionary::get_LongDoc(item);
71 
72  res.append(tr("<h2>Documentation for %1</h2>\n").arg(itemName));
73 
74  if (val.isFunction()) {
75  if (proto.length()) {
76  res.append(tr("<p><i>%1</i></p>\n").arg(proto));
77  }
78 
79  if (doc.length()) {
80  res.append(tr("%1\n").arg(doc));
81  }
82 
83  if (longDoc.length()) {
84  res.append(tr("%1\n").arg(longDoc));
85  }
86  } else if (val.isObject()) {
87  res.append(tr("%1\n").arg(doc));
88  res.append(tr("%1\n").arg(longDoc));
89 
90  QObject *qobj = val.toQObject();
91 
92  if (qobj) {
93  res.append(tr("<h3>QObject class %1 name %2</h3>\n")
94  .arg(qobj->metaObject()->className())
95  .arg(qobj->objectName()));
96 
97  const QMetaObject *meta = qobj->metaObject();
98 
99  if (meta->propertyCount() > QObject::staticMetaObject.propertyCount()) {
100  res.append(tr("<h3>%1 Properties</h3>\n").arg(itemName));
101  res.append(tableHeader());
102 
103  for (int i=QObject::staticMetaObject.propertyCount();
104  i<meta->propertyCount(); i++) {
105  const char* propName = meta->property(i).name();
106  QVariant val = qobj->property(propName);
107 
108  if ((i%2)) {
109  res.append(tr("<tr bgcolor=\"#e0e0e0\">\n"));
110  } else {
111  res.append(tr("<tr bgcolor=\"white\">\n"));
112  }
113  res.append(tr("<td>%1</td><td>%2</td><td>%3</td>\n")
114  .arg(prefix+propName)
115  .arg(val.typeName())
116  .arg(val.toString()));
117 
118  QString doc = QcepDocumentationDictionary::get_Doc(prefix+propName);
119 
120  res.append(tr("<td width=\"75%\">%1</td>\n").arg(doc));
121 
122  res.append("</tr>\n");
123  }
124 
125  res.append(tableFooter());
126  }
127 
128  if (qobj->dynamicPropertyNames().count()) {
129  res.append(tr("<h3>%1 User Defined Properties</h3>\n").arg(itemName));
130  res.append(tableHeader());
131 
132  QList<QByteArray> props = qobj->dynamicPropertyNames();
133 
134  for (int i=0; i<props.count(); i++) {
135  QString propName = props[i];
136  QVariant val = qobj->property(qPrintable(propName));
137 
138  if ((i%2)) {
139  res.append(tr("<tr bgcolor=\"#e0e0e0\">\n"));
140  } else {
141  res.append(tr("<tr bgcolor=\"white\">\n"));
142  }
143 
144  res.append(tr("<td>%1</td><td>%2</td><td>%3</td>\n")
145  .arg(prefix+propName)
146  .arg(val.typeName())
147  .arg(val.toString()));
148 
149  QString doc = QcepDocumentationDictionary::get_Doc(prefix+propName);
150 
151  res.append(tr("<td width=\"75%\">%1</td>\n").arg(doc));
152 
153  res.append("</tr>\n");
154  }
155 
156  res.append(tableFooter());
157  }
158 
159  if (meta->methodCount() > QObject::staticMetaObject.methodCount()) {
160  res.append(tr("<h3>%1 Functions</h3>\n").arg(itemName));
161  res.append(tableHeader());
162 
163  for (int i=QObject::staticMetaObject.methodCount();
164  i<meta->methodCount(); i++) {
165 #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
166  QByteArray methodSig = meta->method(i).methodSignature();
167 #else
168  const char* methodSig = meta->method(i).signature();
169 #endif
170  const char* returnType = meta->method(i).typeName();
171  QByteArray methodName = meta->method(i).name();
172 
173  QMetaMethod::MethodType methodType = meta->method(i).methodType();
174 
175  if ((i%2)) {
176  res.append(tr("<tr bgcolor=\"#e0e0e0\">\n"));
177  } else {
178  res.append(tr("<tr bgcolor=\"white\">\n"));
179  }
180 
181  QList<QByteArray> parameterTypes = meta->method(i).parameterTypes();
182  QList<QByteArray> parameterNames = meta->method(i).parameterNames();
183 
184  QString parameterPack = "";
185 
186  for (int i=0; i<parameterTypes.count(); i++) {
187  if (i!=0) {
188  parameterPack += ", ";
189  }
190  parameterPack += parameterTypes.value(i) + " " + parameterNames.value(i);
191  }
192 
193  QString prototype = tr("%1 %2%3(%4)")
194  .arg(returnType)
195  .arg(QString(prefix))
196  .arg(QString(methodName))
197  .arg(parameterPack);
198 
199  prototype.replace(QString("&"), QString("&amp;"));
200  prototype.replace(QString("\""), QString("&quot;"));
201  prototype.replace(QString("'"), QString("&#039;"));
202  prototype.replace(QString("<"), QString("&lt;"));
203  prototype.replace(QString(">"), QString("&gt;"));
204 
205  res.append(tr("<td><i>%1</i></td>\n").arg(prototype));
206 
207  QString proto = QcepDocumentationDictionary::get_Proto(methodSig);
208  QString doc = QcepDocumentationDictionary::get_Doc(methodSig);
209 
210  res.append("<td>");
211  switch (methodType) {
212  case QMetaMethod::Signal:
213  res.append("<i>Signal</i><br/>\n");
214  break;
215  case QMetaMethod::Slot:
216  res.append("<i>Slot</i><br/>\n");
217  break;
218  default:
219  break;
220  }
221 
222  res.append(tr("%1<br/>\n").arg(proto));
223  res.append(tr("%1</td>\n").arg(doc));
224 
225  res.append(tr("</tr>\n"));
226  }
227 
228  res.append(tableFooter());
229  }
230  } else {
231  QScriptValueIterator iter(val);
232 
233  QMap<QString, QScriptValue> subObjects, properties, functions;
234 
235  while (iter.hasNext()) {
236  iter.next();
237 
238  QScriptValue v = iter.value();
239  QString n = iter.name();
240 
241  if (v.isFunction()) {
242  functions.insert(n, v);
243  } else if (v.isObject()) {
244  subObjects.insert(n, v);
245  } else {
246  properties.insert(n, v);
247  }
248  }
249 
250  if (subObjects.count()) {
251  QMapIterator<QString,QScriptValue> obj_iter(subObjects);
252 
253  res.append(tr("<h3>%1 Objects</h3>\n").arg(itemName));
254  res.append(tableHeader());
255 
256  int i=0;
257 
258  while (obj_iter.hasNext()) {
259  obj_iter.next();
260 
261  if ((i++%2)) {
262  res.append(tr("<tr bgcolor=\"#e0e0e0\">\n"));
263  } else {
264  res.append(tr("<tr bgcolor=\"white\">\n"));
265  }
266  res.append(tr("<td>%1</td>").arg(documentationLink(item, obj_iter.key())));
267  res.append(tr("</tr>\n"));
268  }
269 
270  res.append(tableFooter());
271  }
272 
273  if (properties.count()) {
274  QMapIterator<QString,QScriptValue> prop_iter(properties);
275 
276  res.append(tr("<h3>%1 Properties</h3>\n").arg(itemName));
277  res.append(tableHeader());
278 
279  int i=0;
280 
281  while (prop_iter.hasNext()) {
282  prop_iter.next();
283 
284  if ((i++%2)) {
285  res.append(tr("<tr bgcolor=\"#e0e0e0\">\n"));
286  } else {
287  res.append(tr("<tr bgcolor=\"white\">\n"));
288  }
289  res.append(tr("<td>%1</td>").arg(documentationLink(item, prop_iter.key())));
290  res.append(tr("</tr>\n"));
291  }
292 
293  res.append(tableFooter());
294  }
295 
296  if (functions.count()) {
297  QMapIterator<QString,QScriptValue> func_iter(functions);
298 
299  res.append(tr("<h3>%1 Functions</h3>\n").arg(itemName));
300  res.append(tableHeader());
301 
302  int i=0;
303 
304  while (func_iter.hasNext()) {
305  func_iter.next();
306 
307  if ((i++%2)) {
308  res.append(tr("<tr bgcolor=\"#e0e0e0\">\n"));
309  } else {
310  res.append(tr("<tr bgcolor=\"white\">\n"));
311  }
312  res.append(tr("<td>%1</td>").arg(documentationLink(item, func_iter.key())));
313  res.append(tr("</tr>\n"));
314  }
315 
316  res.append(tableFooter());
317  }
318  }
319  }
320 
321  return res;
322 }
323 
324 QString QcepScriptEngine::documentationText(QRegExp pattern)
325 {
326  QString res="";
327 
328  QHashIterator<QString, QString> iter(QcepDocumentationDictionary::docs());
329 
330  while (iter.hasNext()) {
331  iter.next();
332  if (pattern.exactMatch(iter.key())) {
333  res.append(documentationText(iter.key()));
334  }
335  }
336 
337  return res;
338 }
339 
340 QByteArray QcepScriptEngine::helpText(QString item)
341 {
342  QString scriptItem;
343 
344  scriptItem = item;
345 
346  QByteArray res;
347 
348  res.append(
349  "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"
350  "<html>\n"
351  " <head>\n"
352  " <title>qxrd help</title>\n"
353  " </head>\n"
354  "\n"
355  " <body>\n");
356 
357  res.append(documentationText(scriptItem));
358 
359  res.append(
360  " </body>\n"
361  "</html>\n");
362 
363  return res;
364 }
365 
static QString get_Doc(QString name)
QString documentationText(QString item)
QcepScriptEngine(QObject *parent=0)
static QString get_LongDoc(QString name)
static QString get_Proto(QString name)
QByteArray helpText(QString item)
static QHash< QString, QString > docs()
QString documentationLink(QString base, QString subItem)