diff options
author | Thiago Macieira <thiago.macieira@nokia.com> | 2010-07-01 17:24:01 (GMT) |
---|---|---|
committer | Thiago Macieira <thiago.macieira@nokia.com> | 2010-07-01 17:24:01 (GMT) |
commit | 745ecfd8925716d962c97a4415881377faf6bdd5 (patch) | |
tree | c4f78b3bd143af52372064cd3ba5c0ae440813c5 /tools/qdoc3 | |
parent | bda164303570629e44185e8baa52908ced6da301 (diff) | |
parent | 8968c79c575755cdb52d5e615ed19e4529047464 (diff) | |
download | Qt-745ecfd8925716d962c97a4415881377faf6bdd5.zip Qt-745ecfd8925716d962c97a4415881377faf6bdd5.tar.gz Qt-745ecfd8925716d962c97a4415881377faf6bdd5.tar.bz2 |
Merge remote branch 'origin/4.7' into qt-master-from-4.7
Conflicts:
bin/syncqt
src/gui/text/qtextlayout.cpp
tools/assistant/tools/assistant/helpviewer_qwv.cpp
tools/assistant/tools/assistant/helpviewer_qwv.h
tools/configure/configureapp.cpp
Diffstat (limited to 'tools/qdoc3')
-rw-r--r-- | tools/qdoc3/codechunk.h | 2 | ||||
-rw-r--r-- | tools/qdoc3/codemarker.cpp | 12 | ||||
-rw-r--r-- | tools/qdoc3/cppcodeparser.cpp | 39 | ||||
-rw-r--r-- | tools/qdoc3/ditaxmlgenerator.cpp | 2473 | ||||
-rw-r--r-- | tools/qdoc3/ditaxmlgenerator.h | 90 | ||||
-rw-r--r-- | tools/qdoc3/doc/qdoc-manual.qdoc | 36 | ||||
-rw-r--r-- | tools/qdoc3/htmlgenerator.cpp | 24 | ||||
-rw-r--r-- | tools/qdoc3/main.cpp | 2 | ||||
-rw-r--r-- | tools/qdoc3/node.cpp | 171 | ||||
-rw-r--r-- | tools/qdoc3/node.h | 174 | ||||
-rw-r--r-- | tools/qdoc3/pagegenerator.cpp | 7 | ||||
-rw-r--r-- | tools/qdoc3/test/qt-api-only_ja_JP.qdocconf | 30 | ||||
-rw-r--r-- | tools/qdoc3/test/qt-build-docs.qdocconf | 67 | ||||
-rw-r--r-- | tools/qdoc3/test/qt-build-docs_ja_JP.qdocconf | 121 | ||||
-rw-r--r-- | tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf | 67 | ||||
-rw-r--r-- | tools/qdoc3/test/qt-ditaxml.qdocconf | 11 | ||||
-rw-r--r-- | tools/qdoc3/test/qt-html-templates.qdocconf | 18 | ||||
-rw-r--r-- | tools/qdoc3/test/qt-html-templates_ja_JP.qdocconf | 178 | ||||
-rw-r--r-- | tools/qdoc3/test/qt.qdocconf | 1 | ||||
-rw-r--r-- | tools/qdoc3/test/qt_ja_JP.qdocconf | 125 | ||||
-rw-r--r-- | tools/qdoc3/test/qt_zh_CN.qdocconf | 45 | ||||
-rw-r--r-- | tools/qdoc3/tree.cpp | 10 |
22 files changed, 2385 insertions, 1318 deletions
diff --git a/tools/qdoc3/codechunk.h b/tools/qdoc3/codechunk.h index e78873c..a0c554e 100644 --- a/tools/qdoc3/codechunk.h +++ b/tools/qdoc3/codechunk.h @@ -55,7 +55,7 @@ QT_BEGIN_NAMESPACE /* The CodeChunk class represents a tiny piece of C++ code. - The class provides convertion between a list of lexemes and a string. It adds + The class provides conversion between a list of lexemes and a string. It adds spaces at the right place for consistent style. The tiny pieces of code it represents are data types, enum values, and default parameter values. diff --git a/tools/qdoc3/codemarker.cpp b/tools/qdoc3/codemarker.cpp index 818a91f..33ceaf5 100644 --- a/tools/qdoc3/codemarker.cpp +++ b/tools/qdoc3/codemarker.cpp @@ -257,6 +257,7 @@ QString CodeMarker::typified(const QString &string) QString CodeMarker::taggedNode(const Node* node) { QString tag; + QString name = node->name(); switch (node->type()) { case Node::Namespace: @@ -277,11 +278,20 @@ QString CodeMarker::taggedNode(const Node* node) case Node::Property: tag = QLatin1String("@property"); break; +#ifdef QDOC_QML + case Node::Fake: + if (node->subType() == Node::QmlClass) { + if (node->name().startsWith(QLatin1String("QML:"))) + name = name.mid(4); // remove the "QML:" prefix + } + tag = QLatin1String("@property"); + break; +#endif default: tag = QLatin1String("@unknown"); break; } - return QLatin1Char('<') + tag + QLatin1Char('>') + protect(node->name()) + return QLatin1Char('<') + tag + QLatin1Char('>') + protect(name) + QLatin1String("</") + tag + QLatin1Char('>'); } diff --git a/tools/qdoc3/cppcodeparser.cpp b/tools/qdoc3/cppcodeparser.cpp index 13678af..e4870e3 100644 --- a/tools/qdoc3/cppcodeparser.cpp +++ b/tools/qdoc3/cppcodeparser.cpp @@ -728,7 +728,10 @@ Node *CppCodeParser::processTopicCommand(const Doc& doc, if (n) classNode = static_cast<const ClassNode*>(n); } - return new QmlClassNode(tre->root(), names[0], classNode); + if (names[0].startsWith("Q")) + return new QmlClassNode(tre->root(), QLatin1String("QML:")+names[0], classNode); + else + return new QmlClassNode(tre->root(), names[0], classNode); } else if (command == COMMAND_QMLBASICTYPE) { #if 0 @@ -752,6 +755,8 @@ Node *CppCodeParser::processTopicCommand(const Doc& doc, QString type; QmlClassNode* qmlClass = 0; if (splitQmlMethodArg(doc,arg,type,element)) { + if (element.startsWith(QLatin1String("Q"))) + element = QLatin1String("QML:") + element; Node* n = tre->findNode(QStringList(element),Node::Fake); if (n && n->subType() == Node::QmlClass) { qmlClass = static_cast<QmlClassNode*>(n); @@ -1850,16 +1855,40 @@ bool CppCodeParser::matchProperty(InnerNode *parent) else if (key == "WRITE") { tre->addPropertyFunction(property, value, PropertyNode::Setter); property->setWritable(true); - } else if (key == "STORED") + } + else if (key == "STORED") property->setStored(value.toLower() == "true"); - else if (key == "DESIGNABLE") - property->setDesignable(value.toLower() == "true"); + else if (key == "DESIGNABLE") { + QString v = value.toLower(); + if (v == "true") + property->setDesignable(true); + else if (v == "false") + property->setDesignable(false); + else { + property->setDesignable(false); + property->setRuntimeDesFunc(value); + } + } else if (key == "RESET") tre->addPropertyFunction(property, value, PropertyNode::Resetter); else if (key == "NOTIFY") { tre->addPropertyFunction(property, value, PropertyNode::Notifier); } - + else if (key == "SCRIPTABLE") { + QString v = value.toLower(); + if (v == "true") + property->setScriptable(true); + else if (v == "false") + property->setScriptable(false); + else { + property->setScriptable(false); + property->setRuntimeScrFunc(value); + } + } + else if (key == "COSTANT") + property->setConstant(); + else if (key == "FINAL") + property->setFinal(); } match(Tok_RightParen); return true; diff --git a/tools/qdoc3/ditaxmlgenerator.cpp b/tools/qdoc3/ditaxmlgenerator.cpp index a64e8e7..d7a9c9e 100644 --- a/tools/qdoc3/ditaxmlgenerator.cpp +++ b/tools/qdoc3/ditaxmlgenerator.cpp @@ -1,3 +1,4 @@ + /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). @@ -45,23 +46,295 @@ #include "codemarker.h" #include "codeparser.h" -#include "helpprojectwriter.h" #include "ditaxmlgenerator.h" #include "node.h" #include "separator.h" #include "tree.h" #include <ctype.h> - #include <qdebug.h> #include <qlist.h> #include <qiterator.h> #include <qtextcodec.h> +#include <QUuid> QT_BEGIN_NAMESPACE -#define COMMAND_VERSION Doc::alias("version") +#define COMMAND_VERSION Doc::alias("version") int DitaXmlGenerator::id = 0; +#define cxxapi_d_xref Doc::alias("cxxapi-d-xref") +#define cxxclass Doc::alias("cxxclass") +#define cxxdefine Doc::alias("cxxdefine") +#define cxxenumeration Doc::alias("cxxenumeration") +#define cxxfile Doc::alias("cxxfile") +#define cxxfunction Doc::alias("cxxfunction") +#define cxxstruct Doc::alias("cxxstruct") +#define cxxtypedef Doc::alias("cxxtypedef") +#define cxxunion Doc::alias("cxxunion") +#define cxxvariable Doc::alias("cxxvariable") + +#define CXXAPIMAP Doc::alias("cxxAPIMap") +#define CXXCLASSREF Doc::alias("cxxClassRef") +#define CXXDEFINEREF Doc::alias("cxxDefineRef") +#define CXXENUMERATIONREF Doc::alias("cxxEnumerationRef") +#define CXXFILEREF Doc::alias("cxxFileRef") +#define CXXFUNCTIONREF Doc::alias("cxxFunctionRef") +#define CXXSTRUCTREF Doc::alias("cxxStructRef") +#define CXXTYPDEFREF Doc::alias("cxxTypedefRef") +#define CXXUNIONREF Doc::alias("cxxUnionRef") +#define CXXVARIABLEREF Doc::alias("cxxVariableRef") + +#define CXXCLASS Doc::alias("cxxClass") +#define CXXCLASSABSTRACT Doc::alias("cxxClassAbstract") +#define CXXCLASSACCESSSPECIFIER Doc::alias("cxxClassAccessSpecifier") +#define CXXCLASSAPIITEMLOCATION Doc::alias("cxxClassAPIItemLocation") +#define CXXCLASSBASECLASS Doc::alias("cxxClassBaseClass") +#define CXXCLASSBASECLASSSTRUCT Doc::alias("cxxClassBaseStruct") +#define CXXCLASSBASEUNION Doc::alias("cxxClassBaseUnion") +#define CXXCLASSDECLARATIONFILE Doc::alias("cxxClassDeclarationFile") +#define CXXCLASSDECLARATIONFILELINE Doc::alias("cxxClassDeclarationFileLine") +#define CXXCLASSDEFINITION Doc::alias("cxxClassDefinition") +#define CXXCLASSDEFINITIONFILE Doc::alias("cxxClassDefinitionFile") +#define CXXCLASSDEFINITIONFILEEND Doc::alias("cxxClassDefinitionFileLineEnd") +#define CXXCLASSDEFINITIONFILESTART Doc::alias("cxxClassDefinitionFileLineStart") +#define CXXCLASSDERIVATION Doc::alias("cxxClassDerivation") +#define CXXCLASSDERIVATIONACCESSSPECIFIER Doc::alias("cxxClassDerivationAccessSpecifier") +#define CXXCLASSDERIVATIONS Doc::alias("cxxClassDerivations") +#define CXXCLASSDERIVATIONVIRTUAL Doc::alias("cxxClassDerivationVirtual") +#define CXXCLASSDETAIL Doc::alias("cxxClassDetail") +#define CXXCLASSENUMERATIONINHERITED Doc::alias("cxxClassEnumerationInherited") +#define CXXCLASSENUMERATORINHERITED Doc::alias("cxxClassEnumeratorInherited") +#define CXXCLASSFUNCTIONINHERITED Doc::alias("cxxClassFunctionInherited") +#define CXXCLASSINHERITS Doc::alias("cxxClassInherits") +#define CXXCLASSINHERITSDETAIL Doc::alias("cxxClassInheritsDetail") +#define CXXCLASSNESTED Doc::alias("cxxClassNested") +#define CXXCLASSNESTEDCLASS Doc::alias("cxxClassNestedClass") +#define CXXCLASSNESTEDDETAIL Doc::alias("cxxClassNestedDetail") +#define CXXCLASSNESTEDSTRUCT Doc::alias("cxxClassNestedStruct") +#define CXXCLASSNESTEDUNION Doc::alias("cxxClassNestedUnion") +#define CXXCLASSTEMPLATEPARAMETER Doc::alias("cxxClassTemplateParameter") +#define CXXCLASSTEMPLATEPARAMETERS Doc::alias("cxxClassTemplateParameters") +#define CXXCLASSTEMPLATEPARAMETERTYPE Doc::alias("cxxClassTemplateParameterType") +#define CXXCLASSVARIABLEINHERITED Doc::alias("cxxClassVariableInherited") + +#define CXXDEFINE Doc::alias("cxxDefine") +#define CXXDEFINEACCESSSPECIFIER Doc::alias("cxxDefineAccessSpecifier") +#define CXXDEFINEAPIITEMLOCATION Doc::alias("cxxDefineAPIItemLocation") +#define CXXDEFINEDECLARATIONFILE Doc::alias("cxxDefineDeclarationFile") +#define CXXDEFINEDECLARATIONFILELINE Doc::alias("cxxDefineDeclarationFileLine") +#define CXXDEFINEDEFINITION Doc::alias("cxxDefineDefinition") +#define CXXDEFINEDETAIL Doc::alias("cxxDefineDetail") +#define CXXDEFINENAMELOOKUP Doc::alias("cxxDefineNameLookup") +#define CXXDEFINEPARAMETER Doc::alias("cxxDefineParameter") +#define CXXDEFINEPARAMETERDECLARATIONNAME Doc::alias("cxxDefineParameterDeclarationName") +#define CXXDEFINEPARAMETERS Doc::alias("cxxDefineParameters") +#define CXXDEFINEPROTOTYPE Doc::alias("cxxDefinePrototype") +#define CXXDEFINEREIMPLEMENTED Doc::alias("cxxDefineReimplemented") + +#define CXXENUMERATION Doc::alias("cxxEnumeration") +#define CXXENUMERATIONACCESSSPECIFIER Doc::alias("cxxEnumerationAccessSpecifier") +#define CXXENUMERATIONAPIITEMLOCATION Doc::alias("cxxEnumerationAPIItemLocation") +#define CXXENUMERATIONDECLARATIONFILE Doc::alias("cxxEnumerationDeclarationFile") +#define CXXENUMERATIONDECLARATIONFILELINE Doc::alias("cxxEnumerationDeclarationFileLine") +#define CXXENUMERATIONDEFINITION Doc::alias("cxxEnumerationDefinition") +#define CXXENUMERATIONDEFINITIONFILE Doc::alias("cxxEnumerationDefinitionFile") +#define CXXENUMERATIONDEFINITIONFILELINEEND Doc::alias("cxxEnumerationDefinitionFileLineEnd") +#define CXXENUMERATIONDEFINITIONFILELINESTART Doc::alias("cxxEnumerationDefinitionFileLineStart") +#define CXXENUMERATIONDETAIL Doc::alias("cxxEnumerationDetail") +#define CXXENUMERATIONNAMELOOKUP Doc::alias("cxxEnumerationNameLookup") +#define CXXENUMERATIONPROTOTYPE Doc::alias("cxxEnumerationPrototype") +#define CXXENUMERATIONREIMPLEMENTED Doc::alias("cxxEnumerationReimplemented") +#define CXXENUMERATIONSCOPEDNAME Doc::alias("cxxEnumerationScopedName") +#define CXXENUMERATOR Doc::alias("cxxEnumerator") +#define CXXENUMERATORAPIITEMLOCATION Doc::alias("cxxEnumeratorAPIItemLocation") +#define CXXENUMERATORDECLARATIONFILE Doc::alias("cxxEnumeratorDeclarationFile") +#define CXXENUMERATORDECLARATIONFILELINE Doc::alias("cxxEnumeratorDeclarationFileLine") +#define CXXENUMERATORINITIALISER Doc::alias("cxxEnumeratorInitialiser") +#define CXXENUMERATORNAMELOOKUP Doc::alias("cxxEnumeratorNameLookup") +#define CXXENUMERATORPROTOTYPE Doc::alias("cxxEnumeratorPrototype") +#define CXXENUMERATORS Doc::alias("cxxEnumerators") +#define CXXENUMERATORSCOPEDNAME Doc::alias("cxxEnumeratorScopedName") + +#define CXXFILE_INFO_TYPES Doc::alias("cxxFile-info-types") +#define CXXFILE_TYPES_DEFAULT Doc::alias("cxxFile-types-default") +#define CXXFILE Doc::alias("cxxFile") +#define CXXFILEAPIITMELOCATION Doc::alias("cxxFileAPIItemLocation") +#define CXXFILEDECLARATIONFILE Doc::alias("cxxFileDeclarationFile") + +#define CXXFUNCTION Doc::alias("cxxFunction") +#define CXXFUNCTIONACCESSSPECIFIER Doc::alias("cxxFunctionAccessSpecifier") +#define CXXFUNCTIONAPIITEMLOCATION Doc::alias("cxxFunctionAPIItemLocation") +#define CXXFUNCTIONCONST Doc::alias("cxxFunctionConst") +#define CXXFUNCTIONCONSTRUCTOR Doc::alias("cxxFunctionConstructor") +#define CXXFUNCTIONDECLARATIONFILE Doc::alias("cxxFunctionDeclarationFile") +#define CXXFUNCTIONDECLARATIONFILELINE Doc::alias("cxxFunctionDeclarationFileLine") +#define CXXFUNCTIONDECLAREDTYPE Doc::alias("cxxFunctionDeclaredType") +#define CXXFUNCTIONDEFINITION Doc::alias("cxxFunctionDefinition") +#define CXXFUNCTIONDEFINITIONFILE Doc::alias("cxxFunctionDefinitionFile") +#define CXXFUNCTIONDEFINITIONFILELINEEND Doc::alias("cxxFunctionDefinitionFileLineEnd") +#define CXXFUNCTIONDEFINITIONFILELINESTART Doc::alias("cxxFunctionDefinitionFileLineStart") +#define CXXFUNCTIONDESTRUCTOR Doc::alias("cxxFunctionDestructor") +#define CXXFUNCTIONDETAIL Doc::alias("cxxFunctionDetail") +#define CXXFUNCTIONEXPLICIT Doc::alias("cxxFunctionExplicit") +#define CXXFUNCTIONINLINE Doc::alias("cxxFunctionInline") +#define CXXFUNCTIONNAMELOOKUP Doc::alias("cxxFunctionNameLookup") +#define CXXFUNCTIONPARAMETER Doc::alias("cxxFunctionParameter") +#define CXXFUNCTIONPARAMETERDECLARATIONNAME Doc::alias("cxxFunctionParameterDeclarationName") +#define CXXFUNCTIONPARAMETERDECLAREDTYPE Doc::alias("cxxFunctionParameterDeclaredType") +#define CXXFUNCTIONPARAMETERDEFAULTVALUE Doc::alias("cxxFunctionParameterDefaultValue") +#define CXXFUNCTIONPARAMETERDEFINITIONNAME Doc::alias("cxxFunctionParameterDefinitionName") +#define CXXFUNCTIONPARAMETERS Doc::alias("cxxFunctionParameters") +#define CXXFUNCTIONPROTOTYPE Doc::alias("cxxFunctionPrototype") +#define CXXFUNCTIONPUREVIRTUAL Doc::alias("cxxFunctionPureVirtual") +#define CXXFUNCTIONREIMPLEMENTED Doc::alias("cxxFunctionReimplemented") +#define CXXFUNCTIONRETURNTYPE Doc::alias("cxxFunctionReturnType") +#define CXXFUNCTIONSCOPEDNAME Doc::alias("cxxFunctionScopedName") +#define CXXFUNCTIONSTORAGECLASSSPECIFIEREXTERN Doc::alias("cxxFunctionStorageClassSpecifierExtern") +#define CXXFUNCTIONSTORAGECLASSSPECIFIERMUTABLE Doc::alias("cxxFunctionStorageClassSpecifierMutable") +#define CXXFUNCTIONSTORAGECLASSSPECIFIERSTATIC Doc::alias("cxxFunctionStorageClassSpecifierStatic") +#define CXXFUNCTIONTEMPLATEPARAMETER Doc::alias("cxxFunctionTemplateParameter") +#define CXXFUNCTIONTEMPLATEPARAMETERS Doc::alias("cxxFunctionTemplateParameters") +#define CXXFUNCTIONTEMPLATEPARAMETERTYPE Doc::alias("cxxFunctionTemplateParameterType") +#define CXXFUNCTIONVIRTUAL Doc::alias("cxxFunctionVirtual") +#define CXXFUNCTIONVOLATILE Doc::alias("cxxFunctionVolatile") + +#define CXXSTRUCT Doc::alias("cxxStruct") +#define CXXSTRUCTABSTRACT Doc::alias("cxxStructAbstract") +#define CXXSTRUCTACCESSSPECIFIER Doc::alias("cxxStructAccessSpecifier") +#define CXXSTRUCTAPIITEMLOCATION Doc::alias("cxxStructAPIItemLocation") +#define CXXSTRUCTBASECLASS Doc::alias("cxxStructBaseClass") +#define CXXSTRUCTBASESTRUCT Doc::alias("cxxStructBaseStruct") +#define CXXSTRUCTBASEUNION Doc::alias("cxxStructBaseUnion") +#define CXXSTRUCTDECLARATIONFILE Doc::alias("cxxStructDeclarationFile") +#define CXXSTRUCTDECLARATIONFILELINE Doc::alias("cxxStructDeclarationFileLine") +#define CXXSTRUCTDEFINITION Doc::alias("cxxStructDefinition") +#define CXXSTRUCTDEFINITIONFILE Doc::alias("cxxStructDefinitionFile") +#define CXXSTRUCTDEFINITIONFILELINEEND Doc::alias("cxxStructDefinitionFileLineEnd") +#define CXXSTRUCTDEFINITIONFILELINESTART Doc::alias("cxxStructDefinitionFileLineStart") +#define CXXSTRUCTDERIVATION Doc::alias("cxxStructDerivation") +#define CXXSTRUCTDERIVATIONACCESSSPECIFIER Doc::alias("cxxStructDerivationAccessSpecifier") +#define CXXSTRUCTDERIVATIONS Doc::alias("cxxStructDerivations") +#define CXXSTRUCTDERIVATIONVIRTUAL Doc::alias("cxxStructDerivationVirtual") +#define CXXSTRUCTDETAIL Doc::alias("cxxStructDetail") +#define CXXSTRUCTENUMERATIONINHERITED Doc::alias("cxxStructEnumerationInherited") +#define CXXSTRUCTENUMERATORINHERITED Doc::alias("cxxStructEnumeratorInherited") +#define CXXSTRUCTFUNCTIONINHERITED Doc::alias("cxxStructFunctionInherited") +#define CXXSTRUCTINHERITS Doc::alias("cxxStructInherits") +#define CXXSTRUCTINHERITSDETAIL Doc::alias("cxxStructInheritsDetail") +#define CXXSTRUCTNESTED Doc::alias("cxxStructNested") +#define CXXSTRUCTNESTEDCLASS Doc::alias("cxxStructNestedClass") +#define CXXSTRUCTNESTEDDETAIL Doc::alias("cxxStructNestedDetail") +#define CXXSTRUCTNESTEDSTRUCT Doc::alias("cxxStructNestedStruct") +#define CXXSTRUCTNESTEDUNION Doc::alias("cxxStructNestedUnion") +#define CXXSTRUCTTEMPLATEPARAMETER Doc::alias("cxxStructTemplateParameter") +#define CXXSTRUCTTEMPLATEPARAMETERS Doc::alias("cxxStructTemplateParameters") +#define CXXSTRUCTTEMPLATEPARAMETERTYPE Doc::alias("cxxStructTemplateParameterType") +#define CXXSTRUCTVARIABLEINHERITED Doc::alias("cxxStructVariableInherited") + +#define CXXTYPEDEF Doc::alias("cxxTypedef") +#define CXXTYPEDEFACCESSSPECIFIER Doc::alias("cxxTypedefAccessSpecifier") +#define CXXTYPEDEFAPIITEMLOCATION Doc::alias("cxxTypedefAPIItemLocation") +#define CXXTYPEDEFDECLARATIONFILE Doc::alias("cxxTypedefDeclarationFile") +#define CXXTYPEDEFDECLARATIONFILELINE Doc::alias("cxxTypedefDeclarationFileLine") +#define CXXTYPEDEFDECLAREDTYPE Doc::alias("cxxTypedefDeclaredType") +#define CXXTYPEDEFDEFINITION Doc::alias("cxxTypedefDefinition") +#define CXXTYPEDEFDETAIL Doc::alias("cxxTypedefDetail") +#define CXXTYPEDEFNAMELOOKUP Doc::alias("cxxTypedefNameLookup") +#define CXXTYPEDEFPROTOTYPE Doc::alias("cxxTypedefPrototype") +#define CXXTYPEDEFREIMPLEMENTED Doc::alias("cxxTypedefReimplemented") +#define CXXTYPEDEFSCOPEDNAME Doc::alias("cxxTypedefScopedName") + +#define CXXUNION Doc::alias("cxxUnion") +#define CXXUNIONABSTRACT Doc::alias("cxxUnionAbstract") +#define CXXUNIONACCESSSPECIFIER Doc::alias("cxxUnionAccessSpecifier") +#define CXXUNIONAPIITEMLOCATION Doc::alias("cxxUnionAPIItemLocation") +#define CXXUNIONDECLARATIONFILE Doc::alias("cxxUnionDeclarationFile") +#define CXXUNIONDECLARATIONFILELINE Doc::alias("cxxUnionDeclarationFileLine") +#define CXXUNIONDEFINITION Doc::alias("cxxUnionDefinition") +#define CXXUNIONDEFINITIONFILE Doc::alias("cxxUnionDefinitionFile") +#define CXXUNIONDEFINITIONFILELINEEND Doc::alias("cxxUnionDefinitionFileLineEnd") +#define CXXUNIONDEFINITIONFILELINESTART Doc::alias("cxxUnionDefinitionFileLineStart") +#define CXXUNIONDETAIL Doc::alias("cxxUnionDetail") +#define CXXUNIONNESTED Doc::alias("cxxUnionNested") +#define CXXUNIONNESTEDCLASS Doc::alias("cxxUnionNestedClass") +#define CXXUNIONNESTEDDETAIL Doc::alias("cxxUnionNestedDetail") +#define CXXUNIONNESTEDSTRUCT Doc::alias("cxxUnionNestedStruct") +#define CXXUNIONNESTEDUNION Doc::alias("cxxUnionNestedUnion") +#define CXXUNIONTEMPLATEPARAMETER Doc::alias("cxxUnionTemplateParameter") +#define CXXUNIONTEMPLATEPARAMETERS Doc::alias("cxxUnionTemplateParameters") +#define CXXUNIONTEMPLATEPARAMETERTYPE Doc::alias("cxxUnionTemplateParameterType") + +#define CXXVARIABLE Doc::alias("cxxVariable") +#define CXXVARIABLEACCESSSPECIFIER Doc::alias("cxxVariableAccessSpecifier") +#define CXXVARIABLEAPIITEMLOCATION Doc::alias("cxxVariableAPIItemLocation") +#define CXXVARIABLECONST Doc::alias("cxxVariableConst") +#define CXXVARIABLEDECLARATIONFILE Doc::alias("cxxVariableDeclarationFile") +#define CXXVARIABLEDECLARATIONFILELINE Doc::alias("cxxVariableDeclarationFileLine") +#define CXXVARIABLEDECLAREDTYPE Doc::alias("cxxVariableDeclaredType") +#define CXXVARIABLEDEFINITION Doc::alias("cxxVariableDefinition") +#define CXXVARIABLEDETAIL Doc::alias("cxxVariableDetail") +#define CXXVARIABLENAMELOOKUP Doc::alias("cxxVariableNameLookup") +#define CXXVARIABLEPROTOTYPE Doc::alias("cxxVariablePrototype") +#define CXXVARIABLEREIMPLEMENTED Doc::alias("cxxVariableReimplemented") +#define CXXVARIABLESCOPEDNAME Doc::alias("cxxVariableScopedName") +#define CXXVARIABLESTORAGECLASSSPECIFIEREXTERN Doc::alias("cxxVariableStorageClassSpecifierExtern") +#define CXXVARIABLESTORAGECLASSSPECIFIERMUTABLE Doc::alias("cxxVariableStorageClassSpecifierMutable") +#define CXXVARIABLESTORAGECLASSSPECIFIERSTATIC Doc::alias("cxxVariableStorageClassSpecifierStatic") +#define CXXVARIABLEVOLATILE Doc::alias("cxxVariableVolatile") + +#define APIREF Doc::alias("apiRef") +#define APINAME Doc::alias("apiName") +#define APIDETAIL Doc::alias("apiDetail") +#define APISYNTAX Doc::alias("apiSyntax") +#define APISYNTAXTEXT Doc::alias("apiSyntaxText") +#define APISYNTAXITEM Doc::alias("apiSyntaxItem") +#define APIDEF Doc::alias("apiDef") +#define APIQUALIFIER Doc::alias("apiQualifier") +#define APIRELATION Doc::alias("apiRelation") +#define APITYPE Doc::alias("apiType") +#define APIARRAY Doc::alias("apiArray") +#define APIDATA Doc::alias("apiData") +#define APIDEFNOTE Doc::alias("apiDefNote") +#define APIDEFITEM Doc::alias("apiDefItem") +#define APIITEMNAME Doc::alias("apiItemName") +#define APIDESC Doc::alias("apiDesc") +#define APIIMPL Doc::alias("apiImpl") + +#define APIPACKAGE Doc::alias("apiPackage") + +#define APICLASSIFIER Doc::alias("apiClassifier") +#define APICLASSIFIERDETAIL Doc::alias("apiClassifierDetail") +#define APICLASSIFIERDEF Doc::alias("apiClassifierDef") +#define APICLASSIFIERMEMBER Doc::alias("apiClassifierMember") +#define APIOTHERCLASSIFIER Doc::alias("apiOtherClassifier") +#define APIBASECLASSIFIER Doc::alias("apiBaseClassifier") + +#define APIOPERATION Doc::alias("apiOperation") +#define APIOPERATIONDETAIL Doc::alias("apiOperationDetail") +#define APIOPERATIONDEF Doc::alias("apiOperationDef") +#define APIRETURN Doc::alias("apiReturn") +#define APIPARAM Doc::alias("apiParam") +#define APIEVENT Doc::alias("apiEvent") +#define APIOPERATIONDEFITEM Doc::alias("apiOperationDefItem") +#define APIOPERATIONCLASSIFIER Doc::alias("apiOperationClassifier") +#define APICONSTRUCTORDEF Doc::alias("apiConstructorDef") + +#define APIVALUE Doc::alias("apiValue") +#define APIVALUEDETAIL Doc::alias("apiValueDetail") +#define APIVALUEDEF Doc::alias("apiValueDef") +#define APIVALUEMEMBER Doc::alias("apiValueMember") +#define APIVALUECLASSIFIER Doc::alias("apiValueClassifier") + +#define APIclassifier Doc::alias("apiclassifier") +#define APIoperation Doc::alias("apioperation") +#define APIpackage Doc::alias("apipackage") +#define APIvalue Doc::alias("apivalue") + +#define APIMAP Doc::alias("apiMap") +#define APIITEMREF Doc::alias("apiItemRef") + +#define SHORTDESC Doc::alias("shortdesc") + QString DitaXmlGenerator::sinceTitles[] = { " New Namespaces", @@ -88,11 +361,11 @@ static void addLink(const QString &linkTarget, QString *res) { if (!linkTarget.isEmpty()) { - *res += "<a href=\""; + *res += "<xref href=\""; *res += linkTarget; *res += "\">"; *res += nestedStuff; - *res += "</a>"; + *res += "</xref>"; } else { *res += nestedStuff; @@ -101,8 +374,7 @@ static void addLink(const QString &linkTarget, DitaXmlGenerator::DitaXmlGenerator() - : helpProjectWriter(0), - inLink(false), + : inLink(false), inContents(false), inSectionHeading(false), inTableHeader(false), @@ -112,32 +384,31 @@ DitaXmlGenerator::DitaXmlGenerator() funcLeftParen("\\S(\\()"), myTree(0), slow(false), - obsoleteLinks(false) + obsoleteLinks(false), + noLinks(0) { } DitaXmlGenerator::~DitaXmlGenerator() { - if (helpProjectWriter) - delete helpProjectWriter; + // nothing yet. } void DitaXmlGenerator::initializeGenerator(const Config &config) { static const struct { const char *key; - const char *left; - const char *right; + const char *tag; } defaults[] = { - { ATOM_FORMATTING_BOLD, "<b>", "</b>" }, - { ATOM_FORMATTING_INDEX, "<!--", "-->" }, - { ATOM_FORMATTING_ITALIC, "<i>", "</i>" }, - { ATOM_FORMATTING_PARAMETER, "<i>", "</i>" }, - { ATOM_FORMATTING_SUBSCRIPT, "<sub>", "</sub>" }, - { ATOM_FORMATTING_SUPERSCRIPT, "<sup>", "</sup>" }, - { ATOM_FORMATTING_TELETYPE, "<tt>", "</tt>" }, - { ATOM_FORMATTING_UNDERLINE, "<u>", "</u>" }, - { 0, 0, 0 } + { ATOM_FORMATTING_BOLD, "b" }, + { ATOM_FORMATTING_INDEX, "<!--" }, + { ATOM_FORMATTING_ITALIC, "i" }, + { ATOM_FORMATTING_PARAMETER, "i" }, + { ATOM_FORMATTING_SUBSCRIPT, "sub" }, + { ATOM_FORMATTING_SUPERSCRIPT, "sup" }, + { ATOM_FORMATTING_TELETYPE, "tt", }, + { ATOM_FORMATTING_UNDERLINE, "u", }, + { 0, 0 } }; Generator::initializeGenerator(config); @@ -145,8 +416,7 @@ void DitaXmlGenerator::initializeGenerator(const Config &config) setImageFileExtensions(QStringList() << "png" << "jpg" << "jpeg" << "gif"); int i = 0; while (defaults[i].key) { - formattingLeftMap().insert(defaults[i].key, defaults[i].left); - formattingRightMap().insert(defaults[i].key, defaults[i].right); + formattingLeftMap().insert(defaults[i].key, defaults[i].tag); i++; } @@ -219,9 +489,6 @@ void DitaXmlGenerator::initializeGenerator(const Config &config) DITAXMLGENERATOR_CUSTOMHEADELEMENTS); codeIndent = config.getInt(CONFIG_CODEINDENT); - helpProjectWriter = new HelpProjectWriter(config, - project.toLower() + - ".qhp"); } void DitaXmlGenerator::terminateGenerator() @@ -235,23 +502,39 @@ QString DitaXmlGenerator::format() } /*! - This is where the html files and dcf files are written. - \note The html file generation is done in the base class, + Calls lookupGuid() to get a GUID for \a text, then writes + it to the XML stream as an "id" attribute, and returns it. + */ +QString DitaXmlGenerator::writeGuidAttribute(QString text) +{ + QString guid = lookupGuid(text); + writer.writeAttribute("id",guid); + return guid; +} + +/*! + Looks up \a text in the GUID map. If it finds \a text, + it returns the associated GUID. Otherwise it inserts + \a text into the map with a new GUID, and it returns + the new GUID. + */ +QString DitaXmlGenerator::lookupGuid(QString text) +{ + QMap<QString, QString>::const_iterator i = name2guidMap.find(text); + if (i != name2guidMap.end()) + return i.value(); + QString guid = QUuid::createUuid().toString(); + name2guidMap.insert(text,guid); + return guid; +} + +/*! + This is where the DITA XML files are written. + \note The file generation is done in the base class, PageGenerator::generateTree(). */ void DitaXmlGenerator::generateTree(const Tree *tree, CodeMarker *marker) { -#if 0 - // Copy the stylesheets from the directory containing the qdocconf file. - // ### This should be changed to use a special directory in doc/src. - QStringList::ConstIterator styleIter = stylesheets.begin(); - QDir configPath = QDir::current(); - while (styleIter != stylesheets.end()) { - QString filePath = configPath.absoluteFilePath(*styleIter); - Config::copyFile(Location(), filePath, filePath, outputDir()); - ++styleIter; - } -#endif myTree = tree; nonCompatClasses.clear(); mainClasses.clear(); @@ -266,59 +549,13 @@ void DitaXmlGenerator::generateTree(const Tree *tree, CodeMarker *marker) findAllFunctions(tree->root()); findAllLegaleseTexts(tree->root()); findAllNamespaces(tree->root()); -#ifdef ZZZ_QDOC_QML - findAllQmlClasses(tree->root()); -#endif findAllSince(tree->root()); PageGenerator::generateTree(tree, marker); - - dcfClassesRoot.ref = "classes.html"; - dcfClassesRoot.title = "Classes"; - qSort(dcfClassesRoot.subsections); - - dcfOverviewsRoot.ref = "overviews.html"; - dcfOverviewsRoot.title = "Overviews"; - qSort(dcfOverviewsRoot.subsections); - - dcfExamplesRoot.ref = "examples.html"; - dcfExamplesRoot.title = "Tutorial & Examples"; - qSort(dcfExamplesRoot.subsections); - - DcfSection qtRoot; - appendDcfSubSection(&qtRoot, dcfClassesRoot); - appendDcfSubSection(&qtRoot, dcfOverviewsRoot); - appendDcfSubSection(&qtRoot, dcfExamplesRoot); - - generateDcf(project.toLower().simplified().replace(" ", "-"), - "index.html", - projectDescription, qtRoot); - generateDcf("designer", - "designer-manual.html", - "Qt Designer Manual", - dcfDesignerRoot); - generateDcf("linguist", - "linguist-manual.html", - "Qt Linguist Manual", - dcfLinguistRoot); - generateDcf("assistant", - "assistant-manual.html", - "Qt Assistant Manual", - dcfAssistantRoot); - generateDcf("qmake", - "qmake-manual.html", - "qmake Manual", - dcfQmakeRoot); - - QString fileBase = project.toLower().simplified().replace(" ", "-"); - generateIndex(fileBase, projectUrl, projectDescription); - generatePageIndex(outputDir() + "/" + fileBase + ".pageindex", marker); - - helpProjectWriter->generate(myTree); } -void DitaXmlGenerator::startText(const Node * /* relative */, - CodeMarker * /* marker */) +void DitaXmlGenerator::startText(const Node* /* relative */, + CodeMarker* /* marker */) { inLink = false; inContents = false; @@ -334,19 +571,21 @@ void DitaXmlGenerator::startText(const Node * /* relative */, Generate html from an instance of Atom. */ int DitaXmlGenerator::generateAtom(const Atom *atom, - const Node *relative, - CodeMarker *marker) + const Node *relative, + CodeMarker *marker) { int skipAhead = 0; + QString hx; static bool in_para = false; - + QString guid; + switch (atom->type()) { case Atom::AbstractLeft: break; case Atom::AbstractRight: break; case Atom::AutoLink: - if (!inLink && !inContents && !inSectionHeading) { + if ((noLinks > 0) && !inLink && !inContents && !inSectionHeading) { const Node *node = 0; QString link = getLink(atom, relative, marker, &node); if (!link.isEmpty()) { @@ -355,11 +594,11 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, endLink(); } else { - out() << protectEnc(atom->string()); + writer.writeCharacters(protectEnc(atom->string())); } } else { - out() << protectEnc(atom->string()); + writer.writeCharacters(protectEnc(atom->string())); } break; case Atom::BaseName: @@ -369,8 +608,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, skipAhead = skipAtoms(atom, Atom::BriefRight); break; } - - out() << "<p>"; + writer.writeStartElement(SHORTDESC); if (relative->type() == Node::Property || relative->type() == Node::Variable) { QString str; @@ -385,88 +623,102 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, str[0] = str[0].toLower(); if (str.right(1) == ".") str.truncate(str.length() - 1); - out() << "This "; + writer.writeCharacters("This "); if (relative->type() == Node::Property) - out() << "property"; + writer.writeCharacters("property"); else - out() << "variable"; + writer.writeCharacters("variable"); QStringList words = str.split(" "); if (!(words.first() == "contains" || words.first() == "specifies" || words.first() == "describes" || words.first() == "defines" || words.first() == "holds" || words.first() == "determines")) - out() << " holds "; + writer.writeCharacters(" holds "); else - out() << " "; - out() << str << "."; + writer.writeCharacters(" "); + writer.writeCharacters(str + "."); } break; case Atom::BriefRight: - if (relative->type() != Node::Fake) - out() << "</p>\n"; + if (relative->type() != Node::Fake) { + writer.writeEndElement(); // </shortdesc> + } break; case Atom::C: - out() << formattingLeftMap()[ATOM_FORMATTING_TELETYPE]; + writer.writeStartElement(formattingLeftMap()[ATOM_FORMATTING_TELETYPE]); if (inLink) { - out() << protectEnc(plainCode(atom->string())); + writer.writeCharacters(protectEnc(plainCode(atom->string()))); } else { - out() << highlightedCode(atom->string(), marker, relative); + writer.writeCharacters(highlightedCode(atom->string(), marker, relative)); } - out() << formattingRightMap()[ATOM_FORMATTING_TELETYPE]; + writer.writeEndElement(); // sse writeStartElement() above break; case Atom::Code: - out() << "<pre class=\"highlightedCode\">" - << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()), - marker,relative)) - << "</pre>\n"; + writer.writeStartElement("pre"); + writer.writeAttribute("outputclass","highlightedCode"); + writer.writeCharacters(trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()), + marker, + relative))); + writer.writeEndElement(); // </pre> break; #ifdef QDOC_QML case Atom::Qml: - out() << "<pre class=\"highlightedCode\">" - << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()), - marker,relative)) - << "</pre>\n"; + writer.writeStartElement("pre"); + writer.writeAttribute("outputclass","highlightedCode"); + writer.writeCharacters(trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()), + marker, + relative))); + writer.writeEndElement(); // pre break; #endif case Atom::CodeNew: - out() << "<p>you can rewrite it as</p>\n" - << "<pre class=\"highlightedCode\">" - << trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()), - marker,relative)) - << "</pre>\n"; + writer.writeStartElement("p"); + writer.writeCharacters("you can rewrite it as"); + writer.writeEndElement(); // </p> + writer.writeStartElement("pre"); + writer.writeAttribute("outputclass","highlightedCode"); + writer.writeCharacters(trimmedTrailing(highlightedCode(indent(codeIndent,atom->string()), + marker, + relative))); + writer.writeEndElement(); // </pre> break; case Atom::CodeOld: - out() << "<p>For example, if you have code like</p>\n"; + writer.writeStartElement("p"); + writer.writeCharacters("For example, if you have code like"); + writer.writeEndElement(); // </p> // fallthrough case Atom::CodeBad: - out() << "<pre class=\"highlightedCode\">" - << trimmedTrailing(protectEnc(plainCode(indent(codeIndent,atom->string())))) - << "</pre>\n"; + writer.writeStartElement("pre"); + writer.writeAttribute("outputclass","highlightedCode"); + writer.writeCharacters(trimmedTrailing(protectEnc(plainCode(indent(codeIndent,atom->string()))))); + writer.writeEndElement(); // </pre> break; case Atom::FootnoteLeft: // ### For now if (in_para) { - out() << "</p>\n"; + writer.writeEndElement(); // </p> in_para = false; } - out() << "<!-- "; + writer.writeCharacters("<!-- "); break; case Atom::FootnoteRight: // ### For now - out() << "-->"; + writer.writeCharacters("-->"); break; case Atom::FormatElse: case Atom::FormatEndif: case Atom::FormatIf: break; case Atom::FormattingLeft: - out() << formattingLeftMap()[atom->string()]; + writer.writeStartElement(formattingLeftMap()[atom->string()]); if (atom->string() == ATOM_FORMATTING_PARAMETER) { if (atom->next() != 0 && atom->next()->type() == Atom::String) { QRegExp subscriptRegExp("([a-z]+)_([0-9n])"); if (subscriptRegExp.exactMatch(atom->next()->string())) { - out() << subscriptRegExp.cap(1) << "<sub>" - << subscriptRegExp.cap(2) << "</sub>"; + writer.writeCharacters(subscriptRegExp.cap(1)); + writer.writeStartElement("sub"); + writer.writeCharacters(subscriptRegExp.cap(2)); + writer.writeEndElement(); // </sub> skipAhead = 1; } } @@ -477,7 +729,7 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, endLink(); } else { - out() << formattingRightMap()[atom->string()]; + writer.writeEndElement(); // ? } break; case Atom::AnnotatedList: @@ -676,30 +928,31 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, /* First generate the table of contents. */ - out() << "<ul>\n"; + writer.writeStartElement("ul"); s = sections.constBegin(); while (s != sections.constEnd()) { if (!(*s).members.isEmpty()) { - out() << "<li>" - << "<a href=\"#" - << Doc::canonicalTitle((*s).name) - << "\">" - << (*s).name - << "</a></li>\n"; + writer.writeStartElement("li"); + writer.writeStartElement("xref"); + writer.writeAttribute("href",QString("#" + Doc::canonicalTitle((*s).name))); + writer.writeCharacters((*s).name); + writer.writeEndElement(); // </xref> + writer.writeEndElement(); // </li> } ++s; } - out() << "</ul>\n"; + writer.writeEndElement(); // </ul> int idx = 0; s = sections.constBegin(); while (s != sections.constEnd()) { if (!(*s).members.isEmpty()) { - out() << "<a name=\"" - << Doc::canonicalTitle((*s).name) - << "\"></a>\n"; - out() << "<h3>" << protectEnc((*s).name) << "</h3>\n"; + writer.writeStartElement("p"); + writeGuidAttribute(Doc::canonicalTitle((*s).name)); + writer.writeAttribute("outputclass","h3"); + writer.writeCharacters(protectEnc((*s).name)); + writer.writeEndElement(); // </p> if (idx == Class) generateCompactList(0, marker, ncmap.value(), false, QString("Q")); else if (idx == QmlClass) @@ -719,17 +972,18 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, pmap = parentmaps.begin(); while (pmap != parentmaps.end()) { NodeList nlist = pmap->values(); - out() << "<p>Class "; - - out() << "<a href=\"" - << linkForNode(pmap.key(), 0) - << "\">"; + writer.writeStartElement("p"); + writer.writeCharacters("Class "); + writer.writeStartElement("xref"); + writer.writeAttribute("href",linkForNode(pmap.key(), 0)); QStringList pieces = fullName(pmap.key(), 0, marker).split("::"); - out() << protectEnc(pieces.last()); - out() << "</a>" << ":</p>\n"; + writer.writeCharacters(protectEnc(pieces.last())); + writer.writeEndElement(); // </xref> + writer.writeCharacters(":"); + writer.writeEndElement(); // </p> generateSection(nlist, 0, marker, CodeMarker::Summary); - out() << "<br/>"; + writer.writeEmptyElement("br"); ++pmap; } } @@ -749,33 +1003,40 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, QString text; if (atom->next() != 0) text = atom->next()->string(); - if (atom->type() == Atom::Image) - out() << "<p class=\"centerAlign\">"; + if (atom->type() == Atom::Image) { + writer.writeStartElement("p"); + writer.writeAttribute("outputclass","centerAlign"); + } if (fileName.isEmpty()) { - out() << "<font color=\"red\">[Missing image " - << protectEnc(atom->string()) << "]</font>"; + writer.writeStartElement("font"); + writer.writeAttribute("color","red"); + writer.writeCharacters("[Missing image: "); + writer.writeCharacters(protectEnc(atom->string())); + writer.writeEndElement(); // </font> } else { - out() << "<img src=\"" << protectEnc(fileName) << "\""; + writer.writeStartElement("img"); + writer.writeAttribute("src",protectEnc(fileName)); if (!text.isEmpty()) - out() << " alt=\"" << protectEnc(text) << "\""; - out() << " />"; - helpProjectWriter->addExtraFile(fileName); + writer.writeAttribute("alt",protectEnc(text)); + writer.writeEndElement(); // </img> } if (atom->type() == Atom::Image) - out() << "</p>"; + writer.writeEndElement(); // </p> } break; case Atom::ImageText: + // nothing break; case Atom::LegaleseLeft: - out() << "<div class=\"LegaleseLeft\">"; + writer.writeStartElement("p"); + writer.writeAttribute("outputclass","legalese"); break; case Atom::LegaleseRight: - out() << "</div>"; + writer.writeEndElement(); // </p> break; case Atom::LineBreak: - out() << "<br/>"; + writer.writeEmptyElement("br"); break; case Atom::Link: { @@ -799,69 +1060,83 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, break; case Atom::ListLeft: if (in_para) { - out() << "</p>\n"; + writer.writeEndElement(); // </p> in_para = false; } if (atom->string() == ATOM_LIST_BULLET) { - out() << "<ul>\n"; + writer.writeStartElement("ul"); } else if (atom->string() == ATOM_LIST_TAG) { - out() << "<dl>\n"; + writer.writeStartElement("dl"); } else if (atom->string() == ATOM_LIST_VALUE) { threeColumnEnumValueTable = isThreeColumnEnumValueTable(atom); if (threeColumnEnumValueTable) { - out() << "<table class=\"valuelist\">"; - // << "<tr>" - if (++numTableRows % 2 == 1) - out() << "<tr class=\"odd\">"; - else - out() << "<tr class=\"even\">"; - - out() << "<tr><th>Constant</th>" - << "<th>Value</th>" - << "<th>Description</th></tr>\n"; + writer.writeStartElement("table"); + writer.writeAttribute("outputclass","valuelist"); + writer.writeStartElement("tr"); + if (++numTableRows % 2 == 1) + writer.writeAttribute("outputclass","odd"); + else + writer.writeAttribute("outputclass","even"); + writer.writeStartElement("th"); + writer.writeCharacters("Constant"); + writer.writeEndElement(); // </th> + writer.writeStartElement("th"); + writer.writeCharacters("Value"); + writer.writeEndElement(); // </th> + writer.writeStartElement("th"); + writer.writeCharacters("Description"); + writer.writeEndElement(); // </th> + writer.writeEndElement(); // </tr> } else { - out() << "<table class=\"valuelist\">" - << "<tr><th>Constant</th><th>Value</th></tr>\n"; + writer.writeStartElement("table"); + writer.writeAttribute("outputclass","valuelist"); + writer.writeStartElement("tr"); + writer.writeStartElement("th"); + writer.writeCharacters("Constant"); + writer.writeEndElement(); // </th> + writer.writeStartElement("th"); + writer.writeCharacters("Value"); + writer.writeEndElement(); // </th> + writer.writeEndElement(); // </tr> } } else { - out() << "<ol type="; - if (atom->string() == ATOM_LIST_UPPERALPHA) { - out() << "\"A\""; - } /* why type? */ - else if (atom->string() == ATOM_LIST_LOWERALPHA) { - out() << "\"a\""; - } - else if (atom->string() == ATOM_LIST_UPPERROMAN) { - out() << "\"I\""; - } - else if (atom->string() == ATOM_LIST_LOWERROMAN) { - out() << "\"i\""; - } - else { // (atom->string() == ATOM_LIST_NUMERIC) - out() << "\"1\""; - } + writer.writeStartElement("ol"); + if (atom->string() == ATOM_LIST_UPPERALPHA) + writer.writeAttribute("type","A"); + else if (atom->string() == ATOM_LIST_LOWERALPHA) + writer.writeAttribute("type","a"); + else if (atom->string() == ATOM_LIST_UPPERROMAN) + writer.writeAttribute("type","I"); + else if (atom->string() == ATOM_LIST_LOWERROMAN) + writer.writeAttribute("type","i"); + else // (atom->string() == ATOM_LIST_NUMERIC) + writer.writeAttribute("type","1"); if (atom->next() != 0 && atom->next()->string().toInt() != 1) - out() << " start=\"" << atom->next()->string() << "\""; - out() << ">\n"; + writer.writeAttribute("start",atom->next()->string()); } break; case Atom::ListItemNumber: + // nothing break; case Atom::ListTagLeft: if (atom->string() == ATOM_LIST_TAG) { - out() << "<dt>"; + writer.writeStartElement("dt"); } else { // (atom->string() == ATOM_LIST_VALUE) - // ### Trenton - - out() << "<tr><td class=\"topAlign\"><tt>" - << protectEnc(plainCode(marker->markedUpEnumValue(atom->next()->string(), - relative))) - << "</tt></td><td class=\" topAlign\">"; + writer.writeStartElement("tr"); + writer.writeStartElement("td"); + writer.writeAttribute("outputclass","topAlign"); + writer.writeStartElement("tt"); + writer.writeCharacters(protectEnc(plainCode(marker->markedUpEnumValue(atom->next()->string(), + relative)))); + writer.writeEndElement(); // </tt> + writer.writeEndElement(); // </td> + writer.writeStartElement("td"); + writer.writeAttribute("outputclass","topAlign"); QString itemValue; if (relative->type() == Node::Enum) { @@ -870,188 +1145,179 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, } if (itemValue.isEmpty()) - out() << "?"; - else - out() << "<tt>" << protectEnc(itemValue) << "</tt>"; - + writer.writeCharacters("?"); + else { + writer.writeStartElement("tt"); + writer.writeCharacters(protectEnc(itemValue)); + writer.writeEndElement(); // </tt> + } skipAhead = 1; } break; case Atom::ListTagRight: if (atom->string() == ATOM_LIST_TAG) - out() << "</dt>\n"; + writer.writeEndElement(); // </dt> break; case Atom::ListItemLeft: if (atom->string() == ATOM_LIST_TAG) { - out() << "<dd>"; + writer.writeStartElement("dd"); } else if (atom->string() == ATOM_LIST_VALUE) { if (threeColumnEnumValueTable) { - out() << "</td><td class=\"topAlign\">"; + writer.writeEndElement(); // </td> + writer.writeStartElement("td"); + writer.writeAttribute("outputclass","topAlign"); if (matchAhead(atom, Atom::ListItemRight)) - out() << " "; + writer.writeCharacters(" "); } } else { - out() << "<li>"; + writer.writeStartElement("li"); } if (matchAhead(atom, Atom::ParaLeft)) skipAhead = 1; break; case Atom::ListItemRight: if (atom->string() == ATOM_LIST_TAG) { - out() << "</dd>\n"; + writer.writeEndElement(); // </dd> } else if (atom->string() == ATOM_LIST_VALUE) { - out() << "</td></tr>\n"; + writer.writeEndElement(); // </td> + writer.writeEndElement(); // </tr> } else { - out() << "</li>\n"; + writer.writeEndElement(); // </li> } break; case Atom::ListRight: if (atom->string() == ATOM_LIST_BULLET) { - out() << "</ul>\n"; + writer.writeEndElement(); // </ul> } else if (atom->string() == ATOM_LIST_TAG) { - out() << "</dl>\n"; + writer.writeEndElement(); // </dl> } else if (atom->string() == ATOM_LIST_VALUE) { - out() << "</table>\n"; + writer.writeEndElement(); // </table> } else { - out() << "</ol>\n"; + writer.writeEndElement(); // </ol> } break; case Atom::Nop: + // nothing break; case Atom::ParaLeft: - out() << "<p>"; + writer.writeStartElement("p"); in_para = true; break; case Atom::ParaRight: endLink(); if (in_para) { - out() << "</p>\n"; + writer.writeEndElement(); // </p? in_para = false; } - //if (!matchAhead(atom, Atom::ListItemRight) && !matchAhead(atom, Atom::TableItemRight)) - // out() << "</p>\n"; break; case Atom::QuotationLeft: - out() << "<blockquote>"; + writer.writeStartElement("blockquote"); break; case Atom::QuotationRight: - out() << "</blockquote>\n"; + writer.writeEndElement(); // </blockquote> break; case Atom::RawString: - out() << atom->string(); + writer.writeCharacters(atom->string()); break; case Atom::SectionLeft: -#if 0 - { - int nextLevel = atom->string().toInt(); - if (sectionNumber.size() < nextLevel) { - do { - sectionNumber.append("1"); - } while (sectionNumber.size() < nextLevel); - } - else { - while (sectionNumber.size() > nextLevel) { - sectionNumber.removeLast(); - } - sectionNumber.last() = QString::number(sectionNumber.last().toInt() + 1); - } - out() << "<a name=\"sec-" << sectionNumber.join("-") << "\"></a>\n"; - } -#else - out() << "<a name=\"" << Doc::canonicalTitle(Text::sectionHeading(atom).toString()) - << "\"></a>\n"; -#endif + writer.writeStartElement("p"); + writeGuidAttribute(Doc::canonicalTitle(Text::sectionHeading(atom).toString())); + writer.writeAttribute("outputclass","target"); + writer.writeCharacters(protectEnc(Text::sectionHeading(atom).toString())); + writer.writeEndElement(); // </p> break; case Atom::SectionRight: + // nothing break; case Atom::SectionHeadingLeft: - out() << "<h" + QString::number(atom->string().toInt() + hOffset(relative)) + ">"; + writer.writeStartElement("p"); + hx = "h" + QString::number(atom->string().toInt() + hOffset(relative)); + writer.writeAttribute("outputclass",hx); inSectionHeading = true; break; case Atom::SectionHeadingRight: - out() << "</h" + QString::number(atom->string().toInt() + hOffset(relative)) + ">\n"; + writer.writeEndElement(); // </p> (see case Atom::SectionHeadingLeft) inSectionHeading = false; break; case Atom::SidebarLeft: + // nothing break; case Atom::SidebarRight: + // nothing break; case Atom::String: if (inLink && !inContents && !inSectionHeading) { generateLink(atom, relative, marker); } else { - out() << protectEnc(atom->string()); + writer.writeCharacters(protectEnc(atom->string())); } break; case Atom::TableLeft: if (in_para) { - out() << "</p>\n"; + writer.writeEndElement(); // </p> in_para = false; } - if (!atom->string().isEmpty()) { - if (atom->string().contains("%")) - out() << "<table class=\"generic\">\n "; // width=\"" << atom->string() << "\">\n "; - else { - out() << "<table class=\"generic\">\n"; - } - } - else { - out() << "<table class=\"generic\">\n"; - } + writer.writeStartElement("table"); + writer.writeAttribute("outputclass","generic"); numTableRows = 0; break; case Atom::TableRight: - out() << "</table>\n"; + writer.writeEndElement(); // </table> break; case Atom::TableHeaderLeft: - out() << "<thead><tr class=\"qt-style topAlign\">"; + writer.writeStartElement("thead"); + writer.writeStartElement("tr"); + writer.writeAttribute("outputclass","qt-style topAlign"); inTableHeader = true; break; case Atom::TableHeaderRight: - out() << "</tr>"; + writer.writeEndElement(); // </tr> if (matchAhead(atom, Atom::TableHeaderLeft)) { skipAhead = 1; - out() << "\n<tr class=\"qt-style topAlign\">"; + writer.writeStartElement("tr"); + writer.writeAttribute("outputclass","qt-style topAlign"); } - else { - out() << "</thead>\n"; + else { + writer.writeEndElement(); // </thead> inTableHeader = false; } break; case Atom::TableRowLeft: + writer.writeStartElement("tr"); if (++numTableRows % 2 == 1) - out() << "<tr class=\"odd topAlign\">"; + writer.writeAttribute("outputclass","odd topAlign"); else - out() << "<tr class=\"even topAlign\">"; + writer.writeAttribute("outputclass","even topAlign"); break; case Atom::TableRowRight: - out() << "</tr>\n"; + writer.writeEndElement(); // </tr>\n"; break; case Atom::TableItemLeft: { if (inTableHeader) - out() << "<th"; + writer.writeStartElement("th"); else - out() << "<td"; + writer.writeStartElement("td"); QStringList spans = atom->string().split(","); if (spans.size() == 2) { +#if zzz + if (spans.at(0) != "1") out() << " colspan=\"" << spans.at(0) << "\""; if (spans.at(1) != "1") out() << " rowspan=\"" << spans.at(1) << "\""; - if (inTableHeader) - out() << ">"; - else - out() << "><p>"; +#endif + if (!inTableHeader) + writer.writeStartElement("p"); } if (matchAhead(atom, Atom::ParaLeft)) skipAhead = 1; @@ -1059,9 +1325,11 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, break; case Atom::TableItemRight: if (inTableHeader) - out() << "</th>"; - else - out() << "</p></td>"; + writer.writeEndElement(); // </th> + else { + writer.writeEndElement(); // </p> + writer.writeEndElement(); // </td> + } if (matchAhead(atom, Atom::ParaLeft)) skipAhead = 1; break; @@ -1095,14 +1363,23 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, } break; case Atom::Target: - out() << "<a name=\"" << Doc::canonicalTitle(atom->string()) << "\"></a>"; + writer.writeStartElement("p"); + writeGuidAttribute(Doc::canonicalTitle(atom->string())); + writer.writeAttribute("outputclass","target"); + writer.writeCharacters(protectEnc(atom->string())); + writer.writeEndElement(); // </p> break; case Atom::UnhandledFormat: - out() << "<b class=\"redFont\"><Missing DITAXML></b>"; + writer.writeStartElement("b"); + writer.writeAttribute("outputclass","redFont"); + writer.writeCharacters("<Missing DITAXML>"); + writer.writeEndElement(); // </b> break; case Atom::UnknownCommand: - out() << "<b class=\"redFont\"><code>\\" << protectEnc(atom->string()) - << "</code></b>"; + writer.writeStartElement("b"); + writer.writeAttribute("outputclass","redFont code"); + writer.writeCharacters(protectEnc(atom->string())); + writer.writeEndElement(); // </b> break; #ifdef QDOC_QML case Atom::QmlText: @@ -1111,7 +1388,8 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, break; #endif default: - unknownAtom(atom); + // unknownAtom(atom); + break; } return skipAhead; } @@ -1119,82 +1397,134 @@ int DitaXmlGenerator::generateAtom(const Atom *atom, /*! Generate a reference page for a C++ class. */ -void DitaXmlGenerator::generateClassLikeNode(const InnerNode *inner, - CodeMarker *marker) +void +DitaXmlGenerator::generateClassLikeNode(const InnerNode* inner, CodeMarker* marker) { QList<Section> sections; QList<Section>::ConstIterator s; - const ClassNode *classe = 0; - const NamespaceNode *namespasse = 0; + const ClassNode* cn = 0; + const NamespaceNode* namespasse = 0; QString title; QString rawTitle; QString fullTitle; if (inner->type() == Node::Namespace) { - namespasse = static_cast<const NamespaceNode *>(inner); + namespasse = const_cast<NamespaceNode*>(static_cast<const NamespaceNode*>(inner)); rawTitle = marker->plainName(inner); fullTitle = marker->plainFullName(inner); title = rawTitle + " Namespace"; } else if (inner->type() == Node::Class) { - classe = static_cast<const ClassNode *>(inner); + cn = const_cast<ClassNode*>(static_cast<const ClassNode*>(inner)); rawTitle = marker->plainName(inner); fullTitle = marker->plainFullName(inner); title = rawTitle + " Class Reference"; - } - DcfSection classSection; - classSection.title = title; - classSection.ref = linkForNode(inner, 0); - classSection.keywords += qMakePair(inner->name(), classSection.ref); + generateHeader(inner); + + writer.writeStartElement(CXXCLASS); + writer.writeAttribute("id",cn->guid()); + writer.writeStartElement(APINAME); + writer.writeCharacters(fullTitle); + writer.writeEndElement(); // </apiName> + + generateBrief(inner, marker); + + writer.writeStartElement(CXXCLASSDETAIL); + writer.writeStartElement(CXXCLASSDEFINITION); + writer.writeStartElement(CXXCLASSACCESSSPECIFIER); + writer.writeAttribute("value",inner->accessString()); + writer.writeEndElement(); // <cxxClassAccessSpecifier> + if (cn->isAbstract()) { + writer.writeStartElement(CXXCLASSABSTRACT); + writer.writeAttribute("name","abstract"); + writer.writeAttribute("value","abstract"); + writer.writeEndElement(); // </cxxClassAbstract> + } + writeDerivations(cn, marker); + writeLocation(cn); + writer.writeEndElement(); // <cxxClassDefinition> + writer.writeStartElement(APIDESC); + + if (!inner->doc().isEmpty()) { + writer.writeStartElement("p"); + writer.writeAttribute("outputclass","h2"); + writer.writeCharacters("Detailed Description"); + writer.writeEndElement(); // </p> + generateBody(inner, marker); + // generateAlsoList(inner, marker); + } + + writer.writeEndElement(); // </apiDesc> + writer.writeEndElement(); // </cxxClassDetail> + + sections = marker->sections(inner, CodeMarker::Detailed, CodeMarker::Okay); + s = sections.begin(); + while (s != sections.end()) { + if ((*s).name == "Member Function Documentation") { + writeFunctions((*s),cn,marker); + } + else if ((*s).name == "Member Type Documentation") { + writeEnumerations((*s),cn,marker); + writeTypedefs((*s),cn,marker); + } + else if ((*s).name == "Member Variable Documentation") { + writeDataMembers((*s),cn,marker); + } + else if ((*s).name == "Property Documentation") { + writeProperties((*s),cn,marker); + } + else if ((*s).name == "Macro Documentation") { + writeMacros((*s),cn,marker); + } + ++s; + } + writer.writeEndElement(); // </cxxClass> + } +#ifdef WRITE_HTML Text subtitleText; if (rawTitle != fullTitle) subtitleText << "(" << Atom(Atom::AutoLink, fullTitle) << ")" << Atom(Atom::LineBreak); -#if 0 - // No longer used because the modeule name is a breadcrumb. - QString fixedModule = inner->moduleName(); - if (fixedModule == "Qt3SupportLight") - fixedModule = "Qt3Support"; - if (!fixedModule.isEmpty()) - subtitleText << "[" << Atom(Atom::AutoLink, fixedModule) << " module]"; - - if (fixedModule.isEmpty()) { - QMultiMap<QString, QString> publicGroups = myTree->publicGroups(); - QList<QString> groupNames = publicGroups.values(inner->name()); - if (!groupNames.isEmpty()) { - qSort(groupNames.begin(), groupNames.end()); - subtitleText << "["; - for (int j=0; j<groupNames.count(); j++) { - subtitleText << Atom(Atom::AutoLink, groupNames[j]); - if (j<groupNames.count()-1) - subtitleText <<", "; - } - subtitleText << "]"; - } + QString shortVersion; + shortVersion = project + " " + shortVersion + ": "; + shortVersion = myTree->version(); + if (shortVersion.count(QChar('.')) == 2) + shortVersion.truncate(shortVersion.lastIndexOf(QChar('.'))); + if (!shortVersion.isEmpty()) { + if (project == "QSA") + shortVersion = "QSA " + shortVersion + ": "; + else + shortVersion = "Qt " + shortVersion + ": "; } -#endif - generateHeader(title, inner, marker); + out() << " <title>" << shortVersion << protectEnc(title) << "</title>\n"; + +#if 0 + out() << QString(postHeader).replace("\\" + COMMAND_VERSION, myTree->version()); + generateBreadCrumbs(title,node,marker); + out() << QString(postPostHeader).replace("\\" + COMMAND_VERSION, myTree->version()); +#endif + sections = marker->sections(inner, CodeMarker::Summary, CodeMarker::Okay); generateTableOfContents(inner,marker,§ions); generateTitle(title, subtitleText, SmallSubTitle, inner, marker); #ifdef QDOC_QML - if (classe && !classe->qmlElement().isEmpty()) { - generateInstantiatedBy(classe,marker); + if (cn && !cn->qmlElement().isEmpty()) { + generateInstantiatedBy(cn,marker); } #endif generateBrief(inner, marker); generateIncludes(inner, marker); generateStatus(inner, marker); - if (classe) { - generateInherits(classe, marker); - generateInheritedBy(classe, marker); + if (cn) { + generateInherits(cn, marker); + generateInheritedBy(cn, marker); } generateThreadSafeness(inner, marker); generateSince(inner, marker); @@ -1203,22 +1533,22 @@ void DitaXmlGenerator::generateClassLikeNode(const InnerNode *inner, QString membersLink = generateListOfAllMemberFile(inner, marker); if (!membersLink.isEmpty()) - out() << "<li><a href=\"" << membersLink << "\">" - << "List of all members, including inherited members</a></li>\n"; + out() << "<li><xref href=\"" << membersLink << "\">" + << "List of all members, including inherited members</xref></li>\n"; QString obsoleteLink = generateLowStatusMemberFile(inner, marker, CodeMarker::Obsolete); if (!obsoleteLink.isEmpty()) - out() << "<li><a href=\"" << obsoleteLink << "\">" - << "Obsolete members</a></li>\n"; + out() << "<li><xref href=\"" << obsoleteLink << "\">" + << "Obsolete members</xref></li>\n"; QString compatLink = generateLowStatusMemberFile(inner, marker, CodeMarker::Compat); if (!compatLink.isEmpty()) - out() << "<li><a href=\"" << compatLink << "\">" - << "Qt 3 support members</a></li>\n"; + out() << "<li><xref href=\"" << compatLink << "\">" + << "Qt 3 support members</xref></li>\n"; out() << "</ul>\n"; @@ -1335,8 +1665,6 @@ void DitaXmlGenerator::generateClassLikeNode(const InnerNode *inner, names << plainCode(marker->markedUpEnumValue(enumName, enume)); } - foreach (const QString &name, names) - classSection.keywords += qMakePair(name,linkForNode(*m,0)); } ++m; } @@ -1344,28 +1672,7 @@ void DitaXmlGenerator::generateClassLikeNode(const InnerNode *inner, out() << "</div>\n"; // QTBUG-9504 ++s; } - generateFooter(inner); - - if (!membersLink.isEmpty()) { - DcfSection membersSection; - membersSection.title = "List of all members"; - membersSection.ref = membersLink; - appendDcfSubSection(&classSection, membersSection); - } - if (!obsoleteLink.isEmpty()) { - DcfSection obsoleteSection; - obsoleteSection.title = "Obsolete members"; - obsoleteSection.ref = obsoleteLink; - appendDcfSubSection(&classSection, obsoleteSection); - } - if (!compatLink.isEmpty()) { - DcfSection compatSection; - compatSection.title = "Qt 3 support members"; - compatSection.ref = compatLink; - appendDcfSubSection(&classSection, compatSection); - } - - appendDcfSubSection(&dcfClassesRoot, classSection); +#endif } /*! @@ -1374,16 +1681,14 @@ void DitaXmlGenerator::generateClassLikeNode(const InnerNode *inner, */ void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker) { + return; // zzz + SubTitleSize subTitleSize = LargeSubTitle; - DcfSection fakeSection; - fakeSection.title = fake->fullTitle(); - fakeSection.ref = linkForNode(fake, 0); - QList<Section> sections; QList<Section>::const_iterator s; - QString fullTitle = fake->fullTitle(); QString htmlTitle = fullTitle; + if (fake->subType() == Node::File && !fake->subTitle().isEmpty()) { subTitleSize = SmallSubTitle; htmlTitle += " (" + fake->subTitle() + ")"; @@ -1393,7 +1698,7 @@ void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker htmlTitle = fullTitle; } - generateHeader(htmlTitle, fake, marker); + generateHeader(fake); /* Generate the TOC for the new doc format. @@ -1433,43 +1738,24 @@ void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker QString membersLink = generateListOfAllMemberFile(fake, marker); if (!membersLink.isEmpty()) - out() << "<li><a href=\"" << membersLink << "\">" - << "List of all members, including inherited members</a></li>\n"; + out() << "<li><xref href=\"" << membersLink << "\">" + << "List of all members, including inherited members</xref></li>\n"; QString obsoleteLink = generateLowStatusMemberFile(fake, marker, CodeMarker::Obsolete); if (!obsoleteLink.isEmpty()) - out() << "<li><a href=\"" << obsoleteLink << "\">" - << "Obsolete members</a></li>\n"; + out() << "<li><xref href=\"" << obsoleteLink << "\">" + << "Obsolete members</xref></li>\n"; QString compatLink = generateLowStatusMemberFile(fake, marker, CodeMarker::Compat); if (!compatLink.isEmpty()) - out() << "<li><a href=\"" << compatLink << "\">" - << "Qt 3 support members</a></li>\n"; + out() << "<li><xref href=\"" << compatLink << "\">" + << "Qt 3 support members</xref></li>\n"; out() << "</ul>\n"; - - if (!membersLink.isEmpty()) { - DcfSection membersSection; - membersSection.title = "List of all members"; - membersSection.ref = membersLink; - appendDcfSubSection(&fakeSection, membersSection); - } - if (!obsoleteLink.isEmpty()) { - DcfSection obsoleteSection; - obsoleteSection.title = "Obsolete members"; - obsoleteSection.ref = obsoleteLink; - appendDcfSubSection(&fakeSection, obsoleteSection); - } - if (!compatLink.isEmpty()) { - DcfSection compatSection; - compatSection.title = "Qt 3 support members"; - compatSection.ref = compatLink; - appendDcfSubSection(&fakeSection, compatSection); - } } #ifdef QDOC_QML else if (fake->subType() == Node::QmlClass) { @@ -1504,13 +1790,10 @@ void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker while (m != (*s).members.end()) { generateDetailedQmlMember(*m, fake, marker); out() << "<br/>\n"; - fakeSection.keywords += qMakePair((*m)->name(), - linkForNode(*m,0)); ++m; } ++s; } - generateFooter(fake); return; } #endif @@ -1546,8 +1829,6 @@ void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker generateAnnotatedList(fake, marker, groupMembersMap); } - fakeSection.keywords += qMakePair(fakeSection.title, fakeSection.ref); - sections = marker->sections(fake, CodeMarker::Detailed, CodeMarker::Okay); s = sections.begin(); while (s != sections.end()) { @@ -1557,57 +1838,32 @@ void DitaXmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker NodeList::ConstIterator m = (*s).members.begin(); while (m != (*s).members.end()) { generateDetailedMember(*m, fake, marker); - fakeSection.keywords += qMakePair((*m)->name(), linkForNode(*m, 0)); ++m; } ++s; } - generateFooter(fake); - - if (fake->subType() == Node::Example) { - appendDcfSubSection(&dcfExamplesRoot, fakeSection); - } - else if (fake->subType() != Node::File) { - QString contentsPage = fake->links().value(Node::ContentsLink).first; - - if (contentsPage == "Qt Designer Manual") { - appendDcfSubSection(&dcfDesignerRoot, fakeSection); - } - else if (contentsPage == "Qt Linguist Manual") { - appendDcfSubSection(&dcfLinguistRoot, fakeSection); - } - else if (contentsPage == "Qt Assistant Manual") { - appendDcfSubSection(&dcfAssistantRoot, fakeSection); - } - else if (contentsPage == "qmake Manual") { - appendDcfSubSection(&dcfQmakeRoot, fakeSection); - } - else { - appendDcfSubSection(&dcfOverviewsRoot, fakeSection); - } - } } /*! - Returns "html" for this subclass of Generator. + Returns "xml" for this subclass of Generator. */ QString DitaXmlGenerator::fileExtension(const Node * /* node */) const { - return "html"; + return "xml"; } /*! Output breadcrumb list in the html file. */ void DitaXmlGenerator::generateBreadCrumbs(const QString& title, - const Node *node, - CodeMarker *marker) + const Node *node, + CodeMarker *marker) { Text breadcrumb; if (node->type() == Node::Class) { const ClassNode* cn = static_cast<const ClassNode*>(node); QString name = node->moduleName(); - out() << " <li><a href=\"modules.html\">All Modules</a></li>"; + out() << " <li><xref href=\"modules.html\">All Modules</xref></li>"; if (!name.isEmpty()) { out() << " <li>"; breadcrumb << Atom(Atom::AutoLink,name); @@ -1625,7 +1881,7 @@ void DitaXmlGenerator::generateBreadCrumbs(const QString& title, else if (node->type() == Node::Fake) { const FakeNode* fn = static_cast<const FakeNode*>(node); if (node->subType() == Node::Module) { - out() << " <li><a href=\"modules.html\">All Modules</a></li>"; + out() << " <li><xref href=\"modules.html\">All Modules</xref></li>"; QString name = node->name(); if (!name.isEmpty()) { out() << " <li>"; @@ -1636,125 +1892,85 @@ void DitaXmlGenerator::generateBreadCrumbs(const QString& title, } else if (node->subType() == Node::Group) { if (fn->name() == QString("modules")) - out() << " <li><a href=\"modules.html\">All Modules</a></li>"; + out() << " <li><xref href=\"modules.html\">All Modules</xref></li>"; else { - out() << " <li><a href=\"" << fn->name() << "\">" << title - << "</a></li>"; + out() << " <li><xref href=\"" << fn->name() << "\">" << title + << "</xref></li>"; } } else if (node->subType() == Node::Page) { if (fn->name() == QString("examples.html")) { - out() << " <li><a href=\"all-examples.html\">Examples</a></li>"; + out() << " <li><xref href=\"all-examples.html\">Examples</xref></li>"; } else if (fn->name().startsWith("examples-")) { - out() << " <li><a href=\"all-examples.html\">Examples</a></li>"; - out() << " <li><a href=\"" << fn->name() << "\">" << title - << "</a></li>"; + out() << " <li><xref href=\"all-examples.html\">Examples</xref></li>"; + out() << " <li><xref href=\"" << fn->name() << "\">" << title + << "</xref></li>"; } else if (fn->name() == QString("namespaces.html")) { - out() << " <li><a href=\"namespaces.html\">All Namespaces</a></li>"; + out() << " <li><xref href=\"namespaces.html\">All Namespaces</xref></li>"; } else { - out() << " <li><a href=\"" << fn->name() << "\">" << title - << "</a></li>"; + out() << " <li><xref href=\"" << fn->name() << "\">" << title + << "</xref></li>"; } } else if (node->subType() == Node::QmlClass) { - out() << " <li><a href=\"qdeclarativeelements.html\">QML Elements</a></li>"; - out() << " <li><a href=\"" << fn->name() << "\">" << title - << "</a></li>"; + out() << " <li><xref href=\"qdeclarativeelements.html\">QML Elements</xref></li>"; + out() << " <li><xref href=\"" << fn->name() << "\">" << title + << "</xref></li>"; } else if (node->subType() == Node::Example) { - out() << " <li><a href=\"all-examples.html\">Examples</a></li>"; + out() << " <li><xref href=\"all-examples.html\">Examples</xref></li>"; QStringList sl = fn->name().split('/'); QString name = "examples-" + sl.at(0) + ".html"; QString t = CodeParser::titleFromName(name); - out() << " <li><a href=\"" << name << "\">" - << t << "</a></li>"; - out() << " <li><a href=\"" << sl.at(0) + out() << " <li><xref href=\"" << name << "\">" + << t << "</xref></li>"; + out() << " <li><xref href=\"" << sl.at(0) << "-" << sl.at(sl.size()-1) << ".html\">" - << title << "</a></li>"; + << title << "</xref></li>"; } } else if (node->type() == Node::Namespace) { const NamespaceNode* nsn = static_cast<const NamespaceNode*>(node); - out() << " <li><a href=\"namespaces.html\">All Namespaces</a></li>"; - out() << " <li><a href=\"" << fileName(nsn) << "\">" << title - << "</a></li>"; + out() << " <li><xref href=\"namespaces.html\">All Namespaces</xref></li>"; + out() << " <li><xref href=\"" << fileName(nsn) << "\">" << title + << "</xref></li>"; } } -void DitaXmlGenerator::generateHeader(const QString& title, - const Node *node, - CodeMarker *marker) +void DitaXmlGenerator::generateHeader(const Node* node) { - out() << QString("<?xml version=\"1.0\" encoding=\"%1\"?>\n").arg(outputEncoding); - out() << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"; - out() << QString("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"%1\" lang=\"%1\">\n").arg(naturalLanguage); - out() << "<head>\n"; - out() << " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n"; - QString shortVersion; - shortVersion = project + " " + shortVersion + ": "; - if (node && !node->doc().location().isEmpty()) - out() << "<!-- " << node->doc().location().fileName() << " -->\n"; + writer.setDevice(out().device()); + writer.setAutoFormatting(true); + writer.setAutoFormattingIndent(4); + writer.writeStartDocument(); + + if (!node) + return; - shortVersion = myTree->version(); - if (shortVersion.count(QChar('.')) == 2) - shortVersion.truncate(shortVersion.lastIndexOf(QChar('.'))); - if (!shortVersion.isEmpty()) { - if (project == "QSA") - shortVersion = "QSA " + shortVersion + ": "; - else - shortVersion = "Qt " + shortVersion + ": "; + QString docType; + QString dtd; + QString version; + if (node->type() == Node::Class) { + docType = "cxxClass"; + dtd = "dtd/cxxClass.dtd"; + version = "0.6.0"; } - out() << " <title>" << shortVersion << protectEnc(title) << "</title>\n"; - - out() << " <!--[if IE]>"; - out() << "<meta name=\"MSSmartTagsPreventParsing\" content=\"true\">"; - out() << "<meta http-equiv=\"imagetoolbar\" content=\"no\">"; - out() << "<![endif]-->"; - out() << "<!--[if lt IE 7]>"; - out() << "<link rel=\"stylesheet\" type=\"text/css\" href=\"style/style_ie6.css\">"; - out() << "<![endif]-->"; - out() << "<!--[if IE 7]>"; - out() << "<link rel=\"stylesheet\" type=\"text/css\" href=\"style/style_ie7.css\">"; - out() << "<![endif]-->"; - out() << "<!--[if IE 8]>"; - out() << "<link rel=\"stylesheet\" type=\"text/css\" href=\"style/style_ie8.css\">"; - out() << "<![endif]-->"; - - - //out() << " <title>Qt Reference Documentation</title>"; - out() << " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/style.css\" />\n"; - out() << " <script src=\"scripts/jquery.js\" type=\"text/javascript\"></script>\n"; - out() << " <script src=\"scripts/functions.js\" type=\"text/javascript\"></script>\n"; - out() << "</head>\n"; - - if (offlineDocs) - out() << "<body class=\"offline\" onload=\"CheckEmptyAndLoadList();\">\n"; - else - out() << "<body class=\"\" onload=\"CheckEmptyAndLoadList();\">\n"; - -#ifdef GENERATE_MAC_REFS - if (mainPage) - generateMacRef(node, marker); -#endif - out() << QString(postHeader).replace("\\" + COMMAND_VERSION, myTree->version()); - generateBreadCrumbs(title,node,marker); - out() << QString(postPostHeader).replace("\\" + COMMAND_VERSION, myTree->version()); - -#if 0 // Removed for new docf format. MWS - if (node && !node->links().empty()) - out() << "<p>\n" << navigationLinks << "</p>\n"; -#endif + QString doctype = "<!DOCTYPE " + docType + + " PUBLIC \"-//NOKIA//DTD DITA C++ API Class Reference Type v" + + version + "//EN\" \"" + dtd + "\">"; + writer.writeDTD(doctype); + writer.writeComment(node->doc().location().fileName()); } void DitaXmlGenerator::generateTitle(const QString& title, - const Text &subTitle, - SubTitleSize subTitleSize, - const Node *relative, - CodeMarker *marker) + const Text &subTitle, + SubTitleSize subTitleSize, + const Node *relative, + CodeMarker *marker) { if (!title.isEmpty()) out() << "<h1 class=\"title\">" << protectEnc(title) << "</h1>\n"; @@ -1769,30 +1985,18 @@ void DitaXmlGenerator::generateTitle(const QString& title, } } -void DitaXmlGenerator::generateFooter(const Node *node) -{ - if (node && !node->links().empty()) - out() << "<p>\n" << navigationLinks << "</p>\n"; - - out() << QString(footer).replace("\\" + COMMAND_VERSION, myTree->version()) - << QString(address).replace("\\" + COMMAND_VERSION, myTree->version()); - out() << " <script src=\"scripts/functions.js\" type=\"text/javascript\"></script>\n"; - out() << "</body>\n"; - out() << "</html>\n"; -} - -void DitaXmlGenerator::generateBrief(const Node *node, CodeMarker *marker, - const Node *relative) +/*! + Outputs the brief command as a <shortdesc" element. + */ +void DitaXmlGenerator::generateBrief(const Node* node, CodeMarker* marker) { Text brief = node->doc().briefText(); if (!brief.isEmpty()) { - out() << "<p>"; + ++noLinks; + writer.writeStartElement(SHORTDESC); generateText(brief, node, marker); - if (!relative || node == relative) - out() << " <a href=\"#"; - else - out() << " <a href=\"" << linkForNode(node, relative) << "#"; - out() << registerRef("details") << "\">More...</a></p>\n"; + writer.writeEndElement(); // shortdesc + --noLinks; } } @@ -1870,13 +2074,13 @@ void DitaXmlGenerator::generateTableOfContents(const Node *node, columnSize = 0; } out() << "<li>"; - out() << "<a href=\"" + out() << "<xref href=\"" << nodeName << "#" << Doc::canonicalTitle(headingText.toString()) << "\">"; generateAtomList(headingText.firstAtom(), node, marker, true, numAtoms); - out() << "</a></li>\n"; + out() << "</xref></li>\n"; ++columnSize; } @@ -1922,22 +2126,22 @@ void DitaXmlGenerator::generateTableOfContents(const Node *node, if (moduleNamespaceMap.contains(node->name())) { out() << "<li class=\"level" << sectionNumber.size() - << "\"><a href=\"#" + << "\"><xref href=\"#" << registerRef("namespaces") - << "\">Namespaces</a></li>\n"; + << "\">Namespaces</xref></li>\n"; } if (moduleClassMap.contains(node->name())) { out() << "<li class=\"level" << sectionNumber.size() - << "\"><a href=\"#" + << "\"><xref href=\"#" << registerRef("classes") - << "\">Classes</a></li>\n"; + << "\">Classes</xref></li>\n"; } out() << "<li class=\"level" << sectionNumber.size() - << "\"><a href=\"#" + << "\"><xref href=\"#" << registerRef("details") - << "\">Detailed Description</a></li>\n"; + << "\">Detailed Description</xref></li>\n"; for (int i = 0; i < toc.size(); ++i) { if (toc.at(i)->string().toInt() == 1) { detailsBase = 1; @@ -1951,18 +2155,18 @@ void DitaXmlGenerator::generateTableOfContents(const Node *node, if (!s->members.isEmpty() || !s->reimpMembers.isEmpty()) { out() << "<li class=\"level" << sectionNumber.size() - << "\"><a href=\"#" + << "\"><xref href=\"#" << registerRef((*s).pluralMember) << "\">" << (*s).name - << "</a></li>\n"; + << "</xref></li>\n"; } ++s; } out() << "<li class=\"level" << sectionNumber.size() - << "\"><a href=\"#" + << "\"><xref href=\"#" << registerRef("details") - << "\">Detailed Description</a></li>\n"; + << "\">Detailed Description</xref></li>\n"; for (int i = 0; i < toc.size(); ++i) { if (toc.at(i)->string().toInt() == 1) { detailsBase = 1; @@ -1991,12 +2195,12 @@ void DitaXmlGenerator::generateTableOfContents(const Node *node, out() << "<li class=\"level" << sectionNumber.size() << "\">"; - out() << "<a href=\"" + out() << "<xref href=\"" << "#" << Doc::canonicalTitle(s) << "\">"; generateAtomList(headingText.firstAtom(), node, marker, true, numAtoms); - out() << "</a></li>\n"; + out() << "</xref></li>\n"; } while (!sectionNumber.isEmpty()) { sectionNumber.removeLast(); @@ -2007,37 +2211,6 @@ void DitaXmlGenerator::generateTableOfContents(const Node *node, inLink = false; } -#if 0 -void DitaXmlGenerator::generateNavigationBar(const NavigationBar& bar, - const Node *node, - CodeMarker *marker) -{ - if (bar.prev.begin() != 0 || bar.current.begin() != 0 || - bar.next.begin() != 0) { - out() << "<p class=\"rightAlign\">"; - if (bar.prev.begin() != 0) { -#if 0 - out() << "[<a href=\"" << section.previousBaseName() - << ".html\">Prev: "; - generateText(section.previousHeading(), node, marker); - out() << "</a>]\n"; -#endif - } - if (bar.current.begin() != 0) { - out() << "[<a href=\"" << "home" - << ".html\">Home</a>]\n"; - } - if (bar.next.begin() != 0) { - out() << "[<a href=\"" << fileBase(node, bar.next) - << ".html\">Next: "; - generateText(Text::sectionHeading(bar.next.begin()), node, marker); - out() << "</a>]\n"; - } - out() << "</p>\n"; - } -} -#endif - QString DitaXmlGenerator::generateListOfAllMemberFile(const InnerNode *inner, CodeMarker *marker) { @@ -2053,7 +2226,7 @@ QString DitaXmlGenerator::generateListOfAllMemberFile(const InnerNode *inner, QString fileName = fileBase(inner) + "-members." + fileExtension(inner); beginSubPage(inner->location(), fileName); QString title = "List of All Members for " + inner->name(); - generateHeader(title, inner, marker); + generateHeader(inner); generateTitle(title, Text(), SmallSubTitle, inner, marker); out() << "<p>This is the complete list of members for "; generateFullName(inner, 0, marker); @@ -2062,7 +2235,6 @@ QString DitaXmlGenerator::generateListOfAllMemberFile(const InnerNode *inner, Section section = sections.first(); generateSectionList(section, 0, marker, CodeMarker::SeparateList); - generateFooter(); endSubPage(); return fileName; } @@ -2097,12 +2269,12 @@ QString DitaXmlGenerator::generateLowStatusMemberFile(const InnerNode *inner, } beginSubPage(inner->location(), fileName); - generateHeader(title, inner, marker); + generateHeader(inner); generateTitle(title, Text(), SmallSubTitle, inner, marker); if (status == CodeMarker::Compat) { out() << "<p><b>The following class members are part of the " - "<a href=\"qt3support.html\">Qt 3 support layer</a>.</b> " + "<xref href=\"qt3support.html\">Qt 3 support layer</xref>.</b> " "They are provided to help you port old code to Qt 4. We advise against " "using them in new code.</p>\n"; } @@ -2112,10 +2284,10 @@ QString DitaXmlGenerator::generateLowStatusMemberFile(const InnerNode *inner, << "We strongly advise against using them in new code.</p>\n"; } - out() << "<p><ul><li><a href=\"" + out() << "<p><ul><li><xref href=\"" << linkForNode(inner, 0) << "\">" << protectEnc(inner->name()) - << " class reference</a></li></ul></p>\n"; + << " class reference</xref></li></ul></p>\n"; for (i = 0; i < sections.size(); ++i) { out() << "<h2>" << protectEnc(sections.at(i).name) << "</h2>\n"; @@ -2135,7 +2307,6 @@ QString DitaXmlGenerator::generateLowStatusMemberFile(const InnerNode *inner, } } - generateFooter(); endSubPage(); return fileName; } @@ -2362,7 +2533,7 @@ void DitaXmlGenerator::generateCompactList(const Node *relative, for (int i = 0; i < 26; i++) { QChar ch('a' + i); if (usedParagraphNames.contains(char('a' + i))) - out() << QString("<a href=\"#%1\">%2</a> ").arg(ch).arg(ch.toUpper()); + out() << QString("<xref href=\"#%1\">%2</xref> ").arg(ch).arg(ch.toUpper()); } out() << "</b></p>\n"; } @@ -2415,7 +2586,7 @@ void DitaXmlGenerator::generateCompactList(const Node *relative, Previously, we used generateFullName() for this, but we require some special formatting. */ - out() << "<a href=\"" << linkForNode(it.value(), relative) << "\">"; + out() << "<xref href=\"" << linkForNode(it.value(), relative) << "\">"; QStringList pieces; if (it.value()->subType() == Node::QmlClass) @@ -2423,7 +2594,7 @@ void DitaXmlGenerator::generateCompactList(const Node *relative, else pieces = fullName(it.value(), relative, marker).split("::"); out() << protectEnc(pieces.last()); - out() << "</a>"; + out() << "</xref>"; if (pieces.size() > 1) { out() << " ("; generateFullName(it.value()->parent(), relative, marker); @@ -2443,7 +2614,7 @@ void DitaXmlGenerator::generateFunctionIndex(const Node *relative, out() << "<p class=\"centerAlign functionIndex\"><b>"; for (int i = 0; i < 26; i++) { QChar ch('a' + i); - out() << QString("<a href=\"#%1\">%2</a> ").arg(ch).arg(ch.toUpper()); + out() << QString("<xref href=\"#%1\">%2</xref> ").arg(ch).arg(ch.toUpper()); } out() << "</b></p>\n"; @@ -2657,7 +2828,7 @@ void DitaXmlGenerator::generateOverviewList(const Node *relative, CodeMarker * / if (!fakeNodeMap.isEmpty()) { foreach (const QString &groupTitle, groupTitlesMap.keys()) { const FakeNode *groupNode = groupTitlesMap[groupTitle]; - out() << QString("<h3><a href=\"%1\">%2</a></h3>\n").arg( + out() << QString("<h3><xref href=\"%1\">%2</xref></h3>\n").arg( linkForNode(groupNode, relative)).arg( protectEnc(groupNode->fullTitle())); @@ -2670,8 +2841,8 @@ void DitaXmlGenerator::generateOverviewList(const Node *relative, CodeMarker * / QString title = fakeNode->fullTitle(); if (title.startsWith("The ")) title.remove(0, 4); - out() << "<li><a href=\"" << linkForNode(fakeNode, relative) << "\">" - << protectEnc(title) << "</a></li>\n"; + out() << "<li><xref href=\"" << linkForNode(fakeNode, relative) << "\">" + << protectEnc(title) << "</xref></li>\n"; } out() << "</ul>\n"; } @@ -2684,14 +2855,13 @@ void DitaXmlGenerator::generateOverviewList(const Node *relative, CodeMarker * / QString title = fakeNode->fullTitle(); if (title.startsWith("The ")) title.remove(0, 4); - out() << "<li><a href=\"" << linkForNode(fakeNode, relative) << "\">" - << protectEnc(title) << "</a></li>\n"; + out() << "<li><xref href=\"" << linkForNode(fakeNode, relative) << "\">" + << protectEnc(title) << "</xref></li>\n"; } out() << "</ul>\n"; } } -#ifdef QDOC_NAME_ALIGNMENT void DitaXmlGenerator::generateSection(const NodeList& nl, const Node *relative, CodeMarker *marker, @@ -2838,10 +3008,10 @@ void DitaXmlGenerator::generateSectionInheritedList(const Section& section, else { out() << section.pluralMember; } - out() << " inherited from <a href=\"" << fileName((*p).first) + out() << " inherited from <xref href=\"" << fileName((*p).first) << "#" << DitaXmlGenerator::cleanRef(section.name.toLower()) << "\">" << protectEnc(marker->plainFullName((*p).first, relative)) - << "</a></li>\n"; + << "</xref></li>\n"; ++p; } } @@ -3056,281 +3226,6 @@ QString DitaXmlGenerator::highlightedCode(const QString& markedCode, return html; } -#else -void DitaXmlGenerator::generateSectionList(const Section& section, - const Node *relative, - CodeMarker *marker, - CodeMarker::SynopsisStyle style) -{ - if (!section.members.isEmpty()) { - bool twoColumn = false; - if (style == CodeMarker::SeparateList) { - twoColumn = (section.members.count() >= 16); - } - else if (section.members.first()->type() == Node::Property) { - twoColumn = (section.members.count() >= 5); - } - if (twoColumn) - out() << "<table class=\"generic\">\n"; - if (++numTableRows % 2 == 1) - out() << "<tr class=\"odd topAlign\">"; - else - out() << "<tr class=\"even topAlign\">"; - -// << "<tr><td class=\"topAlign\">"; - out() << "<ul>\n"; - - int i = 0; - NodeList::ConstIterator m = section.members.begin(); - while (m != section.members.end()) { - if ((*m)->access() == Node::Private) { - ++m; - continue; - } - - if (twoColumn && i == (int) (section.members.count() + 1) / 2) - out() << "</ul></td><td class=\"topAlign\"><ul>\n"; - - out() << "<li class=\"fn\">"; - if (style == CodeMarker::Accessors) - out() << "<b>"; - generateSynopsis(*m, relative, marker, style); - if (style == CodeMarker::Accessors) - out() << "</b>"; - out() << "</li>\n"; - i++; - ++m; - } - out() << "</ul>\n"; - if (twoColumn) - out() << "</td></tr>\n</table>\n"; - } - - if (style == CodeMarker::Summary && !section.inherited.isEmpty()) { - out() << "<ul>\n"; - generateSectionInheritedList(section, relative, marker); - out() << "</ul>\n"; - } -} - -void DitaXmlGenerator::generateSectionInheritedList(const Section& section, - const Node *relative, - CodeMarker *marker) -{ - QList<QPair<ClassNode *, int> >::ConstIterator p = section.inherited.begin(); - while (p != section.inherited.end()) { - out() << "<li class=\"fn\">"; - out() << (*p).second << " "; - if ((*p).second == 1) { - out() << section.singularMember; - } else { - out() << section.pluralMember; - } - out() << " inherited from <a href=\"" << fileName((*p).first) - << "#" << DitaXmlGenerator::cleanRef(section.name.toLower()) << "\">" - << protectEnc(marker->plainFullName((*p).first, relative)) - << "</a></li>\n"; - ++p; - } -} - -void DitaXmlGenerator::generateSynopsis(const Node *node, - const Node *relative, - CodeMarker *marker, - CodeMarker::SynopsisStyle style) -{ - QString marked = marker->markedUpSynopsis(node, relative, style); - QRegExp templateTag("(<[^@>]*>)"); - if (marked.indexOf(templateTag) != -1) { - QString contents = protectEnc(marked.mid(templateTag.pos(1), - templateTag.cap(1).length())); - marked.replace(templateTag.pos(1), templateTag.cap(1).length(), - contents); - } - marked.replace(QRegExp("<@param>([a-z]+)_([1-9n])</@param>"), "<i>\\1<sub>\\2</sub></i>"); - marked.replace("<@param>", "<i>"); - marked.replace("</@param>", "</i>"); - - if (style == CodeMarker::Summary) - marked.replace("@name>", "b>"); - - if (style == CodeMarker::SeparateList) { - QRegExp extraRegExp("<@extra>.*</@extra>"); - extraRegExp.setMinimal(true); - marked.replace(extraRegExp, ""); - } else { - marked.replace("<@extra>", "<tt>"); - marked.replace("</@extra>", "</tt>"); - } - - if (style != CodeMarker::Detailed) { - marked.replace("<@type>", ""); - marked.replace("</@type>", ""); - } - out() << highlightedCode(marked, marker, relative); -} - -QString DitaXmlGenerator::highlightedCode(const QString& markedCode, - CodeMarker *marker, - const Node *relative) -{ - QString src = markedCode; - QString html; - QStringRef arg; - QStringRef par1; - - const QChar charLangle = '<'; - const QChar charAt = '@'; - - // replace all <@link> tags: "(<@link node=\"([^\"]+)\">).*(</@link>)" - static const QString linkTag("link"); - for (int i = 0, n = src.size(); i < n;) { - if (src.at(i) == charLangle && src.at(i + 1) == charAt) { - i += 2; - if (parseArg(src, linkTag, &i, n, &arg, &par1)) { - const Node* node = CodeMarker::nodeForString(par1.toString()); - QString link = linkForNode(node, relative); - addLink(link, arg, &html); - } - else { - html += charLangle; - html += charAt; - } - } - else { - html += src.at(i++); - } - } - - if (slow) { - // is this block ever used at all? - // replace all <@func> tags: "(<@func target=\"([^\"]*)\">)(.*)(</@func>)" - src = html; - html = QString(); - static const QString funcTag("func"); - for (int i = 0, n = src.size(); i < n;) { - if (src.at(i) == charLangle && src.at(i + 1) == charAt) { - i += 2; - if (parseArg(src, funcTag, &i, n, &arg, &par1)) { - QString link = linkForNode( - marker->resolveTarget(par1.toString(), - myTree, - relative), - relative); - addLink(link, arg, &html); - par1 = QStringRef(); - } - else { - html += charLangle; - html += charAt; - } - } - else { - html += src.at(i++); - } - } - } - - // replace all "(<@(type|headerfile|func)(?: +[^>]*)?>)(.*)(</@\\2>)" tags - src = html; - html = QString(); - static const QString typeTags[] = { "type", "headerfile", "func" }; - for (int i = 0, n = src.size(); i < n;) { - if (src.at(i) == charLangle && src.at(i + 1) == charAt) { - i += 2; - bool handled = false; - for (int k = 0; k != 3; ++k) { - if (parseArg(src, typeTags[k], &i, n, &arg, &par1)) { - par1 = QStringRef(); - QString link = linkForNode( - marker->resolveTarget(arg.toString(), myTree, relative), - relative); - addLink(link, arg, &html); - handled = true; - break; - } - } - if (!handled) { - html += charLangle; - html += charAt; - } - } - else { - html += src.at(i++); - } - } - - // replace all - // "<@comment>" -> "<span class=\"comment\">"; - // "<@preprocessor>" -> "<span class=\"preprocessor\">"; - // "<@string>" -> "<span class=\"string\">"; - // "<@char>" -> "<span class=\"char\">"; - // "</@(?:comment|preprocessor|string|char)>" -> "</span>" - src = html; - html = QString(); - static const QString spanTags[] = { - "<@comment>", "<span class=\"comment\">", - "<@preprocessor>", "<span class=\"preprocessor\">", - "<@string>", "<span class=\"string\">", - "<@char>", "<span class=\"char\">", - "</@comment>", "</span>", - "</@preprocessor>","</span>", - "</@string>", "</span>", - "</@char>", "</span>" - // "<@char>", "<font color=blue>", - // "</@char>", "</font>", - // "<@func>", "<font color=green>", - // "</@func>", "</font>", - // "<@id>", "<i>", - // "</@id>", "</i>", - // "<@keyword>", "<b>", - // "</@keyword>", "</b>", - // "<@number>", "<font color=yellow>", - // "</@number>", "</font>", - // "<@op>", "<b>", - // "</@op>", "</b>", - // "<@param>", "<i>", - // "</@param>", "</i>", - // "<@string>", "<font color=green>", - // "</@string>", "</font>", - }; - for (int i = 0, n = src.size(); i < n;) { - if (src.at(i) == charLangle) { - bool handled = false; - for (int k = 0; k != 8; ++k) { - const QString & tag = spanTags[2 * k]; - if (tag == QStringRef(&src, i, tag.length())) { - html += spanTags[2 * k + 1]; - i += tag.length(); - handled = true; - break; - } - } - if (!handled) { - ++i; - if (src.at(i) == charAt || - (src.at(i) == QLatin1Char('/') && src.at(i + 1) == charAt)) { - // drop 'our' unknown tags (the ones still containing '@') - while (i < n && src.at(i) != QLatin1Char('>')) - ++i; - ++i; - } - else { - // retain all others - html += charLangle; - } - } - } - else { - html += src.at(i); - ++i; - } - } - - return html; -} -#endif - void DitaXmlGenerator::generateLink(const Atom* atom, const Node* /* relative */, CodeMarker* marker) @@ -3340,29 +3235,32 @@ void DitaXmlGenerator::generateLink(const Atom* atom, if (funcLeftParen.indexIn(atom->string()) != -1 && marker->recognizeLanguage("Cpp")) { // hack for C++: move () outside of link int k = funcLeftParen.pos(1); - out() << protectEnc(atom->string().left(k)); + writer.writeCharacters(protectEnc(atom->string().left(k))); if (link.isEmpty()) { if (showBrokenLinks) - out() << "</i>"; - } else { - out() << "</a>"; + writer.writeEndElement(); // </i> + } + else { + writer.writeEndElement(); // </xref> } inLink = false; - out() << protectEnc(atom->string().mid(k)); + writer.writeCharacters(protectEnc(atom->string().mid(k))); } else if (marker->recognizeLanguage("Java")) { // hack for Java: remove () and use <tt> when appropriate bool func = atom->string().endsWith("()"); bool tt = (func || atom->string().contains(camelCase)); if (tt) - out() << "<tt>"; + writer.writeStartElement("tt"); if (func) { - out() << protectEnc(atom->string().left(atom->string().length() - 2)); - } else { - out() << protectEnc(atom->string()); + writer.writeCharacters(protectEnc(atom->string().left(atom->string().length() - 2))); } - out() << "</tt>"; - } else { - out() << protectEnc(atom->string()); + else { + writer.writeCharacters(protectEnc(atom->string())); + } + writer.writeEndElement(); // </tt> + } + else { + writer.writeCharacters(protectEnc(atom->string())); } } @@ -3444,13 +3342,13 @@ QString DitaXmlGenerator::protectEnc(const QString &string) QString DitaXmlGenerator::protect(const QString &string, const QString &outputEncoding) { #define APPEND(x) \ - if (html.isEmpty()) { \ - html = string; \ - html.truncate(i); \ + if (xml.isEmpty()) { \ + xml = string; \ + xml.truncate(i); \ } \ - html += (x); + xml += (x); - QString html; + QString xml; int n = string.length(); for (int i = 0; i < n; ++i) { @@ -3469,16 +3367,16 @@ QString DitaXmlGenerator::protect(const QString &string, const QString &outputEn || (ch == QLatin1Char('.') && i > 2 && string.at(i - 2) == QLatin1Char('.'))) { // we escape '*/' and the last dot in 'e.g.' and 'i.e.' for the Javadoc generator APPEND("&#x"); - html += QString::number(ch.unicode(), 16); - html += QLatin1Char(';'); + xml += QString::number(ch.unicode(), 16); + xml += QLatin1Char(';'); } else { - if (!html.isEmpty()) - html += ch; + if (!xml.isEmpty()) + xml += ch; } } - if (!html.isEmpty()) - return html; + if (!xml.isEmpty()) + return xml; return string; #undef APPEND @@ -3615,12 +3513,6 @@ QString DitaXmlGenerator::linkForNode(const Node *node, const Node *relative) return QString(); fn = fileName(node); -/* if (!node->url().isEmpty()) - return fn;*/ -#if 0 - // ### reintroduce this test, without breaking .dcf files - if (fn != outFileName()) -#endif link += fn; if (!node->isInnerNode() || node->subType() == Node::QmlPropertyGroup) { @@ -3654,7 +3546,7 @@ void DitaXmlGenerator::generateFullName(const Node *apparentNode, { if (actualNode == 0) actualNode = apparentNode; - out() << "<a href=\"" << linkForNode(actualNode, relative); + out() << "<xref href=\"" << linkForNode(actualNode, relative); if (true || relative == 0 || relative->status() != actualNode->status()) { switch (actualNode->status()) { case Node::Obsolete: @@ -3669,7 +3561,7 @@ void DitaXmlGenerator::generateFullName(const Node *apparentNode, } out() << "\">"; out() << protectEnc(fullName(apparentNode, relative, marker)); - out() << "</a>"; + out() << "</xref>"; } void DitaXmlGenerator::generateDetailedMember(const Node *node, @@ -3735,7 +3627,7 @@ void DitaXmlGenerator::generateDetailedMember(const Node *node, if (enume->flagsType()) { out() << "<p>The " << protectEnc(enume->flagsType()->name()) << " type is a typedef for " - << "<a href=\"qflags.html\">QFlags</a><" + << "<xref href=\"qflags.html\">QFlags</xref><" << protectEnc(enume->name()) << ">. It stores an OR combination of " << protectEnc(enume->name()) @@ -3926,29 +3818,6 @@ void DitaXmlGenerator::findAllNamespaces(const InnerNode *node) } } -#ifdef ZZZ_QDOC_QML -/*! - This function finds all the qml element nodes and - stores them in a map for later use. - */ -void DitaXmlGenerator::findAllQmlClasses(const InnerNode *node) -{ - NodeList::const_iterator c = node->childNodes().constBegin(); - while (c != node->childNodes().constEnd()) { - if ((*c)->type() == Node::Fake) { - const FakeNode* fakeNode = static_cast<const FakeNode *>(*c); - if (fakeNode->subType() == Node::QmlClass) { - const QmlClassNode* qmlNode = - static_cast<const QmlClassNode*>(fakeNode); - const Node* n = qmlNode->classNode(); - } - qmlClasses.insert(fakeNode->name(),*c); - } - ++c; - } -} -#endif - int DitaXmlGenerator::hOffset(const Node *node) { switch (node->type()) { @@ -4136,16 +4005,6 @@ QString DitaXmlGenerator::getLink(const Atom *atom, return link; } -void DitaXmlGenerator::generateDcf(const QString &fileBase, - const QString &startPage, - const QString &title, - DcfSection &dcfRoot) -{ - dcfRoot.ref = startPage; - dcfRoot.title = title; - generateDcfSections(dcfRoot, outputDir() + "/" + fileBase + ".dcf", fileBase + "/reference"); -} - void DitaXmlGenerator::generateIndex(const QString &fileBase, const QString &url, const QString &title) @@ -4228,22 +4087,28 @@ void DitaXmlGenerator::beginLink(const QString &link, this->link = link; if (link.isEmpty()) { if (showBrokenLinks) - out() << "<i>"; + writer.writeStartElement("i"); } else if (node == 0 || (relative != 0 && node->status() == relative->status())) { - out() << "<a href=\"" << link << "\">"; + writer.writeStartElement("xref"); + writer.writeAttribute("href",link); } else { switch (node->status()) { case Node::Obsolete: - out() << "<a href=\"" << link << "\" class=\"obsolete\">"; + writer.writeStartElement("xref"); + writer.writeAttribute("href",link); + writer.writeAttribute("outputclass","obsolete"); break; case Node::Compat: - out() << "<a href=\"" << link << "\" class=\"compat\">"; + writer.writeStartElement("xref"); + writer.writeAttribute("href",link); + writer.writeAttribute("outputclass","compat"); break; default: - out() << "<a href=\"" << link << "\">"; + writer.writeStartElement("xref"); + writer.writeAttribute("href",link); } } inLink = true; @@ -4254,13 +4119,15 @@ void DitaXmlGenerator::endLink() if (inLink) { if (link.isEmpty()) { if (showBrokenLinks) - out() << "</i>"; + writer.writeEndElement(); // i } else { if (inObsoleteLink) { - out() << "<sup>(obsolete)</sup>"; + writer.writeStartElement("sup"); + writer.writeCharacters("(obsolete)"); + writer.writeEndElement(); // sup } - out() << "</a>"; + writer.writeEndElement(); // xref } } inLink = false; @@ -4636,138 +4503,652 @@ void DitaXmlGenerator::generatePageIndex(const QString& fileName, CodeMarker* ma #endif -#if 0 // fossil removed for new doc format MWS 19/04/2010 - out() << "<!DOCTYPE html\n" - " PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"DTD/xhtml1-strict.dtd\">\n"; - out() << QString("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"%1\" lang=\"%1\">\n").arg(naturalLanguage); - - QString shortVersion; - if ((project != "Qtopia") && (project != "Qt Extended")) { - shortVersion = project + " " + shortVersion + ": "; - if (node && !node->doc().location().isEmpty()) - out() << "<!-- " << node->doc().location().fileName() << " -->\n"; - - shortVersion = myTree->version(); - if (shortVersion.count(QChar('.')) == 2) - shortVersion.truncate(shortVersion.lastIndexOf(QChar('.'))); - if (!shortVersion.isEmpty()) { - if (project == "QSA") - shortVersion = "QSA " + shortVersion + ": "; +/*! + Return the full qualification of the node \a n, but without + the name of \a n itself. e.g. A::B::C + */ +QString DitaXmlGenerator::fullQualification(const Node* n) +{ + QString fq; + InnerNode* in = n->parent(); + while (in) { + if ((in->type() == Node::Class) || + (in->type() == Node::Namespace)) { + if (in->name().isEmpty()) + break; + if (fq.isEmpty()) + fq = in->name(); else - shortVersion = "Qt " + shortVersion + ": "; + fq = in->name() + "::" + fq; } + else + break; + in = in->parent(); } + return fq; +} - out() << "<head>\n" - " <title>" << shortVersion << protectEnc(title) << "</title>\n"; - out() << QString("<meta http-equiv=\"Content-type\" content=\"text/html; charset=%1\" />").arg(outputEncoding); +void DitaXmlGenerator::writeDerivations(const ClassNode* cn, CodeMarker* marker) +{ + QList<RelatedClass>::ConstIterator r; + int index; + + if (!cn->baseClasses().isEmpty()) { + writer.writeStartElement(CXXCLASSDERIVATIONS); + r = cn->baseClasses().begin(); + index = 0; + while (r != cn->baseClasses().end()) { + writer.writeStartElement(CXXCLASSDERIVATION); + writer.writeStartElement(CXXCLASSDERIVATIONACCESSSPECIFIER); + writer.writeAttribute("value",(*r).accessString()); + writer.writeEndElement(); // </cxxClassDerivationAccessSpecifier> + writer.writeStartElement(CXXCLASSBASECLASS); + writer.writeAttribute("href",(*r).node->ditaXmlHref()); + writer.writeCharacters(marker->plainFullName((*r).node)); + writer.writeEndElement(); // </cxxClassBaseClass> + writer.writeEndElement(); // </cxxClassDerivation> + ++r; + } + writer.writeEndElement(); // </cxxClassDerivations> + } +} - if (!style.isEmpty()) - out() << " <style type=\"text/css\">" << style << "</style>\n"; +void DitaXmlGenerator::writeLocation(const Node* n) +{ + QString s1, s2, s3; + if (n->type() == Node::Class) { + s1 = CXXCLASSAPIITEMLOCATION; + s2 = CXXCLASSDECLARATIONFILE; + s3 = CXXCLASSDECLARATIONFILELINE; + } + else if (n->type() == Node::Function) { + s1 = CXXFUNCTIONAPIITEMLOCATION; + s2 = CXXFUNCTIONDECLARATIONFILE; + s3 = CXXFUNCTIONDECLARATIONFILELINE; + } + else if (n->type() == Node::Enum) { + s1 = CXXENUMERATIONAPIITEMLOCATION; + s2 = CXXENUMERATIONDECLARATIONFILE; + s3 = CXXENUMERATIONDECLARATIONFILELINE; + } + else if (n->type() == Node::Typedef) { + s1 = CXXTYPEDEFAPIITEMLOCATION; + s2 = CXXTYPEDEFDECLARATIONFILE; + s3 = CXXTYPEDEFDECLARATIONFILELINE; + } + else if ((n->type() == Node::Property) || + (n->type() == Node::Variable)) { + s1 = CXXVARIABLEAPIITEMLOCATION; + s2 = CXXVARIABLEDECLARATIONFILE; + s3 = CXXVARIABLEDECLARATIONFILELINE; + } + writer.writeStartElement(s1); + writer.writeStartElement(s2); + writer.writeAttribute("name","filePath"); + writer.writeAttribute("value",n->location().filePath()); + writer.writeEndElement(); // </cxx<s2>DeclarationFile> + writer.writeStartElement(s3); + writer.writeAttribute("name","lineNumber"); + QString lineNr; + writer.writeAttribute("value",lineNr.setNum(n->location().lineNo())); + writer.writeEndElement(); // </cxx<s3>DeclarationFileLine> + writer.writeEndElement(); // </cxx<s1>ApiItemLocation> +} - const QMap<QString, QString> &metaMap = node->doc().metaTagMap(); - if (!metaMap.isEmpty()) { - QMapIterator<QString, QString> i(metaMap); - while (i.hasNext()) { - i.next(); - out() << " <meta name=\"" << protectEnc(i.key()) << "\" contents=\"" - << protectEnc(i.value()) << "\" />\n"; +void DitaXmlGenerator::writeFunctions(const Section& s, + const ClassNode* cn, + CodeMarker* marker) +{ + NodeList::ConstIterator m = s.members.begin(); + while (m != s.members.end()) { + if ((*m)->type() == Node::Function) { + FunctionNode* fn = const_cast<FunctionNode*>(static_cast<const FunctionNode*>(*m)); + writer.writeStartElement(CXXFUNCTION); + writer.writeAttribute("id",fn->guid()); + writer.writeStartElement(APINAME); + writer.writeCharacters(fn->name()); + writer.writeEndElement(); // </apiName> + generateBrief(fn,marker); + writer.writeStartElement(CXXFUNCTIONDETAIL); + writer.writeStartElement(CXXFUNCTIONDEFINITION); + writer.writeStartElement(CXXFUNCTIONACCESSSPECIFIER); + writer.writeAttribute("value",fn->accessString()); + writer.writeEndElement(); // <cxxFunctionAccessSpecifier> + + if (fn->isStatic()) { + writer.writeStartElement(CXXFUNCTIONSTORAGECLASSSPECIFIERSTATIC); + writer.writeAttribute("name","static"); + writer.writeAttribute("value","static"); + writer.writeEndElement(); // <cxxFunctionStorageClassSpecifierStatic> + } + + if (fn->isConst()) { + writer.writeStartElement(CXXFUNCTIONCONST); + writer.writeAttribute("name","const"); + writer.writeAttribute("value","const"); + writer.writeEndElement(); // <cxxFunctionConst> + } + + if (fn->virtualness() != FunctionNode::NonVirtual) { + writer.writeStartElement(CXXFUNCTIONVIRTUAL); + writer.writeAttribute("name","virtual"); + writer.writeAttribute("value","virtual"); + writer.writeEndElement(); // <cxxFunctionVirtual> + if (fn->virtualness() == FunctionNode::PureVirtual) { + writer.writeStartElement(CXXFUNCTIONPUREVIRTUAL); + writer.writeAttribute("name","pure virtual"); + writer.writeAttribute("value","pure virtual"); + writer.writeEndElement(); // <cxxFunctionPureVirtual> + } + } + + if (fn->name() == cn->name()) { + writer.writeStartElement(CXXFUNCTIONCONSTRUCTOR); + writer.writeAttribute("name","constructor"); + writer.writeAttribute("value","constructor"); + writer.writeEndElement(); // <cxxFunctionConstructor> + } + else if (fn->name()[0] == QChar('~')) { + writer.writeStartElement(CXXFUNCTIONDESTRUCTOR); + writer.writeAttribute("name","destructor"); + writer.writeAttribute("value","destructor"); + writer.writeEndElement(); // <cxxFunctionDestructor> + } + else { + writer.writeStartElement(CXXFUNCTIONDECLAREDTYPE); + writer.writeCharacters(fn->returnType()); + writer.writeEndElement(); // <cxxFunctionDeclaredType> + } + QString fq = fullQualification(fn); + if (!fq.isEmpty()) { + writer.writeStartElement(CXXFUNCTIONSCOPEDNAME); + writer.writeCharacters(fq); + writer.writeEndElement(); // <cxxFunctionScopedName> + } + writer.writeStartElement(CXXFUNCTIONPROTOTYPE); + writer.writeCharacters(fn->signature(true)); + writer.writeEndElement(); // <cxxFunctionPrototype> + + QString fnl = fn->signature(false); + int idx = fnl.indexOf(' '); + if (idx < 0) + idx = 0; + else + ++idx; + fnl = fn->parent()->name() + "::" + fnl.mid(idx); + writer.writeStartElement(CXXFUNCTIONNAMELOOKUP); + writer.writeCharacters(fnl); + writer.writeEndElement(); // <cxxFunctionNameLookup> + + if (fn->isReimp() && fn->reimplementedFrom() != 0) { + FunctionNode* rfn = (FunctionNode*)fn->reimplementedFrom(); + writer.writeStartElement(CXXFUNCTIONREIMPLEMENTED); + writer.writeAttribute("href",rfn->ditaXmlHref()); + writer.writeCharacters(marker->plainFullName(rfn)); + writer.writeEndElement(); // </cxxFunctionReimplemented> + } + writeParameters(fn,marker); + writeLocation(fn); + writer.writeEndElement(); // <cxxFunctionDefinition> + writer.writeStartElement(APIDESC); + + if (!fn->doc().isEmpty()) { + generateBody(fn, marker); + // generateAlsoList(inner, marker); + } + + writer.writeEndElement(); // </apiDesc> + writer.writeEndElement(); // </cxxFunctionDetail> + writer.writeEndElement(); // </cxxFunction> + + if (fn->metaness() == FunctionNode::Ctor || + fn->metaness() == FunctionNode::Dtor || + fn->overloadNumber() != 1) { + } } + ++m; } +} - navigationLinks.clear(); +void DitaXmlGenerator::writeParameters(const FunctionNode* fn, CodeMarker* marker) +{ + const QList<Parameter>& parameters = fn->parameters(); + if (!parameters.isEmpty()) { + writer.writeStartElement(CXXFUNCTIONPARAMETERS); + QList<Parameter>::ConstIterator p = parameters.begin(); + while (p != parameters.end()) { + writer.writeStartElement(CXXFUNCTIONPARAMETER); + writer.writeStartElement(CXXFUNCTIONPARAMETERDECLAREDTYPE); + writer.writeCharacters((*p).leftType()); + if (!(*p).rightType().isEmpty()) + writer.writeCharacters((*p).rightType()); + writer.writeEndElement(); // <cxxFunctionParameterDeclaredType> + writer.writeStartElement(CXXFUNCTIONPARAMETERDECLARATIONNAME); + writer.writeCharacters((*p).name()); + writer.writeEndElement(); // <cxxFunctionParameterDeclarationName> + if (!(*p).defaultValue().isEmpty()) { + writer.writeStartElement(CXXFUNCTIONPARAMETERDEFAULTVALUE); + writer.writeCharacters((*p).defaultValue()); + writer.writeEndElement(); // <cxxFunctionParameterDefaultValue> + } + writer.writeEndElement(); // <cxxFunctionParameter> + ++p; + } + writer.writeEndElement(); // <cxxFunctionParameters> + } +} - if (node && !node->links().empty()) { - QPair<QString,QString> linkPair; - QPair<QString,QString> anchorPair; - const Node *linkNode; +void DitaXmlGenerator::writeEnumerations(const Section& s, + const ClassNode* cn, + CodeMarker* marker) +{ + NodeList::ConstIterator m = s.members.begin(); + while (m != s.members.end()) { + if ((*m)->type() == Node::Enum) { + const EnumNode* en = static_cast<const EnumNode*>(*m); + writer.writeStartElement(CXXENUMERATION); + writer.writeAttribute("id",en->guid()); + writer.writeStartElement(APINAME); + writer.writeCharacters(en->name()); + writer.writeEndElement(); // </apiName> + generateBrief(en,marker); + writer.writeStartElement(CXXENUMERATIONDETAIL); + writer.writeStartElement(CXXENUMERATIONDEFINITION); + writer.writeStartElement(CXXENUMERATIONACCESSSPECIFIER); + writer.writeAttribute("value",en->accessString()); + writer.writeEndElement(); // <cxxEnumerationAccessSpecifier> + + QString fq = fullQualification(en); + if (!fq.isEmpty()) { + writer.writeStartElement(CXXENUMERATIONSCOPEDNAME); + writer.writeCharacters(fq); + writer.writeEndElement(); // <cxxEnumerationScopedName> + } + const QList<EnumItem>& items = en->items(); + if (!items.isEmpty()) { + writer.writeStartElement(CXXENUMERATIONPROTOTYPE); + writer.writeCharacters(en->name()); + writer.writeCharacters(" = { "); + QList<EnumItem>::ConstIterator i = items.begin(); + while (i != items.end()) { + writer.writeCharacters((*i).name()); + if (!(*i).value().isEmpty()) { + writer.writeCharacters(" = "); + writer.writeCharacters((*i).value()); + } + ++i; + if (i != items.end()) + writer.writeCharacters(", "); + } + writer.writeCharacters(" }"); + writer.writeEndElement(); // <cxxEnumerationPrototype> + } - if (node->links().contains(Node::PreviousLink)) { - linkPair = node->links()[Node::PreviousLink]; - linkNode = findNodeForTarget(linkPair.first, node, marker); - if (!linkNode || linkNode == node) - anchorPair = linkPair; - else - anchorPair = anchorForNode(linkNode); + writer.writeStartElement(CXXENUMERATIONNAMELOOKUP); + writer.writeCharacters(en->parent()->name() + "::" + en->name()); + writer.writeEndElement(); // <cxxEnumerationNameLookup> + + if (!items.isEmpty()) { + writer.writeStartElement(CXXENUMERATORS); + QList<EnumItem>::ConstIterator i = items.begin(); + while (i != items.end()) { + writer.writeStartElement(CXXENUMERATOR); + writer.writeStartElement(APINAME); + writer.writeCharacters((*i).name()); + writer.writeEndElement(); // </apiName> + + QString fq = fullQualification(en->parent()); + if (!fq.isEmpty()) { + writer.writeStartElement(CXXENUMERATORSCOPEDNAME); + writer.writeCharacters(fq + "::" + (*i).name()); + writer.writeEndElement(); // <cxxEnumeratorScopedName> + } + writer.writeStartElement(CXXENUMERATORPROTOTYPE); + writer.writeCharacters((*i).name()); + writer.writeEndElement(); // <cxxEnumeratorPrototype> + writer.writeStartElement(CXXENUMERATORNAMELOOKUP); + writer.writeCharacters(en->parent()->name() + "::" + (*i).name()); + writer.writeEndElement(); // <cxxEnumeratorNameLookup> + + if (!(*i).value().isEmpty()) { + writer.writeStartElement(CXXENUMERATORINITIALISER); + writer.writeAttribute("value", (*i).value()); + writer.writeEndElement(); // <cxxEnumeratorInitialiser> + } + if (!(*i).text().isEmpty()) { + writer.writeStartElement(APIDESC); + generateText((*i).text(), en, marker); + writer.writeEndElement(); // </apiDesc> + } + writer.writeEndElement(); // <cxxEnumerator> + ++i; + } + writer.writeEndElement(); // <cxxEnumerators> + } + + writeLocation(en); + writer.writeEndElement(); // <cxxEnumerationDefinition> + writer.writeStartElement(APIDESC); - out() << " <link rel=\"prev\" href=\"" - << anchorPair.first << "\" />\n"; + if (!en->doc().isEmpty()) { + generateBody(en, marker); + } - navigationLinks += "[Previous: <a href=\"" + anchorPair.first + "\">"; - if (linkPair.first == linkPair.second && !anchorPair.second.isEmpty()) - navigationLinks += protectEnc(anchorPair.second); - else - navigationLinks += protectEnc(linkPair.second); - navigationLinks += "</a>]\n"; - } - if (node->links().contains(Node::ContentsLink)) { - linkPair = node->links()[Node::ContentsLink]; - linkNode = findNodeForTarget(linkPair.first, node, marker); - if (!linkNode || linkNode == node) - anchorPair = linkPair; - else - anchorPair = anchorForNode(linkNode); + writer.writeEndElement(); // </apiDesc> + writer.writeEndElement(); // </cxxEnumerationDetail> + writer.writeEndElement(); // </cxxEnumeration> + } + ++m; + } +} - out() << " <link rel=\"contents\" href=\"" - << anchorPair.first << "\" />\n"; +void DitaXmlGenerator::writeTypedefs(const Section& s, + const ClassNode* cn, + CodeMarker* marker) +{ + NodeList::ConstIterator m = s.members.begin(); + while (m != s.members.end()) { + if ((*m)->type() == Node::Typedef) { + const TypedefNode* tn = static_cast<const TypedefNode*>(*m); + writer.writeStartElement(CXXTYPEDEF); + writer.writeAttribute("id",tn->guid()); + writer.writeStartElement(APINAME); + writer.writeCharacters(tn->name()); + writer.writeEndElement(); // </apiName> + generateBrief(tn,marker); + writer.writeStartElement(CXXTYPEDEFDETAIL); + writer.writeStartElement(CXXTYPEDEFDEFINITION); + writer.writeStartElement(CXXTYPEDEFACCESSSPECIFIER); + writer.writeAttribute("value",tn->accessString()); + writer.writeEndElement(); // <cxxTypedefAccessSpecifier> + + QString fq = fullQualification(tn); + if (!fq.isEmpty()) { + writer.writeStartElement(CXXTYPEDEFSCOPEDNAME); + writer.writeCharacters(fq); + writer.writeEndElement(); // <cxxTypedefScopedName> + } + writer.writeStartElement(CXXTYPEDEFNAMELOOKUP); + writer.writeCharacters(tn->parent()->name() + "::" + tn->name()); + writer.writeEndElement(); // <cxxTypedefNameLookup> + + writeLocation(tn); + writer.writeEndElement(); // <cxxTypedefDefinition> + writer.writeStartElement(APIDESC); - navigationLinks += "[<a href=\"" + anchorPair.first + "\">"; - if (linkPair.first == linkPair.second && !anchorPair.second.isEmpty()) - navigationLinks += protectEnc(anchorPair.second); - else - navigationLinks += protectEnc(linkPair.second); - navigationLinks += "</a>]\n"; - } - if (node->links().contains(Node::NextLink)) { - linkPair = node->links()[Node::NextLink]; - linkNode = findNodeForTarget(linkPair.first, node, marker); - if (!linkNode || linkNode == node) - anchorPair = linkPair; - else - anchorPair = anchorForNode(linkNode); + if (!tn->doc().isEmpty()) { + generateBody(tn, marker); + } - out() << " <link rel=\"next\" href=\"" - << anchorPair.first << "\" />\n"; + writer.writeEndElement(); // </apiDesc> + writer.writeEndElement(); // </cxxTypedefDetail> + writer.writeEndElement(); // </cxxTypedef> + } + ++m; + } +} - navigationLinks += "[Next: <a href=\"" + anchorPair.first + "\">"; - if (linkPair.first == linkPair.second && !anchorPair.second.isEmpty()) - navigationLinks += protectEnc(anchorPair.second); - else - navigationLinks += protectEnc(linkPair.second); - navigationLinks += "</a>]\n"; - } - if (node->links().contains(Node::IndexLink)) { - linkPair = node->links()[Node::IndexLink]; - linkNode = findNodeForTarget(linkPair.first, node, marker); - if (!linkNode || linkNode == node) - anchorPair = linkPair; - else - anchorPair = anchorForNode(linkNode); - out() << " <link rel=\"index\" href=\"" - << anchorPair.first << "\" />\n"; - } - if (node->links().contains(Node::StartLink)) { - linkPair = node->links()[Node::StartLink]; - linkNode = findNodeForTarget(linkPair.first, node, marker); - if (!linkNode || linkNode == node) - anchorPair = linkPair; - else - anchorPair = anchorForNode(linkNode); - out() << " <link rel=\"start\" href=\"" - << anchorPair.first << "\" />\n"; +void DitaXmlGenerator::writeProperties(const Section& s, + const ClassNode* cn, + CodeMarker* marker) +{ + NodeList::ConstIterator m = s.members.begin(); + while (m != s.members.end()) { + if ((*m)->type() == Node::Property) { + const PropertyNode* pn = static_cast<const PropertyNode*>(*m); + writer.writeStartElement(CXXVARIABLE); + writer.writeAttribute("id",pn->guid()); + writer.writeStartElement(APINAME); + writer.writeCharacters(pn->name()); + writer.writeEndElement(); // </apiName> + generateBrief(pn,marker); + writer.writeStartElement(CXXVARIABLEDETAIL); + writer.writeStartElement(CXXVARIABLEDEFINITION); + writer.writeStartElement(CXXVARIABLEACCESSSPECIFIER); + writer.writeAttribute("value",pn->accessString()); + writer.writeEndElement(); // <cxxVariableAccessSpecifier> + + if (!pn->qualifiedDataType().isEmpty()) { + writer.writeStartElement(CXXVARIABLEDECLAREDTYPE); + writer.writeCharacters(pn->qualifiedDataType()); + writer.writeEndElement(); // <cxxVariableDeclaredType> + } + QString fq = fullQualification(pn); + if (!fq.isEmpty()) { + writer.writeStartElement(CXXVARIABLESCOPEDNAME); + writer.writeCharacters(fq); + writer.writeEndElement(); // <cxxVariableScopedName> + } + + writer.writeStartElement(CXXVARIABLEPROTOTYPE); + writer.writeCharacters("Q_PROPERTY("); + writer.writeCharacters(pn->qualifiedDataType()); + writer.writeCharacters(" "); + writer.writeCharacters(pn->name()); + writePropParams("READ",pn->getters()); + writePropParams("WRITE",pn->setters()); + writePropParams("RESET",pn->resetters()); + writePropParams("NOTIFY",pn->notifiers()); + if (pn->isDesignable() != pn->designableDefault()) { + writer.writeCharacters(" DESIGNABLE "); + if (!pn->runtimeDesignabilityFunction().isEmpty()) + writer.writeCharacters(pn->runtimeDesignabilityFunction()); + else + writer.writeCharacters(pn->isDesignable() ? "true" : "false"); + } + if (pn->isScriptable() != pn->scriptableDefault()) { + writer.writeCharacters(" SCRIPTABLE "); + if (!pn->runtimeScriptabilityFunction().isEmpty()) + writer.writeCharacters(pn->runtimeScriptabilityFunction()); + else + writer.writeCharacters(pn->isScriptable() ? "true" : "false"); + } + if (pn->isWritable() != pn->writableDefault()) { + writer.writeCharacters(" STORED "); + writer.writeCharacters(pn->isStored() ? "true" : "false"); + } + if (pn->isUser() != pn->userDefault()) { + writer.writeCharacters(" USER "); + writer.writeCharacters(pn->isUser() ? "true" : "false"); + } + if (pn->isConstant()) + writer.writeCharacters(" CONSTANT"); + if (pn->isFinal()) + writer.writeCharacters(" FINAL"); + writer.writeCharacters(")"); + writer.writeEndElement(); // <cxxVariablePrototype> + + writer.writeStartElement(CXXVARIABLENAMELOOKUP); + writer.writeCharacters(pn->parent()->name() + "::" + pn->name()); + writer.writeEndElement(); // <cxxVariableNameLookup> + + if (pn->overriddenFrom() != 0) { + PropertyNode* opn = (PropertyNode*)pn->overriddenFrom(); + writer.writeStartElement(CXXVARIABLEREIMPLEMENTED); + writer.writeAttribute("href",opn->ditaXmlHref()); + writer.writeCharacters(marker->plainFullName(opn)); + writer.writeEndElement(); // </cxxVariableReimplemented> + } + + writeLocation(pn); + writer.writeEndElement(); // <cxxVariableDefinition> + writer.writeStartElement(APIDESC); + + if (!pn->doc().isEmpty()) { + generateBody(pn, marker); + } + + writer.writeEndElement(); // </apiDesc> + writer.writeEndElement(); // </cxxVariableDetail> + writer.writeEndElement(); // </cxxVariable> } + ++m; } +} - foreach (const QString &stylesheet, stylesheets) { - out() << " <link href=\"" << stylesheet << "\" rel=\"stylesheet\" " - << "type=\"text/css\" />\n"; +void DitaXmlGenerator::writeDataMembers(const Section& s, + const ClassNode* cn, + CodeMarker* marker) +{ + NodeList::ConstIterator m = s.members.begin(); + while (m != s.members.end()) { + if ((*m)->type() == Node::Variable) { + const VariableNode* vn = static_cast<const VariableNode*>(*m); + writer.writeStartElement(CXXVARIABLE); + writer.writeAttribute("id",vn->guid()); + writer.writeStartElement(APINAME); + writer.writeCharacters(vn->name()); + writer.writeEndElement(); // </apiName> + generateBrief(vn,marker); + writer.writeStartElement(CXXVARIABLEDETAIL); + writer.writeStartElement(CXXVARIABLEDEFINITION); + writer.writeStartElement(CXXVARIABLEACCESSSPECIFIER); + writer.writeAttribute("value",vn->accessString()); + writer.writeEndElement(); // <cxxVariableAccessSpecifier> + + if (vn->isStatic()) { + writer.writeStartElement(CXXVARIABLESTORAGECLASSSPECIFIERSTATIC); + writer.writeAttribute("name","static"); + writer.writeAttribute("value","static"); + writer.writeEndElement(); // <cxxVariableStorageClassSpecifierStatic> + } + + writer.writeStartElement(CXXVARIABLEDECLAREDTYPE); + writer.writeCharacters(vn->leftType()); + if (!vn->rightType().isEmpty()) + writer.writeCharacters(vn->rightType()); + writer.writeEndElement(); // <cxxVariableDeclaredType> + + QString fq = fullQualification(vn); + if (!fq.isEmpty()) { + writer.writeStartElement(CXXVARIABLESCOPEDNAME); + writer.writeCharacters(fq); + writer.writeEndElement(); // <cxxVariableScopedName> + } + + writer.writeStartElement(CXXVARIABLEPROTOTYPE); + writer.writeCharacters(vn->leftType() + " "); + //writer.writeCharacters(vn->parent()->name() + "::" + vn->name()); + writer.writeCharacters(vn->name()); + if (!vn->rightType().isEmpty()) + writer.writeCharacters(vn->rightType()); + writer.writeEndElement(); // <cxxVariablePrototype> + + writer.writeStartElement(CXXVARIABLENAMELOOKUP); + writer.writeCharacters(vn->parent()->name() + "::" + vn->name()); + writer.writeEndElement(); // <cxxVariableNameLookup> + + writeLocation(vn); + writer.writeEndElement(); // <cxxVariableDefinition> + writer.writeStartElement(APIDESC); + + if (!vn->doc().isEmpty()) { + generateBody(vn, marker); + } + + writer.writeEndElement(); // </apiDesc> + writer.writeEndElement(); // </cxxVariableDetail> + writer.writeEndElement(); // </cxxVariable> + } + ++m; } +} - foreach (const QString &customHeadElement, customHeadElements) { - out() << " " << customHeadElement << "\n"; +void DitaXmlGenerator::writeMacros(const Section& s, + const ClassNode* cn, + CodeMarker* marker) +{ + NodeList::ConstIterator m = s.members.begin(); + while (m != s.members.end()) { + if ((*m)->type() == Node::Function) { + const FunctionNode* fn = static_cast<const FunctionNode*>(*m); + if (fn->isMacro()) { + writer.writeStartElement(CXXDEFINE); + writer.writeAttribute("id",fn->guid()); + writer.writeStartElement(APINAME); + writer.writeCharacters(fn->name()); + writer.writeEndElement(); // </apiName> + generateBrief(fn,marker); + writer.writeStartElement(CXXDEFINEDETAIL); + writer.writeStartElement(CXXDEFINEDEFINITION); + writer.writeStartElement(CXXDEFINEACCESSSPECIFIER); + writer.writeAttribute("value",fn->accessString()); + writer.writeEndElement(); // <cxxDefineAccessSpecifier> + + writer.writeStartElement(CXXDEFINEPROTOTYPE); + writer.writeCharacters("#define "); + writer.writeCharacters(fn->name()); + if (fn->metaness() == FunctionNode::MacroWithParams) { + QStringList params = fn->parameterNames(); + if (!params.isEmpty()) { + writer.writeCharacters("("); + for (int i = 0; i < params.size(); ++i) { + if (params[i].isEmpty()) + writer.writeCharacters("..."); + else + writer.writeCharacters(params[i]); + if ((i+1) < params.size()) + writer.writeCharacters(", "); + } + writer.writeCharacters(")"); + } + } + writer.writeEndElement(); // <cxxDefinePrototype> + + writer.writeStartElement(CXXDEFINENAMELOOKUP); + writer.writeCharacters(fn->name()); + writer.writeEndElement(); // <cxxDefineNameLookup> + + if (fn->reimplementedFrom() != 0) { + FunctionNode* rfn = (FunctionNode*)fn->reimplementedFrom(); + writer.writeStartElement(CXXDEFINEREIMPLEMENTED); + writer.writeAttribute("href",rfn->ditaXmlHref()); + writer.writeCharacters(marker->plainFullName(rfn)); + writer.writeEndElement(); // </cxxDefineReimplemented> + } + + if (fn->metaness() == FunctionNode::MacroWithParams) { + QStringList params = fn->parameterNames(); + if (!params.isEmpty()) { + writer.writeStartElement(CXXDEFINEPARAMETERS); + for (int i = 0; i < params.size(); ++i) { + writer.writeStartElement(CXXDEFINEPARAMETER); + writer.writeStartElement(CXXDEFINEPARAMETERDECLARATIONNAME); + writer.writeCharacters(params[i]); + writer.writeEndElement(); // <cxxDefineParameterDeclarationName> + writer.writeEndElement(); // <cxxDefineParameter> + } + writer.writeEndElement(); // <cxxDefineParameters> + } + } + + writeLocation(fn); + writer.writeEndElement(); // <cxxDefineDefinition> + writer.writeStartElement(APIDESC); + + if (!fn->doc().isEmpty()) { + generateBody(fn, marker); + } + + writer.writeEndElement(); // </apiDesc> + writer.writeEndElement(); // </cxxDefineDetail> + writer.writeEndElement(); // </cxxDefine> + } + } + ++m; } +} - out() << "</head>\n" - #endif +void DitaXmlGenerator::writePropParams(const QString& tag, const NodeList& nlist) +{ + NodeList::const_iterator n = nlist.begin(); + while (n != nlist.end()) { + writer.writeCharacters(" "); + writer.writeCharacters(tag); + writer.writeCharacters(" "); + writer.writeCharacters((*n)->name()); + ++n; + } +} - QT_END_NAMESPACE +QT_END_NAMESPACE diff --git a/tools/qdoc3/ditaxmlgenerator.h b/tools/qdoc3/ditaxmlgenerator.h index 4de578d..446f735 100644 --- a/tools/qdoc3/ditaxmlgenerator.h +++ b/tools/qdoc3/ditaxmlgenerator.h @@ -46,28 +46,15 @@ #ifndef DITAXMLGENERATOR_H #define DITAXMLGENERATOR_H -#define QDOC_NAME_ALIGNMENT - #include <qmap.h> #include <qregexp.h> #include <QXmlStreamWriter> - #include "codemarker.h" #include "config.h" -#include "dcfsection.h" #include "pagegenerator.h" QT_BEGIN_NAMESPACE -#if 0 -struct NavigationBar -{ - SectionIterator prev; - SectionIterator current; - SectionIterator next; -}; -#endif - typedef QMultiMap<QString, Node*> NodeMultiMap; typedef QMap<QString, NodeMultiMap> NewSinceMaps; typedef QMap<Node*, NodeMultiMap> ParentMaps; @@ -122,6 +109,31 @@ class DitaXmlGenerator : public PageGenerator virtual QString refForNode(const Node *node); virtual QString linkForNode(const Node *node, const Node *relative); virtual QString refForAtom(Atom *atom, const Node *node); + + QString fullQualification(const Node* n); + + void writeDerivations(const ClassNode* cn, CodeMarker* marker); + void writeLocation(const Node* n); + void writeFunctions(const Section& s, + const ClassNode* cn, + CodeMarker* marker); + void writeParameters(const FunctionNode* fn, CodeMarker* marker); + void writeEnumerations(const Section& s, + const ClassNode* cn, + CodeMarker* marker); + void writeTypedefs(const Section& s, + const ClassNode* cn, + CodeMarker* marker); + void writeDataMembers(const Section& s, + const ClassNode* cn, + CodeMarker* marker); + void writeProperties(const Section& s, + const ClassNode* cn, + CodeMarker* marker); + void writeMacros(const Section& s, + const ClassNode* cn, + CodeMarker* marker); + void writePropParams(const QString& tag, const NodeList& nlist); private: enum SubTitleSize { SmallSubTitle, LargeSubTitle }; @@ -134,24 +146,14 @@ class DitaXmlGenerator : public PageGenerator void generateBreadCrumbs(const QString& title, const Node *node, CodeMarker *marker); - void generateHeader(const QString& title, - const Node *node = 0, - CodeMarker *marker = 0); + void generateHeader(const Node* node); void generateTitle(const QString& title, const Text &subTitle, SubTitleSize subTitleSize, const Node *relative, CodeMarker *marker); - void generateFooter(const Node *node = 0); - void generateBrief(const Node *node, - CodeMarker *marker, - const Node *relative = 0); + void generateBrief(const Node* node, CodeMarker* marker); void generateIncludes(const InnerNode *inner, CodeMarker *marker); -#if 0 - void generateNavigationBar(const NavigationBar& bar, - const Node *node, - CodeMarker *marker); -#endif void generateTableOfContents(const Node *node, CodeMarker *marker, Doc::SectioningUnit sectioningUnit, @@ -198,7 +200,7 @@ class DitaXmlGenerator : public PageGenerator void generateQmlInstantiates(const QmlClassNode* qcn, CodeMarker* marker); void generateInstantiatedBy(const ClassNode* cn, CodeMarker* marker); #endif -#ifdef QDOC_NAME_ALIGNMENT + void generateSection(const NodeList& nl, const Node *relative, CodeMarker *marker, @@ -217,18 +219,7 @@ class DitaXmlGenerator : public PageGenerator const Node *relative, CodeMarker::SynopsisStyle style = CodeMarker::Accessors, bool nameAlignment = false); -#else - void generateSynopsis(const Node *node, - const Node *relative, - CodeMarker *marker, - CodeMarker::SynopsisStyle style); - void generateSectionInheritedList(const Section& section, - const Node *relative, - CodeMarker *marker); - QString highlightedCode(const QString& markedCode, - CodeMarker *marker, - const Node *relative); -#endif + void generateFullName(const Node *apparentNode, const Node *relative, CodeMarker *marker, @@ -251,9 +242,6 @@ class DitaXmlGenerator : public PageGenerator void findAllFunctions(const InnerNode *node); void findAllLegaleseTexts(const InnerNode *node); void findAllNamespaces(const InnerNode *node); -#ifdef ZZZ_QDOC_QML - void findAllQmlClasses(const InnerNode *node); -#endif void findAllSince(const InnerNode *node); static int hOffset(const Node *node); static bool isThreeColumnEnumValueTable(const Atom *atom); @@ -261,9 +249,6 @@ class DitaXmlGenerator : public PageGenerator const Node *relative, CodeMarker *marker, const Node** node); - virtual void generateDcf(const QString &fileBase, - const QString &startPage, - const QString &title, DcfSection &dcfRoot); virtual void generateIndex(const QString &fileBase, const QString &url, const QString &title); @@ -283,20 +268,13 @@ class DitaXmlGenerator : public PageGenerator CodeMarker* marker) const; void generatePageIndex(const QString& fileName, CodeMarker* marker) const; + QString writeGuidAttribute(QString text); + QString lookupGuid(QString text); -#if 0 - NavigationBar currentNavigationBar; -#endif + private: QMap<QString, QString> refMap; + QMap<QString, QString> name2guidMap; int codeIndent; - DcfSection dcfClassesRoot; - DcfSection dcfOverviewsRoot; - DcfSection dcfExamplesRoot; - DcfSection dcfDesignerRoot; - DcfSection dcfLinguistRoot; - DcfSection dcfAssistantRoot; - DcfSection dcfQmakeRoot; - HelpProjectWriter *helpProjectWriter; bool inLink; bool inObsoleteLink; bool inContents; @@ -323,6 +301,7 @@ class DitaXmlGenerator : public PageGenerator const Tree *myTree; bool slow; bool obsoleteLinks; + int noLinks; QMap<QString, NodeMap > moduleClassMap; QMap<QString, NodeMap > moduleNamespaceMap; NodeMap nonCompatClasses; @@ -341,6 +320,7 @@ class DitaXmlGenerator : public PageGenerator NewClassMaps newClassMaps; NewClassMaps newQmlClassMaps; static int id; + QXmlStreamWriter writer; }; #define DITAXMLGENERATOR_ADDRESS "address" diff --git a/tools/qdoc3/doc/qdoc-manual.qdoc b/tools/qdoc3/doc/qdoc-manual.qdoc index 482af46..57c17ba 100644 --- a/tools/qdoc3/doc/qdoc-manual.qdoc +++ b/tools/qdoc3/doc/qdoc-manual.qdoc @@ -6,35 +6,21 @@ ** ** This file is part of the documentation of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the Technology Preview License Agreement accompanying -** this package. +** $QT_BEGIN_LICENSE:FDL$ +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in a +** written agreement between you and Nokia. ** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** GNU Free Documentation License +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of this +** file. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/tools/qdoc3/htmlgenerator.cpp b/tools/qdoc3/htmlgenerator.cpp index f6b8c06..b93db4f 100644 --- a/tools/qdoc3/htmlgenerator.cpp +++ b/tools/qdoc3/htmlgenerator.cpp @@ -1831,13 +1831,13 @@ void HtmlGenerator::generateHeader(const QString& title, out() << " <link rel=\"stylesheet\" type=\"text/css\" href=\"style/narrow.css\" />"; // syntax highlighter js and css - // out() << " <link type=\"text/css\" rel=\"stylesheet\" href=\"style/shCore.css\"/>\n"; - // out() << " <link type=\"text/css\" rel=\"stylesheet\" href=\"style/shThemeDefault.css\"/>\n"; - // out() << " <script type=\"text/javascript\" src=\"scripts/shCore.js\"></script>\n"; - // out() << " <script type=\"text/javascript\" src=\"scripts/shBrushCpp.js\"></script>\n"; - // out() << " <script type=\"text/javascript\">\n"; - // out() << " SyntaxHighlighter.all();\n"; - // out() << " </script>\n"; + // out() << " <link type=\"text/css\" rel=\"stylesheet\" href=\"style/shCore.css\"/>\n"; + // out() << " <link type=\"text/css\" rel=\"stylesheet\" href=\"style/shThemeDefault.css\"/>\n"; + // out() << " <script type=\"text/javascript\" src=\"scripts/shCore.js\"></script>\n"; + // out() << " <script type=\"text/javascript\" src=\"scripts/shBrushCpp.js\"></script>\n"; + // out() << " <script type=\"text/javascript\">\n"; + // out() << " SyntaxHighlighter.all();\n"; + // out() << " </script>\n"; out() << "</head>\n"; out() << "<body class=\"\" onload=\"CheckEmptyAndLoadList();\">\n"; @@ -1891,6 +1891,16 @@ void HtmlGenerator::generateFooter(const Node *node) else { out() << " <script src=\"scripts/functions.js\" type=\"text/javascript\"></script>\n"; + out() << " <!-- <script type=\"text/javascript\">\n"; + out() << " var _gaq = _gaq || [];\n"; + out() << " _gaq.push(['_setAccount', 'UA-4457116-5']);\n"; + out() << " _gaq.push(['_trackPageview']);\n"; + out() << " (function() {\n"; + out() << " var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n"; + out() << " ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n"; + out() << " var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n"; + out() << " })();\n"; + out() << " </script> -->\n"; out() << "</body>\n"; } out() << "</html>\n"; diff --git a/tools/qdoc3/main.cpp b/tools/qdoc3/main.cpp index fe4ad86..616ae2f 100644 --- a/tools/qdoc3/main.cpp +++ b/tools/qdoc3/main.cpp @@ -68,6 +68,7 @@ #include "qscodeparser.h" #include "sgmlgenerator.h" #include "webxmlgenerator.h" +#include "ditaxmlgenerator.h" #include "tokenizer.h" #include "tree.h" #include <qdebug.h> @@ -427,6 +428,7 @@ int main(int argc, char **argv) ManGenerator manGenerator; SgmlGenerator smglGenerator; WebXMLGenerator webxmlGenerator; + DitaXmlGenerator ditaxmlGenerator; QStringList qdocFiles; QString opt; diff --git a/tools/qdoc3/node.cpp b/tools/qdoc3/node.cpp index 4ba3a32..b077074 100644 --- a/tools/qdoc3/node.cpp +++ b/tools/qdoc3/node.cpp @@ -101,6 +101,7 @@ Node::Node(Type type, InnerNode *parent, const QString& name) { if (par) par->addChild(this); + //uuid = QUuid::createUuid(); } /*! @@ -154,6 +155,41 @@ void Node::setLink(LinkType linkType, const QString &link, const QString &desc) } /*! + Returns a string representing the access specifier. + */ +QString Node::accessString() const +{ + switch (acc) { + case Protected: + return "protected"; + case Private: + return "private"; + case Public: + default: + break; + } + return "public"; +} + + +/*! + Returns a string representing the access specifier. + */ +QString RelatedClass::accessString() const +{ + switch (access) { + case Node::Protected: + return "protected"; + case Node::Private: + return "private"; + case Node::Public: + default: + break; + } + return "public"; +} + +/*! */ Node::Status Node::inheritedStatus() const { @@ -164,6 +200,11 @@ Node::Status Node::inheritedStatus() const } /*! + Returns the thread safeness value for whatever this node + represents. But if this node has a parent and the thread + safeness value of the parent is the same as the thread + safeness value of this node, what is returned is the + value \c{UnspecifiedSafeness}. Why? */ Node::ThreadSafeness Node::threadSafeness() const { @@ -173,6 +214,9 @@ Node::ThreadSafeness Node::threadSafeness() const } /*! + If this node has a parent, the parent's thread safeness + value is returned. Otherwise, this node's thread safeness + value is returned. Why? */ Node::ThreadSafeness Node::inheritedThreadSafeness() const { @@ -182,6 +226,9 @@ Node::ThreadSafeness Node::inheritedThreadSafeness() const } /*! + Returns the sanitized file name without the path. + If the the file is an html file, the html suffix + is removed. Why? */ QString Node::fileBase() const { @@ -195,10 +242,47 @@ QString Node::fileBase() const } /*! + Returns this node's Universally Unique IDentifier. + If its UUID has not yet been created, it is created + first. + */ +QUuid Node::guid() const +{ + if (uuid.isNull()) + uuid = QUuid::createUuid(); + return uuid; +} + +/*! + Composes a string to be used as an href attribute in DITA + XML. It is composed of the file name and the UUID separated + by a '#'. If this node is a class node, the file name is + taken from this node; if this node is a function node, the + file name is taken from the parent node of this node. + */ +QString Node::ditaXmlHref() +{ + QString href; + if ((type() == Function) || + (type() == Property) || + (type() == Variable)) { + href = parent()->fileBase(); + } + else { + href = fileBase(); + } + if (!href.endsWith(".xml")) + href += ".xml"; + return href + "#" + guid(); +} + +/*! \class InnerNode */ /*! + The inner node destructor deletes the children and removes + this node from its related nodes. */ InnerNode::~InnerNode() { @@ -542,6 +626,7 @@ InnerNode::InnerNode(Type type, InnerNode *parent, const QString& name) } /*! + Appends an \a include file to the list of include files. */ void InnerNode::addInclude(const QString& include) { @@ -549,6 +634,7 @@ void InnerNode::addInclude(const QString& include) } /*! + Sets the list of include files to \a includes. */ void InnerNode::setIncludes(const QStringList& includes) { @@ -624,7 +710,7 @@ void InnerNode::removeChild(Node *child) QMap<QString, Node *>::Iterator prim = primaryFunctionMap.find(child->name()); NodeList& secs = secondaryFunctionMap[child->name()]; - if (*prim == child) { + if (prim != primaryFunctionMap.end() && *prim == child) { if (secs.isEmpty()) { primaryFunctionMap.remove(child->name()); } @@ -636,12 +722,12 @@ void InnerNode::removeChild(Node *child) secs.removeAll(child); } QMap<QString, Node *>::Iterator ent = childMap.find( child->name() ); - if ( *ent == child ) + if (ent != childMap.end() && *ent == child) childMap.erase( ent ); } else { QMap<QString, Node *>::Iterator ent = childMap.find(child->name()); - if (*ent == child) + if (ent != childMap.end() && *ent == child) childMap.erase(ent); } } @@ -754,6 +840,7 @@ ClassNode::ClassNode(InnerNode *parent, const QString& name) : InnerNode(Class, parent, name) { hidden = false; + abstract = false; setPageType(ApiPage); } @@ -836,6 +923,14 @@ FakeNode::FakeNode(InnerNode *parent, const QString& name, SubType subtype) } /*! + Returns the fake node's title. This is used for the page title. +*/ +QString FakeNode::title() const +{ + return tle; +} + +/*! Returns the fake node's full title, which is usually just title(), but for some SubType values is different from title() @@ -885,6 +980,8 @@ QString FakeNode::subTitle() const */ /*! + The constructor for the node representing an enum type + has a \a parent class and an enum type \a name. */ EnumNode::EnumNode(InnerNode *parent, const QString& name) : LeafNode(Enum, parent, name), ft(0) @@ -892,6 +989,7 @@ EnumNode::EnumNode(InnerNode *parent, const QString& name) } /*! + Add \a item to the enum type's item list. */ void EnumNode::addItem(const EnumItem& item) { @@ -900,15 +998,15 @@ void EnumNode::addItem(const EnumItem& item) } /*! + Returns the access level of the enumeration item named \a name. + Apparently it is private if it has been omitted by qdoc's + omitvalue command. Otherwise it is public. */ Node::Access EnumNode::itemAccess(const QString &name) const { - if (doc().omitEnumItemNames().contains(name)) { + if (doc().omitEnumItemNames().contains(name)) return Private; - } - else { - return Public; - } + return Public; } /*! @@ -1043,6 +1141,19 @@ FunctionNode::FunctionNode(Type type, InnerNode *parent, const QString& name, bo } /*! + Sets the \a virtualness of this function. If the \a virtualness + is PureVirtual, and if the parent() is a ClassNode, set the parent's + \e abstract flag to true. + */ +void FunctionNode::setVirtualness(Virtualness virtualness) +{ + vir = virtualness; + if ((virtualness == PureVirtual) && parent() && + (parent()->type() == Node::Class)) + parent()->setAbstract(true); +} + +/*! */ void FunctionNode::setOverload(bool overlode) { @@ -1184,21 +1295,39 @@ void FunctionNode::debug() const /*! \class PropertyNode + + This class describes one instance of using the Q_PROPERTY macro. */ /*! + The constructor sets the \a parent and the \a name, but + everything else is set to default values. */ PropertyNode::PropertyNode(InnerNode *parent, const QString& name) : LeafNode(Property, parent, name), sto(Trool_Default), des(Trool_Default), + scr(Trool_Default), + wri(Trool_Default), + usr(Trool_Default), + cst(false), + fnl(false), overrides(0) { + // nothing. } /*! + Sets this property's \e {overridden from} property to + \a baseProperty, which indicates that this property + overrides \a baseProperty. To begin with, all the values + in this property are set to the corresponding values in + \a baseProperty. + + We probably should ensure that the constant and final + attributes are not being overridden improperly. */ -void PropertyNode::setOverriddenFrom(const PropertyNode *baseProperty) +void PropertyNode::setOverriddenFrom(const PropertyNode* baseProperty) { for (int i = 0; i < NumFunctionRoles; ++i) { if (funcs[i].isEmpty()) @@ -1208,6 +1337,12 @@ void PropertyNode::setOverriddenFrom(const PropertyNode *baseProperty) sto = baseProperty->sto; if (des == Trool_Default) des = baseProperty->des; + if (scr == Trool_Default) + scr = baseProperty->scr; + if (wri == Trool_Default) + wri = baseProperty->wri; + if (usr == Trool_Default) + usr = baseProperty->usr; overrides = baseProperty; } @@ -1233,7 +1368,9 @@ QString PropertyNode::qualifiedDataType() const } } -/*! +/*! Converts the \a boolean value to an enum representation + of the boolean type, which includes an enum value for the + \e {default value} of the item, i.e. true, false, or default. */ PropertyNode::Trool PropertyNode::toTrool(bool boolean) { @@ -1241,6 +1378,15 @@ PropertyNode::Trool PropertyNode::toTrool(bool boolean) } /*! + Converts the enum \a troolean back to a boolean value. + If \a troolean is neither the true enum value nor the + false enum value, the boolean value returned is + \a defaultValue. + + Note that runtimeDesignabilityFunction() should be called + first. If that function returns the name of a function, it + means the function must be called at runtime to determine + whether the property is Designable. */ bool PropertyNode::fromTrool(Trool troolean, bool defaultValue) { @@ -1289,7 +1435,10 @@ QmlClassNode::QmlClassNode(InnerNode *parent, const ClassNode* cn) : FakeNode(parent, name, QmlClass), cnode(cn) { - setTitle((qmlOnly ? "" : "QML ") + name + " Element"); + if (name.startsWith(QLatin1String("QML:"))) + setTitle((qmlOnly ? QLatin1String("") : QLatin1String("QML ")) + name.mid(4) + QLatin1String(" Element")); + else + setTitle((qmlOnly ? QLatin1String("") : QLatin1String("QML ")) + name + QLatin1String(" Element")); } /*! diff --git a/tools/qdoc3/node.h b/tools/qdoc3/node.h index 215a7ae..e9f2d74 100644 --- a/tools/qdoc3/node.h +++ b/tools/qdoc3/node.h @@ -55,6 +55,7 @@ #include "doc.h" #include "location.h" #include "text.h" +#include <QUuid> QT_BEGIN_NAMESPACE @@ -152,7 +153,7 @@ class Node void setStatus(Status status) { sta = status; } void setThreadSafeness(ThreadSafeness safeness) { saf = safeness; } void setSince(const QString &since) { sinc = since; } - void setRelates(InnerNode *pseudoParent); + void setRelates(InnerNode* pseudoParent); void setModuleName(const QString &module) { mod = module; } void setLink(LinkType linkType, const QString &link, const QString &desc); void setUrl(const QString &url); @@ -166,8 +167,8 @@ class Node virtual bool isQmlNode() const { return false; } Type type() const { return typ; } virtual SubType subType() const { return NoSubType; } - InnerNode *parent() const { return par; } - InnerNode *relates() const { return rel; } + InnerNode* parent() const { return par; } + InnerNode* relates() const { return rel; } const QString& name() const { return nam; } QMap<LinkType, QPair<QString,QString> > links() const { return linkMap; } QString moduleName() const; @@ -175,6 +176,7 @@ class Node virtual QString nameForLists() const { return nam; } Access access() const { return acc; } + QString accessString() const; const Location& location() const { return loc; } const Doc& doc() const { return d; } Status status() const { return sta; } @@ -189,9 +191,11 @@ class Node void clearRelated() { rel = 0; } virtual QString fileBase() const; + QUuid guid() const; + QString ditaXmlHref(); protected: - Node(Type type, InnerNode *parent, const QString& name); + Node(Type type, InnerNode* parent, const QString& name); private: @@ -208,8 +212,8 @@ class Node PageType pageTyp : 4; Status sta : 3; #endif - InnerNode *par; - InnerNode *rel; + InnerNode* par; + InnerNode* rel; QString nam; Location loc; Doc d; @@ -218,40 +222,41 @@ class Node QString u; QString sinc; QString tpl; + mutable QUuid uuid; }; class FunctionNode; class EnumNode; -typedef QList<Node *> NodeList; +typedef QList<Node*> NodeList; class InnerNode : public Node { public: virtual ~InnerNode(); - Node *findNode(const QString& name); - Node *findNode(const QString& name, Type type); - FunctionNode *findFunctionNode(const QString& name); - FunctionNode *findFunctionNode(const FunctionNode *clone); + Node* findNode(const QString& name); + Node* findNode(const QString& name, Type type); + FunctionNode* findFunctionNode(const QString& name); + FunctionNode* findFunctionNode(const FunctionNode* clone); void addInclude(const QString &include); void setIncludes(const QStringList &includes); - void setOverload(const FunctionNode *func, bool overlode); + void setOverload(const FunctionNode* func, bool overlode); void normalizeOverloads(); void makeUndocumentedChildrenInternal(); void deleteChildren(); void removeFromRelated(); virtual bool isInnerNode() const; - const Node *findNode(const QString& name) const; - const Node *findNode(const QString& name, Type type) const; - const FunctionNode *findFunctionNode(const QString& name) const; - const FunctionNode *findFunctionNode(const FunctionNode *clone) const; - const EnumNode *findEnumNodeForValue(const QString &enumValue) const; + const Node* findNode(const QString& name) const; + const Node* findNode(const QString& name, Type type) const; + const FunctionNode* findFunctionNode(const QString& name) const; + const FunctionNode* findFunctionNode(const FunctionNode* clone) const; + const EnumNode* findEnumNodeForValue(const QString &enumValue) const; const NodeList & childNodes() const { return children; } const NodeList & relatedNodes() const { return related; } int count() const { return children.size(); } - int overloadNumber(const FunctionNode *func) const; + int overloadNumber(const FunctionNode* func) const; int numOverloads(const QString& funcName) const; NodeList overloads(const QString &funcName) const; const QStringList& includes() const { return inc; } @@ -260,25 +265,27 @@ class InnerNode : public Node QStringList secondaryKeys(); const QStringList& pageKeywords() const { return pageKeywds; } virtual void addPageKeywords(const QString& t) { pageKeywds << t; } + virtual bool isAbstract() const { return false; } + virtual void setAbstract(bool ) { } protected: - InnerNode(Type type, InnerNode *parent, const QString& name); + InnerNode(Type type, InnerNode* parent, const QString& name); private: friend class Node; - static bool isSameSignature(const FunctionNode *f1, const FunctionNode *f2); - void addChild(Node *child); - void removeChild(Node *child); - void removeRelated(Node *pseudoChild); + static bool isSameSignature(const FunctionNode* f1, const FunctionNode* f2); + void addChild(Node* child); + void removeChild(Node* child); + void removeRelated(Node* pseudoChild); QStringList pageKeywds; QStringList inc; NodeList children; NodeList enumChildren; NodeList related; - QMap<QString, Node *> childMap; - QMap<QString, Node *> primaryFunctionMap; + QMap<QString, Node*> childMap; + QMap<QString, Node*> primaryFunctionMap; QMap<QString, NodeList> secondaryFunctionMap; }; @@ -297,7 +304,7 @@ class LeafNode : public Node class NamespaceNode : public InnerNode { public: - NamespaceNode(InnerNode *parent, const QString& name); + NamespaceNode(InnerNode* parent, const QString& name); virtual ~NamespaceNode() { } }; @@ -312,6 +319,7 @@ struct RelatedClass : access(access0), node(node0), dataTypeWithTemplateArgs(dataTypeWithTemplateArgs0) { } + QString accessString() const; Node::Access access; ClassNode* node; @@ -321,11 +329,11 @@ struct RelatedClass class ClassNode : public InnerNode { public: - ClassNode(InnerNode *parent, const QString& name); + ClassNode(InnerNode* parent, const QString& name); virtual ~ClassNode() { } void addBaseClass(Access access, - ClassNode *node, + ClassNode* node, const QString &dataTypeWithTemplateArgs = ""); void fixBaseClasses(); @@ -339,11 +347,14 @@ class ClassNode : public InnerNode void setServiceName(const QString& value) { sname = value; } QString qmlElement() const { return qmlelement; } void setQmlElement(const QString& value) { qmlelement = value; } + virtual bool isAbstract() const { return abstract; } + virtual void setAbstract(bool b) { abstract = b; } private: QList<RelatedClass> bas; QList<RelatedClass> der; bool hidden; + bool abstract; QString sname; QString qmlelement; }; @@ -352,17 +363,17 @@ class FakeNode : public InnerNode { public: - FakeNode(InnerNode *parent, const QString& name, SubType subType); + FakeNode(InnerNode* parent, const QString& name, SubType subType); virtual ~FakeNode() { } void setTitle(const QString &title) { tle = title; } void setSubTitle(const QString &subTitle) { stle = subTitle; } - void addGroupMember(Node *node) { gr.append(node); } + void addGroupMember(Node* node) { gr.append(node); } SubType subType() const { return sub; } - QString title() const { return tle; } - QString fullTitle() const; - QString subTitle() const; + virtual QString title() const; + virtual QString fullTitle() const; + virtual QString subTitle() const; const NodeList &groupMembers() const { return gr; } virtual QString nameForLists() const { return title(); } @@ -377,7 +388,7 @@ class FakeNode : public InnerNode class QmlClassNode : public FakeNode { public: - QmlClassNode(InnerNode *parent, + QmlClassNode(InnerNode* parent, const QString& name, const ClassNode* cn); virtual ~QmlClassNode(); @@ -400,7 +411,7 @@ class QmlClassNode : public FakeNode class QmlBasicTypeNode : public FakeNode { public: - QmlBasicTypeNode(InnerNode *parent, + QmlBasicTypeNode(InnerNode* parent, const QString& name); virtual ~QmlBasicTypeNode() { } virtual bool isQmlNode() const { return true; } @@ -487,41 +498,41 @@ class TypedefNode; class EnumNode : public LeafNode { public: - EnumNode(InnerNode *parent, const QString& name); + EnumNode(InnerNode* parent, const QString& name); virtual ~EnumNode() { } void addItem(const EnumItem& item); - void setFlagsType(TypedefNode *typedeff); + void setFlagsType(TypedefNode* typedeff); bool hasItem(const QString &name) const { return names.contains(name); } const QList<EnumItem>& items() const { return itms; } Access itemAccess(const QString& name) const; - const TypedefNode *flagsType() const { return ft; } + const TypedefNode* flagsType() const { return ft; } QString itemValue(const QString &name) const; private: QList<EnumItem> itms; QSet<QString> names; - const TypedefNode *ft; + const TypedefNode* ft; }; class TypedefNode : public LeafNode { public: - TypedefNode(InnerNode *parent, const QString& name); + TypedefNode(InnerNode* parent, const QString& name); virtual ~TypedefNode() { } - const EnumNode *associatedEnum() const { return ae; } + const EnumNode* associatedEnum() const { return ae; } private: - void setAssociatedEnum(const EnumNode *enume); + void setAssociatedEnum(const EnumNode* enume); friend class EnumNode; - const EnumNode *ae; + const EnumNode* ae; }; -inline void EnumNode::setFlagsType(TypedefNode *typedeff) +inline void EnumNode::setFlagsType(TypedefNode* typedeff) { ft = typedeff; typedeff->setAssociatedEnum(this); @@ -573,22 +584,22 @@ class FunctionNode : public LeafNode Native }; enum Virtualness { NonVirtual, ImpureVirtual, PureVirtual }; - FunctionNode(InnerNode *parent, const QString &name); - FunctionNode(Type type, InnerNode *parent, const QString &name, bool attached); + FunctionNode(InnerNode* parent, const QString &name); + FunctionNode(Type type, InnerNode* parent, const QString &name, bool attached); virtual ~FunctionNode() { } void setReturnType(const QString& returnType) { rt = returnType; } void setParentPath(const QStringList& parentPath) { pp = parentPath; } void setMetaness(Metaness metaness) { met = metaness; } - void setVirtualness(Virtualness virtualness) { vir = virtualness; } + void setVirtualness(Virtualness virtualness); void setConst(bool conste) { con = conste; } void setStatic(bool statique) { sta = statique; } void setOverload(bool overlode); void setReimp(bool r); void addParameter(const Parameter& parameter); inline void setParameters(const QList<Parameter>& parameters); - void borrowParameterNames(const FunctionNode *source); - void setReimplementedFrom(FunctionNode *from); + void borrowParameterNames(const FunctionNode* source); + void setReimplementedFrom(FunctionNode* from); const QString& returnType() const { return rt; } Metaness metaness() const { return met; } @@ -605,9 +616,9 @@ class FunctionNode : public LeafNode int numOverloads() const; const QList<Parameter>& parameters() const { return params; } QStringList parameterNames() const; - const FunctionNode *reimplementedFrom() const { return rf; } - const QList<FunctionNode *> &reimplementedBy() const { return rb; } - const PropertyNode *associatedProperty() const { return ap; } + const FunctionNode* reimplementedFrom() const { return rf; } + const QList<FunctionNode*> &reimplementedBy() const { return rb; } + const PropertyNode* associatedProperty() const { return ap; } const QStringList& parentPath() const { return pp; } QStringList reconstructParams(bool values = false) const; @@ -621,7 +632,7 @@ class FunctionNode : public LeafNode void debug() const; private: - void setAssociatedProperty(PropertyNode *property); + void setAssociatedProperty(PropertyNode* property); friend class InnerNode; friend class PropertyNode; @@ -641,9 +652,9 @@ class FunctionNode : public LeafNode bool reimp: 1; bool att: 1; QList<Parameter> params; - const FunctionNode *rf; - const PropertyNode *ap; - QList<FunctionNode *> rb; + const FunctionNode* rf; + const PropertyNode* ap; + QList<FunctionNode*> rb; }; class PropertyNode : public LeafNode @@ -652,16 +663,22 @@ class PropertyNode : public LeafNode enum FunctionRole { Getter, Setter, Resetter, Notifier }; enum { NumFunctionRoles = Notifier + 1 }; - PropertyNode(InnerNode *parent, const QString& name); + PropertyNode(InnerNode* parent, const QString& name); virtual ~PropertyNode() { } void setDataType(const QString& dataType) { dt = dataType; } - void addFunction(FunctionNode *function, FunctionRole role); - void addSignal(FunctionNode *function, FunctionRole role); + void addFunction(FunctionNode* function, FunctionRole role); + void addSignal(FunctionNode* function, FunctionRole role); void setStored(bool stored) { sto = toTrool(stored); } void setDesignable(bool designable) { des = toTrool(designable); } + void setScriptable(bool scriptable) { scr = toTrool(scriptable); } void setWritable(bool writable) { wri = toTrool(writable); } - void setOverriddenFrom(const PropertyNode *baseProperty); + void setUser(bool user) { usr = toTrool(user); } + void setOverriddenFrom(const PropertyNode* baseProperty); + void setRuntimeDesFunc(const QString& rdf) { runtimeDesFunc = rdf; } + void setRuntimeScrFunc(const QString& scrf) { runtimeScrFunc = scrf; } + void setConstant() { cst = true; } + void setFinal() { fnl = true; } const QString &dataType() const { return dt; } QString qualifiedDataType() const; @@ -673,8 +690,20 @@ class PropertyNode : public LeafNode NodeList notifiers() const { return functions(Notifier); } bool isStored() const { return fromTrool(sto, storedDefault()); } bool isDesignable() const { return fromTrool(des, designableDefault()); } + bool isScriptable() const { return fromTrool(scr, scriptableDefault()); } + const QString& runtimeDesignabilityFunction() const { return runtimeDesFunc; } + const QString& runtimeScriptabilityFunction() const { return runtimeScrFunc; } bool isWritable() const { return fromTrool(wri, writableDefault()); } - const PropertyNode *overriddenFrom() const { return overrides; } + bool isUser() const { return fromTrool(usr, userDefault()); } + bool isConstant() const { return cst; } + bool isFinal() const { return fnl; } + const PropertyNode* overriddenFrom() const { return overrides; } + + bool storedDefault() const { return true; } + bool userDefault() const { return false; } + bool designableDefault() const { return !setters().isEmpty(); } + bool scriptableDefault() const { return true; } + bool writableDefault() const { return !setters().isEmpty(); } private: enum Trool { Trool_True, Trool_False, Trool_Default }; @@ -682,16 +711,18 @@ class PropertyNode : public LeafNode static Trool toTrool(bool boolean); static bool fromTrool(Trool troolean, bool defaultValue); - bool storedDefault() const { return true; } - bool designableDefault() const { return !setters().isEmpty(); } - bool writableDefault() const { return !setters().isEmpty(); } - QString dt; + QString runtimeDesFunc; + QString runtimeScrFunc; NodeList funcs[NumFunctionRoles]; Trool sto; Trool des; + Trool scr; Trool wri; - const PropertyNode *overrides; + Trool usr; + bool cst; + bool fnl; + const PropertyNode* overrides; }; inline void FunctionNode::setParameters(const QList<Parameter> ¶meters) @@ -699,13 +730,13 @@ inline void FunctionNode::setParameters(const QList<Parameter> ¶meters) params = parameters; } -inline void PropertyNode::addFunction(FunctionNode *function, FunctionRole role) +inline void PropertyNode::addFunction(FunctionNode* function, FunctionRole role) { funcs[(int)role].append(function); function->setAssociatedProperty(this); } -inline void PropertyNode::addSignal(FunctionNode *function, FunctionRole role) +inline void PropertyNode::addSignal(FunctionNode* function, FunctionRole role) { funcs[(int)role].append(function); } @@ -721,7 +752,7 @@ inline NodeList PropertyNode::functions() const class VariableNode : public LeafNode { public: - VariableNode(InnerNode *parent, const QString &name); + VariableNode(InnerNode* parent, const QString &name); virtual ~VariableNode() { } void setLeftType(const QString &leftType) { lt = leftType; } @@ -739,15 +770,16 @@ class VariableNode : public LeafNode bool sta; }; -inline VariableNode::VariableNode(InnerNode *parent, const QString &name) +inline VariableNode::VariableNode(InnerNode* parent, const QString &name) : LeafNode(Variable, parent, name), sta(false) { + // nothing. } class TargetNode : public LeafNode { public: - TargetNode(InnerNode *parent, const QString& name); + TargetNode(InnerNode* parent, const QString& name); virtual ~TargetNode() { } virtual bool isInnerNode() const; diff --git a/tools/qdoc3/pagegenerator.cpp b/tools/qdoc3/pagegenerator.cpp index 13c83a8..a187c2e 100644 --- a/tools/qdoc3/pagegenerator.cpp +++ b/tools/qdoc3/pagegenerator.cpp @@ -209,7 +209,8 @@ QString PageGenerator::fileBase(const Node *node) const */ if ((p->subType() == Node::QmlClass) || (p->subType() == Node::QmlBasicType)) { - base.prepend("qml-"); + if (!base.startsWith(QLatin1String("QML:"))) + base.prepend("qml-"); } #endif if (!pp || pp->name().isEmpty() || pp->type() == Node::Fake) @@ -299,8 +300,8 @@ QTextStream &PageGenerator::out() /*! Recursive writing of html files from the root \a node. */ -void PageGenerator::generateInnerNode(const InnerNode *node, - CodeMarker *marker) +void +PageGenerator::generateInnerNode(const InnerNode* node, CodeMarker* marker) { if (!node->url().isNull()) return; diff --git a/tools/qdoc3/test/qt-api-only_ja_JP.qdocconf b/tools/qdoc3/test/qt-api-only_ja_JP.qdocconf new file mode 100644 index 0000000..aa3ab01 --- /dev/null +++ b/tools/qdoc3/test/qt-api-only_ja_JP.qdocconf @@ -0,0 +1,30 @@ +include(qt-build-docs_ja_JP.qdocconf) + +# Ensures that the generated index contains a URL that can be used by the +# tools documentation (assistant.qdocconf, designer.qdocconf, linguist.qdocconf, +# qmake.qdocconf). + +url = ./ + +# Ensures that the documentation for the tools is not included in the generated +# .qhp file. + +qhp.Qt.excluded += $QT_SOURCE_TREE/doc/src/development/assistant-manual.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/simpletextviewer.qdoc \ + $QT_SOURCE_TREE/doc/src/development/designer-manual.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/calculatorbuilder.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/calculatorform.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/customwidgetplugin.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/taskmenuextension.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/containerextension.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/worldtimeclockbuilder.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/worldtimeclockplugin.qdoc \ + $QT_SOURCE_TREE/doc/src/internationalization/linguist-manual.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/hellotr.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/arrowpad.qdoc \ + $QT_SOURCE_TREE/doc/src/examples/trollprint.qdoc \ + $QT_SOURCE_TREE/doc/src/development/qmake-manual.qdoc + +outputdir = $QT_BUILD_TREE/doc-build/html-qt_ja_JP +tagfile = $QT_BUILD_TREE/doc-build/html-qt_ja_JP/qt.tags +base = file:$QT_BUILD_TREE/doc-build/html-qt_ja_JP diff --git a/tools/qdoc3/test/qt-build-docs.qdocconf b/tools/qdoc3/test/qt-build-docs.qdocconf index 169900e..4dfed1a 100644 --- a/tools/qdoc3/test/qt-build-docs.qdocconf +++ b/tools/qdoc3/test/qt-build-docs.qdocconf @@ -22,33 +22,43 @@ qhp.Qt.indexTitle = Qt Reference Documentation # Files not referenced in any qdoc file (last four are needed by qtdemo) # See also extraimages.HTML qhp.Qt.extraFiles = index.html \ - images/bg_l.png \ - images/bg_l_blank.png \ - images/bg_r.png \ - images/box_bg.png \ - images/breadcrumb.png \ - images/bullet_gt.png \ - images/bullet_dn.png \ - images/bullet_sq.png \ - images/bullet_up.png \ - images/feedbackground.png \ - images/horBar.png \ - images/page.png \ - images/page_bg.png \ - images/sprites-combined.png \ - images/arrow-down.png \ - images/spinner.gif \ - images/stylesheet-coffee-plastique.png \ - images/taskmenuextension-example.png \ - images/coloreditorfactoryimage.png \ - images/dynamiclayouts-example.png \ - scripts/functions.js \ - scripts/jquery.js \ - style/OfflineStyle.css \ - style/style_ie6.css \ - style/style_ie7.css \ - style/style_ie8.css \ - style/style.css + images/bg_l.png \ + images/bg_l_blank.png \ + images/bg_r.png \ + images/box_bg.png \ + images/breadcrumb.png \ + images/bullet_gt.png \ + images/bullet_dn.png \ + images/bullet_sq.png \ + images/bullet_up.png \ + images/feedbackground.png \ + images/horBar.png \ + images/page.png \ + images/page_bg.png \ + images/sprites-combined.png \ + images/arrow-down.png \ + images/spinner.gif \ + images/stylesheet-coffee-plastique.png \ + images/taskmenuextension-example.png \ + images/coloreditorfactoryimage.png \ + images/dynamiclayouts-example.png \ + scripts/functions.js \ + scripts/jquery.js \ + scripts/shBrushCpp.js \ + scripts/shCore.js \ + scripts/shLegacy.js \ + scripts/narrow.js \ + scripts/superfish.js \ + style/shCore.css \ + style/shThemeDefault.css \ + style/narrow.css \ + style/superfish.css \ + style/superfish_skin.css \ + style/OfflineStyle.css \ + style/style_ie6.css \ + style/style_ie7.css \ + style/style_ie8.css \ + style/style.css @@ -115,6 +125,7 @@ excludedirs = $QT_SOURCE_TREE/src/3rdparty/clucene \ $QT_SOURCE_TREE/src/3rdparty/phonon/mmf \ $QT_SOURCE_TREE/src/3rdparty/phonon/waveout \ $QT_SOURCE_TREE/doc/src/snippets \ + $QT_SOURCE_TREE/doc/src/ja_JP \ $QT_SOURCE_TREE/doc/src/zh_CN sources.fileextensions = "*.cpp *.qdoc *.mm" @@ -130,7 +141,7 @@ exampledirs = $QT_SOURCE_TREE/doc/src \ imagedirs = $QT_SOURCE_TREE/doc/src/images \ $QT_SOURCE_TREE/examples \ $QT_SOURCE_TREE/doc/src/declarative/pics \ - $QT_SOURCE_TREE/doc/src/template/images + $QT_SOURCE_TREE/doc/src/template/images outputdir = $QT_BUILD_TREE/doc/html tagfile = $QT_BUILD_TREE/doc/html/qt.tags base = file:$QT_BUILD_TREE/doc/html diff --git a/tools/qdoc3/test/qt-build-docs_ja_JP.qdocconf b/tools/qdoc3/test/qt-build-docs_ja_JP.qdocconf new file mode 100644 index 0000000..7701cae --- /dev/null +++ b/tools/qdoc3/test/qt-build-docs_ja_JP.qdocconf @@ -0,0 +1,121 @@ +include(compat.qdocconf) +include(macros.qdocconf) +include(qt-cpp-ignore.qdocconf) +include(qt-html-templates_ja_JP.qdocconf) +include(qt-defines.qdocconf) + +project = Qt +description = Qt リファレンスドキュメント +url = http://qt.nokia.com/doc/ja_JP/4.7 + +sourceencoding = UTF-8 +outputencoding = UTF-8 +naturallanguage = ja + +indexes = $QT_BUILD_TREE/doc-build/html-qt/qt.index + +qhp.projects = Qt + +qhp.Qt.file = qt.qhp +qhp.Qt.namespace = com.trolltech.qt.470 +qhp.Qt.virtualFolder = qdoc +qhp.Qt.title = Qt +qhp.Qt.indexTitle = Qt +qhp.Qt.selectors = fake:example + +qhp.Qt.filterAttributes = qt 4.7.0 qtrefdoc ja_JP +qhp.Qt.customFilters.Qt.name = Qt 4.7.0 +qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.0 + +# Files not referenced in any qdoc file (last four are needed by qtdemo) +# See also extraimages.HTML +qhp.Qt.extraFiles = index.html \ + images/bg_l.png \ + images/bg_l_blank.png \ + images/bg_r.png \ + images/box_bg.png \ + images/breadcrumb.png \ + images/bullet_gt.png \ + images/bullet_dn.png \ + images/bullet_sq.png \ + images/bullet_up.png \ + images/feedbackground.png \ + images/horBar.png \ + images/page.png \ + images/page_bg.png \ + images/sprites-combined.png \ + images/arrow-down.png \ + images/spinner.gif \ + images/stylesheet-coffee-plastique.png \ + images/taskmenuextension-example.png \ + images/coloreditorfactoryimage.png \ + images/dynamiclayouts-example.png \ + scripts/functions.js \ + scripts/jquery.js \ + scripts/shBrushCpp.js \ + scripts/shCore.js \ + scripts/shLegacy.js \ + scripts/narrow.js \ + scripts/superfish.js \ + style/shCore.css \ + style/shThemeDefault.css \ + style/narrow.css \ + style/superfish.css \ + style/superfish_skin.css \ + style/OfflineStyle.css \ + style/style_ie6.css \ + style/style_ie7.css \ + style/style_ie8.css \ + style/style.css + +language = Cpp + +sourcedirs = $QT_SOURCE_TREE/doc/src/ja_JP + +excludedirs = $QT_SOURCE_TREE/src/3rdparty/clucene \ + $QT_SOURCE_TREE/src/3rdparty/des \ + $QT_SOURCE_TREE/src/3rdparty/freetype \ + $QT_SOURCE_TREE/src/3rdparty/harfbuzz \ + $QT_SOURCE_TREE/src/3rdparty/kdebase \ + $QT_SOURCE_TREE/src/3rdparty/libjpeg \ + $QT_SOURCE_TREE/src/3rdparty/libmng \ + $QT_SOURCE_TREE/src/3rdparty/libpng \ + $QT_SOURCE_TREE/src/3rdparty/libtiff \ + $QT_SOURCE_TREE/src/3rdparty/md4 \ + $QT_SOURCE_TREE/src/3rdparty/md5 \ + $QT_SOURCE_TREE/src/3rdparty/patches \ + $QT_SOURCE_TREE/src/3rdparty/sha1 \ + $QT_SOURCE_TREE/src/3rdparty/sqlite \ + $QT_SOURCE_TREE/src/3rdparty/webkit/JavaScriptCore \ + $QT_SOURCE_TREE/src/3rdparty/webkit/WebCore \ + $QT_SOURCE_TREE/src/3rdparty/wintab \ + $QT_SOURCE_TREE/src/3rdparty/zlib \ + $QT_SOURCE_TREE/doc/src/snippets \ + $QT_SOURCE_TREE/doc/src/zh_CN \ + $QT_SOURCE_TREE/src/3rdparty/phonon/gstreamer \ + $QT_SOURCE_TREE/src/3rdparty/phonon/ds9 \ + $QT_SOURCE_TREE/src/3rdparty/phonon/qt7 \ + $QT_SOURCE_TREE/src/3rdparty/phonon/mmf \ + $QT_SOURCE_TREE/src/3rdparty/phonon/waveout + +sources.fileextensions = "*.cpp *.qdoc *.mm" +examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp" +examples.imageextensions = "*.png" + +exampledirs = $QT_SOURCE_TREE/doc/src \ + $QT_SOURCE_TREE/examples/ja_JP \ + $QT_SOURCE_TREE/examples \ + $QT_SOURCE_TREE/examples/tutorials \ + $QT_SOURCE_TREE \ + $QT_SOURCE_TREE/qmake/examples \ + $QT_SOURCE_TREE/src/3rdparty/webkit/WebKit/qt/docs +imagedirs = $QT_SOURCE_TREE/doc/src/ja_JP/images \ + $QT_SOURCE_TREE/doc/src/images \ + $QT_SOURCE_TREE/examples \ + $QT_SOURCE_TREE/doc/src/declarative/pics \ + $QT_SOURCE_TREE/doc/src/template/images +outputdir = $QT_BUILD_TREE/doc/html_ja_JP +tagfile = $QT_BUILD_TREE/doc/html_ja_JP/qt.tags +base = file:$QT_BUILD_TREE/doc/html_ja_JP + +HTML.generatemacrefs = "true" diff --git a/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf b/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf index 586fb29..720fa1d 100644 --- a/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf +++ b/tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf @@ -30,32 +30,43 @@ qhp.Qt.customFilters.Qt.filterAttributes = qt 4.8.0 # Files not referenced in any qdoc file (last four are needed by qtdemo) # See also extraimages.HTML qhp.Qt.extraFiles = index.html \ - images/bg_l.png \ - images/bg_l_blank.png \ - images/bg_r.png \ - images/box_bg.png \ - images/breadcrumb.png \ - images/bullet_gt.png \ - images/bullet_dn.png \ - images/bullet_sq.png \ - images/bullet_up.png \ - images/feedbackground.png \ - images/horBar.png \ - images/page.png \ - images/page_bg.png \ - images/sprites-combined.png \ - images/arrow-down.png \ - images/spinner.gif \ - images/stylesheet-coffee-plastique.png \ - images/taskmenuextension-example.png \ - images/coloreditorfactoryimage.png \ - images/dynamiclayouts-example.png \ - scripts/functions.js \ - scripts/jquery.js \ - style/style_ie6.css \ - style/style_ie7.css \ - style/style_ie8.css \ - style/style.css + images/bg_l.png \ + images/bg_l_blank.png \ + images/bg_r.png \ + images/box_bg.png \ + images/breadcrumb.png \ + images/bullet_gt.png \ + images/bullet_dn.png \ + images/bullet_sq.png \ + images/bullet_up.png \ + images/feedbackground.png \ + images/horBar.png \ + images/page.png \ + images/page_bg.png \ + images/sprites-combined.png \ + images/arrow-down.png \ + images/spinner.gif \ + images/stylesheet-coffee-plastique.png \ + images/taskmenuextension-example.png \ + images/coloreditorfactoryimage.png \ + images/dynamiclayouts-example.png \ + scripts/functions.js \ + scripts/jquery.js \ + scripts/shBrushCpp.js \ + scripts/shCore.js \ + scripts/shLegacy.js \ + scripts/narrow.js \ + scripts/superfish.js \ + style/shCore.css \ + style/shThemeDefault.css \ + style/narrow.css \ + style/superfish.css \ + style/superfish_skin.css \ + style/OfflineStyle.css \ + style/style_ie6.css \ + style/style_ie7.css \ + style/style_ie8.css \ + style/style.css language = Cpp @@ -80,6 +91,7 @@ excludedirs = $QT_SOURCE_TREE/src/3rdparty/clucene \ $QT_SOURCE_TREE/src/3rdparty/wintab \ $QT_SOURCE_TREE/src/3rdparty/zlib \ $QT_SOURCE_TREE/doc/src/snippets \ + $QT_SOURCE_TREE/doc/src/ja_JP \ $QT_SOURCE_TREE/src/3rdparty/phonon/gstreamer \ $QT_SOURCE_TREE/src/3rdparty/phonon/ds9 \ $QT_SOURCE_TREE/src/3rdparty/phonon/qt7 \ @@ -98,7 +110,8 @@ exampledirs = $QT_SOURCE_TREE/doc/src \ $QT_SOURCE_TREE/src/3rdparty/webkit/WebKit/qt/docs imagedirs = $QT_SOURCE_TREE/doc/src/images \ $QT_SOURCE_TREE/examples \ - $QT_SOURCE_TREE/doc/src/template/images + $QT_SOURCE_TREE/doc/src/declarative/pics \ + $QT_SOURCE_TREE/doc/src/template/images outputdir = $QT_BUILD_TREE/doc/html_zh_CN tagfile = $QT_BUILD_TREE/doc/html_zh_CN/qt.tags base = file:$QT_BUILD_TREE/doc/html_zh_CN diff --git a/tools/qdoc3/test/qt-ditaxml.qdocconf b/tools/qdoc3/test/qt-ditaxml.qdocconf new file mode 100644 index 0000000..66f30e3 --- /dev/null +++ b/tools/qdoc3/test/qt-ditaxml.qdocconf @@ -0,0 +1,11 @@ +include(qt.qdocconf) + +imagedirs = $QTDIR/doc/src/images \ + $QTDIR/examples \ + $QTDIR/doc/src/template/images + +outputdir = $QTDIR/doc/ditaxml +outputformats = DITAXML + +generateindex = true +url = . diff --git a/tools/qdoc3/test/qt-html-templates.qdocconf b/tools/qdoc3/test/qt-html-templates.qdocconf index 372a1e3..629c501 100644 --- a/tools/qdoc3/test/qt-html-templates.qdocconf +++ b/tools/qdoc3/test/qt-html-templates.qdocconf @@ -11,7 +11,7 @@ HTML.postheader = " <div class=\"header\" id=\"qtdocheader\">\n" \ " <a href=\"index.html\" class=\"qtref\"><span>Qt Reference Documentation</span></a>\n" \ " <div id=\"narrowsearch\"><form onsubmit=\"return false;\" action=\"\" id=\"qtdocsearch\">\n" \ " <fieldset>\n" \ - " <input type=\"text\" value=\"\" id=\"pageType\" name=\"searchstring\">\n" \ + " <input type=\"text\" value=\"\" id=\"pageType2\" name=\"searchstring\">\n" \ " </fieldset>\n" \ " </form></div>\n" \ " <div id=\"nav-topright\">\n" \ @@ -160,19 +160,11 @@ HTML.footer = " <!-- /div -->\n" \ " <div id=\"feedbackBox\">\n" \ " <div id=\"feedcloseX\" class=\"feedclose t_button\">X</div>\n" \ " <form id=\"feedform\" action=\"http://doc.qt.nokia.com/docFeedbck/feedback.php\" method=\"get\">\n" \ - " <p><textarea id=\"feedbox\" name=\"feedText\" rows=\"5\" cols=\"40\">Please submit you feedback...</textarea></p>\n" \ + " <p>Thank you for giving your feedback. <div class=\"note\">Make sure it is related the page. For more general bugs and \n" \ + " requests, please use the <a href=\"http://bugreports.qt.nokia.com/secure/Dashboard.jspa\">Qt Bug Tracker</a></div></p>\n" \ + " <p><textarea id=\"feedbox\" name=\"feedText\" rows=\"5\" cols=\"40\"></textarea></p>\n" \ " <p><input id=\"feedsubmit\" class=\"feedclose\" type=\"submit\" name=\"feedback\" /></p>\n" \ " </form>\n" \ " </div>\n" \ " <div id=\"blurpage\">\n" \ - " </div>\n" \ - "<script type=\"text/javascript\">\n" \ - " var _gaq = _gaq || [];\n" \ - " _gaq.push([\'_setAccount\', \'UA-4457116-5\']);\n" \ - " _gaq.push([\'_trackPageview\']);\n" \ - " (function() {\n" \ - " var ga = document.createElement(\'script\'); ga.type = \'text/javascript\'; ga.async = true;\n" \ - " ga.src = (\'https:\' == document.location.protocol ? \'https://ssl\' : \'http://www\') + \'.google-analytics.com/ga.js\';\n" \ - " var s = document.getElementsByTagName(\'script\')[0]; s.parentNode.insertBefore(ga, s);\n" \ - " })();\n" \ - "</script>\n" + " </div>\n" diff --git a/tools/qdoc3/test/qt-html-templates_ja_JP.qdocconf b/tools/qdoc3/test/qt-html-templates_ja_JP.qdocconf new file mode 100644 index 0000000..027548e --- /dev/null +++ b/tools/qdoc3/test/qt-html-templates_ja_JP.qdocconf @@ -0,0 +1,178 @@ +HTML.stylesheets = style/style.css \ + style/OfflineStyle.css \ + style/style_ie7.css \ + style/style_ie8.css \ + style/style_ie6.css + +HTML.postheader = " <div class=\"header\" id=\"qtdocheader\">\n" \ + " <div class=\"content\"> \n" \ + " <div id=\"nav-logo\">\n" \ + " <a href=\"index.html\">Home</a></div>\n" \ + " <a href=\"index.html\" class=\"qtref\"><span>Qt Reference Documentation</span></a>\n" \ + " <div id=\"narrowsearch\"><form onsubmit=\"return false;\" action=\"\" id=\"qtdocsearch\">\n" \ + " <fieldset>\n" \ + " <input type=\"text\" value=\"\" id=\"pageType\" name=\"searchstring\">\n" \ + " </fieldset>\n" \ + " </form></div>\n" \ + " <div id=\"nav-topright\">\n" \ + " <ul>\n" \ + " <li class=\"nav-topright-home\"><a href=\"http://qt.nokia.com/\">Qt HOME</a></li>\n" \ + " <li class=\"nav-topright-dev\"><a href=\"http://qt.nokia.com/developer\">DEV</a></li>\n" \ + " <li class=\"nav-topright-labs\"><a href=\"http://labs.qt.nokia.com/blogs/\">LABS</a></li>\n" \ + " <li class=\"nav-topright-doc nav-topright-doc-active\"><a href=\"http://doc.qt.nokia.com/\">\n" \ + " DOC</a></li>\n" \ + " <li class=\"nav-topright-blog\"><a href=\"http://blog.qt.nokia.com/\">BLOG</a></li>\n" \ + " <li class=\"nav-topright-shop\"><a title=\"SHOP\" href=\"http://shop.qt.nokia.com\">SHOP</a></li>\n" \ + " </ul>\n" \ + " </div>\n" \ + " <div id=\"shortCut\">\n" \ + " <ul>\n" \ + " <li class=\"shortCut-topleft-inactive\"><span><a href=\"index.html\">Qt 4.7</a></span></li>\n" \ + " <li class=\"shortCut-topleft-active\"><a href=\"http://qt.nokia.com/doc/\">ALL VERSIONS" \ + " </a></li>\n" \ + " </ul>\n" \ + " </div>\n" \ + " <ul class=\"sf-menu sf-js-enabled sf-shadow\" id=\"narrowmenu\"> \n" \ + " <li><a href=\"#\">API Lookup</a> \n" \ + " <ul id=\"topmenuLook\"> \n" \ + " <li><a href=\"classes.html\">Class index</a></li> \n" \ + " <li><a href=\"functions.html\">Function index</a></li> \n" \ + " <li><a href=\"modules.html\">Modules</a></li> \n" \ + " <li><a href=\"namespaces.html\">Namespaces</a></li> \n" \ + " <li><a href=\"qtglobal.html\">Global stuff</a></li> \n" \ + " <li><a href=\"qdeclarativeelements.html\">QML elements</a></li> \n" \ + " </ul> \n" \ + " </li> \n" \ + " <li><a href=\"#\">Qt Topics</a> \n" \ + " <ul id=\"topmenuTopic\"> \n" \ + " <li><a href=\"qt-basic-concepts.html\">Basic Qt architecture</a></li> \n" \ + " <li><a href=\"declarativeui.html\">Device UI's & Qt Quick</a></li> \n" \ + " <li><a href=\"qt-gui-concepts.html\">Desktop UI components</a></li> \n" \ + " <li><a href=\"platform-specific.html\">Platform-specific info</a></li> \n" \ + " </ul> \n" \ + " </li> \n" \ + " <li><a href=\"#\">Examples</a> \n" \ + " <ul id=\"topmenuexample\"> \n" \ + " <li><a href=\"all-examples.html\">Examples</a></li> \n" \ + " <li><a href=\"tutorials.html\">チュートリアル</a></li> \n" \ + " <li><a href=\"demos.html\">Demos</a></li> \n" \ + " <li><a href=\"qdeclarativeexamples.html\">QML Examples</a></li> \n" \ + " <li><a href=\"qdeclarativeexamples.html#Demos\">QML Demos</a></li> \n" \ + " </ul> \n" \ + " </li> \n" \ + " </ul> \n" \ + " </div>\n" \ + " </div>\n" \ + " <div class=\"wrapper\">\n" \ + " <div class=\"hd\">\n" \ + " <span></span>\n" \ + " </div>\n" \ + " <div class=\"bd group\">\n" \ + " <div class=\"sidebar\">\n" \ + " <div class=\"searchlabel\">\n" \ + " Search index:</div>\n" \ + " <div class=\"search\">\n" \ + " <form id=\"qtdocsearch\" action=\"\" onsubmit=\"return false;\">\n" \ + " <fieldset>\n" \ + " <input type=\"text\" name=\"searchstring\" id=\"pageType\" value=\"\" />\n" \ + " </fieldset>\n" \ + " </form>\n" \ + " </div>\n" \ + " <div class=\"box first bottombar\" id=\"lookup\">\n" \ + " <h2 title=\"API Lookup\"><span></span>\n" \ + " API Lookup</h2>\n" \ + " <div id=\"list001\" class=\"list\">\n" \ + " <ul id=\"ul001\" >\n" \ + " <li class=\"defaultLink\"><a href=\"classes.html\">Class index</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"functions.html\">Function index</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"modules.html\">Modules</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"namespaces.html\">Namespaces</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"qtglobal.html\">Global stuff</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"qdeclarativeelements.html\">QML elements</a></li>\n" \ + " </ul> \n" \ + " </div>\n" \ + " </div>\n" \ + " <div class=\"box bottombar\" id=\"topics\">\n" \ + " <h2 title=\"Qt Topics\"><span></span>\n" \ + " Qt Topics</h2>\n" \ + " <div id=\"list002\" class=\"list\">\n" \ + " <ul id=\"ul002\" >\n" \ + " <li class=\"defaultLink\"><a href=\"qt-basic-concepts.html\">Basic Qt architecture</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"declarativeui.html\">Device UI's & Qt Quick</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"qt-gui-concepts.html\">Desktop UI components</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"platform-specific.html\">Platform-specific info</a></li>\n" \ + " </ul> \n" \ + " </div>\n" \ + " </div>\n" \ + " <div class=\"box\" id=\"examples\">\n" \ + " <h2 title=\"Examples\"><span></span>\n" \ + " Examples</h2>\n" \ + " <div id=\"list003\" class=\"list\">\n" \ + " <ul id=\"ul003\">\n" \ + " <li class=\"defaultLink\"><a href=\"all-examples.html\">Examples</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"tutorials.html\">チュートリアル</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"demos.html\">Demos</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html\">QML Examples</a></li>\n" \ + " <li class=\"defaultLink\"><a href=\"qdeclarativeexamples.html#Demos\">QML Demos</a></li>\n" \ + " </ul> \n" \ + " </div>\n" \ + " </div>\n" \ + " </div>\n" \ + " <div class=\"wrap\">\n" \ + " <div class=\"toolbar\">\n" \ + " <div class=\"breadcrumb toolblock\">\n" \ + " <ul>\n" \ + " <li class=\"first\"><a href=\"index.html\">Home</a></li>\n" \ + " <!-- Bread crumbs goes here -->\n" + +HTML.postpostheader = " </ul>\n" \ + " </div>\n" \ + " <div class=\"toolbuttons toolblock\">\n" \ + " <ul>\n" \ + " <li id=\"smallA\" class=\"t_button\">A</li>\n" \ + " <li id=\"medA\" class=\"t_button active\">A</li>\n" \ + " <li id=\"bigA\" class=\"t_button\">A</li>\n" \ + " <li id=\"print\" class=\"t_button\"><a href=\"javascript:this.print();\">\n" \ + " <span>Print</span></a></li>\n" \ + " </ul>\n" \ + " </div>\n" \ + " </div>\n" \ + " <div class=\"content\">\n" + +HTML.footer = " <!-- /div -->\n" \ + " <div class=\"feedback t_button\">\n" \ + " [+] Documentation Feedback</div>\n" \ + " </div>\n" \ + " </div>\n" \ + " <div class=\"ft\">\n" \ + " <span></span>\n" \ + " </div>\n" \ + " </div> \n" \ + " <div class=\"footer\">\n" \ + " <p>\n" \ + " <acronym title=\"Copyright\">©</acronym> 2008-2010 Nokia Corporation and/or its\n" \ + " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \ + " in Finland and/or other countries worldwide.</p>\n" \ + " <p>\n" \ + " All other trademarks are property of their respective owners. <a title=\"Privacy Policy\"\n" \ + " href=\"http://qt.nokia.com/about/privacy-policy\">Privacy Policy</a></p>\n" \ + " </div>\n" \ + " <div id=\"feedbackBox\">\n" \ + " <div id=\"feedcloseX\" class=\"feedclose t_button\">X</div>\n" \ + " <form id=\"feedform\" action=\"http://doc.qt.nokia.com/docFeedbck/feedback.php\" method=\"get\">\n" \ + " <p><textarea id=\"feedbox\" name=\"feedText\" rows=\"5\" cols=\"40\">Please submit you feedback...</textarea></p>\n" \ + " <p><input id=\"feedsubmit\" class=\"feedclose\" type=\"submit\" name=\"feedback\" /></p>\n" \ + " </form>\n" \ + " </div>\n" \ + " <div id=\"blurpage\">\n" \ + " </div>\n" \ + "<script type=\"text/javascript\">\n" \ + " var _gaq = _gaq || [];\n" \ + " _gaq.push([\'_setAccount\', \'UA-4457116-5\']);\n" \ + " _gaq.push([\'_trackPageview\']);\n" \ + " (function() {\n" \ + " var ga = document.createElement(\'script\'); ga.type = \'text/javascript\'; ga.async = true;\n" \ + " ga.src = (\'https:\' == document.location.protocol ? \'https://ssl\' : \'http://www\') + \'.google-analytics.com/ga.js\';\n" \ + " var s = document.getElementsByTagName(\'script\')[0]; s.parentNode.insertBefore(ga, s);\n" \ + " })();\n" \ + "</script>\n" diff --git a/tools/qdoc3/test/qt.qdocconf b/tools/qdoc3/test/qt.qdocconf index c59bdb4..29c8536 100644 --- a/tools/qdoc3/test/qt.qdocconf +++ b/tools/qdoc3/test/qt.qdocconf @@ -130,6 +130,7 @@ excludedirs = $QTDIR/src/3rdparty/clucene \ $QTDIR/src/3rdparty/phonon/mmf \ $QTDIR/src/3rdparty/phonon/waveout \ $QTDIR/doc/src/snippets \ + $QTDIR/doc/src/ja_JP \ $QTDIR/doc/src/zh_CN sources.fileextensions = "*.cpp *.qdoc *.mm" diff --git a/tools/qdoc3/test/qt_ja_JP.qdocconf b/tools/qdoc3/test/qt_ja_JP.qdocconf new file mode 100644 index 0000000..d4141c7 --- /dev/null +++ b/tools/qdoc3/test/qt_ja_JP.qdocconf @@ -0,0 +1,125 @@ +include(compat.qdocconf) +include(macros.qdocconf) +include(qt-cpp-ignore.qdocconf) +include(qt-html-templates_ja_JP.qdocconf) +include(qt-defines.qdocconf) + +project = Qt +versionsym = +version = %VERSION% +description = Qt リファレンスドキュメント +url = http://qt.nokia.com/doc/ja_JP/4.7 + +sourceencoding = UTF-8 +outputencoding = UTF-8 +naturallanguage = ja + +indexes = $QTDIR/doc/html/qt.index + +qhp.projects = Qt + +qhp.Qt.file = qt.qhp +qhp.Qt.namespace = com.trolltech.qt.470 +qhp.Qt.virtualFolder = qdoc +qhp.Qt.title = Qt +qhp.Qt.indexTitle = Qt +qhp.Qt.selectors = fake:example + +qhp.Qt.filterAttributes = qt 4.7.0 qtrefdoc ja_JP +qhp.Qt.customFilters.Qt.name = Qt 4.7.0 +qhp.Qt.customFilters.Qt.filterAttributes = qt 4.7.0 + +# Files not referenced in any qdoc file (last four are needed by qtdemo) +# See also extraimages.HTML +qhp.Qt.extraFiles = index.html \ + images/bg_l.png \ + images/bg_l_blank.png \ + images/bg_ll_blank.png \ + images/bg_ul_blank.png \ + images/header_bg.png \ + images/bg_r.png \ + images/box_bg.png \ + images/breadcrumb.png \ + images/bullet_gt.png \ + images/bullet_dn.png \ + images/bullet_sq.png \ + images/bullet_up.png \ + images/arrow_down.png \ + images/feedbackground.png \ + images/horBar.png \ + images/page.png \ + images/page_bg.png \ + images/sprites-combined.png \ + images/spinner.gif \ + images/stylesheet-coffee-plastique.png \ + images/taskmenuextension-example.png \ + images/coloreditorfactoryimage.png \ + images/dynamiclayouts-example.png \ + scripts/functions.js \ + scripts/jquery.js \ + scripts/shBrushCpp.js \ + scripts/shCore.js \ + scripts/shLegacy.js \ + scripts/narrow.js \ + scripts/superfish.js \ + style/shCore.css \ + style/shThemeDefault.css \ + style/narrow.css \ + style/superfish.css \ + style/superfish_skin.css \ + style/OfflineStyle.css \ + style/style_ie6.css \ + style/style_ie7.css \ + style/style_ie8.css \ + style/style.css + +language = Cpp + +sourcedirs = $QTDIR/doc/src/ja_JP + +excludedirs = $QTDIR/src/3rdparty/clucene \ + $QTDIR/src/3rdparty/des \ + $QTDIR/src/3rdparty/freetype \ + $QTDIR/src/3rdparty/harfbuzz \ + $QTDIR/src/3rdparty/kdebase \ + $QTDIR/src/3rdparty/libjpeg \ + $QTDIR/src/3rdparty/libmng \ + $QTDIR/src/3rdparty/libpng \ + $QTDIR/src/3rdparty/libtiff \ + $QTDIR/src/3rdparty/md4 \ + $QTDIR/src/3rdparty/md5 \ + $QTDIR/src/3rdparty/patches \ + $QTDIR/src/3rdparty/sha1 \ + $QTDIR/src/3rdparty/sqlite \ + $QTDIR/src/3rdparty/webkit/JavaScriptCore \ + $QTDIR/src/3rdparty/webkit/WebCore \ + $QTDIR/src/3rdparty/wintab \ + $QTDIR/src/3rdparty/zlib \ + $QTDIR/doc/src/snippets \ + $QTDIR/doc/src/zh_CN \ + $QTDIR/src/3rdparty/phonon/gstreamer \ + $QTDIR/src/3rdparty/phonon/ds9 \ + $QTDIR/src/3rdparty/phonon/qt7 \ + $QTDIR/src/3rdparty/phonon/mmf \ + $QTDIR/src/3rdparty/phonon/waveout + +sources.fileextensions = "*.cpp *.qdoc *.mm" +examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp" +examples.imageextensions = "*.png" + +exampledirs = $QTDIR/doc/src \ + $QTDIR/examples/ja_JP \ + $QTDIR/examples \ + $QTDIR/examples/tutorials \ + $QTDIR \ + $QTDIR/qmake/examples \ + $QTDIR/src/3rdparty/webkit/WebKit/qt/docs +imagedirs = $QTDIR/doc/src/ja_JP/images \ + $QTDIR/doc/src/images \ + $QTDIR/examples \ + $QTDIR/doc/src/template/images +outputdir = $QTDIR/doc/html_ja_JP +tagfile = $QTDIR/doc/html_ja_JP/qt.tags +base = file:$QTDIR/doc/html_ja_JP + +HTML.generatemacrefs = "true" diff --git a/tools/qdoc3/test/qt_zh_CN.qdocconf b/tools/qdoc3/test/qt_zh_CN.qdocconf index 405da71..dc7e613 100644 --- a/tools/qdoc3/test/qt_zh_CN.qdocconf +++ b/tools/qdoc3/test/qt_zh_CN.qdocconf @@ -32,28 +32,28 @@ qhp.Qt.customFilters.Qt.filterAttributes = qt 4.8.0 # Files not referenced in any qdoc file (last four are needed by qtdemo) # See also extraimages.HTML qhp.Qt.extraFiles = index.html \ - images/bg_l.png \ - images/bg_l_blank.png \ - images/bg_r.png \ - images/box_bg.png \ - images/breadcrumb.png \ - images/bullet_gt.png \ - images/bullet_dn.png \ - images/bullet_sq.png \ - images/bullet_up.png \ - images/feedbackground.png \ - images/horBar.png \ - images/page.png \ - images/page_bg.png \ - images/sprites-combined.png \ - images/spinner.gif \ - images/stylesheet-coffee-plastique.png \ - images/taskmenuextension-example.png \ - images/coloreditorfactoryimage.png \ - images/dynamiclayouts-example.png \ - scripts/functions.js \ - scripts/jquery.js \ - style/style.css + images/bg_l.png \ + images/bg_l_blank.png \ + images/bg_r.png \ + images/box_bg.png \ + images/breadcrumb.png \ + images/bullet_gt.png \ + images/bullet_dn.png \ + images/bullet_sq.png \ + images/bullet_up.png \ + images/feedbackground.png \ + images/horBar.png \ + images/page.png \ + images/page_bg.png \ + images/sprites-combined.png \ + images/spinner.gif \ + images/stylesheet-coffee-plastique.png \ + images/taskmenuextension-example.png \ + images/coloreditorfactoryimage.png \ + images/dynamiclayouts-example.png \ + scripts/functions.js \ + scripts/jquery.js \ + style/style.css language = Cpp @@ -78,6 +78,7 @@ excludedirs = $QTDIR/src/3rdparty/clucene \ $QTDIR/src/3rdparty/wintab \ $QTDIR/src/3rdparty/zlib \ $QTDIR/doc/src/snippets \ + $QTDIR/doc/src/ja_JP \ $QTDIR/src/3rdparty/phonon/gstreamer \ $QTDIR/src/3rdparty/phonon/ds9 \ $QTDIR/src/3rdparty/phonon/qt7 \ diff --git a/tools/qdoc3/tree.cpp b/tools/qdoc3/tree.cpp index 31bbf54..d31de4d 100644 --- a/tools/qdoc3/tree.cpp +++ b/tools/qdoc3/tree.cpp @@ -1952,9 +1952,13 @@ QString Tree::fullDocumentLocation(const Node *node) const else if (node->type() == Node::Fake) { #ifdef QDOC_QML if ((node->subType() == Node::QmlClass) || - (node->subType() == Node::QmlBasicType)) - return "qml-" + node->fileBase() + ".html"; - else + (node->subType() == Node::QmlBasicType)) { + QString fb = node->fileBase(); + if (fb.startsWith(QLatin1String("QML:"))) + return node->fileBase() + ".html"; + else + return "qml-" + node->fileBase() + ".html"; + } else #endif parentName = node->fileBase() + ".html"; } |