qdoc: Update qdoc to use QML spec for DITA
authorMartin Smith <martin.smith@nokia.com>
Mon, 23 Apr 2012 10:41:16 +0000 (12:41 +0200)
committerQt by Nokia <qt-info@nokia.com>
Mon, 23 Apr 2012 17:20:19 +0000 (19:20 +0200)
qdoc now generates DITA XML from QML docs according
to the QML specialization.

Change-Id: I51d93c2ab3b1deefab9bbedcd2e752f49648809f
Reviewed-by: Casper van Donderen <casper.vandonderen@nokia.com>
src/tools/qdoc/ditaxmlgenerator.cpp
src/tools/qdoc/ditaxmlgenerator.h
src/tools/qdoc/generator.cpp
src/tools/qdoc/generator.h

index 9c85e7b..73913d3 100644 (file)
@@ -70,9 +70,15 @@ QString DitaXmlGenerator::ditaTags[] =
 {
     "",
     "alt",
+    "apiData",
+    "apiDef",
+    "apiDefItem",
     "apiDesc",
+    "apiDetail",
+    "apiItemName",
     "APIMap",
     "apiName",
+    "apiRef",
     "apiRelation",
     "audience",
     "author",
@@ -215,6 +221,21 @@ QString DitaXmlGenerator::ditaTags[] =
     "prodname",
     "prolog",
     "publisher",
+    "qmlData",
+    "qmlDef",
+    "qmlDefItem",
+    "qmlDesc",
+    "qmlDetail",
+    "qmlItemName",
+    "qmlMethod",
+    "qmlName",
+    "qmlProperty",
+    "qmlPropertyGroup",
+    "qmlQualifier",
+    "qmlSignal",
+    "qmlSignalHandler",
+    "qmlSignature",
+    "qmlType",
     "related-links",
     "resourceid",
     "revised",
@@ -335,18 +356,18 @@ DitaXmlGenerator::DitaTag DitaXmlGenerator::currentTag()
 }
 
 /*!
-  Write the start tag \c{<apiDesc>}. if \a title is not
-  empty, generate a GUID from it and write the GUID as the
-  value of the \e{id} attribute.
+  Write the start \a tag. if \a title is not empty, generate
+  a GUID from it and write the GUID as the value of the \e{id}
+  attribute.
 
   Then if \a outputclass is not empty, write it as the value
   of the \a outputclass attribute.
 
   Fiunally, set the section nesting level to 1 and return 1.
  */
-int DitaXmlGenerator::enterApiDesc(const QString& outputclass, const QString& title)
+int DitaXmlGenerator::enterDesc(DitaTag tag, const QString& outputclass, const QString& title)
 {
-    writeStartTag(DT_apiDesc);
+    writeStartTag(tag);
     if (!title.isEmpty()) {
         writeGuidAttribute(title);
         //Are there cases where the spectitle is required?
@@ -1801,7 +1822,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
         writeLocation(nsn);
         writeEndTag(); // <cxxClassDefinition>
 
-        enterApiDesc(QString(),title);
+        enterDesc(DT_apiDesc,QString(),title);
 #if 0
         // To be removed, if really not needed.
         Text brief = nsn->doc().briefText(); // zzz
@@ -1937,7 +1958,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
         writeLocation(cn);
         writeEndTag(); // <cxxClassDefinition>
 
-        enterApiDesc(QString(),title);
+        enterDesc(DT_apiDesc,QString(),title);
 #if 0
         // To be removed, if really not needed.
         Text brief = cn->doc().briefText(); // zzz
@@ -2063,7 +2084,7 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
         writeProlog(inner);
 
         writeStartTag(DT_cxxClassDetail);
-        enterApiDesc(QString(),title);
+        enterDesc(DT_apiDesc,QString(),title);
 #if 0
         // To be removed, if really not needed.
         Text brief = fn->doc().briefText(); // zzz
@@ -2177,15 +2198,19 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
         rawTitle = marker->plainName(inner);
         fullTitle = marker->plainFullName(inner);
         title = rawTitle + " Element";
-        //QString fullTitle = fake->fullTitle();
-        //QString htmlTitle = fullTitle;
 
         generateHeader(inner, fullTitle);
         generateBrief(inner, marker); // <shortdesc>
         writeProlog(inner);
 
-        writeStartTag(DT_cxxClassDetail);
-        enterApiDesc(QString(),title);
+        writeStartTag(DT_qmlDetail);
+        generateQmlModuleDef(qcn);
+        generateQmlInherits(qcn,marker);
+        generateQmlInstantiates(qcn,marker);
+        generateQmlInheritedBy(qcn, marker);
+        generateQmlSince(qcn);
+
+        enterDesc(DT_qmlDesc,QString(),title);
 #if 0
         // To be removed, if really not needed.
         Text brief = qcn->doc().briefText(); // zzz
@@ -2195,10 +2220,6 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
             writeEndTag(); // </p>
         }
 #endif
-        generateQmlInstantiates(qcn, marker);
-        generateQmlInherits(qcn, marker);
-        generateQmlInheritedBy(qcn, marker);
-        generateSince(qcn, marker);
         enterSection("","");
         generateBody(qcn, marker);
         if (cn) {
@@ -2206,43 +2227,14 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
             generateAlsoList(cn, marker);
         }
         leaveSection();
-        leaveSection(); // </apiDesc>
-
-        QList<Section> summarySections;
-        summarySections = marker->qmlSections(qcn,CodeMarker::Summary);
-        if (!summarySections.isEmpty()) {
-            enterSection("redundant",QString());
-            s = summarySections.begin();
-            while (s != summarySections.end()) {
-                QString attr;
-                if (!s->members.isEmpty()) {
-                    writeStartTag(DT_p);
-                    attr = cleanRef((*s).name).toLower() + " h2";
-                    xmlWriter().writeAttribute("outputclass",attr);
-                    writeCharacters(protectEnc((*s).name));
-                    writeEndTag(); // </p>
-                    generateQmlSummary(*s,qcn,marker);
-                    //generateSection(s->members, inner, marker, CodeMarker::Summary);
-                    //generateSectionInheritedList(*s, inner, marker);
-                }
-                ++s;
-            }
-            leaveSection();
-        }
+        leaveSection(); // </qmlDesc>
+        writeEndTag(); // </qmlTypeDetail>
 
-        QList<Section> detailSections;
-        detailSections = marker->qmlSections(qcn,CodeMarker::Detailed);
-        if (!detailSections.isEmpty()) {
-            enterSection("details",QString());
-            s = detailSections.begin();
-            while (s != detailSections.end()) {
+        QList<Section> members = marker->qmlSections(qcn,CodeMarker::Detailed);
+        if (!members.isEmpty()) {
+            s = members.begin();
+            while (s != members.end()) {
                 if (!s->members.isEmpty()) {
-                    QString attr;
-                    writeStartTag(DT_p);
-                    attr = cleanRef((*s).name).toLower() + " h2";
-                    xmlWriter().writeAttribute("outputclass",attr);
-                    writeCharacters(protectEnc((*s).name));
-                    writeEndTag(); // </p>
                     NodeList::ConstIterator m = (*s).members.begin();
                     while (m != (*s).members.end()) {
                         generateDetailedQmlMember(*m, qcn, marker);
@@ -2251,14 +2243,11 @@ DitaXmlGenerator::generateClassLikeNode(InnerNode* inner, CodeMarker* marker)
                 }
                 ++s;
             }
-            leaveSection();
         }
-        writeEndTag(); // </cxxClassDetail>
-        writeEndTag(); // </cxxClass>
+        writeEndTag(); // </apiRef>
     }
 }
 
-
 /*!
   Write a list item for a \a link with the given \a text.
  */
@@ -2491,14 +2480,14 @@ void DitaXmlGenerator::generateHeader(const Node* node,
             outputclass = "headerfile";
         }
         else if (node->subType() == Node::QmlClass) {
-            mainTag = DT_cxxClass;
+            mainTag = DT_qmlType;
             nameTag = DT_apiName;
-            dtd = "dtd/cxxClass.dtd";
-            version = "0.7.0";
+            dtd = "dtd/qmlType.dtd";
+            version = "0.1.0";
             doctype = "<!DOCTYPE " + ditaTags[mainTag] +
-                    " PUBLIC \"-//NOKIA//DTD DITA C++ API Class Reference Type v" +
+                    " PUBLIC \"-//NOKIA//DTD DITA QML API Type Reference v" +
                     version + "//EN\" \"" + dtd + "\">";
-            outputclass = "QML-class";
+            outputclass = "QML-type";
         }
         else {
             mainTag = DT_topic;
@@ -4430,6 +4419,44 @@ void DitaXmlGenerator::generateQmlSummary(const Section& section,
 }
 
 /*!
+  Writes the QML property \a qpn to the current DITA XML file.
+  Assumes that the correct start tag has already been written,
+  but nothing has been written inside that tag. This function
+  begins by writing the GUID id attribute for the property.
+ */
+void DitaXmlGenerator::startQmlProperty(QmlPropertyNode* qpn,
+                                        const InnerNode* relative,
+                                        CodeMarker* marker)
+{
+    writeStartTag(DT_qmlProperty);
+    writeGuidAttribute((Node*)qpn);
+    writeStartTag(DT_apiName);
+    writeCharacters(qpn->name());
+    writeEndTag(); // </apiName>
+    generateBrief(qpn, marker); // <shortdesc>
+    writeStartTag(DT_qmlDetail);
+    writeStartTag(DT_qmlDef);
+    if (!qpn->isReadOnlySet())
+        qpn->setReadOnly(!qpn->isWritable(tree_));
+    if (qpn->isReadOnly()) {
+        writeStartTag(DT_qmlQualifier);
+        xmlWriter().writeAttribute("name","read-only");
+        xmlWriter().writeAttribute("value","read-only");
+        writeEndTag(); // </qmlQualifier>
+    }
+    if (qpn->isDefault()) {
+        writeStartTag(DT_qmlQualifier);
+        xmlWriter().writeAttribute("name","default");
+        xmlWriter().writeAttribute("value","default");
+        writeEndTag(); // </qmlQualifier>
+    }
+    writeStartTag(DT_apiData);
+    generateQmlItem(qpn, relative, marker, false);
+    writeEndTag(); // </apiData>
+    writeEndTag(); // </qmlDef>
+}
+
+/*!
   Outputs the DITA detailed documentation for a section
   on a QML element reference page.
  */
@@ -4439,71 +4466,54 @@ void DitaXmlGenerator::generateDetailedQmlMember(Node* node,
 {
     QString marked;
     QmlPropertyNode* qpn = 0;
+
     if (node->subType() == Node::QmlPropertyGroup) {
         const QmlPropGroupNode* qpgn = static_cast<const QmlPropGroupNode*>(node);
         NodeList::ConstIterator p = qpgn->childNodes().begin();
-        writeStartTag(DT_ul);
-        while (p != qpgn->childNodes().end()) {
-            if ((*p)->type() == Node::QmlProperty) {
-                qpn = static_cast<QmlPropertyNode*>(*p);
-                writeStartTag(DT_li);
-                writeGuidAttribute((Node*)qpn);
-                QString attr;
-                if (!qpn->isReadOnlySet())
-                    qpn->setReadOnly(!qpn->isWritable(tree_));
-                if (qpn->isReadOnly())
-                    attr = "read-only";
-                if (qpn->isDefault()) {
-                    if (!attr.isEmpty())
-                        attr += QLatin1Char(' ');
-                    attr += "default";
+        if (qpgn->childNodes().size() == 1) {
+            qpn = static_cast<QmlPropertyNode*>(*p);
+            startQmlProperty(qpn,relative,marker);
+            writeQmlDesc(node, marker);
+            writeEndTag(); // </qmlDetail>
+            writeEndTag(); // </qmlProperty>
+        }
+        else {
+            writeStartTag(DT_qmlPropertyGroup);
+            writeStartTag(DT_apiName);
+            writeCharacters("...");
+            writeEndTag(); // </apiName>
+            writeStartTag(DT_qmlDetail);
+            writeQmlDesc(node, marker);
+            writeEndTag(); // </qmlDetail>
+            while (p != qpgn->childNodes().end()) {
+                if ((*p)->type() == Node::QmlProperty) {
+                    qpn = static_cast<QmlPropertyNode*>(*p);
+                    startQmlProperty(qpn,relative,marker);
+                    writeEndTag(); // </qmlDetail>
+                    writeEndTag(); // </qmlProperty>
                 }
-                if (!attr.isEmpty())
-                    xmlWriter().writeAttribute("outputclass",attr);
-                generateQmlItem(qpn, relative, marker, false);
-                writeEndTag(); // </li>
+                ++p;
             }
-            ++p;
+            writeEndTag(); // </qmlPropertyGroup
         }
-        writeEndTag(); // </ul>
     }
     else if (node->type() == Node::QmlProperty) {
         qpn = static_cast<QmlPropertyNode*>(node);
-        /*
-          If the QML property node has a single subproperty,
-          override, replace qpn with that override node and
-          proceed as normal.
-         */
-        if (qpn->qmlPropNodes().size() == 1) {
+        if (qpn->qmlPropNodes().isEmpty()) {
+            startQmlProperty(qpn,relative,marker);
+            writeQmlDesc(node, marker);
+            writeEndTag(); // </qmlDetail>
+            writeEndTag(); // </qmlProperty>
+        }
+        else if (qpn->qmlPropNodes().size() == 1) {
             Node* n = qpn->qmlPropNodes().at(0);
-            if (n->type() == Node::QmlProperty)
+            if (n->type() == Node::QmlProperty) {
                 qpn = static_cast<QmlPropertyNode*>(n);
-        }
-        /*
-          Now qpn either has no overrides, or it has more
-          than 1. If it has none, proceed to output as nortmal.
-         */
-        if (qpn->qmlPropNodes().isEmpty()) {
-            writeStartTag(DT_ul);
-            writeStartTag(DT_li);
-            writeGuidAttribute((Node*)qpn);
-            QString attr;
-            if (!qpn->isReadOnlySet()) {
-                if (qpn->declarativeCppNode())
-                    qpn->setReadOnly(!qpn->isWritable(tree_));
-            }
-            if (qpn->isReadOnly())
-                attr = "read-only";
-            if (qpn->isDefault()) {
-                if (!attr.isEmpty())
-                    attr += QLatin1Char(' ');
-                attr += "default";
-            }
-            if (!attr.isEmpty())
-                xmlWriter().writeAttribute("outputclass",attr);
-            generateQmlItem(qpn, relative, marker, false);
-            writeEndTag(); // </li>
-            writeEndTag(); // </ul>
+                startQmlProperty(qpn,relative,marker);
+                writeQmlDesc(node, marker);
+                writeEndTag(); // </qmlDetail>
+                writeEndTag(); // </qmlProperty>
+            }
         }
         else {
             /*
@@ -4511,68 +4521,93 @@ void DitaXmlGenerator::generateDetailedQmlMember(Node* node,
               Process the whole list as we would for a QML property
               group.
              */
+            writeStartTag(DT_qmlPropertyGroup);
+            writeStartTag(DT_apiName);
+            writeCharacters("...");
+            writeEndTag(); // </apiName>
+            writeStartTag(DT_qmlDetail);
+            writeQmlDesc(node, marker);
+            writeEndTag(); // </qmlDetail>
             NodeList::ConstIterator p = qpn->qmlPropNodes().begin();
-            writeStartTag(DT_ul);
             while (p != qpn->qmlPropNodes().end()) {
                 if ((*p)->type() == Node::QmlProperty) {
                     QmlPropertyNode* q = static_cast<QmlPropertyNode*>(*p);
-                    writeStartTag(DT_li);
-                    writeGuidAttribute((Node*)q);
-                    QString attr;
-                    if (!qpn->isReadOnlySet())
-                        qpn->setReadOnly(!qpn->isWritable(tree_));
-                    if (qpn->isReadOnly())
-                        attr = "read-only";
-                    if (qpn->isDefault()) {
-                        if (!attr.isEmpty())
-                            attr += QLatin1Char(' ');
-                        attr += "default";
-                    }
-                    if (!attr.isEmpty())
-                        xmlWriter().writeAttribute("outputclass",attr);
-                    generateQmlItem(q, relative, marker, false);
-                    writeEndTag(); // </li>
+                    startQmlProperty(q,relative,marker);
+                    writeEndTag(); // </qmlDetail>
+                    writeEndTag(); // </qmlProperty>
                 }
                 ++p;
             }
-            writeEndTag(); // </ul>
+            writeEndTag(); // </qmlPropertyGroup
         }
     }
-    else if (node->type() == Node::QmlSignal) {
-        Node* n = const_cast<Node*>(node);
-        writeStartTag(DT_ul);
-        writeStartTag(DT_li);
-        writeGuidAttribute(n);
-        marked = getMarkedUpSynopsis(n, relative, marker, CodeMarker::Detailed);
-        writeText(marked, marker, relative);
-        writeEndTag(); // </li>
-        writeEndTag(); // </ul>
-    }
-    else if (node->type() == Node::QmlSignalHandler) {
-        Node* n = const_cast<Node*>(node);
-        writeStartTag(DT_ul);
-        writeStartTag(DT_li);
-        writeGuidAttribute(n);
-        marked = getMarkedUpSynopsis(n, relative, marker, CodeMarker::Detailed);
-        writeText(marked, marker, relative);
-        writeEndTag(); // </li>
-        writeEndTag(); // </ul>
-    }
-    else if (node->type() == Node::QmlMethod) {
-        Node* n = const_cast<Node*>(node);
-        writeStartTag(DT_ul);
-        writeStartTag(DT_li);
-        writeGuidAttribute(n);
-        marked = getMarkedUpSynopsis(n, relative, marker, CodeMarker::Detailed);
-        writeText(marked, marker, relative);
-        writeEndTag(); // </li>
-        writeEndTag(); // </ul>
-    }
+    else if (node->type() == Node::QmlSignal)
+        writeQmlRef(DT_qmlSignal,node,relative,marker);
+    else if (node->type() == Node::QmlSignalHandler)
+        writeQmlRef(DT_qmlSignalHandler,node,relative,marker);
+    else if (node->type() == Node::QmlMethod)
+        writeQmlRef(DT_qmlMethod,node,relative,marker);
+}
+
+/*!
+  Outputs the DITA detailed documentation for a section
+  on a QML element reference page.
+ */
+void DitaXmlGenerator::writeQmlRef(DitaTag tag,
+                                   Node* node,
+                                   const InnerNode* relative,
+                                   CodeMarker* marker)
+{
+    writeStartTag(tag);
+    Node* n = const_cast<Node*>(node);
+    writeGuidAttribute(n);
+    writeStartTag(DT_apiName);
+    writeCharacters(n->name());
+    writeEndTag(); // </apiName>
+    writeStartTag(DT_qmlDetail);
+    writeStartTag(DT_qmlDef);
+    writeStartTag(DT_apiData);
+    QString marked = getMarkedUpSynopsis(n, relative, marker, CodeMarker::Detailed);
+    writeText(marked, marker, relative);
+    writeEndTag(); // </apiData>
+    writeEndTag(); // </qmlDef>
+    writeQmlDesc(node, marker);
+    writeEndTag(); // </qmlDetail>
+    writeEndTag(); // tag
+}
+
+/*!
+  Writes the <qmlDesc> tag and its contents for the \a node.
+  The \a marker is used for markeing up the text body.
+ */
+void DitaXmlGenerator::writeQmlDesc(Node* node, CodeMarker* marker)
+{
+    writeStartTag(DT_qmlDesc);
     generateStatus(node, marker);
     generateBody(node, marker);
     generateThreadSafeness(node, marker);
     generateSince(node, marker);
     generateAlsoList(node, marker);
+    writeEndTag(); // </qmlDesc>
+}
+
+/*!
+  This generates an <apiDef> (actually <qmlDef>) in which the
+  QML module name and version number are specified.
+ */
+void DitaXmlGenerator::generateQmlModuleDef(QmlClassNode* qcn)
+{
+    writeStartTag(DT_qmlDef);
+    xmlWriter().writeAttribute("outputclass","import");
+    writeStartTag(DT_qmlItemName);
+    xmlWriter().writeAttribute("outputclass","module");
+    writeCharacters(qcn->qmlModuleName());
+    writeEndTag(); // </qmlItemName>
+    writeStartTag(DT_qmlData);
+    xmlWriter().writeAttribute("outputclass","version");
+    writeCharacters(qcn->qmlModuleVersion());
+    writeEndTag(); // </qmlData>
+    writeEndTag(); // </qmlDef>
 }
 
 /*!
@@ -4585,17 +4620,40 @@ void DitaXmlGenerator::generateQmlInherits(const QmlClassNode* qcn, CodeMarker*
         return;
     const FakeNode* base = qcn->qmlBase();
     if (base) {
-        writeStartTag(DT_p);
+        writeStartTag(DT_qmlDef);
         xmlWriter().writeAttribute("outputclass","inherits");
+        writeStartTag(DT_qmlData);
         Text text;
-        text << "[Inherits ";
         text << Atom(Atom::LinkNode,CodeMarker::stringForNode(base));
         text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK);
         text << Atom(Atom::String, base->name());
         text << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK);
-        text << "]";
         generateText(text, qcn, marker);
-        writeEndTag(); // </p>
+        writeEndTag(); // </qmlData>
+        writeEndTag(); // </qmlDef>
+    }
+}
+
+/*!
+  Output the "Inherit by" list for the QML element,
+  if it is inherited by any other elements.
+ */
+void DitaXmlGenerator::generateQmlInheritedBy(const QmlClassNode* qcn, CodeMarker* marker)
+{
+    if (qcn) {
+        NodeList subs;
+        QmlClassNode::subclasses(qcn->name(),subs);
+        if (!subs.isEmpty()) {
+            writeStartTag(DT_qmlDef);
+            xmlWriter().writeAttribute("outputclass","inherited-by");
+            writeStartTag(DT_qmlData);
+            Text text;
+            appendSortedQmlNames(text,qcn,subs,marker);
+            text << Atom::ParaRight;
+            generateText(text, qcn, marker);
+            writeEndTag(); // </qmlData>
+            writeEndTag(); // </qmlDef>
+        }
     }
 }
 
@@ -4610,22 +4668,32 @@ void DitaXmlGenerator::generateQmlInstantiates(QmlClassNode* qcn, CodeMarker* ma
 {
     ClassNode* cn = qcn->classNode();
     if (cn && (cn->status() != Node::Internal)) {
-        writeStartTag(DT_p);
-        xmlWriter().writeAttribute("outputclass","instantiates");
+        writeStartTag(DT_qmlDef);
+        xmlWriter().writeAttribute("outputclass","instantiates-cpp-class");
+        writeStartTag(DT_qmlData);
         Text text;
-        text << "[";
-        text << Atom(Atom::LinkNode,CodeMarker::stringForNode(qcn));
-        text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK);
-        text << Atom(Atom::String, qcn->name());
-        text << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK);
-        text << " instantiates the C++ class ";
         text << Atom(Atom::LinkNode,CodeMarker::stringForNode(cn));
         text << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK);
         text << Atom(Atom::String, cn->name());
         text << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK);
-        text << "]";
         generateText(text, qcn, marker);
-        writeEndTag(); // </p>
+        writeEndTag(); // </qmlData>
+        writeEndTag(); // </qmlDef>
+    }
+}
+
+/*!
+  Generate a <qmlDef> for the "since" version string, if there is one.
+ */
+void DitaXmlGenerator::generateQmlSince(const Node* node)
+{
+    if (!node->since().isEmpty()) {
+        writeStartTag(DT_qmlDef);
+        xmlWriter().writeAttribute("outputclass","since");
+        writeStartTag(DT_qmlData);
+        writeCharacters(node->since());
+        writeEndTag(); // </qmlData>
+        writeEndTag(); // </qmlDef>
     }
 }
 
@@ -4822,6 +4890,8 @@ void DitaXmlGenerator::writeFunctions(const Section& s,
         if ((*m)->type() == Node::Function) {
             FunctionNode* fn = const_cast<FunctionNode*>(static_cast<const FunctionNode*>(*m));
             writeStartTag(DT_cxxFunction);
+            if (outFileName() == "qgeoboundingbox.dita" && fn->guid() == "id-operator-")
+                qDebug() << "ID:" << fn->guid() << fn->name();
             xmlWriter().writeAttribute("id",fn->guid());
             if (fn->metaness() == FunctionNode::Signal)
                 xmlWriter().writeAttribute("otherprops","signal");
@@ -5593,7 +5663,7 @@ void DitaXmlGenerator::writeApiDesc(const Node* node,
 {
     if (!node->doc().isEmpty()) {
         inDetailedDescription = true;
-        enterApiDesc(QString(),title);
+        enterDesc(DT_apiDesc,QString(),title);
         generateBody(node, marker);
         generateAlsoList(node, marker);
         leaveSection();
index 2ced0e0..a9b162d 100644 (file)
@@ -79,9 +79,15 @@ public:
     enum DitaTag {
         DT_NONE,
         DT_alt,
+        DT_apiData,
+        DT_apiDef,
+        DT_apiDefItem,
         DT_apiDesc,
+        DT_apiDetail,
+        DT_apiItemName,
         DT_APIMap,
         DT_apiName,
+        DT_apiRef,
         DT_apiRelation,
         DT_audience,
         DT_author,
@@ -224,6 +230,21 @@ public:
         DT_prodname,
         DT_prolog,
         DT_publisher,
+        DT_qmlData,
+        DT_qmlDef,
+        DT_qmlDefItem,
+        DT_qmlDesc,
+        DT_qmlDetail,
+        DT_qmlItemName,
+        DT_qmlMethod,
+        DT_qmlName,
+        DT_qmlProperty,
+        DT_qmlPropertyGroup,
+        DT_qmlQualifier,
+        DT_qmlSignal,
+        DT_qmlSignalHandler,
+        DT_qmlSignature,
+        DT_qmlType,
         DT_relatedLinks,
         DT_resourceid,
         DT_revised,
@@ -377,12 +398,23 @@ private:
                          const Node* relative,
                          CodeMarker* marker,
                          bool summary);
+    void startQmlProperty(QmlPropertyNode* qpn,
+                          const InnerNode* relative,
+                          CodeMarker* marker);
+    void writeQmlRef(DitaTag tag,
+                     Node* node,
+                     const InnerNode* relative,
+                     CodeMarker* marker);
+    void writeQmlDesc(Node* node, CodeMarker* marker);
     void generateDetailedQmlMember(Node* node,
                                    const InnerNode* relative,
                                    CodeMarker* marker);
     void generateQmlInherits(const QmlClassNode* qcn, CodeMarker* marker);
+    void generateQmlInheritedBy(const QmlClassNode* qcn, CodeMarker* marker);
     void generateQmlInstantiates(QmlClassNode* qcn, CodeMarker* marker);
     void generateInstantiatedBy(ClassNode* cn, CodeMarker* marker);
+    void generateQmlModuleDef(QmlClassNode* qcn);
+    void generateQmlSince(const Node* node);
 
     void generateSection(const NodeList& nl,
                          const Node* relative,
@@ -446,7 +478,7 @@ private:
     bool writeEndTag(DitaTag t=DT_NONE);
     DitaTag currentTag();
     void clearSectionNesting() { sectionNestingLevel = 0; }
-    int enterApiDesc(const QString& outputclass, const QString& title);
+    int enterDesc(DitaTag tag, const QString& outputclass, const QString& title);
     int enterSection(const QString& outputclass, const QString& title);
     int leaveSection();
     bool inSection() const { return (sectionNestingLevel > 0); }
index 16f84bb..fb08c7e 100644 (file)
@@ -953,8 +953,7 @@ void Generator::generateFileList(const FakeNode* fake,
         generateText(text, fake, marker);
 }
 
-void Generator::generateInheritedBy(const ClassNode *classe,
-                                    CodeMarker *marker)
+void Generator::generateInheritedBy(const ClassNode *classe, CodeMarker *marker)
 {
     if (!classe->derivedClasses().isEmpty()) {
         Text text;
@@ -1087,7 +1086,6 @@ void Generator::generateMaintainerList(const InnerNode* node, CodeMarker* marker
     }
 }
 
-#ifdef QDOC_QML
 /*!
   Output the "Inherit by" list for the QML element,
   if it is inherited by any other elements.
@@ -1107,18 +1105,14 @@ void Generator::generateQmlInheritedBy(const QmlClassNode* qcn,
         }
     }
 }
-#endif
 
-#ifdef QDOC_QML
 /*!
  */
 void Generator::generateQmlInherits(const QmlClassNode* , CodeMarker* )
 {
     // stub.
 }
-#endif
 
-#ifdef QDOC_QML
 /*!
   Extract sections of markup text surrounded by \e qmltext
   and \e endqmltext and output them.
@@ -1150,7 +1144,6 @@ bool Generator::generateQmlText(const Text& text,
     }
     return result;
 }
-#endif
 
 void Generator::generateReimplementedFrom(const FunctionNode *func,
                                           CodeMarker *marker)
index 713bfd2..59df66b 100644 (file)
@@ -173,6 +173,10 @@ protected:
     QString plainCode(const QString& markedCode);
     void setImageFileExtensions(const QStringList& extensions);
     void unknownAtom(const Atom *atom);
+    void appendSortedQmlNames(Text& text,
+                              const Node* base,
+                              const NodeList& subs,
+                              CodeMarker *marker);
 
     QList<NameCollisionNode*> collisionNodes;
     QMap<QString, QStringList> editionGroupMap;
@@ -222,10 +226,6 @@ private:
                            const ClassNode *classe,
                            const QList<RelatedClass> &classes,
                            CodeMarker *marker);
-    void appendSortedQmlNames(Text& text,
-                              const Node* base,
-                              const NodeList& subs,
-                              CodeMarker *marker);
     void generateReimplementedFrom(const FunctionNode *func,
                                    CodeMarker *marker);