summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2021-10-15 10:46:26 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2021-10-15 10:46:26 +0900
commitb7b8bd24feb1363d7d84d030b9ea688fe2f149de (patch)
tree83a30b06a24a934bb4120199cd0c180ece6fc1ed /src
parent046aece77e373b5280b56bf871fa6e974d06e85d (diff)
downloaddoxygen-b7b8bd24feb1363d7d84d030b9ea688fe2f149de.tar.gz
doxygen-b7b8bd24feb1363d7d84d030b9ea688fe2f149de.tar.bz2
doxygen-b7b8bd24feb1363d7d84d030b9ea688fe2f149de.zip
Imported Upstream version 1.8.4upstream/1.8.4
Diffstat (limited to 'src')
-rw-r--r--src/.gitignore47
-rw-r--r--src/Makefile.in14
-rw-r--r--src/arguments.h2
-rw-r--r--src/bufstr.h6
-rw-r--r--src/cite.cpp28
-rw-r--r--src/clangparser.cpp944
-rw-r--r--src/clangparser.h67
-rw-r--r--src/classdef.cpp155
-rw-r--r--src/classdef.h28
-rw-r--r--src/classlist.cpp6
-rw-r--r--src/classlist.h2
-rw-r--r--src/cmdmapper.cpp4
-rw-r--r--src/cmdmapper.h6
-rw-r--r--src/code.h4
-rw-r--r--src/code.l225
-rw-r--r--src/commentcnv.h2
-rw-r--r--src/commentcnv.l152
-rw-r--r--src/commentscan.h2
-rw-r--r--src/commentscan.l139
-rw-r--r--src/compound.xsd19
-rw-r--r--src/compound_xsd.h19
-rw-r--r--src/condparser.cpp4
-rw-r--r--src/condparser.h2
-rw-r--r--src/config.h83
-rw-r--r--src/config.l173
-rw-r--r--src/config.xml176
-rwxr-xr-xsrc/configgen.py12
-rw-r--r--src/configoptions.cpp195
-rw-r--r--src/configoptions.h2
-rw-r--r--src/constexp.h2
-rw-r--r--src/constexp.l2
-rw-r--r--src/constexp.y4
-rw-r--r--src/cppvalue.cpp2
-rw-r--r--src/cppvalue.h2
-rw-r--r--src/dbusxmlscanner.cpp4
-rw-r--r--src/dbusxmlscanner.h6
-rw-r--r--src/debug.cpp2
-rw-r--r--src/debug.h2
-rw-r--r--src/declinfo.h2
-rw-r--r--src/declinfo.l2
-rw-r--r--src/defargs.h2
-rw-r--r--src/defargs.l4
-rw-r--r--src/defgen.cpp22
-rw-r--r--src/defgen.h2
-rw-r--r--src/define.cpp4
-rw-r--r--src/define.h9
-rw-r--r--src/definition.cpp205
-rw-r--r--src/definition.h32
-rw-r--r--src/diagram.cpp4
-rw-r--r--src/diagram.h4
-rw-r--r--src/dirdef.cpp65
-rw-r--r--src/dirdef.h6
-rw-r--r--src/docbookgen.cpp1904
-rw-r--r--src/docbookgen.h20
-rw-r--r--src/docbookvisitor.cpp1397
-rw-r--r--src/docbookvisitor.h161
-rw-r--r--src/docparser.cpp638
-rw-r--r--src/docparser.h10
-rw-r--r--src/docsets.cpp11
-rw-r--r--src/docsets.h2
-rw-r--r--src/doctokenizer.h7
-rw-r--r--src/doctokenizer.l99
-rw-r--r--src/docvisitor.h3
-rw-r--r--src/dot.cpp206
-rw-r--r--src/dot.h8
-rw-r--r--src/doxygen.cpp1532
-rw-r--r--src/doxygen.css12
-rw-r--r--src/doxygen.h9
-rw-r--r--src/doxygen.md4
-rw-r--r--src/doxygen.pro.in8
-rw-r--r--src/doxygen.sty464
-rw-r--r--src/doxygen_css.h12
-rw-r--r--src/doxygen_sty.h464
-rw-r--r--src/eclipsehelp.cpp2
-rw-r--r--src/eclipsehelp.h2
-rw-r--r--src/entry.cpp6
-rw-r--r--src/entry.h121
-rw-r--r--src/example.h4
-rw-r--r--src/filedef.cpp473
-rw-r--r--src/filedef.h139
-rw-r--r--src/filename.cpp22
-rw-r--r--src/filename.h2
-rw-r--r--src/filestorage.h2
-rw-r--r--src/footer.html4
-rw-r--r--src/footer_html.h4
-rw-r--r--src/formula.cpp8
-rw-r--r--src/formula.h2
-rw-r--r--src/fortrancode.h4
-rw-r--r--src/fortrancode.l99
-rw-r--r--src/fortranscanner.h8
-rw-r--r--src/fortranscanner.l121
-rw-r--r--src/ftvhelp.cpp2
-rw-r--r--src/ftvhelp.h2
-rw-r--r--src/groupdef.cpp94
-rw-r--r--src/groupdef.h6
-rw-r--r--src/growbuf.h28
-rw-r--r--src/header.html10
-rw-r--r--src/header_html.h10
-rw-r--r--src/htags.cpp10
-rw-r--r--src/htags.h2
-rw-r--r--src/htmlattrib.h5
-rw-r--r--src/htmldocvisitor.cpp81
-rw-r--r--src/htmldocvisitor.h2
-rw-r--r--src/htmlgen.cpp100
-rw-r--r--src/htmlgen.h7
-rw-r--r--src/htmlhelp.cpp8
-rw-r--r--src/htmlhelp.h3
-rw-r--r--src/image.cpp2
-rw-r--r--src/image.h2
-rw-r--r--src/index.cpp124
-rw-r--r--src/index.h2
-rw-r--r--src/jquery_fx.js12
-rw-r--r--src/jquery_fx_js.h12
-rw-r--r--src/jquery_p1.js21
-rw-r--r--src/jquery_p1_js.h21
-rw-r--r--src/jquery_p2.js13
-rw-r--r--src/jquery_p2_js.h13
-rw-r--r--src/jquery_p3.js5
-rw-r--r--src/jquery_p3_js.h5
-rw-r--r--src/jquery_ui.js28
-rw-r--r--src/jquery_ui_js.h26
-rw-r--r--src/language.cpp19
-rw-r--r--src/language.h2
-rw-r--r--src/latexdocvisitor.cpp39
-rw-r--r--src/latexdocvisitor.h2
-rw-r--r--src/latexgen.cpp970
-rw-r--r--src/latexgen.h4
-rw-r--r--src/layout.cpp54
-rw-r--r--src/layout.h8
-rw-r--r--src/layout_default.h6
-rw-r--r--src/layout_default.xml6
-rw-r--r--src/libdoxycfg.pro.in2
-rw-r--r--src/libdoxycfg.t.in2
-rw-r--r--src/libdoxygen.pro.in16
-rw-r--r--src/libdoxygen.t.in8
-rw-r--r--src/lockingptr.h2
-rw-r--r--src/logos.cpp2
-rw-r--r--src/logos.h2
-rw-r--r--src/main.cpp2
-rw-r--r--src/mandocvisitor.cpp7
-rw-r--r--src/mandocvisitor.h2
-rw-r--r--src/mangen.cpp44
-rw-r--r--src/mangen.h6
-rw-r--r--src/markdown.cpp134
-rw-r--r--src/markdown.h8
-rw-r--r--src/marshal.cpp19
-rw-r--r--src/marshal.h4
-rw-r--r--src/memberdef.cpp943
-rw-r--r--src/memberdef.h48
-rw-r--r--src/membergroup.cpp8
-rw-r--r--src/membergroup.h2
-rw-r--r--src/memberlist.cpp72
-rw-r--r--src/memberlist.h7
-rw-r--r--src/membername.cpp12
-rw-r--r--src/membername.h4
-rw-r--r--src/message.cpp32
-rw-r--r--src/message.h3
-rw-r--r--src/msc.cpp8
-rw-r--r--src/msc.h2
-rw-r--r--src/namespacedef.cpp155
-rw-r--r--src/namespacedef.h25
-rw-r--r--src/objcache.cpp7
-rw-r--r--src/objcache.h2
-rw-r--r--src/outputgen.cpp2
-rw-r--r--src/outputgen.h7
-rw-r--r--src/outputlist.cpp50
-rw-r--r--src/outputlist.h19
-rw-r--r--src/pagedef.cpp42
-rw-r--r--src/pagedef.h4
-rw-r--r--src/parserintf.h27
-rw-r--r--src/perlmodgen.cpp47
-rw-r--r--src/perlmodgen.h2
-rw-r--r--src/portable.cpp20
-rw-r--r--src/pre.h2
-rw-r--r--src/pre.l306
-rw-r--r--src/printdocvisitor.h229
-rw-r--r--src/pycode.h3
-rw-r--r--src/pycode.l44
-rw-r--r--src/pyscanner.h8
-rw-r--r--src/pyscanner.l46
-rw-r--r--src/qtbc.h2
-rw-r--r--src/reflist.cpp2
-rw-r--r--src/reflist.h4
-rw-r--r--src/resize.js2
-rw-r--r--src/resize_js.h2
-rw-r--r--src/rtfdocvisitor.cpp7
-rw-r--r--src/rtfdocvisitor.h2
-rw-r--r--src/rtfgen.cpp47
-rw-r--r--src/rtfgen.h4
-rw-r--r--src/rtfstyle.cpp6
-rw-r--r--src/rtfstyle.h2
-rw-r--r--src/scanner.h8
-rw-r--r--src/scanner.l586
-rw-r--r--src/search.css2
-rw-r--r--src/search_css.h2
-rw-r--r--src/searchindex.cpp49
-rw-r--r--src/searchindex.h2
-rw-r--r--src/section.h2
-rw-r--r--src/settings.h12
-rw-r--r--src/sortdict.h2
-rw-r--r--src/sqlite3gen.cpp1361
-rw-r--r--src/sqlite3gen.h23
-rw-r--r--src/store.cpp2
-rw-r--r--src/store.h2
-rw-r--r--src/tagreader.cpp86
-rw-r--r--src/tagreader.h4
-rw-r--r--src/tclscanner.h8
-rw-r--r--src/tclscanner.l451
-rw-r--r--src/textdocvisitor.cpp4
-rw-r--r--src/textdocvisitor.h2
-rw-r--r--src/translator.h69
-rw-r--r--src/translator_adapter.h71
-rw-r--r--src/translator_am.h110
-rw-r--r--src/translator_ar.h400
-rw-r--r--src/translator_br.h6
-rw-r--r--src/translator_ca.h6
-rw-r--r--src/translator_cn.h10
-rw-r--r--src/translator_cz.h8
-rw-r--r--src/translator_de.h8
-rw-r--r--src/translator_dk.h6
-rw-r--r--src/translator_en.h62
-rw-r--r--src/translator_eo.h8
-rw-r--r--src/translator_es.h8
-rw-r--r--src/translator_fa.h8
-rw-r--r--src/translator_fi.h8
-rw-r--r--src/translator_fr.h6
-rw-r--r--src/translator_gr.h15
-rw-r--r--src/translator_hr.h39
-rw-r--r--src/translator_hu.h6
-rw-r--r--src/translator_id.h6
-rw-r--r--src/translator_it.h8
-rw-r--r--src/translator_je.h2
-rw-r--r--src/translator_jp.h6
-rw-r--r--src/translator_ke.h2
-rw-r--r--src/translator_kr.h127
-rw-r--r--src/translator_lt.h10
-rw-r--r--src/translator_lv.h2002
-rw-r--r--src/translator_mk.h10
-rw-r--r--src/translator_nl.h8
-rw-r--r--src/translator_no.h6
-rw-r--r--src/translator_pl.h6
-rw-r--r--src/translator_pt.h6
-rw-r--r--src/translator_ro.h661
-rw-r--r--src/translator_ru.h9
-rw-r--r--src/translator_sc.h62
-rw-r--r--src/translator_si.h6
-rw-r--r--src/translator_sk.h65
-rw-r--r--src/translator_sr.h6
-rw-r--r--src/translator_sv.h6
-rw-r--r--src/translator_tr.h6
-rw-r--r--src/translator_tw.h6
-rw-r--r--src/translator_ua.h1348
-rw-r--r--src/translator_vi.h10
-rw-r--r--src/translator_za.h6
-rw-r--r--src/translatordecoder.h24
-rw-r--r--src/types.h28
-rw-r--r--src/util.cpp248
-rw-r--r--src/util.h5
-rw-r--r--src/version.h2
-rw-r--r--src/vhdlcode.l17
-rw-r--r--src/vhdldocgen.cpp1534
-rw-r--r--src/vhdldocgen.h91
-rw-r--r--src/vhdlparser.y862
-rw-r--r--src/vhdlscanner.h17
-rw-r--r--src/vhdlscanner.l99
-rw-r--r--src/xmldocvisitor.cpp15
-rw-r--r--src/xmldocvisitor.h2
-rw-r--r--src/xmlgen.cpp224
-rw-r--r--src/xmlgen.h2
269 files changed, 19095 insertions, 7122 deletions
diff --git a/src/.gitignore b/src/.gitignore
new file mode 100644
index 0000000..3eae438
--- /dev/null
+++ b/src/.gitignore
@@ -0,0 +1,47 @@
+*~
+.*sw?
+\#*
+.DS_Store
+
+*.rej
+*.orig
+
+Makefile
+*.pro
+/.makeconfig
+/.tmakeconfig
+/VERSION
+/src/libdoxycfg.t
+/src/libdoxygen.t
+/packages/rpm/doxygen.spec
+/libmd5/Makefile.libmd5
+/qtools/Makefile.qtools
+/src/Makefile.doxygen
+/src/Makefile.libdoxycfg
+/src/Makefile.libdoxygen
+
+/bin
+/lib
+/objects
+/src/ce_lex.cpp
+/src/ce_parse.cpp
+/src/ce_parse.h
+/src/code.cpp
+/src/commentcnv.cpp
+/src/commentscan.cpp
+/src/config.cpp
+/src/declinfo.cpp
+/src/defargs.cpp
+/src/doctokenizer.cpp
+/src/fortrancode.cpp
+/src/fortranscanner.cpp
+/src/pre.cpp
+/src/pycode.cpp
+/src/pyscanner.cpp
+/src/scanner.cpp
+/src/tclscanner.cpp
+/src/version.cpp
+/src/vhdlcode.cpp
+/src/vhdlparser.cpp
+/src/vhdlparser.h
+/src/vhdlscanner.cpp
diff --git a/src/Makefile.in b/src/Makefile.in
index e6a7080..2e78088 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -2,7 +2,7 @@
#
#
#
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
@@ -20,18 +20,18 @@ all: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile
$(MAKE) -f Makefile.doxygen PERL=$(PERL) $@
Makefile.libdoxygen: libdoxygen.pro libdoxygen.t
- $(ENV) $(PERL) $(TMAKE) libdoxygen.pro >Makefile.libdoxygen
+ $(ENV) $(PERL) "$(TMAKE)" libdoxygen.pro >Makefile.libdoxygen
Makefile.libdoxycfg: libdoxycfg.pro libdoxycfg.t
- $(ENV) $(PERL) $(TMAKE) libdoxycfg.pro >Makefile.libdoxycfg
+ $(ENV) $(PERL) "$(TMAKE)" libdoxycfg.pro >Makefile.libdoxycfg
Makefile.doxygen: doxygen.pro
- $(ENV) $(PERL) $(TMAKE) doxygen.pro >Makefile.doxygen
+ $(ENV) $(PERL) "$(TMAKE)" doxygen.pro >Makefile.doxygen
tmake:
- $(ENV) $(PERL) $(TMAKE) libdoxygen.pro >Makefile.libdoxygen
- $(ENV) $(PERL) $(TMAKE) libdoxycfg.pro >Makefile.libdoxycfg
- $(ENV) $(PERL) $(TMAKE) doxygen.pro >Makefile.doxygen
+ $(ENV) $(PERL) "$(TMAKE)" libdoxygen.pro >Makefile.libdoxygen
+ $(ENV) $(PERL) "$(TMAKE)" libdoxycfg.pro >Makefile.libdoxycfg
+ $(ENV) $(PERL) "$(TMAKE)" doxygen.pro >Makefile.doxygen
# clean objects
clean: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen
diff --git a/src/arguments.h b/src/arguments.h
index 09f5b63..eba452c 100644
--- a/src/arguments.h
+++ b/src/arguments.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/bufstr.h b/src/bufstr.h
index 2e704f5..427b012 100644
--- a/src/bufstr.h
+++ b/src/bufstr.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -18,6 +18,10 @@
#ifndef _BUFSTR_H
#define _BUFSTR_H
+#include <qglobal.h>
+#include <qcstring.h>
+#include <stdlib.h>
+
/*! @brief Buffer used to store strings
*
* This buffer is used append characters and strings. It will automatically
diff --git a/src/cite.cpp b/src/cite.cpp
index 91dd1e1..576c4bf 100644
--- a/src/cite.cpp
+++ b/src/cite.cpp
@@ -88,11 +88,19 @@ static QCString getListOfBibFiles(const QCString &sep,bool namesOnly)
void CiteDict::writeLatexBibliography(FTextStream &t)
{
- if (m_entries.count()==0) return;
+ if (m_entries.isEmpty())
+ return;
+
QCString style = Config_getString("LATEX_BIB_STYLE");
- if (style.isEmpty()) style="plain";
- t << "\\newpage \\bibliographystyle{" << style << "}" << endl;
- t << "\\bibliography{" << getListOfBibFiles(",",TRUE) << "}" << endl;
+ if (style.isEmpty())
+ style="plain";
+ t << "% Bibliography\n"
+ "\\newpage\n"
+ "\\phantomsection\n"
+ "\\addcontentsline{toc}{part}{" << theTranslator->trCiteReferences() << "}\n"
+ "\\bibliographystyle{" << style << "}\n"
+ "\\bibliography{" << getListOfBibFiles(",",TRUE) << "}\n"
+ "\n";
}
void CiteDict::insert(const char *label)
@@ -130,7 +138,7 @@ void CiteDict::generatePage() const
f.setName(citeListFile);
if (!f.open(IO_WriteOnly))
{
- err("error: could not open file %s for writing\n",citeListFile.data());
+ err("could not open file %s for writing\n",citeListFile.data());
}
FTextStream t(&f);
t << "<!-- BEGIN CITATIONS -->" << endl;
@@ -153,7 +161,7 @@ void CiteDict::generatePage() const
QCString bib2xhtml = bib2xhtml_pl;
if (!f.open(IO_WriteOnly))
{
- err("error: could not open file %s for writing\n",bib2xhtmlFile.data());
+ err("could not open file %s for writing\n",bib2xhtmlFile.data());
}
f.writeBlock(bib2xhtml, bib2xhtml.length());
f.close();
@@ -164,7 +172,7 @@ void CiteDict::generatePage() const
f.setName(doxygenBstFile);
if (!f.open(IO_WriteOnly))
{
- err("error: could not open file %s for writing\n",doxygenBstFile.data());
+ err("could not open file %s for writing\n",doxygenBstFile.data());
}
f.writeBlock(bstData, bstData.length());
f.close();
@@ -198,7 +206,7 @@ void CiteDict::generatePage() const
}
else if (!fi.exists())
{
- err("Error: bib file %s not found!\n",bibFile.data());
+ err("bib file %s not found!\n",bibFile.data());
}
bibdata = citeDataList.next();
}
@@ -218,7 +226,7 @@ void CiteDict::generatePage() const
f.setName(citeListFile);
if (!f.open(IO_ReadOnly))
{
- err("error: could not open file %s/citelist.doc for reading\n",outputDir.data());
+ err("could not open file %s/citelist.doc for reading\n",outputDir.data());
}
bool insideBib=FALSE;
@@ -285,7 +293,7 @@ void CiteDict::generatePage() const
}
else
{
- err("Error: bib file %s not found!\n",bibFile.data());
+ err("bib file %s not found!\n",bibFile.data());
}
bibdata = citeDataList.next();
}
diff --git a/src/clangparser.cpp b/src/clangparser.cpp
new file mode 100644
index 0000000..459fd26
--- /dev/null
+++ b/src/clangparser.cpp
@@ -0,0 +1,944 @@
+#include "clangparser.h"
+#include "settings.h"
+#include <stdio.h>
+
+#if USE_LIBCLANG
+#include <clang-c/Index.h>
+#include <qfileinfo.h>
+#include <stdlib.h>
+#include "message.h"
+#include "sortdict.h"
+#include "outputgen.h"
+#include "filedef.h"
+#include "memberdef.h"
+#include "doxygen.h"
+#include "util.h"
+#include "config.h"
+#include "growbuf.h"
+#include "membername.h"
+#include "filename.h"
+
+static Definition *g_currentDefinition=0;
+static MemberDef *g_currentMemberDef=0;
+static uint g_currentLine=0;
+static bool g_searchForBody=FALSE;
+static bool g_insideBody=FALSE;
+static uint g_bracketCount=0;
+#endif
+
+ClangParser *ClangParser::instance()
+{
+ if (!s_instance) s_instance = new ClangParser;
+ return s_instance;
+}
+
+ClangParser *ClangParser::s_instance = 0;
+
+//--------------------------------------------------------------------------
+#if USE_LIBCLANG
+
+class ClangParser::Private
+{
+ public:
+ enum DetectedLang { Detected_Cpp, Detected_ObjC, Detected_ObjCpp };
+ Private() : tu(0), tokens(0), numTokens(0), cursors(0),
+ ufs(0), sources(0), numFiles(0), fileMapping(257),
+ detectedLang(Detected_Cpp)
+ { fileMapping.setAutoDelete(TRUE); }
+ int getCurrentTokenLine();
+ CXIndex index;
+ CXTranslationUnit tu;
+ QCString fileName;
+ CXToken *tokens;
+ uint numTokens;
+ CXCursor *cursors;
+ uint curLine;
+ uint curToken;
+ CXUnsavedFile *ufs;
+ QCString *sources;
+ uint numFiles;
+ QDict<uint> fileMapping;
+ DetectedLang detectedLang;
+};
+
+static QCString detab(const QCString &s)
+{
+ static int tabSize = Config_getInt("TAB_SIZE");
+ GrowBuf out;
+ int size = s.length();
+ const char *data = s.data();
+ int i=0;
+ int col=0;
+ const int maxIndent=1000000; // value representing infinity
+ int minIndent=maxIndent;
+ while (i<size)
+ {
+ char c = data[i++];
+ switch(c)
+ {
+ case '\t': // expand tab
+ {
+ int stop = tabSize - (col%tabSize);
+ //printf("expand at %d stop=%d\n",col,stop);
+ col+=stop;
+ while (stop--) out.addChar(' ');
+ }
+ break;
+ case '\n': // reset colomn counter
+ out.addChar(c);
+ col=0;
+ break;
+ case ' ': // increment column counter
+ out.addChar(c);
+ col++;
+ break;
+ default: // non-whitespace => update minIndent
+ out.addChar(c);
+ if (c<0 && i<size) // multibyte sequence
+ {
+ out.addChar(data[i++]); // >= 2 bytes
+ if (((uchar)c&0xE0)==0xE0 && i<size)
+ {
+ out.addChar(data[i++]); // 3 bytes
+ }
+ if (((uchar)c&0xF0)==0xF0 && i<size)
+ {
+ out.addChar(data[i++]); // 4 byres
+ }
+ }
+ if (col<minIndent) minIndent=col;
+ col++;
+ }
+ }
+ out.addChar(0);
+ //printf("detab refIndent=%d\n",refIndent);
+ return out.get();
+}
+
+/** Callback function called for each include in a translation unit */
+static void inclusionVisitor(CXFile includedFile,
+ CXSourceLocation* /*inclusionStack*/,
+ unsigned /*includeLen*/,
+ CXClientData clientData)
+{
+ QDict<void> *fileDict = (QDict<void> *)clientData;
+ CXString incFileName = clang_getFileName(includedFile);
+ //printf("--- file %s includes %s\n",fileName,clang_getCString(incFileName));
+ fileDict->insert(clang_getCString(incFileName),(void*)0x8);
+ clang_disposeString(incFileName);
+}
+
+/** filter the \a files and only keep those that are found as include files
+ * within the current translation unit.
+ * @param[in,out] files The list of files to filter.
+ */
+void ClangParser::determineInputFilesInSameTu(QStrList &files)
+{
+ // put the files in this translation unit in a dictionary
+ QDict<void> incFound(257);
+ clang_getInclusions(p->tu,
+ inclusionVisitor,
+ (CXClientData)&incFound
+ );
+ // create a new filtered file list
+ QStrList resultIncludes;
+ QStrListIterator it2(files);
+ for (it2.toFirst();it2.current();++it2)
+ {
+ if (incFound.find(it2.current()))
+ {
+ resultIncludes.append(it2.current());
+ }
+ }
+ // replace the original list
+ files=resultIncludes;
+}
+
+void ClangParser::start(const char *fileName,QStrList &filesInTranslationUnit)
+{
+ static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+ static QStrList &includePath = Config_getList("INCLUDE_PATH");
+ static QStrList clangOptions = Config_getList("CLANG_OPTIONS");
+ if (!clangAssistedParsing) return;
+ //printf("ClangParser::start(%s)\n",fileName);
+ p->fileName = fileName;
+ p->index = clang_createIndex(0, 0);
+ p->curLine = 1;
+ p->curToken = 0;
+ char **argv = (char**)malloc(sizeof(char*)*(4+Doxygen::inputPaths.count()+includePath.count()+clangOptions.count()));
+ QDictIterator<void> di(Doxygen::inputPaths);
+ int argc=0;
+ // add include paths for input files
+ for (di.toFirst();di.current();++di,++argc)
+ {
+ QCString inc = QCString("-I")+di.currentKey();
+ argv[argc]=strdup(inc.data());
+ //printf("argv[%d]=%s\n",argc,argv[argc]);
+ }
+ // add external include paths
+ for (uint i=0;i<includePath.count();i++)
+ {
+ QCString inc = QCString("-I")+includePath.at(i);
+ argv[argc++]=strdup(inc.data());
+ }
+ // user specified options
+ for (uint i=0;i<clangOptions.count();i++)
+ {
+ argv[argc++]=strdup(clangOptions.at(i));
+ }
+ // extra options
+ argv[argc++]=strdup("-ferror-limit=0");
+ argv[argc++]=strdup("-x");
+
+ // Since we can be presented with a .h file that can contain C/C++ or
+ // Objective C code and we need to configure the parser before knowing this,
+ // we use the source file to detected the language. Detection will fail if you
+ // pass a bunch of .h files containing ObjC code, and no sources :-(
+ SrcLangExt lang = getLanguageFromFileName(fileName);
+ if (lang==SrcLangExt_ObjC || p->detectedLang!=ClangParser::Private::Detected_Cpp)
+ {
+ QCString fn = fileName;
+ if (p->detectedLang==ClangParser::Private::Detected_Cpp &&
+ (fn.right(4).lower()==".cpp" || fn.right(4).lower()==".cxx" ||
+ fn.right(3).lower()==".cc" || fn.right(2).lower()==".c"))
+ { // fall back to C/C++ once we see an extension that indicates this
+ p->detectedLang = ClangParser::Private::Detected_Cpp;
+ }
+ else if (fn.right(3).lower()==".mm") // switch to Objective C++
+ {
+ p->detectedLang = ClangParser::Private::Detected_ObjCpp;
+ }
+ else if (fn.right(2).lower()==".m") // switch to Objective C
+ {
+ p->detectedLang = ClangParser::Private::Detected_ObjC;
+ }
+ }
+ switch(p->detectedLang)
+ {
+ case ClangParser::Private::Detected_Cpp:
+ argv[argc++]=strdup("c++");
+ break;
+ case ClangParser::Private::Detected_ObjC:
+ argv[argc++]=strdup("objective-c");
+ break;
+ case ClangParser::Private::Detected_ObjCpp:
+ argv[argc++]=strdup("objective-c++");
+ break;
+ }
+
+ // provide the input and and its dependencies as unsaved files so we can
+ // pass the filtered versions
+ argv[argc++]=strdup(fileName);
+ static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES");
+ //printf("source %s ----------\n%s\n-------------\n\n",
+ // fileName,p->source.data());
+ uint numUnsavedFiles = filesInTranslationUnit.count()+1;
+ p->numFiles = numUnsavedFiles;
+ p->sources = new QCString[numUnsavedFiles];
+ p->ufs = new CXUnsavedFile[numUnsavedFiles];
+ p->sources[0] = detab(fileToString(fileName,filterSourceFiles,TRUE));
+ p->ufs[0].Filename = strdup(fileName);
+ p->ufs[0].Contents = p->sources[0].data();
+ p->ufs[0].Length = p->sources[0].length();
+ QStrListIterator it(filesInTranslationUnit);
+ uint i=1;
+ for (it.toFirst();it.current() && i<numUnsavedFiles;++it,i++)
+ {
+ p->fileMapping.insert(it.current(),new uint(i));
+ p->sources[i] = detab(fileToString(it.current(),filterSourceFiles,TRUE));
+ p->ufs[i].Filename = strdup(it.current());
+ p->ufs[i].Contents = p->sources[i].data();
+ p->ufs[i].Length = p->sources[i].length();
+ }
+
+ // let libclang do the actual parsing
+ p->tu = clang_parseTranslationUnit(p->index, 0,
+ argv, argc, p->ufs, numUnsavedFiles,
+ CXTranslationUnit_DetailedPreprocessingRecord);
+ // free arguments
+ for (int i=0;i<argc;++i)
+ {
+ free(argv[i]);
+ }
+ free(argv);
+
+ if (p->tu)
+ {
+ // filter out any includes not found by the clang parser
+ determineInputFilesInSameTu(filesInTranslationUnit);
+
+ // show any warnings that the compiler produced
+ for (uint i=0, n=clang_getNumDiagnostics(p->tu); i!=n; ++i)
+ {
+ CXDiagnostic diag = clang_getDiagnostic(p->tu, i);
+ CXString string = clang_formatDiagnostic(diag,
+ clang_defaultDiagnosticDisplayOptions());
+ err("%s [clang]\n",clang_getCString(string));
+ clang_disposeString(string);
+ clang_disposeDiagnostic(diag);
+ }
+
+ // create a source range for the given file
+ QFileInfo fi(fileName);
+ CXFile f = clang_getFile(p->tu, fileName);
+ CXSourceLocation fileBegin = clang_getLocationForOffset(p->tu, f, 0);
+ CXSourceLocation fileEnd = clang_getLocationForOffset(p->tu, f, p->ufs[0].Length);
+ CXSourceRange fileRange = clang_getRange(fileBegin, fileEnd);
+
+ // produce a token stream for the file
+ clang_tokenize(p->tu,fileRange,&p->tokens,&p->numTokens);
+
+ // produce cursors for each token in the stream
+ p->cursors=new CXCursor[p->numTokens];
+ clang_annotateTokens(p->tu,p->tokens,p->numTokens,p->cursors);
+ }
+ else
+ {
+ p->tokens = 0;
+ p->numTokens = 0;
+ p->cursors = 0;
+ err("clang: Failed to parse translation unit %s\n",fileName);
+ }
+}
+
+void ClangParser::switchToFile(const char *fileName)
+{
+ if (p->tu)
+ {
+ delete[] p->cursors;
+ clang_disposeTokens(p->tu,p->tokens,p->numTokens);
+ p->tokens = 0;
+ p->numTokens = 0;
+ p->cursors = 0;
+
+ QFileInfo fi(fileName);
+ CXFile f = clang_getFile(p->tu, fileName);
+ uint *pIndex=p->fileMapping.find(fileName);
+ if (pIndex && *pIndex<p->numFiles)
+ {
+ uint i=*pIndex;
+ //printf("switchToFile %s: len=%ld\n",fileName,p->ufs[i].Length);
+ CXSourceLocation fileBegin = clang_getLocationForOffset(p->tu, f, 0);
+ CXSourceLocation fileEnd = clang_getLocationForOffset(p->tu, f, p->ufs[i].Length);
+ CXSourceRange fileRange = clang_getRange(fileBegin, fileEnd);
+
+ clang_tokenize(p->tu,fileRange,&p->tokens,&p->numTokens);
+ p->cursors=new CXCursor[p->numTokens];
+ clang_annotateTokens(p->tu,p->tokens,p->numTokens,p->cursors);
+
+ p->curLine = 1;
+ p->curToken = 0;
+ }
+ else
+ {
+ err("clang: Failed to find input file %s in mapping\n",fileName);
+ }
+ }
+}
+
+void ClangParser::finish()
+{
+ static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+ if (!clangAssistedParsing) return;
+ if (p->tu)
+ {
+ //printf("ClangParser::finish()\n");
+ delete[] p->cursors;
+ clang_disposeTokens(p->tu,p->tokens,p->numTokens);
+ clang_disposeTranslationUnit(p->tu);
+ clang_disposeIndex(p->index);
+ p->fileMapping.clear();
+ p->tokens = 0;
+ p->numTokens = 0;
+ p->cursors = 0;
+ }
+ for (uint i=0;i<p->numFiles;i++)
+ {
+ free((void *)p->ufs[i].Filename);
+ }
+ delete[] p->ufs;
+ delete[] p->sources;
+ p->ufs = 0;
+ p->sources = 0;
+ p->numFiles = 0;
+ p->tu = 0;
+}
+
+int ClangParser::Private::getCurrentTokenLine()
+{
+ uint l, c;
+ if (numTokens==0) return 1;
+ // guard against filters that reduce the number of lines
+ if (curToken>=numTokens) curToken=numTokens-1;
+ CXSourceLocation start = clang_getTokenLocation(tu,tokens[curToken]);
+ clang_getSpellingLocation(start, 0, &l, &c, 0);
+ return l;
+}
+
+QCString ClangParser::lookup(uint line,const char *symbol)
+{
+ //printf("ClangParser::lookup(%d,%s)\n",line,symbol);
+ QCString result;
+ if (symbol==0) return result;
+ static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+ if (!clangAssistedParsing) return result;
+
+ int sl = strlen(symbol);
+ uint l = p->getCurrentTokenLine();
+ while (l>=line && p->curToken>0)
+ {
+ if (l==line) // already at the right line
+ {
+ p->curToken--; // linear search to start of the line
+ l = p->getCurrentTokenLine();
+ }
+ else
+ {
+ p->curToken/=2; // binary search backward
+ l = p->getCurrentTokenLine();
+ }
+ }
+ bool found=FALSE;
+ while (l<=line && p->curToken<p->numTokens && !found)
+ {
+ CXString tokenString = clang_getTokenSpelling(p->tu, p->tokens[p->curToken]);
+ //if (l==line)
+ //{
+ // printf("try to match symbol %s with token %s\n",symbol,clang_getCString(tokenString));
+ //}
+ const char *ts = clang_getCString(tokenString);
+ int tl = strlen(ts);
+ int startIndex = p->curToken;
+ if (l==line && strncmp(ts,symbol,tl)==0) // found partial match at the correct line
+ {
+ int offset = tl;
+ while (offset<sl) // symbol spans multiple tokens
+ {
+ //printf("found partial match\n");
+ p->curToken++;
+ if (p->curToken>=p->numTokens)
+ {
+ break; // end of token stream
+ }
+ l = p->getCurrentTokenLine();
+ clang_disposeString(tokenString);
+ tokenString = clang_getTokenSpelling(p->tu, p->tokens[p->curToken]);
+ ts = clang_getCString(tokenString);
+ tl = ts ? strlen(ts) : 0;
+ // skip over any spaces in the symbol
+ char c;
+ while (offset<sl && ((c=symbol[offset])==' ' || c=='\t' || c=='\r' || c=='\n'))
+ {
+ offset++;
+ }
+ if (strncmp(ts,symbol+offset,tl)!=0) // next token matches?
+ {
+ //printf("no match '%s'<->'%s'\n",ts,symbol+offset);
+ break; // no match
+ }
+ //printf("partial match '%s'<->'%s'\n",ts,symbol+offset);
+ offset+=tl;
+ }
+ if (offset==sl) // symbol matches the token(s)
+ {
+ CXCursor c = p->cursors[p->curToken];
+ CXString usr = clang_getCursorUSR(c);
+ //printf("found full match %s usr='%s'\n",symbol,clang_getCString(usr));
+ result = clang_getCString(usr);
+ clang_disposeString(usr);
+ found=TRUE;
+ }
+ else // reset token cursor to start of the search
+ {
+ p->curToken = startIndex;
+ }
+ }
+ clang_disposeString(tokenString);
+ p->curToken++;
+ if (p->curToken<p->numTokens)
+ {
+ l = p->getCurrentTokenLine();
+ }
+ }
+ //if (!found)
+ //{
+ // printf("Did not find symbol %s at line %d :-(\n",symbol,line);
+ //}
+ //else
+ //{
+ // printf("Found symbol %s usr=%s\n",symbol,result.data());
+ //}
+ return result;
+}
+
+static QCString keywordToType(const char *keyword)
+{
+ static bool init=TRUE;
+ static QDict<void> flowKeywords(47);
+ static QDict<void> typeKeywords(47);
+ if (init)
+ {
+ flowKeywords.insert("break",(void*)0x8);
+ flowKeywords.insert("case",(void*)0x8);
+ flowKeywords.insert("catch",(void*)0x8);
+ flowKeywords.insert("continue",(void*)0x8);
+ flowKeywords.insert("default",(void*)0x8);
+ flowKeywords.insert("do",(void*)0x8);
+ flowKeywords.insert("else",(void*)0x8);
+ flowKeywords.insert("finally",(void*)0x8);
+ flowKeywords.insert("for",(void*)0x8);
+ flowKeywords.insert("foreach",(void*)0x8);
+ flowKeywords.insert("for each",(void*)0x8);
+ flowKeywords.insert("goto",(void*)0x8);
+ flowKeywords.insert("if",(void*)0x8);
+ flowKeywords.insert("return",(void*)0x8);
+ flowKeywords.insert("switch",(void*)0x8);
+ flowKeywords.insert("throw",(void*)0x8);
+ flowKeywords.insert("throws",(void*)0x8);
+ flowKeywords.insert("try",(void*)0x8);
+ flowKeywords.insert("while",(void*)0x8);
+ flowKeywords.insert("@try",(void*)0x8);
+ flowKeywords.insert("@catch",(void*)0x8);
+ flowKeywords.insert("@finally",(void*)0x8);
+
+ typeKeywords.insert("bool",(void*)0x8);
+ typeKeywords.insert("char",(void*)0x8);
+ typeKeywords.insert("double",(void*)0x8);
+ typeKeywords.insert("float",(void*)0x8);
+ typeKeywords.insert("int",(void*)0x8);
+ typeKeywords.insert("long",(void*)0x8);
+ typeKeywords.insert("object",(void*)0x8);
+ typeKeywords.insert("short",(void*)0x8);
+ typeKeywords.insert("signed",(void*)0x8);
+ typeKeywords.insert("unsigned",(void*)0x8);
+ typeKeywords.insert("void",(void*)0x8);
+ typeKeywords.insert("wchar_t",(void*)0x8);
+ typeKeywords.insert("size_t",(void*)0x8);
+ typeKeywords.insert("boolean",(void*)0x8);
+ typeKeywords.insert("id",(void*)0x8);
+ typeKeywords.insert("SEL",(void*)0x8);
+ typeKeywords.insert("string",(void*)0x8);
+ typeKeywords.insert("nullptr",(void*)0x8);
+ init=FALSE;
+ }
+ if (flowKeywords[keyword]) return "keywordflow";
+ if (typeKeywords[keyword]) return "keywordtype";
+ return "keyword";
+}
+
+static void writeLineNumber(CodeOutputInterface &ol,FileDef *fd,uint line)
+{
+ Definition *d = fd ? fd->getSourceDefinition(line) : 0;
+ if (d && d->isLinkable())
+ {
+ g_currentDefinition=d;
+ g_currentLine=line;
+ MemberDef *md = fd->getSourceMember(line);
+ if (md && md->isLinkable()) // link to member
+ {
+ if (g_currentMemberDef!=md) // new member, start search for body
+ {
+ g_searchForBody=TRUE;
+ g_insideBody=FALSE;
+ g_bracketCount=0;
+ }
+ g_currentMemberDef=md;
+ ol.writeLineNumber(md->getReference(),
+ md->getOutputFileBase(),
+ md->anchor(),
+ line);
+ }
+ else // link to compound
+ {
+ g_currentMemberDef=0;
+ ol.writeLineNumber(d->getReference(),
+ d->getOutputFileBase(),
+ d->anchor(),
+ line);
+ }
+ }
+ else // no link
+ {
+ ol.writeLineNumber(0,0,0,line);
+ }
+
+ // set search page target
+ if (Doxygen::searchIndex)
+ {
+ QCString lineAnchor;
+ lineAnchor.sprintf("l%05d",line);
+ ol.setCurrentDoc(fd,lineAnchor,TRUE);
+ }
+
+ //printf("writeLineNumber(%d) g_searchForBody=%d\n",line,g_searchForBody);
+}
+
+static void codifyLines(CodeOutputInterface &ol,FileDef *fd,const char *text,
+ uint &line,uint &column,const char *fontClass=0)
+{
+ if (fontClass) ol.startFontClass(fontClass);
+ const char *p=text,*sp=p;
+ char c;
+ bool done=FALSE;
+ while (!done)
+ {
+ sp=p;
+ while ((c=*p++) && c!='\n') { column++; }
+ if (c=='\n')
+ {
+ line++;
+ int l = (int)(p-sp-1);
+ column=l+1;
+ char *tmp = (char*)malloc(l+1);
+ memcpy(tmp,sp,l);
+ tmp[l]='\0';
+ ol.codify(tmp);
+ free(tmp);
+ if (fontClass) ol.endFontClass();
+ ol.endCodeLine();
+ ol.startCodeLine(TRUE);
+ writeLineNumber(ol,fd,line);
+ if (fontClass) ol.startFontClass(fontClass);
+ }
+ else
+ {
+ ol.codify(sp);
+ done=TRUE;
+ }
+ }
+ if (fontClass) ol.endFontClass();
+}
+
+static void writeMultiLineCodeLink(CodeOutputInterface &ol,
+ FileDef *fd,uint &line,uint &column,
+ const char *ref,const char *file,
+ const char *anchor,const char *text,
+ const char *tooltip)
+{
+ bool done=FALSE;
+ char *p=(char *)text;
+ while (!done)
+ {
+ char *sp=p;
+ char c;
+ while ((c=*p++) && c!='\n') { column++; }
+ if (c=='\n')
+ {
+ line++;
+ *(p-1)='\0';
+ //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+ ol.endCodeLine();
+ ol.startCodeLine(TRUE);
+ writeLineNumber(ol,fd,line);
+ }
+ else
+ {
+ //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
+ ol.writeCodeLink(ref,file,anchor,sp,tooltip);
+ done=TRUE;
+ }
+ }
+}
+
+void ClangParser::linkInclude(CodeOutputInterface &ol,FileDef *fd,
+ uint &line,uint &column,const char *text)
+{
+ QCString incName = text;
+ incName = incName.mid(1,incName.length()-2); // strip ".." or <..>
+ FileDef *ifd=0;
+ if (!incName.isEmpty())
+ {
+ FileName *fn = Doxygen::inputNameDict->find(incName);
+ if (fn)
+ {
+ bool found=false;
+ FileNameIterator fni(*fn);
+ // for each include name
+ for (fni.toFirst();!found && (ifd=fni.current());++fni)
+ {
+ // see if this source file actually includes the file
+ found = fd->isIncluded(ifd->absFilePath());
+ //printf(" include file %s found=%d\n",ifd->absFilePath().data(),found);
+ }
+ }
+ }
+ if (ifd)
+ {
+ ol.writeCodeLink(ifd->getReference(),ifd->getOutputFileBase(),0,text,ifd->briefDescriptionAsTooltip());
+ }
+ else
+ {
+ codifyLines(ol,ifd,text,line,column,"preprocessor");
+ }
+}
+
+void ClangParser::linkMacro(CodeOutputInterface &ol,FileDef *fd,
+ uint &line,uint &column,const char *text)
+{
+ MemberName *mn=Doxygen::functionNameSDict->find(text);
+ if (mn)
+ {
+ MemberNameIterator mni(*mn);
+ MemberDef *md;
+ for (mni.toFirst();(md=mni.current());++mni)
+ {
+ if (md->isDefine())
+ {
+ writeMultiLineCodeLink(ol,
+ fd,line,column,
+ md->getReference(),
+ md->getOutputFileBase(),
+ md->anchor(),
+ text,
+ md->briefDescriptionAsTooltip()
+ );
+ return;
+ }
+ }
+ }
+ codifyLines(ol,fd,text,line,column);
+}
+
+
+void ClangParser::linkIdentifier(CodeOutputInterface &ol,FileDef *fd,
+ uint &line,uint &column,const char *text,int tokenIndex)
+{
+ CXCursor c = p->cursors[tokenIndex];
+ CXCursor r = clang_getCursorReferenced(c);
+ if (!clang_equalCursors(r, c))
+ {
+ c=r; // link to referenced location
+ }
+ CXCursor t = clang_getSpecializedCursorTemplate(c);
+ if (!clang_Cursor_isNull(t) && !clang_equalCursors(t,c))
+ {
+ c=t; // link to template
+ }
+ CXString usr = clang_getCursorUSR(c);
+ const char *usrStr = clang_getCString(usr);
+
+ Definition *d = usrStr ? Doxygen::clangUsrMap->find(usrStr) : 0;
+ //CXCursorKind kind = clang_getCursorKind(c);
+ //if (d==0)
+ //{
+ // printf("didn't find definition for '%s' usr='%s' kind=%d\n",
+ // text,usrStr,kind);
+ //}
+ //else
+ //{
+ // printf("found definition for '%s' usr='%s' name='%s'\n",
+ // text,usrStr,d->name().data());
+ //}
+ if (d && d->isLinkable())
+ {
+ if (g_insideBody &&
+ g_currentMemberDef && d->definitionType()==Definition::TypeMember &&
+ (g_currentMemberDef!=d || g_currentLine<line)) // avoid self-reference
+ {
+ addDocCrossReference(g_currentMemberDef,(MemberDef*)d);
+ }
+ writeMultiLineCodeLink(ol,
+ fd,line,column,
+ d->getReference(),
+ d->getOutputFileBase(),
+ d->anchor(),
+ text,
+ d->briefDescriptionAsTooltip()
+ );
+ }
+ else
+ {
+ codifyLines(ol,fd,text,line,column);
+ }
+ clang_disposeString(usr);
+}
+
+static void detectFunctionBody(const char *s)
+{
+ //printf("punct=%s g_searchForBody=%d g_insideBody=%d g_bracketCount=%d\n",
+ // s,g_searchForBody,g_insideBody,g_bracketCount);
+
+ if (g_searchForBody && (qstrcmp(s,":")==0 || qstrcmp(s,"{")==0)) // start of 'body' (: is for constructor)
+ {
+ g_searchForBody=FALSE;
+ g_insideBody=TRUE;
+ }
+ else if (g_searchForBody && qstrcmp(s,";")==0) // declaration only
+ {
+ g_searchForBody=FALSE;
+ g_insideBody=FALSE;
+ }
+ if (g_insideBody && qstrcmp(s,"{")==0) // increase scoping level
+ {
+ g_bracketCount++;
+ }
+ if (g_insideBody && qstrcmp(s,"}")==0) // decrease scoping level
+ {
+ g_bracketCount--;
+ if (g_bracketCount<=0) // got outside of function body
+ {
+ g_insideBody=FALSE;
+ g_bracketCount=0;
+ }
+ }
+}
+
+void ClangParser::writeSources(CodeOutputInterface &ol,FileDef *fd)
+{
+ // (re)set global parser state
+ g_currentDefinition=0;
+ g_currentMemberDef=0;
+ g_currentLine=0;
+ g_searchForBody=FALSE;
+ g_insideBody=FALSE;
+ g_bracketCount=0;
+
+ unsigned int line=1,column=1;
+ QCString lineNumber,lineAnchor;
+ ol.startCodeLine(TRUE);
+ writeLineNumber(ol,fd,line);
+ for (unsigned int i=0;i<p->numTokens;i++)
+ {
+ CXSourceLocation start = clang_getTokenLocation(p->tu, p->tokens[i]);
+ unsigned int l, c;
+ clang_getSpellingLocation(start, 0, &l, &c, 0);
+ if (l > line) column = 1;
+ while (line<l)
+ {
+ line++;
+ ol.endCodeLine();
+ ol.startCodeLine(TRUE);
+ writeLineNumber(ol,fd,line);
+ }
+ while (column<c) { ol.codify(" "); column++; }
+ CXString tokenString = clang_getTokenSpelling(p->tu, p->tokens[i]);
+ char const *s = clang_getCString(tokenString);
+ CXCursorKind cursorKind = clang_getCursorKind(p->cursors[i]);
+ CXTokenKind tokenKind = clang_getTokenKind(p->tokens[i]);
+ //printf("%d:%d %s cursorKind=%d tokenKind=%d\n",line,column,s,cursorKind,tokenKind);
+ switch (tokenKind)
+ {
+ case CXToken_Keyword:
+ if (strcmp(s,"operator")==0)
+ {
+ linkIdentifier(ol,fd,line,column,s,i);
+ }
+ else
+ {
+ codifyLines(ol,fd,s,line,column,
+ cursorKind==CXCursor_PreprocessingDirective ? "preprocessor" :
+ keywordToType(s));
+ }
+ break;
+ case CXToken_Literal:
+ if (cursorKind==CXCursor_InclusionDirective)
+ {
+ linkInclude(ol,fd,line,column,s);
+ }
+ else if (s[0]=='"' || s[0]=='\'')
+ {
+ codifyLines(ol,fd,s,line,column,"stringliteral");
+ }
+ else
+ {
+ codifyLines(ol,fd,s,line,column);
+ }
+ break;
+ case CXToken_Comment:
+ codifyLines(ol,fd,s,line,column,"comment");
+ break;
+ default: // CXToken_Punctuation or CXToken_Identifier
+ if (tokenKind==CXToken_Punctuation)
+ {
+ detectFunctionBody(s);
+ //printf("punct %s: %d\n",s,cursorKind);
+ }
+ switch (cursorKind)
+ {
+ case CXCursor_PreprocessingDirective:
+ codifyLines(ol,fd,s,line,column,"preprocessor");
+ break;
+ case CXCursor_MacroDefinition:
+ codifyLines(ol,fd,s,line,column,"preprocessor");
+ break;
+ case CXCursor_InclusionDirective:
+ linkInclude(ol,fd,line,column,s);
+ break;
+ case CXCursor_MacroExpansion:
+ linkMacro(ol,fd,line,column,s);
+ break;
+ default:
+ if (tokenKind==CXToken_Identifier ||
+ (tokenKind==CXToken_Punctuation && // for operators
+ (cursorKind==CXCursor_DeclRefExpr ||
+ cursorKind==CXCursor_MemberRefExpr ||
+ cursorKind==CXCursor_CallExpr ||
+ cursorKind==CXCursor_ObjCMessageExpr)
+ )
+ )
+ {
+ linkIdentifier(ol,fd,line,column,s,i);
+ if (Doxygen::searchIndex)
+ {
+ ol.addWord(s,FALSE);
+ }
+ }
+ else
+ {
+ codifyLines(ol,fd,s,line,column);
+ }
+ break;
+ }
+ }
+ clang_disposeString(tokenString);
+ }
+ ol.endCodeLine();
+}
+
+ClangParser::ClangParser()
+{
+ p = new Private;
+}
+
+ClangParser::~ClangParser()
+{
+ delete p;
+}
+
+//--------------------------------------------------------------------------
+#else // use stubbed functionality in case libclang support is disabled.
+
+void ClangParser::start(const char *,QStrList &)
+{
+}
+
+void ClangParser::switchToFile(const char *)
+{
+}
+
+void ClangParser::finish()
+{
+}
+
+QCString ClangParser::lookup(uint,const char *)
+{
+ return "";
+}
+
+void ClangParser::writeSources(CodeOutputInterface &,FileDef *)
+{
+}
+
+ClangParser::ClangParser()
+{
+}
+
+ClangParser::~ClangParser()
+{
+}
+
+
+#endif
+//--------------------------------------------------------------------------
+
diff --git a/src/clangparser.h b/src/clangparser.h
new file mode 100644
index 0000000..214ea50
--- /dev/null
+++ b/src/clangparser.h
@@ -0,0 +1,67 @@
+#ifndef CLANGPARSER_H
+#define CLANGPARSER_H
+
+#include <qcstring.h>
+#include <qstrlist.h>
+
+class CodeOutputInterface;
+class FileDef;
+
+/** @brief Wrapper for to let libclang assisted parsing. */
+class ClangParser
+{
+ public:
+ /** Returns the one and only instance of the class */
+ static ClangParser *instance();
+
+ /** Start parsing a file.
+ * @param[in] fileName The name of the file to parse.
+ * @param[in,out] filesInTanslationUnit Other files that are
+ * part of the input and included by the file.
+ * The function will return a subset of the files,
+ * only including the onces that were actually found
+ * during parsing.
+ */
+ void start(const char *fileName,QStrList &filesInTranslationUnit);
+
+ /** Switches to another file within the translation unit started
+ * with start().
+ * @param[in] The name of the file to switch to.
+ */
+ void switchToFile(const char *fileName);
+
+ /** Finishes parsing a translation unit. Free any resources that
+ * were needed for parsing.
+ */
+ void finish();
+
+ /** Looks for \a symbol which should be found at \a line and
+ * returns a clang unique reference to the symbol.
+ */
+ QCString lookup(uint line,const char *symbol);
+
+ /** writes the syntax highlighted source code for a file
+ * @param[out] ol The output generator list to write to.
+ * @param[in] fd The file to write sources for.
+ */
+ void writeSources(CodeOutputInterface &ol,FileDef *fd);
+
+ private:
+ void linkIdentifier(CodeOutputInterface &ol,FileDef *fd,
+ uint &line,uint &column,
+ const char *text,int tokenIndex);
+ void linkMacro(CodeOutputInterface &ol,FileDef *fd,
+ uint &line,uint &column,
+ const char *text);
+ void linkInclude(CodeOutputInterface &ol,FileDef *fd,
+ uint &line,uint &column,
+ const char *text);
+ void determineInputFilesInSameTu(QStrList &filesInTranslationUnit);
+ class Private;
+ Private *p;
+ ClangParser();
+ virtual ~ClangParser();
+ static ClangParser *s_instance;
+};
+
+#endif
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 8517893..1429fdd 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -187,7 +187,7 @@ class ClassDefImpl
bool isGeneric;
- int spec;
+ uint64 spec;
};
void ClassDefImpl::init(const char *defFileName, const char *name,
@@ -277,11 +277,11 @@ ClassDefImpl::~ClassDefImpl()
// constructs a new class definition
ClassDef::ClassDef(
- const char *defFileName,int defLine,
+ const char *defFileName,int defLine,int defColumn,
const char *nm,CompoundType ct,
const char *lref,const char *fName,
bool isSymbol,bool isJavaEnum)
- : Definition(defFileName,defLine,removeRedundantWhiteSpace(nm),0,0,isSymbol)
+ : Definition(defFileName,defLine,defColumn,removeRedundantWhiteSpace(nm),0,0,isSymbol)
{
visited=FALSE;
setReference(lref);
@@ -435,6 +435,12 @@ void ClassDef::internalInsertMember(MemberDef *md,
{
switch (md->memberType())
{
+ case MemberType_Service: // UNO IDL
+ addMemberToList(MemberListType_services,md,TRUE);
+ break;
+ case MemberType_Interface: // UNO IDL
+ addMemberToList(MemberListType_interfaces,md,TRUE);
+ break;
case MemberType_Signal: // Qt specific
addMemberToList(MemberListType_signals,md,TRUE);
break;
@@ -535,6 +541,7 @@ void ClassDef::internalInsertMember(MemberDef *md,
break;
case Public:
addMemberToList(MemberListType_pubTypes,md,TRUE);
+ isSimple=QCString(md->typeString()).find(")(")==-1;
break;
case Private:
addMemberToList(MemberListType_priTypes,md,TRUE);
@@ -580,6 +587,12 @@ void ClassDef::internalInsertMember(MemberDef *md,
{
switch (md->memberType())
{
+ case MemberType_Service: // UNO IDL
+ addMemberToList(MemberListType_serviceMembers,md,FALSE);
+ break;
+ case MemberType_Interface: // UNO IDL
+ addMemberToList(MemberListType_interfaceMembers,md,FALSE);
+ break;
case MemberType_Property:
addMemberToList(MemberListType_propertyMembers,md,FALSE);
break;
@@ -908,8 +921,8 @@ void ClassDef::writeBriefDescription(OutputList &ol,bool exampleFlag)
if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
ol.startParagraph();
- ol.parseDoc(briefFile(),briefLine(),this,0,
- briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),this,0,
+ briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
ol.pushGeneratorState();
ol.disable(OutputGenerator::RTF);
ol.writeString(" \n");
@@ -943,7 +956,7 @@ void ClassDef::writeDetailedDocumentationBody(OutputList &ol)
// repeat brief description
if (!briefDescription().isEmpty() && repeatBrief)
{
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
}
if (!briefDescription().isEmpty() && repeatBrief &&
!documentation().isEmpty())
@@ -956,7 +969,7 @@ void ClassDef::writeDetailedDocumentationBody(OutputList &ol)
// write documentation
if (!documentation().isEmpty())
{
- ol.parseDoc(docFile(),docLine(),this,0,documentation(),TRUE,FALSE);
+ ol.generateDoc(docFile(),docLine(),this,0,documentation(),TRUE,FALSE);
}
// write type constraints
writeTypeConstraints(ol,this,m_impl->typeConstraints);
@@ -1034,6 +1047,14 @@ void ClassDef::showUsedFiles(OutputList &ol)
{
ol.parseText(theTranslator->trEnumGeneratedFromFiles(m_impl->files.count()==1));
}
+ else if (m_impl->compType==Service)
+ {
+ ol.parseText(theTranslator->trServiceGeneratedFromFiles(m_impl->files.count()==1));
+ }
+ else if (m_impl->compType==Singleton)
+ {
+ ol.parseText(theTranslator->trSingletonGeneratedFromFiles(m_impl->files.count()==1));
+ }
else
{
ol.parseText(theTranslator->trGeneratedFromFiles(
@@ -1228,7 +1249,7 @@ void ClassDef::writeInheritanceGraph(OutputList &ol)
}
else
{
- err("error: invalid marker %d in inherits list!\n",entryIndex);
+ err("invalid marker %d in inherits list!\n",entryIndex);
}
index=newIndex+matchLen;
}
@@ -1537,6 +1558,11 @@ void ClassDef::writeTagFileMarker()
{
Doxygen::tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>" << endl;
}
+ QCString idStr = id();
+ if (!idStr.isEmpty())
+ {
+ Doxygen::tagFile << " <clangid>" << convertToXML(idStr) << "</clangid>" << endl;
+ }
if (m_impl->tempArgs)
{
ArgumentListIterator ali(*m_impl->tempArgs);
@@ -1791,14 +1817,19 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade
// add the brief description if available
if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
- ol.startMemberDescription(anchor());
- ol.parseDoc(briefFile(),briefLine(),this,0,
- briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
- if (isLinkableInProject())
+ DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
+ briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
+ if (rootNode && !rootNode->isEmpty())
{
- writeMoreLink(ol,anchor());
+ ol.startMemberDescription(anchor());
+ ol.writeDoc(rootNode,this,0);
+ if (isLinkableInProject())
+ {
+ writeMoreLink(ol,anchor());
+ }
+ ol.endMemberDescription();
}
- ol.endMemberDescription();
+ delete rootNode;
}
ol.endMemberDeclaration(anchor(),0);
}
@@ -1810,6 +1841,7 @@ void ClassDef::addClassAttributes(OutputList &ol)
if (isFinal()) sl.append("final");
if (isSealed()) sl.append("sealed");
if (isAbstract()) sl.append("abstract");
+ if (getLanguage()==SrcLangExt_IDL && isPublished()) sl.append("published");
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
@@ -1922,10 +1954,12 @@ void ClassDef::writeDocumentationContents(OutputList &ol,const QCString & /*page
writeAuthorSection(ol);
break;
case LayoutDocEntry::NamespaceNestedNamespaces:
+ case LayoutDocEntry::NamespaceNestedConstantGroups:
case LayoutDocEntry::NamespaceClasses:
case LayoutDocEntry::NamespaceInlineClasses:
case LayoutDocEntry::FileClasses:
case LayoutDocEntry::FileNamespaces:
+ case LayoutDocEntry::FileConstantGroups:
case LayoutDocEntry::FileIncludes:
case LayoutDocEntry::FileIncludeGraph:
case LayoutDocEntry::FileIncludedByGraph:
@@ -1979,6 +2013,14 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
pageTitle = theTranslator->trEnumReference(displayName());
}
+ else if (m_impl->compType==Service)
+ {
+ pageTitle = theTranslator->trServiceReference(displayName());
+ }
+ else if (m_impl->compType==Singleton)
+ {
+ pageTitle = theTranslator->trSingletonReference(displayName());
+ }
else
{
pageTitle = theTranslator->trCompoundReference(displayName(),
@@ -2206,7 +2248,7 @@ void ClassDef::writeMemberList(OutputList &ol)
ol.parseText(" "+theTranslator->trEnumValue());
else if (md->isTypedef())
ol.docify(" typedef");
- else if (md->isFriend() && !strcmp(md->typeString(),"friend class"))
+ else if (md->isFriend() && !qstrcmp(md->typeString(),"friend class"))
ol.docify(" class");
//ol.writeString("\n");
}
@@ -2287,6 +2329,8 @@ void ClassDef::writeMemberList(OutputList &ol)
md->isFriend() || md->isRelated() || md->isExplicit() ||
md->isMutable() || (md->isInline() && Config_getBool("INLINE_INFO")) ||
md->isSignal() || md->isSlot() ||
+ (getLanguage()==SrcLangExt_IDL &&
+ (md->isOptional() || md->isAttribute() || md->isUNOProperty())) ||
md->isStatic() || lang==SrcLangExt_VHDL
)
&& memberWritten)
@@ -2314,6 +2358,18 @@ void ClassDef::writeMemberList(OutputList &ol)
if (md->isStatic()) sl.append("static");
if (md->isSignal()) sl.append("signal");
if (md->isSlot()) sl.append("slot");
+// this is the extra member page
+ if (md->isOptional()) sl.append("optional");
+ if (md->isAttribute()) sl.append("attribute");
+ if (md->isUNOProperty()) sl.append("property");
+ if (md->isReadonly()) sl.append("readonly");
+ if (md->isBound()) sl.append("bound");
+ if (md->isRemovable()) sl.append("removable");
+ if (md->isConstrained()) sl.append("constrained");
+ if (md->isTransient()) sl.append("transient");
+ if (md->isMaybeVoid()) sl.append("maybevoid");
+ if (md->isMaybeDefault()) sl.append("maybedefault");
+ if (md->isMaybeAmbiguous())sl.append("maybeambiguous");
}
const char *s=sl.first();
while (s)
@@ -2574,8 +2630,7 @@ bool ClassDef::isBaseClass(ClassDef *bcd, bool followInstances,int level)
//printf("isBaseClass(cd=%s) looking for %s\n",name().data(),bcd->name().data());
if (level>256)
{
- err("Possible recursive class relation while inside %s and looking for %s\n",qPrint(name()),qPrint(bcd->name()));
- abort();
+ err("Possible recursive class relation while inside %s and looking for base class %s\n",qPrint(name()),qPrint(bcd->name()));
return FALSE;
}
if (baseClasses())
@@ -2597,6 +2652,31 @@ bool ClassDef::isBaseClass(ClassDef *bcd, bool followInstances,int level)
return found;
}
+//----------------------------------------------------------------------
+
+bool ClassDef::isSubClass(ClassDef *cd,int level)
+{
+ bool found=FALSE;
+ if (level>256)
+ {
+ err("Possible recursive class relation while inside %s and looking for derived class %s\n",qPrint(name()),qPrint(cd->name()));
+ return FALSE;
+ }
+ if (subClasses())
+ {
+ BaseClassListIterator bcli(*subClasses());
+ for ( ; bcli.current() && !found ; ++bcli)
+ {
+ ClassDef *ccd=bcli.current()->classDef;
+ if (ccd==cd)
+ found=TRUE;
+ else
+ found=ccd->isSubClass(cd,level+1);
+ }
+ }
+ return found;
+}
+
//----------------------------------------------------------------------------
static bool isStandardFunc(MemberDef *md)
@@ -2674,11 +2754,11 @@ void ClassDef::mergeMembers()
if (srcCd==dstCd || dstCd->isBaseClass(srcCd,TRUE))
// member is in the same or a base class
{
- LockingPtr<ArgumentList> srcAl = srcMd->argumentList();
- LockingPtr<ArgumentList> dstAl = dstMd->argumentList();
+ ArgumentList *srcAl = srcMd->argumentList();
+ ArgumentList *dstAl = dstMd->argumentList();
found=matchArguments2(
- srcMd->getOuterScope(),srcMd->getFileDef(),srcAl.pointer(),
- dstMd->getOuterScope(),dstMd->getFileDef(),dstAl.pointer(),
+ srcMd->getOuterScope(),srcMd->getFileDef(),srcAl,
+ dstMd->getOuterScope(),dstMd->getFileDef(),dstAl,
TRUE
);
//printf(" Yes, matching (%s<->%s): %d\n",
@@ -3134,7 +3214,7 @@ void ClassDef::determineImplUsageRelation()
cd=getResolvedClass(getNamespaceDef()->name()+"::"+usedClassName,0,&templSpec);
}
if (cd==0) cd=getResolvedClass(name()+"::"+usedClassName,0,&templSpec);
- if (cd==0) cd=getResolvedClass(usedClassName,0,&templSpec); // TODO: also try inbetween scopes!
+ if (cd==0) cd=getResolvedClass(usedClassName,0,&templSpec); // TODO: also try in-between scopes!
//printf("Search for class %s result=%p\n",usedClassName.data(),cd);
if (cd) // class exists
{
@@ -3196,7 +3276,7 @@ void ClassDef::addUsedInterfaceClasses(MemberDef *md,const char *typeStr)
while ((i=re.match(type,p,&l))!=-1) // for each class name in the type
{
ClassDef *cd=getClass(name()+"::"+type.mid(i,l));
- if (cd==0) cd=getClass(type.mid(i,l)); // TODO: also try inbetween scopes!
+ if (cd==0) cd=getClass(type.mid(i,l)); // TODO: also try in-between scopes!
if (cd && cd!=this && !isBaseClass(cd))
{
if (m_impl->usesIntfClassDict==0)
@@ -3292,6 +3372,8 @@ QCString ClassDef::compoundTypeString() const
case Protocol: return "protocol";
case Category: return "category";
case Exception: return "exception";
+ case Service: return "service";
+ case Singleton: return "singleton";
default: return "unknown";
}
}
@@ -3467,7 +3549,7 @@ Definition *ClassDef::findInnerCompound(const char *name)
//}
ClassDef *ClassDef::insertTemplateInstance(const QCString &fileName,
- int startLine, const QCString &templSpec,bool &freshInstance)
+ int startLine, int startColumn, const QCString &templSpec,bool &freshInstance)
{
freshInstance = FALSE;
if (m_impl->templateInstances==0)
@@ -3478,8 +3560,9 @@ ClassDef *ClassDef::insertTemplateInstance(const QCString &fileName,
if (templateClass==0)
{
Debug::print(Debug::Classes,0," New template instance class `%s'`%s'\n",name().data(),templSpec.data());
+ QCString tcname = removeRedundantWhiteSpace(localName()+templSpec);
templateClass = new ClassDef(
- fileName,startLine,localName()+templSpec,ClassDef::Class);
+ fileName,startLine,startColumn,tcname,ClassDef::Class);
templateClass->setTemplateMaster(this);
templateClass->setOuterScope(getOuterScope());
templateClass->setHidden(isHidden());
@@ -3500,7 +3583,8 @@ ClassDef *ClassDef::getVariableInstance(const char *templSpec)
if (templateClass==0)
{
Debug::print(Debug::Classes,0," New template variable instance class `%s'`%s'\n",qPrint(name()),qPrint(templSpec));
- templateClass = new ClassDef("<code>",1,name()+templSpec,
+ QCString tcname = removeRedundantWhiteSpace(name()+templSpec);
+ templateClass = new ClassDef("<code>",1,1,tcname,
ClassDef::Class,0,0,FALSE);
templateClass->addMembersToTemplateInstance( this, templSpec );
templateClass->setTemplateMaster(this);
@@ -3698,8 +3782,8 @@ void ClassDef::addListReferences()
if (!isLinkableInProject()) return;
//printf("ClassDef(%s)::addListReferences()\n",name().data());
{
- LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
- addRefItem(xrefItems.pointer(),
+ QList<ListItemInfo> *xrefItems = xrefListItems();
+ addRefItem(xrefItems,
qualifiedName(),
lang==SrcLangExt_Fortran ? theTranslator->trType(TRUE,TRUE)
: theTranslator->trClass(TRUE,TRUE),
@@ -4139,13 +4223,13 @@ void ClassDef::writeMemberDeclarations(OutputList &ol,MemberListType lt,const QC
//static bool optimizeVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
if (ml)
{
- ml->writeDeclarations(ol,this,0,0,0,title,subTitle,FALSE,showInline,inheritedFrom);
+ ml->writeDeclarations(ol,this,0,0,0,title,subTitle,definitionType(),FALSE,showInline,inheritedFrom);
if (lt2!=-1)
{
MemberList * ml2 = getMemberList((MemberListType)lt2);
if (ml2)
{
- ml2->writeDeclarations(ol,this,0,0,0,0,0,FALSE,showInline,inheritedFrom);
+ ml2->writeDeclarations(ol,this,0,0,0,0,0,definitionType(),FALSE,showInline,inheritedFrom);
}
}
}
@@ -4201,7 +4285,7 @@ void ClassDef::writePlainMemberDeclaration(OutputList &ol,
if (ml)
{
ml->setInGroup(inGroup);
- ml->writePlainDeclarations(ol,this,0,0,0,inheritedFrom,inheritId);
+ ml->writePlainDeclarations(ol,this,0,0,0,definitionType(),inheritedFrom,inheritId);
}
}
@@ -4310,6 +4394,11 @@ bool ClassDef::isSealed() const
return m_impl->spec&Entry::Sealed;
}
+bool ClassDef::isPublished() const
+{
+ return m_impl->spec&Entry::Published;
+}
+
bool ClassDef::isObjectiveC() const
{
return getLanguage()==SrcLangExt_ObjC;
@@ -4510,7 +4599,7 @@ bool ClassDef::isGeneric() const
return m_impl->isGeneric;
}
-void ClassDef::setClassSpecifier(int spec)
+void ClassDef::setClassSpecifier(uint64 spec)
{
m_impl->spec = spec;
}
diff --git a/src/classdef.h b/src/classdef.h
index 1525dfd..f4d5962 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -48,7 +48,8 @@ class ArgumentList;
/** A class representing of a compound symbol.
*
- * A compound can be a class, struct, union, interface, or exception.
+ * A compound can be a class, struct, union, interface, service, singleton,
+ * or exception.
* \note This class should be renamed to CompoundDef
*/
class ClassDef : public Definition
@@ -61,7 +62,9 @@ class ClassDef : public Definition
Interface, //=Entry::INTERFACE_SEC,
Protocol, //=Entry::PROTOCOL_SEC,
Category, //=Entry::CATEGORY_SEC,
- Exception //=Entry::EXCEPTION_SEC
+ Exception, //=Entry::EXCEPTION_SEC
+ Service, //=Entry::CLASS_SEC
+ Singleton, //=Entry::CLASS_SEC
};
/** Creates a new compound definition.
@@ -69,7 +72,10 @@ class ClassDef : public Definition
* found.
* \param startLine line number where the definition of this compound
* starts.
+ * \param startColumn column number where the definition of this compound
+ * starts.
* \param name the name of this compound (including scope)
+ * \param symId unique Id for this symbol
* \param ct the kind of Compound
* \param ref the tag file from which this compound is extracted
* or 0 if the compound doesn't come from a tag file
@@ -82,7 +88,7 @@ class ClassDef : public Definition
* I didn't add this to CompoundType to avoid having
* to adapt all translators.
*/
- ClassDef(const char *fileName,int startLine,
+ ClassDef(const char *fileName,int startLine,int startColumn,
const char *name,CompoundType ct,
const char *ref=0,const char *fName=0,
bool isSymbol=TRUE,bool isJavaEnum=FALSE);
@@ -185,6 +191,11 @@ class ClassDef : public Definition
*/
bool isBaseClass(ClassDef *bcd,bool followInstances,int level=0);
+ /** Returns TRUE iff \a bcd is a direct or indirect sub class of this
+ * class.
+ */
+ bool isSubClass(ClassDef *bcd,int level=0);
+
/** returns TRUE iff \a md is a member of this class or of the
* the public/protected members of a base class
*/
@@ -248,6 +259,9 @@ class ClassDef : public Definition
/** Returns TRUE if this class is marked as sealed */
bool isSealed() const;
+ /** Returns TRUE if this class is marked as published */
+ bool isPublished() const;
+
/** Returns TRUE if this class represents an Objective-C 2.0 extension (nameless category) */
bool isExtension() const;
@@ -305,14 +319,14 @@ class ClassDef : public Definition
void setProtection(Protection p);
void setGroupDefForAllMembers(GroupDef *g,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs);
void addInnerCompound(Definition *d);
- ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,
+ ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,int startColumn,
const QCString &templSpec,bool &freshInstance);
void addUsedClass(ClassDef *cd,const char *accessName,Protection prot);
void addUsedByClass(ClassDef *cd,const char *accessName,Protection prot);
void setIsStatic(bool b);
void setCompoundType(CompoundType t);
void setClassName(const char *name);
- void setClassSpecifier(int spec);
+ void setClassSpecifier(uint64 spec);
void setTemplateArguments(ArgumentList *al);
void setTemplateBaseClassNames(QDict<int> *templateNames);
@@ -501,7 +515,7 @@ class BaseClassList : public QList<BaseClassDef>
if (c1==0 || c2==0)
return FALSE;
else
- return stricmp(c1->name(),c2->name());
+ return qstricmp(c1->name(),c2->name());
}
};
diff --git a/src/classlist.cpp b/src/classlist.cpp
index fec1cb8..da5bf5a 100644
--- a/src/classlist.cpp
+++ b/src/classlist.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -41,12 +41,12 @@ static int compItems(void *item1,void *item2)
//printf("compItems: %d %s<->%s\n",b,c1->name().data(),c2->name().data());
if (b)
{
- return stricmp(c1->name(),
+ return qstricmp(c1->name(),
c2->name());
}
else
{
- return stricmp(c1->className(),
+ return qstricmp(c1->className(),
c2->className());
}
}
diff --git a/src/classlist.h b/src/classlist.h
index abe7064..adc781c 100644
--- a/src/classlist.h
+++ b/src/classlist.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp
index 767978c..f88f91e 100644
--- a/src/cmdmapper.cpp
+++ b/src/cmdmapper.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -129,6 +129,8 @@ CommandMap cmdMap[] =
{ "rtfonly", CMD_RTFONLY },
{ "endrtfonly", CMD_ENDRTFONLY },
{ "vhdlflow", CMD_VHDLFLOW },
+ { "docbookonly", CMD_DBONLY },
+ { "enddocbookonly",CMD_ENDDBONLY },
{ 0, 0 },
};
diff --git a/src/cmdmapper.h b/src/cmdmapper.h
index 968b017..c7b7c37 100644
--- a/src/cmdmapper.h
+++ b/src/cmdmapper.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -118,7 +118,9 @@ enum CommandType
CMD_RTFONLY = 88,
CMD_ENDRTFONLY = 89,
CMD_PIPE = 90,
- CMD_VHDLFLOW = 91
+ CMD_VHDLFLOW = 91,
+ CMD_DBONLY = 92,
+ CMD_ENDDBONLY = 93
};
enum HtmlTagType
diff --git a/src/code.h b/src/code.h
index 2c4d68a..3825ac1 100644
--- a/src/code.h
+++ b/src/code.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -21,6 +21,8 @@
class CodeOutputInterface;
class FileDef;
class MemberDef;
+class QCString;
+class Definition;
void parseCCode(CodeOutputInterface &,const char *,const QCString &,
bool ,const char *,FileDef *fd,
diff --git a/src/code.l b/src/code.l
index 8e11d59..01636fa 100644
--- a/src/code.l
+++ b/src/code.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -41,12 +41,12 @@
#include "filename.h"
#include "namespacedef.h"
-#define YY_NEVER_INTERACTIVE 1
-
// Toggle for some debugging info
//#define DBG_CTX(x) fprintf x
#define DBG_CTX(x) do { } while(0)
-
+
+#define YY_NEVER_INTERACTIVE 1
+
#define CLASSBLOCK (int *)4
#define SCOPEBLOCK (int *)8
#define INNERBLOCK (int *)12
@@ -68,6 +68,7 @@ static const char * g_inputString; //!< the code fragment as text
static int g_inputPosition; //!< read offset during parsing
static int g_inputLines; //!< number of line in the code fragment
static int g_yyLineNr; //!< current line number
+static int g_yyColNr; //!< current column number
static bool g_needsTermination;
static bool g_exampleBlock;
@@ -416,7 +417,7 @@ static void popScope()
}
else
{
- //err("Error: Too many end of scopes found!\n");
+ //err("Too many end of scopes found!\n");
}
//printf("popScope() result: `%s'\n",g_classScope.data());
}
@@ -491,7 +492,6 @@ static void startCodeLine()
{
g_currentDefinition = d;
g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
- //printf("->startCodeLine(%s)=%p\n",d->name().data(),g_currentMemberDef);
g_insideBody = FALSE;
g_searchingForBody = TRUE;
g_realScope = d->name();
@@ -525,6 +525,7 @@ static void startCodeLine()
g_code->writeLineNumber(0,0,0,g_yyLineNr);
}
}
+ DBG_CTX((stderr,"startCodeLine(%d)\n",g_yyLineNr));
g_code->startCodeLine(g_sourceFileDef && g_lineNumbers);
if (g_currentFontClass)
{
@@ -538,6 +539,7 @@ static void startFontClass(const char *s);
static void endCodeLine()
{
+ DBG_CTX((stderr,"endCodeLine(%d)\n",g_yyLineNr));
endFontClass();
g_code->endCodeLine();
}
@@ -565,10 +567,11 @@ static void codifyLines(const char *text)
while (!done)
{
sp=p;
- while ((c=*p++) && c!='\n') { }
+ while ((c=*p++) && c!='\n') { g_yyColNr++; }
if (c=='\n')
{
g_yyLineNr++;
+ g_yyColNr=1;
//*(p-1)='\0';
int l = (int)(p-sp-1);
char *tmp = (char*)malloc(l+1);
@@ -653,7 +656,7 @@ static void addUsingDirective(const char *name)
static void setParameterList(MemberDef *md)
{
g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
- LockingPtr<ArgumentList> al = md->argumentList();
+ ArgumentList *al = md->argumentList();
if (al==0) return;
Argument *a = al->first();
while (a)
@@ -702,7 +705,7 @@ static ClassDef *stripClassName(const char *s,Definition *d=g_currentDefinition)
static MemberDef *setCallContextForVar(const QCString &name)
{
if (name.isEmpty()) return 0;
- //fprintf(stderr,"setCallContextForVar(%s) g_classScope=%s\n",name.data(),g_classScope.data());
+ DBG_CTX((stderr,"setCallContextForVar(%s) g_classScope=%s\n",name.data(),g_classScope.data()));
int scopeEnd = name.findRev("::");
if (scopeEnd!=-1) // name with explicit scope
@@ -741,28 +744,28 @@ static MemberDef *setCallContextForVar(const QCString &name)
ClassDef *mcd = g_theVarContext.findVariable(name);
if (mcd) // local variable
{
- //fprintf(stderr,"local variable?\n");
+ DBG_CTX((stderr,"local variable?\n"));
if (mcd!=VariableContext::dummyContext)
{
- //fprintf(stderr,"local var `%s' mcd=%s\n",name.data(),mcd->name().data());
+ DBG_CTX((stderr,"local var `%s' mcd=%s\n",name.data(),mcd->name().data()));
g_theCallContext.setClass(mcd);
}
}
else
{
- //fprintf(stderr,"class member? scope=%s\n",g_classScope.data());
+ DBG_CTX((stderr,"class member? scope=%s\n",g_classScope.data()));
// look for a class member
mcd = getClass(g_classScope);
if (mcd)
{
- //fprintf(stderr,"Inside class %s\n",mcd->name().data());
+ DBG_CTX((stderr,"Inside class %s\n",mcd->name().data()));
MemberDef *md=mcd->getMemberByName(name);
if (md)
{
- //fprintf(stderr,"Found member %s\n",md->name().data());
+ DBG_CTX((stderr,"Found member %s\n",md->name().data()));
if (g_scopeStack.top()!=CLASSBLOCK)
{
- //fprintf(stderr,"class member `%s' mcd=%s\n",name.data(),mcd->name().data());
+ DBG_CTX((stderr,"class member `%s' mcd=%s\n",name.data(),mcd->name().data()));
g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope()));
}
return md;
@@ -828,50 +831,6 @@ static void updateCallContextForSmartPointer()
}
}
-static void addDocCrossReference(MemberDef *src,MemberDef *dst)
-{
- static bool referencedByRelation = Config_getBool("REFERENCED_BY_RELATION");
- static bool referencesRelation = Config_getBool("REFERENCES_RELATION");
- static bool callerGraph = Config_getBool("CALLER_GRAPH");
- static bool callGraph = Config_getBool("CALL_GRAPH");
-
- //printf("--> addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
- if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
- if ((referencedByRelation || callerGraph || dst->hasCallerGraph()) &&
- (src->isFunction() || src->isSlot())
- )
- {
- dst->addSourceReferencedBy(src);
- MemberDef *mdDef = dst->memberDefinition();
- if (mdDef)
- {
- mdDef->addSourceReferencedBy(src);
- }
- MemberDef *mdDecl = dst->memberDeclaration();
- if (mdDecl)
- {
- mdDecl->addSourceReferencedBy(src);
- }
- }
- if ((referencesRelation || callGraph || src->hasCallGraph()) &&
- (src->isFunction() || src->isSlot())
- )
- {
- src->addSourceReferences(dst);
- MemberDef *mdDef = src->memberDefinition();
- if (mdDef)
- {
- mdDef->addSourceReferences(dst);
- }
- MemberDef *mdDecl = src->memberDeclaration();
- if (mdDecl)
- {
- mdDecl->addSourceReferences(dst);
- }
- }
-
-}
-
static bool getLinkInScope(const QCString &c, // scope
const QCString &m, // member
const char *memberText, // exact text
@@ -885,7 +844,7 @@ static bool getLinkInScope(const QCString &c, // scope
FileDef *fd;
NamespaceDef *nd;
GroupDef *gd;
- //fprintf(stderr,"getLinkInScope: trying `%s'::`%s' varOnly=%d\n",c.data(),m.data(),varOnly);
+ DBG_CTX((stderr,"getLinkInScope: trying `%s'::`%s' varOnly=%d\n",c.data(),m.data(),varOnly));
if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef,FALSE,g_forceTagReference) &&
md->isLinkable() && (!varOnly || md->isVariable()))
{
@@ -919,8 +878,6 @@ static bool getLinkInScope(const QCString &c, // scope
}
//printf("d->getReference()=`%s' d->getOutputBase()=`%s' name=`%s' member name=`%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data());
- ol.linkableSymbol(g_yyLineNr,md->name(),md,
- g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(ol,md->getReference(),
md->getOutputFileBase(),
md->anchor(),
@@ -981,20 +938,20 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
Definition *d = g_currentDefinition;
//printf("d=%s g_sourceFileDef=%s\n",d?d->name().data():"<none>",g_sourceFileDef?g_sourceFileDef->name().data():"<none>");
cd = getResolvedClass(d,g_sourceFileDef,className,&md);
- //fprintf(stderr,"non-local variable name=%s context=%d cd=%s md=%s!\n",
- // className.data(),g_theVarContext.count(),cd?cd->name().data():"<none>",
- // md?md->name().data():"<none>");
+ DBG_CTX((stderr,"non-local variable name=%s context=%d cd=%s md=%s!\n",
+ className.data(),g_theVarContext.count(),cd?cd->name().data():"<none>",
+ md?md->name().data():"<none>"));
if (cd==0 && md==0 && (i=className.find('<'))!=-1)
{
QCString bareName = className.left(i); //stripTemplateSpecifiersFromScope(className);
- //fprintf(stderr,"bareName=%s\n",bareName.data());
+ DBG_CTX((stderr,"bareName=%s\n",bareName.data()));
if (bareName!=className)
{
cd=getResolvedClass(d,g_sourceFileDef,bareName,&md); // try unspecialized version
}
}
//printf("md=%s\n",md?md->name().data():"<none>");
- //fprintf(stderr,"is found as a type %s\n",cd?cd->name().data():"<null>");
+ DBG_CTX((stderr,"is found as a type %s\n",cd?cd->name().data():"<null>"));
if (cd==0 && md==0) // also see if it is variable or enum or enum value
{
if (getLink(g_classScope,clName,ol,clName,varOnly))
@@ -1020,11 +977,11 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
//}
}
isLocal=TRUE;
- //fprintf(stderr,"is a local variable cd=%p!\n",cd);
+ DBG_CTX((stderr,"is a local variable cd=%p!\n",cd));
}
if (cd && cd->isLinkable()) // is it a linkable class
{
- //fprintf(stderr,"is linkable class %s\n",clName);
+ DBG_CTX((stderr,"is linkable class %s\n",clName));
if (g_exampleBlock)
{
QCString anchor;
@@ -1037,8 +994,6 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
g_anchorCount++;
}
}
- ol.linkableSymbol(g_yyLineNr,cd->name(),cd,
- g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),clName,cd->briefDescriptionAsTooltip());
addToSearchIndex(className);
g_theCallContext.setClass(cd);
@@ -1055,7 +1010,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
}
else // not a class, maybe a global member
{
- //fprintf(stderr,"class %s not linkable! cd=%p md=%p typeOnly=%d\n",clName,cd,md,typeOnly);
+ DBG_CTX((stderr,"class %s not linkable! cd=%p md=%p typeOnly=%d\n",clName,cd,md,typeOnly));
if (!isLocal && (md!=0 || (cd==0 && !typeOnly))) // not a class, see if it is a global enum/variable/typedef.
{
if (md==0) // not found as a typedef
@@ -1064,10 +1019,10 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
//printf("setCallContextForVar(%s) md=%p g_currentDefinition=%p\n",clName,md,g_currentDefinition);
if (md && g_currentDefinition)
{
- //fprintf(stderr,"%s accessible from %s? %d md->getOuterScope=%s\n",
- // md->name().data(),g_currentDefinition->name().data(),
- // isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md),
- // md->getOuterScope()->name().data());
+ DBG_CTX((stderr,"%s accessible from %s? %d md->getOuterScope=%s\n",
+ md->name().data(),g_currentDefinition->name().data(),
+ isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md),
+ md->getOuterScope()->name().data()));
}
if (md && g_currentDefinition &&
@@ -1078,7 +1033,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
}
if (md && (!varOnly || md->isVariable()))
{
- //fprintf(stderr,"is a global md=%p g_currentDefinition=%s linkable=%d\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>",md->isLinkable());
+ DBG_CTX((stderr,"is a global md=%p g_currentDefinition=%s linkable=%d\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>",md->isLinkable()));
if (md->isLinkable())
{
QCString text;
@@ -1098,8 +1053,6 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
{
text=clName;
}
- ol.linkableSymbol(g_yyLineNr,md->name(),md,
- g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),text,md->briefDescriptionAsTooltip());
addToSearchIndex(clName);
if (g_currentMemberDef)
@@ -1112,9 +1065,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
}
// nothing found, just write out the word
- //fprintf(stderr,"not found!\n");
- ol.linkableSymbol(g_yyLineNr,clName,0,
- g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
+ DBG_CTX((stderr,"not found!\n"));
codifyLines(clName);
addToSearchIndex(clName);
}
@@ -1143,7 +1094,7 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const
}
ClassDef *typeClass = stripClassName(removeAnonymousScopes(xmd->typeString()),xmd->getOuterScope());
- //fprintf(stderr,"%s -> typeName=%p\n",xmd->typeString(),typeClass);
+ DBG_CTX((stderr,"%s -> typeName=%p\n",xmd->typeString(),typeClass));
g_theCallContext.setClass(typeClass);
Definition *xd = xmd->getOuterScope()==Doxygen::globalScope ?
@@ -1166,8 +1117,6 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const
}
// write the actual link
- ol.linkableSymbol(g_yyLineNr,xmd->name(),xmd,
- g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(ol,xmd->getReference(),
xmd->getOutputFileBase(),xmd->anchor(),memName,xmd->briefDescriptionAsTooltip());
addToSearchIndex(memName);
@@ -1287,8 +1236,6 @@ static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName,
}
}
// nothing found -> write result as is
- ol.linkableSymbol(g_yyLineNr,memName,0,
- g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
codifyLines(memName);
addToSearchIndex(memName);
return;
@@ -1315,7 +1262,7 @@ static void generateFunctionLink(CodeOutputInterface &ol,const char *funcName)
QCString funcWithScope=locFunc;
QCString funcWithFullScope=locFunc;
QCString fullScope=locScope;
- //fprintf(stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data());
+ DBG_CTX((stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data()));
int len=2;
int i=locFunc.findRev("::");
if (g_currentMemberDef && g_currentMemberDef->getClassDef() &&
@@ -1541,8 +1488,6 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
{
if (ctx->method && ctx->method->isLinkable())
{
- g_code->linkableSymbol(g_yyLineNr,ctx->method->name(),ctx->method,
- g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(*g_code,
ctx->method->getReference(),
ctx->method->getOutputFileBase(),
@@ -1556,8 +1501,6 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
}
else
{
- g_code->linkableSymbol(g_yyLineNr,pName->data(),0,
- g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
codifyLines(pName->data());
}
}
@@ -1629,8 +1572,6 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
}
else if (ctx->objectVar && ctx->objectVar->isLinkable()) // object is class variable
{
- g_code->linkableSymbol(g_yyLineNr,ctx->objectVar->name(),ctx->objectVar,
- g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(*g_code,
ctx->objectVar->getReference(),
ctx->objectVar->getOutputFileBase(),
@@ -1648,8 +1589,6 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
) // object is class name
{
ClassDef *cd = ctx->objectType;
- g_code->linkableSymbol(g_yyLineNr,cd->name(),cd,
- g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(*g_code,
cd->getReference(),
cd->getOutputFileBase(),
@@ -1664,8 +1603,6 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
if (cd && cd->isLinkable())
{
if (ctx->objectType==0) ctx->objectType=cd;
- g_code->linkableSymbol(g_yyLineNr,cd->name(),cd,
- g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(*g_code,
cd->getReference(),
cd->getOutputFileBase(),
@@ -1675,8 +1612,6 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
}
else
{
- g_code->linkableSymbol(g_yyLineNr,pObject->data(),0,
- g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
codifyLines(pObject->data());
}
}
@@ -1739,8 +1674,6 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
QCString *pWord = g_wordDict.find(refId);
if (pWord)
{
- g_code->linkableSymbol(g_yyLineNr,pWord->data(),0,
- g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
codifyLines(pWord->data());
}
}
@@ -1820,7 +1753,7 @@ TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID})
SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+
KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol"|"@optional"|"@required"|"@throw"|"@synthesize"|"@property")
-KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"set"|"sizeof"|"static"|"struct"|"__super"|"function"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|{KEYWORD_OBJC})
+KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"sizeof"|"static"|"struct"|"__super"|"function"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|"alignas"|"alignof"|{KEYWORD_OBJC})
FLOWKW ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"finally"|"for"|"foreach"|"for each"|"goto"|"if"|"return"|"switch"|"throw"|"throws"|"try"|"while"|"@try"|"@catch"|"@finally")
TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"object"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"size_t"|"boolean"|"id"|"SEL"|"string"|"nullptr")
CASTKW ("const_cast"|"dynamic_cast"|"reinterpret_cast"|"static_cast")
@@ -1849,6 +1782,8 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
%x MemberCall2
%x SkipInits
%x ClassName
+%x AlignAs
+%x AlignAsEnd
%x PackageName
%x ClassVar
%x CppCliTypeModifierFollowup
@@ -1975,8 +1910,6 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
BEGIN(ObjCParams);
}
<ObjCParams>{ID} {
- g_code->linkableSymbol(g_yyLineNr,yytext,0,
- g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
g_code->codify(yytext);
g_parmName=yytext;
g_theVarContext.addVariable(g_parmType,g_parmName);
@@ -2099,7 +2032,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
g_code->codify(yytext);
- //fprintf(stderr,"g_bodyCurlyCount=%d\n",g_bodyCurlyCount);
+ DBG_CTX((stderr,"g_bodyCurlyCount=%d\n",g_bodyCurlyCount));
if (--g_bodyCurlyCount<=0)
{
g_insideBody=FALSE;
@@ -2163,9 +2096,42 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
<ClassName>{ID}("::"{ID})* {
g_curClassName=yytext;
addType();
- generateClassOrGlobalLink(*g_code,yytext);
- BEGIN( ClassVar );
+ if (g_curClassName=="alignas")
+ {
+ startFontClass("keyword");
+ g_code->codify(yytext);
+ endFontClass();
+ BEGIN( AlignAs );
+ }
+ else
+ {
+ generateClassOrGlobalLink(*g_code,yytext);
+ BEGIN( ClassVar );
+ }
}
+<AlignAs>"(" {
+ g_bracketCount=1;
+ g_code->codify(yytext);
+ BEGIN( AlignAsEnd );
+ }
+<AlignAs>\n { g_yyLineNr++;
+ codifyLines(yytext);
+ }
+<AlignAs>. { g_code->codify(yytext); }
+<AlignAsEnd>"(" { g_code->codify(yytext);
+ g_bracketCount++;
+ }
+<AlignAsEnd>")" {
+ g_code->codify(yytext);
+ if (--g_bracketCount<=0)
+ {
+ BEGIN(ClassName);
+ }
+ }
+<AlignAsEnd>\n { g_yyLineNr++;
+ codifyLines(yytext);
+ }
+<AlignAsEnd>. { g_code->codify(yytext); }
<ClassName>{ID}("\\"{ID})* { // PHP namespace
g_curClassName=substitute(yytext,"\\","::");
g_scopeStack.push(CLASSBLOCK);
@@ -2200,7 +2166,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
BEGIN( Bases );
}
<ClassVar>("sealed"|"abstract")/{BN}*(":"|"{") {
- //fprintf(stderr,"***** C++/CLI modifier %s on g_curClassName=%s\n",yytext,g_curClassName.data());
+ DBG_CTX((stderr,"***** C++/CLI modifier %s on g_curClassName=%s\n",yytext,g_curClassName.data()));
startFontClass("keyword");
codifyLines(yytext);
endFontClass();
@@ -2241,11 +2207,11 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n"));
g_scopeStack.push(CLASSBLOCK);
pushScope(g_curClassName);
- //fprintf(stderr,"***** g_curClassName=%s\n",g_curClassName.data());
+ DBG_CTX((stderr,"***** g_curClassName=%s\n",g_curClassName.data()));
if (getResolvedClass(g_currentDefinition,g_sourceFileDef,g_curClassName)==0)
{
- //fprintf(stderr,"Adding new class %s\n",g_curClassName.data());
- ClassDef *ncd=new ClassDef("<code>",1,
+ DBG_CTX((stderr,"Adding new class %s\n",g_curClassName.data()));
+ ClassDef *ncd=new ClassDef("<code>",1,1,
g_curClassName,ClassDef::Class,0,0,FALSE);
g_codeClassSDict->append(g_curClassName,ncd);
// insert base classes.
@@ -2279,7 +2245,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
endFontClass();
}
<Bases>{SEP}?({ID}{SEP})*{ID} {
- //fprintf(stderr,"%s:addBase(%s)\n",g_curClassName.data(),yytext);
+ DBG_CTX((stderr,"%s:addBase(%s)\n",g_curClassName.data(),yytext));
g_curClassBases.inSort(yytext);
generateClassOrGlobalLink(*g_code,yytext);
}
@@ -2414,14 +2380,14 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
codifyLines(yytext);
endFontClass();
g_name.resize(0);g_type.resize(0);
- g_inForEachExpression = (strcmp(yytext,"for each")==0 || strcmp(yytext, "foreach")==0);
+ g_inForEachExpression = (qstrcmp(yytext,"for each")==0 || qstrcmp(yytext, "foreach")==0);
BEGIN(FuncCall);
}
<Body>{FLOWKW}/([^a-z_A-Z0-9]) {
startFontClass("keywordflow");
codifyLines(yytext);
endFontClass();
- if (g_inFunctionTryBlock && (strcmp(yytext,"catch")==0 || strcmp(yytext,"finally")==0))
+ if (g_inFunctionTryBlock && (qstrcmp(yytext,"catch")==0 || qstrcmp(yytext,"finally")==0))
{
g_inFunctionTryBlock=FALSE;
}
@@ -2671,8 +2637,6 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
{
if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext))
{
- g_code->linkableSymbol(g_yyLineNr,yytext,0,
- g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
g_code->codify(yytext);
addToSearchIndex(yytext);
}
@@ -2680,8 +2644,6 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
else
{
- g_code->linkableSymbol(g_yyLineNr,yytext,0,
- g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
g_code->codify(yytext);
addToSearchIndex(yytext);
g_name.resize(0);
@@ -2700,11 +2662,9 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
<MemberCall>{SCOPENAME}/{B}* {
if (g_theCallContext.getClass())
{
- //fprintf(stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getClass());
+ DBG_CTX((stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getClass()));
if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext))
{
- g_code->linkableSymbol(g_yyLineNr,yytext,0,
- g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
g_code->codify(yytext);
addToSearchIndex(yytext);
}
@@ -2712,7 +2672,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
else
{
- //fprintf(stderr,"no class context!\n");
+ DBG_CTX((stderr,"no class context!\n"));
g_code->codify(yytext);
addToSearchIndex(yytext);
g_name.resize(0);
@@ -2773,7 +2733,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
/*
<ObjCMemberCall>{ID} {
- if (strcmp(yytext,"self")==0 || strcmp(yytext,"super")==0)
+ if (qstrcmp(yytext,"self")==0 || qstrcmp(yytext,"super")==0)
{
// TODO: get proper base class for "super"
g_theCallContext.setClass(getClass(g_curClassName));
@@ -2944,10 +2904,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
}
<MemberCall2,FuncCall>{OPERATOR} { // operator
- if (strcmp(yytext,"*") &&
- strcmp(yytext,"&") &&
- strcmp(yytext,"^") &&
- strcmp(yytext,"%")) // typically a pointer or reference
+ if (qstrcmp(yytext,"*") &&
+ qstrcmp(yytext,"&") &&
+ qstrcmp(yytext,"^") &&
+ qstrcmp(yytext,"%")) // typically a pointer or reference
{
// not a * or &, or C++/CLI's ^ or %
g_parmType.resize(0);g_parmName.resize(0);
@@ -2991,7 +2951,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
if (*yytext==';') g_searchingForBody=FALSE;
if (!g_type.isEmpty())
{
- //fprintf(stderr,"add variable g_type=%s g_name=%s)\n",g_type.data(),g_name.data());
+ DBG_CTX((stderr,"add variable g_type=%s g_name=%s)\n",g_type.data(),g_name.data()));
g_theVarContext.addVariable(g_type,g_name);
}
g_parmType.resize(0);g_parmName.resize(0);
@@ -3025,7 +2985,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
//g_theCallContext.popScope();
g_parmType.resize(0);g_parmName.resize(0);
int index = g_name.findRev("::");
- //fprintf(stderr,"g_name=%s\n",g_name.data());
+ DBG_CTX((stderr,"g_name=%s\n",g_name.data()));
if (index!=-1)
{
QCString scope = g_name.left(index);
@@ -3345,7 +3305,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
if (Config_getBool("STRIP_CODE_COMMENTS"))
{
g_yyLineNr++;
- nextCodeLine();
+ //nextCodeLine();
}
else
{
@@ -3470,9 +3430,11 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
g_theCallContext.popScope();
}
<*>\n {
+ g_yyColNr++;
codifyLines(yytext);
}
<*>. {
+ g_yyColNr++;
g_code->codify(yytext);
}
/*
@@ -3632,6 +3594,7 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s,
if (g_needsTermination)
{
endFontClass();
+ DBG_CTX((stderr,"endCodeLine(%d)\n",g_yyLineNr));
g_code->endCodeLine();
}
if (cleanupSourceDef)
diff --git a/src/commentcnv.h b/src/commentcnv.h
index 5277524..1c1fcb9 100644
--- a/src/commentcnv.h
+++ b/src/commentcnv.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/commentcnv.l b/src/commentcnv.l
index 9d99830..6e7fa30 100644
--- a/src/commentcnv.l
+++ b/src/commentcnv.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -43,12 +43,6 @@
#define ADDCHAR(c) g_outBuf->addChar(c)
#define ADDARRAY(a,s) g_outBuf->addArray(a,s)
-enum GuardType
-{
- Guard_Cond,
- Guard_CondNot
-};
-
struct CondCtx
{
CondCtx(int line,QCString id,bool b)
@@ -85,9 +79,8 @@ static bool g_lastEscaped;
static int g_lastBlockContext;
static bool g_pythonDocString;
-static GuardType guardType; // kind of guard for conditional section
-
static SrcLangExt g_lang;
+static bool isFixedForm; // For Fortran
static void replaceCommentMarker(const char *s,int len)
{
@@ -180,22 +173,13 @@ static inline void copyToOutput(const char *s,int len)
static void startCondSection(const char *sectId)
{
+ //printf("startCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count());
CondParser prs;
bool expResult = prs.parse(g_fileName,g_lineNr,sectId);
g_condStack.push(new CondCtx(g_lineNr,sectId,g_skip));
- if (guardType == Guard_Cond) // found @cond
+ if (!expResult) // not enabled
{
- if (!expResult) // not enabled
- {
- g_skip=TRUE;
- }
- }
- else if (guardType == Guard_CondNot) // found @notcond
- {
- if (expResult) // enabled
- {
- g_skip=TRUE;
- }
+ g_skip=TRUE;
}
}
@@ -211,6 +195,7 @@ static void endCondSection()
CondCtx *ctx = g_condStack.pop();
g_skip=ctx->skip;
}
+ //printf("endCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count());
}
/** copies string \a s with length \a len to the output, while
@@ -270,8 +255,8 @@ void replaceComment(int offset);
BEGIN(CComment);
}
}
-<Scan>"!>"|"!<"|"!!" {
- if (g_lang!=SrcLangExt_Fortran)
+<Scan>![><!]/.*\n {
+ if (g_lang!=SrcLangExt_Fortran)
{
REJECT;
}
@@ -280,6 +265,52 @@ void replaceComment(int offset);
copyToOutput(yytext,(int)yyleng);
BEGIN(CComment);
}
+ }
+<Scan>[Cc\*][><!]/.*\n {
+ if (g_lang!=SrcLangExt_Fortran)
+ {
+ REJECT;
+ }
+ else
+ {
+ /* check for fixed format; we might have some conditional as part of multilene if like C<5 .and. & */
+ if (isFixedForm && (g_col == 0))
+ {
+ copyToOutput(yytext,(int)yyleng);
+ BEGIN(CComment);
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+ }
+<Scan>!.*\n {
+ if (g_lang!=SrcLangExt_Fortran)
+ {
+ REJECT;
+ }
+ else
+ {
+ copyToOutput(yytext,(int)yyleng);
+ }
+ }
+<Scan>[Cc\*].*\n {
+ if (g_lang!=SrcLangExt_Fortran)
+ {
+ REJECT;
+ }
+ else
+ {
+ if (g_col == 0)
+ {
+ copyToOutput(yytext,(int)yyleng);
+ }
+ else
+ {
+ REJECT;
+ }
+ }
}
<Scan>"\"" { /* start of a string */
copyToOutput(yytext,(int)yyleng);
@@ -294,7 +325,8 @@ void replaceComment(int offset);
<Scan>\n { /* new line */
copyToOutput(yytext,(int)yyleng);
}
-<Scan>("//!"|"///")/.*\n[ \t]*"//"[\/!][^\/] { /* start C++ style special comment block */
+<Scan>"//!"/.*\n[ \t]*"//"[\/!][^\/] | /* start C++ style special comment block */
+<Scan>("///"[/]*)/[^/].*\n[ \t]*"//"[\/!][^\/] { /* start C++ style special comment block */
if (g_mlBrief)
{
REJECT; // bail out if we do not need to convert
@@ -357,7 +389,7 @@ void replaceComment(int offset);
BEGIN(CComment);
}
}
-<Scan>"!>"|"!<"|"!!" {
+<Scan>![><!] {
if (g_lang!=SrcLangExt_Fortran)
{
REJECT;
@@ -396,16 +428,16 @@ void replaceComment(int offset);
g_lastCommentContext = YY_START;
BEGIN(Verbatim);
}
-<CComment,ReadLine>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly")/[^a-z_A-Z0-9] { /* start of a verbatim block */
+<CComment,ReadLine>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"rtfonly"|"manonly")/[^a-z_A-Z0-9] { /* start of a verbatim block */
copyToOutput(yytext,(int)yyleng);
g_blockName=&yytext[1];
g_lastCommentContext = YY_START;
BEGIN(Verbatim);
}
-<Scan>. { /* any other character */
+<Scan>. { /* any ather character */
copyToOutput(yytext,(int)yyleng);
}
-<Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"f$"|"f]"|"f}") { /* end of verbatim block */
+<Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"docbookonly"|"endrtfonly"|"endmanonly"|"f$"|"f]"|"f}") { /* end of verbatim block */
copyToOutput(yytext,(int)yyleng);
if (yytext[1]=='f') // end of formula
{
@@ -549,6 +581,11 @@ void replaceComment(int offset);
}
<CComment>\n { /* new line in comment */
copyToOutput(yytext,(int)yyleng);
+ /* in case of Fortran always end of comment */
+ if (g_lang==SrcLangExt_Fortran)
+ {
+ BEGIN(Scan);
+ }
}
<CComment>"*"+"/" { /* end of C comment */
if (g_lang==SrcLangExt_Python)
@@ -583,17 +620,6 @@ void replaceComment(int offset);
BEGIN(Scan);
}
}
-<CComment>"\n"/[ \t]*[^!] { /* end of Fortran comment */
- if (g_lang!=SrcLangExt_Fortran)
- {
- REJECT;
- }
- else
- {
- copyToOutput(yytext,(int)yyleng);
- BEGIN(Scan);
- }
- }
/* removed for bug 674842 (bug was introduced in rev 768)
<CComment>"'" {
g_charContext = YY_START;
@@ -679,7 +705,6 @@ void replaceComment(int offset);
}
<CComment,ReadLine>[\\@]"cond"[ \t]+ { // conditional section
g_condCtx = YY_START;
- guardType = Guard_Cond;
BEGIN(CondLine);
}
<CComment,ReadLine>[\\@]"endcond"/[^a-z_A-Z0-9] { // end of conditional section
@@ -727,7 +752,6 @@ void replaceComment(int offset);
<CondLine>[ \t]*
<CComment,ReadLine>[\\@]"cond"[ \t\r]*/\n |
<CondLine>. { // forgot section id?
- guardType = Guard_Cond;
if (YY_START!=CondLine) g_condCtx=YY_START;
bool oldSkip=g_skip;
startCondSection(" "); // fake section id causing the section to be hidden unconditionally
@@ -839,6 +863,45 @@ void replaceComment(int offset)
}
}
+// simplified way to know if this is fixed form
+// duplicate in fortrancode.l
+static bool recognizeFixedForm(const char* contents)
+{
+ int column=0;
+ bool skipLine=FALSE;
+
+ for(int i=0;;i++) {
+ column++;
+
+ switch(contents[i]) {
+ case '\n':
+ column=0;
+ skipLine=FALSE;
+ break;
+ case ' ':
+ break;
+ case '\000':
+ return FALSE;
+ case 'C':
+ case 'c':
+ case '*':
+ if(column==1) return TRUE;
+ if(skipLine) break;
+ return FALSE;
+ case '!':
+ if(column>1 && column<7) return FALSE;
+ skipLine=TRUE;
+ break;
+ default:
+ if(skipLine) break;
+ if(column==7) return TRUE;
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
+
/*! This function does three things:
* -# It converts multi-line C++ style comment blocks (that are aligned)
* to C style comment blocks (if MULTILINE_CPP_IS_BRIEF is set to NO).
@@ -860,6 +923,13 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
g_lineNr = 1;
g_condStack.clear();
g_condStack.setAutoDelete(TRUE);
+
+ isFixedForm = FALSE;
+ if (g_lang==SrcLangExt_Fortran)
+ {
+ isFixedForm = recognizeFixedForm(inBuf->data());
+ }
+
if (g_lang==SrcLangExt_Markdown)
{
BEGIN(CComment);
diff --git a/src/commentscan.h b/src/commentscan.h
index 9f90663..e296b89 100644
--- a/src/commentscan.h
+++ b/src/commentscan.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/commentscan.l b/src/commentscan.l
index 68f6b5f..45f5425 100644
--- a/src/commentscan.l
+++ b/src/commentscan.l
@@ -1,6 +1,6 @@
/*****************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -180,6 +180,7 @@ static DocCmdMap docCmdMap[] =
{ "latexonly", &handleFormatBlock, FALSE },
{ "htmlonly", &handleFormatBlock, FALSE },
{ "xmlonly", &handleFormatBlock, FALSE },
+ { "docbookonly", &handleFormatBlock, FALSE },
{ "rtfonly", &handleFormatBlock, FALSE },
{ "manonly", &handleFormatBlock, FALSE },
{ "dot", &handleFormatBlock, TRUE },
@@ -219,6 +220,7 @@ static DocCmdMap docCmdMap[] =
{ "copydoc", &handleCopyDoc, TRUE },
{ "copybrief", 0, FALSE },
{ "copydetails", 0, TRUE },
+ { "copyright", 0, TRUE },
{ "date", 0, TRUE },
{ "dotfile", 0, TRUE },
{ "htmlinclude", 0, FALSE },
@@ -293,7 +295,7 @@ class DocCmdMapper
{
if (m_map.find(p->cmdName)!=0)
{
- printf("Error: DocCmdMapper: command %s already added\n",p->cmdName);
+ err("DocCmdMapper: command %s already added\n",p->cmdName);
exit(1);
}
Cmd *cmd = new Cmd;
@@ -314,6 +316,7 @@ class DocCmdMapper
DocCmdMapper *DocCmdMapper::s_instance=0;
+bool inInternalDocs = FALSE;
#define YY_NEVER_INTERACTIVE 1
@@ -526,7 +529,7 @@ static void addXRefItem(const char *listName,const char *itemTitle,
QListIterator<ListItemInfo> slii(*docEntry->sli);
for (slii.toFirst();(lii=slii.current());++slii)
{
- if (strcmp(lii->type,listName)==0)
+ if (qstrcmp(lii->type,listName)==0)
{
//printf("found %s lii->type=%s\n",listName,lii->type);
break;
@@ -663,7 +666,7 @@ static void stripTrailingWhiteSpace(QCString &s)
while (i>=0 && ((c = s.at(i))==' ' || c=='\t' || c=='\r')) i--;
if (i!=(int)len-1)
{
- s.resize(i+2); // string upto and including char at pos i and \0 terminator
+ s.resize(i+2); // string up to and including char at pos i and \0 terminator
}
}
@@ -867,15 +870,15 @@ ATTR ({B}+[^>\n]*)?
DOCNL "\n"|"\\_linebr"
LC "\\"{B}*"\n"
NW [^a-z_A-Z0-9]
-FILESCHAR [a-z_A-Z0-9\x80-\xFF\\:\\\/\-\+]
-FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+]
+FILESCHAR [a-z_A-Z0-9\x80-\xFF\\:\\\/\-\+@&#]
+FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+@&#]
FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]*"\"")
ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]*
CITEID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-:/]*
SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
SCOPENAME "$"?(({ID}?{BN}*("::"|"."){BN}*)*)((~{BN}*)?{ID})
-MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+
+MAILADDR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+
RCSTAG "$"{ID}":"[^\n$]+"$"
%option noyywrap
@@ -937,7 +940,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
* words and whitespace and other characters (#,?!, etc).
* grouping commands (e.g. @{ and @})
* language switch (e.g. \~english or \~).
- * mail adress (e.g. dimitri@stack.nl).
+ * mail address (e.g. dimitri@stack.nl).
* quoted text, such as "foo@bar"
* XML commands, <summary></summary><remarks></remarks>
*/
@@ -948,7 +951,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
<Comment>{CMD}{CMD}"~"[a-z_A-Z]* { // escaped command
addOutput(yytext);
}
-<Comment>{MAILADR} { // mail adress
+<Comment>{MAILADDR} { // mail address
addOutput(yytext);
}
<Comment>"\""[^"\n]*"\"" { // quoted text
@@ -1018,9 +1021,11 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
BEGIN(HtmlComment);
}
<Comment>{B}*{CMD}"endinternal"{B}* {
- warn(yyFileName,yyLineNr,
- "warning: found \\endinternal without matching \\internal"
+ if (!inInternalDocs)
+ warn(yyFileName,yyLineNr,
+ "found \\endinternal without matching \\internal"
);
+ inInternalDocs = FALSE;
}
<Comment>{B}*{CMD}[a-z_A-Z]+{B}* { // potentially interesting command
// the {B}* in the front was added for bug620924
@@ -1074,7 +1079,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
<Comment>{B}*{CMD}"~"[a-z_A-Z]* { // language switch command
QCString langId = QString(yytext).stripWhiteSpace().data()+2;
if (!langId.isEmpty() &&
- stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)!=0)
+ qstricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)!=0)
{ // enable language specific section
BEGIN(SkipLang);
}
@@ -1160,6 +1165,9 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
<Comment>"--" { // ndash
addOutput(insidePre || Doxygen::markdownSupport ? yytext : "&ndash;");
}
+<Comment>"-#"{B}+ { // numbered item
+ addOutput(yytext);
+ }
<Comment>("."+)[a-z_A-Z0-9\)] { // . at start or in the middle of a word, or ellipsis
addOutput(yytext);
}
@@ -1181,11 +1189,23 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
{
// see bug 613024, we need to put the newlines after ending the XRef section.
setOutput(OutputDoc);
- addOutput("\n\n");
+ int i;
+ for (i=0;i<yyleng;)
+ {
+ if (yytext[i]=='\n') addOutput('\n'),i++;
+ else if (strcmp(yytext+i,"\\_linebr")==0) addOutput('\n'),i+=8;
+ else i++;
+ }
}
else if (inContext!=OutputBrief)
{
- addOutput("\n\n");
+ int i;
+ for (i=0;i<yyleng;)
+ {
+ if (yytext[i]=='\n') addOutput('\n'),i++;
+ else if (strcmp(yytext+i,"\\_linebr")==0) addOutput('\n'),i+=8;
+ else i++;
+ }
setOutput(OutputDoc);
}
else // inContext==OutputBrief
@@ -1265,7 +1285,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<EnumDocArg1>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
- "warning: missing argument after \\enum."
+ "missing argument after \\enum."
);
addOutput('\n');
if (*yytext=='\n') yyLineNr++;
@@ -1286,7 +1306,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<NameSpaceDocArg1>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
- "warning: missing argument after "
+ "missing argument after "
"\\namespace."
);
addOutput('\n');
@@ -1308,7 +1328,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<PackageDocArg1>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
- "warning: missing argument after "
+ "missing argument after "
"\\package."
);
addOutput('\n');
@@ -1339,7 +1359,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<ClassDocArg1,CategoryDocArg1>{DOCNL} {
warn(yyFileName,yyLineNr,
- "warning: missing argument after "
+ "missing argument after "
"\\%s.",YY_START==ClassDocArg1?"class":"category"
);
addOutput('\n');
@@ -1400,7 +1420,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<GroupDocArg1>{DOCNL} { // missing argument!
warn(yyFileName,yyLineNr,
- "warning: missing group name after %s",
+ "missing group name after %s",
current->groupDocCmd()
);
addOutput('\n');
@@ -1421,7 +1441,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
) // defgroup requires second argument
{
warn(yyFileName,yyLineNr,
- "warning: missing title after "
+ "missing title after "
"\\defgroup %s", current->name.data()
);
}
@@ -1441,7 +1461,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<PageDocArg1>{DOCNL} {
warn(yyFileName,yyLineNr,
- "warning: missing argument after "
+ "missing argument after "
"\\page."
);
if (*yytext=='\n') yyLineNr++;
@@ -1487,7 +1507,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<XRefItemParam1>{DOCNL} { // missing arguments
warn(yyFileName,yyLineNr,
- "warning: Missing first argument of \\xrefitem"
+ "Missing first argument of \\xrefitem"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
@@ -1507,7 +1527,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<XRefItemParam2>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
- "warning: Missing second argument of \\xrefitem"
+ "Missing second argument of \\xrefitem"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
@@ -1528,7 +1548,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<XRefItemParam3>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
- "warning: Missing third argument of \\xrefitem"
+ "Missing third argument of \\xrefitem"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
@@ -1555,7 +1575,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<RelatesParam1>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
- "warning: Missing argument of \\relates or \\memberof command"
+ "Missing argument of \\relates or \\memberof command"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
@@ -1590,7 +1610,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<SectionLabel>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
- "warning: \\section command has no label"
+ "\\section command has no label"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
@@ -1598,7 +1618,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<SectionLabel>. { // invalid character for section label
warn(yyFileName,yyLineNr,
- "warning: Invalid or missing section label"
+ "Invalid or missing section label"
);
BEGIN(Comment);
}
@@ -1644,7 +1664,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<SubpageLabel>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
- "warning: \\subpage command has no label"
+ "\\subpage command has no label"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
@@ -1674,7 +1694,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<AnchorLabel>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
- "warning: \\anchor command has no label"
+ "\\anchor command has no label"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
@@ -1682,7 +1702,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<AnchorLabel>. { // invalid character for anchor label
warn(yyFileName,yyLineNr,
- "warning: Invalid or missing anchor label"
+ "Invalid or missing anchor label"
);
BEGIN(Comment);
}
@@ -1690,7 +1710,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
/* ----- handle arguments of the preformatted block commands ------- */
-<FormatBlock>{CMD}("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"endmsc"|"endvhdlflow")/{NW} { // possible ends
+<FormatBlock>{CMD}("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"endmsc"|"endvhdlflow")/{NW} { // possible ends
addOutput(yytext);
if (&yytext[4]==blockName) // found end of the block
{
@@ -1714,7 +1734,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
if (g_commentCount<0 && blockName!="verbatim")
{
warn(yyFileName,yyLineNr,
- "warning: found */ without matching /* while inside a \\%s block! Perhaps a missing \\end%s?\n",blockName.data(),blockName.data());
+ "found */ without matching /* while inside a \\%s block! Perhaps a missing \\end%s?\n",blockName.data(),blockName.data());
}
}
<FormatBlock>. {
@@ -1722,7 +1742,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<FormatBlock><<EOF>> {
warn(yyFileName,yyLineNr,
- "warning: reached end of comment while inside a @%s block; check for missing @end%s tag!",
+ "reached end of comment while inside a @%s block; check for missing @end%s tag!",
blockName.data(),blockName.data()
);
yyterminate();
@@ -1752,7 +1772,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<GuardExpr>\n {
warn(yyFileName,yyLineNr,
- "warning: invalid expression '%s' for guard",g_guardExpr.data());
+ "invalid expression '%s' for guard",g_guardExpr.data());
unput(*yytext);
BEGIN(GuardParam);
}
@@ -1803,7 +1823,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
if (guards.isEmpty())
{
warn(yyFileName,yyLineNr,
- "warning: found @endif without matching start command");
+ "found @endif without matching start command");
}
else
{
@@ -1815,7 +1835,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
if (guards.isEmpty())
{
warn(yyFileName,yyLineNr,
- "warning: found @else without matching start command");
+ "found @else without matching start command");
}
else
{
@@ -1832,7 +1852,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
if (guards.isEmpty())
{
warn(yyFileName,yyLineNr,
- "warning: found @elseif without matching start command");
+ "found @elseif without matching start command");
}
else
{
@@ -1939,7 +1959,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
if (!inGroupParamFound)
{
warn(yyFileName,yyLineNr,
- "warning: Missing group name for \\ingroup command"
+ "Missing group name for \\ingroup command"
);
}
if (*yytext=='\n') yyLineNr++;
@@ -2020,7 +2040,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<InheritParam>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
- "warning: \\inherit command has no argument"
+ "\\inherit command has no argument"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
@@ -2028,7 +2048,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<InheritParam>. { // invalid character for anchor label
warn(yyFileName,yyLineNr,
- "warning: Invalid or missing name for \\inherit command"
+ "Invalid or missing name for \\inherit command"
);
BEGIN(Comment);
}
@@ -2043,7 +2063,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<ExtendsParam>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
- "warning: \\extends or \\implements command has no argument"
+ "\\extends or \\implements command has no argument"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
@@ -2057,7 +2077,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
<SkipLang>[\\@]"~"[a-zA-Z]* { /* language switch */
QCString langId = &yytext[2];
if (langId.isEmpty() ||
- stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)==0)
+ qstricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)==0)
{ // enable language specific section
BEGIN(Comment);
}
@@ -2079,7 +2099,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<CiteLabel>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
- "warning: \\cite command has no label"
+ "\\cite command has no label"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
@@ -2087,7 +2107,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
}
<CiteLabel>. { // invalid character for cite label
warn(yyFileName,yyLineNr,
- "warning: Invalid or missing cite label"
+ "Invalid or missing cite label"
);
BEGIN(Comment);
}
@@ -2406,7 +2426,12 @@ static bool handleSubpage(const QCString &s)
)
{
warn(yyFileName,yyLineNr,
- "warning: found \\subpage command in a comment block that is not marked as a page!");
+ "found \\subpage command in a comment block that is not marked as a page!");
+ }
+ if (g_spaceBeforeCmd)
+ {
+ addOutput(' ');
+ g_spaceBeforeCmd=FALSE;
}
addOutput("@"+s+" ");
BEGIN(SubpageLabel);
@@ -2467,7 +2492,7 @@ static bool handleElseIf(const QCString &)
if (guards.isEmpty())
{
warn(yyFileName,yyLineNr,
- "warning: found \\else without matching start command");
+ "found \\else without matching start command");
}
else
{
@@ -2482,7 +2507,7 @@ static bool handleElse(const QCString &)
if (guards.isEmpty())
{
warn(yyFileName,yyLineNr,
- "warning: found \\else without matching start command");
+ "found \\else without matching start command");
}
else
{
@@ -2496,13 +2521,18 @@ static bool handleEndIf(const QCString &)
if (guards.isEmpty())
{
warn(yyFileName,yyLineNr,
- "warning: found \\endif without matching start command");
+ "found \\endif without matching start command");
}
else
{
delete guards.pop();
}
enabledSectionFound=FALSE;
+ if (g_spaceBeforeCmd)
+ {
+ addOutput(' ');
+ g_spaceBeforeCmd=FALSE;
+ }
BEGIN( GuardParamEnd );
return FALSE;
}
@@ -2561,6 +2591,7 @@ static bool handleInternal(const QCString &)
{
// re-enabled for bug640828
addOutput("\\internal ");
+ inInternalDocs = TRUE;
}
return FALSE;
}
@@ -2658,7 +2689,7 @@ static void checkFormula()
{
if (YY_START==ReadFormulaShort || YY_START==ReadFormulaLong)
{
- warn(yyFileName,yyLineNr,"warning: End of comment block while inside formula.");
+ warn(yyFileName,yyLineNr,"End of comment block while inside formula.");
}
}
@@ -2794,14 +2825,14 @@ void groupLeaveFile(const char *fileName,int line)
{
//if (g_memberGroupId!=DOX_NOGROUP)
//{
- // warn(fileName,line,"warning: end of file while inside a member group\n");
+ // warn(fileName,line,"end of file while inside a member group\n");
//}
g_memberGroupId=DOX_NOGROUP;
g_memberGroupRelates.resize(0);
g_memberGroupDocs.resize(0);
if (!g_autoGroupStack.isEmpty())
{
- warn(fileName,line,"warning: end of file while inside a group\n");
+ warn(fileName,line,"end of file while inside a group\n");
}
}
@@ -2809,7 +2840,7 @@ void groupEnterCompound(const char *fileName,int line,const char *name)
{
if (g_memberGroupId!=DOX_NOGROUP)
{
- warn(fileName,line,"warning: try to put compound %s inside a member group\n",name);
+ warn(fileName,line,"try to put compound %s inside a member group\n",name);
}
g_memberGroupId=DOX_NOGROUP;
g_memberGroupRelates.resize(0);
@@ -2832,7 +2863,7 @@ void groupLeaveCompound(const char *,int,const char * /*name*/)
//printf("groupLeaveCompound(%s)\n",name);
//if (g_memberGroupId!=DOX_NOGROUP)
//{
- // warn(fileName,line,"warning: end of compound %s while inside a member group\n",name);
+ // warn(fileName,line,"end of compound %s while inside a member group\n",name);
//}
g_memberGroupId=DOX_NOGROUP;
g_memberGroupRelates.resize(0);
@@ -2849,7 +2880,7 @@ static int findExistingGroup(int &groupId,const MemberGroupInfo *info)
{
if (g_compoundName==mi->compoundName && // same file or scope
!mi->header.isEmpty() && // not a nameless group
- stricmp(mi->header,info->header)==0 // same header name
+ qstricmp(mi->header,info->header)==0 // same header name
)
{
//printf("Found it!\n");
diff --git a/src/compound.xsd b/src/compound.xsd
index d8e2589..d623c5f 100644
--- a/src/compound.xsd
+++ b/src/compound.xsd
@@ -172,6 +172,18 @@
<xsd:attribute name="required" type="DoxBool" use="optional"/>
<!-- Objective-C 2.0 property accessor -->
<xsd:attribute name="accessor" type="DoxAccessor" use="optional"/>
+ <!-- UNO IDL -->
+ <xsd:attribute name="attribute" type="DoxBool" use="optional"/>
+ <xsd:attribute name="property" type="DoxBool" use="optional"/>
+ <xsd:attribute name="readonly" type="DoxBool" use="optional"/>
+ <xsd:attribute name="bound" type="DoxBool" use="optional"/>
+ <xsd:attribute name="removable" type="DoxBool" use="optional"/>
+ <xsd:attribute name="contrained" type="DoxBool" use="optional"/>
+ <xsd:attribute name="transient" type="DoxBool" use="optional"/>
+ <xsd:attribute name="maybevoid" type="DoxBool" use="optional"/>
+ <xsd:attribute name="maybedefault" type="DoxBool" use="optional"/>
+ <xsd:attribute name="maybeambiguous" type="DoxBool" use="optional"/>
+
</xsd:complexType>
<xsd:complexType name="descriptionType" mixed="true">
@@ -279,6 +291,7 @@
<xsd:complexType name="locationType">
<xsd:attribute name="file" type="xsd:string" />
<xsd:attribute name="line" type="xsd:integer" />
+ <xsd:attribute name="column" type="xsd:integer" use="optional"/>
<xsd:attribute name="bodyfile" type="xsd:string" />
<xsd:attribute name="bodystart" type="xsd:integer" />
<xsd:attribute name="bodyend" type="xsd:integer" />
@@ -741,6 +754,8 @@
<xsd:enumeration value="friend" />
<xsd:enumeration value="dcop" />
<xsd:enumeration value="slot" />
+ <xsd:enumeration value="interface" />
+ <xsd:enumeration value="service" />
</xsd:restriction>
</xsd:simpleType>
@@ -770,6 +785,10 @@
<xsd:enumeration value="protocol" />
<xsd:enumeration value="category" />
<xsd:enumeration value="exception" />
+ <xsd:enumeration value="service" />
+ <xsd:enumeration value="singleton" />
+ <xsd:enumeration value="module" />
+ <xsd:enumeration value="type" />
<xsd:enumeration value="file" />
<xsd:enumeration value="namespace" />
<xsd:enumeration value="group" />
diff --git a/src/compound_xsd.h b/src/compound_xsd.h
index 7d0a9d4..8ec3633 100644
--- a/src/compound_xsd.h
+++ b/src/compound_xsd.h
@@ -172,6 +172,18 @@
" <xsd:attribute name=\"required\" type=\"DoxBool\" use=\"optional\"/>\n"
" <!-- Objective-C 2.0 property accessor -->\n"
" <xsd:attribute name=\"accessor\" type=\"DoxAccessor\" use=\"optional\"/>\n"
+" <!-- UNO IDL -->\n"
+" <xsd:attribute name=\"attribute\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"property\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"readonly\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"bound\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"removable\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"contrained\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"transient\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"maybevoid\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"maybedefault\" type=\"DoxBool\" use=\"optional\"/>\n"
+" <xsd:attribute name=\"maybeambiguous\" type=\"DoxBool\" use=\"optional\"/>\n"
+"\n"
" </xsd:complexType>\n"
"\n"
" <xsd:complexType name=\"descriptionType\" mixed=\"true\">\n"
@@ -279,6 +291,7 @@
" <xsd:complexType name=\"locationType\">\n"
" <xsd:attribute name=\"file\" type=\"xsd:string\" />\n"
" <xsd:attribute name=\"line\" type=\"xsd:integer\" />\n"
+" <xsd:attribute name=\"column\" type=\"xsd:integer\" use=\"optional\"/>\n"
" <xsd:attribute name=\"bodyfile\" type=\"xsd:string\" />\n"
" <xsd:attribute name=\"bodystart\" type=\"xsd:integer\" />\n"
" <xsd:attribute name=\"bodyend\" type=\"xsd:integer\" />\n"
@@ -741,6 +754,8 @@
" <xsd:enumeration value=\"friend\" />\n"
" <xsd:enumeration value=\"dcop\" />\n"
" <xsd:enumeration value=\"slot\" />\n"
+" <xsd:enumeration value=\"interface\" />\n"
+" <xsd:enumeration value=\"service\" />\n"
" </xsd:restriction>\n"
" </xsd:simpleType>\n"
"\n"
@@ -770,6 +785,10 @@
" <xsd:enumeration value=\"protocol\" />\n"
" <xsd:enumeration value=\"category\" />\n"
" <xsd:enumeration value=\"exception\" />\n"
+" <xsd:enumeration value=\"service\" />\n"
+" <xsd:enumeration value=\"singleton\" />\n"
+" <xsd:enumeration value=\"module\" />\n"
+" <xsd:enumeration value=\"type\" />\n"
" <xsd:enumeration value=\"file\" />\n"
" <xsd:enumeration value=\"namespace\" />\n"
" <xsd:enumeration value=\"group\" />\n"
diff --git a/src/condparser.cpp b/src/condparser.cpp
index 2cadc1e..c99a232 100644
--- a/src/condparser.cpp
+++ b/src/condparser.cpp
@@ -1,5 +1,5 @@
/**
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -75,7 +75,7 @@ bool CondParser::parse(const char *fileName,int lineNr,const char *expr)
}
if (m_err)
{
- warn(fileName,lineNr,"Warning: problem evaluating expression '%s': %s",
+ warn(fileName,lineNr,"problem evaluating expression '%s': %s",
expr,m_err.data());
}
//printf("expr='%s' answer=%d\n",expr,answer);
diff --git a/src/condparser.h b/src/condparser.h
index 74a05cf..a4dfee8 100644
--- a/src/condparser.h
+++ b/src/condparser.h
@@ -2,7 +2,7 @@
#define CONDPARSER_H
/**
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/config.h b/src/config.h
index 5ed8bc4..7d37516 100644
--- a/src/config.h
+++ b/src/config.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -42,7 +42,8 @@ class ConfigOption
O_String, //<! A single item
O_Int, //<! An integer value
O_Bool, //<! A boolean value
- O_Obsolete //<! An obsolete option
+ O_Obsolete, //<! An obsolete option
+ O_Disabled //<! Disabled compile time option
};
enum
{
@@ -67,6 +68,7 @@ class ConfigOption
QCString dependsOn() const { return m_dependency; }
void addDependency(const char *dep) { m_dependency = dep; }
void setEncoding(const QCString &e) { m_encoding = e; }
+ void setUserComment(const QCString &u) { m_userComment = u; }
protected:
virtual void writeTemplate(FTextStream &t,bool sl,bool upd) = 0;
@@ -75,7 +77,7 @@ class ConfigOption
virtual void writeXML(FTextStream&) {}
virtual void init() {}
- QCString convertToComment(const QCString &s);
+ QCString convertToComment(const QCString &s, const QCString &u);
void writeBoolValue(FTextStream &t,bool v);
void writeIntValue(FTextStream &t,int i);
void writeStringValue(FTextStream &t,QCString &s);
@@ -86,6 +88,7 @@ class ConfigOption
QCString m_doc;
QCString m_dependency;
QCString m_encoding;
+ QCString m_userComment;
OptionType m_kind;
};
@@ -135,9 +138,13 @@ class ConfigList : public ConfigOption
if (!sl)
{
t << endl;
- t << convertToComment(m_doc);
+ t << convertToComment(m_doc, m_userComment);
t << endl;
}
+ else if (!m_userComment.isEmpty())
+ {
+ t << convertToComment("", m_userComment);
+ }
t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
writeStringList(t,m_value);
t << "\n";
@@ -175,9 +182,13 @@ class ConfigEnum : public ConfigOption
if (!sl)
{
t << endl;
- t << convertToComment(m_doc);
+ t << convertToComment(m_doc, m_userComment);
t << endl;
}
+ else if (!m_userComment.isEmpty())
+ {
+ t << convertToComment("", m_userComment);
+ }
t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
writeStringValue(t,m_value);
t << "\n";
@@ -216,9 +227,13 @@ class ConfigString : public ConfigOption
if (!sl)
{
t << endl;
- t << convertToComment(m_doc);
+ t << convertToComment(m_doc, m_userComment);
t << endl;
}
+ else if (!m_userComment.isEmpty())
+ {
+ t << convertToComment("", m_userComment);
+ }
t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
writeStringValue(t,m_value);
t << "\n";
@@ -259,9 +274,13 @@ class ConfigInt : public ConfigOption
if (!sl)
{
t << endl;
- t << convertToComment(m_doc);
+ t << convertToComment(m_doc, m_userComment);
t << endl;
}
+ else if (!m_userComment.isEmpty())
+ {
+ t << convertToComment("", m_userComment);
+ }
t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
if (upd && !m_valueString.isEmpty())
{
@@ -306,9 +325,13 @@ class ConfigBool : public ConfigOption
if (!sl)
{
t << endl;
- t << convertToComment(m_doc);
+ t << convertToComment(m_doc, m_userComment);
t << endl;
}
+ else if (!m_userComment.isEmpty())
+ {
+ t << convertToComment("", m_userComment);
+ }
t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "=";
if (upd && !m_valueString.isEmpty())
{
@@ -333,7 +356,19 @@ class ConfigBool : public ConfigOption
class ConfigObsolete : public ConfigOption
{
public:
- ConfigObsolete(const char *name,OptionType t) : ConfigOption(t)
+ ConfigObsolete(const char *name) : ConfigOption(O_Obsolete)
+ { m_name = name; }
+ void writeTemplate(FTextStream &,bool,bool) {}
+ void substEnvVars() {}
+ void writeXML(FTextStream&);
+};
+
+/** Section marker for compile time optional options
+ */
+class ConfigDisabled : public ConfigOption
+{
+ public:
+ ConfigDisabled(const char *name) : ConfigOption(O_Disabled)
{ m_name = name; }
void writeTemplate(FTextStream &,bool,bool) {}
void substEnvVars() {}
@@ -515,11 +550,19 @@ class Config
/*! Adds an option that has become obsolete. */
ConfigOption *addObsolete(const char *name)
{
- ConfigObsolete *option = new ConfigObsolete(name,ConfigOption::O_Obsolete);
+ ConfigObsolete *option = new ConfigObsolete(name);
m_dict->insert(name,option);
m_obsolete->append(option);
return option;
}
+ /*! Adds an option that has been disabled at compile time. */
+ ConfigOption *addDisabled(const char *name)
+ {
+ ConfigDisabled *option = new ConfigDisabled(name);
+ m_dict->insert(name,option);
+ m_disabled->append(option);
+ return option;
+ }
/*! @} */
/*! Writes a template configuration to stream \a t. If \a shortIndex
@@ -570,12 +613,29 @@ class Config
*/
void create();
+ /*! Append user comment
+ */
+ void appendUserComment(const QCString &u)
+ {
+ m_userComment += u;
+ }
+ /*! Take the user comment and reset it internally
+ * \returns user comment
+ */
+ QCString takeUserComment()
+ {
+ QCString result=m_userComment;
+ m_userComment.resize(0);
+ return result;
+ }
+
protected:
Config()
{
m_options = new QList<ConfigOption>;
m_obsolete = new QList<ConfigOption>;
+ m_disabled = new QList<ConfigOption>;
m_dict = new QDict<ConfigOption>(257);
m_options->setAutoDelete(TRUE);
m_obsolete->setAutoDelete(TRUE);
@@ -586,14 +646,17 @@ class Config
{
delete m_options;
delete m_obsolete;
+ delete m_disabled;
delete m_dict;
}
private:
QList<ConfigOption> *m_options;
QList<ConfigOption> *m_obsolete;
+ QList<ConfigOption> *m_disabled;
QDict<ConfigOption> *m_dict;
static Config *m_instance;
+ QCString m_userComment;
bool m_initialized;
};
diff --git a/src/config.l b/src/config.l
index 0422411..58717ab 100644
--- a/src/config.l
+++ b/src/config.l
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -77,11 +77,11 @@ static QCString configStringRecode(
/* -----------------------------------------------------------------
*/
-QCString ConfigOption::convertToComment(const QCString &s)
+QCString ConfigOption::convertToComment(const QCString &s, const QCString &u)
{
+ //printf("convertToComment(%s)=%s\n",s.data(),u.data());
QCString result;
- if (s.isEmpty()) return result;
- else
+ if (!s.isEmpty())
{
QCString tmp=s.stripWhiteSpace();
char *p=tmp.data();
@@ -101,6 +101,11 @@ QCString ConfigOption::convertToComment(const QCString &s)
}
result+='\n';
}
+ if (!u.isEmpty())
+ {
+ if (!result.isEmpty()) result+='\n';
+ result+= u;
+ }
return result;
}
@@ -175,7 +180,7 @@ void ConfigInt::convertStrToVal()
int val = m_valueString.toInt(&ok);
if (!ok || val<m_minVal || val>m_maxVal)
{
- config_warn("warning: argument `%s' for option %s is not a valid number in the range [%d..%d]!\n"
+ config_warn("Warning: argument `%s' for option %s is not a valid number in the range [%d..%d]!\n"
"Using the default: %d!\n",m_valueString.data(),m_name.data(),m_minVal,m_maxVal,m_value);
}
m_value=val;
@@ -197,7 +202,7 @@ void ConfigBool::convertStrToVal()
}
else
{
- config_warn("warning: argument `%s' for option %s is not a valid boolean value\n"
+ config_warn("Warning: argument `%s' for option %s is not a valid boolean value\n"
"Using the default: %s!\n",m_valueString.data(),m_name.data(),m_value?"YES":"NO");
}
}
@@ -377,6 +382,12 @@ void ConfigObsolete::writeXML(FTextStream &t)
"id='" << convertToXML(name()) << "'/>" << endl;
}
+void ConfigDisabled::writeXML(FTextStream &t)
+{
+ t << " <option type='disabled' "
+ "id='" << convertToXML(name()) << "'/>" << endl;
+}
+
/* -----------------------------------------------------------------
*
@@ -459,7 +470,7 @@ static QCString configStringRecode(
void *cd = portable_iconv_open(outputEncoding,inputEncoding);
if (cd==(void *)(-1))
{
- fprintf(stderr,"error: unsupported character conversion: '%s'->'%s'\n",
+ fprintf(stderr,"Error: unsupported character conversion: '%s'->'%s'\n",
inputEncoding.data(),outputEncoding.data());
exit(1);
}
@@ -476,7 +487,7 @@ static QCString configStringRecode(
}
else
{
- fprintf(stderr,"error: failed to translate characters from %s to %s: %s\n",
+ fprintf(stderr,"Error: failed to translate characters from %s to %s: %s\n",
inputEncoding.data(),outputEncoding.data(),strerror(errno));
exit(1);
}
@@ -497,7 +508,7 @@ static FILE *tryPath(const char *path,const char *fileName)
if (fi.exists() && fi.isFile())
{
FILE *f=portable_fopen(absName,"r");
- if (!f) config_err("error: could not open file %s for reading\n",absName.data());
+ if (!f) config_err("Error: could not open file %s for reading\n",absName.data());
return f;
}
return 0;
@@ -508,8 +519,14 @@ static void substEnvVarsInString(QCString &s);
static FILE *findFile(const char *fileName)
{
- if(portable_isAbsolutePath(fileName))
+ if (fileName==0)
+ {
+ return 0;
+ }
+ if (portable_isAbsolutePath(fileName))
+ {
return tryPath(NULL, fileName);
+ }
substEnvVarsInStrList(includePathList);
char *s=includePathList.first();
while (s) // try each of the include paths
@@ -525,7 +542,7 @@ static FILE *findFile(const char *fileName)
static void readIncludeFile(const char *incName)
{
if (includeDepth==MAX_INCLUDE_DEPTH) {
- config_err("error: maximum include depth (%d) reached, %s is not included. Aborting...\n",
+ config_err("Error: maximum include depth (%d) reached, %s is not included. Aborting...\n",
MAX_INCLUDE_DEPTH,incName);
exit(1);
}
@@ -534,7 +551,7 @@ static void readIncludeFile(const char *incName)
substEnvVarsInString(inc);
inc = inc.stripWhiteSpace();
uint incLen = inc.length();
- if (inc.at(0)=='"' && inc.at(incLen-1)=='"') // strip quotes
+ if (incLen>0 && inc.at(0)=='"' && inc.at(incLen-1)=='"') // strip quotes
{
inc=inc.mid(1,incLen-2);
}
@@ -565,7 +582,7 @@ static void readIncludeFile(const char *incName)
}
else
{
- config_err("error: @INCLUDE = %s: not found!\n",inc.data());
+ config_err("Error: @INCLUDE = %s: not found!\n",inc.data());
exit(1);
}
}
@@ -589,18 +606,20 @@ static void readIncludeFile(const char *incName)
%%
<*>\0x0d
-<Start,GetString,GetStrList,GetBool,SkipInvalid>"#" { BEGIN(SkipComment); }
+<Start,GetString,GetStrList,GetBool,SkipInvalid>"##".*"\n" { config->appendUserComment(yytext);}
+<Start,GetString,GetStrList,GetBool,SkipInvalid>"#" { BEGIN(SkipComment); }
<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"=" { QCString cmd=yytext;
cmd=cmd.left(cmd.length()-1).stripWhiteSpace();
ConfigOption *option = config->get(cmd);
if (option==0) // oops not known
{
- config_err("warning: ignoring unsupported tag `%s' at line %d, file %s\n",
+ config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n",
yytext,yyLineNr,yyFileName.data());
BEGIN(SkipInvalid);
}
else // known tag
{
+ option->setUserComment(config->takeUserComment());
option->setEncoding(encoding);
switch(option->kind())
{
@@ -635,11 +654,17 @@ static void readIncludeFile(const char *incName)
BEGIN(GetString);
break;
case ConfigOption::O_Obsolete:
- config_err("warning: Tag `%s' at line %d of file %s has become obsolete.\n"
+ config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n"
"To avoid this warning please remove this line from your configuration "
"file or upgrade it using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data());
BEGIN(SkipInvalid);
break;
+ case ConfigOption::O_Disabled:
+ config_err("Warning: Tag `%s' at line %d of file %s belongs to an option that was not enabled at compile time.\n"
+ "To avoid this warning please remove this line from your configuration "
+ "file, upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n", cmd.data(),yyLineNr,yyFileName.data());
+ BEGIN(SkipInvalid);
+ break;
}
}
}
@@ -648,12 +673,13 @@ static void readIncludeFile(const char *incName)
ConfigOption *option = config->get(cmd);
if (option==0) // oops not known
{
- config_err("warning: ignoring unsupported tag `%s' at line %d, file %s\n",
+ config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n",
yytext,yyLineNr,yyFileName.data());
BEGIN(SkipInvalid);
}
else // known tag
{
+ option->setUserComment(config->takeUserComment());
switch(option->kind())
{
case ConfigOption::O_Info:
@@ -669,16 +695,22 @@ static void readIncludeFile(const char *incName)
case ConfigOption::O_String:
case ConfigOption::O_Int:
case ConfigOption::O_Bool:
- config_err("warning: operator += not supported for `%s'. Ignoring line at line %d, file %s\n",
+ config_err("Warning: operator += not supported for `%s'. Ignoring line at line %d, file %s\n",
yytext,yyLineNr,yyFileName.data());
BEGIN(SkipInvalid);
break;
case ConfigOption::O_Obsolete:
- config_err("warning: Tag `%s' at line %d of file %s has become obsolete.\n"
+ config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n"
"To avoid this warning please update your configuration "
"file using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data());
BEGIN(SkipInvalid);
break;
+ case ConfigOption::O_Disabled:
+ config_err("Warning: Tag `%s' at line %d of file %s belongs to an option that was not enabled at compile time.\n"
+ "To avoid this warning please remove this line from your configuration "
+ "file, upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n", cmd.data(),yyLineNr,yyFileName.data());
+ BEGIN(SkipInvalid);
+ break;
}
}
}
@@ -711,7 +743,7 @@ static void readIncludeFile(const char *incName)
}
}
-<Start>[a-z_A-Z0-9]+ { config_err("warning: ignoring unknown tag `%s' at line %d, file %s\n",yytext,yyLineNr,yyFileName.data()); }
+<Start>[a-z_A-Z0-9]+ { config_err("Warning: ignoring unknown tag `%s' at line %d, file %s\n",yytext,yyLineNr,yyFileName.data()); }
<GetString,GetBool,SkipInvalid>\n { yyLineNr++; BEGIN(Start); }
<GetStrList>\n {
yyLineNr++;
@@ -752,7 +784,7 @@ static void readIncludeFile(const char *incName)
}
if (*yytext=='\n')
{
- config_err("warning: Missing end quote (\") on line %d, file %s\n",yyLineNr,yyFileName.data());
+ config_err("Warning: Missing end quote (\") on line %d, file %s\n",yyLineNr,yyFileName.data());
yyLineNr++;
}
BEGIN(lastState);
@@ -771,7 +803,7 @@ static void readIncludeFile(const char *incName)
else
{
*b=FALSE;
- config_warn("warning: Invalid value `%s' for "
+ config_warn("Warning: Invalid value `%s' for "
"boolean tag in line %d, file %s; use YES or NO\n",
bs.data(),yyLineNr,yyFileName.data());
}
@@ -798,6 +830,8 @@ void Config::writeTemplate(FTextStream &t,bool sl,bool upd)
t << "# This file describes the settings to be used by the documentation system\n";
t << "# doxygen (www.doxygen.org) for a project.\n";
t << "#\n";
+ t << "# All text after a double hash (##) is considered a comment and is placed\n";
+ t << "# in front of the TAG it is preceding .\n";
t << "# All text after a hash (#) is considered a comment and will be ignored.\n";
t << "# The format is:\n";
t << "# TAG = value [value, ...]\n";
@@ -811,6 +845,12 @@ void Config::writeTemplate(FTextStream &t,bool sl,bool upd)
option->writeTemplate(t,sl,upd);
option = m_options->next();
}
+ /* print last lines of user comment that were at the end of the file */
+ if (m_userComment)
+ {
+ t << "\n";
+ t << m_userComment;
+ }
}
void Config::writeXML(FTextStream &t)
@@ -1044,15 +1084,15 @@ void Config::check()
{
if (warnFormat.find("$file")==-1)
{
- config_err("warning: warning format does not contain a $file tag!\n");
+ config_err("Warning: warning format does not contain a $file tag!\n");
}
if (warnFormat.find("$line")==-1)
{
- config_err("warning: warning format does not contain a $line tag!\n");
+ config_err("Warning: warning format does not contain a $line tag!\n");
}
if (warnFormat.find("$text")==-1)
{
- config_err("warning: warning format foes not contain a $text tag!\n");
+ config_err("Warning: warning format foes not contain a $text tag!\n");
}
}
@@ -1073,7 +1113,7 @@ void Config::check()
if (paperType!="a4" && paperType!="a4wide" && paperType!="letter" &&
paperType!="legal" && paperType!="executive")
{
- config_err("error: Unknown page type specified");
+ config_err("Error: Unknown page type specified\n");
}
QCString &outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
@@ -1113,7 +1153,7 @@ void Config::check()
QFileInfo fi(headerFile);
if (!fi.exists())
{
- config_err("error: tag HTML_HEADER: header file `%s' "
+ config_err("Error: tag HTML_HEADER: header file `%s' "
"does not exist\n",headerFile.data());
exit(1);
}
@@ -1125,11 +1165,26 @@ void Config::check()
QFileInfo fi(footerFile);
if (!fi.exists())
{
- config_err("error: tag HTML_FOOTER: footer file `%s' "
+ config_err("Error: tag HTML_FOOTER: footer file `%s' "
"does not exist\n",footerFile.data());
exit(1);
}
}
+ // Test to see if MathJax code file is valid
+ if (Config_getBool("USE_MATHJAX"))
+ {
+ QCString &MathJaxCodefile = Config_getString("MATHJAX_CODEFILE");
+ if (!MathJaxCodefile.isEmpty())
+ {
+ QFileInfo fi(MathJaxCodefile);
+ if (!fi.exists())
+ {
+ config_err("Error: tag MATHJAX_CODEFILE file `%s' "
+ "does not exist\n",MathJaxCodefile.data());
+ exit(1);
+ }
+ }
+ }
// Test to see if LaTeX header is valid
QCString &latexHeaderFile = Config_getString("LATEX_HEADER");
if (!latexHeaderFile.isEmpty())
@@ -1137,7 +1192,7 @@ void Config::check()
QFileInfo fi(latexHeaderFile);
if (!fi.exists())
{
- config_err("error: tag LATEX_HEADER: header file `%s' "
+ config_err("Error: tag LATEX_HEADER: header file `%s' "
"does not exist\n",latexHeaderFile.data());
exit(1);
}
@@ -1148,7 +1203,7 @@ void Config::check()
while (s)
{
QFileInfo fi(s);
- if (!fi.exists()) config_err("warning: tag INCLUDE_PATH: include path `%s' "
+ if (!fi.exists()) config_err("Warning: tag INCLUDE_PATH: include path `%s' "
"does not exist\n",s);
s=includePath.next();
}
@@ -1164,7 +1219,7 @@ void Config::check()
alias=alias.stripWhiteSpace();
if (alias.find(re1)!=0 && alias.find(re2)!=0)
{
- config_err("Illegal alias format `%s'. Use \"name=value\" or \"name(n)=value\", where n is the number of arguments\n",
+ config_err("Error: Illegal alias format `%s'. Use \"name=value\" or \"name(n)=value\", where n is the number of arguments\n",
alias.data());
}
s=aliasList.next();
@@ -1173,19 +1228,19 @@ void Config::check()
// check if GENERATE_TREEVIEW and GENERATE_HTMLHELP are both enabled
if (Config_getBool("GENERATE_TREEVIEW") && Config_getBool("GENERATE_HTMLHELP"))
{
- config_err("When enabling GENERATE_HTMLHELP the tree view (GENERATE_TREEVIEW) should be disabled. I'll do it for you.\n");
+ config_err("Error: When enabling GENERATE_HTMLHELP the tree view (GENERATE_TREEVIEW) should be disabled. I'll do it for you.\n");
Config_getBool("GENERATE_TREEVIEW")=FALSE;
}
if (Config_getBool("SEARCHENGINE") && Config_getBool("GENERATE_HTMLHELP"))
{
- config_err("When enabling GENERATE_HTMLHELP the search engine (SEARCHENGINE) should be disabled. I'll do it for you.\n");
+ config_err("Error: When enabling GENERATE_HTMLHELP the search engine (SEARCHENGINE) should be disabled. I'll do it for you.\n");
Config_getBool("SEARCHENGINE")=FALSE;
}
// check if SEPARATE_MEMBER_PAGES and INLINE_GROUPED_CLASSES are both enabled
if (Config_getBool("SEPARATE_MEMBER_PAGES") && Config_getBool("INLINE_GROUPED_CLASSES"))
{
- config_err("When enabling INLINE_GROUPED_CLASSES the SEPARATE_MEMBER_PAGES option should be disabled. I'll do it for you.\n");
+ config_err("Error: When enabling INLINE_GROUPED_CLASSES the SEPARATE_MEMBER_PAGES option should be disabled. I'll do it for you.\n");
Config_getBool("SEPARATE_MEMBER_PAGES")=FALSE;
}
@@ -1201,6 +1256,14 @@ void Config::check()
// config_err("Invalid value for DOT_IMAGE_FORMAT: `%s'. Using the default.\n",dotImageFormat.data());
// dotImageFormat = "png";
//}
+
+ QCString &dotFontName=Config_getString("DOT_FONTNAME");
+ if (dotFontName=="FreeSans" || dotFontName=="FreeSans.ttf")
+ {
+ config_err("Warning: doxygen no longer ships with the FreeSans font.\n"
+ "You may want to clear or change DOT_FONTPATH.\n"
+ "Otherwise you run the risk that the wrong font is being used for dot generated graphs.\n");
+ }
// check dot path
@@ -1217,7 +1280,7 @@ void Config::check()
QFileInfo dp(dotPath+"/dot"+portable_commandExtension());
if (!dp.exists() || !dp.isFile())
{
- config_err("warning: the dot tool could not be found at %s\n",dotPath.data());
+ config_err("Warning: the dot tool could not be found at %s\n",dotPath.data());
dotPath="";
}
else
@@ -1242,7 +1305,7 @@ void Config::check()
QFileInfo dp(mscgenPath+"/mscgen"+portable_commandExtension());
if (!dp.exists() || !dp.isFile())
{
- config_err("warning: the mscgen tool could not be found at %s\n",mscgenPath.data());
+ config_err("Warning: the mscgen tool could not be found at %s\n",mscgenPath.data());
mscgenPath="";
}
else
@@ -1275,7 +1338,7 @@ void Config::check()
QFileInfo fi(s);
if (!fi.exists())
{
- config_err("warning: tag INPUT: input source `%s' does not exist\n",s);
+ config_err("Warning: tag INPUT: input source `%s' does not exist\n",s);
}
s=inputSources.next();
}
@@ -1290,7 +1353,7 @@ void Config::check()
filePatternList.append("*.cxx");
filePatternList.append("*.cpp");
filePatternList.append("*.c++");
- filePatternList.append("*.d");
+ //filePatternList.append("*.d");
filePatternList.append("*.java");
filePatternList.append("*.ii");
filePatternList.append("*.ixx");
@@ -1366,14 +1429,14 @@ void Config::check()
Config_getString("GENERATE_TAGFILE").isEmpty()
)
{
- config_err("warning: No output formats selected! Set at least one of the main GENERATE_* options to YES.\n");
+ config_err("Warning: No output formats selected! Set at least one of the main GENERATE_* options to YES.\n");
}
// check HTMLHELP creation requirements
if (!Config_getBool("GENERATE_HTML") &&
Config_getBool("GENERATE_HTMLHELP"))
{
- config_err("warning: GENERATE_HTMLHELP=YES requires GENERATE_HTML=YES.\n");
+ config_err("Warning: GENERATE_HTMLHELP=YES requires GENERATE_HTML=YES.\n");
}
// check QHP creation requirements
@@ -1381,13 +1444,13 @@ void Config::check()
{
if (Config_getString("QHP_NAMESPACE").isEmpty())
{
- config_err("error: GENERATE_QHP=YES requires QHP_NAMESPACE to be set. Using 'org.doxygen.doc' as default!.\n");
+ config_err("Error: GENERATE_QHP=YES requires QHP_NAMESPACE to be set. Using 'org.doxygen.doc' as default!.\n");
Config_getString("QHP_NAMESPACE")="org.doxygen.doc";
}
if (Config_getString("QHP_VIRTUAL_FOLDER").isEmpty())
{
- config_err("error: GENERATE_QHP=YES requires QHP_VIRTUAL_FOLDER to be set. Using 'doc' as default!\n");
+ config_err("Error: GENERATE_QHP=YES requires QHP_VIRTUAL_FOLDER to be set. Using 'doc' as default!\n");
Config_getString("QHP_VIRTUAL_FOLDER")="doc";
}
}
@@ -1438,7 +1501,7 @@ void Config::check()
if (!mathJaxFormat.isEmpty() && mathJaxFormat!="HTML-CSS" &&
mathJaxFormat!="NativeMML" && mathJaxFormat!="SVG")
{
- config_err("error: Unsupported value for MATHJAX_FORMAT: Should be one of HTML-CSS, NativeMML, or SVG\n");
+ config_err("Error: Unsupported value for MATHJAX_FORMAT: Should be one of HTML-CSS, NativeMML, or SVG\n");
Config_getEnum("MATHJAX_FORMAT")="HTML-CSS";
}
@@ -1484,7 +1547,7 @@ void Config::check()
if (!b6) s6=" EXTRACT_PACKAGE = YES (was NO)\n"; else s6="";
- config_err("warning: enabling OPTIMIZE_OUTPUT_VHDL assumes the following settings:\n"
+ config_err("Warning: enabling OPTIMIZE_OUTPUT_VHDL assumes the following settings:\n"
"%s%s%s%s%s%s",s1,s2,s3,s4,s5,s6
);
@@ -1506,6 +1569,24 @@ void Config::init()
option->init();
option = m_options->next();
}
+
+ // sanity check if all depends relations are valid
+ option = m_options->first();
+ while (option)
+ {
+ QCString depName = option->dependsOn();
+ if (!depName.isEmpty())
+ {
+ ConfigOption * opt = Config::instance()->get(depName);
+ if (opt==0)
+ {
+ config_err("Warning: Config option '%s' has invalid depends relation on unknown option '%s'\n",
+ option->name().data(),depName.data());
+ exit(1);
+ }
+ }
+ option = m_options->next();
+ }
}
void Config::create()
@@ -1547,7 +1628,7 @@ static QCString configFileToString(const char *name)
QFileInfo fi(name);
if (!fi.exists() || !fi.isFile())
{
- config_err("error: file `%s' not found\n",name);
+ config_err("Error: file `%s' not found\n",name);
return "";
}
f.setName(name);
@@ -1568,7 +1649,7 @@ static QCString configFileToString(const char *name)
}
if (!fileOpened)
{
- config_err("error: cannot open file `%s' for reading\n",name);
+ config_err("Error: cannot open file `%s' for reading\n",name);
}
return "";
}
diff --git a/src/config.xml b/src/config.xml
index a75ff80..0b67283 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -49,9 +49,9 @@ The default language is English, other supported languages are:
Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
-messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
-Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
-Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian,
+Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic,
+Slovak, Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
'>
<value name='Afrikaans'/>
<value name='Arabic'/>
@@ -76,6 +76,7 @@ Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
<value name='Japanese-en'/>
<value name='Korean'/>
<value name='Korean-en'/>
+ <value name='Latvian'/>
<value name='Norwegian'/>
<value name='Macedonian'/>
<value name='Persian'/>
@@ -261,10 +262,10 @@ can mix doxygen, HTML, and XML commands with Markdown formatting.
Disable only in case of backward compatibilities issues.
' defval='1'/>
<option type='bool' id='AUTOLINK_SUPPORT' docs='
-When enabled doxygen tries to link words that correspond to documented classes,
-or namespaces to their corresponding documentation. Such a link can be
-prevented in individual cases by by putting a % sign in front of the word or
-globally by setting AUTOLINK_SUPPORT to NO.
+When enabled doxygen tries to link words that correspond to documented
+classes, or namespaces to their corresponding documentation. Such a link can
+be prevented in individual cases by by putting a % sign in front of the word
+or globally by setting AUTOLINK_SUPPORT to NO.
' defval='1'/>
<option type='bool' id='BUILTIN_STL_SUPPORT' docs='
If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
@@ -312,11 +313,12 @@ section (for LaTeX and RTF).
' defval='0'/>
<option type='bool' id='INLINE_SIMPLE_STRUCTS' docs='
When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and
-unions with only public data fields will be shown inline in the documentation
-of the scope in which they are defined (i.e. file, namespace, or group
-documentation), provided this scope is documented. If set to NO (the default),
-structs, classes, and unions are shown on a separate page (for HTML and Man
-pages) or section (for LaTeX and RTF).' defval='0'/>
+unions with only public data fields or simple typedef fields will be shown
+inline in the documentation of the scope in which they are defined (i.e. file,
+namespace, or group documentation), provided this scope is documented. If set
+to NO (the default), structs, classes, and unions are shown on a separate
+page (for HTML and Man pages) or section (for LaTeX and RTF).
+' defval='0'/>
<option type='bool' id='TYPEDEF_HIDES_STRUCT' docs='
When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
is documented as struct, union, or enum with the name of the typedef. So
@@ -326,30 +328,15 @@ namespace, or class. And the struct will be named TypeS. This can typically
be useful for C code in case the coding convention dictates that all compound
types are typedef&apos;ed and only the typedef is referenced, never the tag name.
' defval='0'/>
- <option type='int' id='SYMBOL_CACHE_SIZE' docs='
-The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
-determine which symbols to keep in memory and which to flush to disk.
-When the cache is full, less often used symbols will be written to disk.
-For small to medium size projects (&lt;1000 input files) the default value is
-probably good enough. For larger projects a too small cache size can cause
-doxygen to be busy swapping symbols to and from disk most of the time
-causing a significant performance penalty.
-If the system has enough physical memory increasing the cache will improve the
-performance by keeping more symbols in memory. Note that the value works on
-a logarithmic scale so increasing the size by one will roughly double the
-memory usage. The cache size is given by this formula:
-2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
-corresponding to a cache size of 2^16 = 65536 symbols.
-' minval='0' maxval='9' defval='0'/>
<option type='int' id='LOOKUP_CACHE_SIZE' docs='
-Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be
-set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given
-their name and scope. Since this can be an expensive process and often the
-same symbol appear multiple times in the code, doxygen keeps a cache of
-pre-resolved symbols. If the cache is too small doxygen will become slower.
-If the cache is too large, memory is wasted. The cache size is given by this
-formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,
-corresponding to a cache size of 2^16 = 65536 symbols.
+The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+cache is used to resolve symbols given their name and scope. Since this can
+be an expensive process and often the same symbol appear multiple times in
+the code, doxygen keeps a cache of pre-resolved symbols. If the cache is too
+small doxygen will become slower. If the cache is too large, memory is wasted.
+The cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid
+range is 0..9, the default is 0, corresponding to a cache size of 2^16 = 65536
+symbols.
' minval='0' maxval='9' defval='0'/>
</group>
<group name='Build' docs='Build related configuration options'>
@@ -357,7 +344,7 @@ corresponding to a cache size of 2^16 = 65536 symbols.
If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
documentation are documented, even if no documentation was available.
Private class members and static file members will be hidden unless
-the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+the EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES
' defval='0'/>
<option type='bool' id='EXTRACT_PRIVATE' docs='
If the EXTRACT_PRIVATE tag is set to YES all private members of a class
@@ -734,8 +721,10 @@ invoke to filter for each input file. Doxygen will invoke the filter program
by executing (via popen()) the command &lt;filter&gt; &lt;input-file&gt;, where &lt;filter&gt;
is the value of the INPUT_FILTER tag, and &lt;input-file&gt; is the name of an
input file. Doxygen will then use the output that the filter program writes
-to standard output. If FILTER_PATTERNS is specified, this tag will be
-ignored.
+to standard output. If FILTER_PATTERNS is specified, this tag will be ignored.
+Note that the filter must not add or remove lines; it is applied before the
+code is scanned, but not when the output code is generated. If lines are added
+or removed, the anchors will not be placed correctly.
' defval=''/>
<option type='list' id='FILTER_PATTERNS' format='string' docs='
The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
@@ -760,9 +749,9 @@ FILTER_SOURCE_FILES is enabled.
' depends='FILTER_SOURCE_FILES'/>
<option type='string' id='USE_MDFILE_AS_MAINPAGE' format='string' docs='
If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that
-is part of the input, its contents will be placed on the main page (index.html).
-This can be useful if you have a project on for instance GitHub and want reuse
-the introduction page also for the doxygen output.
+is part of the input, its contents will be placed on the main page
+(index.html). This can be useful if you have a project on for instance GitHub
+and want reuse the introduction page also for the doxygen output.
' defval=''/>
</group>
<group name='Source Browser' docs='configuration options related to source browsing'>
@@ -809,6 +798,18 @@ If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
will generate a verbatim copy of the header file for each class for
which an include is specified. Set to NO to disable this.
' defval='1'/>
+ <option type='bool' id='CLANG_ASSISTED_PARSING' setting='USE_LIBCLANG' docs='
+If CLANG_ASSISTED_PARSING is set to YES, then doxygen will use the clang parser
+for more acurate parsing at the cost of reduced performance. This can be
+particularly helpful with template rich C++ code for which doxygen&apos;s built-in
+parser lacks the necessairy type information.
+' defval='0'/>
+ <option type='list' id='CLANG_OPTIONS' setting='USE_LIBCLANG' docs='
+If clang assisted parsing is enabled you can provide the compiler with command
+line options that you would normally use when invoking the compiler. Note that
+the include paths will already be set by doxygen for the files and directories
+specified at INPUT and INCLUDE_PATH.
+' defval='' depends='CLANG_ASSISTED_PARSING'/>
</group>
<group name='Index' docs='configuration options related to the alphabetical class index'>
<option type='bool' id='ALPHABETICAL_INDEX' docs='
@@ -820,13 +821,13 @@ contains a lot of classes, structs, unions or interfaces.
If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
in which this list will be split (can be a number in the range [1..20])
-' minval='1' maxval='20' defval='5'/>
+' minval='1' maxval='20' defval='5' depends='ALPHABETICAL_INDEX'/>
<option type='list' id='IGNORE_PREFIX' format='string' docs='
In case all classes in a project start with a common prefix, all
classes will be put under the same header in the alphabetical index.
The IGNORE_PREFIX tag can be used to specify one or more prefixes that
should be ignored while generating the index headers.
-'>
+' depends='ALPHABETICAL_INDEX'>
</option>
</group>
<group name='HTML' docs='configuration options related to the HTML output'>
@@ -882,7 +883,7 @@ the output directory.
The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
other source files which should be copied to the HTML output directory. Note
that these files will be copied to the base HTML output directory. Use the
-$relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+$relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
files. In the HTML_STYLESHEET file, use the file name only. Also note that
the files will be copied as-is; there are no commands or markers available.
' depends='GENERATE_HTML'/>
@@ -907,7 +908,7 @@ the luminance component of the colors in the HTML output. Values below
the output darker. The value divided by 100 is the actual gamma applied,
so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
and 100 does not change the gamma.
-' minval='40' maxval='240' defval='80'/>
+' minval='40' maxval='240' defval='80' depends='GENERATE_HTML'/>
<option type='bool' id='HTML_TIMESTAMP' docs='
If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
page will contain the date and time when the page was generated. Setting
@@ -927,7 +928,7 @@ visible (unless a fully collapsed tree already exceeds this amount).
So setting the number of entries 1 will produce a full collapsed tree by
default. 0 is a special value representing an infinite number of entries
and will result in a full expanded tree by default.
-' minval='0' maxval='9999' defval='100'/>
+' minval='0' maxval='9999' defval='100' depends='GENERATE_HTML'/>
<option type='bool' id='GENERATE_DOCSET' docs='
If the GENERATE_DOCSET tag is set to YES, additional index files
will be generated that can be used as input for Apple&apos;s Xcode 3
@@ -1111,13 +1112,13 @@ rendering instead of using prerendered bitmaps. Use this if you do not
have LaTeX installed or if you want to formulas look prettier in the HTML
output. When enabled you may also need to install MathJax separately and
configure the path to it using the MATHJAX_RELPATH option.
-' defval='0'/>
+' defval='0' depends='GENERATE_HTML'/>
<option type='enum' id='MATHJAX_FORMAT' defval='HTML-CSS' docs='
When MathJax is enabled you can set the default output format to be used for
-thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and
+the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and
SVG. The default value is HTML-CSS, which is slower, but has the best
compatibility.
-'>
+' depends='USE_MATHJAX'>
<value name="HTML-CSS"/>
<value name="NativeMML"/>
<value name="SVG"/>
@@ -1131,12 +1132,17 @@ MATHJAX_RELPATH should be ../mathjax. The default value points to
the MathJax Content Delivery Network so you can quickly see the result without
installing MathJax. However, it is strongly recommended to install a local
copy of MathJax from http://www.mathjax.org before deployment.
-' defval='http://cdn.mathjax.org/mathjax/latest'/>
+' defval='http://cdn.mathjax.org/mathjax/latest' depends='USE_MATHJAX'/>
<option type='list' id='MATHJAX_EXTENSIONS' format='string' docs='
The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
names that should be enabled during MathJax rendering.
' depends='USE_MATHJAX'>
</option>
+ <option type='string' id='MATHJAX_CODEFILE' format='string' docs='
+The MATHJAX_CODEFILE tag can be used to specify a file with javascript
+pieces of code that will be used on startup of the MathJax code.
+' depends='USE_MATHJAX'>
+ </option>
<option type='bool' id='SEARCHENGINE' docs='
When the SEARCHENGINE tag is enabled doxygen will generate a search box
for the HTML output. The underlying search engine uses javascript
@@ -1161,8 +1167,8 @@ script for searching. Instead the search results are written to an XML file
which needs to be processed by an external indexer. Doxygen will invoke an
external search engine pointed to by the SEARCHENGINE_URL option to obtain
the search results. Doxygen ships with an example indexer (doxyindexer) and
-search engine (doxysearch.cgi) which are based on the open source search engine
-library Xapian. See the manual for configuration details.
+search engine (doxysearch.cgi) which are based on the open source search
+engine library Xapian. See the manual for configuration details.
' defval='0' depends='SEARCHENGINE'/>
<option type='string' id='SEARCHENGINE_URL' docs='
The SEARCHENGINE_URL should point to a search engine hosted by a web server
@@ -1176,14 +1182,19 @@ When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
search data is written to a file for indexing by an external tool. With the
SEARCHDATA_FILE tag the name of this file can be specified.
' defval='searchdata.xml' depends='SEARCHENGINE'/>
+ <option type='string' id='EXTERNAL_SEARCH_ID' docs='
+When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the
+EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+projects and redirect the results back to the right project.
+' defval='' depends='SEARCHENGINE'/>
<option type='list' id='EXTRA_SEARCH_MAPPINGS' docs='
-The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through other
-doxygen projects that are not otherwise connected via tags files, but are
-all added to the same search index. Each project needs to have a tag file set
-via GENERATE_TAGFILE. The search mapping then maps the name of the tag file
-to a relative location where the documentation can be found, similar to the
-TAGFILES option but without actually processing the tag file.
-The format is: EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+projects other than the one defined by this configuration file, but that are
+all added to the same external search index. Each project needs to have a
+unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id
+of to a relative location where the documentation can be found.
+The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ...
' defval='0' depends='SEARCHENGINE'/>
</group>
<group name='LaTeX' docs='configuration options related to the LaTeX output'>
@@ -1216,10 +1227,9 @@ save some trees in general.
<option type='enum' id='PAPER_TYPE' defval='a4' docs='
The PAPER_TYPE tag can be used to set the paper type that is used
by the printer. Possible values are: a4, letter, legal and
-executive. If left blank a4wide will be used.
+executive. If left blank a4 will be used.
' depends='GENERATE_LATEX'>
<value name='a4'/>
- <value name='a4wide'/>
<value name='letter'/>
<value name='legal'/>
<value name='executive'/>
@@ -1241,6 +1251,12 @@ the generated latex document. The footer should contain everything after
the last chapter. If it is left blank doxygen will generate a
standard footer. Notice: only use this tag if you know what you are doing!
' defval='' depends='GENERATE_LATEX'/>
+ <option type='list' id='LATEX_EXTRA_FILES' format='file' docs='
+The LATEX_EXTRA_FILES tag can be used to specify one or more extra images
+or other source files which should be copied to the LaTeX output directory.
+Note that the files will be copied as-is; there are no commands or markers
+available.
+' depends='GENERATE_LATEX'/>
<option type='bool' id='PDF_HYPERLINKS' docs='
If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
is prepared for conversion to pdf (using ps2pdf). The pdf file will
@@ -1273,7 +1289,7 @@ such as SOURCE_BROWSER.
The LATEX_BIB_STYLE tag can be used to specify the style to use for the
bibliography, e.g. plainnat, or ieeetr. The default style is &quot;plain&quot;. See
http://en.wikipedia.org/wiki/BibTeX for more info.
-' defval='plain'/>
+' defval='plain' depends='GENERATE_LATEX'/>
</group>
<group name='RTF' docs='configuration options related to the RTF output'>
<option type='bool' id='GENERATE_RTF' docs='
@@ -1359,6 +1375,17 @@ and cross-referencing information) to the XML output. Note that
enabling this will significantly increase the size of the XML output.
' defval='1' depends='GENERATE_XML'/>
</group>
+ <group name='Docbook' docs='configuration options related to the DOCBOOK output'>
+ <option type='bool' id='GENERATE_DOCBOOK' docs='
+If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files
+that can be used to generate PDF.
+' defval='0'/>
+ <option type='string' id='DOCBOOK_OUTPUT' format='dir' docs='
+The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK pages will be put.
+If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+front of it. If left blank docbook will be used as the default path.
+' defval='docbook' depends='GENERATE_DOCBOOK'/>
+ </group>
<group name='DEF' docs='configuration options for the AutoGen Definitions output'>
<option type='bool' id='GENERATE_AUTOGEN_DEF' docs='
If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
@@ -1368,6 +1395,19 @@ documentation. Note that this feature is still experimental
and incomplete at the moment.
' defval='0'/>
</group>
+<!--
+ <group name='Sqlite3' docs='configuration options related to Sqlite3 output'>
+ <option type='bool' id='GENERATE_SQLITE3' docs='
+If the GENERATE_SQLITE3 tag is set to YES doxygen will generate an
+sqlite database with symbols found by doxygen stored in tables.
+' defval='0'/>
+ <option type='string' id='SQLITE3_OUTPUT' format='dir' docs='
+The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be put.
+If a relative path is entered the value of OUTPUT_DIRECTORY will be
+put in front of it. If left blank sqlite3 will be used as the default path.
+' defval='' depends='GENERATE_SQLITE3'/>
+ </group>
+-->
<group name='PerlMod' docs='configuration options related to the Perl module output'>
<option type='bool' id='GENERATE_PERLMOD' docs='
If the GENERATE_PERLMOD tag is set to YES Doxygen will
@@ -1419,7 +1459,7 @@ pointed to by INCLUDE_PATH will be searched when a #include is found.
The INCLUDE_PATH tag can be used to specify one or more directories that
contain include files that are not input files but should be processed by
the preprocessor.
-' depends='ENABLE_PREPROCESSING'>
+' depends='SEARCH_INCLUDES'>
</option>
<option type='list' id='INCLUDE_FILE_PATTERNS' format='string' docs='
You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
@@ -1481,6 +1521,11 @@ If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
in the modules index. If set to NO, only the current project&apos;s groups will
be listed.
' defval='1'/>
+ <option type='bool' id='EXTERNAL_PAGES' docs='
+If the EXTERNAL_PAGES tag is set to YES all external pages will be listed
+in the related pages index. If set to NO, only the current project&apos;s
+pages will be listed.
+' defval='1'/>
<option type='string' id='PERL_PATH' format='dir' docs='
The PERL_PATH should be the absolute path and name of the perl script
interpreter (i.e. the result of `which perl&apos;).
@@ -1519,7 +1564,7 @@ allowed to run in parallel. When set to 0 (the default) doxygen will
base this on the number of processors available in the system. You can set it
explicitly to a value larger than 0 to get control over the balance
between CPU load and processing speed.
-' defval='0' minval='0' maxval='32'/>
+' defval='0' minval='0' maxval='32' depends='HAVE_DOT'/>
<option type='string' id='DOT_FONTNAME' format='string' docs='
By default doxygen will use the Helvetica font for all dot files that
doxygen generates. When you want a differently looking font you can specify
@@ -1563,7 +1608,7 @@ If the UML_LOOK tag is enabled, the fields and methods are shown inside
the class node. If there are many fields or methods and many nodes the
graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS
threshold limits the number of items for each type to make the size more
-managable. Set this to 0 for no limit. Note that the threshold may be
+manageable. Set this to 0 for no limit. Note that the threshold may be
exceeded by 50% before the limit is enforced.
' defval='10' minval='0' maxval='100' depends='HAVE_DOT'/>
<option type='bool' id='TEMPLATE_RELATIONS' docs='
@@ -1699,5 +1744,6 @@ the various graphs.
<option type='obsolete' id='USE_INLINE_TREES'/>
<option type='obsolete' id='SHOW_DIRECTORIES'/>
<option type='obsolete' id='HTML_ALIGN_MEMBERS'/>
+ <option type='obsolete' id='SYMBOL_CACHE_SIZE'/>
</group>
</doxygenconfig>
diff --git a/src/configgen.py b/src/configgen.py
index 5af201f..495f290 100755
--- a/src/configgen.py
+++ b/src/configgen.py
@@ -1,6 +1,6 @@
# python script to generate configoptions.cpp from config.xml
#
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
@@ -29,11 +29,14 @@ def parseOption(node):
defval = node.getAttribute('defval')
adefval = node.getAttribute('altdefval')
depends = node.getAttribute('depends')
+ setting = node.getAttribute('setting')
# replace \ by \\, replace " by \", and ' ' by a newline with end string and start string at next line
docC = doc.strip().replace('\\','\\\\').replace('"','\\"').replace(' ','\\n"\n "')
+ if len(setting)>0:
+ print "#if %s" % (setting)
print " //----"
if type=='bool':
- if len(adefval)>0:
+ if len(adefval)>0:
enabled = adefval
elif defval=='1':
enabled = "TRUE"
@@ -94,6 +97,10 @@ def parseOption(node):
print " cl->setWidgetType(ConfigList::FileAndDir);"
elif type=='obsolete':
print " cfg->addObsolete(\"%s\");" % (name)
+ if len(setting)>0:
+ print "#else"
+ print " cfg->addDisabled(\"%s\");" % (name)
+ print "#endif"
@@ -121,6 +128,7 @@ def main():
print "#include \"configoptions.h\""
print "#include \"config.h\""
print "#include \"portable.h\""
+ print "#include \"settings.h\""
print ""
print "void addConfigOptions(Config *cfg)"
print "{"
diff --git a/src/configoptions.cpp b/src/configoptions.cpp
index 846142c..11a7f43 100644
--- a/src/configoptions.cpp
+++ b/src/configoptions.cpp
@@ -6,6 +6,7 @@
#include "configoptions.h"
#include "config.h"
#include "portable.h"
+#include "settings.h"
void addConfigOptions(Config *cfg)
{
@@ -90,9 +91,9 @@ void addConfigOptions(Config *cfg)
"Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,\n"
"Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,\n"
"Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English\n"
- "messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,\n"
- "Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,\n"
- "Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.",
+ "messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian,\n"
+ "Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic,\n"
+ "Slovak, Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.",
"English"
);
ce->addValue("Afrikaans");
@@ -118,6 +119,7 @@ void addConfigOptions(Config *cfg)
ce->addValue("Japanese-en");
ce->addValue("Korean");
ce->addValue("Korean-en");
+ ce->addValue("Latvian");
ce->addValue("Norwegian");
ce->addValue("Macedonian");
ce->addValue("Persian");
@@ -365,10 +367,10 @@ void addConfigOptions(Config *cfg)
//----
cb = cfg->addBool(
"AUTOLINK_SUPPORT",
- "When enabled doxygen tries to link words that correspond to documented classes,\n"
- "or namespaces to their corresponding documentation. Such a link can be\n"
- "prevented in individual cases by by putting a % sign in front of the word or\n"
- "globally by setting AUTOLINK_SUPPORT to NO.",
+ "When enabled doxygen tries to link words that correspond to documented\n"
+ "classes, or namespaces to their corresponding documentation. Such a link can\n"
+ "be prevented in individual cases by by putting a % sign in front of the word\n"
+ "or globally by setting AUTOLINK_SUPPORT to NO.",
TRUE
);
//----
@@ -440,11 +442,11 @@ void addConfigOptions(Config *cfg)
cb = cfg->addBool(
"INLINE_SIMPLE_STRUCTS",
"When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and\n"
- "unions with only public data fields will be shown inline in the documentation\n"
- "of the scope in which they are defined (i.e. file, namespace, or group\n"
- "documentation), provided this scope is documented. If set to NO (the default),\n"
- "structs, classes, and unions are shown on a separate page (for HTML and Man\n"
- "pages) or section (for LaTeX and RTF).",
+ "unions with only public data fields or simple typedef fields will be shown\n"
+ "inline in the documentation of the scope in which they are defined (i.e. file,\n"
+ "namespace, or group documentation), provided this scope is documented. If set\n"
+ "to NO (the default), structs, classes, and unions are shown on a separate\n"
+ "page (for HTML and Man pages) or section (for LaTeX and RTF).",
FALSE
);
//----
@@ -461,33 +463,15 @@ void addConfigOptions(Config *cfg)
);
//----
ci = cfg->addInt(
- "SYMBOL_CACHE_SIZE",
- "The SYMBOL_CACHE_SIZE determines the size of the internal cache use to\n"
- "determine which symbols to keep in memory and which to flush to disk.\n"
- "When the cache is full, less often used symbols will be written to disk.\n"
- "For small to medium size projects (<1000 input files) the default value is\n"
- "probably good enough. For larger projects a too small cache size can cause\n"
- "doxygen to be busy swapping symbols to and from disk most of the time\n"
- "causing a significant performance penalty.\n"
- "If the system has enough physical memory increasing the cache will improve the\n"
- "performance by keeping more symbols in memory. Note that the value works on\n"
- "a logarithmic scale so increasing the size by one will roughly double the\n"
- "memory usage. The cache size is given by this formula:\n"
- "2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,\n"
- "corresponding to a cache size of 2^16 = 65536 symbols.",
- 0,9,0
- );
- //----
- ci = cfg->addInt(
"LOOKUP_CACHE_SIZE",
- "Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be\n"
- "set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given\n"
- "their name and scope. Since this can be an expensive process and often the\n"
- "same symbol appear multiple times in the code, doxygen keeps a cache of\n"
- "pre-resolved symbols. If the cache is too small doxygen will become slower.\n"
- "If the cache is too large, memory is wasted. The cache size is given by this\n"
- "formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0,\n"
- "corresponding to a cache size of 2^16 = 65536 symbols.",
+ "The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This\n"
+ "cache is used to resolve symbols given their name and scope. Since this can\n"
+ "be an expensive process and often the same symbol appear multiple times in\n"
+ "the code, doxygen keeps a cache of pre-resolved symbols. If the cache is too\n"
+ "small doxygen will become slower. If the cache is too large, memory is wasted.\n"
+ "The cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid\n"
+ "range is 0..9, the default is 0, corresponding to a cache size of 2^16 = 65536\n"
+ "symbols.",
0,9,0
);
//---------------------------------------------------------------------------
@@ -500,7 +484,7 @@ void addConfigOptions(Config *cfg)
"If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n"
"documentation are documented, even if no documentation was available.\n"
"Private class members and static file members will be hidden unless\n"
- "the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES",
+ "the EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES",
FALSE
);
//----
@@ -1032,8 +1016,10 @@ void addConfigOptions(Config *cfg)
"is the value of the INPUT_FILTER tag, and <input-file> is the name of an\n"
"input file. Doxygen will then use the output that the filter program writes\n"
"to standard output.\n"
- "If FILTER_PATTERNS is specified, this tag will be\n"
- "ignored."
+ "If FILTER_PATTERNS is specified, this tag will be ignored.\n"
+ "Note that the filter must not add or remove lines; it is applied before the\n"
+ "code is scanned, but not when the output code is generated. If lines are added\n"
+ "or removed, the anchors will not be placed correctly."
);
cs->setWidgetType(ConfigString::File);
//----
@@ -1070,9 +1056,9 @@ void addConfigOptions(Config *cfg)
cs = cfg->addString(
"USE_MDFILE_AS_MAINPAGE",
"If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that\n"
- "is part of the input, its contents will be placed on the main page (index.html).\n"
- "This can be useful if you have a project on for instance GitHub and want reuse\n"
- "the introduction page also for the doxygen output."
+ "is part of the input, its contents will be placed on the main page\n"
+ "(index.html). This can be useful if you have a project on for instance GitHub\n"
+ "and want reuse the introduction page also for the doxygen output."
);
//---------------------------------------------------------------------------
cfg->addInfo("Source Browser","configuration options related to source browsing");
@@ -1147,6 +1133,32 @@ void addConfigOptions(Config *cfg)
"which an include is specified. Set to NO to disable this.",
TRUE
);
+#if USE_LIBCLANG
+ //----
+ cb = cfg->addBool(
+ "CLANG_ASSISTED_PARSING",
+ "If CLANG_ASSISTED_PARSING is set to YES, then doxygen will use the clang parser\n"
+ "for more acurate parsing at the cost of reduced performance. This can be\n"
+ "particularly helpful with template rich C++ code for which doxygen's built-in\n"
+ "parser lacks the necessairy type information.",
+ FALSE
+ );
+#else
+ cfg->addDisabled("CLANG_ASSISTED_PARSING");
+#endif
+#if USE_LIBCLANG
+ //----
+ cl = cfg->addList(
+ "CLANG_OPTIONS",
+ "If clang assisted parsing is enabled you can provide the compiler with command\n"
+ "line options that you would normally use when invoking the compiler. Note that\n"
+ "the include paths will already be set by doxygen for the files and directories\n"
+ "specified at INPUT and INCLUDE_PATH."
+ );
+ cl->addDependency("CLANG_ASSISTED_PARSING");
+#else
+ cfg->addDisabled("CLANG_OPTIONS");
+#endif
//---------------------------------------------------------------------------
cfg->addInfo("Index","configuration options related to the alphabetical class index");
//---------------------------------------------------------------------------
@@ -1167,6 +1179,7 @@ void addConfigOptions(Config *cfg)
"in which this list will be split (can be a number in the range [1..20])",
1,20,5
);
+ ci->addDependency("ALPHABETICAL_INDEX");
//----
cl = cfg->addList(
"IGNORE_PREFIX",
@@ -1175,6 +1188,7 @@ void addConfigOptions(Config *cfg)
"The IGNORE_PREFIX tag can be used to specify one or more prefixes that\n"
"should be ignored while generating the index headers."
);
+ cl->addDependency("ALPHABETICAL_INDEX");
//---------------------------------------------------------------------------
cfg->addInfo("HTML","configuration options related to the HTML output");
//---------------------------------------------------------------------------
@@ -1261,7 +1275,7 @@ void addConfigOptions(Config *cfg)
"The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n"
"other source files which should be copied to the HTML output directory. Note\n"
"that these files will be copied to the base HTML output directory. Use the\n"
- "$relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n"
+ "$relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n"
"files. In the HTML_STYLESHEET file, use the file name only. Also note that\n"
"the files will be copied as-is; there are no commands or markers available."
);
@@ -1300,6 +1314,7 @@ void addConfigOptions(Config *cfg)
"and 100 does not change the gamma.",
40,240,80
);
+ ci->addDependency("GENERATE_HTML");
//----
cb = cfg->addBool(
"HTML_TIMESTAMP",
@@ -1331,6 +1346,7 @@ void addConfigOptions(Config *cfg)
"and will result in a full expanded tree by default.",
0,9999,100
);
+ ci->addDependency("GENERATE_HTML");
//----
cb = cfg->addBool(
"GENERATE_DOCSET",
@@ -1630,11 +1646,12 @@ void addConfigOptions(Config *cfg)
"configure the path to it using the MATHJAX_RELPATH option.",
FALSE
);
+ cb->addDependency("GENERATE_HTML");
//----
ce = cfg->addEnum(
"MATHJAX_FORMAT",
"When MathJax is enabled you can set the default output format to be used for\n"
- "thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and\n"
+ "the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and\n"
"SVG. The default value is HTML-CSS, which is slower, but has the best\n"
"compatibility.",
"HTML-CSS"
@@ -1642,6 +1659,7 @@ void addConfigOptions(Config *cfg)
ce->addValue("HTML-CSS");
ce->addValue("NativeMML");
ce->addValue("SVG");
+ ce->addDependency("USE_MATHJAX");
//----
cs = cfg->addString(
"MATHJAX_RELPATH",
@@ -1656,6 +1674,7 @@ void addConfigOptions(Config *cfg)
"copy of MathJax from http://www.mathjax.org before deployment."
);
cs->setDefaultValue("http://cdn.mathjax.org/mathjax/latest");
+ cs->addDependency("USE_MATHJAX");
//----
cl = cfg->addList(
"MATHJAX_EXTENSIONS",
@@ -1664,6 +1683,13 @@ void addConfigOptions(Config *cfg)
);
cl->addDependency("USE_MATHJAX");
//----
+ cs = cfg->addString(
+ "MATHJAX_CODEFILE",
+ "The MATHJAX_CODEFILE tag can be used to specify a file with javascript\n"
+ "pieces of code that will be used on startup of the MathJax code."
+ );
+ cs->addDependency("USE_MATHJAX");
+ //----
cb = cfg->addBool(
"SEARCHENGINE",
"When the SEARCHENGINE tag is enabled doxygen will generate a search box\n"
@@ -1697,8 +1723,8 @@ void addConfigOptions(Config *cfg)
"which needs to be processed by an external indexer. Doxygen will invoke an\n"
"external search engine pointed to by the SEARCHENGINE_URL option to obtain\n"
"the search results. Doxygen ships with an example indexer (doxyindexer) and\n"
- "search engine (doxysearch.cgi) which are based on the open source search engine\n"
- "library Xapian. See the manual for configuration details.",
+ "search engine (doxysearch.cgi) which are based on the open source search\n"
+ "engine library Xapian. See the manual for configuration details.",
FALSE
);
cb->addDependency("SEARCHENGINE");
@@ -1723,16 +1749,23 @@ void addConfigOptions(Config *cfg)
cs->setWidgetType(ConfigString::File);
cs->addDependency("SEARCHENGINE");
//----
+ cs = cfg->addString(
+ "EXTERNAL_SEARCH_ID",
+ "When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the\n"
+ "EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is\n"
+ "useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple\n"
+ "projects and redirect the results back to the right project."
+ );
+ cs->addDependency("SEARCHENGINE");
+ //----
cl = cfg->addList(
"EXTRA_SEARCH_MAPPINGS",
- "The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through other\n"
- "doxygen projects that are not otherwise connected via tags files, but are\n"
- "all added to the same search index. Each project needs to have a tag file set\n"
- "via GENERATE_TAGFILE. The search mapping then maps the name of the tag file\n"
- "to a relative location where the documentation can be found,\n"
- "similar to the\n"
- "TAGFILES option but without actually processing the tag file.\n"
- "The format is: EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ..."
+ "The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen\n"
+ "projects other than the one defined by this configuration file, but that are\n"
+ "all added to the same external search index. Each project needs to have a\n"
+ "unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id\n"
+ "of to a relative location where the documentation can be found.\n"
+ "The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ..."
);
cl->addDependency("SEARCHENGINE");
//---------------------------------------------------------------------------
@@ -1792,11 +1825,10 @@ void addConfigOptions(Config *cfg)
"PAPER_TYPE",
"The PAPER_TYPE tag can be used to set the paper type that is used\n"
"by the printer. Possible values are: a4, letter, legal and\n"
- "executive. If left blank a4wide will be used.",
+ "executive. If left blank a4 will be used.",
"a4"
);
ce->addValue("a4");
- ce->addValue("a4wide");
ce->addValue("letter");
ce->addValue("legal");
ce->addValue("executive");
@@ -1829,6 +1861,16 @@ void addConfigOptions(Config *cfg)
cs->setWidgetType(ConfigString::File);
cs->addDependency("GENERATE_LATEX");
//----
+ cl = cfg->addList(
+ "LATEX_EXTRA_FILES",
+ "The LATEX_EXTRA_FILES tag can be used to specify one or more extra images\n"
+ "or other source files which should be copied to the LaTeX output directory.\n"
+ "Note that the files will be copied as-is; there are no commands or markers\n"
+ "available."
+ );
+ cl->addDependency("GENERATE_LATEX");
+ cl->setWidgetType(ConfigList::File);
+ //----
cb = cfg->addBool(
"PDF_HYPERLINKS",
"If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n"
@@ -1884,6 +1926,7 @@ void addConfigOptions(Config *cfg)
"http://en.wikipedia.org/wiki/BibTeX for more info."
);
cs->setDefaultValue("plain");
+ cs->addDependency("GENERATE_LATEX");
//---------------------------------------------------------------------------
cfg->addInfo("RTF","configuration options related to the RTF output");
//---------------------------------------------------------------------------
@@ -2033,6 +2076,27 @@ void addConfigOptions(Config *cfg)
);
cb->addDependency("GENERATE_XML");
//---------------------------------------------------------------------------
+ cfg->addInfo("Docbook","configuration options related to the DOCBOOK output");
+ //---------------------------------------------------------------------------
+
+ //----
+ cb = cfg->addBool(
+ "GENERATE_DOCBOOK",
+ "If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files\n"
+ "that can be used to generate PDF.",
+ FALSE
+ );
+ //----
+ cs = cfg->addString(
+ "DOCBOOK_OUTPUT",
+ "The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK pages will be put.\n"
+ "If a relative path is entered the value of OUTPUT_DIRECTORY will be put in\n"
+ "front of it. If left blank docbook will be used as the default path."
+ );
+ cs->setDefaultValue("docbook");
+ cs->setWidgetType(ConfigString::Dir);
+ cs->addDependency("GENERATE_DOCBOOK");
+ //---------------------------------------------------------------------------
cfg->addInfo("DEF","configuration options for the AutoGen Definitions output");
//---------------------------------------------------------------------------
@@ -2137,7 +2201,7 @@ void addConfigOptions(Config *cfg)
"contain include files that are not input files but should be processed by\n"
"the preprocessor."
);
- cl->addDependency("ENABLE_PREPROCESSING");
+ cl->addDependency("SEARCH_INCLUDES");
cl->setWidgetType(ConfigList::Dir);
//----
cl = cfg->addList(
@@ -2225,6 +2289,14 @@ void addConfigOptions(Config *cfg)
TRUE
);
//----
+ cb = cfg->addBool(
+ "EXTERNAL_PAGES",
+ "If the EXTERNAL_PAGES tag is set to YES all external pages will be listed\n"
+ "in the related pages index. If set to NO, only the current project's\n"
+ "pages will be listed.",
+ TRUE
+ );
+ //----
cs = cfg->addString(
"PERL_PATH",
"The PERL_PATH should be the absolute path and name of the perl script\n"
@@ -2283,6 +2355,7 @@ void addConfigOptions(Config *cfg)
"between CPU load and processing speed.",
0,32,0
);
+ ci->addDependency("HAVE_DOT");
//----
cs = cfg->addString(
"DOT_FONTNAME",
@@ -2355,7 +2428,7 @@ void addConfigOptions(Config *cfg)
"the class node. If there are many fields or methods and many nodes the\n"
"graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS\n"
"threshold limits the number of items for each type to make the size more\n"
- "managable. Set this to 0 for no limit. Note that the threshold may be\n"
+ "manageable. Set this to 0 for no limit. Note that the threshold may be\n"
"exceeded by 50% before the limit is enforced.",
0,100,10
);
@@ -2577,4 +2650,6 @@ void addConfigOptions(Config *cfg)
cfg->addObsolete("SHOW_DIRECTORIES");
//----
cfg->addObsolete("HTML_ALIGN_MEMBERS");
+ //----
+ cfg->addObsolete("SYMBOL_CACHE_SIZE");
}
diff --git a/src/configoptions.h b/src/configoptions.h
index 8bf94d5..179d751 100644
--- a/src/configoptions.h
+++ b/src/configoptions.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/constexp.h b/src/constexp.h
index 767ea66..60e4722 100644
--- a/src/constexp.h
+++ b/src/constexp.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/constexp.l b/src/constexp.l
index fda1f04..f72e99d 100644
--- a/src/constexp.l
+++ b/src/constexp.l
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/constexp.y b/src/constexp.y
index c8b35e5..f47e7c0 100644
--- a/src/constexp.y
+++ b/src/constexp.y
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -34,7 +34,7 @@
int cppExpYYerror(const char *s)
{
warn(g_constExpFileName,g_constExpLineNr,
- "warning: preprocessing issue while doing constant expression evaluation: %s",s);
+ "preprocessing issue while doing constant expression evaluation: %s",s);
return 0;
}
diff --git a/src/cppvalue.cpp b/src/cppvalue.cpp
index 69b8be4..7efb4f8 100644
--- a/src/cppvalue.cpp
+++ b/src/cppvalue.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/cppvalue.h b/src/cppvalue.h
index 7289ce0..3f3ac3a 100644
--- a/src/cppvalue.h
+++ b/src/cppvalue.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/dbusxmlscanner.cpp b/src/dbusxmlscanner.cpp
index 246bbe9..bfb5cd0 100644
--- a/src/dbusxmlscanner.cpp
+++ b/src/dbusxmlscanner.cpp
@@ -830,7 +830,9 @@ DBusXMLScanner::~DBusXMLScanner()
void DBusXMLScanner::parseInput(const char * fileName,
const char * /* fileBuf */,
- Entry * root)
+ Entry *root,
+ bool /*sameTranslationUnit*/,
+ QStrList & /*filesInSameTranslationUnit*/)
{
QFile inputFile(fileName);
diff --git a/src/dbusxmlscanner.h b/src/dbusxmlscanner.h
index e3eff03..a0ead5a 100644
--- a/src/dbusxmlscanner.h
+++ b/src/dbusxmlscanner.h
@@ -29,9 +29,13 @@ class DBusXMLScanner : public ParserInterface
public:
DBusXMLScanner();
virtual ~DBusXMLScanner();
+ void startTranslationUnit(const char *) {}
+ void finishTranslationUnit() {}
void parseInput(const char *fileName,
const char *fileBuf,
- Entry *root);
+ Entry *root,
+ bool sameTranslationUnit,
+ QStrList &filesInSameTranslationUnit);
bool needsPreprocessing(const QCString &extension);
diff --git a/src/debug.cpp b/src/debug.cpp
index da1233b..c962214 100644
--- a/src/debug.cpp
+++ b/src/debug.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/debug.h b/src/debug.h
index c3d78de..bcac588 100644
--- a/src/debug.h
+++ b/src/debug.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/declinfo.h b/src/declinfo.h
index 9486bad..3d8cb87 100644
--- a/src/declinfo.h
+++ b/src/declinfo.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/declinfo.l b/src/declinfo.l
index dd3f6f8..3e4ad4a 100644
--- a/src/declinfo.l
+++ b/src/declinfo.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/defargs.h b/src/defargs.h
index 9c6f209..1dbabdb 100644
--- a/src/defargs.h
+++ b/src/defargs.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/defargs.l b/src/defargs.l
index ce870d9..fa945f6 100644
--- a/src/defargs.l
+++ b/src/defargs.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -408,7 +408,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
g_curArgTypeName+=*yytext;
}
-<ReadFuncArgDef,CopyArgString>"->"|">="|">>" {
+<ReadFuncArgDef,CopyArgString>"<="|"->"|">="|">>"|"<<" {
g_curArgDefValue+=yytext;
}
<ReadFuncArgDef,CopyArgString,CopyRawString>. {
diff --git a/src/defgen.cpp b/src/defgen.cpp
index fedb4a0..4e0e5b8 100644
--- a/src/defgen.cpp
+++ b/src/defgen.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -96,6 +96,8 @@ void generateDEFForMember(MemberDef *md,
case MemberType_Variable: memType="variable"; break;
case MemberType_Typedef: memType="typedef"; break;
case MemberType_Enumeration: memType="enum"; break;
+ case MemberType_Interface: memType="interface"; break;
+ case MemberType_Service: memType="service"; break;
case MemberType_Function: memType="function"; isFunc=TRUE; break;
case MemberType_Signal: memType="signal"; isFunc=TRUE; break;
case MemberType_Friend: memType="friend"; isFunc=TRUE; break;
@@ -140,7 +142,7 @@ void generateDEFForMember(MemberDef *md,
if (isFunc) //function
{
ArgumentList *declAl = new ArgumentList;
- LockingPtr<ArgumentList> defAl = md->argumentList();
+ ArgumentList *defAl = md->argumentList();
stringToArgumentList(md->argsString(),declAl);
QCString fcnPrefix = " " + memPrefix + "param-";
@@ -216,7 +218,7 @@ void generateDEFForMember(MemberDef *md,
// TODO: exceptions, const volatile
if (md->memberType()==MemberType_Enumeration) // enum
{
- LockingPtr<MemberList> enumList = md->enumFieldList();
+ MemberList *enumList = md->enumFieldList();
if (enumList!=0)
{
MemberListIterator emli(*enumList);
@@ -244,8 +246,8 @@ void generateDEFForMember(MemberDef *md,
//printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
- LockingPtr<MemberSDict> mdict = md->getReferencesMembers();
- if (!mdict.isNull())
+ MemberSDict *mdict = md->getReferencesMembers();
+ if (mdict)
{
MemberSDict::Iterator mdi(*mdict);
MemberDef *rmd;
@@ -278,7 +280,7 @@ void generateDEFForMember(MemberDef *md,
} /* for (mdi.toFirst...) */
}
mdict = md->getReferencedByMembers();
- if (!mdict.isNull())
+ if (mdict)
{
MemberSDict::Iterator mdi(*mdict);
MemberDef *rmd;
@@ -428,6 +430,8 @@ void generateDEFForClass(ClassDef *cd,FTextStream &t)
if (numMembers>0)
{
generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_pubTypes),"public-type");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_interfaces),"interfaces");
+ generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_services),"services");
generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_pubMethods),"public-func");
generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_pubAttribs),"public-attrib");
generateDEFClassSection(cd,t,cd->getMemberList(MemberListType_pubSlots),"public-slot");
@@ -566,13 +570,13 @@ void generateDEF()
dir.setPath(QDir::currentDirPath());
if (!dir.mkdir(outputDirectory))
{
- err("error: tag OUTPUT_DIRECTORY: Output directory `%s' does not "
+ err("tag OUTPUT_DIRECTORY: Output directory `%s' does not "
"exist and cannot be created\n",outputDirectory.data());
exit(1);
}
- else if (!Config_getBool("QUIET"))
+ else
{
- err("notice: Output directory `%s' does not exist. "
+ msg("Notice: Output directory `%s' does not exist. "
"I have created it for you.\n", outputDirectory.data());
}
dir.cd(outputDirectory);
diff --git a/src/defgen.h b/src/defgen.h
index 5b26cd0..290a415 100644
--- a/src/defgen.h
+++ b/src/defgen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/define.cpp b/src/define.cpp
index e5dd154..76a64e1 100644
--- a/src/define.cpp
+++ b/src/define.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -22,6 +22,7 @@ Define::Define()
{
fileDef=0;
lineNr=1;
+ columnNr=1;
nargs=-1;
undef=FALSE;
varArgs=FALSE;
@@ -34,6 +35,7 @@ Define::Define(const Define &d)
{
//name=d.name; definition=d.definition; fileName=d.fileName;
lineNr=d.lineNr;
+ lineNr=d.columnNr;
nargs=d.nargs;
undef=d.undef;
varArgs=d.varArgs;
diff --git a/src/define.h b/src/define.h
index c5b5274..843ecec 100644
--- a/src/define.h
+++ b/src/define.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -40,6 +40,7 @@ class Define
QCString anchor;
FileDef *fileDef;
int lineNr;
+ int columnNr;
int nargs;
bool undef;
bool varArgs;
@@ -55,7 +56,7 @@ class DefineList : public QList<Define>
~DefineList() {}
int compareItems(QCollection::Item i1,QCollection::Item i2)
{
- return stricmp(((Define *)i1)->name,((Define *)i2)->name);
+ return qstricmp(((Define *)i1)->name,((Define *)i2)->name);
}
};
@@ -68,7 +69,7 @@ class DefineName : public QList<Define>
const char *nameString() const { return name; }
int compareItems(QCollection::Item i1,QCollection::Item i2)
{
- return stricmp(((Define *)i1)->name,((Define *)i2)->name);
+ return qstricmp(((Define *)i1)->name,((Define *)i2)->name);
}
private:
@@ -83,7 +84,7 @@ class DefineNameList : public QList<DefineName>
~DefineNameList() {}
int compareItems(QCollection::Item i1,QCollection::Item i2)
{
- return stricmp(((DefineName *)i1)->nameString(),
+ return qstricmp(((DefineName *)i1)->nameString(),
((DefineName *)i2)->nameString());
}
};
diff --git a/src/definition.cpp b/src/definition.cpp
index 2833be7..fe1afb7 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -84,6 +84,8 @@ class DefinitionImpl
QCString defFileExt;
SrcLangExt lang;
+
+ QCString id; // clang unique id
};
DefinitionImpl::DefinitionImpl()
@@ -277,12 +279,13 @@ void Definition::removeFromMap(Definition *d)
}
}
-Definition::Definition(const char *df,int dl,
+Definition::Definition(const char *df,int dl,int dc,
const char *name,const char *b,
const char *d,bool isSymbol)
{
m_name = name;
m_defLine = dl;
+ m_defColumn = dc;
m_impl = new DefinitionImpl;
m_impl->init(df,name);
m_isSymbol = isSymbol;
@@ -295,7 +298,7 @@ Definition::Definition(const char *df,int dl,
}
}
-Definition::Definition(const Definition &d) : DefinitionIntf(), LockableObj()
+Definition::Definition(const Definition &d) : DefinitionIntf()
{
m_name = d.m_name;
m_defLine = d.m_defLine;
@@ -393,10 +396,25 @@ void Definition::setName(const char *name)
m_name = name;
}
+void Definition::setId(const char *id)
+{
+ if (id==0) return;
+ m_impl->id = id;
+ if (Doxygen::clangUsrMap)
+ {
+ //printf("Definition::setId '%s'->'%s'\n",id,m_name.data());
+ Doxygen::clangUsrMap->insert(id,this);
+ }
+}
+
+QCString Definition::id() const
+{
+ return m_impl->id;
+}
+
void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
{
if (!anchorList) return;
- makeResident();
//printf("%s: addSectionsToDefinition(%d)\n",name().data(),anchorList->count());
SectionInfo *si=anchorList->first();
while (si)
@@ -425,7 +443,6 @@ void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
bool Definition::hasSections() const
{
- makeResident();
//printf("Definition::hasSections(%s) #sections=%d\n",name().data(),
// m_impl->sectionDict ? m_impl->sectionDict->count() : 0);
if (m_impl->sectionDict==0) return FALSE;
@@ -446,7 +463,6 @@ bool Definition::hasSections() const
void Definition::addSectionsToIndex()
{
- makeResident();
if (m_impl->sectionDict==0) return;
//printf("Definition::addSectionsToIndex()\n");
SDict<SectionInfo>::Iterator li(*m_impl->sectionDict);
@@ -496,7 +512,6 @@ void Definition::addSectionsToIndex()
void Definition::writeDocAnchorsToTagFile()
{
- makeResident();
if (!Config_getString("GENERATE_TAGFILE").isEmpty() && m_impl->sectionDict)
{
//printf("%s: writeDocAnchorsToTagFile(%d)\n",name().data(),m_sectionDict->count());
@@ -590,7 +605,6 @@ void Definition::_setDocumentation(const char *d,const char *docFile,int docLine
void Definition::setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace)
{
if (d==0) return;
- makeResident();
_setDocumentation(d,docFile,docLine,stripWhiteSpace,FALSE);
}
@@ -659,7 +673,6 @@ void Definition::_setBriefDescription(const char *b,const char *briefFile,int br
void Definition::setBriefDescription(const char *b,const char *briefFile,int briefLine)
{
if (b==0) return;
- makeResident();
_setBriefDescription(b,briefFile,briefLine);
}
@@ -684,7 +697,6 @@ void Definition::_setInbodyDocumentation(const char *doc,const char *inbodyFile,
void Definition::setInbodyDocumentation(const char *d,const char *inbodyFile,int inbodyLine)
{
if (d==0) return;
- makeResident();
_setInbodyDocumentation(d,inbodyFile,inbodyLine);
}
@@ -797,12 +809,12 @@ bool readCodeFragment(const char *fileName,
}
// copy until end of line
result+=c;
+ startLine=lineNr;
if (c==':')
{
result+=cn;
if (cn=='\n') lineNr++;
}
- startLine=lineNr;
const int maxLineLength=4096;
char lineStr[maxLineLength];
do
@@ -851,6 +863,7 @@ bool readCodeFragment(const char *fileName,
}
}
result = transcodeCharacterStringToUTF8(result);
+ //fprintf(stderr,"readCodeFragement(%d-%d)=%s\n",startLine,endLine,result.data());
return found;
}
@@ -859,7 +872,6 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
{
static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE");
- makeResident();
ol.pushGeneratorState();
//printf("Definition::writeSourceRef %d %p\n",bodyLine,bodyDef);
if (sourceBrowser &&
@@ -983,7 +995,7 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
}
else
{
- err("error: translation error: invalid markers in trDefinedInSourceFile()\n");
+ err("translation error: invalid markers in trDefinedInSourceFile()\n");
}
}
ol.popGeneratorState();
@@ -992,7 +1004,6 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
void Definition::setBodySegment(int bls,int ble)
{
//printf("setBodySegment(%d,%d) for %s\n",bls,ble,name().data());
- makeResident();
if (m_impl->body==0) m_impl->body = new BodyInfo;
m_impl->body->startLine=bls;
m_impl->body->endLine=ble;
@@ -1000,7 +1011,6 @@ void Definition::setBodySegment(int bls,int ble)
void Definition::setBodyDef(FileDef *fd)
{
- makeResident();
if (m_impl->body==0) m_impl->body = new BodyInfo;
m_impl->body->fileDef=fd;
}
@@ -1008,11 +1018,11 @@ void Definition::setBodyDef(FileDef *fd)
/*! Write code of this definition into the documentation */
void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
{
- makeResident();
+ static bool inlineSources = Config_getBool("INLINE_SOURCES");
ol.pushGeneratorState();
//printf("Source Fragment %s: %d-%d bodyDef=%p\n",name().data(),
// m_startBodyLine,m_endBodyLine,m_bodyDef);
- if (Config_getBool("INLINE_SOURCES") &&
+ if (inlineSources &&
m_impl->body && m_impl->body->startLine!=-1 &&
m_impl->body->endLine>=m_impl->body->startLine && m_impl->body->fileDef)
{
@@ -1030,13 +1040,6 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
MemberDef *thisMd = 0;
if (definitionType()==TypeMember) thisMd = (MemberDef *)this;
- // vhdl parser can' t start at an arbitrary point in the source code
- if(this->getLanguage()==SrcLangExt_VHDL)
- {
- if (thisMd) VhdlDocGen::writeCodeFragment(ol,actualStart,codeFragment,thisMd);
- return;
- }
-
ol.startCodeFragment();
pIntf->parseCode(ol, // codeOutIntf
scopeName, // scope
@@ -1048,7 +1051,7 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
actualEnd, // endLine
TRUE, // inlineFragment
thisMd, // memberDef
- FALSE // show line numbers
+ TRUE // show line numbers
);
ol.endCodeFragment();
}
@@ -1062,9 +1065,6 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
const QCString &text,MemberSDict *members,bool /*funcOnly*/)
{
- LockingPtr<Definition> lock(this,this); // since this can be a memberDef
- // accessing other memberDefs prevent
- // it from being flushed to disk
static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE");
static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
static bool refLinkSource = Config_getBool("REFERENCES_LINK_SOURCE");
@@ -1183,7 +1183,6 @@ void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
void Definition::writeSourceReffedBy(OutputList &ol,const char *scopeName)
{
- makeResident();
if (Config_getBool("REFERENCED_BY_RELATION"))
{
_writeSourceRefList(ol,scopeName,theTranslator->trReferencedBy(),m_impl->sourceRefByDict,FALSE);
@@ -1192,7 +1191,6 @@ void Definition::writeSourceReffedBy(OutputList &ol,const char *scopeName)
void Definition::writeSourceRefs(OutputList &ol,const char *scopeName)
{
- makeResident();
if (Config_getBool("REFERENCES_RELATION"))
{
_writeSourceRefList(ol,scopeName,theTranslator->trReferences(),m_impl->sourceRefsDict,TRUE);
@@ -1203,7 +1201,6 @@ bool Definition::hasDocumentation() const
{
static bool extractAll = Config_getBool("EXTRACT_ALL");
//static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
- makeResident();
bool hasDocs =
(m_impl->details && !m_impl->details->doc.isEmpty()) || // has detailed docs
(m_impl->brief && !m_impl->brief->doc.isEmpty()) || // has brief description
@@ -1217,7 +1214,6 @@ bool Definition::hasDocumentation() const
bool Definition::hasUserDocumentation() const
{
- makeResident();
bool hasDocs =
(m_impl->details && !m_impl->details->doc.isEmpty()) ||
(m_impl->brief && !m_impl->brief->doc.isEmpty()) ||
@@ -1225,11 +1221,11 @@ bool Definition::hasUserDocumentation() const
return hasDocs;
}
+
void Definition::addSourceReferencedBy(MemberDef *md)
{
if (md)
{
- makeResident();
QCString name = md->name();
QCString scope = md->getScopeString();
@@ -1251,11 +1247,13 @@ void Definition::addSourceReferencedBy(MemberDef *md)
void Definition::addSourceReferences(MemberDef *md)
{
+ QCString name = md->name();
+ QCString scope = md->getScopeString();
+
if (md)
{
QCString name = md->name();
QCString scope = md->getScopeString();
- makeResident();
if (!scope.isEmpty())
{
@@ -1280,14 +1278,13 @@ Definition *Definition::findInnerCompound(const char *)
void Definition::addInnerCompound(Definition *)
{
- err("error: Definition::addInnerCompound() called\n");
+ err("Definition::addInnerCompound() called\n");
}
QCString Definition::qualifiedName() const
{
//static int count=0;
//count++;
- makeResident();
if (!m_impl->qualifiedName.isEmpty())
{
//count--;
@@ -1326,7 +1323,6 @@ QCString Definition::qualifiedName() const
void Definition::setOuterScope(Definition *d)
{
- makeResident();
//printf("%s::setOuterScope(%s)\n",name().data(),d?d->name().data():"<none>");
if (m_impl->outerScope!=d)
{
@@ -1338,13 +1334,11 @@ void Definition::setOuterScope(Definition *d)
QCString Definition::localName() const
{
- makeResident();
return m_impl->localName;
}
void Definition::makePartOfGroup(GroupDef *gd)
{
- makeResident();
if (m_impl->partOfGroups==0) m_impl->partOfGroups = new GroupList;
m_impl->partOfGroups->append(gd);
}
@@ -1354,7 +1348,6 @@ void Definition::setRefItems(const QList<ListItemInfo> *sli)
//printf("%s::setRefItems()\n",name().data());
if (sli)
{
- makeResident();
// deep copy the list
if (m_impl->xrefListItems==0)
{
@@ -1373,10 +1366,9 @@ void Definition::setRefItems(const QList<ListItemInfo> *sli)
void Definition::mergeRefItems(Definition *d)
{
//printf("%s::mergeRefItems()\n",name().data());
- LockingPtr< QList<ListItemInfo> > xrefList = d->xrefListItems();
+ QList<ListItemInfo> *xrefList = d->xrefListItems();
if (xrefList!=0)
{
- makeResident();
// deep copy the list
if (m_impl->xrefListItems==0)
{
@@ -1397,14 +1389,13 @@ void Definition::mergeRefItems(Definition *d)
int Definition::_getXRefListId(const char *listName) const
{
- makeResident();
if (m_impl->xrefListItems)
{
QListIterator<ListItemInfo> slii(*m_impl->xrefListItems);
ListItemInfo *lii;
for (slii.toFirst();(lii=slii.current());++slii)
{
- if (strcmp(lii->type,listName)==0)
+ if (qstrcmp(lii->type,listName)==0)
{
return lii->itemId;
}
@@ -1413,16 +1404,14 @@ int Definition::_getXRefListId(const char *listName) const
return -1;
}
-LockingPtr< QList<ListItemInfo> > Definition::xrefListItems() const
+QList<ListItemInfo> *Definition::xrefListItems() const
{
- makeResident();
- return LockingPtr< QList<ListItemInfo> >(this,m_impl->xrefListItems);
+ return m_impl->xrefListItems;
}
QCString Definition::convertNameToFile(const char *name,bool allowDots) const
{
- makeResident();
if (!m_impl->ref.isEmpty())
{
return name;
@@ -1435,7 +1424,6 @@ QCString Definition::convertNameToFile(const char *name,bool allowDots) const
QCString Definition::pathFragment() const
{
- makeResident();
QCString result;
if (m_impl->outerScope && m_impl->outerScope!=Doxygen::globalScope)
{
@@ -1472,7 +1460,6 @@ QCString Definition::pathFragment() const
*/
QCString Definition::navigationPathAsString() const
{
- makeResident();
QCString result;
Definition *outerScope = getOuterScope();
QCString locName = localName();
@@ -1489,12 +1476,12 @@ QCString Definition::navigationPathAsString() const
{
if (definitionType()==Definition::TypeGroup && ((const GroupDef*)this)->groupTitle())
{
- result+="<a class=\"el\" href=\"$relpath$"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
+ result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
((const GroupDef*)this)->groupTitle()+"</a>";
}
else if (definitionType()==Definition::TypePage && !((const PageDef*)this)->title().isEmpty())
{
- result+="<a class=\"el\" href=\"$relpath$"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
+ result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
((const PageDef*)this)->title()+"</a>";
}
else if (definitionType()==Definition::TypeClass)
@@ -1504,13 +1491,13 @@ QCString Definition::navigationPathAsString() const
{
name = name.left(name.length()-2);
}
- result+="<a class=\"el\" href=\"$relpath$"+getOutputFileBase()+Doxygen::htmlFileExtension;
+ result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension;
if (!anchor().isEmpty()) result+="#"+anchor();
result+="\">"+name+"</a>";
}
else
{
- result+="<a class=\"el\" href=\"$relpath$"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
+ result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+
locName+"</a>";
}
}
@@ -1542,7 +1529,6 @@ void Definition::writeNavigationPath(OutputList &ol) const
// TODO: move to htmlgen
void Definition::writeToc(OutputList &ol)
{
- makeResident();
SectionDict *sectionDict = m_impl->sectionDict;
if (sectionDict==0) return;
ol.pushGeneratorState();
@@ -1616,19 +1602,16 @@ QCString Definition::symbolName() const
QCString Definition::documentation() const
{
- makeResident();
return m_impl->details ? m_impl->details->doc : QCString("");
}
int Definition::docLine() const
{
- makeResident();
return m_impl->details ? m_impl->details->line : 1;
}
QCString Definition::docFile() const
{
- makeResident();
return m_impl->details ? m_impl->details->file : QCString("<"+m_name+">");
}
@@ -1685,7 +1668,6 @@ QCString abbreviate(const char *s,const char *name)
QCString Definition::briefDescription(bool abbr) const
{
- makeResident();
return m_impl->brief ?
(abbr ? abbreviate(m_impl->brief->doc,displayName()) : m_impl->brief->doc) :
QCString("");
@@ -1693,10 +1675,6 @@ QCString Definition::briefDescription(bool abbr) const
QCString Definition::briefDescriptionAsTooltip() const
{
- makeResident();
- LockingPtr<Definition> lock(this,this); // since this can be a memberDef
- // accessing other memberDefs prevent
- // it from being flushed to disk
if (m_impl->brief)
{
if (m_impl->brief->tooltip.isEmpty() && !m_impl->brief->doc.isEmpty())
@@ -1722,13 +1700,11 @@ QCString Definition::briefDescriptionAsTooltip() const
int Definition::briefLine() const
{
- makeResident();
return m_impl->brief ? m_impl->brief->line : 1;
}
QCString Definition::briefFile() const
{
- makeResident();
return m_impl->brief ? m_impl->brief->file : QCString("<"+m_name+">");
}
@@ -1736,19 +1712,16 @@ QCString Definition::briefFile() const
QCString Definition::inbodyDocumentation() const
{
- makeResident();
return m_impl->inbodyDocs ? m_impl->inbodyDocs->doc : QCString("");
}
int Definition::inbodyLine() const
{
- makeResident();
return m_impl->inbodyDocs ? m_impl->inbodyDocs->line : 1;
}
QCString Definition::inbodyFile() const
{
- makeResident();
return m_impl->inbodyDocs ? m_impl->inbodyDocs->file : QCString("<"+m_name+">");
}
@@ -1757,19 +1730,16 @@ QCString Definition::inbodyFile() const
QCString Definition::getDefFileName() const
{
- makeResident();
return m_impl->defFileName;
}
QCString Definition::getDefFileExtension() const
{
- makeResident();
return m_impl->defFileExt;
}
bool Definition::isHidden() const
{
- makeResident();
return m_impl->hidden;
}
@@ -1790,91 +1760,76 @@ bool Definition::isArtificial() const
QCString Definition::getReference() const
{
- makeResident();
return m_impl->ref;
}
bool Definition::isReference() const
{
- makeResident();
return !m_impl->ref.isEmpty();
}
int Definition::getStartBodyLine() const
{
- makeResident();
return m_impl->body ? m_impl->body->startLine : -1;
}
int Definition::getEndBodyLine() const
{
- makeResident();
return m_impl->body ? m_impl->body->endLine : -1;
}
FileDef *Definition::getBodyDef()
{
- makeResident();
return m_impl->body ? m_impl->body->fileDef : 0;
}
-LockingPtr<GroupList> Definition::partOfGroups() const
+GroupList *Definition::partOfGroups() const
{
- makeResident();
- return LockingPtr<GroupList>(this,m_impl->partOfGroups);
+ return m_impl->partOfGroups;
}
Definition *Definition::getOuterScope() const
{
- makeResident();
return m_impl->outerScope;
}
-LockingPtr<MemberSDict> Definition::getReferencesMembers() const
+MemberSDict *Definition::getReferencesMembers() const
{
- makeResident();
- return LockingPtr<MemberSDict>(this,m_impl->sourceRefsDict);
+ return m_impl->sourceRefsDict;
}
-LockingPtr<MemberSDict> Definition::getReferencedByMembers() const
+MemberSDict *Definition::getReferencedByMembers() const
{
- makeResident();
- return LockingPtr<MemberSDict>(this,m_impl->sourceRefByDict);
+ return m_impl->sourceRefByDict;
}
void Definition::setReference(const char *r)
{
- makeResident();
m_impl->ref=r;
}
SrcLangExt Definition::getLanguage() const
{
- makeResident();
return m_impl->lang;
}
void Definition::setHidden(bool b)
{
- makeResident();
m_impl->hidden = m_impl->hidden || b;
}
void Definition::setArtificial(bool b)
{
- makeResident();
m_impl->isArtificial = b;
}
void Definition::setLocalName(const QCString name)
{
- makeResident();
m_impl->localName=name;
}
void Definition::setLanguage(SrcLangExt lang)
{
- makeResident();
m_impl->lang=lang;
}
@@ -1884,70 +1839,4 @@ void Definition::_setSymbolName(const QCString &name)
m_symbolName=name;
}
-//---------------
-
-void Definition::makeResident() const
-{
-}
-
-void Definition::flushToDisk() const
-{
- //printf("%p: Definition::flushToDisk()\n",this);
- Definition *that = (Definition *)this;
- //printf("Definition::flushToDisk(): pos=%d\n",(int)m_storagePos);
- marshalUInt(Doxygen::symbolStorage,START_MARKER);
- marshalSectionDict (Doxygen::symbolStorage,m_impl->sectionDict);
- marshalMemberSDict (Doxygen::symbolStorage,m_impl->sourceRefByDict);
- marshalMemberSDict (Doxygen::symbolStorage,m_impl->sourceRefsDict);
- marshalItemInfoList (Doxygen::symbolStorage,m_impl->xrefListItems);
- marshalGroupList (Doxygen::symbolStorage,m_impl->partOfGroups);
- marshalDocInfo (Doxygen::symbolStorage,m_impl->details);
- marshalDocInfo (Doxygen::symbolStorage,m_impl->inbodyDocs);
- marshalBriefInfo (Doxygen::symbolStorage,m_impl->brief);
- marshalBodyInfo (Doxygen::symbolStorage,m_impl->body);
- marshalQCString (Doxygen::symbolStorage,m_impl->docSignatures);
- marshalQCString (Doxygen::symbolStorage,m_impl->localName);
- marshalQCString (Doxygen::symbolStorage,m_impl->qualifiedName);
- marshalQCString (Doxygen::symbolStorage,m_impl->ref);
- marshalBool (Doxygen::symbolStorage,m_impl->hidden);
- marshalBool (Doxygen::symbolStorage,m_impl->isArtificial);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->outerScope);
- marshalQCString (Doxygen::symbolStorage,m_impl->defFileName);
- marshalQCString (Doxygen::symbolStorage,m_impl->defFileExt);
- marshalInt (Doxygen::symbolStorage,(int)m_impl->lang);
- marshalUInt(Doxygen::symbolStorage,END_MARKER);
- delete that->m_impl;
- that->m_impl = 0;
-}
-
-void Definition::loadFromDisk() const
-{
- //printf("%p: Definition::loadFromDisk()\n",this);
- Definition *that = (Definition *)this;
- assert(m_impl==0);
- that->m_impl = new DefinitionImpl;
- uint marker = unmarshalUInt(Doxygen::symbolStorage);
- assert(marker==START_MARKER);
- m_impl->sectionDict = unmarshalSectionDict (Doxygen::symbolStorage);
- m_impl->sourceRefByDict = unmarshalMemberSDict (Doxygen::symbolStorage);
- m_impl->sourceRefsDict = unmarshalMemberSDict (Doxygen::symbolStorage);
- m_impl->xrefListItems = unmarshalItemInfoList (Doxygen::symbolStorage);
- m_impl->partOfGroups = unmarshalGroupList (Doxygen::symbolStorage);
- m_impl->details = unmarshalDocInfo (Doxygen::symbolStorage);
- m_impl->inbodyDocs = unmarshalDocInfo (Doxygen::symbolStorage);
- m_impl->brief = unmarshalBriefInfo (Doxygen::symbolStorage);
- m_impl->body = unmarshalBodyInfo (Doxygen::symbolStorage);
- m_impl->docSignatures = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->localName = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->qualifiedName = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->ref = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->hidden = unmarshalBool (Doxygen::symbolStorage);
- m_impl->isArtificial = unmarshalBool (Doxygen::symbolStorage);
- m_impl->outerScope = (Definition *)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->defFileName = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->defFileExt = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->lang = (SrcLangExt)unmarshalInt(Doxygen::symbolStorage);
- marker = unmarshalUInt(Doxygen::symbolStorage);
- assert(marker==END_MARKER);
-}
diff --git a/src/definition.h b/src/definition.h
index 9d80431..74a801f 100644
--- a/src/definition.h
+++ b/src/definition.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -22,7 +22,6 @@
#include <qdict.h>
#include "types.h"
-#include "lockingptr.h"
class FileDef;
class OutputList;
@@ -89,13 +88,13 @@ class DefinitionIntf
* This can be a class or a member function, or a file, or a namespace, etc.
* Use definitionType() to find which type of definition this is.
*/
-class Definition : public DefinitionIntf, public LockableObj
+class Definition : public DefinitionIntf
{
public:
/*! Create a new definition */
Definition(
- const char *defFileName,int defLine,
+ const char *defFileName,int defLine,int defColumn,
const char *name,const char *b=0,const char *d=0,
bool isSymbol=TRUE);
@@ -180,6 +179,9 @@ class Definition : public DefinitionIntf, public LockableObj
/*! returns the line number at which the definition was found */
int getDefLine() const { return m_defLine; }
+ /*! returns the column number at which the definition was found */
+ int getDefColumn() const { return m_defColumn; }
+
/*! Returns TRUE iff the definition is documented
* (which could be generated documentation)
* @see hasUserDocumentation()
@@ -243,18 +245,20 @@ class Definition : public DefinitionIntf, public LockableObj
/** Returns the programming language this definition was written in. */
SrcLangExt getLanguage() const;
- LockingPtr<GroupList> partOfGroups() const;
+ GroupList *partOfGroups() const;
- LockingPtr< QList<ListItemInfo> > xrefListItems() const;
+ QList<ListItemInfo> *xrefListItems() const;
virtual Definition *findInnerCompound(const char *name);
virtual Definition *getOuterScope() const;
- LockingPtr<MemberSDict> getReferencesMembers() const;
- LockingPtr<MemberSDict> getReferencedByMembers() const;
+ MemberSDict *getReferencesMembers() const;
+ MemberSDict *getReferencedByMembers() const;
bool hasSections() const;
+ QCString id() const;
+
//-----------------------------------------------------------------------------------
// ---- setters -----
//-----------------------------------------------------------------------------------
@@ -262,6 +266,9 @@ class Definition : public DefinitionIntf, public LockableObj
/*! Sets a new \a name for the definition */
void setName(const char *name);
+ /*! Sets a unique id for the symbol. Used for libclang integration. */
+ void setId(const char *name);
+
/*! Sets the documentation of this definition to \a d. */
virtual void setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace=TRUE);
@@ -328,12 +335,6 @@ class Definition : public DefinitionIntf, public LockableObj
protected:
- virtual void flushToDisk() const;
- virtual void loadFromDisk() const;
- virtual void makeResident() const;
- void lock() const {}
- void unlock() const {}
-
Definition(const Definition &d);
private:
@@ -354,6 +355,7 @@ class Definition : public DefinitionIntf, public LockableObj
bool m_isSymbol;
QCString m_symbolName;
int m_defLine;
+ int m_defColumn;
};
/** A list of Definition objects. */
@@ -364,7 +366,7 @@ class DefinitionList : public QList<Definition>, public DefinitionIntf
DefType definitionType() const { return TypeSymbolList; }
int compareItems(QCollection::Item item1,QCollection::Item item2)
{
- return stricmp(((Definition *)item1)->name(),
+ return qstricmp(((Definition *)item1)->name(),
((Definition *)item2)->name()
);
}
diff --git a/src/diagram.cpp b/src/diagram.cpp
index 78b9364..80d0646 100644
--- a/src/diagram.cpp
+++ b/src/diagram.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -1363,7 +1363,7 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
portable_sysTimerStart();
if (portable_system("epstopdf",epstopdfArgs)!=0)
{
- err("error: Problems running epstopdf. Check your TeX installation!\n");
+ err("Problems running epstopdf. Check your TeX installation!\n");
portable_sysTimerStop();
return;
}
diff --git a/src/diagram.h b/src/diagram.h
index 63481cd..62cab2e 100644
--- a/src/diagram.h
+++ b/src/diagram.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -19,6 +19,8 @@
#ifndef DIAGRAM_H
#define DIAGRAM_H
+#include <qglobal.h>
+
class ClassDef;
class TreeDiagram;
class FTextStream;
diff --git a/src/dirdef.cpp b/src/dirdef.cpp
index 6565393..fe6e47d 100644
--- a/src/dirdef.cpp
+++ b/src/dirdef.cpp
@@ -11,13 +11,14 @@
#include "layout.h"
#include "ftextstream.h"
#include "config.h"
+#include "docparser.h"
//----------------------------------------------------------------------
// method implementation
static int g_dirCount=0;
-DirDef::DirDef(const char *path) : Definition(path,1,path)
+DirDef::DirDef(const char *path) : Definition(path,1,1,path)
{
bool fullPathNames = Config_getBool("FULL_PATH_NAMES");
// get display name (stipping the paths mentioned in STRIP_FROM_PATH)
@@ -137,7 +138,7 @@ void DirDef::writeDetailedDescription(OutputList &ol,const QCString &title)
// repeat brief description
if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
{
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
}
// separator between brief and details
if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
@@ -156,7 +157,7 @@ void DirDef::writeDetailedDescription(OutputList &ol,const QCString &title)
// write documentation
if (!documentation().isEmpty())
{
- ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+ ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
}
}
}
@@ -165,29 +166,31 @@ void DirDef::writeBriefDescription(OutputList &ol)
{
if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
- ol.startParagraph();
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::RTF);
- ol.writeString(" \n");
- ol.enable(OutputGenerator::RTF);
-
- if (Config_getBool("REPEAT_BRIEF") ||
- !documentation().isEmpty()
- )
+ DocRoot *rootNode = validatingParseDoc(
+ briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
+ if (rootNode && !rootNode->isEmpty())
{
- ol.disableAllBut(OutputGenerator::Html);
- ol.startTextLink(0,"details");
- ol.parseText(theTranslator->trMore());
- ol.endTextLink();
- }
- ol.popGeneratorState();
+ ol.startParagraph();
+ ol.writeDoc(rootNode,this,0);
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::RTF);
+ ol.writeString(" \n");
+ ol.enable(OutputGenerator::RTF);
- //ol.pushGeneratorState();
- //ol.disable(OutputGenerator::RTF);
- //ol.newParagraph();
- //ol.popGeneratorState();
- ol.endParagraph();
+ if (Config_getBool("REPEAT_BRIEF") ||
+ !documentation().isEmpty()
+ )
+ {
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.startTextLink(0,"details");
+ ol.parseText(theTranslator->trMore());
+ ol.endTextLink();
+ }
+ ol.popGeneratorState();
+
+ ol.endParagraph();
+ }
+ delete rootNode;
}
ol.writeSynopsis();
}
@@ -237,7 +240,7 @@ void DirDef::writeSubDirList(OutputList &ol)
if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
ol.startMemberDescription(dd->getOutputFileBase());
- ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),
+ ol.generateDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),
FALSE, // indexWords
FALSE, // isExample
0, // exampleName
@@ -300,7 +303,7 @@ void DirDef::writeFileList(OutputList &ol)
if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
ol.startMemberDescription(fd->getOutputFileBase());
- ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),
+ ol.generateDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),
FALSE, // indexWords
FALSE, // isExample
0, // exampleName
@@ -403,10 +406,12 @@ void DirDef::writeDocumentation(OutputList &ol)
case LayoutDocEntry::ClassAllMembersLink:
case LayoutDocEntry::ClassUsedFiles:
case LayoutDocEntry::NamespaceNestedNamespaces:
+ case LayoutDocEntry::NamespaceNestedConstantGroups:
case LayoutDocEntry::NamespaceClasses:
case LayoutDocEntry::NamespaceInlineClasses:
case LayoutDocEntry::FileClasses:
case LayoutDocEntry::FileNamespaces:
+ case LayoutDocEntry::FileConstantGroups:
case LayoutDocEntry::FileIncludes:
case LayoutDocEntry::FileIncludeGraph:
case LayoutDocEntry::FileIncludedByGraph:
@@ -579,8 +584,8 @@ int FilePairDict::compareItems(QCollection::Item item1,QCollection::Item item2)
{
FilePair *left = (FilePair*)item1;
FilePair *right = (FilePair*)item2;
- int orderHi = stricmp(left->source()->name(),right->source()->name());
- int orderLo = stricmp(left->destination()->name(),right->destination()->name());
+ int orderHi = qstricmp(left->source()->name(),right->source()->name());
+ int orderLo = qstricmp(left->destination()->name(),right->destination()->name());
return orderHi==0 ? orderLo : orderHi;
}
@@ -629,7 +634,7 @@ bool DirDef::matchPath(const QCString &path,QStrList &l)
while (s)
{
QCString prefix = s;
- if (stricmp(prefix.left(path.length()),path)==0) // case insensitive compare
+ if (qstricmp(prefix.left(path.length()),path)==0) // case insensitive compare
{
return TRUE;
}
@@ -785,7 +790,7 @@ static void computeCommonDirPrefix()
QCString dirName = dir->name();
if (dirName.length()>path.length())
{
- if (strncmp(dirName,path,l)!=0) // dirName does not start with path
+ if (qstrncmp(dirName,path,l)!=0) // dirName does not start with path
{
int i=path.findRev('/',l-2);
if (i==-1) // no unique prefix -> stop
diff --git a/src/dirdef.h b/src/dirdef.h
index a94f979..99e2137 100644
--- a/src/dirdef.h
+++ b/src/dirdef.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -161,7 +161,7 @@ class DirRelation
inline int DirList::compareItems(QCollection::Item item1,QCollection::Item item2)
{
- return stricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
+ return qstricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
}
/** A sorted dictionary of DirDef objects. */
@@ -171,7 +171,7 @@ class DirSDict : public SDict<DirDef>
DirSDict(int size) : SDict<DirDef>(size) {}
int compareItems(QCollection::Item item1,QCollection::Item item2)
{
- return stricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
+ return qstricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
}
};
diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp
new file mode 100644
index 0000000..5726b3e
--- /dev/null
+++ b/src/docbookgen.cpp
@@ -0,0 +1,1904 @@
+/******************************************************************************
+*
+*
+*
+* Copyright (C) 1997-2012 by Dimitri van Heesch.
+*
+* Permission to use, copy, modify, and distribute this software and its
+* documentation under the terms of the GNU General Public License is hereby
+* granted. No representations are made about the suitability of this software
+* for any purpose. It is provided "as is" without express or implied warranty.
+* See the GNU General Public License for more details.
+*
+* Documents produced by Doxygen are derivative works derived from the
+* input used in their production; they are not affected by this license.
+*
+*/
+
+#include <stdlib.h>
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qintdict.h>
+#include "docbookgen.h"
+#include "doxygen.h"
+#include "message.h"
+#include "config.h"
+#include "classlist.h"
+#include "util.h"
+#include "defargs.h"
+#include "outputgen.h"
+#include "dot.h"
+#include "pagedef.h"
+#include "filename.h"
+#include "version.h"
+#include "docbookvisitor.h"
+#include "docparser.h"
+#include "language.h"
+#include "parserintf.h"
+#include "arguments.h"
+#include "memberlist.h"
+#include "groupdef.h"
+#include "memberdef.h"
+#include "namespacedef.h"
+#include "membername.h"
+#include "membergroup.h"
+#include "dirdef.h"
+#include "section.h"
+
+// no debug info
+#define Docbook_DB(x) do {} while(0)
+// debug to stdout
+//#define Docbook_DB(x) printf x
+// debug inside output
+//#define Docbook_DB(x) QCString __t;__t.sprintf x;m_t << __t
+
+//------------------
+
+static const char index_xsd[] =
+#include "index_xsd.h"
+;
+
+//------------------
+//
+static const char compound_xsd[] =
+#include "compound_xsd.h"
+;
+
+//------------------
+
+class DocbookSectionMapper : public QIntDict<char>
+{
+ public:
+ DocbookSectionMapper() : QIntDict<char>(47)
+ {
+ insert(MemberListType_pubTypes,"public-type");
+ insert(MemberListType_pubMethods,"public-func");
+ insert(MemberListType_pubAttribs,"public-attrib");
+ insert(MemberListType_pubSlots,"public-slot");
+ insert(MemberListType_signals,"signal");
+ insert(MemberListType_dcopMethods,"dcop-func");
+ insert(MemberListType_properties,"property");
+ insert(MemberListType_events,"event");
+ insert(MemberListType_pubStaticMethods,"public-static-func");
+ insert(MemberListType_pubStaticAttribs,"public-static-attrib");
+ insert(MemberListType_proTypes,"protected-type");
+ insert(MemberListType_proMethods,"protected-func");
+ insert(MemberListType_proAttribs,"protected-attrib");
+ insert(MemberListType_proSlots,"protected-slot");
+ insert(MemberListType_proStaticMethods,"protected-static-func");
+ insert(MemberListType_proStaticAttribs,"protected-static-attrib");
+ insert(MemberListType_pacTypes,"package-type");
+ insert(MemberListType_pacMethods,"package-func");
+ insert(MemberListType_pacAttribs,"package-attrib");
+ insert(MemberListType_pacStaticMethods,"package-static-func");
+ insert(MemberListType_pacStaticAttribs,"package-static-attrib");
+ insert(MemberListType_priTypes,"private-type");
+ insert(MemberListType_priMethods,"private-func");
+ insert(MemberListType_priAttribs,"private-attrib");
+ insert(MemberListType_priSlots,"private-slot");
+ insert(MemberListType_priStaticMethods,"private-static-func");
+ insert(MemberListType_priStaticAttribs,"private-static-attrib");
+ insert(MemberListType_friends,"friend");
+ insert(MemberListType_related,"related");
+ insert(MemberListType_decDefineMembers,"define");
+ insert(MemberListType_decProtoMembers,"prototype");
+ insert(MemberListType_decTypedefMembers,"typedef");
+ insert(MemberListType_decEnumMembers,"enum");
+ insert(MemberListType_decFuncMembers,"func");
+ insert(MemberListType_decVarMembers,"var");
+ }
+};
+
+static DocbookSectionMapper g_docbookSectionMapper;
+
+
+inline void writeDocbookString(FTextStream &t,const char *s)
+{
+ t << convertToXML(s);
+}
+
+inline void writeDocbookCodeString(FTextStream &t,const char *s, int &col)
+{
+ char c;
+ while ((c=*s++))
+ {
+ switch(c)
+ {
+ case '\t':
+ {
+ static int tabSize = Config_getInt("TAB_SIZE");
+ int spacesToNextTabStop = tabSize - (col%tabSize);
+ col+=spacesToNextTabStop;
+ while (spacesToNextTabStop--) t << "&#32;";
+ break;
+ }
+ case ' ': t << "&#32;"; col++; break;
+ case '<': t << "&lt;"; col++; break;
+ case '>': t << "&gt;"; col++; break;
+ case '&': t << "&amp;"; col++; break;
+ case '\'': t << "&apos;"; col++; break;
+ case '"': t << "&quot;"; col++; break;
+ default: t << c; col++; break;
+ }
+ }
+}
+
+static void writeDocbookHeaderMainpage(FTextStream &t)
+{
+ t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
+ t << "<chapter xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" << endl;
+}
+
+static void writeDocbookHeader_ID(FTextStream &t, QCString id)
+{
+ t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
+ t << "<section xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:id=\"" << id << "\">" << endl;
+}
+
+void writeDocbookLink(FTextStream &t,const char * /*extRef*/,const char *compoundId,
+ const char *anchorId,const char * text,const char * /*tooltip*/)
+{
+ t << "<link linkend=\"" << compoundId;
+ if (anchorId) t << "_1" << anchorId;
+ t << "\"";
+ t << ">";
+ writeDocbookString(t,text);
+ t << "</link>";
+}
+
+class TextGeneratorDocbookImpl : public TextGeneratorIntf
+{
+ public:
+ TextGeneratorDocbookImpl(FTextStream &t): m_t(t) {}
+ void writeString(const char *s,bool /*keepSpaces*/) const
+ {
+ writeDocbookString(m_t,s);
+ }
+ void writeBreak(int) const {}
+ void writeLink(const char *extRef,const char *file,
+ const char *anchor,const char *text
+ ) const
+ {
+ writeDocbookLink(m_t,extRef,file,anchor,text,0);
+ }
+ private:
+ FTextStream &m_t;
+};
+
+class DocbookCodeGenerator : public CodeOutputInterface
+{
+ public:
+ DocbookCodeGenerator(FTextStream &t) : m_t(t), m_lineNumber(-1),
+ m_insideCodeLine(FALSE), m_normalHLNeedStartTag(TRUE),
+ m_insideSpecialHL(FALSE) {}
+ virtual ~DocbookCodeGenerator() {}
+
+ void codify(const char *text)
+ {
+ Docbook_DB(("(codify \"%s\")\n",text));
+ writeDocbookCodeString(m_t,text,col);
+ }
+ void writeCodeLink(const char *ref,const char *file,
+ const char *anchor,const char *name,
+ const char *tooltip)
+ {
+ Docbook_DB(("(writeCodeLink)\n"));
+ writeDocbookLink(m_t,ref,file,anchor,name,tooltip);
+ col+=strlen(name);
+ }
+ void startCodeLine(bool)
+ {
+ Docbook_DB(("(startCodeLine)\n"));
+ if (m_lineNumber!=-1)
+ {
+ if (!m_refId.isEmpty())
+ {
+ m_t << "<link linkend=\"" << m_refId << "\">";
+ }
+ m_t << m_lineNumber;
+ if (!m_refId.isEmpty())
+ {
+ m_t << "</link>";
+ }
+ }
+ m_insideCodeLine=TRUE;
+ col=0;
+ }
+ void endCodeLine()
+ {
+ m_t << endl;
+ Docbook_DB(("(endCodeLine)\n"));
+ m_lineNumber = -1;
+ m_refId.resize(0);
+ m_external.resize(0);
+ m_insideCodeLine=FALSE;
+ }
+ void startCodeAnchor(const char *id)
+ {
+ Docbook_DB(("(startCodeAnchor)\n"));
+ m_t << "<anchor id=\"" << id << "\">";
+ }
+ void endCodeAnchor()
+ {
+ Docbook_DB(("(endCodeAnchor)\n"));
+ m_t << "</anchor>";
+ }
+ void startFontClass(const char * /*colorClass*/)
+ {
+ Docbook_DB(("(startFontClass)\n"));
+ m_t << "<emphasis>"; // non DocBook
+ m_insideSpecialHL=TRUE;
+ }
+ void endFontClass()
+ {
+ Docbook_DB(("(endFontClass)\n"));
+ m_t << "</emphasis>"; // non DocBook
+ m_insideSpecialHL=FALSE;
+ }
+ void writeCodeAnchor(const char *)
+ {
+ Docbook_DB(("(writeCodeAnchor)\n"));
+ }
+ void writeLineNumber(const char *extRef,const char *compId,
+ const char *anchorId,int l)
+ {
+ Docbook_DB(("(writeLineNumber)\n"));
+ // we remember the information provided here to use it
+ // at the <codeline> start tag.
+ m_lineNumber = l;
+ if (compId)
+ {
+ m_refId=compId;
+ if (anchorId) m_refId+=(QCString)"_1"+anchorId;
+ m_isMemberRef = anchorId!=0;
+ if (extRef) m_external=extRef;
+ }
+ }
+ void setCurrentDoc(Definition *,const char *,bool)
+ {
+ }
+ void addWord(const char *,bool)
+ {
+ }
+ void finish()
+ {
+ if (m_insideCodeLine) endCodeLine();
+ }
+
+ private:
+ FTextStream &m_t;
+ QCString m_refId;
+ QCString m_external;
+ int m_lineNumber;
+ bool m_isMemberRef;
+ int col;
+ bool m_insideCodeLine;
+ bool m_normalHLNeedStartTag;
+ bool m_insideSpecialHL;
+};
+
+
+static void writeTemplateArgumentList(ArgumentList *al,
+ FTextStream &t,
+ Definition *scope,
+ FileDef *fileScope,
+ int indent)
+{
+ QCString indentStr;
+ indentStr.fill(' ',indent);
+ if (al)
+ {
+ t << indentStr << "<templateparamlist>" << endl;
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ t << indentStr << " <param>" << endl;
+ if (!a->type.isEmpty())
+ {
+ t << indentStr << " <type>";
+ linkifyText(TextGeneratorDocbookImpl(t),scope,fileScope,0,a->type);
+ t << "</type>" << endl;
+ }
+ if (!a->name.isEmpty())
+ {
+ t << indentStr << " <declname>" << a->name << "</declname>" << endl;
+ t << indentStr << " <defname>" << a->name << "</defname>" << endl;
+ }
+ if (!a->defval.isEmpty())
+ {
+ t << indentStr << " <defval>";
+ linkifyText(TextGeneratorDocbookImpl(t),scope,fileScope,0,a->defval);
+ t << "</defval>" << endl;
+ }
+ t << indentStr << " </param>" << endl;
+ }
+ t << indentStr << "</templateparamlist>" << endl;
+ }
+}
+
+static void writeTemplateList(ClassDef *cd,FTextStream &t)
+{
+ writeTemplateArgumentList(cd->templateArguments(),t,cd,0,4);
+}
+
+static void writeDocbookDocBlock(FTextStream &t,
+ const QCString &fileName,
+ int lineNr,
+ Definition *scope,
+ MemberDef * md,
+ const QCString &text)
+{
+ QCString stext = text.stripWhiteSpace();
+ if (stext.isEmpty()) return;
+ // convert the documentation string into an abstract syntax tree
+ DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text,FALSE,FALSE);
+ // create a code generator
+ DocbookCodeGenerator *docbookCodeGen = new DocbookCodeGenerator(t);
+ // create a parse tree visitor for Docbook
+ DocbookDocVisitor *visitor = new DocbookDocVisitor(t,*docbookCodeGen);
+ // visit all nodes
+ root->accept(visitor);
+ // clean up
+ delete visitor;
+ delete docbookCodeGen;
+ delete root;
+}
+
+void writeDocbookCodeBlock(FTextStream &t,FileDef *fd)
+{
+ ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension());
+ pIntf->resetCodeParserState();
+ DocbookCodeGenerator *docbookGen = new DocbookCodeGenerator(t);
+ pIntf->parseCode(*docbookGen, // codeOutIntf
+ 0, // scopeName
+ fileToString(fd->absFilePath(),Config_getBool("FILTER_SOURCE_FILES")),
+ FALSE, // isExampleBlock
+ 0, // exampleName
+ fd, // fileDef
+ -1, // startLine
+ -1, // endLine
+ FALSE, // inlineFragement
+ 0, // memberDef
+ TRUE // showLineNumbers
+ );
+ docbookGen->finish();
+ delete docbookGen;
+}
+
+static QCString classOutputFileBase(ClassDef *cd)
+{
+ //static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+ //if (inlineGroupedClasses && cd->partOfGroups()!=0)
+ return cd->getOutputFileBase();
+ //else
+ // return cd->getOutputFileBase();
+}
+
+static QCString memberOutputFileBase(MemberDef *md)
+{
+ //static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+ //if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
+ // return md->getClassDef()->getDocbookOutputFileBase();
+ //else
+ // return md->getOutputFileBase();
+ return md->getOutputFileBase();
+}
+
+
+static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *def, bool detailed=0)
+{
+
+ // + declaration/definition arg lists
+ // + reimplements
+ // + reimplementedBy
+ // + exceptions
+ // + const/volatile specifiers
+ // - examples
+ // + source definition
+ // + source references
+ // + source referenced by
+ // - body code
+ // + template arguments
+ // (templateArguments(), definitionTemplateParameterLists())
+ // - call graph
+
+ // enum values are written as part of the enum
+ if (md->memberType()==MemberType_EnumValue) return;
+ if (md->isHidden()) return;
+ //if (md->name().at(0)=='@') return; // anonymous member
+
+ // group members are only visible in their group
+ //if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
+ QCString memType;
+ switch (md->memberType())
+ {
+ case MemberType_Define: memType="define"; break;
+ case MemberType_Function: memType="function"; break;
+ case MemberType_Variable: memType="variable"; break;
+ case MemberType_Typedef: memType="typedef"; break;
+ case MemberType_Enumeration: memType="enum"; break;
+ case MemberType_EnumValue: ASSERT(0); break;
+ case MemberType_Signal: memType="signal"; break;
+ case MemberType_Slot: memType="slot"; break;
+ case MemberType_Friend: memType="friend"; break;
+ case MemberType_DCOP: memType="dcop"; break;
+ case MemberType_Property: memType="property"; break;
+ case MemberType_Event: memType="event"; break;
+ case MemberType_Interface: memType="interface"; break;
+ case MemberType_Service: memType="service"; break;
+ }
+ QCString scopeName;
+ if (md->getClassDef())
+ {
+ scopeName=md->getClassDef()->name();
+ }
+ else if (md->getNamespaceDef())
+ {
+ scopeName=md->getNamespaceDef()->name();
+ }
+ if (detailed==0)
+ {
+ t << " <para>" << endl;
+ t << " <itemizedlist>" << endl;
+ t << " <listitem>" << endl;
+ //enum
+ bool closePara=TRUE;
+ if (md->memberType()==MemberType_Enumeration)
+ {
+ MemberList *enumFields = md->enumFieldList();
+ t << " <para>" << memType << " <link linkend=\"";
+ if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+ {
+ t << md->getGroupDef()->getOutputFileBase();
+ }
+ else
+ {
+ t << memberOutputFileBase(md);
+ }
+ t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
+ if (enumFields!=0)
+ {
+ MemberListIterator emli(*enumFields);
+ MemberDef *emd;
+ t << "{";
+ int cnt=0;
+ for (emli.toFirst();(emd=emli.current());++emli)
+ {
+ if (cnt!=0)
+ {
+ t << ", ";
+ }
+ t << "<link linkend=\"" << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">";
+ writeDocbookString(t,emd->name());
+ t << "</link>";
+ if (!emd->initializer().isEmpty())
+ {
+ t << "=";
+ writeDocbookString(t,emd->initializer());
+ }
+ cnt++;
+ }
+ t << "}";
+ }
+ }
+ else if (md->memberType()==MemberType_Define)
+ {
+ t << " <para>" << "#" << memType << " <link linkend=\"";
+ if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+ {
+ t << md->getGroupDef()->getOutputFileBase();
+ }
+ else
+ {
+ t << memberOutputFileBase(md);
+ }
+ t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
+ if (!md->initializer().isEmpty() && md->initializer().length()<2000)
+ {
+ t << " ";
+ linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->initializer());
+ }
+ if (md->briefDescription())
+ {
+ t << "<para><emphasis>";
+ writeDocbookString(t,md->briefDescription());
+ t << "</emphasis></para>" << endl;
+ }
+ }
+ else if (md->memberType()==MemberType_Variable)
+ {
+ if (md->getClassDef())
+ {
+ t << " <para>" << convertToXML(md->declaration());
+ if (md->briefDescription())
+ {
+ t << "<para><emphasis>";
+ writeDocbookString(t,md->briefDescription());
+ t << "</emphasis></para>";
+ }
+ }
+ else
+ {
+ t << " <para>";
+ linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
+ t << " <link linkend=\"";
+ if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+ {
+ t << md->getGroupDef()->getOutputFileBase();
+ }
+ else
+ {
+ t << memberOutputFileBase(md);
+ }
+ t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
+ }
+ }
+ else if (md->memberType()==MemberType_Typedef)
+ {
+ t << " <para>" << memType;
+ t << " ";
+ linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
+ t << " ";
+ t << " <link linkend=\"";
+ if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+ {
+ t << md->getGroupDef()->getOutputFileBase();
+ }
+ else
+ {
+ t << memberOutputFileBase(md);
+ }
+ t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
+ }
+ else if (md->memberType()==MemberType_Function)
+ {
+ t << " <para>";
+ linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
+ t << " <link linkend=\"";
+ if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+ {
+ t << md->getGroupDef()->getOutputFileBase();
+ }
+ else
+ {
+ t << memberOutputFileBase(md);
+ }
+ t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
+ t << " (" << endl;
+ ArgumentList *declAl = md->declArgumentList();
+ ArgumentList *defAl = md->argumentList();
+ if (declAl && declAl->count()>0)
+ {
+ ArgumentListIterator declAli(*declAl);
+ ArgumentListIterator defAli(*defAl);
+ Argument *a;
+ int cnt=0;
+ for (declAli.toFirst();(a=declAli.current());++declAli)
+ {
+ if (cnt!=0)
+ {
+ t << ", ";
+ }
+ if (!a->type.isEmpty())
+ {
+ linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,a->type);
+ }
+ t << " ";
+ if (!a->name.isEmpty())
+ {
+ writeDocbookString(t,a->name);
+ }
+ cnt++;
+ }
+ }
+ t << ")";
+ }
+ else
+ {
+ closePara = FALSE;
+ }
+ if (closePara) t << "</para>" << endl;
+ t << " </listitem>" << endl;
+ t << " </itemizedlist>" << endl;
+ t << " </para>" << endl;
+ }
+ else
+ {
+ if (md->memberType()==MemberType_Enumeration)
+ {
+ MemberList *enumFields = md->enumFieldList();
+ t << " <section xml:id=\"";
+ if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+ {
+ t << md->getGroupDef()->getOutputFileBase();
+ }
+ else
+ {
+ t << memberOutputFileBase(md);
+ }
+ t << "_1" << md->anchor() << "\">" << endl;
+ t << " <title>" << memType << " " << convertToXML(md->name()) << " " << "</title>" << endl;
+ t << " ";
+ writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
+ t << endl;
+ if (enumFields!=0)
+ {
+ MemberListIterator emli(*enumFields);
+ MemberDef *emd;
+ t << " <formalpara>" << endl;
+ t << " <title>Enumerator:</title>" << endl;
+ t << " <variablelist>" << endl;
+ for (emli.toFirst();(emd=emli.current());++emli)
+ {
+ t << " <varlistentry xml:id=\"";
+ t << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">" << endl;
+ t << " <term>";
+ writeDocbookString(t,emd->name());
+ t << "</term>" << endl;
+ t << " <listitem>" << endl;
+ t << " <para>";
+ writeDocbookString(t,emd->briefDescription());
+ t << "</para>" << endl;
+ t << " </listitem>" << endl;
+ t << " </varlistentry>" << endl;
+ }
+ t << " </variablelist>" << endl;
+ t << " </formalpara>" << endl;
+ t << " <para>";
+ t << "Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << endl;
+ t << " <programlisting>" << endl;
+ t << "{" << endl;
+ for (emli.toFirst();(emd=emli.current());++emli)
+ {
+ writeDocbookString(t,emd->name());
+ if (!emd->initializer().isEmpty())
+ {
+ t << "=";
+ writeDocbookString(t,emd->initializer());
+ }
+ t << ", " << endl;
+ }
+ t << "}" << convertToXML(md->name()) << ";" << endl;
+ t << " </programlisting>" << endl;
+ t << " </para>" << endl;
+ t << " </section>" << endl;
+ }
+ }
+ else if (md->memberType()==MemberType_Typedef)
+ {
+ t << " <section xml:id=\"";
+ if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+ {
+ t << md->getGroupDef()->getOutputFileBase();
+ }
+ else
+ {
+ t << memberOutputFileBase(md);
+ }
+ t << "_1" << md->anchor() << "\">" << endl;
+ t << " <title>" << convertToXML(md->definition()) << "</title>";
+ t << " <emphasis>";
+ writeDocbookString(t,md->briefDescription());
+ t << "</emphasis>" << endl;
+ t << " ";
+ writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
+ t << endl;
+ t << " </section>" << endl;
+ }
+ else if (md->memberType()==MemberType_Function)
+ {
+ t << " <section xml:id=\"";
+ if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+ {
+ t << md->getGroupDef()->getOutputFileBase();
+ }
+ else
+ {
+ t << memberOutputFileBase(md);
+ }
+ t << "_1" << md->anchor() << "\">" << endl;
+ t << " <title>" << convertToXML(md->definition()) << " " << convertToXML(md->argsString()) << "</title>";
+ t << " <emphasis>";
+ writeDocbookString(t,md->briefDescription());
+ t << "</emphasis>" << endl;
+ t << " ";
+ writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
+ t << endl;
+ t << " </section>" << endl;
+ }
+ else if (md->memberType()==MemberType_Define)
+ {
+ if (md->documentation())
+ {
+ t << " <section xml:id=\"";
+ if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+ {
+ t << md->getGroupDef()->getOutputFileBase();
+ }
+ else
+ {
+ t << memberOutputFileBase(md);
+ }
+ t << "_1" << md->anchor() << "\">" << endl;
+ t << " <title>" << convertToXML(md->definition()) << "</title>";
+ t << " ";
+ writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
+ t << endl;
+ t << " <para>Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << "</para>" << endl;
+ t << " <para>The Documentation for this define was generated from the following file: </para>" << endl;
+ t << " <para><itemizedlist><listitem><para>" << stripPath(md->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
+ t << " </section>" << endl;
+ }
+ }
+ else if (md->memberType()==MemberType_Variable)
+ {
+ if (md->getClassDef())
+ {
+ if (md->documentation())
+ {
+ t << " <simplesect>" << endl;
+ t << " <title>" << convertToXML(md->definition()) << "</title>";
+ t << " ";
+ writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
+ t << endl;
+ t << " <para>Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << "</para>" << endl;
+ t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl;
+ t << " <para><itemizedlist><listitem><para>" << stripPath(md->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
+ t << " </simplesect>" << endl;
+ }
+ }
+ else
+ {
+ t << " <section xml:id=\"";
+ if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
+ {
+ t << md->getGroupDef()->getOutputFileBase();
+ }
+ else
+ {
+ t << memberOutputFileBase(md);
+ }
+ t << "_1" << md->anchor() << "\">" << endl;
+ t << " <title>" << convertToXML(md->definition()) << "</title>";
+ t << " <emphasis>";
+ writeDocbookString(t,md->briefDescription());
+ t << "</emphasis>" << endl;
+ t << " ";
+ writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
+ t << endl;
+ t << " </section>" << endl;
+ }
+ }
+ }
+}
+
+static void generateDocbookSection(Definition *d,FTextStream &t,MemberList *ml,const char *kind,
+ bool detailed=0, const char *header=0,const char *documentation=0)
+{
+ if (ml==0) return;
+ MemberListIterator mli(*ml);
+ MemberDef *md;
+ int count=0;
+ int doc_count=0;
+ QCString compkind = kind;
+ QCString title, desctitle;
+
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ // namespace members are also inserted in the file scope, but
+ // to prevent this duplication in the Docbook output, we filter those here.
+ if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
+ {
+ count++;
+ }
+ }
+
+ switch (ml->listType())
+ {
+ case MemberListType_decDefineMembers: title="Defines"; desctitle="Define Documentation"; break;
+ case MemberListType_decTypedefMembers: title="Typedefs"; desctitle="Typedef Documentation"; break;
+ case MemberListType_decEnumMembers: title="Enumerations"; desctitle="Enumeration Type documentation"; break;
+ case MemberListType_decFuncMembers: title="Functions"; desctitle="Function Documentation"; break;
+ case MemberListType_decVarMembers: title="Variables"; desctitle="Variable Documentation"; break;
+ case MemberListType_pubAttribs: title="Public Attributes"; desctitle="Member Documentation"; break;
+ case MemberListType_priAttribs: title="Private Attributes"; desctitle="Member Documentation"; break;
+ case MemberListType_proAttribs: title="Protected Attributes";desctitle="Member Documentation"; break;
+ default: title=""; desctitle=""; break;
+ }
+
+ if (count==0) return; // empty list
+
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ if (md->documentation())
+ {
+ doc_count++;
+ }
+ }
+
+ if (detailed)
+ {
+ if (desctitle)
+ {
+ if (desctitle=="Member Documentation")
+ {
+ if (doc_count > 0)
+ {
+ t << " <simplesect>" << endl;
+ t << " <title>" << desctitle << "</title>" << endl;
+ }
+ }
+ else if (desctitle=="Define Documentation")
+ {
+ if (doc_count > 0)
+ {
+ t << " <section>" << endl;
+ t << " <title>" << desctitle << "</title>" << endl;
+ }
+ }
+ else
+ {
+ t << " <section>" << endl;
+ t << " <title>" << desctitle << "</title>" << endl;
+ }
+ }
+ } else
+ {
+ t << " <simplesect>" << endl;
+ if (header)
+ {
+ t << " <title>" << convertToXML(header) << "</title>" << endl;
+ }
+ else
+ {
+ t << " <title>" << title << "</title>" << endl;
+ }
+ }
+
+ if (documentation)
+ {
+ t << " <description>";
+ writeDocbookDocBlock(t,d->docFile(),d->docLine(),d,0,documentation);
+ t << "</description>" << endl;
+ }
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ // namespace members are also inserted in the file scope, but
+ // to prevent this duplication in the Docbook output, we filter those here.
+ if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
+ {
+ generateDocbookForMember(md,t,d,detailed);
+ }
+ }
+ if (detailed)
+ {
+ if (desctitle)
+ {
+ if (desctitle=="Member Documentation")
+ {
+ if (doc_count > 0)
+ {
+ t << " </simplesect>" << endl;
+ }
+ }
+ else if (desctitle=="Define Documentation")
+ {
+ if (doc_count > 0)
+ {
+ t << " </section>" << endl;
+ }
+ }
+ else
+ {
+ t << " </section>" << endl;
+ }
+ }
+ }
+ else
+ {
+ t << " </simplesect>" << endl;
+ }
+}
+
+static void writeInnerClasses(const ClassSDict *cl,FTextStream &t)
+{
+ if (cl)
+ {
+ ClassSDict::Iterator cli(*cl);
+ ClassDef *cd;
+ QCString title = "Classes";
+
+ if (cli.toFirst())
+ {
+ t << " <simplesect>" << endl;
+ t << " <title> " << title << " </title>" << endl;
+ }
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ if (!cd->isHidden() && cd->name().find('@')==-1)
+ {
+ t << " <para>" << endl;
+ t << " <itemizedlist>" << endl;
+ t << " <listitem>" << endl;
+ t << " <para>" << "struct <link linkend=\"" << classOutputFileBase(cd) << "\">" << convertToXML(cd->name()) << "</link>";
+ t << "</para>" << endl;
+ t << " </listitem>" << endl;
+ t << " </itemizedlist>" << endl;
+ t << " </para>" << endl;
+ }
+ }
+ if (cli.toFirst())
+ {
+ t << " </simplesect>" << endl;
+ }
+ }
+}
+
+static void writeInnerNamespaces(const NamespaceSDict *nl,FTextStream &t)
+{
+ if (nl)
+ {
+ NamespaceSDict::Iterator nli(*nl);
+ NamespaceDef *nd;
+ QCString title = "Namespaces";
+
+ if (nli.toFirst())
+ {
+ t << " <simplesect>" << endl;
+ t << " <title> " << title << " </title>" << endl;
+ }
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
+ {
+ t << " <para>" << endl;
+ t << " <itemizedlist>" << endl;
+ t << " <listitem>" << endl;
+ t << " <para>" << "struct <link linkend=\"" << nd->getOutputFileBase() << "\">" << convertToXML(nd->name()) << "</link>";
+ t << "</para>" << endl;
+ t << " </listitem>" << endl;
+ t << " </itemizedlist>" << endl;
+ t << " </para>" << endl;
+ }
+ }
+ if (nli.toFirst())
+ {
+ t << " </simplesect>" << endl;
+ }
+ }
+}
+
+static void writeInnerFiles(const FileList *fl,FTextStream &t)
+{
+ if (fl)
+ {
+ QListIterator<FileDef> fli(*fl);
+ FileDef *fd;
+ QCString title = "Files";
+
+ if (fli.toFirst())
+ {
+ t << " <simplesect>" << endl;
+ t << " <title> " << title << " </title>" << endl;
+ }
+ for (fli.toFirst();(fd=fli.current());++fli)
+ {
+ t << " <para>" << endl;
+ t << " <itemizedlist>" << endl;
+ t << " <listitem>" << endl;
+ t << " <para>" << "file <link linkend=\"" << fd->getOutputFileBase() << "\">" << convertToXML(fd->name()) << "</link>";
+ t << "</para>" << endl;
+ t << " </listitem>" << endl;
+ t << " </itemizedlist>" << endl;
+ t << " </para>" << endl;
+ }
+ if (fli.toFirst())
+ {
+ t << " </simplesect>" << endl;
+ }
+ }
+}
+
+static void writeInnerPages(const PageSDict *pl,FTextStream &t)
+{
+ if (pl)
+ {
+ PageSDict::Iterator pli(*pl);
+ PageDef *pd;
+
+ for (pli.toFirst();(pd=pli.current());++pli)
+ {
+ t << "<xi:include href=\"" << pd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ }
+ }
+}
+
+static void writeInnerGroups(const GroupList *gl,FTextStream &t)
+{
+ if (gl)
+ {
+ GroupListIterator gli(*gl);
+ GroupDef *sgd;
+
+ //Docbook header tags for inner groups
+ if (gli.toFirst())
+ {
+ t << " <simplesect>" << endl;
+ t << " <title>Modules</title>" << endl;
+ t << " </simplesect>" << endl;
+ t << " <para>" << endl;
+ t << " <itemizedlist>" << endl;
+ }
+
+ for (gli.toFirst();(sgd=gli.current());++gli)
+ {
+ t << " <listitem><para><link linkend=\"" << sgd->getOutputFileBase() << "\">" << convertToXML(sgd->groupTitle()) << "</link></para></listitem>" << endl;
+ }
+
+ //Docbook footer tags for inner groups
+ if (gli.toFirst())
+ {
+ t << " </itemizedlist>" << endl;
+ t << " </para>" << endl;
+ }
+
+ }
+}
+
+static void writeInnerDirs(const DirList *dl,FTextStream &t)
+{
+ if (dl)
+ {
+ QListIterator<DirDef> subdirs(*dl);
+ DirDef *subdir;
+ QCString title = "Directories";
+ if (subdirs.toFirst())
+ {
+ t << " <simplesect>" << endl;
+ t << " <title> " << title << " </title>" << endl;
+ }
+ for (subdirs.toFirst();(subdir=subdirs.current());++subdirs)
+ {
+ t << " <para>" << endl;
+ t << " <itemizedlist>" << endl;
+ t << " <listitem>" << endl;
+ t << " <para>" << "dir <link linkend=\"" << subdir->getOutputFileBase() << "\">" << convertToXML(subdir->displayName()) << "</link>";
+ t << "</para>" << endl;
+ t << " </listitem>" << endl;
+ t << " </itemizedlist>" << endl;
+ t << " </para>" << endl;
+ }
+ if (subdirs.toFirst())
+ {
+ t << " </simplesect>" << endl;
+ }
+ }
+}
+
+static void writeInnerGroupFiles(const GroupList *gl,FTextStream &t)
+{
+ if (gl)
+ {
+ GroupListIterator gli(*gl);
+ GroupDef *sgd;
+
+ for (gli.toFirst();(sgd=gli.current());++gli)
+ {
+ t << "<xi:include href=\"" << sgd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ }
+ }
+}
+
+static void generateDocbookForClass(ClassDef *cd,FTextStream &ti)
+{
+ // + brief description
+ // + detailed description
+ // + template argument list(s)
+ // - include file
+ // + member groups
+ // + inheritance diagram
+ // + list of direct super classes
+ // + list of direct sub classes
+ // + list of inner classes
+ // + collaboration diagram
+ // + list of all members
+ // + user defined member sections
+ // + standard member sections
+ // + detailed member documentation
+ // - examples using the class
+
+ if (cd->isReference()) return; // skip external references.
+ if (cd->isHidden()) return; // skip hidden classes.
+ if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
+ if (cd->templateMaster()!=0) return; // skip generated template instances.
+
+ msg("Generating Docbook output for class %s\n",cd->name().data());
+
+ QCString fileDocbook=cd->getOutputFileBase()+".xml";
+ //Add the file Documentation info to index file
+ ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+
+ QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
+ QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+
+ writeDocbookHeader_ID(t, classOutputFileBase(cd));
+ t << "<title>";
+ writeDocbookString(t,cd->name());
+ t << " " << cd->compoundTypeString() << " Reference";
+ t << "</title>" << endl;
+
+ IncludeInfo *ii=cd->includeInfo();
+ if (ii)
+ {
+ QCString nm = ii->includeName;
+ if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
+ if (!nm.isEmpty())
+ {
+ t << "<para>" << endl;
+ t << " <programlisting>#include ";
+ if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
+ {
+ t << "<link linkend=\"" << ii->fileDef->getOutputFileBase() << "\">";
+ }
+ t << "&lt;" << nm << "&gt;" << "</link>";
+ t << "</programlisting>" << endl;
+ t << "</para>" << endl;
+ }
+ }
+
+ writeInnerClasses(cd->getClassSDict(),t);
+
+ writeTemplateList(cd,t);
+ if (cd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ generateDocbookSection(cd,t,mg->members(),"user-defined",0,mg->header(),
+ mg->documentation());
+ }
+ }
+
+
+ QListIterator<MemberList> mli(cd->getMemberLists());
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberListType_detailedLists)==0)
+ {
+ generateDocbookSection(cd,t,ml,g_docbookSectionMapper.find(ml->listType()));
+ }
+ }
+ if (cd->briefDescription())
+ {
+ t << " <simplesect>" << endl;
+ t << " <title>Brief Description</title>" << endl;
+ writeDocbookDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription());
+ t << " </simplesect>" << endl;
+ }
+
+ if (cd->documentation())
+ {
+ t << " <simplesect>" << endl;
+ t << " <title>Detailed Description</title>" << endl;
+ writeDocbookDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation());
+ t << " <para>Definition at line " << cd->getDefLine() << " of file " << stripPath(cd->getDefFileName()) << "</para>" << endl;
+ t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl;
+ t << " <para><itemizedlist><listitem><para>" << stripPath(cd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
+ t << " </simplesect>" << endl;
+ }
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberListType_detailedLists)==0)
+ {
+ generateDocbookSection(cd,t,ml,g_docbookSectionMapper.find(ml->listType()),1);
+ }
+ }
+
+ /*// TODO: Handling of Inheritance and Colloboration graph for Docbook to be implemented
+ DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
+ if (!inheritanceGraph.isTrivial())
+ {
+ t << " <inheritancegraph>" << endl;
+ inheritanceGraph.writeDocbook(t);
+ t << " </inheritancegraph>" << endl;
+ }
+ DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
+ if (!collaborationGraph.isTrivial())
+ {
+ t << " <collaborationgraph>" << endl;
+ collaborationGraph.writeDocbook(t);
+ t << " </collaborationgraph>" << endl;
+ }
+ t << " <location file=\""
+ << cd->getDefFileName() << "\" line=\""
+ << cd->getDefLine() << "\"";
+ if (cd->getStartBodyLine()!=-1)
+ {
+ FileDef *bodyDef = cd->getBodyDef();
+ if (bodyDef)
+ {
+ t << " bodyfile=\"" << bodyDef->absFilePath() << "\"";
+ }
+ t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
+ << cd->getEndBodyLine() << "\"";
+ }
+ t << "/>" << endl;
+ writeListOfAllMembers(cd,t);
+ */
+
+ t << "</section>" << endl;
+
+}
+
+static void generateDocbookForNamespace(NamespaceDef *nd,FTextStream &ti)
+{
+ // + contained class definitions
+ // + contained namespace definitions
+ // + member groups
+ // + normal members
+ // + brief desc
+ // + detailed desc
+ // + location
+ // - files containing (parts of) the namespace definition
+
+ if (nd->isReference() || nd->isHidden()) return; // skip external references
+
+ QCString fileDocbook=nd->getOutputFileBase()+".xml";
+ //Add the file Documentation info to index file
+ ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+
+ QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
+ QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+
+ writeDocbookHeader_ID(t, nd->getOutputFileBase());
+ t << "<title>";
+ writeDocbookString(t,nd->name());
+ t << "</title>" << endl;
+
+ writeInnerClasses(nd->getClassSDict(),t);
+ writeInnerNamespaces(nd->getNamespaceSDict(),t);
+
+ if (nd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ generateDocbookSection(nd,t,mg->members(),"user-defined",0,mg->header(),
+ mg->documentation());
+ }
+ }
+
+ QListIterator<MemberList> mli(nd->getMemberLists());
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberListType_declarationLists)!=0)
+ {
+ generateDocbookSection(nd,t,ml,g_docbookSectionMapper.find(ml->listType()));
+ }
+ }
+
+ if (nd->briefDescription())
+ {
+ t << " <simplesect>" << endl;
+ t << " <title>Brief Description</title>" << endl;
+ writeDocbookDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription());
+ t << " </simplesect>" << endl;
+ }
+
+ if (nd->documentation())
+ {
+ t << " <simplesect>" << endl;
+ t << " <title>Detailed Description</title>" << endl;
+ writeDocbookDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation());
+ t << " <para>Definition at line " << nd->getDefLine() << " of file " << stripPath(nd->getDefFileName()) << "</para>" << endl;
+ t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl;
+ t << " <para><itemizedlist><listitem><para>" << stripPath(nd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
+ t << " </simplesect>" << endl;
+ }
+ t << "</section>" << endl;
+}
+
+static void generateDocbookForFile(FileDef *fd,FTextStream &ti)
+{
+ // + includes files
+ // + includedby files
+ // + include graph
+ // + included by graph
+ // + contained class definitions
+ // + contained namespace definitions
+ // + member groups
+ // + normal members
+ // + brief desc
+ // + detailed desc
+ // + source code
+ // + location
+ // - number of lines
+
+ if (fd->isReference()) return; // skip external references
+
+ QCString fileDocbook=fd->getOutputFileBase()+".xml";
+ //Add the file Documentation info to index file
+ ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+
+ QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
+ QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
+
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+ writeDocbookHeader_ID(t, fd->getOutputFileBase());
+
+ t << " <title>";
+ writeDocbookString(t,fd->name());
+ t << " File Reference";
+ t << "</title>" << endl;
+
+ IncludeInfo *inc;
+
+ if (fd->includeFileList())
+ {
+ QListIterator<IncludeInfo> ili1(*fd->includeFileList());
+ for (ili1.toFirst();(inc=ili1.current());++ili1)
+ {
+ t << " <programlisting>#include ";
+ t << inc->includeName;
+ t << "</programlisting>" << endl;
+ }
+ }
+
+ if (fd->getClassSDict())
+ {
+ writeInnerClasses(fd->getClassSDict(),t);
+ }
+ if (fd->getNamespaceSDict())
+ {
+ writeInnerNamespaces(fd->getNamespaceSDict(),t);
+ }
+
+ if (fd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ generateDocbookSection(fd,t,mg->members(),"user-defined",0,mg->header(),
+ mg->documentation());
+ }
+ }
+
+ QListIterator<MemberList> mli(fd->getMemberLists());
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberListType_declarationLists)!=0)
+ {
+ generateDocbookSection(fd,t,ml,g_docbookSectionMapper.find(ml->listType()));
+ }
+ }
+
+ t << " <simplesect>" << endl;
+ t << " <title>Detailed Description</title>" << endl;
+ writeDocbookDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription());
+ writeDocbookDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation());
+ t << " <para>Definition in file " << fd->getDefFileName() << "</para>" << endl;
+ t << " </simplesect>" << endl;
+
+ /*// TODO: Handling of Program listing for Docbook to be implemented
+ if (Config_getBool("DOCBOOK_PROGRAMLISTING"))
+ {
+ t << " <programlisting>" << endl;
+ writeDocbookCodeBlock(t,fd);
+ t << " </programlisting>" << endl;
+ }
+ */
+
+ t << "</section>" << endl;
+
+}
+
+static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti)
+{
+ // + members
+ // + member groups
+ // + files
+ // + classes
+ // + namespaces
+ // - packages
+ // + pages
+ // + child groups
+ // - examples
+ // + brief description
+ // + detailed description
+
+ if (gd->isReference()) return; // skip external references
+
+ if (!gd->isASubGroup())
+ {
+ QCString fileDocbook=gd->getOutputFileBase()+".xml";
+ //Add the file Documentation info to index file
+ ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ }
+
+ QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
+ QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
+
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+ writeDocbookHeader_ID(t, gd->getOutputFileBase());
+
+ t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl;
+
+ if (gd->briefDescription())
+ {
+ t << " <simplesect>" << endl;
+ t << " <title>Brief Description</title>" << endl;
+ writeDocbookDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription());
+ t << " </simplesect>" << endl;
+ }
+
+ if (gd->documentation())
+ {
+ t << " <simplesect>" << endl;
+ t << " <title>Detailed Description</title>" << endl;
+ writeDocbookDocBlock(t,gd->docFile(),gd->docLine(),gd,0,gd->documentation());
+ t << " </simplesect>" << endl;
+ }
+
+ writeInnerFiles(gd->getFiles(),t);
+ writeInnerClasses(gd->getClasses(),t);
+ writeInnerNamespaces(gd->getNamespaces(),t);
+ writeInnerPages(gd->getPages(),t);
+ writeInnerGroups(gd->getSubGroups(),t);
+
+ if (gd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*gd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ generateDocbookSection(gd,t,mg->members(),"user-defined",0,mg->header(),
+ mg->documentation());
+ }
+ }
+
+ QListIterator<MemberList> mli(gd->getMemberLists());
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberListType_declarationLists)!=0)
+ {
+ generateDocbookSection(gd,t,ml,g_docbookSectionMapper.find(ml->listType()));
+ }
+ }
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberListType_declarationLists)!=0)
+ {
+ generateDocbookSection(gd,t,ml,g_docbookSectionMapper.find(ml->listType()),1);
+ }
+ }
+
+ writeInnerGroupFiles(gd->getSubGroups(),t);
+
+ t << "</section>" << endl;
+
+}
+
+static void generateDocbookForDir(DirDef *dd,FTextStream &ti)
+{
+ if (dd->isReference()) return; // skip external references
+
+ QCString fileDocbook=dd->getOutputFileBase()+".xml";
+ //Add the file Documentation info to index file
+ ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+
+ QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
+ QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+ writeDocbookHeader_ID(t, dd->getOutputFileBase());
+
+ t << " <title>";
+ writeDocbookString(t, dd->displayName());
+ t << " Directory Reference";
+ t << "</title>" << endl;
+
+ writeInnerDirs(&dd->subDirs(),t);
+ writeInnerFiles(dd->getFiles(),t);
+
+ t << " <simplesect>" << endl;
+ t << " <title>Detailed Description</title>" << endl;
+ writeDocbookDocBlock(t,dd->briefFile(),dd->briefLine(),dd,0,dd->briefDescription());
+ writeDocbookDocBlock(t,dd->docFile(),dd->docLine(),dd,0,dd->documentation());
+ t << " <para>Directory location is " << dd->name() << "</para>" << endl;
+ t << " </simplesect>" << endl;
+
+ t << "</section>" << endl;
+}
+
+static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample)
+{
+ // + name
+ // + title
+ // + documentation
+
+ if (pd->isReference()) return;
+
+ QCString pageName = pd->getOutputFileBase();
+ if (pd->getGroupDef())
+ {
+ pageName+=(QCString)"_"+pd->name();
+ }
+ if (pageName=="index")
+ {
+ pageName="mainpage"; // to prevent overwriting the generated index page.
+ }
+
+ QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
+ QCString fileName=outputDirectory+"/"+pageName+".xml";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+
+ if (!pd->hasParentPage())
+ {
+ QCString fileDocbook=pageName+".xml";
+ //Add the file Documentation info to index file
+ ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
+ writeDocbookHeaderMainpage(t);
+ }
+ else
+ {
+ QCString pid = pageName+"_1"+pageName;
+ writeDocbookHeader_ID(t, pid);
+ }
+
+ SectionInfo *si = Doxygen::sectionDict->find(pd->name());
+ if (si)
+ {
+ t << " <title>" << convertToXML(si->title) << "</title>" << endl;
+ }
+ else
+ {
+ t << " <title>" << convertToXML(pd->name()) << "</title>" << endl;
+ }
+
+ if (isExample)
+ {
+ writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
+ pd->documentation()+"\n&lt;include "+pd->name()+"&gt;");
+ }
+ else
+ {
+ writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
+ pd->documentation());
+ }
+ writeInnerPages(pd->getSubPages(),t);
+
+ if (!pd->hasParentPage())
+ {
+ t << endl << "</chapter>" << endl;
+ }
+ else
+ {
+ t << endl << "</section>" << endl;
+ }
+}
+
+void generateDocbook()
+{
+
+ // + classes
+ // + namespaces
+ // + files
+ // + groups
+ // + related pages
+ // - examples
+
+ QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
+ if (outputDirectory.isEmpty())
+ {
+ outputDirectory=QDir::currentDirPath().utf8();
+ }
+ else
+ {
+ QDir dir(outputDirectory);
+ if (!dir.exists())
+ {
+ dir.setPath(QDir::currentDirPath());
+ if (!dir.mkdir(outputDirectory))
+ {
+ err("tag DOCBOOK_OUTPUT: Output directory `%s' does not "
+ "exist and cannot be created\n",outputDirectory.data());
+ exit(1);
+ }
+ else
+ {
+ msg("Notice: Output directory `%s' does not exist. "
+ "I have created it for you.\n", outputDirectory.data());
+ }
+ dir.cd(outputDirectory);
+ }
+ outputDirectory=dir.absPath().utf8();
+ }
+
+ QDir dir(outputDirectory);
+ if (!dir.exists())
+ {
+ dir.setPath(QDir::currentDirPath());
+ if (!dir.mkdir(outputDirectory))
+ {
+ err("Cannot create directory %s\n",outputDirectory.data());
+ return;
+ }
+ }
+ QDir docbookDir(outputDirectory);
+ createSubDirs(docbookDir);
+
+ QCString fileName=outputDirectory+"/index.xml";
+ QCString dbk_projectName = Config_getString("PROJECT_NAME");
+ QFile f(fileName);
+
+ f.setName(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+
+ // write index header for Docbook which calls the structure file
+ t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
+ t << "<book xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" << endl;
+ t << " <info>" << endl;
+ t << " <title>" << dbk_projectName << "</title>" << endl;
+ t << " </info>" << endl;
+
+ // NAMESPACE DOCUMENTATION
+
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+
+ //Namespace Documentation index header
+ if (nli.toFirst())
+ {
+ t << " <chapter>" << endl;
+ t << " <title>Namespace Documentation</title>" << endl;
+ }
+
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ msg("Generating Docbook output for namespace %s\n",nd->name().data());
+ generateDocbookForNamespace(nd,t);
+ }
+
+ //Namespace Documentation index footer
+ if (nli.toFirst())
+ {
+ t << " </chapter>" << endl;
+ }
+
+ /** MAINPAGE DOCUMENTATION **/
+
+ if (Doxygen::mainPage)
+ {
+ msg("Generating Docbook output for the main page\n");
+ generateDocbookForPage(Doxygen::mainPage,t,FALSE);
+ }
+
+ // PAGE DOCUMENTATION
+ {
+ PageSDict::Iterator pdi(*Doxygen::pageSDict);
+ PageDef *pd=0;
+
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ msg("Generating Docbook output for page %s\n",pd->name().data());
+ generateDocbookForPage(pd,t,FALSE);
+ }
+ }
+
+ /** MODULE GROUP DOCUMENTATION **/
+
+ GroupSDict::Iterator gli(*Doxygen::groupSDict);
+ GroupDef *gd;
+
+ //Module group Documentation index header
+ if (gli.toFirst())
+ {
+ t << " <chapter>" << endl;
+ t << " <title>Module Documentation</title>" << endl;
+ }
+
+ for (;(gd=gli.current());++gli)
+ {
+ msg("Generating Docbook output for group %s\n",gd->name().data());
+ generateDocbookForGroup(gd,t);
+ }
+
+ //Module group Documentation index footer
+ if (gli.toFirst())
+ {
+ t << " </chapter>" << endl;
+ }
+
+ //CLASS DOCUMENTATION
+
+ {
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+
+ //Class Documentation index header
+ if (cli.toFirst())
+ {
+ t << " <chapter>" << endl;
+ t << " <title>Class Documentation</title>" << endl;
+ }
+
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ generateDocbookForClass(cd,t);
+ }
+
+ //Class Documentation index footer
+ if (cli.toFirst())
+ {
+ t << " </chapter>" << endl;
+ }
+ }
+
+ // FILE DOCUMENTATION
+
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+
+ //File Documentation index header
+ if (fnli.toFirst())
+ {
+ t << " <chapter>" << endl;
+ t << " <title>File Documentation</title>" << endl;
+ }
+
+ for (;(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ msg("Generating Docbook output for file %s\n",fd->name().data());
+ generateDocbookForFile(fd,t);
+ }
+ }
+
+ //File Documentation index footer
+ if (fnli.toFirst())
+ {
+ t << " </chapter>" << endl;
+ }
+
+ // DIRECTORY DOCUMENTATION
+
+ {
+ DirDef *dir;
+ DirSDict::Iterator sdi(*Doxygen::directories);
+
+ //Directory Documentation index header
+ if (sdi.toFirst())
+ {
+ t << " <chapter>" << endl;
+ t << " <title>Directory Documentation</title>" << endl;
+ }
+
+ for (sdi.toFirst();(dir=sdi.current());++sdi)
+ {
+ msg("Generate Docbook output for dir %s\n",dir->name().data());
+ generateDocbookForDir(dir,t);
+ }
+
+ //Module group Documentation index footer
+ if (sdi.toFirst())
+ {
+ t << " </chapter>" << endl;
+ }
+ }
+
+ // EXAMPLE PAGE DOCUMENTATION
+
+ {
+ PageSDict::Iterator pdi(*Doxygen::exampleSDict);
+ PageDef *pd=0;
+
+ //Example Page Documentation index header
+ if (pdi.toFirst())
+ {
+ t << " <chapter>" << endl;
+ t << " <title>Example Documentation</title>" << endl;
+ }
+
+ for (pdi.toFirst();(pd=pdi.current());++pdi)
+ {
+ msg("Generating Docbook output for example %s\n",pd->name().data());
+ generateDocbookForPage(pd,t,TRUE);
+ }
+
+ //Example Page Documentation index footer
+ if (pdi.toFirst())
+ {
+ t << " </chapter>" << endl;
+ }
+ }
+
+ t << "</book>" << endl;
+
+}
+
+
diff --git a/src/docbookgen.h b/src/docbookgen.h
new file mode 100644
index 0000000..344cb5b
--- /dev/null
+++ b/src/docbookgen.h
@@ -0,0 +1,20 @@
+/******************************************************************************
+*
+*
+*
+* Copyright (C) 1997-2012 by Dimitri van Heesch.
+*
+* Permission to use, copy, modify, and distribute this software and its
+* documentation under the terms of the GNU General Public License is hereby
+* granted. No representations are made about the suitability of this software
+* for any purpose. It is provided "as is" without express or implied warranty.
+* See the GNU General Public License for more details.
+*
+*/
+
+#ifndef DOCBOOKGEN_H
+#define DOCBOOKGEN_H
+
+void generateDocbook();
+
+#endif
diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp
new file mode 100644
index 0000000..aa750db
--- /dev/null
+++ b/src/docbookvisitor.cpp
@@ -0,0 +1,1397 @@
+/******************************************************************************
+ *
+ *
+ *
+ *
+ * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <qfileinfo.h>
+
+#include "docbookvisitor.h"
+#include "docparser.h"
+#include "language.h"
+#include "doxygen.h"
+#include "outputgen.h"
+#include "docbookgen.h"
+#include "dot.h"
+#include "message.h"
+#include "util.h"
+#include "parserintf.h"
+#include "filename.h"
+#include "config.h"
+#include "filedef.h"
+#include "msc.h"
+
+DocbookDocVisitor::DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci)
+ : DocVisitor(DocVisitor_Docbook), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
+{
+}
+
+//--------------------------------------
+// visitor functions for leaf nodes
+//--------------------------------------
+
+void DocbookDocVisitor::visit(DocWord *w)
+{
+ if (m_hide) return;
+ filter(w->word());
+}
+
+void DocbookDocVisitor::visit(DocLinkedWord *w)
+{
+ if (m_hide) return;
+ startLink(w->file(),w->anchor());
+ filter(w->word());
+ endLink();
+}
+
+void DocbookDocVisitor::visit(DocWhiteSpace *w)
+{
+ if (m_hide) return;
+ if (m_insidePre)
+ {
+ m_t << w->chars();
+ }
+ else
+ {
+ m_t << " ";
+ }
+}
+
+void DocbookDocVisitor::visit(DocSymbol *s)
+{
+ if (m_hide) return;
+ switch(s->symbol())
+ {
+ case DocSymbol::BSlash: m_t << "\\"; break;
+ case DocSymbol::At: m_t << "@"; break;
+ case DocSymbol::Less: m_t << "&lt;"; break;
+ case DocSymbol::Greater: m_t << "&gt;"; break;
+ case DocSymbol::Amp: m_t << "&amp;"; break;
+ case DocSymbol::Dollar: m_t << "$"; break;
+ case DocSymbol::Hash: m_t << "#"; break;
+ case DocSymbol::DoubleColon: m_t << "::"; break;
+ case DocSymbol::Percent: m_t << "%"; break;
+ case DocSymbol::Copy: m_t << "&#x00A9;"; break;
+ case DocSymbol::Tm: m_t << "&#8482;"; break;
+ case DocSymbol::Reg: m_t << "&#174;"; break;
+ case DocSymbol::Apos: m_t << "&apos;"; break;
+ case DocSymbol::Quot: m_t << "&quot;"; break;
+ case DocSymbol::Lsquo: m_t << "&#8216;"; break;
+ case DocSymbol::Rsquo: m_t << "&#8217;"; break;
+ case DocSymbol::Ldquo: m_t << "&#8220;"; break;
+ case DocSymbol::Rdquo: m_t << "&#8221;"; break;
+ case DocSymbol::Ndash: m_t << "&#8211;"; break;
+ case DocSymbol::Mdash: m_t << "&#8212;"; break;
+ case DocSymbol::Uml: m_t << "&#168;"; break;
+ case DocSymbol::Acute: m_t << "&#180;"; break;
+ case DocSymbol::Grave: m_t << "&#192;"; break;
+ case DocSymbol::Circ: m_t << "&#710;"; break;
+ case DocSymbol::Tilde: m_t << "&#732;"; break;
+ case DocSymbol::Szlig: m_t << "&#223;"; break;
+ case DocSymbol::Cedil: m_t << "&#184;"; break;
+ case DocSymbol::Ring: m_t << "&#197;"; break;
+ case DocSymbol::Slash: m_t << "&#216;"; break;
+ case DocSymbol::Nbsp: m_t << "&#160;"; break;
+ case DocSymbol::Aelig: m_t << "&#230;"; break;
+ case DocSymbol::AElig: m_t << "&#198;"; break;
+ case DocSymbol::GrkGamma: m_t << "&#915;"; break;
+ case DocSymbol::GrkDelta: m_t << "&#916;"; break;
+ case DocSymbol::GrkTheta: m_t << "&#920;"; break;
+ case DocSymbol::GrkLambda: m_t << "&#923;"; break;
+ case DocSymbol::GrkXi: m_t << "&#926;"; break;
+ case DocSymbol::GrkPi: m_t << "&#928;"; break;
+ case DocSymbol::GrkSigma: m_t << "&#931;"; break;
+ case DocSymbol::GrkUpsilon: m_t << "&#933;"; break;
+ case DocSymbol::GrkPhi: m_t << "&#934;"; break;
+ case DocSymbol::GrkPsi: m_t << "&#936;"; break;
+ case DocSymbol::GrkOmega: m_t << "&#937;"; break;
+ case DocSymbol::Grkalpha: m_t << "&#945;"; break;
+ case DocSymbol::Grkbeta: m_t << "&#946;"; break;
+ case DocSymbol::Grkgamma: m_t << "&#947;"; break;
+ case DocSymbol::Grkdelta: m_t << "&#948;"; break;
+ case DocSymbol::Grkepsilon: m_t << "&#949;"; break;
+ case DocSymbol::Grkzeta: m_t << "&#950;"; break;
+ case DocSymbol::Grketa: m_t << "&#951;"; break;
+ case DocSymbol::Grktheta: m_t << "&#952;"; break;
+ case DocSymbol::Grkiota: m_t << "&#953;"; break;
+ case DocSymbol::Grkkappa: m_t << "&#954;"; break;
+ case DocSymbol::Grklambda: m_t << "&#955;"; break;
+ case DocSymbol::Grkmu: m_t << "&#956;"; break;
+ case DocSymbol::Grknu: m_t << "&#957;"; break;
+ case DocSymbol::Grkxi: m_t << "&#958;"; break;
+ case DocSymbol::Grkpi: m_t << "&#960;"; break;
+ case DocSymbol::Grkrho: m_t << "&#961;"; break;
+ case DocSymbol::Grksigma: m_t << "&#963;"; break;
+ case DocSymbol::Grktau: m_t << "&#964;"; break;
+ case DocSymbol::Grkupsilon: m_t << "&#965;"; break;
+ case DocSymbol::Grkphi: m_t << "&#966;"; break;
+ case DocSymbol::Grkchi: m_t << "&#967;"; break;
+ case DocSymbol::Grkpsi: m_t << "&#968;"; break;
+ case DocSymbol::Grkomega: m_t << "&#969;"; break;
+ case DocSymbol::Grkvarsigma: m_t << "&#962;"; break;
+ case DocSymbol::Section: m_t << "<simplesect/>"; break;
+ case DocSymbol::Degree: m_t << "&#176;"; break;
+ case DocSymbol::Prime: m_t << "&#8242;"; break;
+ case DocSymbol::DoublePrime: m_t << "&#8243;"; break;
+ case DocSymbol::Infinity: m_t << "&#8734;"; break;
+ case DocSymbol::EmptySet: m_t << "&#8709;"; break;
+ case DocSymbol::PlusMinus: m_t << "&#177;"; break;
+ case DocSymbol::Times: m_t << "&#215;"; break;
+ case DocSymbol::Minus: m_t << "&#8722;"; break;
+ case DocSymbol::CenterDot: m_t << "&#8901;"; break;
+ case DocSymbol::Partial: m_t << "&#8706;"; break;
+ case DocSymbol::Nabla: m_t << "&#8711;"; break;
+ case DocSymbol::SquareRoot: m_t << "&#8730;"; break;
+ case DocSymbol::Perpendicular: m_t << "&#8869;"; break;
+ case DocSymbol::Sum: m_t << "&#8721;"; break;
+ case DocSymbol::Integral: m_t << "&#8747;"; break;
+ case DocSymbol::Product: m_t << "&#8719;"; break;
+ case DocSymbol::Similar: m_t << "&#8764;"; break;
+ case DocSymbol::Approx: m_t << "&#8776;"; break;
+ case DocSymbol::NotEqual: m_t << "&#8800;"; break;
+ case DocSymbol::Equivalent: m_t << "&#8801;"; break;
+ case DocSymbol::Proportional: m_t << "&#8733;"; break;
+ case DocSymbol::LessEqual: m_t << "&#8804;"; break;
+ case DocSymbol::GreaterEqual: m_t << "&#8805;"; break;
+ case DocSymbol::LeftArrow: m_t << "&#8592;"; break;
+ case DocSymbol::RightArrow: m_t << "&#8594;"; break;
+ case DocSymbol::SetIn: m_t << "&#8712;"; break;
+ case DocSymbol::SetNotIn: m_t << "&#8713;"; break;
+ case DocSymbol::LeftCeil: m_t << "&#8968;"; break;
+ case DocSymbol::RightCeil: m_t << "&#8969;"; break;
+ case DocSymbol::LeftFloor: m_t << "&#8970;"; break;
+ case DocSymbol::RightFloor: m_t << "&#8971;"; break;
+ default:
+ err("unknown symbol found\n");
+ }
+}
+
+void DocbookDocVisitor::visit(DocURL *u)
+{
+ if (m_hide) return;
+ m_t << "<link xlink:href=\"";
+ if (u->isEmail()) m_t << "mailto:";
+ filter(u->url());
+ m_t << "\">";
+ filter(u->url());
+ m_t << "</link>";
+}
+
+void DocbookDocVisitor::visit(DocLineBreak *)
+{
+ if (m_hide) return;
+ m_t << endl << "<literallayout>\n</literallayout>" << endl;
+}
+
+void DocbookDocVisitor::visit(DocHorRuler *)
+{
+ if (m_hide) return;
+ m_t << "<informaltable frame='bottom'><tgroup cols='1'><colspec align='center'/><tbody><row><entry align='center'>\n";
+ m_t << "</entry></row></tbody></tgroup></informaltable>\n";
+}
+
+void DocbookDocVisitor::visit(DocStyleChange *s)
+{
+ if (m_hide) return;
+ switch (s->style())
+ {
+ case DocStyleChange::Bold:
+ if (s->enable()) m_t << "<emphasis role=\"bold\">"; else m_t << "</emphasis>";
+ break;
+ case DocStyleChange::Italic:
+ if (s->enable()) m_t << "<emphasis>"; else m_t << "</emphasis>";
+ break;
+ case DocStyleChange::Code:
+ if (s->enable()) m_t << "<computeroutput>"; else m_t << "</computeroutput>";
+ break;
+ case DocStyleChange::Subscript:
+ if (s->enable()) m_t << "<subscript>"; else m_t << "</subscript>";
+ break;
+ case DocStyleChange::Superscript:
+ if (s->enable()) m_t << "<superscript>"; else m_t << "</superscript>";
+ break;
+ case DocStyleChange::Center:
+ if (s->enable()) m_t << "<informaltable frame='none'><tgroup cols='1'><colspec align='center'/><tbody><row><entry align='center'>";
+ else m_t << "</entry></row></tbody></tgroup></informaltable>";
+ break;
+ case DocStyleChange::Preformatted:
+ if (s->enable())
+ {
+ m_t << "<literallayout>";
+ m_insidePre=TRUE;
+ }
+ else
+ {
+ m_t << "</literallayout>";
+ m_insidePre=FALSE;
+ }
+ break;
+ /* There is no equivalent Docbook tag for rendering Small text */
+ case DocStyleChange::Small: /* XSLT Stylesheets can be used */ break;
+ /* HTML only */
+ case DocStyleChange::Div: /* HTML only */ break;
+ case DocStyleChange::Span: /* HTML only */ break;
+ }
+}
+
+void DocbookDocVisitor::visit(DocVerbatim *s)
+{
+ if (m_hide) return;
+ switch(s->type())
+ {
+ case DocVerbatim::Code: // fall though
+ m_t << "<programlisting>";
+ Doxygen::parserManager->getParser(m_langExt)
+ ->parseCode(m_ci,s->context(),s->text(),
+ s->isExample(),s->exampleFile());
+ m_t << "</programlisting>";
+ break;
+ case DocVerbatim::Verbatim:
+ m_t << "<programlisting><literallayout>";
+ filter(s->text());
+ m_t << "</literallayout></programlisting>";
+ break;
+ case DocVerbatim::HtmlOnly:
+ break;
+ case DocVerbatim::RtfOnly:
+ break;
+ case DocVerbatim::ManOnly:
+ break;
+ case DocVerbatim::LatexOnly:
+ break;
+ case DocVerbatim::XmlOnly:
+ break;
+ case DocVerbatim::DocbookOnly:
+ break;
+ m_t << s->text();
+ break;
+ case DocVerbatim::Dot:
+ {
+ static int dotindex = 1;
+ QCString baseName(4096);
+ QCString stext = s->text();
+ m_t << "<para>" << endl;
+ baseName.sprintf("%s%d",
+ (Config_getString("DOCBOOK_OUTPUT")+"/inline_dotgraph_").data(),
+ dotindex++
+ );
+ QFile file(baseName+".dot");
+ if (!file.open(IO_WriteOnly))
+ {
+ err("Could not open file %s.msc for writing\n",baseName.data());
+ }
+ file.writeBlock( stext, stext.length() );
+ file.close();
+ m_t << " <figure>" << endl;
+ m_t << " <title></title>" << endl;
+ m_t << " <mediaobject>" << endl;
+ m_t << " <imageobject>" << endl;
+ writeDotFile(baseName);
+ m_t << " </imageobject>" << endl;
+ m_t << " </mediaobject>" << endl;
+ m_t << " </figure>" << endl;
+ m_t << "</para>" << endl;
+ }
+ break;
+ case DocVerbatim::Msc:
+ static int mscindex = 1;
+ QCString baseName(4096);
+ QCString stext = s->text();
+ m_t << "<para>" << endl;
+ baseName.sprintf("%s%d",
+ (Config_getString("DOCBOOK_OUTPUT")+"/inline_mscgraph_").data(),
+ mscindex++
+ );
+ QFile file(baseName+".msc");
+ if (!file.open(IO_WriteOnly))
+ {
+ err("Could not open file %s.msc for writing\n",baseName.data());
+ }
+ QCString text = "msc {";
+ text+=stext;
+ text+="}";
+ file.writeBlock( text, text.length() );
+ file.close();
+ m_t << " <figure>" << endl;
+ m_t << " <title></title>" << endl;
+ m_t << " <mediaobject>" << endl;
+ m_t << " <imageobject>" << endl;
+ writeMscFile(baseName);
+ m_t << " </imageobject>" << endl;
+ m_t << " </mediaobject>" << endl;
+ m_t << " </figure>" << endl;
+ m_t << "</para>" << endl;
+ break;
+ }
+}
+
+void DocbookDocVisitor::visit(DocAnchor *anc)
+{
+ if (m_hide) return;
+ m_t << "<anchor id=\"" << anc->file() << "_1" << anc->anchor() << "\"/>";
+}
+
+void DocbookDocVisitor::visit(DocInclude *inc)
+{
+ if (m_hide) return;
+ switch(inc->type())
+ {
+ case DocInclude::IncWithLines:
+ {
+ m_t << "<programlisting>";
+ QFileInfo cfi( inc->file() );
+ FileDef fd( cfi.dirPath().utf8(), cfi.fileName().utf8() );
+ Doxygen::parserManager->getParser(inc->extension())
+ ->parseCode(m_ci,inc->context(),
+ inc->text(),
+ inc->isExample(),
+ inc->exampleFile(), &fd);
+ m_t << "</programlisting>";
+ }
+ break;
+ case DocInclude::Include:
+ m_t << "<programlisting>";
+ Doxygen::parserManager->getParser(inc->extension())
+ ->parseCode(m_ci,inc->context(),
+ inc->text(),
+ inc->isExample(),
+ inc->exampleFile());
+ m_t << "</programlisting>";
+ break;
+ case DocInclude::DontInclude:
+ break;
+ case DocInclude::HtmlInclude:
+ break;
+ case DocInclude::VerbInclude:
+ m_t << "<verbatim>";
+ filter(inc->text());
+ m_t << "</verbatim>";
+ break;
+ case DocInclude::Snippet:
+ m_t << "<programlisting>";
+ Doxygen::parserManager->getParser(inc->extension())
+ ->parseCode(m_ci,
+ inc->context(),
+ extractBlock(inc->text(),inc->blockId()),
+ inc->isExample(),
+ inc->exampleFile()
+ );
+ m_t << "</programlisting>";
+ break;
+ }
+}
+
+void DocbookDocVisitor::visit(DocIncOperator *op)
+{
+ if (op->isFirst())
+ {
+ if (!m_hide)
+ {
+ m_t << "<programlisting>";
+ }
+ pushEnabled();
+ m_hide = TRUE;
+ }
+ if (op->type()!=DocIncOperator::Skip)
+ {
+ popEnabled();
+ if (!m_hide)
+ {
+ Doxygen::parserManager->getParser(m_langExt)
+ ->parseCode(m_ci,op->context(),
+ op->text(),op->isExample(),
+ op->exampleFile());
+ }
+ pushEnabled();
+ m_hide=TRUE;
+ }
+ if (op->isLast())
+ {
+ popEnabled();
+ if (!m_hide) m_t << "</programlisting>";
+ }
+ else
+ {
+ if (!m_hide) m_t << endl;
+ }
+}
+
+void DocbookDocVisitor::visit(DocFormula *f)
+{
+ if (m_hide) return;
+ m_t << "<equation><title>" << f->name() << "</title>";
+ filter(f->text());
+ m_t << "</equation>";
+}
+
+void DocbookDocVisitor::visit(DocIndexEntry *ie)
+{
+ if (m_hide) return;
+ m_t << "<indexentry><primaryie>" << endl;
+ filter(ie->entry());
+ m_t << "</primaryie><secondaryie></secondaryie></indexentry>" << endl;
+}
+
+void DocbookDocVisitor::visit(DocSimpleSectSep *)
+{
+ m_t << "<simplesect/>";
+}
+
+void DocbookDocVisitor::visit(DocCite *cite)
+{
+ if (m_hide) return;
+ if (!cite->file().isEmpty()) startLink(cite->file(),cite->anchor());
+ filter(cite->text());
+ if (!cite->file().isEmpty()) endLink();
+}
+
+//--------------------------------------
+// visitor functions for compound nodes
+//--------------------------------------
+
+void DocbookDocVisitor::visitPre(DocAutoList *l)
+{
+ if (m_hide) return;
+ if (l->isEnumList())
+ {
+ m_t << "<orderedlist>\n";
+ }
+ else
+ {
+ m_t << "<itemizedlist>\n";
+ }
+}
+
+void DocbookDocVisitor::visitPost(DocAutoList *l)
+{
+ if (m_hide) return;
+ if (l->isEnumList())
+ {
+ m_t << "</orderedlist>\n";
+ }
+ else
+ {
+ m_t << "</itemizedlist>\n";
+ }
+}
+
+void DocbookDocVisitor::visitPre(DocAutoListItem *)
+{
+ if (m_hide) return;
+ m_t << "<listitem>";
+}
+
+void DocbookDocVisitor::visitPost(DocAutoListItem *)
+{
+ if (m_hide) return;
+ m_t << "</listitem>";
+}
+
+void DocbookDocVisitor::visitPre(DocPara *)
+{
+ if (m_hide) return;
+ m_t << endl;
+ m_t << "<para>";
+}
+
+void DocbookDocVisitor::visitPost(DocPara *)
+{
+ if (m_hide) return;
+ m_t << "</para>";
+ m_t << endl;
+}
+
+void DocbookDocVisitor::visitPre(DocRoot *)
+{
+ //m_t << "<hr><h4><font color=\"red\">New parser:</font></h4>\n";
+}
+
+void DocbookDocVisitor::visitPost(DocRoot *)
+{
+ //m_t << "<hr><h4><font color=\"red\">Old parser:</font></h4>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocSimpleSect *s)
+{
+ if (m_hide) return;
+ switch(s->type())
+ {
+ case DocSimpleSect::See:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trSeeAlso() << ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trSeeAlso()) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::Return:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trReturns()<< ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trReturns()) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::Author:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trAuthor(TRUE, TRUE) << ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trAuthor(TRUE, TRUE)) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::Authors:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trAuthor(TRUE, FALSE) << ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trAuthor(TRUE, FALSE)) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::Version:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trVersion() << ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trVersion()) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::Since:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trSince() << ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trSince()) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::Date:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trDate() << ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trDate()) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::Note:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trNote() << ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trNote()) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::Warning:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trWarning() << ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trWarning()) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::Pre:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trPrecondition() << ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trPrecondition()) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::Post:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trPostcondition() << ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trPostcondition()) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::Copyright:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trCopyright() << ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trCopyright()) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::Invar:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trInvariant() << ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trInvariant()) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::Remark:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trRemarks() << ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trRemarks()) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::Attention:
+ if (m_insidePre)
+ {
+ m_t << "<formalpara><title>" << theTranslator->trAttention() << ": </title>" << endl;
+ }
+ else
+ {
+ m_t << "<formalpara><title>" << convertToXML(theTranslator->trAttention()) << ": </title>" << endl;
+ }
+ break;
+ case DocSimpleSect::User:
+ m_t << "<formalpara><title></title>" << endl;
+ break;
+ case DocSimpleSect::Rcs:
+ m_t << "<formalpara><title></title>" << endl;
+ break;
+ case DocSimpleSect::Unknown: m_t << "<formalpara><title></title>" << endl; break;
+ }
+}
+
+void DocbookDocVisitor::visitPost(DocSimpleSect *)
+{
+ if (m_hide) return;
+ m_t << "</formalpara>" << endl;
+}
+
+void DocbookDocVisitor::visitPre(DocTitle *)
+{
+ if (m_hide) return;
+ m_t << "<title>";
+}
+
+void DocbookDocVisitor::visitPost(DocTitle *)
+{
+ if (m_hide) return;
+ m_t << "</title>";
+}
+
+void DocbookDocVisitor::visitPre(DocSimpleList *)
+{
+ if (m_hide) return;
+ m_t << "<itemizedlist>\n";
+}
+
+void DocbookDocVisitor::visitPost(DocSimpleList *)
+{
+ if (m_hide) return;
+ m_t << "</itemizedlist>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocSimpleListItem *)
+{
+ if (m_hide) return;
+ m_t << "<listitem>";
+}
+
+void DocbookDocVisitor::visitPost(DocSimpleListItem *)
+{
+ if (m_hide) return;
+ m_t << "</listitem>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocSection *s)
+{
+ if (m_hide) return;
+ m_t << "<section xml:id=\"" << s->file();
+ if (!s->anchor().isEmpty()) m_t << "_1" << s->anchor();
+ m_t << "\">" << endl;
+ m_t << "<title>";
+ filter(s->title());
+ m_t << "</title>" << endl;
+}
+
+void DocbookDocVisitor::visitPost(DocSection *)
+{
+ m_t << "</section>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlList *s)
+{
+ if (m_hide) return;
+ if (s->type()==DocHtmlList::Ordered)
+ m_t << "<orderedlist>\n";
+ else
+ m_t << "<itemizedlist>\n";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlList *s)
+{
+ if (m_hide) return;
+ if (s->type()==DocHtmlList::Ordered)
+ m_t << "</orderedlist>\n";
+ else
+ m_t << "</itemizedlist>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlListItem *)
+{
+ if (m_hide) return;
+ m_t << "<listitem>\n";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlListItem *)
+{
+ if (m_hide) return;
+ m_t << "</listitem>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlDescList *)
+{
+ if (m_hide) return;
+ m_t << "<variablelist>\n";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlDescList *)
+{
+ if (m_hide) return;
+ m_t << "</variablelist>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlDescTitle *)
+{
+ if (m_hide) return;
+ m_t << "<varlistentry><term>";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlDescTitle *)
+{
+ if (m_hide) return;
+ m_t << "</term>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlDescData *)
+{
+ if (m_hide) return;
+ m_t << "<listitem>";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlDescData *)
+{
+ if (m_hide) return;
+ m_t << "</listitem></varlistentry>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlTable *t)
+{
+ if (m_hide) return;
+ m_t << "<table frame=\"all\">" << endl;
+ m_t << " <title></title>" << endl;
+ m_t << " <tgroup cols=\"" << t->numColumns() << "\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl;
+ m_t << " <tbody>" << endl;
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlTable *)
+{
+ if (m_hide) return;
+ m_t << " </tbody>" << endl;
+ m_t << " </tgroup>" << endl;
+ m_t << "</table>" << endl;
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlRow *)
+{
+ if (m_hide) return;
+ m_t << "<row>\n";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlRow *)
+{
+ if (m_hide) return;
+ m_t << "</row>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlCell *)
+{
+ if (m_hide) return;
+ m_t << "<entry>";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlCell *)
+{
+ if (m_hide) return;
+ m_t << "</entry>";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlCaption *)
+{
+ if (m_hide) return;
+ m_t << "<caption>";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlCaption *)
+{
+ if (m_hide) return;
+ m_t << "</caption>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocInternal *)
+{
+ if (m_hide) return;
+ // TODO: to be implemented
+}
+
+void DocbookDocVisitor::visitPost(DocInternal *)
+{
+ if (m_hide) return;
+ // TODO: to be implemented
+}
+
+void DocbookDocVisitor::visitPre(DocHRef *href)
+{
+ if (m_hide) return;
+ m_t << "<link xlink:href=\"" << href->url() << "\">";
+}
+
+void DocbookDocVisitor::visitPost(DocHRef *)
+{
+ if (m_hide) return;
+ m_t << "</link>";
+}
+
+void DocbookDocVisitor::visitPre(DocHtmlHeader *)
+{
+ if (m_hide) return;
+ m_t << "<formalpara><title>";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlHeader *)
+{
+ if (m_hide) return;
+ m_t << "</title></formalpara>\n";
+}
+
+void DocbookDocVisitor::visitPre(DocImage *img)
+{
+ if (img->type()==DocImage::Latex)
+ {
+ if (m_hide) return;
+ m_t << endl;
+ m_t << " <figure>" << endl;
+ m_t << " <title>";
+ }
+ else
+ {
+ pushEnabled();
+ m_hide=TRUE;
+ }
+}
+
+void DocbookDocVisitor::visitPost(DocImage *img)
+{
+ if (img->type()==DocImage::Latex)
+ {
+ if (m_hide) return;
+ QCString typevar;
+ m_t << "</title>" << endl;
+ m_t << " <mediaobject>" << endl;
+ m_t << " <imageobject>" << endl;
+ QCString baseName=img->name();
+ int i;
+ if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ m_t << " <imagedata";
+ if (!img->width().isEmpty())
+ {
+ m_t << " width=\"";
+ filter(img->width());
+ m_t << "\"";
+ }
+ else if (!img->height().isEmpty())
+ {
+ m_t << " depth=\"";
+ filter(img->height());
+ m_t << "\"";
+ }
+ m_t << " align=\"center\" fileref=\"" << baseName << "\">";
+ m_t << "</imagedata>" << endl;
+ m_t << " </imageobject>" << endl;
+ m_t << " </mediaobject>" << endl;
+ m_t << " </figure>" << endl;
+ // copy the image to the output dir
+ QCString m_file;
+ bool ambig;
+ FileDef *fd=findFileDef(Doxygen::imageNameDict, baseName, ambig);
+ if (fd)
+ {
+ m_file=fd->absFilePath();
+ }
+ QFile inImage(m_file);
+ QFile outImage(Config_getString("DOCBOOK_OUTPUT")+"/"+baseName.data());
+ if (inImage.open(IO_ReadOnly))
+ {
+ if (outImage.open(IO_WriteOnly))
+ {
+ char *buffer = new char[inImage.size()];
+ inImage.readBlock(buffer,inImage.size());
+ outImage.writeBlock(buffer,inImage.size());
+ outImage.flush();
+ delete[] buffer;
+ }
+ }
+ }
+ else
+ {
+ popEnabled();
+ }
+}
+
+void DocbookDocVisitor::visitPre(DocDotFile *df)
+{
+ if (m_hide) return;
+ startDotFile(df->file(),df->width(),df->height(),df->hasCaption());
+}
+
+void DocbookDocVisitor::visitPost(DocDotFile *df)
+{
+ if (m_hide) return;
+ endDotFile(df->hasCaption());
+}
+
+void DocbookDocVisitor::visitPre(DocMscFile *df)
+{
+ if (m_hide) return;
+ startMscFile(df->file(),df->width(),df->height(),df->hasCaption());
+}
+
+void DocbookDocVisitor::visitPost(DocMscFile *df)
+{
+ if (m_hide) return;
+ endMscFile(df->hasCaption());
+}
+void DocbookDocVisitor::visitPre(DocLink *lnk)
+{
+ if (m_hide) return;
+ startLink(lnk->file(),lnk->anchor());
+}
+
+void DocbookDocVisitor::visitPost(DocLink *)
+{
+ if (m_hide) return;
+ endLink();
+}
+
+void DocbookDocVisitor::visitPre(DocRef *ref)
+{
+ if (m_hide) return;
+ if (!ref->file().isEmpty()) startLink(ref->file(),ref->anchor());
+ if (!ref->hasLinkText()) filter(ref->targetTitle());
+}
+
+void DocbookDocVisitor::visitPost(DocRef *ref)
+{
+ if (m_hide) return;
+ if (!ref->file().isEmpty()) endLink();
+}
+
+void DocbookDocVisitor::visitPre(DocSecRefItem *ref)
+{
+ if (m_hide) return;
+ m_t << "<tocitem id=\"" << ref->file() << "_1" << ref->anchor() << "\">";
+}
+
+void DocbookDocVisitor::visitPost(DocSecRefItem *)
+{
+ if (m_hide) return;
+ m_t << "</tocitem>" << endl;
+}
+
+void DocbookDocVisitor::visitPre(DocSecRefList *)
+{
+ if (m_hide) return;
+ m_t << "<toclist>" << endl;
+}
+
+void DocbookDocVisitor::visitPost(DocSecRefList *)
+{
+ if (m_hide) return;
+ m_t << "</toclist>" << endl;
+}
+
+void DocbookDocVisitor::visitPre(DocParamSect *s)
+{
+ if (m_hide) return;
+ switch(s->type())
+ {
+ case DocParamSect::Param:
+ {
+ m_t << endl;
+ m_t << " <formalpara>" << endl;
+ m_t << " <title/>" << endl;
+ m_t << " <table frame=\"all\">" << endl;
+ m_t << " <title>Parameters</title>" << endl;
+ m_t << " <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl;
+ m_t << " <tbody>" << endl;
+ break;
+ }
+ case DocParamSect::RetVal:
+ {
+ m_t << endl;
+ m_t << " <formalpara>" << endl;
+ m_t << " <title/>" << endl;
+ m_t << " <table frame=\"all\">" << endl;
+ m_t << " <title>Parameters</title>" << endl;
+ m_t << " <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl;
+ m_t << " <tbody>" << endl;
+ break;
+ }
+ case DocParamSect::Exception:
+ m_t << "exception"; break;
+ case DocParamSect::TemplateParam:
+ m_t << "templateparam"; break;
+ default:
+ ASSERT(0);
+ }
+}
+
+void DocbookDocVisitor::visitPost(DocParamSect *)
+{
+ if (m_hide) return;
+ m_t << " </tbody>" << endl;
+ m_t << " </tgroup>" << endl;
+ m_t << " </table>" << endl;
+ m_t << " </formalpara>" << endl;
+ m_t << " ";
+}
+
+void DocbookDocVisitor::visitPre(DocParamList *pl)
+{
+ if (m_hide) return;
+ QListIterator<DocNode> li(pl->parameters());
+ DocNode *param;
+ m_t << " <row>" << endl;
+ if (!li.toFirst())
+ {
+ m_t << " <entry></entry>" << endl;
+ }
+ else
+ {
+ m_t << " <entry>";
+ int cnt = 0;
+ for (li.toFirst();(param=li.current());++li)
+ {
+ if (cnt)
+ {
+ m_t << ", ";
+ }
+ if (param->kind()==DocNode::Kind_Word)
+ {
+ visit((DocWord*)param);
+ }
+ else if (param->kind()==DocNode::Kind_LinkedWord)
+ {
+ visit((DocLinkedWord*)param);
+ }
+ cnt++;
+ }
+ m_t << "</entry>" << endl;
+ }
+ m_t << " <entry>";
+}
+
+void DocbookDocVisitor::visitPost(DocParamList *)
+{
+ if (m_hide) return;
+ m_t << "</entry>" << endl;
+ m_t << " </row>" << endl;
+}
+
+void DocbookDocVisitor::visitPre(DocXRefItem *x)
+{
+ if (m_hide) return;
+ m_t << "<para><link linkend=\"";
+ m_t << x->file() << "_1" << x->anchor();
+ m_t << "\">";
+ filter(x->title());
+ m_t << "</link>";
+ m_t << " ";
+}
+
+void DocbookDocVisitor::visitPost(DocXRefItem *)
+{
+ if (m_hide) return;
+ m_t << "</para>";
+}
+
+void DocbookDocVisitor::visitPre(DocInternalRef *ref)
+{
+ if (m_hide) return;
+ startLink(ref->file(),ref->anchor());
+}
+
+void DocbookDocVisitor::visitPost(DocInternalRef *)
+{
+ if (m_hide) return;
+ endLink();
+ m_t << " ";
+}
+
+void DocbookDocVisitor::visitPre(DocCopy *)
+{
+ if (m_hide) return;
+ // TODO: to be implemented
+}
+
+
+void DocbookDocVisitor::visitPost(DocCopy *)
+{
+ if (m_hide) return;
+ // TODO: to be implemented
+}
+
+
+void DocbookDocVisitor::visitPre(DocText *)
+{
+ // TODO: to be implemented
+}
+
+
+void DocbookDocVisitor::visitPost(DocText *)
+{
+ // TODO: to be implemented
+}
+
+
+void DocbookDocVisitor::visitPre(DocHtmlBlockQuote *)
+{
+ if (m_hide) return;
+ m_t << "<blockquote>";
+}
+
+void DocbookDocVisitor::visitPost(DocHtmlBlockQuote *)
+{
+ if (m_hide) return;
+ m_t << "</blockquote>";
+}
+
+void DocbookDocVisitor::visitPre(DocVhdlFlow *)
+{
+ // TODO: to be implemented
+}
+
+
+void DocbookDocVisitor::visitPost(DocVhdlFlow *)
+{
+ // TODO: to be implemented
+}
+
+void DocbookDocVisitor::filter(const char *str)
+{
+ m_t << convertToXML(str);
+}
+
+void DocbookDocVisitor::startLink(const QCString &file,const QCString &anchor)
+{
+ m_t << "<link linkend=\"" << file;
+ if (!anchor.isEmpty()) m_t << "_1" << anchor;
+ m_t << "\">";
+}
+
+void DocbookDocVisitor::endLink()
+{
+ m_t << "</link>";
+}
+
+void DocbookDocVisitor::pushEnabled()
+{
+ m_enabled.push(new bool(m_hide));
+}
+
+void DocbookDocVisitor::popEnabled()
+{
+ bool *v=m_enabled.pop();
+ ASSERT(v!=0);
+ m_hide = *v;
+ delete v;
+}
+
+void DocbookDocVisitor::writeMscFile(const QCString &baseName)
+{
+ QCString shortName = baseName;
+ int i;
+ if ((i=shortName.findRev('/'))!=-1)
+ {
+ shortName=shortName.right(shortName.length()-i-1);
+ }
+ QCString outDir = Config_getString("DOCBOOK_OUTPUT");
+ writeMscGraphFromFile(baseName+".msc",outDir,shortName,MSC_BITMAP);
+ m_t << " <imagedata";
+ m_t << " align=\"center\" fileref=\"" << shortName << ".png" << "\">";
+ m_t << "</imagedata>" << endl;
+}
+
+void DocbookDocVisitor::startMscFile(const QCString &fileName,
+ const QCString &width,
+ const QCString &height,
+ bool hasCaption
+ )
+{
+ QCString baseName=fileName;
+ int i;
+ if ((i=baseName.findRev('/'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ if ((i=baseName.find('.'))!=-1)
+ {
+ baseName=baseName.left(i);
+ }
+ baseName.prepend("msc_");
+ QCString outDir = Config_getString("DOCBOOK_OUTPUT");
+ writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP);
+ m_t << "<para>" << endl;
+ m_t << " <figure>" << endl;
+ m_t << " <title></title>" << endl;
+ m_t << " <mediaobject>" << endl;
+ m_t << " <imageobject>" << endl;
+ m_t << " <imagedata";
+ if (!width.isEmpty())
+ {
+ m_t << " width=\"";
+ m_t << width;
+ m_t << "\"";
+ }
+ else if (!height.isEmpty())
+ {
+ m_t << " depth=\"";
+ m_t << height;
+ m_t << "\"";
+ }
+ m_t << " align=\"center\" fileref=\"" << baseName << ".png" << "\">";
+ m_t << "</imagedata>" << endl;
+ m_t << " </imageobject>" << endl;
+ if (hasCaption)
+ {
+ m_t << " <caption>" << endl;
+ }
+}
+
+void DocbookDocVisitor::endMscFile(bool hasCaption)
+{
+ if (m_hide) return;
+ m_t << "endl";
+ if (hasCaption)
+ {
+ m_t << " </caption>" << endl;
+ }
+ m_t << " </mediaobject>" << endl;
+ m_t << " </figure>" << endl;
+ m_t << "</para>" << endl;
+}
+
+void DocbookDocVisitor::writeDotFile(const QCString &baseName)
+{
+ QCString shortName = baseName;
+ int i;
+ if ((i=shortName.findRev('/'))!=-1)
+ {
+ shortName=shortName.right(shortName.length()-i-1);
+ }
+ QCString outDir = Config_getString("DOCBOOK_OUTPUT");
+ writeDotGraphFromFile(baseName+".dot",outDir,shortName,BITMAP);
+ m_t << " <imagedata";
+ m_t << " align=\"center\" fileref=\"" << shortName << ".png" << "\">";
+ m_t << "</imagedata>" << endl;
+}
+
+void DocbookDocVisitor::startDotFile(const QCString &fileName,
+ const QCString &width,
+ const QCString &height,
+ bool hasCaption
+ )
+{
+ QCString baseName=fileName;
+ int i;
+ if ((i=baseName.findRev('/'))!=-1)
+ {
+ baseName=baseName.right(baseName.length()-i-1);
+ }
+ if ((i=baseName.find('.'))!=-1)
+ {
+ baseName=baseName.left(i);
+ }
+ baseName.prepend("dot_");
+ QCString outDir = Config_getString("DOCBOOK_OUTPUT");
+ writeDotGraphFromFile(fileName,outDir,baseName,BITMAP);
+ m_t << "<para>" << endl;
+ m_t << " <figure>" << endl;
+ m_t << " <title></title>" << endl;
+ m_t << " <mediaobject>" << endl;
+ m_t << " <imageobject>" << endl;
+ m_t << " <imagedata";
+ if (!width.isEmpty())
+ {
+ m_t << " width=\"";
+ m_t << width;
+ m_t << "\"";
+ }
+ else if (!height.isEmpty())
+ {
+ m_t << " depth=\"";
+ m_t << height;
+ m_t << "\"";
+ }
+ m_t << " align=\"center\" fileref=\"" << baseName << ".png" << "\">";
+ m_t << "</imagedata>" << endl;
+ m_t << " </imageobject>" << endl;
+ if (hasCaption)
+ {
+ m_t << " <caption>" << endl;
+ }
+}
+
+void DocbookDocVisitor::endDotFile(bool hasCaption)
+{
+ if (m_hide) return;
+ m_t << "endl";
+ if (hasCaption)
+ {
+ m_t << " </caption>" << endl;
+ }
+ m_t << " </mediaobject>" << endl;
+ m_t << " </figure>" << endl;
+ m_t << "</para>" << endl;
+}
+
diff --git a/src/docbookvisitor.h b/src/docbookvisitor.h
new file mode 100644
index 0000000..c79301d
--- /dev/null
+++ b/src/docbookvisitor.h
@@ -0,0 +1,161 @@
+/******************************************************************************
+*
+*
+*
+* Copyright (C) 1997-2012 by Dimitri van Heesch.
+*
+* Permission to use, copy, modify, and distribute this software and its
+* documentation under the terms of the GNU General Public License is hereby
+* granted. No representations are made about the suitability of this software
+* for any purpose. It is provided "as is" without express or implied warranty.
+* See the GNU General Public License for more details.
+*
+* Documents produced by Doxygen are derivative works derived from the
+* input used in their production; they are not affected by this license.
+*
+*/
+
+#ifndef _DOCBOOKDOCVISITOR_H
+#define _DOCBOOKDOCVISITOR_H
+
+#include "docvisitor.h"
+#include <qstack.h>
+#include <qcstring.h>
+
+class FTextStream;
+class CodeOutputInterface;
+class QCString;
+
+/*! @brief Concrete visitor implementation for Docbook output. */
+class DocbookDocVisitor : public DocVisitor
+{
+ public:
+ DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci);
+ //--------------------------------------
+ // visitor functions for leaf nodes
+ //--------------------------------------
+ void visit(DocWord *);
+ void visit(DocLinkedWord *);
+ void visit(DocWhiteSpace *);
+ void visit(DocSymbol *);
+ void visit(DocURL *);
+ void visit(DocLineBreak *);
+ void visit(DocHorRuler *);
+ void visit(DocStyleChange *);
+ void visit(DocVerbatim *);
+ void visit(DocAnchor *);
+ void visit(DocInclude *);
+ void visit(DocIncOperator *);
+ void visit(DocFormula *);
+ void visit(DocIndexEntry *);
+ void visit(DocSimpleSectSep *);
+ void visit(DocCite *);
+ //--------------------------------------
+ // visitor functions for compound nodes
+ //--------------------------------------
+ void visitPre(DocAutoList *);
+ void visitPost(DocAutoList *);
+ void visitPre(DocAutoListItem *);
+ void visitPost(DocAutoListItem *);
+ void visitPre(DocPara *) ;
+ void visitPost(DocPara *);
+ void visitPre(DocRoot *);
+ void visitPost(DocRoot *);
+ void visitPre(DocSimpleSect *);
+ void visitPost(DocSimpleSect *);
+ void visitPre(DocTitle *);
+ void visitPost(DocTitle *);
+ void visitPre(DocSimpleList *);
+ void visitPost(DocSimpleList *);
+ void visitPre(DocSimpleListItem *);
+ void visitPost(DocSimpleListItem *);
+ void visitPre(DocSection *);
+ void visitPost(DocSection *);
+ void visitPre(DocHtmlList *);
+ void visitPost(DocHtmlList *) ;
+ void visitPre(DocHtmlListItem *);
+ void visitPost(DocHtmlListItem *);
+ //void visitPre(DocHtmlPre *);
+ //void visitPost(DocHtmlPre *);
+ void visitPre(DocHtmlDescList *);
+ void visitPost(DocHtmlDescList *);
+ void visitPre(DocHtmlDescTitle *);
+ void visitPost(DocHtmlDescTitle *);
+ void visitPre(DocHtmlDescData *);
+ void visitPost(DocHtmlDescData *);
+ void visitPre(DocHtmlTable *);
+ void visitPost(DocHtmlTable *);
+ void visitPre(DocHtmlRow *);
+ void visitPost(DocHtmlRow *) ;
+ void visitPre(DocHtmlCell *);
+ void visitPost(DocHtmlCell *);
+ void visitPre(DocHtmlCaption *);
+ void visitPost(DocHtmlCaption *);
+ void visitPre(DocInternal *);
+ void visitPost(DocInternal *);
+ void visitPre(DocHRef *);
+ void visitPost(DocHRef *);
+ void visitPre(DocHtmlHeader *);
+ void visitPost(DocHtmlHeader *);
+ void visitPre(DocImage *);
+ void visitPost(DocImage *);
+ void visitPre(DocDotFile *);
+ void visitPost(DocDotFile *);
+ void visitPre(DocMscFile *);
+ void visitPost(DocMscFile *);
+ void visitPre(DocLink *);
+ void visitPost(DocLink *);
+ void visitPre(DocRef *);
+ void visitPost(DocRef *);
+ void visitPre(DocSecRefItem *);
+ void visitPost(DocSecRefItem *);
+ void visitPre(DocSecRefList *);
+ void visitPost(DocSecRefList *);
+ //void visitPre(DocLanguage *);
+ //void visitPost(DocLanguage *);
+ void visitPre(DocParamSect *);
+ void visitPost(DocParamSect *);
+ void visitPre(DocParamList *);
+ void visitPost(DocParamList *);
+ void visitPre(DocXRefItem *);
+ void visitPost(DocXRefItem *);
+ void visitPre(DocInternalRef *);
+ void visitPost(DocInternalRef *);
+ void visitPre(DocCopy *);
+ void visitPost(DocCopy *);
+ void visitPre(DocText *);
+ void visitPost(DocText *);
+ void visitPre(DocHtmlBlockQuote *);
+ void visitPost(DocHtmlBlockQuote *);
+ void visitPre(DocVhdlFlow *);
+ void visitPost(DocVhdlFlow *);
+ private:
+ //--------------------------------------
+ // helper functions
+ //--------------------------------------
+ void filter(const char *str);
+ void startLink(const QCString &file,
+ const QCString &anchor);
+ void endLink();
+ void pushEnabled();
+ void popEnabled();
+ void startMscFile(const QCString &fileName,const QCString &width,
+ const QCString &height, bool hasCaption);
+ void endMscFile(bool hasCaption);
+ void writeMscFile(const QCString &fileName);
+ void startDotFile(const QCString &fileName,const QCString &width,
+ const QCString &height, bool hasCaption);
+ void endDotFile(bool hasCaption);
+ void writeDotFile(const QCString &fileName);
+ //--------------------------------------
+ // state variables
+ //--------------------------------------
+ FTextStream &m_t;
+ CodeOutputInterface &m_ci;
+ bool m_insidePre;
+ bool m_hide;
+ QStack<bool> m_enabled;
+ QCString m_langExt;
+};
+
+#endif
diff --git a/src/docparser.cpp b/src/docparser.cpp
index c4f42f3..1cc3b3c 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -283,14 +283,14 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
else
{
warn_doc_error(g_fileName,doctokenizerYYlineno,
- "warning: could not write output image %s",qPrint(outputFile));
+ "could not write output image %s",qPrint(outputFile));
}
}
}
else
{
warn_doc_error(g_fileName,doctokenizerYYlineno,
- "warning: could not open image %s",qPrint(fileName));
+ "could not open image %s",qPrint(fileName));
}
if (type==DocImage::Latex && Config_getBool("USE_PDFLATEX") &&
@@ -306,7 +306,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
portable_sysTimerStart();
if (portable_system("epstopdf",epstopdfArgs)!=0)
{
- err("error: Problems running epstopdf. Check your TeX installation!\n");
+ err("Problems running epstopdf. Check your TeX installation!\n");
}
portable_sysTimerStop();
return baseName;
@@ -315,7 +315,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
else if (ambig)
{
QCString text;
- text.sprintf("warning: image file name %s is ambiguous.\n",qPrint(fileName));
+ text.sprintf("image file name %s is ambiguous.\n",qPrint(fileName));
text+="Possible candidates:\n";
text+=showFileDefMatches(Doxygen::imageNameDict,fileName);
warn_doc_error(g_fileName,doctokenizerYYlineno,text);
@@ -326,7 +326,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
if (result.left(5)!="http:" && result.left(6)!="https:")
{
warn_doc_error(g_fileName,doctokenizerYYlineno,
- "warning: image file %s is not found in IMAGE_PATH: "
+ "image file %s is not found in IMAGE_PATH: "
"assuming external image.",qPrint(fileName)
);
}
@@ -344,7 +344,7 @@ static void checkArgumentName(const QCString &name,bool isParam)
{
if (!Config_getBool("WARN_IF_DOC_ERROR")) return;
if (g_memberDef==0) return; // not a member
- LockingPtr<ArgumentList> al=g_memberDef->isDocsForDefinition() ?
+ ArgumentList *al=g_memberDef->isDocsForDefinition() ?
g_memberDef->argumentList() :
g_memberDef->declArgumentList();
SrcLangExt lang = g_memberDef->getLanguage();
@@ -393,9 +393,9 @@ static void checkArgumentName(const QCString &name,bool isParam)
docLine = g_memberDef->getDefLine();
}
- QCString alStr = argListToString(al.pointer());
+ QCString alStr = argListToString(al);
warn_doc_error(docFile,docLine,
- "warning: argument '%s' of command @param "
+ "argument '%s' of command @param "
"is not found in the argument list of %s%s%s%s",
qPrint(aName), qPrint(scope), qPrint(g_memberDef->name()),
qPrint(alStr), qPrint(inheritedFrom));
@@ -413,7 +413,7 @@ static void checkUndocumentedParams()
{
if (g_memberDef && g_hasParamCommand && Config_getBool("WARN_IF_DOC_ERROR"))
{
- LockingPtr<ArgumentList> al=g_memberDef->isDocsForDefinition() ?
+ ArgumentList *al=g_memberDef->isDocsForDefinition() ?
g_memberDef->argumentList() :
g_memberDef->declArgumentList();
SrcLangExt lang = g_memberDef->getLanguage();
@@ -442,9 +442,9 @@ static void checkUndocumentedParams()
{
bool first=TRUE;
QCString errMsg=
- "warning: The following parameters of "+
+ "The following parameters of "+
QCString(g_memberDef->qualifiedName()) +
- QCString(argListToString(al.pointer())) +
+ QCString(argListToString(al)) +
" are not documented:\n";
for (ali.toFirst();(a=ali.current());++ali)
{
@@ -494,8 +494,8 @@ static void detectNoDocumentedParams()
{
if (g_memberDef && Config_getBool("WARN_NO_PARAMDOC"))
{
- LockingPtr<ArgumentList> al = g_memberDef->argumentList();
- LockingPtr<ArgumentList> declAl = g_memberDef->declArgumentList();
+ ArgumentList *al = g_memberDef->argumentList();
+ ArgumentList *declAl = g_memberDef->declArgumentList();
QCString returnType = g_memberDef->typeString();
bool isPython = g_memberDef->getLanguage()==SrcLangExt_Python;
@@ -808,7 +808,7 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(cmdName));
return tok;
}
@@ -831,11 +831,11 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
switch (tok)
{
case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command \\%s as the argument of a \\%s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command \\%s as the argument of a \\%s command",
qPrint(g_token->name),qPrint(cmdName));
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found while handling command %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found while handling command %s",
qPrint(g_token->name),qPrint(cmdName));
break;
case TK_HTMLTAG:
@@ -846,7 +846,7 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
return tok;
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s while handling command %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s while handling command %s",
tokToString(tok),qPrint(cmdName));
break;
}
@@ -884,17 +884,17 @@ static void handleStyleLeave(DocNode *parent,QList<DocNode> &children,
{
if (g_styleStack.isEmpty())
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </%s> tag without matching <%s>",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"found </%s> tag without matching <%s>",
qPrint(tagName),qPrint(tagName));
}
else if (g_styleStack.top()->style()!=s)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </%s> tag while expecting </%s>",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"found </%s> tag while expecting </%s>",
qPrint(tagName),qPrint(g_styleStack.top()->styleString()));
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </%s> at different nesting level (%d) than expected (%d)",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"found </%s> at different nesting level (%d) than expected (%d)",
qPrint(tagName),g_nodeStack.count(),g_styleStack.top()->position());
}
}
@@ -952,7 +952,7 @@ static int handleAHref(DocNode *parent,QList<DocNode> &children,const HtmlAttrib
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found <a> tag with name option but without value!");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"found <a> tag with name option but without value!");
}
}
else if (opt->name=="href") // <a href=url>..</a> tag
@@ -1002,7 +1002,7 @@ static void handleUnclosedStyleCommands()
g_initialStyleStack.pop();
handleUnclosedStyleCommands();
warn_doc_error(g_fileName,doctokenizerYYlineno,
- "warning: end of comment block while expecting "
+ "end of comment block while expecting "
"command </%s>",qPrint(sc->styleString()));
}
}
@@ -1124,7 +1124,7 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children)
{
if (g_token->name.left(1)=="#" || g_token->name.left(2)=="::")
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: explicit link request to '%s' could not be resolved",qPrint(name));
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"explicit link request to '%s' could not be resolved",qPrint(name));
children.append(new DocWord(parent,g_token->name));
}
else
@@ -1157,7 +1157,7 @@ static DocInternalRef *handleInternalRef(DocNode *parent)
QCString tokenName = g_token->name;
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(tokenName));
return 0;
}
@@ -1165,7 +1165,7 @@ static DocInternalRef *handleInternalRef(DocNode *parent)
tok=doctokenizerYYlex(); // get the reference id
if (tok!=TK_WORD && tok!=TK_LNKWORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(tokenName));
return 0;
}
@@ -1177,7 +1177,7 @@ static DocAnchor *handleAnchor(DocNode *parent)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(g_token->name));
return 0;
}
@@ -1185,13 +1185,13 @@ static DocAnchor *handleAnchor(DocNode *parent)
tok=doctokenizerYYlex();
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
"argument of command %s",qPrint(g_token->name));
return 0;
}
else if (tok!=TK_WORD && tok!=TK_LNKWORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(g_token->name));
return 0;
}
@@ -1306,7 +1306,7 @@ reparsetoken:
doctokenizerYYsetStateHtmlOnly();
tok = doctokenizerYYlex();
children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName));
- if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: htmlonly section ended without end marker");
+ if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"htmlonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -1315,7 +1315,7 @@ reparsetoken:
doctokenizerYYsetStateManOnly();
tok = doctokenizerYYlex();
children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::ManOnly,g_isExample,g_exampleName));
- if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: manonly section ended without end marker");
+ if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"manonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -1324,7 +1324,7 @@ reparsetoken:
doctokenizerYYsetStateRtfOnly();
tok = doctokenizerYYlex();
children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::RtfOnly,g_isExample,g_exampleName));
- if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: rtfonly section ended without end marker");
+ if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"rtfonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -1333,7 +1333,7 @@ reparsetoken:
doctokenizerYYsetStateLatexOnly();
tok = doctokenizerYYlex();
children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::LatexOnly,g_isExample,g_exampleName));
- if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: latexonly section ended without end marker",doctokenizerYYlineno);
+ if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"latexonly section ended without end marker",doctokenizerYYlineno);
doctokenizerYYsetStatePara();
}
break;
@@ -1342,7 +1342,16 @@ reparsetoken:
doctokenizerYYsetStateXmlOnly();
tok = doctokenizerYYlex();
children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::XmlOnly,g_isExample,g_exampleName));
- if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: xmlonly section ended without end marker",doctokenizerYYlineno);
+ if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"xmlonly section ended without end marker",doctokenizerYYlineno);
+ doctokenizerYYsetStatePara();
+ }
+ break;
+ case CMD_DBONLY:
+ {
+ doctokenizerYYsetStateDbOnly();
+ tok = doctokenizerYYlex();
+ children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::DocbookOnly,g_isExample,g_exampleName));
+ if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"xmlonly section ended without end marker",doctokenizerYYlineno);
doctokenizerYYsetStatePara();
}
break;
@@ -1381,10 +1390,10 @@ reparsetoken:
switch (Mappers::htmlTagMapper->map(tokenName))
{
case HTML_DIV:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found <div> tag in heading\n");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"found <div> tag in heading\n");
break;
case HTML_PRE:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found <pre> tag in heading\n");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"found <pre> tag in heading\n");
break;
case HTML_BOLD:
if (!g_token->endTag)
@@ -1517,6 +1526,67 @@ handlepara:
return TRUE;
}
+//---------------------------------------------------------------------------
+
+static int handleDocCopy(DocNode *parent,QList<DocNode> &children)
+{
+ int tok=doctokenizerYYlex();
+ int cmdId = Mappers::cmdMapper->map(g_token->name);
+ if (tok!=TK_WHITESPACE)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
+ qPrint(g_token->name));
+ return 0;
+ }
+ tok=doctokenizerYYlex();
+ if (tok==0)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
+ "argument of command %s\n", qPrint(g_token->name));
+ return 0;
+ }
+ else if (tok!=TK_WORD && tok!=TK_LNKWORD)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
+ tokToString(tok),qPrint(g_token->name));
+ return 0;
+ }
+ DocCopy *cpy = new DocCopy(parent,g_token->name,
+ cmdId==CMD_COPYDOC || cmdId==CMD_COPYBRIEF,
+ cmdId==CMD_COPYDOC || cmdId==CMD_COPYDETAILS);
+ cpy->parse(children);
+ delete cpy;
+ return TK_NEWPARA;
+}
+
+//---------------------------------------------------------------------------
+
+static void handleImg(DocNode *parent,QList<DocNode> &children,const HtmlAttribList &tagHtmlAttribs)
+{
+ HtmlAttribListIterator li(tagHtmlAttribs);
+ HtmlAttrib *opt;
+ bool found=FALSE;
+ int index=0;
+ for (li.toFirst();(opt=li.current());++li,++index)
+ {
+ //printf("option name=%s value=%s\n",opt->name.data(),opt->value.data());
+ if (opt->name=="src" && !opt->value.isEmpty())
+ {
+ // copy attributes
+ HtmlAttribList attrList = tagHtmlAttribs;
+ // and remove the src attribute
+ bool result = attrList.remove(index);
+ ASSERT(result);
+ DocImage *img = new DocImage(parent,attrList,opt->value,DocImage::Html,opt->value);
+ children.append(img);
+ found = TRUE;
+ }
+ }
+ if (!found)
+ {
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"IMG tag does not have a SRC attribute!\n");
+ }
+}
//---------------------------------------------------------------------------
@@ -1687,6 +1757,10 @@ static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children,
{
delete par;
}
+ if (retval==RetVal_CopyDoc)
+ {
+ retval=handleDocCopy(parent,children);
+ }
} while (retval==TK_NEWPARA);
if (lastPar) lastPar->markLast();
@@ -1723,14 +1797,14 @@ static void readTextFileByName(const QCString &file,QCString &text)
}
else if (ambig)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included file name %s is ambiguous"
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"included file name %s is ambiguous"
"Possible candidates:\n%s",qPrint(file),
qPrint(showFileDefMatches(Doxygen::exampleNameDict,file))
);
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included file %s is not found. "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"included file %s is not found. "
"Check your EXAMPLE_PATH",qPrint(file));
}
}
@@ -1740,7 +1814,7 @@ static void readTextFileByName(const QCString &file,QCString &text)
DocWord::DocWord(DocNode *parent,const QCString &word) :
m_word(word)
{
- m_parent = parent;
+ m_parent = parent;
//printf("new word %s url=%s\n",word.data(),g_searchUrl.data());
if (Doxygen::searchIndex && !g_searchUrl.isEmpty())
{
@@ -1773,7 +1847,7 @@ DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
m_parent = parent;
if (id.isEmpty())
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Empty anchor label");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Empty anchor label");
}
if (newAnchor) // found <a name="label">
{
@@ -1789,7 +1863,7 @@ DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid cite anchor id `%s'",qPrint(id));
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid cite anchor id `%s'",qPrint(id));
m_anchor = "invalid";
m_file = "invalid";
}
@@ -1810,7 +1884,7 @@ DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid anchor id `%s'",qPrint(id));
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid anchor id `%s'",qPrint(id));
m_anchor = "invalid";
m_file = "invalid";
}
@@ -1860,7 +1934,7 @@ void DocInclude::parse()
int count;
if (!m_blockId.isEmpty() && (count=m_text.contains(m_blockId.data()))!=2)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: block marked with %s for \\snippet should appear twice in file %s, found it %d times\n",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"block marked with %s for \\snippet should appear twice in file %s, found it %d times\n",
m_blockId.data(),m_file.data(),count);
}
break;
@@ -2070,13 +2144,13 @@ void DocCopy::parse(QList<DocNode> &children)
}
else // oops, recursion
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: recursive call chain of \\copydoc commands detected at %d\n",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"recursive call chain of \\copydoc commands detected at %d\n",
doctokenizerYYlineno);
}
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: target %s of \\copydoc command not found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"target %s of \\copydoc command not found",
qPrint(m_link));
}
}
@@ -2193,15 +2267,15 @@ void DocSecRefItem::parse()
switch (tok)
{
case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\refitem",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\refitem",
qPrint(g_token->name));
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
@@ -2225,13 +2299,13 @@ void DocSecRefItem::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: reference to unknown section %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"reference to unknown section %s",
qPrint(m_target));
}
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: reference to empty target");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"reference to empty target");
}
DBG(("DocSecRefItem::parse() end\n"));
@@ -2261,13 +2335,13 @@ void DocSecRefList::parse()
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after \\refitem command");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\refitem command");
break;
}
tok=doctokenizerYYlex();
if (tok!=TK_WORD && tok!=TK_LNKWORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of \\refitem",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of \\refitem",
tokToString(tok));
break;
}
@@ -2280,7 +2354,7 @@ void DocSecRefList::parse()
case CMD_ENDSECREFLIST:
goto endsecreflist;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\secreflist",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\secreflist",
qPrint(g_token->name));
goto endsecreflist;
}
@@ -2291,7 +2365,7 @@ void DocSecRefList::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s inside section reference list",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s inside section reference list",
tokToString(tok));
goto endsecreflist;
}
@@ -2335,15 +2409,15 @@ void DocInternalRef::parse()
switch (tok)
{
case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\ref",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\ref",
qPrint(g_token->name));
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
@@ -2430,7 +2504,7 @@ DocRef::DocRef(DocNode *parent,const QCString &target,const QCString &context) :
}
}
m_text = target;
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unable to resolve reference to `%s' for \\ref command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unable to resolve reference to `%s' for \\ref command",
qPrint(target));
}
@@ -2476,17 +2550,17 @@ void DocRef::parse()
switch (tok)
{
case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\ref",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\ref",
qPrint(g_token->name));
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
case TK_HTMLTAG:
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
@@ -2532,7 +2606,7 @@ DocCite::DocCite(DocNode *parent,const QCString &target,const QCString &) //cont
return;
}
m_text = linkToText(SrcLangExt_Unknown,target,FALSE);
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unable to resolve reference to `%s' for \\cite command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unable to resolve reference to `%s' for \\cite command",
qPrint(target));
}
@@ -2570,7 +2644,7 @@ DocLink::DocLink(DocNode *parent,const QCString &target)
}
// bogus link target
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unable to resolve link to `%s' for \\link command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unable to resolve link to `%s' for \\link command",
qPrint(target));
}
@@ -2594,23 +2668,23 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink)
case CMD_ENDLINK:
if (isJavaLink)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: {@link.. ended with @endlink command");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"{@link.. ended with @endlink command");
}
goto endlink;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\link",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\link",
qPrint(g_token->name));
break;
}
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
case TK_HTMLTAG:
if (g_token->name!="see" || !isXmlLink)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected xml/html command %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected xml/html command %s found",
qPrint(g_token->name));
}
goto endlink;
@@ -2638,7 +2712,7 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink)
m_children.append(new DocWord(this,g_token->name));
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
@@ -2646,7 +2720,7 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink)
}
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
" link command\n");
}
endlink:
@@ -2686,15 +2760,15 @@ void DocDotFile::parse()
switch (tok)
{
case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\dotfile",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\dotfile",
qPrint(g_token->name));
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
@@ -2713,7 +2787,7 @@ void DocDotFile::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unknown option %s after image title",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unknown option %s after image title",
qPrint(g_token->name));
}
tok=doctokenizerYYlex();
@@ -2734,14 +2808,14 @@ void DocDotFile::parse()
}
else if (ambig)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included dot file name %s is ambiguous.\n"
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"included dot file name %s is ambiguous.\n"
"Possible candidates:\n%s",qPrint(m_name),
qPrint(showFileDefMatches(Doxygen::exampleNameDict,m_name))
);
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included dot file %s is not found "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"included dot file %s is not found "
"in any of the paths specified via DOTFILE_DIRS!",qPrint(m_name));
}
@@ -2770,15 +2844,15 @@ void DocMscFile::parse()
switch (tok)
{
case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\mscfile",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\mscfile",
qPrint(g_token->name));
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
@@ -2797,7 +2871,7 @@ void DocMscFile::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unknown option %s after image title",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unknown option %s after image title",
qPrint(g_token->name));
}
tok=doctokenizerYYlex();
@@ -2818,14 +2892,14 @@ void DocMscFile::parse()
}
else if (ambig)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included msc file name %s is ambiguous.\n"
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"included msc file name %s is ambiguous.\n"
"Possible candidates:\n%s",qPrint(m_name),
qPrint(showFileDefMatches(Doxygen::exampleNameDict,m_name))
);
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included msc file %s is not found "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"included msc file %s is not found "
"in any of the paths specified via MSCFILE_DIRS!",qPrint(m_name));
}
@@ -2855,15 +2929,15 @@ void DocVhdlFlow::parse()
switch (tok)
{
case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\mscfile",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\mscfile",
qPrint(g_token->name));
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
@@ -2916,15 +2990,15 @@ void DocImage::parse()
switch (tok)
{
case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\image",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\image",
qPrint(g_token->name));
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
@@ -2944,7 +3018,7 @@ void DocImage::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unknown option %s after image title",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unknown option %s after image title",
qPrint(g_token->name));
}
tok=doctokenizerYYlex();
@@ -2974,7 +3048,7 @@ int DocHtmlHeader::parse()
switch (tok)
{
case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a <h%d> tag",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a <h%d> tag",
qPrint(g_token->name),m_level);
break;
case TK_HTMLTAG:
@@ -2984,7 +3058,7 @@ int DocHtmlHeader::parse()
{
if (m_level!=1)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h1>",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h1>",
m_level);
}
goto endheader;
@@ -2993,7 +3067,7 @@ int DocHtmlHeader::parse()
{
if (m_level!=2)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h2>",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h2>",
m_level);
}
goto endheader;
@@ -3002,7 +3076,7 @@ int DocHtmlHeader::parse()
{
if (m_level!=3)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h3>",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h3>",
m_level);
}
goto endheader;
@@ -3011,7 +3085,7 @@ int DocHtmlHeader::parse()
{
if (m_level!=4)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h4>",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h4>",
m_level);
}
goto endheader;
@@ -3020,7 +3094,7 @@ int DocHtmlHeader::parse()
{
if (m_level!=5)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h5>",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h5>",
m_level);
}
goto endheader;
@@ -3029,7 +3103,7 @@ int DocHtmlHeader::parse()
{
if (m_level!=6)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: <h%d> ended with </h6>",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"<h%d> ended with </h6>",
m_level);
}
goto endheader;
@@ -3048,18 +3122,18 @@ int DocHtmlHeader::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected html tag <%s%s> found within <h%d> context",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected html tag <%s%s> found within <h%d> context",
g_token->endTag?"/":"",qPrint(g_token->name),m_level);
}
}
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
@@ -3067,7 +3141,7 @@ int DocHtmlHeader::parse()
}
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
" <h%d> tag\n",m_level);
}
endheader:
@@ -3094,14 +3168,15 @@ int DocHRef::parse()
switch (tok)
{
case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a <a>..</a> block",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a <a>..</a> block",
qPrint(g_token->name));
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
case TK_HTMLTAG:
+
{
int tagId=Mappers::htmlTagMapper->map(g_token->name);
if (tagId==HTML_A && g_token->endTag) // found </a> tag
@@ -3110,13 +3185,13 @@ int DocHRef::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected html tag <%s%s> found within <a href=...> context",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected html tag <%s%s> found within <a href=...> context",
g_token->endTag?"/":"",qPrint(g_token->name),doctokenizerYYlineno);
}
}
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok),doctokenizerYYlineno);
break;
}
@@ -3124,7 +3199,7 @@ int DocHRef::parse()
}
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
" <a href=...> tag",doctokenizerYYlineno);
}
endhref:
@@ -3162,7 +3237,11 @@ int DocInternal::parse(int level)
}
if (retval==TK_LISTITEM)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid list item found",doctokenizerYYlineno);
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid list item found",doctokenizerYYlineno);
+ }
+ else if (retval==RetVal_CopyDoc)
+ {
+ retval=handleDocCopy(this,m_children);
}
} while (retval!=0 &&
retval!=RetVal_Section &&
@@ -3187,7 +3266,7 @@ int DocInternal::parse(int level)
if (retval==RetVal_Internal)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: \\internal command found inside internal section");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"\\internal command found inside internal section");
}
DBG(("DocInternal::parse() end\n"));
@@ -3206,7 +3285,7 @@ int DocIndexEntry::parse()
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after \\addindex command");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after \\addindex command");
goto endindexentry;
}
doctokenizerYYsetStateTitle();
@@ -3245,7 +3324,7 @@ int DocIndexEntry::parse()
case DocSymbol::Ndash: m_entry+="--"; break;
case DocSymbol::Mdash: m_entry+="---"; break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected symbol found as argument of \\addindex");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected symbol found as argument of \\addindex");
break;
}
}
@@ -3264,13 +3343,13 @@ int DocIndexEntry::parse()
case CMD_PERCENT: m_entry+='%'; break;
case CMD_QUOTE: m_entry+='"'; break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected command %s found as argument of \\addindex",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command %s found as argument of \\addindex",
qPrint(g_token->name));
break;
}
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
@@ -3300,11 +3379,11 @@ int DocHtmlCaption::parse()
switch (tok)
{
case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a <caption> tag",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a <caption> tag",
qPrint(g_token->name));
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
case TK_HTMLTAG:
@@ -3317,13 +3396,13 @@ int DocHtmlCaption::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected html tag <%s%s> found within <caption> context",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected html tag <%s%s> found within <caption> context",
g_token->endTag?"/":"",qPrint(g_token->name));
}
}
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
@@ -3331,7 +3410,7 @@ int DocHtmlCaption::parse()
}
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
" <caption> tag",doctokenizerYYlineno);
}
endcaption:
@@ -3498,7 +3577,7 @@ int DocHtmlRow::parse()
}
else // found some other tag
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <td> or <th> tag but "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <td> or <th> tag but "
"found <%s> instead!",qPrint(g_token->name));
doctokenizerYYpushBackHtmlTag(g_token->name);
goto endrow;
@@ -3506,13 +3585,13 @@ int DocHtmlRow::parse()
}
else if (tok==0) // premature end of comment
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
" for a html description title");
goto endrow;
}
else // token other than html token
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <td> or <th> tag but found %s token instead!",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <td> or <th> tag but found %s token instead!",
tokToString(tok));
goto endrow;
}
@@ -3562,7 +3641,7 @@ int DocHtmlRow::parseXml(bool isHeading)
}
else // found some other tag
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <term> or <description> tag but "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <term> or <description> tag but "
"found <%s> instead!",qPrint(g_token->name));
doctokenizerYYpushBackHtmlTag(g_token->name);
goto endrow;
@@ -3570,13 +3649,13 @@ int DocHtmlRow::parseXml(bool isHeading)
}
else if (tok==0) // premature end of comment
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
" for a html description title");
goto endrow;
}
else // token other than html token
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <td> or <th> tag but found %s token instead!",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <td> or <th> tag but found %s token instead!",
tokToString(tok));
goto endrow;
}
@@ -3625,7 +3704,7 @@ getrow:
{
if (m_caption)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: table already has a caption, found another one");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"table already has a caption, found another one");
}
else
{
@@ -3640,18 +3719,18 @@ getrow:
}
else // found wrong token
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <tr> or <caption> tag but "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <tr> or <caption> tag but "
"found <%s%s> instead!", g_token->endTag ? "/" : "", qPrint(g_token->name));
}
}
else if (tok==0) // premature end of comment
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
" for a <tr> or <caption> tag");
}
else // token other than html token
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <tr> tag but found %s token instead!",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <tr> tag but found %s token instead!",
tokToString(tok));
}
@@ -3826,7 +3905,7 @@ int DocHtmlDescTitle::parse()
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(g_token->name));
}
else
@@ -3835,7 +3914,7 @@ int DocHtmlDescTitle::parse()
tok=doctokenizerYYlex(); // get the reference id
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(cmdName));
}
else
@@ -3856,7 +3935,7 @@ int DocHtmlDescTitle::parse()
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(cmdName));
}
else
@@ -3865,7 +3944,7 @@ int DocHtmlDescTitle::parse()
tok=doctokenizerYYlex();
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(cmdName));
}
else
@@ -3884,13 +3963,13 @@ int DocHtmlDescTitle::parse()
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a <dt> tag",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a <dt> tag",
qPrint(g_token->name));
}
}
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
case TK_HTMLTAG:
@@ -3925,13 +4004,13 @@ int DocHtmlDescTitle::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected html tag <%s%s> found within <dt> context",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected html tag <%s%s> found within <dt> context",
g_token->endTag?"/":"",qPrint(g_token->name));
}
}
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
@@ -3939,7 +4018,7 @@ int DocHtmlDescTitle::parse()
}
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected end of comment while inside"
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end of comment while inside"
" <dt> tag");
}
endtitle:
@@ -3999,7 +4078,7 @@ int DocHtmlDescList::parse()
}
else // found some other tag
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <dt> tag but "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <dt> tag but "
"found <%s> instead!",qPrint(g_token->name));
doctokenizerYYpushBackHtmlTag(g_token->name);
goto enddesclist;
@@ -4007,13 +4086,13 @@ int DocHtmlDescList::parse()
}
else if (tok==0) // premature end of comment
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
" for a html description title");
goto enddesclist;
}
else // token other than html token
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <dt> tag but found %s token instead!",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <dt> tag but found %s token instead!",
tokToString(tok));
goto enddesclist;
}
@@ -4038,7 +4117,7 @@ int DocHtmlDescList::parse()
if (retval==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while inside <dl> block");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while inside <dl> block");
}
enddesclist:
@@ -4138,7 +4217,7 @@ int DocHtmlList::parse()
{
// add dummy item to obtain valid HTML
m_children.append(new DocHtmlListItem(this,HtmlAttribList(),1));
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: empty list!");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"empty list!");
retval = RetVal_EndList;
goto endlist;
}
@@ -4146,7 +4225,7 @@ int DocHtmlList::parse()
{
// add dummy item to obtain valid HTML
m_children.append(new DocHtmlListItem(this,HtmlAttribList(),1));
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <li> tag but "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <li> tag but "
"found <%s%s> instead!",g_token->endTag?"/":"",qPrint(g_token->name));
doctokenizerYYpushBackHtmlTag(g_token->name);
goto endlist;
@@ -4156,7 +4235,7 @@ int DocHtmlList::parse()
{
// add dummy item to obtain valid HTML
m_children.append(new DocHtmlListItem(this,HtmlAttribList(),1));
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
" for a html list item");
goto endlist;
}
@@ -4164,7 +4243,7 @@ int DocHtmlList::parse()
{
// add dummy item to obtain valid HTML
m_children.append(new DocHtmlListItem(this,HtmlAttribList(),1));
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <li> tag but found %s token instead!",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <li> tag but found %s token instead!",
tokToString(tok));
goto endlist;
}
@@ -4178,7 +4257,7 @@ int DocHtmlList::parse()
if (retval==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while inside <%cl> block",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while inside <%cl> block",
m_type==Unordered ? 'u' : 'o');
}
@@ -4211,7 +4290,7 @@ int DocHtmlList::parseXml()
}
else // found some other tag
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <item> tag but "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <item> tag but "
"found <%s> instead!",qPrint(g_token->name));
doctokenizerYYpushBackHtmlTag(g_token->name);
goto endlist;
@@ -4219,13 +4298,13 @@ int DocHtmlList::parseXml()
}
else if (tok==0) // premature end of comment
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while looking"
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while looking"
" for a html list item");
goto endlist;
}
else // token other than html token
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected <item> tag but found %s token instead!",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected <item> tag but found %s token instead!",
tokToString(tok));
goto endlist;
}
@@ -4241,7 +4320,7 @@ int DocHtmlList::parseXml()
if (retval==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment while inside <list type=\"%s\"> block",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment while inside <list type=\"%s\"> block",
m_type==Unordered ? "bullet" : "number");
}
@@ -4324,10 +4403,6 @@ int DocAutoListItem::parse()
int retval = RetVal_OK;
g_nodeStack.push(this);
- //retval=m_paragraph->parse();
- //m_paragraph->markFirst();
- //m_paragraph->markLast();
-
// first parse any number of paragraphs
bool isFirst=TRUE;
DocPara *lastPar=0;
@@ -4414,15 +4489,15 @@ void DocTitle::parse()
switch (tok)
{
case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a title section",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a title section",
qPrint(g_token->name));
break;
case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
@@ -4617,7 +4692,7 @@ int DocParamList::parse(const QCString &cmdName)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(cmdName));
}
doctokenizerYYsetStateParam();
@@ -4653,7 +4728,7 @@ int DocParamList::parse(const QCString &cmdName)
doctokenizerYYsetStatePara();
if (tok==0) /* premature end of comment block */
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
"argument of command %s",qPrint(cmdName));
retval=0;
goto endparamlist;
@@ -4727,7 +4802,7 @@ int DocParamList::parseXml(const QCString &paramName)
if (retval==0) /* premature end of comment block */
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unterminated param or exception tag");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unterminated param or exception tag");
}
else
{
@@ -4842,7 +4917,7 @@ void DocPara::handleCite()
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint("cite"));
return;
}
@@ -4850,13 +4925,13 @@ void DocPara::handleCite()
tok=doctokenizerYYlex();
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
"argument of command %s\n", qPrint("cite"));
return;
}
else if (tok!=TK_WORD && tok!=TK_LNKWORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
tokToString(tok),qPrint("cite"));
return;
}
@@ -4896,7 +4971,7 @@ void DocPara::handleIncludeOperator(const QCString &cmdName,DocIncOperator::Type
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(cmdName));
return;
}
@@ -4905,13 +4980,13 @@ void DocPara::handleIncludeOperator(const QCString &cmdName,DocIncOperator::Type
doctokenizerYYsetStatePara();
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
"argument of command %s", qPrint(cmdName));
return;
}
else if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(cmdName));
return;
}
@@ -4946,21 +5021,21 @@ void DocPara::handleImage(const QCString &cmdName)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(cmdName));
return;
}
tok=doctokenizerYYlex();
if (tok!=TK_WORD && tok!=TK_LNKWORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(cmdName));
return;
}
tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(cmdName));
return;
}
@@ -4971,7 +5046,7 @@ void DocPara::handleImage(const QCString &cmdName)
else if (imgType=="rtf") t=DocImage::Rtf;
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: image type %s specified as the first argument of "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"image type %s specified as the first argument of "
"%s is not valid",
qPrint(imgType),qPrint(cmdName));
return;
@@ -4981,7 +5056,7 @@ void DocPara::handleImage(const QCString &cmdName)
doctokenizerYYsetStatePara();
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(cmdName));
return;
}
@@ -4996,7 +5071,7 @@ void DocPara::handleDotFile(const QCString &cmdName)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(cmdName));
return;
}
@@ -5005,7 +5080,7 @@ void DocPara::handleDotFile(const QCString &cmdName)
doctokenizerYYsetStatePara();
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(cmdName));
return;
}
@@ -5020,7 +5095,7 @@ void DocPara::handleMscFile(const QCString &cmdName)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(cmdName));
return;
}
@@ -5029,7 +5104,7 @@ void DocPara::handleMscFile(const QCString &cmdName)
doctokenizerYYsetStatePara();
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(cmdName));
return;
}
@@ -5051,7 +5126,7 @@ void DocPara::handleLink(const QCString &cmdName,bool isJavaLink)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(cmdName));
return;
}
@@ -5059,7 +5134,7 @@ void DocPara::handleLink(const QCString &cmdName,bool isJavaLink)
tok=doctokenizerYYlex();
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"%s as the argument of %s",
tokToString(tok),qPrint(cmdName));
return;
}
@@ -5079,7 +5154,7 @@ void DocPara::handleRef(const QCString &cmdName)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(cmdName));
return;
}
@@ -5088,7 +5163,7 @@ void DocPara::handleRef(const QCString &cmdName)
DocRef *ref=0;
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(cmdName));
goto endref;
}
@@ -5106,7 +5181,7 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(cmdName));
return;
}
@@ -5115,13 +5190,13 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t)
doctokenizerYYsetStatePara();
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
"argument of command %s",qPrint(cmdName));
return;
}
else if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(cmdName));
return;
}
@@ -5134,7 +5209,7 @@ void DocPara::handleInclude(const QCString &cmdName,DocInclude::Type t)
doctokenizerYYsetStatePara();
if (tok!=TK_WORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected block identifier, but found token %s instead while parsing the %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected block identifier, but found token %s instead while parsing the %s command",
tokToString(tok),qPrint(cmdName));
return;
}
@@ -5151,20 +5226,20 @@ void DocPara::handleSection(const QCString &cmdName)
int tok=doctokenizerYYlex();
if (tok!=TK_WHITESPACE)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command",
qPrint(cmdName));
return;
}
tok=doctokenizerYYlex();
if (tok==0)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected end of comment block while parsing the "
"argument of command %s\n", qPrint(cmdName));
return;
}
else if (tok!=TK_WORD && tok!=TK_LNKWORD)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s",
tokToString(tok),qPrint(cmdName));
return;
}
@@ -5207,7 +5282,7 @@ int DocPara::handleStartCode()
i++;
}
m_children.append(new DocVerbatim(this,g_context,stripIndentation(g_token->verb.mid(li)),DocVerbatim::Code,g_isExample,g_exampleName,lang));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: code section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"code section ended without end marker");
doctokenizerYYsetStatePara();
return retval;
}
@@ -5249,7 +5324,7 @@ int DocPara::handleCommand(const QCString &cmdName)
switch (cmdId)
{
case CMD_UNKNOWN:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Found unknown command `\\%s'",qPrint(cmdName));
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Found unknown command `\\%s'",qPrint(cmdName));
break;
case CMD_EMPHASIS:
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,TRUE));
@@ -5395,7 +5470,7 @@ int DocPara::handleCommand(const QCString &cmdName)
doctokenizerYYsetStateHtmlOnly();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: htmlonly section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"htmlonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5404,7 +5479,7 @@ int DocPara::handleCommand(const QCString &cmdName)
doctokenizerYYsetStateManOnly();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::ManOnly,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: manonly section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"manonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5413,7 +5488,7 @@ int DocPara::handleCommand(const QCString &cmdName)
doctokenizerYYsetStateRtfOnly();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::RtfOnly,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: rtfonly section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"rtfonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5422,7 +5497,7 @@ int DocPara::handleCommand(const QCString &cmdName)
doctokenizerYYsetStateLatexOnly();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::LatexOnly,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: latexonly section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"latexonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5431,7 +5506,7 @@ int DocPara::handleCommand(const QCString &cmdName)
doctokenizerYYsetStateXmlOnly();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::XmlOnly,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: xmlonly section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"xmlonly section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5440,7 +5515,7 @@ int DocPara::handleCommand(const QCString &cmdName)
doctokenizerYYsetStateVerbatim();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Verbatim,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: verbatim section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"verbatim section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5449,7 +5524,7 @@ int DocPara::handleCommand(const QCString &cmdName)
doctokenizerYYsetStateDot();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Dot,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: dot section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"dot section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
@@ -5458,9 +5533,8 @@ int DocPara::handleCommand(const QCString &cmdName)
doctokenizerYYsetStateMsc();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Msc,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: msc section ended without end marker");
+ if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"msc section ended without end marker");
doctokenizerYYsetStatePara();
- VhdlDocGen::createFlowChart(g_memberDef);
}
break;
case CMD_ENDCODE:
@@ -5469,13 +5543,12 @@ int DocPara::handleCommand(const QCString &cmdName)
case CMD_ENDRTFONLY:
case CMD_ENDLATEXONLY:
case CMD_ENDXMLONLY:
+ case CMD_ENDDBONLY:
case CMD_ENDLINK:
case CMD_ENDVERBATIM:
case CMD_ENDDOT:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
- break;
case CMD_ENDMSC:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected command %s",qPrint(g_token->name));
break;
case CMD_PARAM:
retval = handleParamSection(cmdName,DocParamSect::Param,FALSE,g_token->paramDir);
@@ -5522,34 +5595,7 @@ int DocPara::handleCommand(const QCString &cmdName)
case CMD_COPYDOC: // fall through
case CMD_COPYBRIEF: // fall through
case CMD_COPYDETAILS:
- {
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command",
- qPrint(cmdName));
- break;
- }
- tok=doctokenizerYYlex();
- if (tok==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the "
- "argument of command %s\n", qPrint(cmdName));
- break;
- }
- else if (tok!=TK_WORD && tok!=TK_LNKWORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s",
- tokToString(tok),qPrint(cmdName));
- break;
- }
- DocCopy *cpy = new DocCopy(this,g_token->name,
- cmdId==CMD_COPYDOC || cmdId==CMD_COPYBRIEF,
- cmdId==CMD_COPYDOC || cmdId==CMD_COPYDETAILS);
- //m_children.append(cpy);
- cpy->parse(m_children);
- delete cpy;
- }
+ retval = RetVal_CopyDoc;
break;
case CMD_INCLUDE:
handleInclude(cmdName,DocInclude::Include);
@@ -5614,10 +5660,10 @@ int DocPara::handleCommand(const QCString &cmdName)
}
break;
case CMD_SECREFITEM:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected command %s",qPrint(g_token->name));
break;
case CMD_ENDSECREFLIST:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected command %s",qPrint(g_token->name));
break;
case CMD_FORMULA:
{
@@ -5629,7 +5675,7 @@ int DocPara::handleCommand(const QCString &cmdName)
// retval = handleLanguageSwitch();
// break;
case CMD_INTERNALREF:
- //warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected command %s",qPrint(g_token->name));
+ //warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected command %s",qPrint(g_token->name));
{
DocInternalRef *ref = handleInternalRef(this);
if (ref)
@@ -5683,7 +5729,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
if (g_token->emptyTag && !(tagId&XML_CmdMask) &&
tagId!=HTML_UNKNOWN && tagId!=HTML_IMG && tagId!=HTML_BR)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: HTML tags may not use the 'empty tag' XHTML syntax.");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"HTML tags may not use the 'empty tag' XHTML syntax.");
}
switch (tagId)
{
@@ -5704,7 +5750,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
case HTML_LI:
if (!insideUL(this) && !insideOL(this))
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: lonely <li> tag found");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"lonely <li> tag found");
}
else
{
@@ -5767,7 +5813,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
retval = RetVal_DescTitle;
break;
case HTML_DD:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag <dd> found");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag <dd> found");
break;
case HTML_TABLE:
{
@@ -5786,7 +5832,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
retval = RetVal_TableHCell;
break;
case HTML_CAPTION:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag <caption> found");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag <caption> found");
break;
case HTML_BR:
{
@@ -5823,29 +5869,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
break;
case HTML_IMG:
{
- HtmlAttribListIterator li(tagHtmlAttribs);
- HtmlAttrib *opt;
- bool found=FALSE;
- int index=0;
- for (li.toFirst();(opt=li.current());++li,++index)
- {
- //printf("option name=%s value=%s\n",opt->name.data(),opt->value.data());
- if (opt->name=="src" && !opt->value.isEmpty())
- {
- // copy attributes
- HtmlAttribList attrList = tagHtmlAttribs;
- // and remove the src attribute
- bool result = attrList.remove(index);
- ASSERT(result);
- DocImage *img = new DocImage(this,attrList,opt->value,DocImage::Html,opt->value);
- m_children.append(img);
- found = TRUE;
- }
- }
- if (!found)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: IMG tag does not have a SRC attribute!\n");
- }
+ handleImg(this,m_children,tagHtmlAttribs);
}
break;
case HTML_BLOCKQUOTE:
@@ -5887,7 +5911,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
{
if (Config_getBool("WARN_NO_PARAMDOC"))
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: empty 'name' attribute for <param> tag.");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"empty 'name' attribute for <param> tag.");
}
}
else
@@ -5899,7 +5923,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'name' attribute from <param> tag.");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'name' attribute from <param> tag.");
}
}
break;
@@ -5917,7 +5941,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'name' attribute from <param%sref> tag.",tagId==XML_PARAMREF?"":"type");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'name' attribute from <param%sref> tag.",tagId==XML_PARAMREF?"":"type");
}
}
break;
@@ -5930,7 +5954,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'name' attribute from <exception> tag.");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'name' attribute from <exception> tag.");
}
}
break;
@@ -5946,7 +5970,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: lonely <item> tag found");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"lonely <item> tag found");
}
break;
case XML_RETURNS:
@@ -5995,7 +6019,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'cref' attribute from <see> tag.");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'cref' attribute from <see> tag.");
}
}
break;
@@ -6027,7 +6051,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Missing 'cref' attribute from <seealso> tag.");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'cref' attribute from <seealso> tag.");
}
}
break;
@@ -6060,7 +6084,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
// These tags are defined in .Net but are currently unsupported
break;
case HTML_UNKNOWN:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported xml/html tag <%s> found", qPrint(tagName));
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported xml/html tag <%s> found", qPrint(tagName));
m_children.append(new DocWord(this, "<"+tagName+tagHtmlAttribs.toString()+">"));
break;
case XML_INHERITDOC:
@@ -6085,7 +6109,7 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
case HTML_UL:
if (!insideUL(this))
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </ul> tag without matching <ul>");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"found </ul> tag without matching <ul>");
}
else
{
@@ -6095,7 +6119,7 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
case HTML_OL:
if (!insideOL(this))
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </ol> tag without matching <ol>");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"found </ol> tag without matching <ol>");
}
else
{
@@ -6105,7 +6129,7 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
case HTML_LI:
if (!insideLI(this))
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </li> tag without matching <li>");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"found </li> tag without matching <li>");
}
else
{
@@ -6118,7 +6142,7 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
//case HTML_PRE:
// if (!insidePRE(this))
// {
- // warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found </pre> tag without matching <pre>");
+ // warn_doc_error(g_fileName,doctokenizerYYlineno,"found </pre> tag without matching <pre>");
// }
// else
// {
@@ -6182,28 +6206,37 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
// ignore </th> tag
break;
case HTML_CAPTION:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </caption> found");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </caption> found");
break;
case HTML_BR:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal </br> tag found\n");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal </br> tag found\n");
break;
case HTML_H1:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </h1> found");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h1> found");
break;
case HTML_H2:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </h2> found");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h2> found");
break;
case HTML_H3:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </h3> found");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h3> found");
+ break;
+ case HTML_H4:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h4> found");
+ break;
+ case HTML_H5:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h5> found");
+ break;
+ case HTML_H6:
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </h6> found");
break;
case HTML_IMG:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </img> found");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </img> found");
break;
case HTML_HR:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </hr> found");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </hr> found");
break;
case HTML_A:
- //warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected tag </a> found");
+ //warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected tag </a> found");
// ignore </a> tag (can be part of <a name=...></a>
break;
@@ -6238,7 +6271,7 @@ int DocPara::handleHtmlEndTag(const QCString &tagName)
// These tags are defined in .Net but are currently unsupported
break;
case HTML_UNKNOWN:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported xml/html tag </%s> found", qPrint(tagName));
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported xml/html tag </%s> found", qPrint(tagName));
m_children.append(new DocWord(this,"</"+tagName+">"));
break;
default:
@@ -6396,13 +6429,13 @@ reparsetoken:
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: End of list marker found "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"End of list marker found "
"has invalid indent level");
}
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: End of list marker found without any preceding "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"End of list marker found without any preceding "
"list items");
}
break;
@@ -6442,7 +6475,7 @@ reparsetoken:
}
// handle the command
- retval=handleCommand(g_token->name.copy());
+ retval=handleCommand(g_token->name);
DBG(("handleCommand returns %x\n",retval));
// check the return value
@@ -6514,7 +6547,7 @@ reparsetoken:
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
}
break;
@@ -6550,7 +6583,7 @@ reparsetoken:
break;
default:
warn_doc_error(g_fileName,doctokenizerYYlineno,
- "warning: Found unexpected token (id=%x)\n",tok);
+ "Found unexpected token (id=%x)\n",tok);
break;
}
}
@@ -6611,14 +6644,18 @@ int DocSection::parse()
}
if (retval==TK_LISTITEM)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid list item found");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid list item found");
+ }
+ else if (retval==RetVal_CopyDoc)
+ {
+ retval=handleDocCopy(this,m_children);
}
} while (retval!=0 &&
retval!=RetVal_Internal &&
retval!=RetVal_Section &&
retval!=RetVal_Subsection &&
retval!=RetVal_Subsubsection &&
- retval!=RetVal_Paragraph
+ retval!=RetVal_Paragraph
);
if (lastPar) lastPar->markLast();
@@ -6669,7 +6706,7 @@ int DocSection::parse()
if (retval==RetVal_Subsection) level=2;
else if (retval==RetVal_Subsubsection) level=3;
else level=4;
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected %s "
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected %s "
"command found inside %s!",
sectionLevelToName[level],sectionLevelToName[m_level]);
retval=0; // stop parsing
@@ -6728,7 +6765,7 @@ void DocText::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found",
qPrint(g_token->name));
}
}
@@ -6767,13 +6804,13 @@ void DocText::parse()
m_children.append(new DocSymbol(this,DocSymbol::Quot));
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected command `%s' found",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command `%s' found",
qPrint(g_token->name));
break;
}
break;
default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s",
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s",
tokToString(tok));
break;
}
@@ -6815,19 +6852,23 @@ void DocRoot::parse()
}
if (retval==TK_LISTITEM)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid list item found");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid list item found");
}
else if (retval==RetVal_Subsection)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found subsection command outside of section context!");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"found subsection command outside of section context!");
}
else if (retval==RetVal_Subsubsection)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found subsubsection command outside of subsection context!");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"found subsubsection command outside of subsection context!");
}
else if (retval==RetVal_Paragraph)
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found paragraph command outside of subsubsection context!");
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"found paragraph command outside of subsubsection context!");
+ }
+ else if (retval==RetVal_CopyDoc)
+ {
+ retval=handleDocCopy(this,m_children);
}
} while (retval!=0 && retval!=RetVal_Section && retval!=RetVal_Internal);
if (lastPar) lastPar->markLast();
@@ -6846,7 +6887,7 @@ void DocRoot::parse()
}
else
{
- warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid section id `%s'; ignoring section",qPrint(g_token->sectionId));
+ warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid section id `%s'; ignoring section",qPrint(g_token->sectionId));
retval = 0;
}
}
@@ -6868,7 +6909,7 @@ void DocRoot::parse()
//--------------------------------------------------------------------------
-DocNode *validatingParseDoc(const char *fileName,int startLine,
+DocRoot *validatingParseDoc(const char *fileName,int startLine,
Definition *ctx,MemberDef *md,
const char *input,bool indexWords,
bool isExample, const char *exampleName,
@@ -7031,8 +7072,13 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
//printf("Starting comment block at %s:%d\n",g_fileName.data(),startLine);
doctokenizerYYlineno=startLine;
- doctokenizerYYinit(input,g_fileName);
-
+ QCString inpStr=input;
+ uint inpLen = inpStr.length();
+ if (inpLen>0 && inpStr.at(inpLen-1)!='\n')
+ {
+ inpStr+='\n';
+ }
+ doctokenizerYYinit(inpStr,g_fileName);
// build abstract syntax tree
DocRoot *root = new DocRoot(md!=0,singleLine);
@@ -7064,7 +7110,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
return root;
}
-DocNode *validatingParseText(const char *input)
+DocText *validatingParseText(const char *input)
{
// store parser state so we can re-enter this function if needed
docParserPushContext();
diff --git a/src/docparser.h b/src/docparser.h
index cd51522..b80e5e1 100644
--- a/src/docparser.h
+++ b/src/docparser.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -56,7 +56,7 @@ class SectionDict;
* @returns Root node of the abstract syntax tree. Ownership of the
* pointer is handed over to the caller.
*/
-DocNode *validatingParseDoc(const char *fileName,int startLine,
+DocRoot *validatingParseDoc(const char *fileName,int startLine,
Definition *context, MemberDef *md,
const char *input,bool indexWords,
bool isExample,const char *exampleName=0,
@@ -65,7 +65,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
/*! Main entry point for parsing simple text fragments. These
* fragments are limited to words, whitespace and symbols.
*/
-DocNode *validatingParseText(const char *input);
+DocText *validatingParseText(const char *input);
/*! Searches for section and anchor commands in the input */
void docFindSections(const char *input,
@@ -381,7 +381,7 @@ class DocWhiteSpace : public DocNode
class DocVerbatim : public DocNode
{
public:
- enum Type { Code, HtmlOnly, ManOnly, LatexOnly, RtfOnly, XmlOnly, Verbatim, Dot, Msc };
+ enum Type { Code, HtmlOnly, ManOnly, LatexOnly, RtfOnly, XmlOnly, Verbatim, Dot, Msc, DocbookOnly };
DocVerbatim(DocNode *parent,const QCString &context,
const QCString &text, Type t,bool isExample,
const QCString &exampleFile,const QCString &lang=QCString());
@@ -1265,6 +1265,7 @@ class DocText : public CompAccept<DocText>, public DocNode
Kind kind() const { return Kind_Text; }
void accept(DocVisitor *v) { CompAccept<DocText>::accept(this,v); }
void parse();
+ bool isEmpty() const { return m_children.isEmpty(); }
};
/** Root node of documentation tree */
@@ -1277,6 +1278,7 @@ class DocRoot : public CompAccept<DocRoot>, public DocNode
void parse();
bool indent() const { return m_indent; }
bool singleLine() const { return m_singleLine; }
+ bool isEmpty() const { return m_children.isEmpty(); }
private:
bool m_indent;
diff --git a/src/docsets.cpp b/src/docsets.cpp
index dc483d3..2aa2918 100644
--- a/src/docsets.cpp
+++ b/src/docsets.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -135,6 +135,11 @@ void DocSets::initialize()
" <string>" << publisherId << "</string>\n"
" <key>DocSetPublisherName</key>\n"
" <string>" << publisherName << "</string>\n"
+ // markers for Dash
+ " <key>DashDocSetFamily</key>\n"
+ " <string>doxy</string>\n"
+ " <key>DocSetPlatformFamily</key>\n"
+ " <string>doxygen</string>\n"
"</dict>\n"
"</plist>\n";
}
@@ -391,6 +396,10 @@ void DocSets::addIndexItem(Definition *context,MemberDef *md,
break;
case MemberType_Event:
type="event"; break;
+ case MemberType_Interface:
+ type="ifc"; break;
+ case MemberType_Service:
+ type="svc"; break;
}
cd = md->getClassDef();
nd = md->getNamespaceDef();
diff --git a/src/docsets.h b/src/docsets.h
index 2fa0125..c5f0dc7 100644
--- a/src/docsets.h
+++ b/src/docsets.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/doctokenizer.h b/src/doctokenizer.h
index 5036f19..8804a41 100644
--- a/src/doctokenizer.h
+++ b/src/doctokenizer.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -21,6 +21,7 @@
#include <qcstring.h>
#include <qlist.h>
+#include <stdio.h>
#include "htmlattrib.h"
class Definition;
@@ -60,7 +61,8 @@ enum Tokens
RetVal_Internal = 0x10011,
RetVal_SwitchLang = 0x10012,
RetVal_CloseXml = 0x10013,
- RetVal_EndBlockQuote = 0x10014
+ RetVal_EndBlockQuote = 0x10014,
+ RetVal_CopyDoc = 0x10015
};
/** @brief Data associated with a token used by the comment block parser. */
@@ -135,6 +137,7 @@ void doctokenizerYYsetStateHtmlOnly();
void doctokenizerYYsetStateManOnly();
void doctokenizerYYsetStateLatexOnly();
void doctokenizerYYsetStateXmlOnly();
+void doctokenizerYYsetStateDbOnly();
void doctokenizerYYsetStateRtfOnly();
void doctokenizerYYsetStateVerbatim();
void doctokenizerYYsetStateDot();
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index d2b5123..cdf2933 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -337,8 +337,8 @@ ATTRNAME [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]*
ATTRIB {ATTRNAME}{WS}*("="{WS}*(("\""[^\"]*"\"")|("'"[^\']*"'")|[^ \t\r\n'"><]+))?
URLCHAR [a-z_A-Z0-9\!\~\,\:\;\'\$\?\@\&\%\#\.\-\+\/\=]
URLMASK ({URLCHAR}+([({]{URLCHAR}*[)}])?)+
-FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+]
-FILEECHAR [a-z_A-Z0-9\-\+]
+FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+@&#]
+FILEECHAR [a-z_A-Z0-9\-\+@&#]
HFILEMASK ("."{FILESCHAR}*{FILEECHAR}+)*
FILEMASK ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|{HFILEMASK}
LINKMASK [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)?
@@ -349,13 +349,14 @@ SPCMD3 {CMD}form#[0-9]+
SPCMD4 {CMD}"::"
INOUT "inout"|"in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLANK}*"in")
PARAMIO {CMD}param{BLANK}*"["{BLANK}*{INOUT}{BLANK}*"]"
-TEMPCHAR [a-z_A-Z0-9,: \t\*\&]
+TEMPCHAR [a-z_A-Z0-9.,: \t\*\&\(\)\[\]]
FUNCCHAR [a-z_A-Z0-9,:\<\> \t\^\*\&\[\]]
SCOPESEP "::"|"#"|"."
TEMPLPART "<"{TEMPCHAR}*">"
-SCOPEPRE {ID}{TEMPLPART}?{SCOPESEP}
+ANONNS "anonymous_namespace{"[^}]*"}"
+SCOPEPRE (({ID}{TEMPLPART}?)|{ANONNS}){SCOPESEP}
SCOPEKEYS ":"({ID}":")*
-SCOPECPP {SCOPEPRE}*(~)?{ID}("<"{TEMPCHAR}*">")?
+SCOPECPP {SCOPEPRE}*(~)?{ID}{TEMPLPART}?
SCOPEOBJC {SCOPEPRE}?{ID}{SCOPEKEYS}?
SCOPEMASK {SCOPECPP}|{SCOPEOBJC}
FUNCARG "("{FUNCCHAR}*")"({BLANK}*("volatile"|"const"){BLANK})?
@@ -379,7 +380,7 @@ HTMLTAG "<"(("/")?){ID}({WS}+{ATTRIB})*{WS}*(("/")?)">"
HTMLKEYL "strong"|"center"|"table"|"caption"|"small"|"code"|"dfn"|"var"|"img"|"pre"|"sub"|"sup"|"tr"|"td"|"th"|"ol"|"ul"|"li"|"tt"|"kbd"|"em"|"hr"|"dl"|"dt"|"dd"|"br"|"i"|"a"|"b"|"p"
HTMLKEYU "STRONG"|"CENTER"|"TABLE"|"CAPTION"|"SMALL"|"CODE"|"DFN"|"VAR"|"IMG"|"PRE"|"SUB"|"SUP"|"TR"|"TD"|"TH"|"OL"|"UL"|"LI"|"TT"|"KBD"|"EM"|"HR"|"DL"|"DT"|"DD"|"BR"|"I"|"A"|"B"|"P"
HTMLKEYW {HTMLKEYL}|{HTMLKEYU}
-REFWORD2 ("#"|"::")?({ID}{TEMPLPART}?("."|"#"|"::"|"-"|"/"))*({ID}(":")?){FUNCARG}?
+REFWORD2 ("#"|"::")?((({ID}{TEMPLPART}?)|{ANONNS})("."|"#"|"::"|"-"|"/"))*({ID}{TEMPLPART}?(":")?){FUNCARG}?
REFWORD3 ({ID}":")*{ID}":"?
REFWORD {LABELID}|{REFWORD2}|{REFWORD3}
@@ -401,6 +402,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}
%x St_LatexOnly
%x St_RtfOnly
%x St_XmlOnly
+%x St_DbOnly
%x St_Verbatim
%x St_Dot
%x St_Msc
@@ -688,34 +690,37 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}
g_token->name = yytext;
return TK_COMMAND;
}
+<St_Para>({BLANK}*\n)+{BLANK}*\n/{LISTITEM} { /* skip trailing paragraph followed by new list item */
+ if (g_insidePre)
+ {
+ REJECT;
+ }
+ }
+<St_Para>({BLANK}*\n)+{BLANK}*\n/{MLISTITEM} { /* skip trailing paragraph followed by new list item */
+ if (!Doxygen::markdownSupport || g_insidePre)
+ {
+ REJECT;
+ }
+ }
+<St_Para>({BLANK}*\n)+{BLANK}*\n/{OLISTITEM} { /* skip trailing paragraph followed by new list item */
+ if (!Doxygen::markdownSupport || g_insidePre)
+ {
+ REJECT;
+ }
+ }
<St_Para>({BLANK}*\n)+{BLANK}*\n{BLANK}* {
- // g_insidePre was always FALSE, so the next section
- // was never executed, now g_insidePre is set properly
- // again, so the section is commented out to keep the
- // old behavior.
- //if (g_insidePre)
- //{
- // /* Inside a <pre>..</pre> blank lines are treated
- // * as whitespace.
- // */
- // g_token->chars=yytext;
- // return TK_WHITESPACE;
- //}
- //else // found end of a paragraph
- {
- g_token->indent=computeIndent(yytext,(int)yyleng);
- int i;
- // put back the indentation (needed for list items)
- for (i=0;i<g_token->indent;i++)
- {
- unput(' ');
- }
- // tell flex that after putting the last indent
- // back we are at the beginning of the line
- YY_CURRENT_BUFFER->yy_at_bol=1;
- // start of a new paragraph
- return TK_NEWPARA;
- }
+ g_token->indent=computeIndent(yytext,(int)yyleng);
+ int i;
+ // put back the indentation (needed for list items)
+ for (i=0;i<g_token->indent;i++)
+ {
+ unput(' ');
+ }
+ // tell flex that after putting the last indent
+ // back we are at the beginning of the line
+ YY_CURRENT_BUFFER->yy_at_bol=1;
+ // start of a new paragraph
+ return TK_NEWPARA;
}
<St_CodeOpt>{BLANK}*"{"(".")?{LABELID}"}" {
g_token->name = yytext;
@@ -779,6 +784,14 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}
<St_XmlOnly>. {
g_token->verb+=yytext;
}
+<St_DbOnly>{CMD}"enddocbookonly" {
+ return RetVal_OK;
+ }
+<St_DbOnly>[^\\@\n]+ |
+<St_DbOnly>\n |
+<St_DbOnly>. {
+ g_token->verb+=yytext;
+ }
<St_Verbatim>{CMD}"endverbatim" {
g_token->verb=stripEmptyLines(g_token->verb);
return RetVal_OK;
@@ -1091,13 +1104,13 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}
BEGIN(St_SecSkip);
}
<St_SecSkip>{CMD}{ID} {
- if (strcmp(yytext+1,g_endMarker)==0)
+ if (qstrcmp(yytext+1,g_endMarker)==0)
{
BEGIN(St_Sections);
}
}
<St_SecSkip>"-->" {
- if (strcmp(yytext,g_endMarker)==0)
+ if (qstrcmp(yytext,g_endMarker)==0)
{
BEGIN(St_Sections);
}
@@ -1126,7 +1139,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}
BEGIN(St_Sections);
}
<St_SecTitle,St_SecLabel1,St_SecLabel2>. {
- warn(g_fileName,yylineno,"warning: Unexpected character `%s' while looking for section label or title",yytext);
+ warn(g_fileName,yylineno,"Unexpected character `%s' while looking for section label or title",yytext);
}
<St_Snippet>[^\n]+ |
@@ -1138,15 +1151,15 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}
/* Generic rules that work for all states */
<*>\n {
- warn(g_fileName,yylineno,"warning: Unexpected new line character");
+ warn(g_fileName,yylineno,"Unexpected new line character");
}
<*>[\\@<>&$#%~"=] { /* unescaped special character */
- //warn(g_fileName,yylineno,"warning: Unexpected character `%s', assuming command \\%s was meant.",yytext,yytext);
+ //warn(g_fileName,yylineno,"Unexpected character `%s', assuming command \\%s was meant.",yytext,yytext);
g_token->name = yytext;
return TK_COMMAND;
}
<*>. {
- warn(g_fileName,yylineno,"warning: Unexpected character `%s'",yytext);
+ warn(g_fileName,yylineno,"Unexpected character `%s'",yytext);
}
%%
@@ -1229,6 +1242,12 @@ void doctokenizerYYsetStateXmlOnly()
BEGIN(St_XmlOnly);
}
+void doctokenizerYYsetStateDbOnly()
+{
+ g_token->verb="";
+ BEGIN(St_DbOnly);
+}
+
void doctokenizerYYsetStateLatexOnly()
{
g_token->verb="";
diff --git a/src/docvisitor.h b/src/docvisitor.h
index 104dce0..240e137 100644
--- a/src/docvisitor.h
+++ b/src/docvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -27,6 +27,7 @@ const int DocVisitor_RTF = 3;
const int DocVisitor_Man = 4;
const int DocVisitor_Text = 5;
const int DocVisitor_Other = 6;
+const int DocVisitor_Docbook = 7;
// forward declarations
class DocWord;
diff --git a/src/dot.cpp b/src/dot.cpp
index 0866768..ffe1028 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -63,6 +63,20 @@
static const char svgZoomHeader[] =
"<svg id=\"main\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"preserve\" onload=\"init(evt)\">\n"
+"<style type=\"text/css\"><![CDATA[\n"
+".edge:hover path { stroke: red; }\n"
+".edge:hover polygon { stroke: red; fill: red; }\n"
+"]]></style>\n"
+"<script type=\"text/javascript\"><![CDATA[\n"
+"var edges = document.getElementsByTagName('g');\n"
+"if (edges && edges.length) {\n"
+" for (var i=0;i<edges.length;i++) {\n"
+" if (edges[i].id.substr(0,4)=='edge') {\n"
+" edges[i].setAttribute('class','edge');\n"
+" }\n"
+" }\n"
+"}\n"
+"]]></script>\n"
" <defs>\n"
" <circle id=\"rim\" cx=\"0\" cy=\"0\" r=\"7\"/>\n"
" <circle id=\"rim2\" cx=\"0\" cy=\"0\" r=\"3.5\"/>\n"
@@ -92,29 +106,37 @@ static const char svgZoomHeader[] =
;
static const char svgZoomFooter[] =
+// navigation panel
" <g id=\"navigator\" transform=\"translate(0 0)\" fill=\"#404254\">\n"
" <rect fill=\"#f2f5e9\" fill-opacity=\"0.5\" stroke=\"#606060\" stroke-width=\".5\" x=\"0\" y=\"0\" width=\"60\" height=\"60\"/>\n"
+// zoom in
" <use id=\"zoomplus\" xlink:href=\"#zoomPlus\" x=\"17\" y=\"9\" onmousedown=\"handleZoom(evt,'in')\"/>\n"
+// zoom out
" <use id=\"zoomminus\" xlink:href=\"#zoomMin\" x=\"42\" y=\"9\" onmousedown=\"handleZoom(evt,'out')\"/>\n"
+// reset zoom
" <use id=\"reset\" xlink:href=\"#resetDef\" x=\"30\" y=\"36\" onmousedown=\"handleReset()\"/>\n"
+// arrow up
" <g id=\"arrowUp\" xlink:href=\"#dirArrow\" transform=\"translate(30 24)\" onmousedown=\"handlePan(0,-1)\">\n"
" <use xlink:href=\"#rim\" fill=\"#404040\">\n"
" <set attributeName=\"fill\" to=\"#808080\" begin=\"arrowUp.mouseover\" end=\"arrowUp.mouseout\"/>\n"
" </use>\n"
" <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n"
" </g>\n"
+// arrow right
" <g id=\"arrowRight\" xlink:href=\"#dirArrow\" transform=\"rotate(90) translate(36 -43)\" onmousedown=\"handlePan(1,0)\">\n"
" <use xlink:href=\"#rim\" fill=\"#404040\">\n"
" <set attributeName=\"fill\" to=\"#808080\" begin=\"arrowRight.mouseover\" end=\"arrowRight.mouseout\"/>\n"
" </use>\n"
" <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n"
" </g>\n"
+// arrow down
" <g id=\"arrowDown\" xlink:href=\"#dirArrow\" transform=\"rotate(180) translate(-30 -48)\" onmousedown=\"handlePan(0,1)\">\n"
" <use xlink:href=\"#rim\" fill=\"#404040\">\n"
" <set attributeName=\"fill\" to=\"#808080\" begin=\"arrowDown.mouseover\" end=\"arrowDown.mouseout\"/>\n"
" </use>\n"
" <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n"
" </g>\n"
+// arrow left
" <g id=\"arrowLeft\" xlink:href=\"#dirArrow\" transform=\"rotate(270) translate(-36 17)\" onmousedown=\"handlePan(-1,0)\">\n"
" <use xlink:href=\"#rim\" fill=\"#404040\">\n"
" <set attributeName=\"fill\" to=\"#808080\" begin=\"arrowLeft.mouseover\" end=\"arrowLeft.mouseout\"/>\n"
@@ -122,15 +144,7 @@ static const char svgZoomFooter[] =
" <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n"
" </g>\n"
" </g>\n"
-/*
-" <svg viewBox=\"0 0 25 25\" width=\"100%\" height=\"30px\" preserveAspectRatio=\"xMaxYMin meet\"> \n"
-" <g id=\"printButton\" transform=\"scale(0.4 0.4)\" onmousedown=\"handlePrint(evt)\">\n"
-" <rect height=\"23.33753581\" id=\"paper\" rx=\"2\" style=\"fill:#f2f5e9;fill-rule:evenodd;stroke:#111111;stroke-width:3.224;stroke-linejoin:round;\" transform=\"matrix(1.000000,0.000000,-0.339266,0.940691,0.000000,0.000000)\" width=\"25.55231285\" x=\"26.69387353\" y=\"7.36162977\"/>\n"
-" <rect height=\"26.272097\" id=\"body\" rx=\"2\" style=\"fill:#404040;fill-rule:evenodd;stroke:#111111;stroke-width:3.125;stroke-linejoin:round;\" width=\"50\" x=\"4.5295201\" y=\"27.078951\"/>\n"
-" <rect height=\"8.27750969\" id=\"tray\" style=\"fill:#d2d5c9;fill-rule:evenodd;stroke:#111111;stroke-width:3.125;stroke-linecap:round;stroke-linejoin:round;\" width=\"40\" x=\"10.28778839\" y=\"44.96812282\"/>\n"
-" </g>\n"
-" </svg>\n"
-*/
+// link to orginial SVG
" <svg viewBox=\"0 0 15 15\" width=\"100%\" height=\"30px\" preserveAspectRatio=\"xMaxYMin meet\">\n"
" <g id=\"arrow_out\" transform=\"scale(0.3 0.3)\">\n"
" <a xlink:href=\"$orgname\" target=\"_base\">\n"
@@ -365,7 +379,7 @@ static bool convertMapFile(FTextStream &t,const char *mapName,
QFile f(mapName);
if (!f.open(IO_ReadOnly))
{
- err("error: problems opening map file %s for inclusion in the docs!\n"
+ err("problems opening map file %s for inclusion in the docs!\n"
"If you installed Graphviz/dot after a previous failing run, \n"
"try deleting the output directory and rerun doxygen.\n",mapName);
return FALSE;
@@ -573,7 +587,7 @@ static bool readSVGSize(const QCString &fileName,int *width,int *height)
if (numBytes>0)
{
buf[numBytes]='\0';
- if (strncmp(buf,"<!--zoomable ",13)==0)
+ if (qstrncmp(buf,"<!--zoomable ",13)==0)
{
*width=-1;
*height=-1;
@@ -659,7 +673,7 @@ static void checkDotResult(const QCString &imgName)
{
if (!(data[1]=='P' && data[2]=='N' && data[3]=='G'))
{
- err("error: Image `%s' produced by dot is not a valid PNG!\n"
+ err("Image `%s' produced by dot is not a valid PNG!\n"
"You should either select a different format "
"(DOT_IMAGE_FORMAT in the config file) or install a more "
"recent version of graphviz (1.7+)\n",imgName.data()
@@ -668,13 +682,13 @@ static void checkDotResult(const QCString &imgName)
}
else
{
- err("error: Could not read image `%s' generated by dot!\n",imgName.data());
+ err("Could not read image `%s' generated by dot!\n",imgName.data());
}
fclose(f);
}
else
{
- err("error: Could not open image `%s' generated by dot!\n",imgName.data());
+ err("Could not open image `%s' generated by dot!\n",imgName.data());
}
}
}
@@ -771,7 +785,7 @@ class DotNodeList : public QList<DotNode>
~DotNodeList() {}
int compareItems(QCollection::Item item1,QCollection::Item item2)
{
- return stricmp(((DotNode *)item1)->m_label,((DotNode *)item2)->m_label);
+ return qstricmp(((DotNode *)item1)->m_label,((DotNode *)item2)->m_label);
}
};
@@ -840,7 +854,7 @@ bool DotRunner::run()
}
if (!postCmd.isEmpty() && portable_system(postCmd,postArgs)!=0)
{
- err("error: Problems running '%s' as a post-processing step for dot output\n",m_postCmd.data());
+ err("Problems running '%s' as a post-processing step for dot output\n",m_postCmd.data());
return FALSE;
}
if (checkResult) checkDotResult(imageName);
@@ -957,13 +971,13 @@ bool DotFilePatcher::run()
QFile fo(m_patchFile);
if (!fi.open(IO_ReadOnly))
{
- err("error: problem opening file %s for patching!\n",tmpName.data());
+ err("problem opening file %s for patching!\n",tmpName.data());
QDir::current().rename(tmpName,m_patchFile);
return FALSE;
}
if (!fo.open(IO_WriteOnly))
{
- err("error: problem opening file %s for patching!\n",m_patchFile.data());
+ err("problem opening file %s for patching!\n",m_patchFile.data());
QDir::current().rename(tmpName,m_patchFile);
return FALSE;
}
@@ -1108,12 +1122,12 @@ bool DotFilePatcher::run()
QFile fo(orgName);
if (!fi.open(IO_ReadOnly))
{
- err("error: problem opening file %s for reading!\n",tmpName.data());
+ err("problem opening file %s for reading!\n",tmpName.data());
return FALSE;
}
if (!fo.open(IO_WriteOnly))
{
- err("error: problem opening file %s for writing!\n",orgName.data());
+ err("problem opening file %s for writing!\n",orgName.data());
return FALSE;
}
FTextStream t(&fo);
@@ -1801,16 +1815,10 @@ void DotNode::writeBox(FTextStream &t,
else
{
static bool dotTransparent = Config_getBool("DOT_TRANSPARENT");
- static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
if (!dotTransparent)
{
- ClassDef* ccd=m_classDef;
-
t << ",color=\"" << labCol << "\", fillcolor=\"";
- if (ccd && vhdlOpt && (VhdlDocGen::VhdlClasses)ccd->protection()==VhdlDocGen::ARCHITECTURECLASS)
- t << "khaki";
- else
- t << "white";
+ t << "white";
t << "\", style=\"filled\"";
}
else
@@ -2016,6 +2024,74 @@ void DotNode::writeXML(FTextStream &t,bool isClassGraph)
t << " </node>" << endl;
}
+void DotNode::writeDocbook(FTextStream &t,bool isClassGraph)
+{
+ t << " <node id=\"" << m_number << "\">" << endl;
+ t << " <label>" << convertToXML(m_label) << "</label>" << endl;
+ if (!m_url.isEmpty())
+ {
+ QCString url(m_url);
+ char *refPtr = url.data();
+ char *urlPtr = strchr(url.data(),'$');
+ if (urlPtr)
+ {
+ *urlPtr++='\0';
+ t << " <link refid=\"" << convertToXML(urlPtr) << "\"";
+ if (*refPtr!='\0')
+ {
+ t << " external=\"" << convertToXML(refPtr) << "\"";
+ }
+ t << "/>" << endl;
+ }
+ }
+ if (m_children)
+ {
+ QListIterator<DotNode> nli(*m_children);
+ QListIterator<EdgeInfo> eli(*m_edgeInfo);
+ DotNode *childNode;
+ EdgeInfo *edgeInfo;
+ for (;(childNode=nli.current());++nli,++eli)
+ {
+ edgeInfo=eli.current();
+ t << " <childnode refid=\"" << childNode->m_number << "\" relation=\"";
+ if (isClassGraph)
+ {
+ switch(edgeInfo->m_color)
+ {
+ case EdgeInfo::Blue: t << "public-inheritance"; break;
+ case EdgeInfo::Green: t << "protected-inheritance"; break;
+ case EdgeInfo::Red: t << "private-inheritance"; break;
+ case EdgeInfo::Purple: t << "usage"; break;
+ case EdgeInfo::Orange: t << "template-instance"; break;
+ case EdgeInfo::Grey: ASSERT(0); break;
+ }
+ }
+ else // include graph
+ {
+ t << "include";
+ }
+ t << "\">" << endl;
+ if (!edgeInfo->m_label.isEmpty())
+ {
+ int p=0;
+ int ni;
+ while ((ni=edgeInfo->m_label.find('\n',p))!=-1)
+ {
+ t << " <edgelabel>"
+ << convertToXML(edgeInfo->m_label.mid(p,ni-p))
+ << "</edgelabel>" << endl;
+ p=ni+1;
+ }
+ t << " <edgelabel>"
+ << convertToXML(edgeInfo->m_label.right(edgeInfo->m_label.length()-p))
+ << "</edgelabel>" << endl;
+ }
+ t << " </childnode>" << endl;
+ }
+ }
+ t << " </node>" << endl;
+}
+
void DotNode::writeDEF(FTextStream &t)
{
@@ -2190,15 +2266,13 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out,
//printf("DotGfxHierarchyTable::writeGraph(%s)\n",name);
//printf("m_rootNodes=%p count=%d\n",m_rootNodes,m_rootNodes->count());
- static bool vhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
-
if (m_rootSubgraphs->count()==0) return;
QDir d(path);
// store the original directory
if (!d.exists())
{
- err("error: Output dir %s does not exist!\n",path); exit(1);
+ err("Output dir %s does not exist!\n",path); exit(1);
}
// put each connected subgraph of the hierarchy in a row of the HTML output
@@ -2210,18 +2284,6 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out,
for (dnli.toFirst();(n=dnli.current());++dnli)
{
QCString baseName;
-
- if (vhdl)
- {
- QCString l=n->m_url;
- l=VhdlDocGen::convertFileNameToClassName(l);
- ClassDef *cd=Doxygen::classSDict->find(l);
- if (cd==0) continue;
- // only entities are shown
- if ((VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
- continue;
- }
-
QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
baseName.sprintf("inherit_graph_%d",count++);
//baseName = convertNameToFile(baseName);
@@ -2398,6 +2460,8 @@ void DotGfxHierarchyTable::addClassList(ClassSDict *cl)
for (cli.toLast();(cd=cli.current());--cli)
{
//printf("Trying %s subClasses=%d\n",cd->name().data(),cd->subClasses()->count());
+ if (cd->getLanguage()==SrcLangExt_VHDL && !(VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS)
+ continue;
if (!hasVisibleRoot(cd->baseClasses()) &&
cd->isVisibleInHierarchy()
) // root node in the forest
@@ -2637,7 +2701,7 @@ bool DotClassGraph::determineVisibleNodes(DotNode *rootNode,
{
DotNode *n = childQueue.take(0);
int distance = n->distance();
- if (!n->isVisible() && distance<maxDistance) // not yet processed
+ if (!n->isVisible() && distance<=maxDistance) // not yet processed
{
if (distance>0)
{
@@ -2666,7 +2730,7 @@ bool DotClassGraph::determineVisibleNodes(DotNode *rootNode,
if (includeParents && parentQueue.count()>0)
{
DotNode *n = parentQueue.take(0);
- if ((!n->isVisible() || firstNode) && n->distance()<maxDistance) // not yet processed
+ if ((!n->isVisible() || firstNode) && n->distance()<=maxDistance) // not yet processed
{
firstNode=FALSE;
int distance = n->distance();
@@ -3022,7 +3086,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out,
// store the original directory
if (!d.exists())
{
- err("error: Output dir %s does not exist!\n",path); exit(1);
+ err("Output dir %s does not exist!\n",path); exit(1);
}
static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
@@ -3169,6 +3233,16 @@ void DotClassGraph::writeXML(FTextStream &t)
}
}
+void DotClassGraph::writeDocbook(FTextStream &t)
+{
+ QDictIterator<DotNode> dni(*m_usedNodes);
+ DotNode *node;
+ for (;(node=dni.current());++dni)
+ {
+ node->writeDocbook(t,TRUE);
+ }
+}
+
void DotClassGraph::writeDEF(FTextStream &t)
{
QDictIterator<DotNode> dni(*m_usedNodes);
@@ -3253,7 +3327,7 @@ void DotInclDepGraph::determineVisibleNodes(QList<DotNode> &queue, int &maxNodes
{
static int maxDistance = Config_getInt("MAX_DOT_GRAPH_DEPTH");
DotNode *n = queue.take(0);
- if (!n->isVisible() && n->distance()<maxDistance) // not yet processed
+ if (!n->isVisible() && n->distance()<=maxDistance) // not yet processed
{
n->markAsVisible();
maxNodes--;
@@ -3299,7 +3373,6 @@ void DotInclDepGraph::determineTruncatedNodes(QList<DotNode> &queue)
DotInclDepGraph::DotInclDepGraph(FileDef *fd,bool inverse)
{
- m_maxDistance = 0;
m_inverse = inverse;
ASSERT(fd!=0);
m_diskName = fd->getFileBase().copy();
@@ -3356,7 +3429,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out,
// store the original directory
if (!d.exists())
{
- err("error: Output dir %s does not exist!\n",path); exit(1);
+ err("Output dir %s does not exist!\n",path); exit(1);
}
static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
@@ -3484,20 +3557,30 @@ void DotInclDepGraph::writeXML(FTextStream &t)
}
}
+void DotInclDepGraph::writeDocbook(FTextStream &t)
+{
+ QDictIterator<DotNode> dni(*m_usedNodes);
+ DotNode *node;
+ for (;(node=dni.current());++dni)
+ {
+ node->writeDocbook(t,FALSE);
+ }
+}
+
//-------------------------------------------------------------
int DotCallGraph::m_curNodeNumber = 0;
void DotCallGraph::buildGraph(DotNode *n,MemberDef *md,int distance)
{
- LockingPtr<MemberSDict> refs = m_inverse ? md->getReferencedByMembers() : md->getReferencesMembers();
- if (!refs.isNull())
+ MemberSDict *refs = m_inverse ? md->getReferencedByMembers() : md->getReferencesMembers();
+ if (refs)
{
MemberSDict::Iterator mri(*refs);
MemberDef *rmd;
for (;(rmd=mri.current());++mri)
{
- if (rmd->isFunction() || rmd->isSlot() || rmd->isSignal())
+ if (rmd->showInCallGraph())
{
QCString uniqueId;
uniqueId=rmd->getReference()+"$"+
@@ -3547,7 +3630,7 @@ void DotCallGraph::determineVisibleNodes(QList<DotNode> &queue, int &maxNodes)
{
static int maxDistance = Config_getInt("MAX_DOT_GRAPH_DEPTH");
DotNode *n = queue.take(0);
- if (!n->isVisible() && n->distance()<maxDistance) // not yet processed
+ if (!n->isVisible() && n->distance()<=maxDistance) // not yet processed
{
n->markAsVisible();
maxNodes--;
@@ -3594,7 +3677,6 @@ void DotCallGraph::determineTruncatedNodes(QList<DotNode> &queue)
DotCallGraph::DotCallGraph(MemberDef *md,bool inverse)
{
- m_maxDistance = 0;
m_inverse = inverse;
m_diskName = md->getOutputFileBase()+"_"+md->anchor();
m_scope = md->getOuterScope();
@@ -3650,7 +3732,7 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format,
// store the original directory
if (!d.exists())
{
- err("error: Output dir %s does not exist!\n",path); exit(1);
+ err("Output dir %s does not exist!\n",path); exit(1);
}
static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
@@ -3788,7 +3870,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out,
// store the original directory
if (!d.exists())
{
- err("error: Output dir %s does not exist!\n",path); exit(1);
+ err("Output dir %s does not exist!\n",path); exit(1);
}
static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
@@ -3913,7 +3995,7 @@ void generateGraphLegend(const char *path)
// store the original directory
if (!d.exists())
{
- err("error: Output dir %s does not exist!\n",path); exit(1);
+ err("Output dir %s does not exist!\n",path); exit(1);
}
QGString theGraph;
@@ -3988,7 +4070,7 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir,
QDir d(outDir);
if (!d.exists())
{
- err("error: Output dir %s does not exist!\n",outDir); exit(1);
+ err("Output dir %s does not exist!\n",outDir); exit(1);
}
QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
@@ -4042,7 +4124,7 @@ void writeDotImageMapFromFile(FTextStream &t,
QDir d(outDir);
if (!d.exists())
{
- err("error: Output dir %s does not exist!\n",outDir.data()); exit(1);
+ err("Output dir %s does not exist!\n",outDir.data()); exit(1);
}
QCString mapName = baseName+".map";
@@ -4110,8 +4192,8 @@ void DotGroupCollaboration::buildGraph(GroupDef* gd)
// hierarchy.
// Write parents
- LockingPtr<GroupList> groups = gd->partOfGroups();
- if ( groups!=0 )
+ GroupList *groups = gd->partOfGroups();
+ if ( groups )
{
GroupListIterator gli(*groups);
GroupDef *d;
@@ -4304,7 +4386,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo
// store the original directory
if (!d.exists())
{
- err("error: Output dir %s does not exist!\n",path); exit(1);
+ err("Output dir %s does not exist!\n",path); exit(1);
}
static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
diff --git a/src/dot.h b/src/dot.h
index 5db58af..a02b32d 100644
--- a/src/dot.h
+++ b/src/dot.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -81,6 +81,7 @@ class DotNode
int m_subgraphId;
void clearWriteFlag();
void writeXML(FTextStream &t,bool isClassGraph);
+ void writeDocbook(FTextStream &t,bool isClassGraph);
void writeDEF(FTextStream &t);
QCString label() const { return m_label; }
int number() const { return m_number; }
@@ -169,6 +170,7 @@ class DotClassGraph
bool TBRank=TRUE,bool imageMap=TRUE,int graphId=-1) const;
void writeXML(FTextStream &t);
+ void writeDocbook(FTextStream &t);
void writeDEF(FTextStream &t);
QCString diskName() const;
@@ -201,7 +203,7 @@ class DotInclDepGraph
bool isTooBig() const;
QCString diskName() const;
void writeXML(FTextStream &t);
-
+ void writeDocbook(FTextStream &t);
private:
void buildGraph(DotNode *n,FileDef *fd,int distance);
void determineVisibleNodes(QList<DotNode> &queue,int &maxNodes);
@@ -211,7 +213,6 @@ class DotInclDepGraph
QDict<DotNode> *m_usedNodes;
static int m_curNodeNumber;
QCString m_diskName;
- int m_maxDistance;
bool m_inverse;
};
@@ -235,7 +236,6 @@ class DotCallGraph
DotNode *m_startNode;
static int m_curNodeNumber;
QDict<DotNode> *m_usedNodes;
- int m_maxDistance;
int m_recDepth;
bool m_inverse;
QCString m_diskName;
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 916c64d..e1fe597 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -57,7 +57,9 @@
#include "ftvhelp.h"
#include "defargs.h"
#include "rtfgen.h"
+#include "sqlite3gen.h"
#include "xmlgen.h"
+#include "docbookgen.h"
#include "defgen.h"
#include "perlmodgen.h"
#include "reflist.h"
@@ -94,6 +96,7 @@
#include "membergroup.h"
#include "docsets.h"
#include "formula.h"
+#include "settings.h"
#define RECURSE_ENTRYTREE(func,var) \
do { if (var->children()) { \
@@ -124,6 +127,7 @@ PageSDict *Doxygen::exampleSDict = 0;
SectionDict *Doxygen::sectionDict = 0; // all page sections
CiteDict *Doxygen::citeDict=0; // database of bibliographic references
StringDict Doxygen::aliasDict(257); // aliases
+QDict<void> Doxygen::inputPaths(1009);
FileNameDict *Doxygen::includeNameDict = 0; // include names
FileNameDict *Doxygen::exampleNameDict = 0; // examples
FileNameDict *Doxygen::imageNameDict = 0; // images
@@ -141,7 +145,8 @@ QDict<RefList> *Doxygen::xrefLists = new QDict<RefList>; // dictionary of cross
bool Doxygen::parseSourcesNeeded = FALSE;
QTime Doxygen::runningTime;
SearchIndexIntf *Doxygen::searchIndex=0;
-QDict<DefinitionIntf> *Doxygen::symbolMap;
+QDict<DefinitionIntf> *Doxygen::symbolMap = 0;
+QDict<Definition> *Doxygen::clangUsrMap = 0;
bool Doxygen::outputToWizard=FALSE;
QDict<int> * Doxygen::htmlDirMap = 0;
QCache<LookupInfo> *Doxygen::lookupCache;
@@ -150,7 +155,6 @@ SDict<DirRelation> Doxygen::dirRelations(257);
ParserManager *Doxygen::parserManager = 0;
QCString Doxygen::htmlFileExtension;
bool Doxygen::suppressDocWarnings = FALSE;
-ObjCache *Doxygen::symbolCache = 0;
Store *Doxygen::symbolStorage;
QCString Doxygen::objDBFileName;
QCString Doxygen::entryDBFileName;
@@ -176,30 +180,75 @@ static bool g_dumpConfigAsXML = FALSE;
void clearAll()
{
- g_inputFiles.clear();
- //g_excludeNameDict.clear();
+ g_inputFiles.clear();
+ //g_excludeNameDict.clear();
//delete g_outputList; g_outputList=0;
- Doxygen::classSDict->clear();
- Doxygen::namespaceSDict->clear();
- Doxygen::pageSDict->clear();
- Doxygen::exampleSDict->clear();
- Doxygen::inputNameList->clear();
- Doxygen::formulaList->clear();
- Doxygen::sectionDict->clear();
- Doxygen::inputNameDict->clear();
- Doxygen::includeNameDict->clear();
- Doxygen::exampleNameDict->clear();
- Doxygen::imageNameDict->clear();
- Doxygen::dotFileNameDict->clear();
- Doxygen::mscFileNameDict->clear();
- Doxygen::formulaDict->clear();
- Doxygen::formulaNameDict->clear();
+ Doxygen::classSDict->clear();
+ Doxygen::namespaceSDict->clear();
+ Doxygen::pageSDict->clear();
+ Doxygen::exampleSDict->clear();
+ Doxygen::inputNameList->clear();
+ Doxygen::formulaList->clear();
+ Doxygen::sectionDict->clear();
+ Doxygen::inputNameDict->clear();
+ Doxygen::includeNameDict->clear();
+ Doxygen::exampleNameDict->clear();
+ Doxygen::imageNameDict->clear();
+ Doxygen::dotFileNameDict->clear();
+ Doxygen::mscFileNameDict->clear();
+ Doxygen::formulaDict->clear();
+ Doxygen::formulaNameDict->clear();
Doxygen::tagDestinationDict.clear();
delete Doxygen::citeDict;
delete Doxygen::mainPage; Doxygen::mainPage=0;
}
+class Statistics
+{
+ public:
+ Statistics() { stats.setAutoDelete(TRUE); }
+ void begin(const char *name)
+ {
+ msg(name);
+ stat *entry= new stat(name,0);
+ stats.append(entry);
+ time.restart();
+ }
+ void end()
+ {
+ stats.last()->elapsed=((double)time.elapsed())/1000.0;
+ }
+ void print()
+ {
+ bool restore=FALSE;
+ if (Debug::isFlagSet(Debug::Time))
+ {
+ Debug::clearFlag("time");
+ restore=TRUE;
+ }
+ msg("----------------------\n");
+ QListIterator<stat> sli(stats);
+ stat *s;
+ for ( sli.toFirst(); (s=sli.current()); ++sli )
+ {
+ msg("Spent %.3f seconds in %s",s->elapsed,s->name);
+ }
+ if (restore) Debug::setFlag("time");
+ }
+ private:
+ struct stat
+ {
+ const char *name;
+ double elapsed;
+ stat() : name(NULL),elapsed(0) {}
+ stat(const char *n, double el) : name(n),elapsed(el) {}
+ };
+ QList<stat> stats;
+ QTime time;
+} g_s;
+
+
void statistics()
{
fprintf(stderr,"--- inputNameDict stats ----\n");
@@ -245,6 +294,24 @@ static void findMember(EntryNav *rootNav,
bool isFunc
);
+enum FindBaseClassRelation_Mode
+{
+ TemplateInstances,
+ DocumentedOnly,
+ Undocumented
+};
+
+static bool findClassRelation(
+ EntryNav *rootNav,
+ Definition *context,
+ ClassDef *cd,
+ BaseInfo *bi,
+ QDict<int> *templateNames,
+ /*bool insertUndocumented*/
+ FindBaseClassRelation_Mode mode,
+ bool isArtificial
+ );
+
/** A struct contained the data for an STL class */
struct STLInfo
{
@@ -710,7 +777,7 @@ static void buildFileList(EntryNav *rootNav)
{
warn(
root->fileName,root->startLine,
- "warning: file %s already documented. "
+ "file %s already documented. "
"Skipping documentation.",
root->name.data()
);
@@ -744,7 +811,7 @@ static void buildFileList(EntryNav *rootNav)
{
const char *fn = root->fileName.data();
QCString text(4096);
- text.sprintf("warning: the name `%s' supplied as "
+ text.sprintf("the name `%s' supplied as "
"the second argument in the \\file statement ",
qPrint(root->name));
if (ambig) // name is ambiguous
@@ -799,7 +866,7 @@ static void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
)
{ // explicit request
QCString text;
- text.sprintf("warning: the name `%s' supplied as "
+ text.sprintf("the name `%s' supplied as "
"the argument of the \\class, \\struct, \\union, or \\include command ",
qPrint(includeFile)
);
@@ -950,7 +1017,7 @@ static Definition *buildScopeFromQualifiedName(const QCString name,int level,Src
// introduce bogus namespace
//printf("++ adding dummy namespace %s to %s\n",nsName.data(),prevScope->name().data());
nd=new NamespaceDef(
- "[generated]",1,fullScope);
+ "[generated]",1,1,fullScope);
nd->setLanguage(lang);
// add namespace to the list
@@ -1088,7 +1155,8 @@ ArgumentList *getTemplateArgumentsFromName(
return ali.current();
}
-static ClassDef::CompoundType convertToCompoundType(int section,int specifier)
+static
+ClassDef::CompoundType convertToCompoundType(int section,uint64 specifier)
{
ClassDef::CompoundType sec=ClassDef::Class;
if (specifier&Entry::Struct)
@@ -1103,6 +1171,10 @@ static ClassDef::CompoundType convertToCompoundType(int section,int specifier)
sec=ClassDef::Protocol;
else if (specifier&Entry::Exception)
sec=ClassDef::Exception;
+ else if (specifier&Entry::Service)
+ sec=ClassDef::Service;
+ else if (specifier&Entry::Singleton)
+ sec=ClassDef::Singleton;
switch(section)
{
@@ -1130,6 +1202,12 @@ static ClassDef::CompoundType convertToCompoundType(int section,int specifier)
case Entry::EXCEPTIONDOC_SEC:
sec=ClassDef::Exception;
break;
+ case Entry::SERVICEDOC_SEC:
+ sec=ClassDef::Service;
+ break;
+ case Entry::SINGLETONDOC_SEC:
+ sec=ClassDef::Singleton;
+ break;
}
return sec;
}
@@ -1217,13 +1295,14 @@ static void addClassToContext(EntryNav *rootNav)
tagName = rootNav->tagInfo()->tagName;
refFileName = rootNav->tagInfo()->fileName;
}
- cd=new ClassDef(root->fileName,root->startLine,fullName,sec,
- tagName,refFileName,TRUE,root->spec&Entry::Enum);
+ cd=new ClassDef(root->fileName,root->startLine,root->startColumn,
+ fullName,sec,tagName,refFileName,TRUE,root->spec&Entry::Enum);
Debug::print(Debug::Classes,0," New class `%s' (sec=0x%08x)! #tArgLists=%d\n",
fullName.data(),sec,root->tArgLists ? (int)root->tArgLists->count() : -1);
cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
cd->setLanguage(root->lang);
+ cd->setId(root->id);
cd->setHidden(root->hidden);
cd->setArtificial(root->artificial);
cd->setClassSpecifier(root->spec);
@@ -1246,7 +1325,6 @@ static void addClassToContext(EntryNav *rootNav)
//bool found=addNamespace(root,cd);
// the empty string test is needed for extract all case
- cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
cd->insertUsedFile(root->fileName);
// add class to the list
@@ -1363,7 +1441,7 @@ static void resolveClassNestingRelations()
d->addInnerCompound(cd);
cd->setOuterScope(d);
warn(cd->getDefFileName(),cd->getDefLine(),
- "warning: Internal inconsistency: scope for class %s not "
+ "Internal inconsistency: scope for class %s not "
"found!",name.data()
);
}
@@ -1415,6 +1493,7 @@ static ClassDef *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,const QC
fullName+="."+fieldName;
ClassDef *cd = new ClassDef(templ->getDefFileName(),
templ->getDefLine(),
+ templ->getDefColumn(),
fullName,
templ->compoundType());
cd->setDocumentation(templ->documentation(),templ->docFile(),templ->docLine()); // copy docs to definition
@@ -1435,7 +1514,7 @@ static ClassDef *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,const QC
cd->setFileDef(fd);
fd->insertClass(cd);
}
- LockingPtr<GroupList> groups = rootCd->partOfGroups();
+ GroupList *groups = rootCd->partOfGroups();
if ( groups!=0 )
{
GroupListIterator gli(*groups);
@@ -1458,7 +1537,7 @@ static ClassDef *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,const QC
for (li.toFirst();(md=li.current());++li)
{
//printf(" Member %s type=%s\n",md->name().data(),md->typeString());
- MemberDef *imd = new MemberDef(md->getDefFileName(),md->getDefLine(),
+ MemberDef *imd = new MemberDef(md->getDefFileName(),md->getDefLine(),md->getDefColumn(),
md->typeString(),md->name(),md->argsString(),md->excpString(),
md->protection(),md->virtualness(),md->isStatic(),Member,
md->memberType(),
@@ -1665,13 +1744,14 @@ static void buildNamespaceList(EntryNav *rootNav)
tagFileName=rootNav->tagInfo()->fileName;
}
//printf("++ new namespace %s lang=%s\n",fullName.data(),langToString(root->lang).data());
- NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,fullName,tagName,tagFileName);
+ NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,root->startColumn,fullName,tagName,tagFileName,root->type,root->spec&Entry::Published);
nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
nd->addSectionsToDefinition(root->anchors);
nd->setHidden(root->hidden);
nd->setArtificial(root->artificial);
nd->setLanguage(root->lang);
+ nd->setId(root->id);
//printf("Adding namespace to group\n");
addNamespaceToGroups(root,nd);
@@ -1834,7 +1914,7 @@ static void findUsingDirectives(EntryNav *rootNav)
else // unknown namespace, but add it anyway.
{
//printf("++ new unknown namespace %s lang=%s\n",name.data(),langToString(root->lang).data());
- NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,name);
+ NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,root->startColumn,name);
nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
nd->addSectionsToDefinition(root->anchors);
@@ -1842,6 +1922,7 @@ static void findUsingDirectives(EntryNav *rootNav)
nd->setHidden(root->hidden);
nd->setArtificial(TRUE);
nd->setLanguage(root->lang);
+ nd->setId(root->id);
QListIterator<Grouping> gli(*root->groups);
Grouping *g;
@@ -1950,8 +2031,9 @@ static void findUsingDeclarations(EntryNav *rootNav)
Debug::print(Debug::Classes,0," New using class `%s' (sec=0x%08x)! #tArgLists=%d\n",
name.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1);
usingCd = new ClassDef(
- "<using>",1,
- name,ClassDef::Class);
+ "<using>",1,1,
+ name,
+ ClassDef::Class);
Doxygen::hiddenClasses->append(root->name,usingCd);
usingCd->setArtificial(TRUE);
usingCd->setLanguage(root->lang);
@@ -2029,14 +2111,14 @@ static void findUsingDeclImports(EntryNav *rootNav)
//printf("found member %s\n",mni->memberName());
MemberDef *newMd = 0;
{
- LockingPtr<ArgumentList> templAl = md->templateArguments();
- LockingPtr<ArgumentList> al = md->templateArguments();
+ ArgumentList *templAl = md->templateArguments();
+ ArgumentList *al = md->templateArguments();
newMd = new MemberDef(
- root->fileName,root->startLine,
+ root->fileName,root->startLine,root->startColumn,
md->typeString(),memName,md->argsString(),
md->excpString(),root->protection,root->virt,
md->isStatic(),Member,md->memberType(),
- templAl.pointer(),al.pointer()
+ templAl,al
);
}
newMd->setMemberClass(cd);
@@ -2065,6 +2147,7 @@ static void findUsingDeclImports(EntryNav *rootNav)
newMd->setMemberGroupId(root->mGrpId);
newMd->setMemberSpecifiers(md->getMemberSpecifiers());
newMd->setLanguage(root->lang);
+ newMd->setId(root->id);
rootNav->releaseEntry();
}
@@ -2219,8 +2302,8 @@ static MemberDef *addVariableToClass(
// new member variable, typedef or enum value
MemberDef *md=new MemberDef(
- root->fileName,root->startLine,
- root->type,name,root->args,0,
+ root->fileName,root->startLine,root->startColumn,
+ root->type,name,root->args,root->exception,
prot,Normal,root->stat,related,
mtype,root->tArgLists ? root->tArgLists->last() : 0,0);
md->setTagInfo(rootNav->tagInfo());
@@ -2248,6 +2331,7 @@ static MemberDef *addVariableToClass(
md->setHidden(root->hidden);
md->setArtificial(root->artificial);
md->setLanguage(root->lang);
+ md->setId(root->id);
addMemberToGroups(root,md);
//if (root->mGrpId!=-1)
//{
@@ -2455,7 +2539,7 @@ static MemberDef *addVariableToFile(
" new variable, nd=%s!\n",nd?nd->name().data():"<global>");
// new global variable, enum value or typedef
MemberDef *md=new MemberDef(
- root->fileName,root->startLine,
+ root->fileName,root->startLine,root->startColumn,
root->type,name,root->args,0,
Public, Normal,root->stat,Member,
mtype,root->tArgLists ? root->tArgLists->last() : 0,0);
@@ -2472,6 +2556,7 @@ static MemberDef *addVariableToFile(
md->setMemberGroupId(root->mGrpId);
md->setDefinition(def);
md->setLanguage(root->lang);
+ md->setId(root->id);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
md->setExplicitExternal(root->explicitExternal);
@@ -2945,6 +3030,149 @@ static void buildVarList(EntryNav *rootNav)
}
//----------------------------------------------------------------------
+// Searches the Entry tree for Interface sections (UNO IDL only).
+// If found they are stored in their service or in the global list.
+//
+
+static void addInterfaceOrServiceToServiceOrSingleton(
+ EntryNav *const rootNav,
+ ClassDef *const cd,
+ QCString const& rname)
+{
+ Entry *const root = rootNav->entry();
+ FileDef *const fd = rootNav->fileDef();
+ enum MemberType const type = (rootNav->section()==Entry::EXPORTED_INTERFACE_SEC)
+ ? MemberType_Interface
+ : MemberType_Service;
+ MemberDef *const md = new MemberDef(
+ root->fileName, root->startLine, root->startColumn, root->type, rname,
+ "", "", root->protection, root->virt, root->stat, Member,
+ type, 0, root->argList);
+ md->setTagInfo(rootNav->tagInfo());
+ md->setMemberClass(cd);
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setDocsForDefinition(false);
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setBodySegment(root->bodyLine,root->endBodyLine);
+ md->setMemberSpecifiers(root->spec);
+ md->setMemberGroupId(root->mGrpId);
+ md->setTypeConstraints(root->typeConstr);
+ md->setLanguage(root->lang);
+ md->setBodyDef(fd);
+ md->setFileDef(fd);
+ md->addSectionsToDefinition(root->anchors);
+ QCString const def = root->type + " " + rname;
+ md->setDefinition(def);
+ md->enableCallGraph(root->callGraph);
+ md->enableCallerGraph(root->callerGraph);
+
+ Debug::print(Debug::Functions,0,
+ " Interface Member:\n"
+ " `%s' `%s' proto=%d\n"
+ " def=`%s'\n",
+ root->type.data(),
+ rname.data(),
+ root->proto,
+ def.data()
+ );
+
+ // add member to the global list of all members
+ MemberName *mn;
+ if ((mn=Doxygen::memberNameSDict->find(rname)))
+ {
+ mn->append(md);
+ }
+ else
+ {
+ mn = new MemberName(rname);
+ mn->append(md);
+ Doxygen::memberNameSDict->append(rname,mn);
+ }
+
+ // add member to the class cd
+ cd->insertMember(md);
+ // also add the member as a "base" (to get nicer diagrams)
+ // "optional" interface/service get Protected which turns into dashed line
+ BaseInfo base(rname,
+ (root->spec & (Entry::Optional)) ? Protected : Public,Normal);
+ findClassRelation(rootNav,cd,cd,&base,0,DocumentedOnly,true)
+ || findClassRelation(rootNav,cd,cd,&base,0,Undocumented,true);
+ // add file to list of used files
+ cd->insertUsedFile(root->fileName);
+
+ addMemberToGroups(root,md);
+ rootNav->changeSection(Entry::EMPTY_SEC);
+ md->setRefItems(root->sli);
+}
+
+static void buildInterfaceAndServiceList(EntryNav *const rootNav)
+{
+ if (rootNav->section()==Entry::EXPORTED_INTERFACE_SEC ||
+ rootNav->section()==Entry::INCLUDED_SERVICE_SEC)
+ {
+ rootNav->loadEntry(g_storage);
+ Entry *const root = rootNav->entry();
+
+ Debug::print(Debug::Functions,0,
+ "EXPORTED_INTERFACE_SEC:\n"
+ " `%s' `%s'::`%s' `%s' relates=`%s' relatesType=`%d' file=`%s' line=`%d' bodyLine=`%d' #tArgLists=%d mGrpId=%d spec=%lld proto=%d docFile=%s\n",
+ root->type.data(),
+ rootNav->parent()->name().data(),
+ root->name.data(),
+ root->args.data(),
+ root->relates.data(),
+ root->relatesType,
+ root->fileName.data(),
+ root->startLine,
+ root->bodyLine,
+ root->tArgLists ? (int)root->tArgLists->count() : -1,
+ root->mGrpId,
+ root->spec,
+ root->proto,
+ root->docFile.data()
+ );
+
+ QCString const rname = removeRedundantWhiteSpace(root->name);
+
+ if (!rname.isEmpty())
+ {
+ QCString const scope = rootNav->parent()->name();
+ ClassDef *const cd = getClass(scope);
+ assert(cd);
+ if (cd && ((ClassDef::Interface == cd->compoundType()) ||
+ (ClassDef::Service == cd->compoundType()) ||
+ (ClassDef::Singleton == cd->compoundType())))
+ {
+ addInterfaceOrServiceToServiceOrSingleton(rootNav,cd,rname);
+ }
+ else
+ {
+ assert(false); // was checked by scanner.l
+ }
+ }
+ else if (rname.isEmpty())
+ {
+ warn(root->fileName,root->startLine,
+ "Illegal member name found.");
+ }
+
+ rootNav->releaseEntry();
+ }
+ // can only have these in IDL anyway
+ switch (rootNav->lang())
+ {
+ case SrcLangExt_Unknown: // fall through (root node always is Unknown)
+ case SrcLangExt_IDL:
+ RECURSE_ENTRYTREE(buildInterfaceAndServiceList,rootNav);
+ break;
+ default:
+ return; // nothing to do here
+ }
+}
+
+
+//----------------------------------------------------------------------
// Searches the Entry tree for Function sections.
// If found they are stored in their class or in the global list.
@@ -2994,7 +3222,7 @@ static void addMethodToClass(EntryNav *rootNav,ClassDef *cd,
// adding class member
MemberDef *md=new MemberDef(
- root->fileName,root->startLine,
+ root->fileName,root->startLine,root->startColumn,
root->type,name,root->args,root->exception,
root->protection,root->virt,
root->stat && root->relatesType != MemberOf,
@@ -3012,6 +3240,7 @@ static void addMethodToClass(EntryNav *rootNav,ClassDef *cd,
md->setMemberGroupId(root->mGrpId);
md->setTypeConstraints(root->typeConstr);
md->setLanguage(root->lang);
+ md->setId(root->id);
md->setBodyDef(fd);
md->setFileDef(fd);
//md->setScopeTemplateArguments(root->tArgList);
@@ -3130,7 +3359,7 @@ static void buildFunctionList(EntryNav *rootNav)
Debug::print(Debug::Functions,0,
"FUNCTION_SEC:\n"
- " `%s' `%s'::`%s' `%s' relates=`%s' relatesType=`%d' file=`%s' line=`%d' bodyLine=`%d' #tArgLists=%d mGrpId=%d spec=%d proto=%d docFile=%s\n",
+ " `%s' `%s'::`%s' `%s' relates=`%s' relatesType=`%d' file=`%s' line=`%d' bodyLine=`%d' #tArgLists=%d mGrpId=%d spec=%lld proto=%d docFile=%s\n",
root->type.data(),
rootNav->parent()->name().data(),
root->name.data(),
@@ -3257,28 +3486,34 @@ static void buildFunctionList(EntryNav *rootNav)
if (rnd) rnsName = rnd->name().copy();
//printf("matching arguments for %s%s %s%s\n",
// md->name().data(),md->argsString(),rname.data(),argListToString(root->argList).data());
- LockingPtr<ArgumentList> mdAl = md->argumentList();
- LockingPtr<ArgumentList> mdTempl = md->templateArguments();
+ ArgumentList *mdAl = md->argumentList();
+ ArgumentList *mdTempl = md->templateArguments();
// in case of template functions, we need to check if the
// functions have the same number of template parameters
bool sameNumTemplateArgs = TRUE;
+ bool matchingReturnTypes = TRUE;
if (mdTempl!=0 && root->tArgLists)
{
if (mdTempl->count()!=root->tArgLists->getLast()->count())
{
sameNumTemplateArgs = FALSE;
}
+ if (md->typeString()!=removeRedundantWhiteSpace(root->type))
+ {
+ matchingReturnTypes = FALSE;
+ }
}
bool staticsInDifferentFiles =
root->stat && md->isStatic() && root->fileName!=md->getDefFileName();
if (
- matchArguments2(md->getOuterScope(),mfd,mdAl.pointer(),
+ matchArguments2(md->getOuterScope(),mfd,mdAl,
rnd ? rnd : Doxygen::globalScope,rfd,root->argList,
FALSE) &&
sameNumTemplateArgs &&
+ matchingReturnTypes &&
!staticsInDifferentFiles
)
{
@@ -3308,7 +3543,7 @@ static void buildFunctionList(EntryNav *rootNav)
if (found)
{
// merge argument lists
- mergeArguments(mdAl.pointer(),root->argList,!root->doc.isEmpty());
+ mergeArguments(mdAl,root->argList,!root->doc.isEmpty());
// merge documentation
if (md->documentation().isEmpty() && !root->doc.isEmpty())
{
@@ -3380,13 +3615,14 @@ static void buildFunctionList(EntryNav *rootNav)
ArgumentList *tArgList = root->tArgLists ? root->tArgLists->last() : 0;
QCString name=removeRedundantWhiteSpace(rname);
md=new MemberDef(
- root->fileName,root->startLine,
+ root->fileName,root->startLine,root->startColumn,
root->type,name,root->args,root->exception,
root->protection,root->virt,root->stat,Member,
MemberType_Function,tArgList,root->argList);
md->setTagInfo(rootNav->tagInfo());
md->setLanguage(root->lang);
+ md->setId(root->id);
//md->setDefFile(root->fileName);
//md->setDefLine(root->startLine);
md->setDocumentation(root->doc,root->docFile,root->docLine);
@@ -3526,7 +3762,7 @@ static void buildFunctionList(EntryNav *rootNav)
else if (rname.isEmpty())
{
warn(root->fileName,root->startLine,
- "warning: Illegal member name found."
+ "Illegal member name found."
);
}
@@ -3560,18 +3796,18 @@ static void findFriends()
//printf("Checking for matching arguments
// mmd->isRelated()=%d mmd->isFriend()=%d mmd->isFunction()=%d\n",
// mmd->isRelated(),mmd->isFriend(),mmd->isFunction());
- LockingPtr<ArgumentList> mmdAl = mmd->argumentList();
- LockingPtr<ArgumentList> fmdAl = fmd->argumentList();
+ ArgumentList *mmdAl = mmd->argumentList();
+ ArgumentList *fmdAl = fmd->argumentList();
if ((mmd->isFriend() || (mmd->isRelated() && mmd->isFunction())) &&
- matchArguments2(mmd->getOuterScope(), mmd->getFileDef(), mmdAl.pointer(),
- fmd->getOuterScope(), fmd->getFileDef(), fmdAl.pointer(),
+ matchArguments2(mmd->getOuterScope(), mmd->getFileDef(), mmdAl,
+ fmd->getOuterScope(), fmd->getFileDef(), fmdAl,
TRUE
)
) // if the member is related and the arguments match then the
// function is actually a friend.
{
- mergeArguments(mmdAl.pointer(),fmdAl.pointer());
+ mergeArguments(mmdAl,fmdAl);
if (!fmd->documentation().isEmpty())
{
mmd->setDocumentation(fmd->documentation(),fmd->docFile(),fmd->docLine());
@@ -3678,20 +3914,20 @@ static void transferFunctionReferences()
}
if (mdef && mdec)
{
- LockingPtr<ArgumentList> mdefAl = mdef->argumentList();
- LockingPtr<ArgumentList> mdecAl = mdec->argumentList();
+ ArgumentList *mdefAl = mdef->argumentList();
+ ArgumentList *mdecAl = mdec->argumentList();
if (
- matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdefAl.pointer(),
- mdec->getOuterScope(),mdec->getFileDef(),mdecAl.pointer(),
+ matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdefAl,
+ mdec->getOuterScope(),mdec->getFileDef(),mdecAl,
TRUE
)
) /* match found */
{
- LockingPtr<MemberSDict> defDict = mdef->getReferencesMembers();
- LockingPtr<MemberSDict> decDict = mdec->getReferencesMembers();
+ MemberSDict *defDict = mdef->getReferencesMembers();
+ MemberSDict *decDict = mdec->getReferencesMembers();
if (defDict!=0)
{
- MemberSDict::Iterator msdi(*defDict);
+ MemberSDict::IteratorDict msdi(*defDict);
MemberDef *rmd;
for (msdi.toFirst();(rmd=msdi.current());++msdi)
{
@@ -3703,7 +3939,7 @@ static void transferFunctionReferences()
}
if (decDict!=0)
{
- MemberSDict::Iterator msdi(*decDict);
+ MemberSDict::IteratorDict msdi(*decDict);
MemberDef *rmd;
for (msdi.toFirst();(rmd=msdi.current());++msdi)
{
@@ -3718,7 +3954,7 @@ static void transferFunctionReferences()
decDict = mdec->getReferencedByMembers();
if (defDict!=0)
{
- MemberSDict::Iterator msdi(*defDict);
+ MemberSDict::IteratorDict msdi(*defDict);
MemberDef *rmd;
for (msdi.toFirst();(rmd=msdi.current());++msdi)
{
@@ -3730,7 +3966,7 @@ static void transferFunctionReferences()
}
if (decDict!=0)
{
- MemberSDict::Iterator msdi(*decDict);
+ MemberSDict::IteratorDict msdi(*decDict);
MemberDef *rmd;
for (msdi.toFirst();(rmd=msdi.current());++msdi)
{
@@ -3769,12 +4005,12 @@ static void transferRelatedFunctionDocumentation()
MemberNameIterator rmni(*rmn);
for (rmni.toFirst();(rmd=rmni.current());++rmni) // for each member with the same name
{
- LockingPtr<ArgumentList> mdAl = md->argumentList();
- LockingPtr<ArgumentList> rmdAl = rmd->argumentList();
+ ArgumentList *mdAl = md->argumentList();
+ ArgumentList *rmdAl = rmd->argumentList();
//printf(" Member found: related=`%d'\n",rmd->isRelated());
if ((rmd->isRelated() || rmd->isForeign()) && // related function
- matchArguments2( md->getOuterScope(), md->getFileDef(), mdAl.pointer(),
- rmd->getOuterScope(),rmd->getFileDef(),rmdAl.pointer(),
+ matchArguments2( md->getOuterScope(), md->getFileDef(), mdAl,
+ rmd->getOuterScope(),rmd->getFileDef(),rmdAl,
TRUE
)
)
@@ -3863,24 +4099,6 @@ static ClassDef *findClassWithinClassContext(Definition *context,ClassDef *cd,co
return result;
}
-enum FindBaseClassRelation_Mode
-{
- TemplateInstances,
- DocumentedOnly,
- Undocumented
-};
-
-static bool findClassRelation(
- EntryNav *rootNav,
- Definition *context,
- ClassDef *cd,
- BaseInfo *bi,
- QDict<int> *templateNames,
- /*bool insertUndocumented*/
- FindBaseClassRelation_Mode mode,
- bool isArtificial
- );
-
static void findUsedClassesForClass(EntryNav *rootNav,
Definition *context,
@@ -3978,7 +4196,9 @@ static void findUsedClassesForClass(EntryNav *rootNav,
{
usedCd = new ClassDef(
masterCd->getDefFileName(),masterCd->getDefLine(),
- usedName,ClassDef::Class);
+ masterCd->getDefColumn(),
+ usedName,
+ ClassDef::Class);
//printf("making %s a template argument!!!\n",usedCd->name().data());
usedCd->makeTemplateArgument();
usedCd->setUsedOnly(TRUE);
@@ -4028,6 +4248,7 @@ static void findUsedClassesForClass(EntryNav *rootNav,
Debug::print(Debug::Classes,0," New undocumented used class `%s'\n", type.data());
usedCd = new ClassDef(
masterCd->getDefFileName(),masterCd->getDefLine(),
+ masterCd->getDefColumn(),
type,ClassDef::Class);
usedCd->setUsedOnly(TRUE);
usedCd->setLanguage(masterCd->getLanguage());
@@ -4143,7 +4364,7 @@ static bool findTemplateInstanceRelation(Entry *root,
bool freshInstance=FALSE;
ClassDef *instanceClass = templateClass->insertTemplateInstance(
- root->fileName,root->startLine,templSpec,freshInstance);
+ root->fileName,root->startLine,root->startColumn,templSpec,freshInstance);
if (isArtificial) instanceClass->setArtificial(TRUE);
instanceClass->setLanguage(root->lang);
@@ -4369,7 +4590,13 @@ static bool findClassRelation(
// ) // Check for base class with the same name.
// // If found then look in the outer scope for a match
// // and prevent recursion.
- if (!isRecursiveBaseClass(rootNav->name(),baseClassName) || explicitGlobalScope)
+ if (!isRecursiveBaseClass(rootNav->name(),baseClassName)
+ || explicitGlobalScope
+ // sadly isRecursiveBaseClass always true for UNO IDL ifc/svc members
+ // (i.e. this is needed for addInterfaceOrServiceToServiceOrSingleton)
+ || (rootNav->lang()==SrcLangExt_IDL &&
+ (rootNav->section()==Entry::EXPORTED_INTERFACE_SEC ||
+ rootNav->section()==Entry::INCLUDED_SERVICE_SEC)))
{
Debug::print(
Debug::Classes,0," class relation %s inherited/used by %s found (%s and %s) templSpec='%s'\n",
@@ -4517,10 +4744,22 @@ static bool findClassRelation(
usedName=biName;
//printf("***** usedName=%s templSpec=%s\n",usedName.data(),templSpec.data());
}
- if (Config_getBool("SIP_SUPPORT")) bi->prot=Public;
- cd->insertBaseClass(baseClass,usedName,bi->prot,bi->virt,templSpec);
- // add this class as super class to the base class
- baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec);
+ static bool sipSupport = Config_getBool("SIP_SUPPORT");
+ if (sipSupport) bi->prot=Public;
+ if (!cd->isSubClass(baseClass)) // check for recursion, see bug690787
+ {
+ cd->insertBaseClass(baseClass,usedName,bi->prot,bi->virt,templSpec);
+ // add this class as super class to the base class
+ baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec);
+ }
+ else
+ {
+ warn(root->fileName,root->startLine,
+ "Detected potential recursive class relation "
+ "between class %s and base class %s!",
+ cd->name().data(),baseClass->name().data()
+ );
+ }
}
return TRUE;
}
@@ -4536,8 +4775,9 @@ static bool findClassRelation(
baseClass=Doxygen::hiddenClasses->find(baseClassName);
if (baseClass==0)
{
- baseClass=new ClassDef(root->fileName,root->startLine,
- baseClassName,ClassDef::Class);
+ baseClass=new ClassDef(root->fileName,root->startLine,root->startColumn,
+ baseClassName,
+ ClassDef::Class);
Doxygen::hiddenClasses->append(baseClassName,baseClass);
if (isArtificial) baseClass->setArtificial(TRUE);
baseClass->setLanguage(root->lang);
@@ -4550,8 +4790,9 @@ static bool findClassRelation(
// baseClassName.data(),baseClass,biName.data(),templSpec.data());
if (baseClass==0)
{
- baseClass=new ClassDef(root->fileName,root->startLine,
- baseClassName,ClassDef::Class);
+ baseClass=new ClassDef(root->fileName,root->startLine,root->startColumn,
+ baseClassName,
+ ClassDef::Class);
Doxygen::classSDict->append(baseClassName,baseClass);
if (isArtificial) baseClass->setArtificial(TRUE);
baseClass->setLanguage(root->lang);
@@ -4746,7 +4987,7 @@ static void computeClassRelations()
)
warn_undoc(
root->fileName,root->startLine,
- "warning: Compound %s is not documented.",
+ "Compound %s is not documented.",
root->name.data()
);
}
@@ -4935,8 +5176,8 @@ static void addListReferences()
name = pd->getGroupDef()->getOutputFileBase();
}
{
- LockingPtr< QList<ListItemInfo> > xrefItems = pd->xrefListItems();
- addRefItem(xrefItems.pointer(),
+ QList<ListItemInfo> *xrefItems = pd->xrefListItems();
+ addRefItem(xrefItems,
name,
theTranslator->trPage(TRUE,TRUE),
name,pd->title(),0);
@@ -4951,8 +5192,8 @@ static void addListReferences()
//{
// name = dd->getGroupDef()->getOutputFileBase();
//}
- LockingPtr< QList<ListItemInfo> > xrefItems = dd->xrefListItems();
- addRefItem(xrefItems.pointer(),
+ QList<ListItemInfo> *xrefItems = dd->xrefListItems();
+ addRefItem(xrefItems,
name,
theTranslator->trDir(TRUE,TRUE),
name,dd->displayName(),0);
@@ -5007,23 +5248,23 @@ static void addMemberDocs(EntryNav *rootNav,
// TODO determine scope based on root not md
Definition *rscope = md->getOuterScope();
- LockingPtr<ArgumentList> mdAl = md->argumentList();
+ ArgumentList *mdAl = md->argumentList();
if (al)
{
//printf("merging arguments (1) docs=%d\n",root->doc.isEmpty());
- mergeArguments(mdAl.pointer(),al,!root->doc.isEmpty());
+ mergeArguments(mdAl,al,!root->doc.isEmpty());
}
else
{
if (
- matchArguments2( md->getOuterScope(), md->getFileDef(), mdAl.pointer(),
+ matchArguments2( md->getOuterScope(), md->getFileDef(), mdAl,
rscope,rfd,root->argList,
TRUE
)
)
{
//printf("merging arguments (2)\n");
- mergeArguments(mdAl.pointer(),root->argList,!root->doc.isEmpty());
+ mergeArguments(mdAl,root->argList,!root->doc.isEmpty());
}
}
if (over_load) // the \overload keyword was used
@@ -5098,7 +5339,7 @@ static void addMemberDocs(EntryNav *rootNav,
{
warn(
root->fileName,root->startLine,
- "warning: member %s belongs to two different groups. The second "
+ "member %s belongs to two different groups. The second "
"one found here will be ignored.",
md->name().data()
);
@@ -5131,6 +5372,7 @@ static ClassDef *findClassDefinition(FileDef *fd,NamespaceDef *nd,
static bool findGlobalMember(EntryNav *rootNav,
const QCString &namespaceName,
+ const char *type,
const char *name,
const char *tempArg,
const char *,
@@ -5138,8 +5380,8 @@ static bool findGlobalMember(EntryNav *rootNav,
{
Entry *root = rootNav->entry();
Debug::print(Debug::FindMembers,0,
- "2. findGlobalMember(namespace=%s,name=%s,tempArg=%s,decl=%s)\n",
- namespaceName.data(),name,tempArg,decl);
+ "2. findGlobalMember(namespace=%s,type=%s,name=%s,tempArg=%s,decl=%s)\n",
+ namespaceName.data(),type,name,tempArg,decl);
QCString n=name;
if (n.isEmpty()) return FALSE;
if (n.find("::")!=-1) return FALSE; // skip undefined class members
@@ -5150,7 +5392,7 @@ static bool findGlobalMember(EntryNav *rootNav,
}
if (mn) // function name defined
{
- Debug::print(Debug::FindMembers,0,"3. Found function scope\n");
+ Debug::print(Debug::FindMembers,0,"3. Found symbol scope\n");
//int count=0;
MemberNameIterator mni(*mn);
MemberDef *md;
@@ -5184,11 +5426,11 @@ static bool findGlobalMember(EntryNav *rootNav,
NamespaceDef *rnd = 0;
if (!namespaceName.isEmpty()) rnd = Doxygen::namespaceSDict->find(namespaceName);
- LockingPtr<ArgumentList> mdAl = md->argumentList();
+ ArgumentList *mdAl = md->argumentList();
bool matching=
(mdAl==0 && root->argList->count()==0) ||
md->isVariable() || md->isTypedef() || /* in case of function pointers */
- matchArguments2(md->getOuterScope(),md->getFileDef(),mdAl.pointer(),
+ matchArguments2(md->getOuterScope(),md->getFileDef(),mdAl,
rnd ? rnd : Doxygen::globalScope,fd,root->argList,
FALSE);
@@ -5197,8 +5439,8 @@ static bool findGlobalMember(EntryNav *rootNav,
// different functions.
if (matching && root->tArgLists)
{
- LockingPtr<ArgumentList> mdTempl = md->templateArguments();
- if (mdTempl!=0)
+ ArgumentList *mdTempl = md->templateArguments();
+ if (mdTempl)
{
if (root->tArgLists->getLast()->count()!=mdTempl->count())
{
@@ -5222,6 +5464,19 @@ static bool findGlobalMember(EntryNav *rootNav,
matching = FALSE;
}
+ // for template member we also need to check the return type
+ if (md->templateArguments()!=0 && root->tArgLists!=0)
+ {
+ //printf("Comparing return types '%s'<->'%s'\n",
+ // md->typeString(),type);
+ if (md->templateArguments()->count()!=root->tArgLists->last()->count() ||
+ qstrcmp(md->typeString(),type)!=0)
+ {
+ //printf(" ---> no matching\n");
+ matching = FALSE;
+ }
+ }
+
if (matching) // add docs to the member
{
Debug::print(Debug::FindMembers,0,"5. Match found\n");
@@ -5235,7 +5490,7 @@ static bool findGlobalMember(EntryNav *rootNav,
QCString fullFuncDecl=decl;
if (root->argList) fullFuncDecl+=argListToString(root->argList,TRUE);
QCString warnMsg =
- QCString("warning: no matching file member found for \n")+substitute(fullFuncDecl,"%","%%");
+ QCString("no matching file member found for \n")+substitute(fullFuncDecl,"%","%%");
if (mn->count()>0)
{
warnMsg+="\nPossible candidates:\n";
@@ -5260,7 +5515,7 @@ static bool findGlobalMember(EntryNav *rootNav,
)
{
warn(root->fileName,root->startLine,
- "warning: documented function `%s' was not declared or defined.",decl
+ "documented symbol `%s' was not declared or defined.",decl
);
}
}
@@ -5430,7 +5685,7 @@ static void findMember(EntryNav *rootNav,
Debug::print(Debug::FindMembers,0,
"findMember(root=%p,funcDecl=`%s',related=`%s',overload=%d,"
"isFunc=%d mGrpId=%d tArgList=%p (#=%d) "
- "spec=%d lang=%x\n",
+ "spec=%lld lang=%x\n",
root,funcDecl.data(),root->relates.data(),overloaded,isFunc,root->mGrpId,
root->tArgLists,root->tArgLists ? root->tArgLists->count() : 0,
root->spec,root->lang
@@ -5789,10 +6044,10 @@ static void findMember(EntryNav *rootNav,
// get the template parameter lists found at the member declaration
QList<ArgumentList> declTemplArgs;
cd->getTemplateParameterLists(declTemplArgs);
- LockingPtr<ArgumentList> templAl = md->templateArguments();
- if (templAl!=0)
+ ArgumentList *templAl = md->templateArguments();
+ if (templAl)
{
- declTemplArgs.append(templAl.pointer());
+ declTemplArgs.append(templAl);
}
// get the template parameter lists found at the member definition
@@ -5806,10 +6061,10 @@ static void findMember(EntryNav *rootNav,
/* substitute the occurrences of class template names in the
* argument list before matching
*/
- LockingPtr<ArgumentList> mdAl = md->argumentList();
+ ArgumentList *mdAl = md->argumentList();
if (declTemplArgs.count()>0 && defTemplArgs &&
declTemplArgs.count()==defTemplArgs->count() &&
- mdAl.pointer()
+ mdAl
)
{
/* the function definition has template arguments
@@ -5819,13 +6074,13 @@ static void findMember(EntryNav *rootNav,
*/
argList = new ArgumentList;
substituteTemplatesInArgList(declTemplArgs,*defTemplArgs,
- mdAl.pointer(),argList);
+ mdAl,argList);
substDone=TRUE;
}
else /* no template arguments, compare argument lists directly */
{
- argList = mdAl.pointer();
+ argList = mdAl;
}
Debug::print(Debug::FindMembers,0,
@@ -5836,7 +6091,7 @@ static void findMember(EntryNav *rootNav,
bool matching=
md->isVariable() || md->isTypedef() || // needed for function pointers
- (mdAl.pointer()==0 && root->argList->count()==0) ||
+ (mdAl==0 && root->argList->count()==0) ||
matchArguments2(
md->getClassDef(),md->getFileDef(),argList,
cd,fd,root->argList,
@@ -5847,6 +6102,21 @@ static void findMember(EntryNav *rootNav,
matching = FALSE; // don't match methods and attributes with the same name
}
+ // for template member we also need to check the return type
+ if (md->templateArguments()!=0 && root->tArgLists!=0)
+ {
+ //printf("Comparing return types '%s'<->'%s' args %d<->%d\n",
+ // md->typeString(),funcType.data(),
+ // md->templateArguments()->count(),root->tArgLists->last()->count());
+ if (md->templateArguments()->count()!=root->tArgLists->last()->count() ||
+ qstrcmp(md->typeString(),funcType))
+ {
+ //printf(" ---> no matching\n");
+ matching = FALSE;
+ }
+ }
+
+
Debug::print(Debug::FindMembers,0,
"6. match results of matchArguments2 = %d\n",matching);
@@ -5907,7 +6177,7 @@ static void findMember(EntryNav *rootNav,
//printf("ccd->name()==%s className=%s\n",ccd->name().data(),className.data());
if (ccd!=0 && rightScopeMatch(ccd->name(),className))
{
- LockingPtr<ArgumentList> templAl = md->templateArguments();
+ ArgumentList *templAl = md->templateArguments();
if (root->tArgLists && templAl!=0 &&
root->tArgLists->getLast()->count()<=templAl->count())
{
@@ -5954,7 +6224,7 @@ static void findMember(EntryNav *rootNav,
}
}
- QCString warnMsg = "warning: no ";
+ QCString warnMsg = "no ";
if (noMatchCount>1) warnMsg+="uniquely ";
warnMsg+="matching class member found for \n";
@@ -5984,11 +6254,11 @@ static void findMember(EntryNav *rootNav,
ClassDef *cd=md->getClassDef();
if (cd!=0 && rightScopeMatch(cd->name(),className))
{
- LockingPtr<ArgumentList> templAl = md->templateArguments();
+ ArgumentList *templAl = md->templateArguments();
if (templAl!=0)
{
warnMsg+=" 'template ";
- warnMsg+=tempArgListToString(templAl.pointer());
+ warnMsg+=tempArgListToString(templAl);
warnMsg+='\n';
}
warnMsg+=" ";
@@ -6033,7 +6303,7 @@ static void findMember(EntryNav *rootNav,
ArgumentList *tArgList = new ArgumentList;
// getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists);
md=new MemberDef(
- root->fileName,root->startLine,
+ root->fileName,root->startLine,root->startColumn,
funcType,funcName,funcArgs,exceptions,
declMd ? declMd->protection() : root->protection,
root->virt,root->stat,Member,
@@ -6041,6 +6311,7 @@ static void findMember(EntryNav *rootNav,
//printf("new specialized member %s args=`%s'\n",md->name().data(),funcArgs.data());
md->setTagInfo(rootNav->tagInfo());
md->setLanguage(root->lang);
+ md->setId(root->id);
md->setMemberClass(cd);
md->setTemplateSpecialization(TRUE);
md->setTypeConstraints(root->typeConstr);
@@ -6099,12 +6370,13 @@ static void findMember(EntryNav *rootNav,
getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists);
//printf("new related member %s args=`%s'\n",md->name().data(),funcArgs.data());
MemberDef *md=new MemberDef(
- root->fileName,root->startLine,
+ root->fileName,root->startLine,root->startColumn,
funcType,funcName,funcArgs,exceptions,
root->protection,root->virt,root->stat,Related,
mtype,tArgList,root->argList);
md->setTagInfo(rootNav->tagInfo());
md->setLanguage(root->lang);
+ md->setId(root->id);
md->setTypeConstraints(root->typeConstr);
md->setMemberClass(cd);
md->setDefinition(funcDecl);
@@ -6131,12 +6403,12 @@ static void findMember(EntryNav *rootNav,
}
else // unrelated function with the same name as a member
{
- if (!findGlobalMember(rootNav,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
+ if (!findGlobalMember(rootNav,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl))
{
QCString fullFuncDecl=funcDecl.copy();
if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE);
warn(root->fileName,root->startLine,
- "warning: Cannot determine class for function\n%s",
+ "Cannot determine class for function\n%s",
fullFuncDecl.data()
);
}
@@ -6180,11 +6452,11 @@ static void findMember(EntryNav *rootNav,
MemberDef *rmd=mn->first();
while (rmd && newMember) // see if we got another member with matching arguments
{
- LockingPtr<ArgumentList> rmdAl = rmd->argumentList();
+ ArgumentList *rmdAl = rmd->argumentList();
newMember=
className!=rmd->getOuterScope()->name() ||
- !matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl.pointer(),
+ !matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl,
cd,fd,root->argList,
TRUE);
if (newMember) rmd=mn->next();
@@ -6229,7 +6501,7 @@ static void findMember(EntryNav *rootNav,
// the related function, which don't have to do with
// those of the related class.
MemberDef *md=new MemberDef(
- root->fileName,root->startLine,
+ root->fileName,root->startLine,root->startColumn,
funcType,funcName,funcArgs,exceptions,
root->protection,root->virt,
root->stat && !isMemberOf,
@@ -6274,10 +6546,10 @@ static void findMember(EntryNav *rootNav,
MemberDef *rmd=rmn->first();
while (rmd && !found) // see if we got another member with matching arguments
{
- LockingPtr<ArgumentList> rmdAl = rmd->argumentList();
+ ArgumentList *rmdAl = rmd->argumentList();
// check for matching argument lists
if (
- matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl.pointer(),
+ matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl,
cd,fd,root->argList,
TRUE)
)
@@ -6318,6 +6590,7 @@ static void findMember(EntryNav *rootNav,
md->addSectionsToDefinition(root->anchors);
md->setMemberGroupId(root->mGrpId);
md->setLanguage(root->lang);
+ md->setId(root->id);
//md->setMemberDefTemplateArguments(root->mtArgList);
mn->append(md);
cd->insertMember(md);
@@ -6338,12 +6611,12 @@ static void findMember(EntryNav *rootNav,
}
if (root->relatesType == Duplicate)
{
- if (!findGlobalMember(rootNav,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
+ if (!findGlobalMember(rootNav,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl))
{
QCString fullFuncDecl=funcDecl.copy();
if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE);
warn(root->fileName,root->startLine,
- "warning: Cannot determine file/namespace for relatedalso function\n%s",
+ "Cannot determine file/namespace for relatedalso function\n%s",
fullFuncDecl.data()
);
}
@@ -6352,7 +6625,7 @@ static void findMember(EntryNav *rootNav,
else
{
warn_undoc(root->fileName,root->startLine,
- "warning: class `%s' for related function `%s' is not "
+ "class `%s' for related function `%s' is not "
"documented.",
className.data(),funcName.data()
);
@@ -6369,12 +6642,13 @@ localObjCMethod:
" scopeName=%s className=%s\n",root->name.data(),scopeName.data(),className.data());
//printf("Local objective C method `%s' of class `%s' found\n",root->name.data(),cd->name().data());
MemberDef *md=new MemberDef(
- root->fileName,root->startLine,
+ root->fileName,root->startLine,root->startColumn,
funcType,funcName,funcArgs,exceptions,
root->protection,root->virt,root->stat,Member,
MemberType_Function,0,root->argList);
md->setTagInfo(rootNav->tagInfo());
md->setLanguage(root->lang);
+ md->setId(root->id);
md->makeImplementationDetail();
md->setMemberClass(cd);
md->setDefinition(funcDecl);
@@ -6412,18 +6686,18 @@ localObjCMethod:
}
else // unrelated not overloaded member found
{
- bool globMem = findGlobalMember(rootNav,namespaceName,funcName,funcTempList,funcArgs,funcDecl);
+ bool globMem = findGlobalMember(rootNav,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl);
if (className.isEmpty() && !globMem)
{
warn(root->fileName,root->startLine,
- "warning: class for member `%s' cannot "
+ "class for member `%s' cannot "
"be found.", funcName.data()
);
}
else if (!className.isEmpty() && !globMem)
{
warn(root->fileName,root->startLine,
- "warning: member `%s' of class `%s' cannot be found",
+ "member `%s' of class `%s' cannot be found",
funcName.data(),className.data());
}
}
@@ -6432,7 +6706,7 @@ localObjCMethod:
{
// this should not be called
warn(root->fileName,root->startLine,
- "warning: member with no name found.");
+ "member with no name found.");
}
return;
}
@@ -6446,7 +6720,7 @@ static void filterMemberDocumentation(EntryNav *rootNav)
Entry *root = rootNav->entry();
int i=-1,l;
Debug::print(Debug::FindMembers,0,
- "findMemberDocumentation(): root->type=`%s' root->inside=`%s' root->name=`%s' root->args=`%s' section=%x root->spec=%d root->mGrpId=%d\n",
+ "findMemberDocumentation(): root->type=`%s' root->inside=`%s' root->name=`%s' root->args=`%s' section=%x root->spec=%lld root->mGrpId=%d\n",
root->type.data(),root->inside.data(),root->name.data(),root->args.data(),root->section,root->spec,root->mGrpId
);
//printf("rootNav->parent()->name()=%s\n",rootNav->parent()->name().data());
@@ -6551,6 +6825,11 @@ static void filterMemberDocumentation(EntryNav *rootNav)
//if (!root->relates.isEmpty()) printf(" Relates %s\n",root->relates.data());
findMember(rootNav,root->name,FALSE,FALSE);
}
+ else if (root->section==Entry::EXPORTED_INTERFACE_SEC ||
+ root->section==Entry::INCLUDED_SERVICE_SEC)
+ {
+ findMember(rootNav,root->type + " " + root->name,FALSE,FALSE);
+ }
else
{
// skip section
@@ -6565,7 +6844,9 @@ static void findMemberDocumentation(EntryNav *rootNav)
rootNav->section()==Entry::FUNCTION_SEC ||
rootNav->section()==Entry::VARIABLE_SEC ||
rootNav->section()==Entry::VARIABLEDOC_SEC ||
- rootNav->section()==Entry::DEFINE_SEC
+ rootNav->section()==Entry::DEFINE_SEC ||
+ rootNav->section()==Entry::INCLUDED_SERVICE_SEC ||
+ rootNav->section()==Entry::EXPORTED_INTERFACE_SEC
)
{
rootNav->loadEntry(g_storage);
@@ -6695,7 +6976,7 @@ static void findEnums(EntryNav *rootNav)
{
// new enum type
md = new MemberDef(
- root->fileName,root->startLine,
+ root->fileName,root->startLine,root->startColumn,
0,name,0,0,
root->protection,Normal,FALSE,
isMemberOf ? Foreign : isRelated ? Related : Member,
@@ -6703,9 +6984,11 @@ static void findEnums(EntryNav *rootNav)
0,0);
md->setTagInfo(rootNav->tagInfo());
md->setLanguage(root->lang);
+ md->setId(root->id);
if (!isGlobal) md->setMemberClass(cd); else md->setFileDef(fd);
md->setBodySegment(root->bodyLine,root->endBodyLine);
md->setBodyDef(rootNav->fileDef());
+ md->setMemberSpecifiers(root->spec); // UNO IDL "published"
md->setEnumBaseType(root->args);
//printf("Enum %s definition at line %d of %s: protection=%d\n",
// root->name.data(),root->bodyLine,root->fileName.data(),root->protection);
@@ -6906,7 +7189,7 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
substitute(rootNav->name(),"::",".")) // enum value scope matches that of the enum
{
MemberDef *fmd=new MemberDef(
- root->fileName,root->startLine,
+ root->fileName,root->startLine,root->startColumn,
root->type,root->name,root->args,0,
Public, Normal,root->stat,Member,
MemberType_EnumValue,0,0);
@@ -6916,6 +7199,7 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
fmd->setOuterScope(md->getOuterScope());
fmd->setTagInfo(e->tagInfo());
fmd->setLanguage(root->lang);
+ fmd->setId(root->id);
fmd->setDocumentation(root->doc,root->docFile,root->docLine);
fmd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
fmd->addSectionsToDefinition(root->anchors);
@@ -6926,7 +7210,18 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
fmd->setRefItems(root->sli);
fmd->setAnchor();
md->insertEnumField(fmd);
- fmd->setEnumScope(md);
+ fmd->setEnumScope(md,TRUE);
+ MemberName *mn=mnsd->find(root->name);
+ if (mn)
+ {
+ mn->append(fmd);
+ }
+ else
+ {
+ mn = new MemberName(root->name);
+ mn->append(fmd);
+ mnsd->append(root->name,mn);
+ }
}
e->releaseEntry();
}
@@ -7137,7 +7432,7 @@ static void findEnumDocumentation(EntryNav *rootNav)
if (!found)
{
warn(root->fileName,root->startLine,
- "warning: Documentation for undefined enum `%s' found.",
+ "Documentation for undefined enum `%s' found.",
name.data()
);
}
@@ -7164,9 +7459,9 @@ static void findDEV(const MemberNameSDict &mnsd)
{
if (md->isEnumerate()) // member is an enum
{
- LockingPtr<MemberList> fmdl = md->enumFieldList();
+ MemberList *fmdl = md->enumFieldList();
int documentedEnumValues=0;
- if (fmdl!=0) // enum has values
+ if (fmdl) // enum has values
{
MemberListIterator fmni(*fmdl);
MemberDef *fmd;
@@ -7266,15 +7561,15 @@ static void computeMemberRelations()
mcd->isBaseClass(bmcd,TRUE))
{
//printf(" derived scope\n");
- LockingPtr<ArgumentList> bmdAl = bmd->argumentList();
- LockingPtr<ArgumentList> mdAl = md->argumentList();
+ ArgumentList *bmdAl = bmd->argumentList();
+ ArgumentList *mdAl = md->argumentList();
//printf(" Base argList=`%s'\n Super argList=`%s'\n",
// argListToString(bmdAl.pointer()).data(),
// argListToString(mdAl.pointer()).data()
// );
if (
- matchArguments2(bmd->getOuterScope(),bmd->getFileDef(),bmdAl.pointer(),
- md->getOuterScope(), md->getFileDef(), mdAl.pointer(),
+ matchArguments2(bmd->getOuterScope(),bmd->getFileDef(),bmdAl,
+ md->getOuterScope(), md->getFileDef(), mdAl,
TRUE
)
)
@@ -7388,24 +7683,136 @@ static void generateFileSources()
{
if (Doxygen::inputNameList->count()>0)
{
- FileNameListIterator fnli(*Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
+#if USE_LIBCLANG
+ static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+ if (clangAssistedParsing)
{
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
+ QDict<void> g_processedFiles(10007);
+
+ // create a dictionary with files to process
+ QDict<void> g_filesToProcess(10007);
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
{
- if (fd->generateSourceFile()) // sources need to be shown in the output
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
{
- msg("Generating code for file %s...\n",fd->docName().data());
- fd->writeSource(*g_outputList);
+ g_filesToProcess.insert(fd->absFilePath(),(void*)0x8);
}
- else if (!fd->isReference() && Doxygen::parseSourcesNeeded)
- // we needed to parse the sources even if we do not show them
+ }
+ // process source files (and their include dependencies)
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
{
- msg("Parsing code for file %s...\n",fd->docName().data());
- fd->parseSource();
+ if (fd->isSource() && !fd->isReference())
+ {
+ QStrList filesInSameTu;
+ fd->getAllIncludeFilesRecursively(filesInSameTu);
+ fd->startParsing();
+ if (fd->generateSourceFile()) // sources need to be shown in the output
+ {
+ msg("Generating code for file %s...\n",fd->docName().data());
+ fd->writeSource(*g_outputList,FALSE,filesInSameTu);
+
+ }
+ else if (!fd->isReference() && Doxygen::parseSourcesNeeded)
+ // we needed to parse the sources even if we do not show them
+ {
+ msg("Parsing code for file %s...\n",fd->docName().data());
+ fd->parseSource(FALSE,filesInSameTu);
+ }
+
+ char *incFile = filesInSameTu.first();
+ while (incFile && g_filesToProcess.find(incFile))
+ {
+ if (fd->absFilePath()!=incFile && !g_processedFiles.find(incFile))
+ {
+ QStrList moreFiles;
+ bool ambig;
+ FileDef *ifd=findFileDef(Doxygen::inputNameDict,incFile,ambig);
+ if (ifd && !ifd->isReference())
+ {
+ if (ifd->generateSourceFile()) // sources need to be shown in the output
+ {
+ msg(" Generating code for file %s...\n",ifd->docName().data());
+ ifd->writeSource(*g_outputList,TRUE,moreFiles);
+
+ }
+ else if (!ifd->isReference() && Doxygen::parseSourcesNeeded)
+ // we needed to parse the sources even if we do not show them
+ {
+ msg(" Parsing code for file %s...\n",ifd->docName().data());
+ ifd->parseSource(TRUE,moreFiles);
+ }
+ g_processedFiles.insert(incFile,(void*)0x8);
+ }
+ }
+ incFile = filesInSameTu.next();
+ }
+ fd->finishParsing();
+ g_processedFiles.insert(fd->absFilePath(),(void*)0x8);
+ }
+ }
+ }
+ // process remaining files
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ if (!g_processedFiles.find(fd->absFilePath())) // not yet processed
+ {
+ QStrList filesInSameTu;
+ fd->startParsing();
+ if (fd->generateSourceFile()) // sources need to be shown in the output
+ {
+ msg("Generating code for file %s...\n",fd->docName().data());
+ fd->writeSource(*g_outputList,FALSE,filesInSameTu);
+
+ }
+ else if (!fd->isReference() && Doxygen::parseSourcesNeeded)
+ // we needed to parse the sources even if we do not show them
+ {
+ msg("Parsing code for file %s...\n",fd->docName().data());
+ fd->parseSource(FALSE,filesInSameTu);
+ }
+ fd->finishParsing();
+ }
+ }
+ }
+ }
+ else
+#endif
+ {
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (;(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ QStrList filesInSameTu;
+ fd->startParsing();
+ if (fd->generateSourceFile()) // sources need to be shown in the output
+ {
+ msg("Generating code for file %s...\n",fd->docName().data());
+ fd->writeSource(*g_outputList,FALSE,filesInSameTu);
+
+ }
+ else if (!fd->isReference() && Doxygen::parseSourcesNeeded)
+ // we needed to parse the sources even if we do not show them
+ {
+ msg("Parsing code for file %s...\n",fd->docName().data());
+ fd->parseSource(FALSE,filesInSameTu);
+ }
+ fd->finishParsing();
}
}
}
@@ -7912,7 +8319,7 @@ static void findDefineDocumentation(EntryNav *rootNav)
if (rootNav->tagInfo() && !root->name.isEmpty()) // define read from a tag file
{
- MemberDef *md=new MemberDef("<tagfile>",1,
+ MemberDef *md=new MemberDef("<tagfile>",1,1,
"#define",root->name,root->args,0,
Public,Normal,FALSE,Member,MemberType_Define,0,0);
md->setTagInfo(rootNav->tagInfo());
@@ -8013,7 +8420,7 @@ static void findDefineDocumentation(EntryNav *rootNav)
}
md=mn->next();
}
- //warn("warning: define %s found in the following files:\n",root->name.data());
+ //warn("define %s found in the following files:\n",root->name.data());
//warn("Cannot determine where to add the documentation found "
// "at line %d of file %s. \n",
// root->startLine,root->fileName.data());
@@ -8025,14 +8432,14 @@ static void findDefineDocumentation(EntryNav *rootNav)
if (preEnabled)
{
warn(root->fileName,root->startLine,
- "warning: documentation for unknown define %s found.\n",
+ "documentation for unknown define %s found.\n",
root->name.data()
);
}
else
{
warn(root->fileName,root->startLine,
- "warning: found documented #define but ignoring it because "
+ "found documented #define but ignoring it because "
"ENABLE_PREPROCESSING is NO.\n",
root->name.data()
);
@@ -8079,7 +8486,7 @@ static void findDirDocumentation(EntryNav *rootNav)
if (matchingDir)
{
warn(root->fileName,root->startLine,
- "warning: \\dir command matches multiple directories.\n"
+ "\\dir command matches multiple directories.\n"
" Applying the command for directory %s\n"
" Ignoring the command for directory %s\n",
matchingDir->name().data(),dir->name().data()
@@ -8101,7 +8508,7 @@ static void findDirDocumentation(EntryNav *rootNav)
}
else
{
- warn(root->fileName,root->startLine,"warning: No matching "
+ warn(root->fileName,root->startLine,"No matching "
"directory found for command \\dir %s\n",normalizedName.data());
}
rootNav->releaseEntry();
@@ -8183,7 +8590,7 @@ static void findMainPage(EntryNav *rootNav)
else
{
warn(root->fileName,root->startLine,
- "warning: found more than one \\mainpage comment block! Skipping this "
+ "found more than one \\mainpage comment block! Skipping this "
"block."
);
}
@@ -8239,7 +8646,7 @@ static void checkPageRelations()
{
if (ppd==pd)
{
- err("warning: page defined at line %d of file %s with label %s is a subpage "
+ err("page defined at line %d of file %s with label %s is a subpage "
"of itself! Please remove this cyclic dependency.\n",
pd->docLine(),pd->docFile().data(),pd->name().data());
exit(1);
@@ -8354,7 +8761,7 @@ static void buildExampleList(EntryNav *rootNav)
if (Doxygen::exampleSDict->find(root->name))
{
warn(root->fileName,root->startLine,
- "warning: Example %s was already documented. Ignoring "
+ "Example %s was already documented. Ignoring "
"documentation found here.",
root->name.data()
);
@@ -8416,7 +8823,7 @@ static void generateExampleDocs()
g_outputList->docify(pd->name());
endTitle(*g_outputList,n,0);
g_outputList->startContents();
- g_outputList->parseDoc(pd->docFile(), // file
+ g_outputList->generateDoc(pd->docFile(), // file
pd->docLine(), // startLine
pd, // context
0, // memberDef
@@ -8573,7 +8980,7 @@ static void generateConfigFile(const char *configFile,bool shortList,
{
msg("\n\nConfiguration file `%s' created.\n\n",configFile);
msg("Now edit the configuration file and enter\n\n");
- if (strcmp(configFile,"Doxyfile") || strcmp(configFile,"doxyfile"))
+ if (qstrcmp(configFile,"Doxyfile") || qstrcmp(configFile,"doxyfile"))
msg(" doxygen %s\n\n",configFile);
else
msg(" doxygen\n\n");
@@ -8587,7 +8994,7 @@ static void generateConfigFile(const char *configFile,bool shortList,
}
else
{
- err("error: Cannot open file %s for writing\n",configFile);
+ err("Cannot open file %s for writing\n",configFile);
exit(1);
}
}
@@ -8616,7 +9023,7 @@ static void readTagFile(Entry *root,const char *tl)
fileName = tagLine.left(eqPos).stripWhiteSpace();
destName = tagLine.right(tagLine.length()-eqPos-1).stripWhiteSpace();
QFileInfo fi(fileName);
- Doxygen::tagDestinationDict.insert(fi.fileName().utf8(),new QCString(destName));
+ Doxygen::tagDestinationDict.insert(fi.absFilePath().utf8(),new QCString(destName));
//printf("insert tagDestination %s->%s\n",fi.fileName().data(),destName.data());
}
else
@@ -8627,7 +9034,7 @@ static void readTagFile(Entry *root,const char *tl)
QFileInfo fi(fileName);
if (!fi.exists() || !fi.isFile())
{
- err("error: Tag file `%s' does not exist or is not a file. Skipping it...\n",
+ err("Tag file `%s' does not exist or is not a file. Skipping it...\n",
fileName.data());
return;
}
@@ -8637,7 +9044,7 @@ static void readTagFile(Entry *root,const char *tl)
else
msg("Reading tag file `%s'...\n",fileName.data());
- parseTagFile(root,fi.absFilePath().utf8(),fi.fileName().utf8());
+ parseTagFile(root,fi.absFilePath().utf8());
}
//----------------------------------------------------------------------------
@@ -8696,9 +9103,9 @@ static void copyLogo()
}
}
-static void copyExtraFiles()
+static void copyExtraFiles(const QCString& filesOption,const QCString &outputOption)
{
- QStrList files = Config_getList("HTML_EXTRA_FILES");
+ QStrList files = Config_getList(filesOption);
uint i;
for (i=0; i<files.count(); ++i)
{
@@ -8709,66 +9116,186 @@ static void copyExtraFiles()
QFileInfo fi(fileName);
if (!fi.exists())
{
- err("Extra HTML file '%s' specified in HTML_EXTRA_FILES does not exist!\n", fileName.data());
+ err("Extra file '%s' specified in" + filesOption + " does not exist!\n", fileName.data());
}
else
{
- QCString destFileName = Config_getString("HTML_OUTPUT")+"/"+fi.fileName().data();
- Doxygen::indexList->addImageFile(fi.fileName().data());
+ QCString destFileName = Config_getString(outputOption)+"/"+fi.fileName().data();
+ Doxygen::indexList->addImageFile(fi.fileName().utf8());
copyFile(fileName, destFileName);
}
}
}
}
-//! parse the list of input files
-static void parseFiles(Entry *root,EntryNav *rootNav)
+//----------------------------------------------------------------------------
+
+static ParserInterface *getParserForFile(const char *fn)
{
- QCString *s=g_inputFiles.first();
- while (s)
+ QCString fileName=fn;
+ QCString extension;
+ int ei = fileName.findRev('.');
+ if (ei!=-1)
+ {
+ extension=fileName.right(fileName.length()-ei);
+ }
+ else
{
- QCString fileName=*s;
- QCString extension;
- int ei = fileName.findRev('.');
- if (ei!=-1) extension=fileName.right(fileName.length()-ei);
- ParserInterface *parser = Doxygen::parserManager->getParser(extension);
+ extension = ".no_extension";
+ }
- QFileInfo fi(fileName);
- BufStr preBuf(fi.size()+4096);
+ return Doxygen::parserManager->getParser(extension);
+}
- if (Config_getBool("ENABLE_PREPROCESSING") &&
- parser->needsPreprocessing(extension))
- {
- BufStr inBuf(fi.size()+4096);
- msg("Preprocessing %s...\n",s->data());
- readInputFile(fileName,inBuf);
- preprocessFile(fileName,inBuf,preBuf);
- }
- else // no preprocessing
- {
- msg("Reading %s...\n",s->data());
- readInputFile(fileName,preBuf);
- }
+static void parseFile(ParserInterface *parser,
+ Entry *root,EntryNav *rootNav,FileDef *fd,const char *fn,
+ bool sameTu,QStrList &filesInSameTu)
+{
+#if USE_LIBCLANG
+ static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+#else
+ static bool clangAssistedParsing = FALSE;
+#endif
+ QCString fileName=fn;
+ QCString extension;
+ int ei = fileName.findRev('.');
+ if (ei!=-1)
+ {
+ extension=fileName.right(fileName.length()-ei);
+ }
+ else
+ {
+ extension = ".no_extension";
+ }
- BufStr convBuf(preBuf.curPos()+1024);
+ QFileInfo fi(fileName);
+ BufStr preBuf(fi.size()+4096);
- // convert multi-line C++ comments to C style comments
- convertCppComments(&preBuf,&convBuf,fileName);
+ if (Config_getBool("ENABLE_PREPROCESSING") &&
+ parser->needsPreprocessing(extension))
+ {
+ BufStr inBuf(fi.size()+4096);
+ msg("Preprocessing %s...\n",fn);
+ readInputFile(fileName,inBuf);
+ preprocessFile(fileName,inBuf,preBuf);
+ }
+ else // no preprocessing
+ {
+ msg("Reading %s...\n",fn);
+ readInputFile(fileName,preBuf);
+ }
- convBuf.addChar('\0');
+ BufStr convBuf(preBuf.curPos()+1024);
- // use language parse to parse the file
- parser->parseInput(fileName,convBuf.data(),root);
+ // convert multi-line C++ comments to C style comments
+ convertCppComments(&preBuf,&convBuf,fileName);
- // store the Entry tree in a file and create an index to
- // navigate/load entries
- bool ambig;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,fileName,ambig);
- ASSERT(fd!=0);
- //printf("root->createNavigationIndex for %s\n",fd->name().data());
- root->createNavigationIndex(rootNav,g_storage,fd);
+ convBuf.addChar('\0');
+
+ if (clangAssistedParsing && !sameTu)
+ {
+ fd->getAllIncludeFilesRecursively(filesInSameTu);
+ }
+
+ // use language parse to parse the file
+ parser->parseInput(fileName,convBuf.data(),root,sameTu,filesInSameTu);
+
+ // store the Entry tree in a file and create an index to
+ // navigate/load entries
+ //printf("root->createNavigationIndex for %s\n",fd->name().data());
+ root->createNavigationIndex(rootNav,g_storage,fd);
+}
+
+//! parse the list of input files
+static void parseFiles(Entry *root,EntryNav *rootNav)
+{
+#if USE_LIBCLANG
+ static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+ if (clangAssistedParsing)
+ {
+ QDict<void> g_processedFiles(10007);
+
+ // create a dictionary with files to process
+ QDict<void> g_filesToProcess(10007);
+ QCString *s=g_inputFiles.first();
+ while (s)
+ {
+ g_filesToProcess.insert(*s,(void*)0x8);
+ s=g_inputFiles.next();
+ }
+ s=g_inputFiles.first();
+
+ // process source files (and their include dependencies)
+ while (s)
+ {
+ bool ambig;
+ FileDef *fd=findFileDef(Doxygen::inputNameDict,s->data(),ambig);
+ ASSERT(fd!=0);
+ if (fd->isSource() && !fd->isReference()) // this is a source file
+ {
+ QStrList filesInSameTu;
+ ParserInterface * parser = getParserForFile(s->data());
+ parser->startTranslationUnit(s->data());
+ parseFile(parser,root,rootNav,fd,s->data(),FALSE,filesInSameTu);
+ //printf(" got %d extra files in tu\n",filesInSameTu.count());
- s=g_inputFiles.next();
+ // Now process any include files in the same translation unit
+ // first. When libclang is used this is much more efficient.
+ char *incFile = filesInSameTu.first();
+ while (incFile && g_filesToProcess.find(incFile))
+ {
+ if (qstrcmp(incFile,s->data()) && !g_processedFiles.find(incFile))
+ {
+ FileDef *ifd=findFileDef(Doxygen::inputNameDict,incFile,ambig);
+ if (ifd && !ifd->isReference())
+ {
+ QStrList moreFiles;
+ //printf(" Processing %s in same translation unit as %s\n",incFile,s->data());
+ parseFile(parser,root,rootNav,ifd,incFile,TRUE,moreFiles);
+ g_processedFiles.insert(incFile,(void*)0x8);
+ }
+ }
+ incFile = filesInSameTu.next();
+ }
+ parser->finishTranslationUnit();
+ g_processedFiles.insert(*s,(void*)0x8);
+ }
+ s=g_inputFiles.next();
+ }
+ // process remaining files
+ s=g_inputFiles.first();
+ while (s)
+ {
+ if (!g_processedFiles.find(*s)) // not yet processed
+ {
+ bool ambig;
+ QStrList filesInSameTu;
+ FileDef *fd=findFileDef(Doxygen::inputNameDict,s->data(),ambig);
+ ASSERT(fd!=0);
+ ParserInterface * parser = getParserForFile(s->data());
+ parser->startTranslationUnit(s->data());
+ parseFile(parser,root,rootNav,fd,s->data(),FALSE,filesInSameTu);
+ parser->finishTranslationUnit();
+ g_processedFiles.insert(*s,(void*)0x8);
+ }
+ s=g_inputFiles.next();
+ }
+ }
+ else // normal pocessing
+#endif
+ {
+ QCString *s=g_inputFiles.first();
+ while (s)
+ {
+ bool ambig;
+ QStrList filesInSameTu;
+ FileDef *fd=findFileDef(Doxygen::inputNameDict,s->data(),ambig);
+ ASSERT(fd!=0);
+ ParserInterface * parser = getParserForFile(s->data());
+ parser->startTranslationUnit(s->data());
+ parseFile(parser,root,rootNav,fd,s->data(),FALSE,filesInSameTu);
+ s=g_inputFiles.next();
+ }
}
}
@@ -8858,10 +9385,15 @@ int readDir(QFileInfo *fi,
StringDict *resultDict,
bool errorIfNotExist,
bool recursive,
- QDict<void> *killDict
+ QDict<void> *killDict,
+ QDict<void> *paths
)
{
QCString dirName = fi->absFilePath().utf8();
+ if (paths && paths->find(dirName)==0)
+ {
+ paths->insert(dirName,(void*)0x8);
+ }
if (fi->isSymLink())
{
dirName = resolveSymlink(dirName.data());
@@ -8890,7 +9422,7 @@ int readDir(QFileInfo *fi,
{
if (errorIfNotExist)
{
- err("warning: source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data());
+ warn_uncond("source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data());
}
}
else if (cfi->isFile() &&
@@ -8937,7 +9469,7 @@ int readDir(QFileInfo *fi,
cfi->setFile(cfi->absFilePath());
totalSize+=readDir(cfi,fnList,fnDict,exclDict,
patList,exclPatList,resultList,resultDict,errorIfNotExist,
- recursive,killDict);
+ recursive,killDict,paths);
}
}
++it;
@@ -8961,7 +9493,8 @@ int readFileOrDirectory(const char *s,
StringDict *resultDict,
bool recursive,
bool errorIfNotExist,
- QDict<void> *killDict
+ QDict<void> *killDict,
+ QDict<void> *paths
)
{
//printf("killDict=%p count=%d\n",killDict,killDict->count());
@@ -8981,15 +9514,21 @@ int readFileOrDirectory(const char *s,
{
if (errorIfNotExist)
{
- err("warning: source %s is not a readable file or directory... skipping.\n",s);
+ warn_uncond("source %s is not a readable file or directory... skipping.\n",s);
}
}
else if (!Config_getBool("EXCLUDE_SYMLINKS") || !fi.isSymLink())
{
if (fi.isFile())
{
+ QCString dirPath = fi.dirPath(TRUE).utf8();
+ QCString filePath = fi.absFilePath().utf8();
+ if (paths && paths->find(dirPath))
+ {
+ paths->insert(dirPath,(void*)0x8);
+ }
//printf("killDict->find(%s)\n",fi.absFilePath().data());
- if (killDict==0 || killDict->find(fi.absFilePath().utf8())==0)
+ if (killDict==0 || killDict->find(filePath)==0)
{
totalSize+=fi.size()+fi.absFilePath().length()+4; //readFile(&fi,fiList,input);
//fiList->inSort(new FileInfo(fi));
@@ -8997,7 +9536,7 @@ int readFileOrDirectory(const char *s,
//printf("New file %s\n",name.data());
if (fnDict)
{
- FileDef *fd=new FileDef(fi.dirPath(TRUE).utf8()+"/",name);
+ FileDef *fd=new FileDef(dirPath+"/",name);
FileName *fn=0;
if (!name.isEmpty() && (fn=(*fnDict)[name]))
{
@@ -9005,7 +9544,7 @@ int readFileOrDirectory(const char *s,
}
else
{
- fn = new FileName(fi.absFilePath().utf8(),name);
+ fn = new FileName(filePath,name);
fn->append(fd);
if (fnList) fnList->inSort(fn);
fnDict->insert(name,fn);
@@ -9014,9 +9553,9 @@ int readFileOrDirectory(const char *s,
QCString *rs=0;
if (resultList || resultDict)
{
- rs=new QCString(fi.absFilePath().utf8());
+ rs=new QCString(filePath);
if (resultList) resultList->append(rs);
- if (resultDict) resultDict->insert(fi.absFilePath().utf8(),rs);
+ if (resultDict) resultDict->insert(filePath,rs);
}
if (killDict) killDict->insert(fi.absFilePath().utf8(),(void *)0x8);
@@ -9026,7 +9565,7 @@ int readFileOrDirectory(const char *s,
{
totalSize+=readDir(&fi,fnList,fnDict,exclDict,patList,
exclPatList,resultList,resultDict,errorIfNotExist,
- recursive,killDict);
+ recursive,killDict,paths);
}
}
}
@@ -9050,7 +9589,7 @@ void readFormulaRepository()
int se=line.find(':'); // find name and text separator.
if (se==-1)
{
- err("warning: formula.repository is corrupted!\n");
+ warn_uncond("formula.repository is corrupted!\n");
break;
}
else
@@ -9223,7 +9762,7 @@ void dumpConfigAsXML()
static void usage(const char *name)
{
- msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2012\n\n",versionString);
+ msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2013\n\n",versionString);
msg("You can use doxygen in a number of ways:\n\n");
msg("1) Use doxygen to generate a template configuration file:\n");
msg(" %s [-s] -g [configName]\n\n",name);
@@ -9255,7 +9794,7 @@ static void usage(const char *name)
static const char *getArg(int argc,char **argv,int &optind)
{
char *s=0;
- if (strlen(&argv[optind][2])>0)
+ if (qstrlen(&argv[optind][2])>0)
s=&argv[optind][2];
else if (optind+1<argc && argv[optind+1][0]!='-')
s=argv[++optind];
@@ -9272,8 +9811,6 @@ void initDoxygen()
setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
setlocale(LC_NUMERIC,"C");
- //Doxygen::symbolMap->setAutoDelete(TRUE);
-
Doxygen::runningTime.start();
initPreprocessor();
@@ -9293,7 +9830,10 @@ void initDoxygen()
initNamespaceMemberIndices();
initFileMemberIndices();
- Doxygen::symbolMap = new QDict<DefinitionIntf>(1000);
+ Doxygen::symbolMap = new QDict<DefinitionIntf>(50177);
+#ifdef USE_LIBCLANG
+ Doxygen::clangUsrMap = new QDict<Definition>(50177);
+#endif
Doxygen::inputNameList = new FileNameList;
Doxygen::inputNameList->setAutoDelete(TRUE);
Doxygen::memberNameSDict = new MemberNameSDict(10000);
@@ -9302,7 +9842,7 @@ void initDoxygen()
Doxygen::functionNameSDict->setAutoDelete(TRUE);
Doxygen::groupSDict = new GroupSDict(17);
Doxygen::groupSDict->setAutoDelete(TRUE);
- Doxygen::globalScope = new NamespaceDef("<globalScope>",1,"<globalScope>");
+ Doxygen::globalScope = new NamespaceDef("<globalScope>",1,1,"<globalScope>");
Doxygen::namespaceSDict = new NamespaceSDict(20);
Doxygen::namespaceSDict->setAutoDelete(TRUE);
Doxygen::classSDict = new ClassSDict(1009);
@@ -9334,6 +9874,19 @@ void initDoxygen()
Doxygen::formulaNameDict = new FormulaDict(1009);
Doxygen::sectionDict = new SectionDict(257);
Doxygen::sectionDict->setAutoDelete(TRUE);
+
+ /**************************************************************************
+ * Initialize some global constants
+ **************************************************************************/
+
+ g_compoundKeywordDict.insert("template class",(void *)8);
+ g_compoundKeywordDict.insert("template struct",(void *)8);
+ g_compoundKeywordDict.insert("class",(void *)8);
+ g_compoundKeywordDict.insert("struct",(void *)8);
+ g_compoundKeywordDict.insert("union",(void *)8);
+ g_compoundKeywordDict.insert("interface",(void *)8);
+ g_compoundKeywordDict.insert("exception",(void *)8);
+
}
void cleanUpDoxygen()
@@ -9434,7 +9987,7 @@ void readConfiguration(int argc, char **argv)
case 'g':
genConfig=TRUE;
configName=getArg(argc,argv,optind);
- if (strcmp(argv[optind+1],"-")==0)
+ if (optind+1<argc && qstrcmp(argv[optind+1],"-")==0)
{ configName="-"; optind++; }
if (!configName)
{ configName="Doxyfile"; }
@@ -9459,15 +10012,15 @@ void readConfiguration(int argc, char **argv)
formatName=getArg(argc,argv,optind);
if (!formatName)
{
- err("error: option -e is missing format specifier rtf.\n");
+ err("option -e is missing format specifier rtf.\n");
cleanUpDoxygen();
exit(1);
}
- if (stricmp(formatName,"rtf")==0)
+ if (qstricmp(formatName,"rtf")==0)
{
if (optind+1>=argc)
{
- err("error: option \"-e rtf\" is missing an extensions file name\n");
+ err("option \"-e rtf\" is missing an extensions file name\n");
cleanUpDoxygen();
exit(1);
}
@@ -9479,7 +10032,7 @@ void readConfiguration(int argc, char **argv)
cleanUpDoxygen();
exit(1);
}
- err("error: option \"-e\" has invalid format specifier.\n");
+ err("option \"-e\" has invalid format specifier.\n");
cleanUpDoxygen();
exit(1);
break;
@@ -9487,15 +10040,15 @@ void readConfiguration(int argc, char **argv)
formatName=getArg(argc,argv,optind);
if (!formatName)
{
- err("error: option -w is missing format specifier rtf, html or latex\n");
+ err("option -w is missing format specifier rtf, html or latex\n");
cleanUpDoxygen();
exit(1);
}
- if (stricmp(formatName,"rtf")==0)
+ if (qstricmp(formatName,"rtf")==0)
{
if (optind+1>=argc)
{
- err("error: option \"-w rtf\" is missing a style sheet file name\n");
+ err("option \"-w rtf\" is missing a style sheet file name\n");
cleanUpDoxygen();
exit(1);
}
@@ -9507,7 +10060,7 @@ void readConfiguration(int argc, char **argv)
cleanUpDoxygen();
exit(1);
}
- else if (stricmp(formatName,"html")==0)
+ else if (qstricmp(formatName,"html")==0)
{
if (optind+4<argc || QFileInfo("Doxyfile").exists())
{
@@ -9532,7 +10085,7 @@ void readConfiguration(int argc, char **argv)
}
if (optind+3>=argc)
{
- err("error: option \"-w html\" does not have enough arguments\n");
+ err("option \"-w html\" does not have enough arguments\n");
cleanUpDoxygen();
exit(1);
}
@@ -9540,7 +10093,7 @@ void readConfiguration(int argc, char **argv)
QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
if (!setTranslator(outputLanguage))
{
- err("warning: Output language %s not supported! Using English instead.\n", outputLanguage.data());
+ warn_uncond("Output language %s not supported! Using English instead.\n", outputLanguage.data());
}
QFile f;
@@ -9561,7 +10114,7 @@ void readConfiguration(int argc, char **argv)
cleanUpDoxygen();
exit(0);
}
- else if (stricmp(formatName,"latex")==0)
+ else if (qstricmp(formatName,"latex")==0)
{
if (optind+4<argc) // use config file to get settings
{
@@ -9581,7 +10134,7 @@ void readConfiguration(int argc, char **argv)
}
if (optind+3>=argc)
{
- err("error: option \"-w latex\" does not have enough arguments\n");
+ err("option \"-w latex\" does not have enough arguments\n");
cleanUpDoxygen();
exit(1);
}
@@ -9589,7 +10142,7 @@ void readConfiguration(int argc, char **argv)
QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
if (!setTranslator(outputLanguage))
{
- err("warning: Output language %s not supported! Using English instead.\n", outputLanguage.data());
+ warn_uncond("Output language %s not supported! Using English instead.\n", outputLanguage.data());
}
QFile f;
@@ -9612,7 +10165,7 @@ void readConfiguration(int argc, char **argv)
}
else
{
- err("error: Illegal format specifier %s: should be one of rtf, html, latex, or bst\n",formatName);
+ err("Illegal format specifier %s: should be one of rtf, html, latex, or bst\n",formatName);
cleanUpDoxygen();
exit(1);
}
@@ -9624,11 +10177,11 @@ void readConfiguration(int argc, char **argv)
g_dumpConfigAsXML = TRUE;
break;
case '-':
- if (strcmp(&argv[optind][2],"help")==0)
+ if (qstrcmp(&argv[optind][2],"help")==0)
{
usage(argv[0]);
}
- else if (strcmp(&argv[optind][2],"version")==0)
+ else if (qstrcmp(&argv[optind][2],"version")==0)
{
msg("%s\n",versionString);
cleanUpDoxygen();
@@ -9699,13 +10252,13 @@ void readConfiguration(int argc, char **argv)
else
{
QFileInfo fi(argv[optind]);
- if (fi.exists() || strcmp(argv[optind],"-")==0)
+ if (fi.exists() || qstrcmp(argv[optind],"-")==0)
{
configName=argv[optind];
}
else
{
- err("error: configuration file %s not found!\n",argv[optind]);
+ err("configuration file %s not found!\n",argv[optind]);
usage(argv[0]);
}
}
@@ -9713,7 +10266,7 @@ void readConfiguration(int argc, char **argv)
if (!Config::instance()->parse(configName))
{
- err("error: could not open or read configuration file %s!\n",configName);
+ err("could not open or read configuration file %s!\n",configName);
cleanUpDoxygen();
exit(1);
}
@@ -9748,7 +10301,7 @@ void adjustConfiguration()
QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
if (!setTranslator(outputLanguage))
{
- err("warning: Output language %s not supported! Using English instead.\n",
+ warn_uncond("Output language %s not supported! Using English instead.\n",
outputLanguage.data());
}
QStrList &includePath = Config_getList("INCLUDE_PATH");
@@ -9901,7 +10454,7 @@ static QCString getQchFileName()
+ QCString(".qch");
}
-void searchInputFiles(StringList &inputFiles)
+void searchInputFiles()
{
QStrList &exclPatterns = Config_getList("EXCLUDE_PATTERNS");
bool alwaysRecursive = Config_getBool("RECURSIVE");
@@ -9909,7 +10462,7 @@ void searchInputFiles(StringList &inputFiles)
excludeNameDict.setAutoDelete(TRUE);
// gather names of all files in the include path
- msg("Searching for include files...\n");
+ g_s.begin("Searching for include files...\n");
QStrList &includePathList = Config_getList("INCLUDE_PATH");
char *s=includePathList.first();
while (s)
@@ -9924,8 +10477,9 @@ void searchInputFiles(StringList &inputFiles)
alwaysRecursive);
s=includePathList.next();
}
-
- msg("Searching for example files...\n");
+ g_s.end();
+
+ g_s.begin("Searching for example files...\n");
QStrList &examplePathList = Config_getList("EXAMPLE_PATH");
s=examplePathList.first();
while (s)
@@ -9936,8 +10490,9 @@ void searchInputFiles(StringList &inputFiles)
(alwaysRecursive || Config_getBool("EXAMPLE_RECURSIVE")));
s=examplePathList.next();
}
+ g_s.end();
- msg("Searching for images...\n");
+ g_s.begin("Searching for images...\n");
QStrList &imagePathList=Config_getList("IMAGE_PATH");
s=imagePathList.first();
while (s)
@@ -9947,8 +10502,9 @@ void searchInputFiles(StringList &inputFiles)
alwaysRecursive);
s=imagePathList.next();
}
+ g_s.end();
- msg("Searching for dot files...\n");
+ g_s.begin("Searching for dot files...\n");
QStrList &dotFileList=Config_getList("DOTFILE_DIRS");
s=dotFileList.first();
while (s)
@@ -9958,8 +10514,9 @@ void searchInputFiles(StringList &inputFiles)
alwaysRecursive);
s=dotFileList.next();
}
+ g_s.end();
- msg("Searching for msc files...\n");
+ g_s.begin("Searching for msc files...\n");
QStrList &mscFileList=Config_getList("MSCFILE_DIRS");
s=mscFileList.first();
while (s)
@@ -9969,9 +10526,9 @@ void searchInputFiles(StringList &inputFiles)
alwaysRecursive);
s=mscFileList.next();
}
+ g_s.end();
-
- msg("Searching for files to exclude\n");
+ g_s.begin("Searching for files to exclude\n");
QStrList &excludeList = Config_getList("EXCLUDE");
s=excludeList.first();
while (s)
@@ -9982,38 +10539,44 @@ void searchInputFiles(StringList &inputFiles)
FALSE);
s=excludeList.next();
}
+ g_s.end();
/**************************************************************************
* Determine Input Files *
**************************************************************************/
- msg("Searching for files to process...\n");
+ g_s.begin("Searching for files to process...\n");
QDict<void> *killDict = new QDict<void>(10007);
int inputSize=0;
QStrList &inputList=Config_getList("INPUT");
- inputFiles.setAutoDelete(TRUE);
+ g_inputFiles.setAutoDelete(TRUE);
s=inputList.first();
while (s)
{
QCString path=s;
uint l = path.length();
- // strip trailing slashes
- if (path.at(l-1)=='\\' || path.at(l-1)=='/') path=path.left(l-1);
-
- inputSize+=readFileOrDirectory(
- path,
- Doxygen::inputNameList,
- Doxygen::inputNameDict,
- &excludeNameDict,
- &Config_getList("FILE_PATTERNS"),
- &exclPatterns,
- &inputFiles,0,
- alwaysRecursive,
- TRUE,
- killDict);
+ if (l>0)
+ {
+ // strip trailing slashes
+ if (path.at(l-1)=='\\' || path.at(l-1)=='/') path=path.left(l-1);
+
+ inputSize+=readFileOrDirectory(
+ path,
+ Doxygen::inputNameList,
+ Doxygen::inputNameDict,
+ &excludeNameDict,
+ &Config_getList("FILE_PATTERNS"),
+ &exclPatterns,
+ &g_inputFiles,0,
+ alwaysRecursive,
+ TRUE,
+ killDict,
+ &Doxygen::inputPaths);
+ }
s=inputList.next();
}
delete killDict;
+ g_s.end();
}
@@ -10038,14 +10601,14 @@ void parseInput()
dir.setPath(QDir::currentDirPath());
if (!dir.mkdir(outputDirectory))
{
- err("error: tag OUTPUT_DIRECTORY: Output directory `%s' does not "
+ err("tag OUTPUT_DIRECTORY: Output directory `%s' does not "
"exist and cannot be created\n",outputDirectory.data());
cleanUpDoxygen();
exit(1);
}
- else if (!Config_getBool("QUIET"))
+ else
{
- err("Notice: Output directory `%s' does not exist. "
+ msg("Notice: Output directory `%s' does not exist. "
"I have created it for you.\n", outputDirectory.data());
}
dir.cd(outputDirectory);
@@ -10057,16 +10620,10 @@ void parseInput()
* Initialize global lists and dictionaries
**************************************************************************/
- int cacheSize = Config_getInt("SYMBOL_CACHE_SIZE");
- if (cacheSize<0) cacheSize=0;
- if (cacheSize>9) cacheSize=9;
- Doxygen::symbolCache = new ObjCache(16+cacheSize); // 16 -> room for 65536 elements,
- // ~2.0 MByte "overhead"
- //Doxygen::symbolCache = new ObjCache(1); // only to stress test cache behaviour
Doxygen::symbolStorage = new Store;
// also scale lookup cache with SYMBOL_CACHE_SIZE
- cacheSize = Config_getInt("LOOKUP_CACHE_SIZE");
+ int cacheSize = Config_getInt("LOOKUP_CACHE_SIZE");
if (cacheSize<0) cacheSize=0;
if (cacheSize>9) cacheSize=9;
uint lookupSize = 65536 << cacheSize;
@@ -10090,18 +10647,6 @@ void parseInput()
}
- /**************************************************************************
- * Initialize some global constants
- **************************************************************************/
-
- g_compoundKeywordDict.insert("template class",(void *)8);
- g_compoundKeywordDict.insert("template struct",(void *)8);
- g_compoundKeywordDict.insert("class",(void *)8);
- g_compoundKeywordDict.insert("struct",(void *)8);
- g_compoundKeywordDict.insert("union",(void *)8);
- g_compoundKeywordDict.insert("interface",(void *)8);
- g_compoundKeywordDict.insert("exception",(void *)8);
-
/**************************************************************************
* Check/create output directorties *
@@ -10112,6 +10657,11 @@ void parseInput()
if (generateHtml)
htmlOutput = createOutputDirectory(outputDirectory,"HTML_OUTPUT","/html");
+ QCString docbookOutput;
+ bool &generateDocbook = Config_getBool("GENERATE_DOCBOOK");
+ if (generateDocbook)
+ docbookOutput = createOutputDirectory(outputDirectory,"DOCBOOK_OUTPUT","/docbook");
+
QCString xmlOutput;
bool &generateXml = Config_getBool("GENERATE_XML");
if (generateXml)
@@ -10132,6 +10682,10 @@ void parseInput()
if (generateMan)
manOutput = createOutputDirectory(outputDirectory,"MAN_OUTPUT","/man");
+ //QCString sqlOutput;
+ //bool &generateSql = Config_getBool("GENERATE_SQLITE3");
+ //if (generateSql)
+ // sqlOutput = createOutputDirectory(outputDirectory,"SQLITE3_OUTPUT","/sqlite3");
if (Config_getBool("HAVE_DOT"))
{
@@ -10178,7 +10732,7 @@ void parseInput()
}
else if (!defaultLayoutUsed)
{
- err("warning: failed to open layout file '%s' for reading!\n",layoutFileName.data());
+ warn_uncond("failed to open layout file '%s' for reading!\n",layoutFileName.data());
}
/**************************************************************************
@@ -10187,14 +10741,14 @@ void parseInput()
// prevent search in the output directories
QStrList &exclPatterns = Config_getList("EXCLUDE_PATTERNS");
- if (generateHtml) exclPatterns.append(htmlOutput);
- if (generateXml) exclPatterns.append(xmlOutput);
- if (generateLatex) exclPatterns.append(latexOutput);
- if (generateRtf) exclPatterns.append(rtfOutput);
- if (generateMan) exclPatterns.append(manOutput);
+ if (generateHtml) exclPatterns.append(htmlOutput);
+ if (generateDocbook) exclPatterns.append(docbookOutput);
+ if (generateXml) exclPatterns.append(xmlOutput);
+ if (generateLatex) exclPatterns.append(latexOutput);
+ if (generateRtf) exclPatterns.append(rtfOutput);
+ if (generateMan) exclPatterns.append(manOutput);
-
- searchInputFiles(g_inputFiles);
+ searchInputFiles();
// Notice: the order of the function calls below is very important!
@@ -10238,8 +10792,10 @@ void parseInput()
addSTLClasses(rootNav);
}
+ g_s.begin("Parsing files\n");
parseFiles(root,rootNav);
g_storage->close();
+ g_s.end();
// we are done with input scanning now, so free up the buffers used by flex
// (can be around 4MB)
@@ -10257,34 +10813,41 @@ void parseInput()
/**************************************************************************
* Gather information *
**************************************************************************/
-
- msg("Building group list...\n");
+
+ g_s.begin("Building group list...\n");
buildGroupList(rootNav);
organizeSubGroups(rootNav);
+ g_s.end();
- msg("Building directory list...\n");
+ g_s.begin("Building directory list...\n");
buildDirectories();
findDirDocumentation(rootNav);
+ g_s.end();
- msg("Building namespace list...\n");
+ g_s.begin("Building namespace list...\n");
buildNamespaceList(rootNav);
findUsingDirectives(rootNav);
+ g_s.end();
- msg("Building file list...\n");
+ g_s.begin("Building file list...\n");
buildFileList(rootNav);
+ g_s.end();
//generateFileTree();
-
- msg("Building class list...\n");
+
+ g_s.begin("Building class list...\n");
buildClassList(rootNav);
+ g_s.end();
- msg("Associating documentation with classes...\n");
+ g_s.begin("Associating documentation with classes...\n");
buildClassDocList(rootNav);
// build list of using declarations here (global list)
buildListOfUsingDecls(rootNav);
-
- msg("Computing nesting relations for classes...\n");
+ g_s.end();
+
+ g_s.begin("Computing nesting relations for classes...\n");
resolveClassNestingRelations();
+ g_s.end();
// 1.8.2-20121111: no longer add nested classes to the group as well
//distributeClassGroupRelations();
@@ -10295,97 +10858,124 @@ void parseInput()
// we don't need the list of using declaration anymore
g_usingDeclarations.clear();
- msg("Building example list...\n");
+ g_s.begin("Building example list...\n");
buildExampleList(rootNav);
-
- msg("Searching for enumerations...\n");
+ g_s.end();
+
+ g_s.begin("Searching for enumerations...\n");
findEnums(rootNav);
-
+ g_s.end();
+
// Since buildVarList calls isVarWithConstructor
// and this calls getResolvedClass we need to process
// typedefs first so the relations between classes via typedefs
// are properly resolved. See bug 536385 for an example.
- msg("Searching for documented typedefs...\n");
+ g_s.begin("Searching for documented typedefs...\n");
buildTypedefList(rootNav);
+ g_s.end();
- msg("Searching for members imported via using declarations...\n");
+ g_s.begin("Searching for members imported via using declarations...\n");
findUsingDeclImports(rootNav);
// this should be after buildTypedefList in order to properly import
// used typedefs
findUsingDeclarations(rootNav);
+ g_s.end();
- msg("Searching for included using directives...\n");
+ g_s.begin("Searching for included using directives...\n");
findIncludedUsingDirectives();
+ g_s.end();
- msg("Searching for documented variables...\n");
+ g_s.begin("Searching for documented variables...\n");
buildVarList(rootNav);
+ g_s.end();
- msg("Building member list...\n"); // using class info only !
+ g_s.begin("Building interface member list...\n");
+ buildInterfaceAndServiceList(rootNav); // UNO IDL
+
+ g_s.begin("Building member list...\n"); // using class info only !
buildFunctionList(rootNav);
+ g_s.end();
- msg("Searching for friends...\n");
+ g_s.begin("Searching for friends...\n");
findFriends();
-
- msg("Searching for documented defines...\n");
- findDefineDocumentation(rootNav);
-
- findClassEntries(rootNav);
- msg("Computing class inheritance relations...\n");
- findInheritedTemplateInstances();
- msg("Computing class usage relations...\n");
- findUsedTemplateInstances();
+ g_s.end();
+
+ g_s.begin("Searching for documented defines...\n");
+ findDefineDocumentation(rootNav);
+ g_s.end();
+
+ g_s.begin("Computing class inheritance relations...\n");
+ findClassEntries(rootNav);
+ findInheritedTemplateInstances();
+ g_s.end();
+
+ g_s.begin("Computing class usage relations...\n");
+ findUsedTemplateInstances();
+ g_s.end();
+
if (Config_getBool("INLINE_SIMPLE_STRUCTS"))
{
- msg("Searching for tag less structs...\n");
+ g_s.begin("Searching for tag less structs...\n");
findTagLessClasses();
+ g_s.end();
}
- msg("Flushing cached template relations that have become invalid...\n");
+ g_s.begin("Flushing cached template relations that have become invalid...\n");
flushCachedTemplateRelations();
-
- msg("Creating members for template instances...\n");
+ g_s.end();
+
+ g_s.begin("Creating members for template instances...\n");
createTemplateInstanceMembers();
+ g_s.end();
- msg("Computing class relations...\n");
- computeTemplateClassRelations();
+ g_s.begin("Computing class relations...\n");
+ computeTemplateClassRelations();
flushUnresolvedRelations();
if (Config_getBool("OPTIMIZE_OUTPUT_VHDL"))
{
VhdlDocGen::computeVhdlComponentRelations();
}
- computeClassRelations();
- g_classEntries.clear();
+ computeClassRelations();
+ g_classEntries.clear();
+ g_s.end();
- msg("Add enum values to enums...\n");
+ g_s.begin("Add enum values to enums...\n");
addEnumValuesToEnums(rootNav);
findEnumDocumentation(rootNav);
+ g_s.end();
- msg("Searching for member function documentation...\n");
+ g_s.begin("Searching for member function documentation...\n");
findObjCMethodDefinitions(rootNav);
findMemberDocumentation(rootNav); // may introduce new members !
transferRelatedFunctionDocumentation();
transferFunctionDocumentation();
-
- msg("Building page list...\n");
+ g_s.end();
+
+ g_s.begin("Building page list...\n");
buildPageList(rootNav);
+ g_s.end();
- msg("Search for main page...\n");
+ g_s.begin("Search for main page...\n");
findMainPage(rootNav);
+ g_s.end();
- msg("Computing page relations...\n");
+ g_s.begin("Computing page relations...\n");
computePageRelations(rootNav);
checkPageRelations();
+ g_s.end();
- msg("Determining the scope of groups...\n");
+ g_s.begin("Determining the scope of groups...\n");
findGroupScope(rootNav);
+ g_s.end();
- msg("Sorting lists...\n");
+ g_s.begin("Sorting lists...\n");
Doxygen::memberNameSDict->sort();
Doxygen::functionNameSDict->sort();
Doxygen::hiddenClasses->sort();
Doxygen::classSDict->sort();
-
+ g_s.end();
+
msg("Freeing entry tree\n");
delete rootNav;
g_storage->close();
@@ -10394,78 +10984,98 @@ void parseInput()
QDir thisDir;
thisDir.remove(Doxygen::entryDBFileName);
-
- msg("Determining which enums are documented\n");
+
+ g_s.begin("Determining which enums are documented\n");
findDocumentedEnumValues();
+ g_s.end();
- msg("Computing member relations...\n");
+ g_s.begin("Computing member relations...\n");
mergeCategories();
computeMemberRelations();
+ g_s.end();
- msg("Building full member lists recursively...\n");
+ g_s.begin("Building full member lists recursively...\n");
buildCompleteMemberLists();
-
- msg("Adding members to member groups.\n");
+ g_s.end();
+
+ g_s.begin("Adding members to member groups.\n");
addMembersToMemberGroup();
+ g_s.end();
if (Config_getBool("DISTRIBUTE_GROUP_DOC"))
{
- msg("Distributing member group documentation.\n");
+ g_s.begin("Distributing member group documentation.\n");
distributeMemberGroupDocumentation();
+ g_s.end();
}
-
- msg("Computing member references...\n");
- computeMemberReferences();
+
+ g_s.begin("Computing member references...\n");
+ computeMemberReferences();
+ g_s.end();
if (Config_getBool("INHERIT_DOCS"))
{
- msg("Inheriting documentation...\n");
+ g_s.begin("Inheriting documentation...\n");
inheritDocumentation();
+ g_s.end();
}
// compute the shortest possible names of all files
// without losing the uniqueness of the file names.
- msg("Generating disk names...\n");
+ g_s.begin("Generating disk names...\n");
Doxygen::inputNameList->generateDiskNames();
-
- msg("Adding source references...\n");
+ g_s.end();
+
+ g_s.begin("Adding source references...\n");
addSourceReferences();
+ g_s.end();
- msg("Adding xrefitems...\n");
+ g_s.begin("Adding xrefitems...\n");
addListReferences();
generateXRefPages();
+ g_s.end();
- msg("Sorting member lists...\n");
+ g_s.begin("Sorting member lists...\n");
sortMemberLists();
+ g_s.end();
if (Config_getBool("DIRECTORY_GRAPH"))
{
- msg("Computing dependencies between directories...\n");
+ g_s.begin("Computing dependencies between directories...\n");
computeDirDependencies();
+ g_s.end();
}
- //msg("Resolving citations...\n");
+ //g_s.begin("Resolving citations...\n");
//Doxygen::citeDict->resolve();
- msg("Generating citations page...\n");
+ g_s.begin("Generating citations page...\n");
Doxygen::citeDict->generatePage();
+ g_s.end();
- msg("Counting data structures...\n");
+ g_s.begin("Counting data structures...\n");
countDataStructures();
-
- msg("Resolving user defined references...\n");
+ g_s.end();
+
+ g_s.begin("Resolving user defined references...\n");
resolveUserReferences();
+ g_s.end();
- msg("Finding anchors and sections in the documentation...\n");
+ g_s.begin("Finding anchors and sections in the documentation...\n");
findSectionsInDocumentation();
+ g_s.end();
+ g_s.begin("Transferring function references...\n");
transferFunctionReferences();
+ g_s.end();
- msg("Combining using relations...\n");
+ g_s.begin("Combining using relations...\n");
combineUsingRelations();
+ g_s.end();
- msg("Adding members to index pages...\n");
+ g_s.begin("Adding members to index pages...\n");
addMembersToIndex();
+ g_s.end();
if (Config_getBool("OPTIMIZE_OUTPUT_VHDL") &&
Config_getBool("HAVE_DOT") &&
@@ -10519,13 +11129,16 @@ void generateOutput()
// copy static stuff
copyStyleSheet();
copyLogo();
- copyExtraFiles();
+ copyExtraFiles("HTML_EXTRA_FILES","HTML_OUTPUT");
FTVHelp::generateTreeViewImages();
}
if (generateLatex)
{
g_outputList->add(new LatexGenerator);
LatexGenerator::init();
+
+ // copy static stuff
+ copyExtraFiles("LATEX_EXTRA_FILES","LATEX_OUTPUT");
}
if (generateMan)
{
@@ -10537,15 +11150,14 @@ void generateOutput()
g_outputList->add(new RTFGenerator);
RTFGenerator::init();
}
-
if (Config_getBool("USE_HTAGS"))
{
Htags::useHtags = TRUE;
QCString htmldir = Config_getString("HTML_OUTPUT");
if (!Htags::execute(htmldir))
- err("error: USE_HTAGS is YES but htags(1) failed. \n");
+ err("USE_HTAGS is YES but htags(1) failed. \n");
if (!Htags::loadFilemap(htmldir))
- err("error: htags(1) ended normally but failed to load the filemap. \n");
+ err("htags(1) ended normally but failed to load the filemap. \n");
}
/**************************************************************************
@@ -10559,7 +11171,7 @@ void generateOutput()
tag=new QFile(generateTagFile);
if (!tag->open(IO_WriteOnly))
{
- err("error: cannot open tag file %s for writing\n",
+ err("cannot open tag file %s for writing\n",
generateTagFile.data()
);
cleanUpDoxygen();
@@ -10574,22 +11186,11 @@ void generateOutput()
if (generateLatex) writeDoxFont(Config_getString("LATEX_OUTPUT"));
if (generateRtf) writeDoxFont(Config_getString("RTF_OUTPUT"));
- msg("Generating style sheet...\n");
+ g_s.begin("Generating style sheet...\n");
//printf("writing style info\n");
- QCString genString =
- theTranslator->trGeneratedAt(dateToString(TRUE),Config_getString("PROJECT_NAME"));
g_outputList->writeStyleInfo(0); // write first part
- g_outputList->disableAllBut(OutputGenerator::Latex);
- g_outputList->parseText(genString);
- g_outputList->writeStyleInfo(1); // write second part
- //parseText(*g_outputList,theTranslator->trWrittenBy());
- g_outputList->writeStyleInfo(2); // write third part
- g_outputList->parseText(genString);
- g_outputList->writeStyleInfo(3); // write fourth part
- //parseText(*g_outputList,theTranslator->trWrittenBy());
- g_outputList->writeStyleInfo(4); // write last part
- g_outputList->enableAll();
-
+ g_s.end();
+
static bool searchEngine = Config_getBool("SEARCHENGINE");
static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
@@ -10598,12 +11199,12 @@ void generateOutput()
// what categories we find in this function.
if (generateHtml && searchEngine)
{
- msg("Generating search indices...\n");
+ g_s.begin("Generating search indices...\n");
QCString searchDirName = Config_getString("HTML_OUTPUT")+"/search";
QDir searchDir(searchDirName);
if (!searchDir.exists() && !searchDir.mkdir(searchDirName))
{
- err("error: Could not create search results directory '%s' $PWD='%s'\n",
+ err("Could not create search results directory '%s' $PWD='%s'\n",
searchDirName.data(),QDir::currentDirPath().data());
exit(1);
}
@@ -10612,46 +11213,57 @@ void generateOutput()
{
writeJavascriptSearchIndex();
}
+ g_s.end();
}
- msg("Generating example documentation...\n");
+ g_s.begin("Generating example documentation...\n");
generateExampleDocs();
+ g_s.end();
- msg("Generating file sources...\n");
if (!Htags::useHtags)
{
+ g_s.begin("Generating file sources...\n");
generateFileSources();
+ g_s.end();
}
- msg("Generating file documentation...\n");
+ g_s.begin("Generating file documentation...\n");
generateFileDocs();
-
- msg("Generating page documentation...\n");
+ g_s.end();
+
+ g_s.begin("Generating page documentation...\n");
generatePageDocs();
-
- msg("Generating group documentation...\n");
+ g_s.end();
+
+ g_s.begin("Generating group documentation...\n");
generateGroupDocs();
+ g_s.end();
- msg("Generating class documentation...\n");
+ g_s.begin("Generating class documentation...\n");
generateClassDocs();
-
- msg("Generating namespace index...\n");
+ g_s.end();
+
+ g_s.begin("Generating namespace index...\n");
generateNamespaceDocs();
-
+ g_s.end();
+
if (Config_getBool("GENERATE_LEGEND"))
{
- msg("Generating graph info page...\n");
+ g_s.begin("Generating graph info page...\n");
writeGraphInfo(*g_outputList);
+ g_s.end();
}
- msg("Generating directory documentation...\n");
+ g_s.begin("Generating directory documentation...\n");
generateDirDocs(*g_outputList);
+ g_s.end();
if (Doxygen::formulaList->count()>0 && generateHtml
&& !Config_getBool("USE_MATHJAX"))
{
- msg("Generating bitmaps for formulas in HTML...\n");
+ g_s.begin("Generating bitmaps for formulas in HTML...\n");
Doxygen::formulaList->generateBitmaps(Config_getString("HTML_OUTPUT"));
+ g_s.end();
}
writeMainPageTagFileData();
@@ -10661,8 +11273,9 @@ void generateOutput()
writeIndexHierarchy(*g_outputList);
}
- msg("finalizing index lists...\n");
+ g_s.begin("finalizing index lists...\n");
Doxygen::indexList->finalize();
+ g_s.end();
if (!generateTagFile.isEmpty())
{
@@ -10682,24 +11295,41 @@ void generateOutput()
if (Config_getBool("GENERATE_XML"))
{
- msg("Generating XML output...\n");
+ g_s.begin("Generating XML output...\n");
Doxygen::generatingXmlOutput=TRUE;
generateXML();
Doxygen::generatingXmlOutput=FALSE;
+ g_s.end();
+ }
+ if (USE_SQLITE3)
+ {
+ g_s.begin("Generating SQLITE3 output...\n");
+ generateSqlite3();
+ g_s.end();
+ }
+
+ if (Config_getBool("GENERATE_DOCBOOK"))
+ {
+ g_s.begin("Generating Docbook output...\n");
+ generateDocbook();
+ g_s.end();
}
+
if (Config_getBool("GENERATE_AUTOGEN_DEF"))
{
- msg("Generating AutoGen DEF output...\n");
+ g_s.begin("Generating AutoGen DEF output...\n");
generateDEF();
+ g_s.end();
}
if (Config_getBool("GENERATE_PERLMOD"))
{
- msg("Generating Perl module output...\n");
+ g_s.begin("Generating Perl module output...\n");
generatePerlMod();
+ g_s.end();
}
if (generateHtml && searchEngine && serverBasedSearch)
{
- msg("Generating search index\n");
+ g_s.begin("Generating search index\n");
if (Doxygen::searchIndex->kind()==SearchIndexIntf::Internal) // write own search index
{
HtmlGenerator::writeSearchPage();
@@ -10719,42 +11349,47 @@ void generateOutput()
}
Doxygen::searchIndex->write(searchDataFile);
}
+ g_s.end();
}
if (generateRtf)
{
- msg("Combining RTF output...\n");
+ g_s.begin("Combining RTF output...\n");
if (!RTFGenerator::preProcessFileInplace(Config_getString("RTF_OUTPUT"),"refman.rtf"))
{
err("An error occurred during post-processing the RTF files!\n");
}
+ g_s.end();
}
if (Config_getBool("HAVE_DOT"))
{
+ g_s.begin("Running dot...\n");
DotManager::instance()->run();
+ g_s.end();
}
if (generateHtml &&
Config_getBool("GENERATE_HTMLHELP") &&
!Config_getString("HHC_LOCATION").isEmpty())
{
- msg("Running html help compiler...\n");
+ g_s.begin("Running html help compiler...\n");
QString oldDir = QDir::currentDirPath();
QDir::setCurrent(Config_getString("HTML_OUTPUT"));
portable_sysTimerStart();
if (portable_system(Config_getString("HHC_LOCATION"), "index.hhp", FALSE))
{
- err("error: failed to run html help compiler on index.hhp\n");
+ err("failed to run html help compiler on index.hhp\n");
}
portable_sysTimerStop();
QDir::setCurrent(oldDir);
+ g_s.end();
}
if ( generateHtml &&
Config_getBool("GENERATE_QHP") &&
!Config_getString("QHG_LOCATION").isEmpty())
{
- msg("Running qhelpgenerator...\n");
+ g_s.begin("Running qhelpgenerator...\n");
QCString const qhpFileName = Qhp::getQhpFileName();
QCString const qchFileName = getQchFileName();
@@ -10764,26 +11399,14 @@ void generateOutput()
portable_sysTimerStart();
if (portable_system(Config_getString("QHG_LOCATION"), args.data(), FALSE))
{
- err("error: failed to run qhelpgenerator on index.qhp\n");
+ err("failed to run qhelpgenerator on index.qhp\n");
}
portable_sysTimerStop();
QDir::setCurrent(oldDir);
+ g_s.end();
}
int cacheParam;
- if (Doxygen::symbolCache)
- {
- msg("symbol cache used %d/%d hits=%d misses=%d\n",
- Doxygen::symbolCache->count(),
- Doxygen::symbolCache->size(),
- Doxygen::symbolCache->hits(),
- Doxygen::symbolCache->misses());
- cacheParam = computeIdealCacheParam(Doxygen::symbolCache->misses());
- if (cacheParam>Config_getInt("SYMBOL_CACHE_SIZE"))
- {
- msg("Note: based on cache misses the ideal setting for SYMBOL_CACHE_SIZE is %d at the cost of higher memory usage.\n",cacheParam);
- }
- }
msg("lookup cache used %d/%d hits=%d misses=%d\n",
Doxygen::lookupCache->count(),
Doxygen::lookupCache->size(),
@@ -10801,6 +11424,7 @@ void generateOutput()
((double)Doxygen::runningTime.elapsed())/1000.0,
portable_getSysElapsedTime()
);
+ g_s.print();
}
else
{
@@ -10819,8 +11443,8 @@ void generateOutput()
thisDir.remove(Doxygen::objDBFileName);
Config::deleteInstance();
QTextCodec::deleteAllCodecs();
- delete Doxygen::symbolCache;
delete Doxygen::symbolMap;
+ delete Doxygen::clangUsrMap;
delete Doxygen::symbolStorage;
g_successfulRun=TRUE;
}
diff --git a/src/doxygen.css b/src/doxygen.css
index 544cc71..c314142 100644
--- a/src/doxygen.css
+++ b/src/doxygen.css
@@ -1,7 +1,7 @@
/* The standard CSS for doxygen $doxygenversion */
body, table, div, p, dl {
- font: 400 14px/19px Roboto,sans-serif;
+ font: 400 14px/22px Roboto,sans-serif;
}
/* @group Heading Levels */
@@ -11,6 +11,7 @@ h1.groupheader {
}
.title {
+ font: 400 14px/28px Roboto,sans-serif;
font-size: 150%;
font-weight: bold;
margin: 10px 2px;
@@ -168,8 +169,8 @@ pre.fragment {
}
div.fragment {
- padding: 4px;
- margin: 4px;
+ padding: 0px;
+ margin: 0px;
background-color: ##FC;
border: 1px solid ##CC;
}
@@ -687,6 +688,7 @@ div.directory {
.directory td.entry {
white-space: nowrap;
padding-right: 6px;
+ padding-top: 3px;
}
.directory td.entry a {
@@ -787,7 +789,7 @@ table.fieldtable {
}
.fieldtable td.fieldname {
- padding-top: 5px;
+ padding-top: 3px;
}
.fieldtable td.fielddoc {
@@ -796,7 +798,7 @@ table.fieldtable {
}
.fieldtable td.fielddoc p:first-child {
- margin-top: 2px;
+ margin-top: 0px;
}
.fieldtable td.fielddoc p:last-child {
diff --git a/src/doxygen.h b/src/doxygen.h
index 9ead4c1..4edf395 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -103,6 +103,7 @@ class Doxygen
static bool insideMainPage;
static FileNameDict *includeNameDict;
static FileNameDict *exampleNameDict;
+ static QDict<void> inputPaths;
static FileNameDict *inputNameDict;
static FileNameList *inputNameList;
static FileNameDict *imageNameDict;
@@ -130,6 +131,7 @@ class Doxygen
static QTime runningTime;
static SearchIndexIntf *searchIndex;
static QDict<DefinitionIntf> *symbolMap;
+ static QDict<Definition> *clangUsrMap;
static bool outputToWizard;
static QDict<int> *htmlDirMap;
static QCache<LookupInfo> *lookupCache;
@@ -137,7 +139,6 @@ class Doxygen
static SDict<DirRelation> dirRelations;
static ParserManager *parserManager;
static bool suppressDocWarnings;
- static ObjCache *symbolCache;
static Store *symbolStorage;
static QCString objDBFileName;
static QCString entryDBFileName;
@@ -161,6 +162,7 @@ void parseInput();
void generateOutput();
void readAliases();
void readFormulaRepository();
+void cleanUpDoxygen();
int readFileOrDirectory(const char *s,
FileNameList *fnList,
FileNameDict *fnDict,
@@ -171,7 +173,8 @@ int readFileOrDirectory(const char *s,
StringDict *resultDict,
bool recursive,
bool errorIfNotExist=TRUE,
- QDict<void> *killDict = 0
+ QDict<void> *killDict = 0,
+ QDict<void> *paths = 0
);
int readDir(QFileInfo *fi,
FileNameList *fnList,
diff --git a/src/doxygen.md b/src/doxygen.md
index 736c6c6..7941149 100644
--- a/src/doxygen.md
+++ b/src/doxygen.md
@@ -6,7 +6,7 @@ Introduction
This page provides a high-level overview of the internals of doxygen, with
links to the relevant parts of the code. This document is intended for
-developers who want to work on doxygen. Users of doxygen are refered to the
+developers who want to work on doxygen. Users of doxygen are referred to the
[User Manual](http://www.doxygen.org/manual.html).
The generic starting point of the application is of cource the main() function.
@@ -92,7 +92,7 @@ For doxygen specific concepts the following subclasses are available
- GroupDef: for storing grouping related data
- PageDef: for storing page related data
-Finally the data for members of classes, namespaces, and files is stored is
+Finally the data for members of classes, namespaces, and files is stored in
the subclass MemberDef.
Producing output
diff --git a/src/doxygen.pro.in b/src/doxygen.pro.in
index 42ffaa0..15af1f5 100644
--- a/src/doxygen.pro.in
+++ b/src/doxygen.pro.in
@@ -1,7 +1,7 @@
#
#
#
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
@@ -18,15 +18,15 @@ TEMPLATE = app.t
CONFIG = console warn_on $extraopts
HEADERS = doxygen.h
SOURCES = main.cpp
-unix:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread
+unix:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread %%SQLITE3_LIBS%% %%LIBCLANG_LIBS%%
win32:INCLUDEPATH += .
-win32-mingw:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread
+win32-mingw:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread %%SQLITE3_LIBS%% %%LIBCLANG_LIBS%%
win32-msvc:LIBS += qtools.lib md5.lib doxygen.lib doxycfg.lib shell32.lib iconv.lib
win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\lib
win32-borland:LIBS += qtools.lib md5.lib doxygen.lib doxycfg.lib shell32.lib iconv.lib
win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk
win32:TMAKE_CXXFLAGS += -DQT_NODLL
-win32-g++:LIBS = -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -liconv -lpthread
+win32-g++:LIBS = -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -liconv -lpthread %%SQLITE3_LIBS%% %%LIBCLANG_LIBS%% -Wl,--as-needed -lole32
win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
INCLUDEPATH += ../qtools ../libmd5 .
DESTDIR = ../bin
diff --git a/src/doxygen.sty b/src/doxygen.sty
new file mode 100644
index 0000000..199abf8
--- /dev/null
+++ b/src/doxygen.sty
@@ -0,0 +1,464 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{doxygen}
+
+% Packages used by this style file
+\RequirePackage{alltt}
+\RequirePackage{array}
+\RequirePackage{calc}
+\RequirePackage{float}
+\RequirePackage{ifthen}
+\RequirePackage{verbatim}
+\RequirePackage[table]{xcolor}
+\RequirePackage{xtab}
+
+%---------- Internal commands used in this style file ----------------
+
+\newcommand{\ensurespace}[1]{%
+ \begingroup%
+ \setlength{\dimen@}{#1}%
+ \vskip\z@\@plus\dimen@%
+ \penalty -100\vskip\z@\@plus -\dimen@%
+ \vskip\dimen@%
+ \penalty 9999%
+ \vskip -\dimen@%
+ \vskip\z@skip% hide the previous |\vskip| from |\addvspace|
+ \endgroup%
+}
+
+\newcommand{\DoxyLabelFont}{}
+\newcommand{\entrylabel}[1]{%
+ {%
+ \parbox[b]{\labelwidth-4pt}{%
+ \makebox[0pt][l]{\DoxyLabelFont#1}%
+ \vspace{1.5\baselineskip}%
+ }%
+ }%
+}
+
+\newenvironment{DoxyDesc}[1]{%
+ \ensurespace{4\baselineskip}%
+ \begin{list}{}{%
+ \settowidth{\labelwidth}{20pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\leftmargin}{\labelwidth+\labelsep}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }%
+ \item[#1]%
+}{%
+ \end{list}%
+}
+
+\newsavebox{\xrefbox}
+\newlength{\xreflength}
+\newcommand{\xreflabel}[1]{%
+ \sbox{\xrefbox}{#1}%
+ \setlength{\xreflength}{\wd\xrefbox}%
+ \ifthenelse{\xreflength>\labelwidth}{%
+ \begin{minipage}{\textwidth}%
+ \setlength{\parindent}{0pt}%
+ \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}%
+ \end{minipage}%
+ }{%
+ \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}%
+ }%
+}
+
+%---------- Commands used by doxygen LaTeX output generator ----------
+
+% Used by <pre> ... </pre>
+\newenvironment{DoxyPre}{%
+ \small%
+ \begin{alltt}%
+}{%
+ \end{alltt}%
+ \normalsize%
+}
+
+% Used by @code ... @endcode
+\newenvironment{DoxyCode}{%
+ \par%
+ \scriptsize%
+ \begin{alltt}%
+}{%
+ \end{alltt}%
+ \normalsize%
+}
+
+% Used by @example, @include, @includelineno and @dontinclude
+\newenvironment{DoxyCodeInclude}{%
+ \DoxyCode%
+}{%
+ \endDoxyCode%
+}
+
+% Used by @verbatim ... @endverbatim
+\newenvironment{DoxyVerb}{%
+ \footnotesize%
+ \verbatim%
+}{%
+ \endverbatim%
+ \normalsize%
+}
+
+% Used by @verbinclude
+\newenvironment{DoxyVerbInclude}{%
+ \DoxyVerb%
+}{%
+ \endDoxyVerb%
+}
+
+% Used by numbered lists (using '-#' or <ol> ... </ol>)
+\newenvironment{DoxyEnumerate}{%
+ \enumerate%
+}{%
+ \endenumerate%
+}
+
+% Used by bullet lists (using '-', @li, @arg, or <ul> ... </ul>)
+\newenvironment{DoxyItemize}{%
+ \itemize%
+}{%
+ \enditemize%
+}
+
+% Used by description lists (using <dl> ... </dl>)
+\newenvironment{DoxyDescription}{%
+ \description%
+}{%
+ \enddescription%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if caption is specified)
+\newenvironment{DoxyImage}{%
+ \begin{figure}[H]%
+ \begin{center}%
+}{%
+ \end{center}%
+ \end{figure}%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if no caption is specified)
+\newenvironment{DoxyImageNoCaption}{%
+}{%
+}
+
+% Used by @attention
+\newenvironment{DoxyAttention}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @author and @authors
+\newenvironment{DoxyAuthor}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @date
+\newenvironment{DoxyDate}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @invariant
+\newenvironment{DoxyInvariant}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @note
+\newenvironment{DoxyNote}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @post
+\newenvironment{DoxyPostcond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @pre
+\newenvironment{DoxyPrecond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @copyright
+\newenvironment{DoxyCopyright}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @remark
+\newenvironment{DoxyRemark}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @return and @returns
+\newenvironment{DoxyReturn}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @since
+\newenvironment{DoxySince}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @see
+\newenvironment{DoxySeeAlso}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @version
+\newenvironment{DoxyVersion}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @warning
+\newenvironment{DoxyWarning}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @internal
+\newenvironment{DoxyInternal}[1]{%
+ \paragraph*{#1}%
+}{%
+}
+
+% Used by @par and @paragraph
+\newenvironment{DoxyParagraph}[1]{%
+ \begin{list}{}{%
+ \settowidth{\labelwidth}{40pt}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{-4pt}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }%
+ \item[#1]%
+}{%
+ \end{list}%
+}
+
+% Used by parameter lists
+\newenvironment{DoxyParams}[2][]{%
+ \par%
+ \tabletail{\hline}%
+ \tablelasttail{\hline}%
+ \tablefirsthead{}%
+ \tablehead{}%
+ \ifthenelse{\equal{#1}{}}%
+ {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}%
+ \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
+ p{0.805\textwidth}|}}%
+ {\ifthenelse{\equal{#1}{1}}%
+ {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}%
+ \begin{xtabular}{|>{\centering}p{0.10\textwidth}|%
+ >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
+ p{0.678\textwidth}|}}%
+ {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}%
+ \begin{xtabular}{|>{\centering}p{0.10\textwidth}|%
+ >{\centering\hspace{0pt}}p{0.15\textwidth}|%
+ >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
+ p{0.501\textwidth}|}}%
+ }\hline%
+}{%
+ \end{xtabular}%
+ \tablefirsthead{}%
+ \vspace{6pt}%
+}
+
+% Used for fields of simple structs
+\newenvironment{DoxyFields}[1]{%
+ \par%
+ \tabletail{\hline}%
+ \tablelasttail{\hline}%
+ \tablehead{}%
+ \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
+ \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
+ p{0.15\textwidth}|%
+ p{0.63\textwidth}|}%
+ \hline%
+}{%
+ \end{xtabular}%
+ \tablefirsthead{}%
+ \vspace{6pt}%
+}
+
+% Used for parameters within a detailed function description
+\newenvironment{DoxyParamCaption}{%
+ \renewcommand{\item}[2][]{##1 {\em ##2}}%
+}{%
+}
+
+% Used by return value lists
+\newenvironment{DoxyRetVals}[1]{%
+ \par%
+ \tabletail{\hline}%
+ \tablelasttail{\hline}%
+ \tablehead{}%
+ \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
+ \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
+ p{0.705\textwidth}|}%
+ \hline%
+}{%
+ \end{xtabular}%
+ \tablefirsthead{}%
+ \vspace{6pt}%
+}
+
+% Used by exception lists
+\newenvironment{DoxyExceptions}[1]{%
+ \par%
+ \tabletail{\hline}%
+ \tablelasttail{\hline}%
+ \tablehead{}%
+ \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
+ \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
+ p{0.705\textwidth}|}%
+ \hline%
+}{%
+ \end{xtabular}%
+ \tablefirsthead{}%
+ \vspace{6pt}%
+}
+
+% Used by template parameter lists
+\newenvironment{DoxyTemplParams}[1]{%
+ \par%
+ \tabletail{\hline}%
+ \tablelasttail{\hline}%
+ \tablehead{}%
+ \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
+ \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
+ p{0.705\textwidth}|}%
+ \hline%
+}{%
+ \end{xtabular}%
+ \tablefirsthead{}%
+ \vspace{6pt}%
+}
+
+% Used for member lists
+\newenvironment{DoxyCompactItemize}{%
+ \begin{itemize}%
+ \setlength{\itemsep}{-3pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\topsep}{0pt}%
+ \setlength{\partopsep}{0pt}%
+}{%
+ \end{itemize}%
+}
+
+% Used for member descriptions
+\newenvironment{DoxyCompactList}{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{0.5cm}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\topsep}{0pt}%
+ \renewcommand{\makelabel}{\hfill}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used for reference lists (@bug, @deprecated, @todo, etc.)
+\newenvironment{DoxyRefList}{%
+ \begin{list}{}{%
+ \setlength{\labelwidth}{10pt}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \addtolength{\leftmargin}{\labelsep}%
+ \renewcommand{\makelabel}{\xreflabel}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used by @bug, @deprecated, @todo, etc.
+\newenvironment{DoxyRefDesc}[1]{%
+ \begin{list}{}{%
+ \renewcommand\makelabel[1]{\textbf{##1}}%
+ \settowidth\labelwidth{\makelabel{#1}}%
+ \setlength\leftmargin{\labelwidth+\labelsep}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used by parameter lists and simple sections
+\newenvironment{Desc}
+{\begin{list}{}{%
+ \settowidth{\labelwidth}{40pt}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{-4pt}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }
+}{%
+ \end{list}%
+}
+
+% Used by tables
+\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}%
+\newlength{\tmplength}%
+\newenvironment{TabularC}[1]%
+{%
+\setlength{\tmplength}%
+ {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}%
+ \par\begin{xtabular*}{\linewidth}%
+ {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}%
+}%
+{\end{xtabular*}\par}%
+
+% Used for member group headers
+\newenvironment{Indent}{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{0.5cm}%
+ }%
+ \item[]\ignorespaces%
+}{%
+ \unskip%
+ \end{list}%
+}
+
+% Used when hyperlinks are turned off
+\newcommand{\doxyref}[3]{%
+ \textbf{#1} (\textnormal{#2}\,\pageref{#3})%
+}
+
+% Used for syntax highlighting
+\definecolor{comment}{rgb}{0.5,0.0,0.0}
+\definecolor{keyword}{rgb}{0.0,0.5,0.0}
+\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}
+\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}
+\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}
+\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}
+\definecolor{charliteral}{rgb}{0.0,0.5,0.5}
+\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}
+\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}
+\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}
+\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}
diff --git a/src/doxygen_css.h b/src/doxygen_css.h
index 2b3f668..d5348fe 100644
--- a/src/doxygen_css.h
+++ b/src/doxygen_css.h
@@ -1,7 +1,7 @@
"/* The standard CSS for doxygen $doxygenversion */\n"
"\n"
"body, table, div, p, dl {\n"
-" font: 400 14px/19px Roboto,sans-serif;\n"
+" font: 400 14px/22px Roboto,sans-serif;\n"
"}\n"
"\n"
"/* @group Heading Levels */\n"
@@ -11,6 +11,7 @@
"}\n"
"\n"
".title {\n"
+" font: 400 14px/28px Roboto,sans-serif;\n"
" font-size: 150%;\n"
" font-weight: bold;\n"
" margin: 10px 2px;\n"
@@ -168,8 +169,8 @@
"}\n"
"\n"
"div.fragment {\n"
-" padding: 4px;\n"
-" margin: 4px;\n"
+" padding: 0px;\n"
+" margin: 0px;\n"
" background-color: ##FC;\n"
" border: 1px solid ##CC;\n"
"}\n"
@@ -687,6 +688,7 @@
".directory td.entry {\n"
" white-space: nowrap;\n"
" padding-right: 6px;\n"
+" padding-top: 3px;\n"
"}\n"
"\n"
".directory td.entry a {\n"
@@ -787,7 +789,7 @@
"}\n"
"\n"
".fieldtable td.fieldname {\n"
-" padding-top: 5px;\n"
+" padding-top: 3px;\n"
"}\n"
"\n"
".fieldtable td.fielddoc {\n"
@@ -796,7 +798,7 @@
"}\n"
"\n"
".fieldtable td.fielddoc p:first-child {\n"
-" margin-top: 2px;\n"
+" margin-top: 0px;\n"
"} \n"
" \n"
".fieldtable td.fielddoc p:last-child {\n"
diff --git a/src/doxygen_sty.h b/src/doxygen_sty.h
new file mode 100644
index 0000000..fedbd17
--- /dev/null
+++ b/src/doxygen_sty.h
@@ -0,0 +1,464 @@
+"\\NeedsTeXFormat{LaTeX2e}\n"
+"\\ProvidesPackage{doxygen}\n"
+"\n"
+"% Packages used by this style file\n"
+"\\RequirePackage{alltt}\n"
+"\\RequirePackage{array}\n"
+"\\RequirePackage{calc}\n"
+"\\RequirePackage{float}\n"
+"\\RequirePackage{ifthen}\n"
+"\\RequirePackage{verbatim}\n"
+"\\RequirePackage[table]{xcolor}\n"
+"\\RequirePackage{xtab}\n"
+"\n"
+"%---------- Internal commands used in this style file ----------------\n"
+"\n"
+"\\newcommand{\\ensurespace}[1]{%\n"
+" \\begingroup%\n"
+" \\setlength{\\dimen@}{#1}%\n"
+" \\vskip\\z@\\@plus\\dimen@%\n"
+" \\penalty -100\\vskip\\z@\\@plus -\\dimen@%\n"
+" \\vskip\\dimen@%\n"
+" \\penalty 9999%\n"
+" \\vskip -\\dimen@%\n"
+" \\vskip\\z@skip% hide the previous |\\vskip| from |\\addvspace|\n"
+" \\endgroup%\n"
+"}\n"
+"\n"
+"\\newcommand{\\DoxyLabelFont}{}\n"
+"\\newcommand{\\entrylabel}[1]{%\n"
+" {%\n"
+" \\parbox[b]{\\labelwidth-4pt}{%\n"
+" \\makebox[0pt][l]{\\DoxyLabelFont#1}%\n"
+" \\vspace{1.5\\baselineskip}%\n"
+" }%\n"
+" }%\n"
+"}\n"
+"\n"
+"\\newenvironment{DoxyDesc}[1]{%\n"
+" \\ensurespace{4\\baselineskip}%\n"
+" \\begin{list}{}{%\n"
+" \\settowidth{\\labelwidth}{20pt}%\n"
+" \\setlength{\\parsep}{0pt}%\n"
+" \\setlength{\\itemsep}{0pt}%\n"
+" \\setlength{\\leftmargin}{\\labelwidth+\\labelsep}%\n"
+" \\renewcommand{\\makelabel}{\\entrylabel}%\n"
+" }%\n"
+" \\item[#1]%\n"
+"}{%\n"
+" \\end{list}%\n"
+"}\n"
+"\n"
+"\\newsavebox{\\xrefbox}\n"
+"\\newlength{\\xreflength}\n"
+"\\newcommand{\\xreflabel}[1]{%\n"
+" \\sbox{\\xrefbox}{#1}%\n"
+" \\setlength{\\xreflength}{\\wd\\xrefbox}%\n"
+" \\ifthenelse{\\xreflength>\\labelwidth}{%\n"
+" \\begin{minipage}{\\textwidth}%\n"
+" \\setlength{\\parindent}{0pt}%\n"
+" \\hangindent=15pt\\bfseries #1\\vspace{1.2\\itemsep}%\n"
+" \\end{minipage}%\n"
+" }{%\n"
+" \\parbox[b]{\\labelwidth}{\\makebox[0pt][l]{\\textbf{#1}}}%\n"
+" }%\n"
+"}\n"
+"\n"
+"%---------- Commands used by doxygen LaTeX output generator ----------\n"
+"\n"
+"% Used by <pre> ... </pre>\n"
+"\\newenvironment{DoxyPre}{%\n"
+" \\small%\n"
+" \\begin{alltt}%\n"
+"}{%\n"
+" \\end{alltt}%\n"
+" \\normalsize%\n"
+"}\n"
+"\n"
+"% Used by @code ... @endcode\n"
+"\\newenvironment{DoxyCode}{%\n"
+" \\par%\n"
+" \\scriptsize%\n"
+" \\begin{alltt}%\n"
+"}{%\n"
+" \\end{alltt}%\n"
+" \\normalsize%\n"
+"}\n"
+"\n"
+"% Used by @example, @include, @includelineno and @dontinclude\n"
+"\\newenvironment{DoxyCodeInclude}{%\n"
+" \\DoxyCode%\n"
+"}{%\n"
+" \\endDoxyCode%\n"
+"}\n"
+"\n"
+"% Used by @verbatim ... @endverbatim\n"
+"\\newenvironment{DoxyVerb}{%\n"
+" \\footnotesize%\n"
+" \\verbatim%\n"
+"}{%\n"
+" \\endverbatim%\n"
+" \\normalsize%\n"
+"}\n"
+"\n"
+"% Used by @verbinclude\n"
+"\\newenvironment{DoxyVerbInclude}{%\n"
+" \\DoxyVerb%\n"
+"}{%\n"
+" \\endDoxyVerb%\n"
+"}\n"
+"\n"
+"% Used by numbered lists (using '-#' or <ol> ... </ol>)\n"
+"\\newenvironment{DoxyEnumerate}{%\n"
+" \\enumerate%\n"
+"}{%\n"
+" \\endenumerate%\n"
+"}\n"
+"\n"
+"% Used by bullet lists (using '-', @li, @arg, or <ul> ... </ul>)\n"
+"\\newenvironment{DoxyItemize}{%\n"
+" \\itemize%\n"
+"}{%\n"
+" \\enditemize%\n"
+"}\n"
+"\n"
+"% Used by description lists (using <dl> ... </dl>)\n"
+"\\newenvironment{DoxyDescription}{%\n"
+" \\description%\n"
+"}{%\n"
+" \\enddescription%\n"
+"}\n"
+"\n"
+"% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc\n"
+"% (only if caption is specified)\n"
+"\\newenvironment{DoxyImage}{%\n"
+" \\begin{figure}[H]%\n"
+" \\begin{center}%\n"
+"}{%\n"
+" \\end{center}%\n"
+" \\end{figure}%\n"
+"}\n"
+"\n"
+"% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc\n"
+"% (only if no caption is specified)\n"
+"\\newenvironment{DoxyImageNoCaption}{%\n"
+"}{%\n"
+"}\n"
+"\n"
+"% Used by @attention\n"
+"\\newenvironment{DoxyAttention}[1]{%\n"
+" \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+" \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @author and @authors\n"
+"\\newenvironment{DoxyAuthor}[1]{%\n"
+" \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+" \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @date\n"
+"\\newenvironment{DoxyDate}[1]{%\n"
+" \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+" \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @invariant\n"
+"\\newenvironment{DoxyInvariant}[1]{%\n"
+" \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+" \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @note\n"
+"\\newenvironment{DoxyNote}[1]{%\n"
+" \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+" \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @post\n"
+"\\newenvironment{DoxyPostcond}[1]{%\n"
+" \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+" \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @pre\n"
+"\\newenvironment{DoxyPrecond}[1]{%\n"
+" \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+" \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @copyright\n"
+"\\newenvironment{DoxyCopyright}[1]{%\n"
+" \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+" \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @remark\n"
+"\\newenvironment{DoxyRemark}[1]{%\n"
+" \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+" \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @return and @returns\n"
+"\\newenvironment{DoxyReturn}[1]{%\n"
+" \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+" \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @since\n"
+"\\newenvironment{DoxySince}[1]{%\n"
+" \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+" \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @see\n"
+"\\newenvironment{DoxySeeAlso}[1]{%\n"
+" \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+" \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @version\n"
+"\\newenvironment{DoxyVersion}[1]{%\n"
+" \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+" \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @warning\n"
+"\\newenvironment{DoxyWarning}[1]{%\n"
+" \\begin{DoxyDesc}{#1}%\n"
+"}{%\n"
+" \\end{DoxyDesc}%\n"
+"}\n"
+"\n"
+"% Used by @internal\n"
+"\\newenvironment{DoxyInternal}[1]{%\n"
+" \\paragraph*{#1}%\n"
+"}{%\n"
+"}\n"
+"\n"
+"% Used by @par and @paragraph\n"
+"\\newenvironment{DoxyParagraph}[1]{%\n"
+" \\begin{list}{}{%\n"
+" \\settowidth{\\labelwidth}{40pt}%\n"
+" \\setlength{\\leftmargin}{\\labelwidth}%\n"
+" \\setlength{\\parsep}{0pt}%\n"
+" \\setlength{\\itemsep}{-4pt}%\n"
+" \\renewcommand{\\makelabel}{\\entrylabel}%\n"
+" }%\n"
+" \\item[#1]%\n"
+"}{%\n"
+" \\end{list}%\n"
+"}\n"
+"\n"
+"% Used by parameter lists\n"
+"\\newenvironment{DoxyParams}[2][]{%\n"
+" \\par%\n"
+" \\tabletail{\\hline}%\n"
+" \\tablelasttail{\\hline}%\n"
+" \\tablefirsthead{}%\n"
+" \\tablehead{}%\n"
+" \\ifthenelse{\\equal{#1}{}}%\n"
+" {\\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #2}\\\\[1ex]}%\n"
+" \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+" p{0.805\\textwidth}|}}%\n"
+" {\\ifthenelse{\\equal{#1}{1}}%\n"
+" {\\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #2}\\\\[1ex]}%\n"
+" \\begin{xtabular}{|>{\\centering}p{0.10\\textwidth}|%\n"
+" >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+" p{0.678\\textwidth}|}}%\n"
+" {\\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #2}\\\\[1ex]}%\n"
+" \\begin{xtabular}{|>{\\centering}p{0.10\\textwidth}|%\n"
+" >{\\centering\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+" >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+" p{0.501\\textwidth}|}}%\n"
+" }\\hline%\n"
+"}{%\n"
+" \\end{xtabular}%\n"
+" \\tablefirsthead{}%\n"
+" \\vspace{6pt}%\n"
+"}\n"
+"\n"
+"% Used for fields of simple structs\n"
+"\\newenvironment{DoxyFields}[1]{%\n"
+" \\par%\n"
+" \\tabletail{\\hline}%\n"
+" \\tablelasttail{\\hline}%\n"
+" \\tablehead{}%\n"
+" \\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #1}\\\\[1ex]}%\n"
+" \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
+" p{0.15\\textwidth}|%\n"
+" p{0.63\\textwidth}|}%\n"
+" \\hline%\n"
+"}{%\n"
+" \\end{xtabular}%\n"
+" \\tablefirsthead{}%\n"
+" \\vspace{6pt}%\n"
+"}\n"
+"\n"
+"% Used for parameters within a detailed function description\n"
+"\\newenvironment{DoxyParamCaption}{%\n"
+" \\renewcommand{\\item}[2][]{##1 {\\em ##2}}%\n"
+"}{%\n"
+"}\n"
+"\n"
+"% Used by return value lists\n"
+"\\newenvironment{DoxyRetVals}[1]{%\n"
+" \\par%\n"
+" \\tabletail{\\hline}%\n"
+" \\tablelasttail{\\hline}%\n"
+" \\tablehead{}%\n"
+" \\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #1}\\\\[1ex]}%\n"
+" \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
+" p{0.705\\textwidth}|}%\n"
+" \\hline%\n"
+"}{%\n"
+" \\end{xtabular}%\n"
+" \\tablefirsthead{}%\n"
+" \\vspace{6pt}%\n"
+"}\n"
+"\n"
+"% Used by exception lists\n"
+"\\newenvironment{DoxyExceptions}[1]{%\n"
+" \\par%\n"
+" \\tabletail{\\hline}%\n"
+" \\tablelasttail{\\hline}%\n"
+" \\tablehead{}%\n"
+" \\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #1}\\\\[1ex]}%\n"
+" \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
+" p{0.705\\textwidth}|}%\n"
+" \\hline%\n"
+"}{%\n"
+" \\end{xtabular}%\n"
+" \\tablefirsthead{}%\n"
+" \\vspace{6pt}%\n"
+"}\n"
+"\n"
+"% Used by template parameter lists\n"
+"\\newenvironment{DoxyTemplParams}[1]{%\n"
+" \\par%\n"
+" \\tabletail{\\hline}%\n"
+" \\tablelasttail{\\hline}%\n"
+" \\tablehead{}%\n"
+" \\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #1}\\\\[1ex]}%\n"
+" \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
+" p{0.705\\textwidth}|}%\n"
+" \\hline%\n"
+"}{%\n"
+" \\end{xtabular}%\n"
+" \\tablefirsthead{}%\n"
+" \\vspace{6pt}%\n"
+"}\n"
+"\n"
+"% Used for member lists\n"
+"\\newenvironment{DoxyCompactItemize}{%\n"
+" \\begin{itemize}%\n"
+" \\setlength{\\itemsep}{-3pt}%\n"
+" \\setlength{\\parsep}{0pt}%\n"
+" \\setlength{\\topsep}{0pt}%\n"
+" \\setlength{\\partopsep}{0pt}%\n"
+"}{%\n"
+" \\end{itemize}%\n"
+"}\n"
+"\n"
+"% Used for member descriptions\n"
+"\\newenvironment{DoxyCompactList}{%\n"
+" \\begin{list}{}{%\n"
+" \\setlength{\\leftmargin}{0.5cm}%\n"
+" \\setlength{\\itemsep}{0pt}%\n"
+" \\setlength{\\parsep}{0pt}%\n"
+" \\setlength{\\topsep}{0pt}%\n"
+" \\renewcommand{\\makelabel}{\\hfill}%\n"
+" }%\n"
+"}{%\n"
+" \\end{list}%\n"
+"}\n"
+"\n"
+"% Used for reference lists (@bug, @deprecated, @todo, etc.)\n"
+"\\newenvironment{DoxyRefList}{%\n"
+" \\begin{list}{}{%\n"
+" \\setlength{\\labelwidth}{10pt}%\n"
+" \\setlength{\\leftmargin}{\\labelwidth}%\n"
+" \\addtolength{\\leftmargin}{\\labelsep}%\n"
+" \\renewcommand{\\makelabel}{\\xreflabel}%\n"
+" }%\n"
+"}{%\n"
+" \\end{list}%\n"
+"}\n"
+"\n"
+"% Used by @bug, @deprecated, @todo, etc.\n"
+"\\newenvironment{DoxyRefDesc}[1]{%\n"
+" \\begin{list}{}{%\n"
+" \\renewcommand\\makelabel[1]{\\textbf{##1}}%\n"
+" \\settowidth\\labelwidth{\\makelabel{#1}}%\n"
+" \\setlength\\leftmargin{\\labelwidth+\\labelsep}%\n"
+" }%\n"
+"}{%\n"
+" \\end{list}%\n"
+"}\n"
+"\n"
+"% Used by parameter lists and simple sections\n"
+"\\newenvironment{Desc}\n"
+"{\\begin{list}{}{%\n"
+" \\settowidth{\\labelwidth}{40pt}%\n"
+" \\setlength{\\leftmargin}{\\labelwidth}%\n"
+" \\setlength{\\parsep}{0pt}%\n"
+" \\setlength{\\itemsep}{-4pt}%\n"
+" \\renewcommand{\\makelabel}{\\entrylabel}%\n"
+" }\n"
+"}{%\n"
+" \\end{list}%\n"
+"}\n"
+"\n"
+"% Used by tables\n"
+"\\newcommand{\\PBS}[1]{\\let\\temp=\\\\#1\\let\\\\=\\temp}%\n"
+"\\newlength{\\tmplength}%\n"
+"\\newenvironment{TabularC}[1]%\n"
+"{%\n"
+"\\setlength{\\tmplength}%\n"
+" {\\linewidth/(#1)-\\tabcolsep*2-\\arrayrulewidth*(#1+1)/(#1)}%\n"
+" \\par\\begin{xtabular*}{\\linewidth}%\n"
+" {*{#1}{|>{\\PBS\\raggedright\\hspace{0pt}}p{\\the\\tmplength}}|}%\n"
+"}%\n"
+"{\\end{xtabular*}\\par}%\n"
+"\n"
+"% Used for member group headers\n"
+"\\newenvironment{Indent}{%\n"
+" \\begin{list}{}{%\n"
+" \\setlength{\\leftmargin}{0.5cm}%\n"
+" }%\n"
+" \\item[]\\ignorespaces%\n"
+"}{%\n"
+" \\unskip%\n"
+" \\end{list}%\n"
+"}\n"
+"\n"
+"% Used when hyperlinks are turned off\n"
+"\\newcommand{\\doxyref}[3]{%\n"
+" \\textbf{#1} (\\textnormal{#2}\\,\\pageref{#3})%\n"
+"}\n"
+"\n"
+"% Used for syntax highlighting\n"
+"\\definecolor{comment}{rgb}{0.5,0.0,0.0}\n"
+"\\definecolor{keyword}{rgb}{0.0,0.5,0.0}\n"
+"\\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}\n"
+"\\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}\n"
+"\\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}\n"
+"\\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}\n"
+"\\definecolor{charliteral}{rgb}{0.0,0.5,0.5}\n"
+"\\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}\n"
+"\\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}\n"
+"\\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}\n"
+"\\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}\n"
diff --git a/src/eclipsehelp.cpp b/src/eclipsehelp.cpp
index df65a13..213b0fa 100644
--- a/src/eclipsehelp.cpp
+++ b/src/eclipsehelp.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/eclipsehelp.h b/src/eclipsehelp.h
index 3be7fc0..c21c4ae 100644
--- a/src/eclipsehelp.h
+++ b/src/eclipsehelp.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/entry.cpp b/src/entry.cpp
index cf3634b..15263ab 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -113,6 +113,7 @@ Entry::Entry(const Entry &e)
anchors = new QList<SectionInfo>;
fileName = e.fileName;
startLine = e.startLine;
+ startColumn = e.startColumn;
if (e.sli)
{
sli = new QList<ListItemInfo>;
@@ -132,6 +133,7 @@ Entry::Entry(const Entry &e)
hidden = e.hidden;
artificial = e.artificial;
groupDocType = e.groupDocType;
+ id = e.id;
m_parent = e.m_parent;
m_sublist = new QList<Entry>;
@@ -239,6 +241,7 @@ void Entry::reset()
initializer.resize(0);
initLines = -1;
startLine = 1;
+ startColumn = 1;
bodyLine = -1;
endBodyLine = -1;
mGrpId = -1;
@@ -257,6 +260,7 @@ void Entry::reset()
subGrouping = TRUE;
protection = Public;
groupDocType = GROUPDOC_NORMAL;
+ id.resize(0);
m_sublist->clear();
extends->clear();
groups->clear();
diff --git a/src/entry.h b/src/entry.h
index 60ba372..cecd095 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -79,9 +79,11 @@ class Entry
INTERFACEDOC_SEC = 0x00010000,
PROTOCOLDOC_SEC = 0x00020000,
CATEGORYDOC_SEC = 0x00040000,
+ SERVICEDOC_SEC = 0x00080000,
+ SINGLETONDOC_SEC = 0x00100000,
COMPOUNDDOC_MASK = CLASSDOC_SEC | STRUCTDOC_SEC | UNIONDOC_SEC |
INTERFACEDOC_SEC | EXCEPTIONDOC_SEC | PROTOCOLDOC_SEC |
- CATEGORYDOC_SEC,
+ CATEGORYDOC_SEC | SERVICEDOC_SEC | SINGLETONDOC_SEC,
SOURCE_SEC = 0x00400000,
HEADER_SEC = 0x00800000,
@@ -111,56 +113,69 @@ class Entry
PACKAGEDOC_SEC = 0x16000000,
OBJCIMPL_SEC = 0x17000000,
DIRDOC_SEC = 0x18000000
+ ,EXPORTED_INTERFACE_SEC = 0x19000000
+ ,INCLUDED_SERVICE_SEC = 0x1A000000
};
- enum MemberSpecifier
- {
- Inline = 0x00000001,
- Explicit = 0x00000002,
- Mutable = 0x00000004,
- Settable = 0x00000008,
- Gettable = 0x00000010,
- Readable = 0x00000020,
- Writable = 0x00000040,
- Final = 0x00000080,
- Abstract = 0x00000100,
- Addable = 0x00000200,
- Removable = 0x00000400,
- Raisable = 0x00000800,
- Override = 0x00001000,
- New = 0x00002000,
- Sealed = 0x00004000,
- Initonly = 0x00008000,
- Optional = 0x00010000,
- Required = 0x00020000,
- NonAtomic = 0x00040000,
- Copy = 0x00080000,
- Retain = 0x00100000,
- Assign = 0x00200000,
- Strong = 0x00400000,
- Weak = 0x00800000,
- Unretained = 0x01000000,
- Alias = 0x02000000,
- ConstExp = 0x04000000,
- Default = 0x08000000,
- Delete = 0x10000000,
- NoExcept = 0x20000000
- };
- enum ClassSpecifier
- {
- Template = 0x0001,
- Generic = 0x0002,
- Ref = 0x0004,
- Value = 0x0008,
- Interface = 0x0010,
- Struct = 0x0020,
- Union = 0x0040,
- Exception = 0x0080,
- Protocol = 0x0100,
- Category = 0x0200,
- SealedClass = 0x0400,
- AbstractClass = 0x0800,
- Enum = 0x1000 // for Java-style enums
- };
+
+ // class specifiers (add new items to the end)
+ static const uint64 Template = (1ULL<<0);
+ static const uint64 Generic = (1ULL<<1);
+ static const uint64 Ref = (1ULL<<2);
+ static const uint64 Value = (1ULL<<3);
+ static const uint64 Interface = (1ULL<<4);
+ static const uint64 Struct = (1ULL<<5);
+ static const uint64 Union = (1ULL<<6);
+ static const uint64 Exception = (1ULL<<7);
+ static const uint64 Protocol = (1ULL<<8);
+ static const uint64 Category = (1ULL<<9);
+ static const uint64 SealedClass = (1ULL<<10);
+ static const uint64 AbstractClass = (1ULL<<11);
+ static const uint64 Enum = (1ULL<<12); // for Java-style enums
+ static const uint64 Service = (1ULL<<13); // UNO IDL
+ static const uint64 Singleton = (1ULL<<14); // UNO IDL
+
+ // member specifiers (add new items to the beginning)
+ static const uint64 Inline = (1ULL<<24);
+ static const uint64 Explicit = (1ULL<<25);
+ static const uint64 Mutable = (1ULL<<26);
+ static const uint64 Settable = (1ULL<<27);
+ static const uint64 Gettable = (1ULL<<28);
+ static const uint64 Readable = (1ULL<<29);
+ static const uint64 Writable = (1ULL<<30);
+ static const uint64 Final = (1ULL<<31);
+ static const uint64 Abstract = (1ULL<<32);
+ static const uint64 Addable = (1ULL<<33);
+ static const uint64 Removable = (1ULL<<34);
+ static const uint64 Raisable = (1ULL<<35);
+ static const uint64 Override = (1ULL<<36);
+ static const uint64 New = (1ULL<<37);
+ static const uint64 Sealed = (1ULL<<38);
+ static const uint64 Initonly = (1ULL<<39);
+ static const uint64 Optional = (1ULL<<40);
+ static const uint64 Required = (1ULL<<41);
+ static const uint64 NonAtomic = (1ULL<<42);
+ static const uint64 Copy = (1ULL<<43);
+ static const uint64 Retain = (1ULL<<44);
+ static const uint64 Assign = (1ULL<<45);
+ static const uint64 Strong = (1ULL<<46);
+ static const uint64 Weak = (1ULL<<47);
+ static const uint64 Unretained = (1ULL<<48);
+ static const uint64 Alias = (1ULL<<49);
+ static const uint64 ConstExp = (1ULL<<50);
+ static const uint64 Default = (1ULL<<51);
+ static const uint64 Delete = (1ULL<<52);
+ static const uint64 NoExcept = (1ULL<<53);
+ static const uint64 Attribute = (1ULL<<54); // UNO IDL attribute
+ static const uint64 Property = (1ULL<<55); // UNO IDL property
+ static const uint64 Readonly = (1ULL<<56); // on UNO IDL attribute or property
+ static const uint64 Bound = (1ULL<<57); // on UNO IDL attribute or property
+ static const uint64 Constrained = (1ULL<<58); // on UNO IDL property
+ static const uint64 Transient = (1ULL<<59); // on UNO IDL property
+ static const uint64 MaybeVoid = (1ULL<<60); // on UNO IDL property
+ static const uint64 MaybeDefault = (1ULL<<61); // on UNO IDL property
+ static const uint64 MaybeAmbiguous = (1ULL<<62); // on UNO IDL property
+ static const uint64 Published = (1ULL<<63); // UNO IDL keyword
+
enum GroupDocType
{
GROUPDOC_NORMAL, //!< defgroup
@@ -220,7 +235,7 @@ class Entry
// content
Protection protection; //!< class protection
MethodTypes mtype; //!< signal, slot, (dcop) method, or property?
- int spec; //!< class/member specifiers
+ uint64 spec; //!< class/member specifiers
int initLines; //!< define/variable initializer lines to show
bool stat; //!< static ?
bool explicitExternal; //!< explicitly defined as external?
@@ -261,11 +276,13 @@ class Entry
QList<SectionInfo> *anchors; //!< list of anchors defined in this entry
QCString fileName; //!< file this entry was extracted from
int startLine; //!< start line of entry in the source
+ int startColumn; //!< start column of entry in the source
QList<ListItemInfo> *sli; //!< special lists (test/todo/bug/deprecated/..) this entry is in
SrcLangExt lang; //!< programming language in which this entry was found
bool hidden; //!< does this represent an entity that is hidden from the output
bool artificial; //!< Artificially introduced item
GroupDocType groupDocType;
+ QCString id; //!< libclang id
static int num; //!< counts the total number of entries
diff --git a/src/example.h b/src/example.h
index 4bcaeb9..8a2b529 100644
--- a/src/example.h
+++ b/src/example.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -40,7 +40,7 @@ class ExampleSDict : public SDict<Example>
~ExampleSDict() {}
int compareItems(QCollection::Item item1,QCollection::Item item2)
{
- return stricmp(((Example *)item1)->name,((Example *)item2)->name);
+ return qstricmp(((Example *)item1)->name,((Example *)item2)->name);
}
};
diff --git a/src/filedef.cpp b/src/filedef.cpp
index 331c792..784ebff 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -41,6 +41,8 @@
#include "membergroup.h"
#include "dirdef.h"
#include "config.h"
+#include "clangparser.h"
+#include "settings.h"
//---------------------------------------------------------------------------
@@ -74,37 +76,34 @@ class DevNullCodeDocInterface : public CodeOutputInterface
*/
FileDef::FileDef(const char *p,const char *nm,
const char *lref,const char *dn)
- : Definition((QCString)p+nm,1,nm)
+ : Definition((QCString)p+nm,1,1,nm)
{
- path=p;
- filepath=path+nm;
- filename=nm;
- diskname=dn;
- if (diskname.isEmpty()) diskname=nm;
+ m_path=p;
+ m_filePath=m_path+nm;
+ m_fileName=nm;
+ m_diskName=dn;
+ if (m_diskName.isEmpty()) m_diskName=nm;
setReference(lref);
- classSDict = 0;
- includeList = 0;
- includeDict = 0;
- includedByList = 0;
- includedByDict = 0;
- namespaceSDict = 0;
- srcDefDict = 0;
- srcMemberDict = 0;
- usingDirList = 0;
- usingDeclList = 0;
- package = 0;
- isSource = FALSE;
- docname = nm;
- dir = 0;
+ m_classSDict = 0;
+ m_includeList = 0;
+ m_includeDict = 0;
+ m_includedByList = 0;
+ m_includedByDict = 0;
+ m_namespaceSDict = 0;
+ m_srcDefDict = 0;
+ m_srcMemberDict = 0;
+ m_usingDirList = 0;
+ m_usingDeclList = 0;
+ m_package = 0;
+ m_isSource = guessSection(nm)==Entry::SOURCE_SEC;
+ m_docname = nm;
+ m_dir = 0;
if (Config_getBool("FULL_PATH_NAMES"))
{
- docname.prepend(stripFromPath(path.copy()));
+ m_docname.prepend(stripFromPath(m_path.copy()));
}
- SrcLangExt lang = getLanguageFromFileName(name());
- setLanguage(lang);
- //m_isJava = lang==SrcLangExt_Java;
- //m_isCSharp = lang==SrcLangExt_CSharp;
- memberGroupSDict = 0;
+ setLanguage(getLanguageFromFileName(name()));
+ m_memberGroupSDict = 0;
acquireFileVersion();
m_subGrouping=Config_getBool("SUBGROUPING");
}
@@ -112,17 +111,17 @@ FileDef::FileDef(const char *p,const char *nm,
/*! destroy the file definition */
FileDef::~FileDef()
{
- delete classSDict;
- delete includeDict;
- delete includeList;
- delete includedByDict;
- delete includedByList;
- delete namespaceSDict;
- delete srcDefDict;
- delete srcMemberDict;
- delete usingDirList;
- delete usingDeclList;
- delete memberGroupSDict;
+ delete m_classSDict;
+ delete m_includeDict;
+ delete m_includeList;
+ delete m_includedByDict;
+ delete m_includedByList;
+ delete m_namespaceSDict;
+ delete m_srcDefDict;
+ delete m_srcMemberDict;
+ delete m_usingDirList;
+ delete m_usingDeclList;
+ delete m_memberGroupSDict;
}
/*! Compute the HTML anchor names for all members in the class */
@@ -135,9 +134,9 @@ void FileDef::computeAnchors()
void FileDef::distributeMemberGroupDocumentation()
{
//printf("FileDef::distributeMemberGroupDocumentation()\n");
- if (memberGroupSDict)
+ if (m_memberGroupSDict)
{
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
@@ -149,9 +148,9 @@ void FileDef::distributeMemberGroupDocumentation()
void FileDef::findSectionsInDocumentation()
{
docFindSections(documentation(),this,0,docFile());
- if (memberGroupSDict)
+ if (m_memberGroupSDict)
{
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
@@ -192,7 +191,7 @@ void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title)
ol.startTextBlock();
if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
{
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
}
if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
!documentation().isEmpty())
@@ -208,7 +207,7 @@ void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title)
}
if (!documentation().isEmpty())
{
- ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+ ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
}
//printf("Writing source ref for file %s\n",name().data());
if (Config_getBool("SOURCE_BROWSER"))
@@ -234,41 +233,41 @@ void FileDef::writeBriefDescription(OutputList &ol)
{
if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
- ol.startParagraph();
- ol.parseDoc(briefFile(),briefLine(),this,0,
- briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::RTF);
- ol.writeString(" \n");
- ol.enable(OutputGenerator::RTF);
+ DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
+ briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
- if (Config_getBool("REPEAT_BRIEF") ||
- !documentation().isEmpty()
- )
+ if (rootNode && !rootNode->isEmpty())
{
- ol.disableAllBut(OutputGenerator::Html);
- ol.startTextLink(0,"details");
- ol.parseText(theTranslator->trMore());
- ol.endTextLink();
- }
- ol.popGeneratorState();
- ol.endParagraph();
+ ol.startParagraph();
+ ol.writeDoc(rootNode,this,0);
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::RTF);
+ ol.writeString(" \n");
+ ol.enable(OutputGenerator::RTF);
- //ol.pushGeneratorState();
- //ol.disable(OutputGenerator::RTF);
- //ol.newParagraph();
- //ol.popGeneratorState();
+ if (Config_getBool("REPEAT_BRIEF") ||
+ !documentation().isEmpty()
+ )
+ {
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.startTextLink(0,"details");
+ ol.parseText(theTranslator->trMore());
+ ol.endTextLink();
+ }
+ ol.popGeneratorState();
+ ol.endParagraph();
+ }
+ delete rootNode;
}
ol.writeSynopsis();
}
void FileDef::writeIncludeFiles(OutputList &ol)
{
- if (/*Config_getBool("SHOW_INCLUDE_FILES") &&*/ includeList &&
- includeList->count()>0)
+ if (m_includeList && m_includeList->count()>0)
{
ol.startTextBlock(TRUE);
- QListIterator<IncludeInfo> ili(*includeList);
+ QListIterator<IncludeInfo> ili(*m_includeList);
IncludeInfo *ii;
for (;(ii=ili.current());++ili)
{
@@ -353,7 +352,7 @@ void FileDef::writeIncludeGraph(OutputList &ol)
DotInclDepGraph incDepGraph(this,FALSE);
if (incDepGraph.isTooBig())
{
- err("warning: Include graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",name().data());
+ warn_uncond("Include graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",name().data());
}
else if (!incDepGraph.isTrivial())
{
@@ -377,7 +376,7 @@ void FileDef::writeIncludedByGraph(OutputList &ol)
DotInclDepGraph incDepGraph(this,TRUE);
if (incDepGraph.isTooBig())
{
- err("warning: Included by graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",name().data());
+ warn_uncond("Included by graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",name().data());
}
if (!incDepGraph.isTrivial())
{
@@ -409,21 +408,22 @@ void FileDef::writeSourceLink(OutputList &ol)
}
}
-void FileDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title)
+void FileDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title,
+ bool const isConstantGroup)
{
// write list of namespaces
- if (namespaceSDict) namespaceSDict->writeDeclaration(ol,title);
+ if (m_namespaceSDict) m_namespaceSDict->writeDeclaration(ol,title,isConstantGroup);
}
void FileDef::writeClassDeclarations(OutputList &ol,const QCString &title)
{
// write list of classes
- if (classSDict) classSDict->writeDeclaration(ol,0,title,FALSE);
+ if (m_classSDict) m_classSDict->writeDeclaration(ol,0,title,FALSE);
}
void FileDef::writeInlineClasses(OutputList &ol)
{
- if (classSDict) classSDict->writeDocumentation(ol,this);
+ if (m_classSDict) m_classSDict->writeDocumentation(ol,this);
}
void FileDef::startMemberDeclarations(OutputList &ol)
@@ -457,10 +457,10 @@ void FileDef::endMemberDocumentation(OutputList &ol)
void FileDef::writeMemberGroups(OutputList &ol)
{
/* write user defined member groups */
- if (memberGroupSDict)
+ if (m_memberGroupSDict)
{
- memberGroupSDict->sort();
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ m_memberGroupSDict->sort();
+ MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
@@ -496,8 +496,10 @@ void FileDef::writeSummaryLinks(OutputList &ol)
SrcLangExt lang=getLanguage();
for (eli.toFirst();(lde=eli.current());++eli)
{
- if ((lde->kind()==LayoutDocEntry::FileClasses && classSDict && classSDict->declVisible()) ||
- (lde->kind()==LayoutDocEntry::FileNamespaces && namespaceSDict && namespaceSDict->declVisible())
+ if ((lde->kind()==LayoutDocEntry::FileClasses &&
+ m_classSDict && m_classSDict->declVisible()) ||
+ (lde->kind()==LayoutDocEntry::FileNamespaces &&
+ m_namespaceSDict && m_namespaceSDict->declVisible())
)
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
@@ -540,12 +542,12 @@ void FileDef::writeDocumentation(OutputList &ol)
//printf("WriteDocumentation diskname=%s\n",diskname.data());
QCString versionTitle;
- if (!fileVersion.isEmpty())
+ if (!m_fileVersion.isEmpty())
{
- versionTitle=("("+fileVersion+")");
+ versionTitle=("("+m_fileVersion+")");
}
- QCString title = docname+versionTitle;
- QCString pageTitle=theTranslator->trFileReference(docname);
+ QCString title = m_docname+versionTitle;
+ QCString pageTitle=theTranslator->trFileReference(m_docname);
if (getDirDef())
{
@@ -582,7 +584,7 @@ void FileDef::writeDocumentation(OutputList &ol)
ol.startContents();
- if (!fileVersion.isEmpty())
+ if (!m_fileVersion.isEmpty())
{
ol.disableAllBut(OutputGenerator::Html);
ol.startProjectNumber();
@@ -644,9 +646,15 @@ void FileDef::writeDocumentation(OutputList &ol)
case LayoutDocEntry::FileNamespaces:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeNamespaceDeclarations(ol,ls->title(lang));
+ writeNamespaceDeclarations(ol,ls->title(lang),false);
}
break;
+ case LayoutDocEntry::FileConstantGroups:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeNamespaceDeclarations(ol,ls->title(lang),true);
+ }
+ break;
case LayoutDocEntry::MemberGroups:
writeMemberGroups(ol);
break;
@@ -691,6 +699,7 @@ void FileDef::writeDocumentation(OutputList &ol)
case LayoutDocEntry::ClassUsedFiles:
case LayoutDocEntry::ClassInlineClasses:
case LayoutDocEntry::NamespaceNestedNamespaces:
+ case LayoutDocEntry::NamespaceNestedConstantGroups:
case LayoutDocEntry::NamespaceClasses:
case LayoutDocEntry::NamespaceInlineClasses:
case LayoutDocEntry::GroupClasses:
@@ -792,15 +801,15 @@ void FileDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
}
/*! Write a source listing of this file to the output */
-void FileDef::writeSource(OutputList &ol)
+void FileDef::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu)
{
- static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
+ static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES");
static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE");
- QCString title = docname;
- if (!fileVersion.isEmpty())
+ QCString title = m_docname;
+ if (!m_fileVersion.isEmpty())
{
- title+=(" ("+fileVersion+")");
+ title+=(" ("+m_fileVersion+")");
}
QCString pageTitle = theTranslator->trSourceFile(title);
ol.disable(OutputGenerator::Man);
@@ -843,30 +852,83 @@ void FileDef::writeSource(OutputList &ol)
if (latexSourceCode) ol.enable(OutputGenerator::Latex);
}
- ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension());
- pIntf->resetCodeParserState();
- ol.startCodeFragment();
- pIntf->parseCode(ol,0,
- fileToString(absFilePath(),filterSourceFiles,TRUE),
- FALSE,0,this
- );
- ol.endCodeFragment();
+ (void)sameTu;
+ (void)filesInSameTu;
+#if USE_LIBCLANG
+ static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+ if (clangAssistedParsing &&
+ (getLanguage()==SrcLangExt_Cpp || getLanguage()==SrcLangExt_ObjC))
+ {
+ ol.startCodeFragment();
+ if (!sameTu)
+ {
+ ClangParser::instance()->start(absFilePath(),filesInSameTu);
+ }
+ else
+ {
+ ClangParser::instance()->switchToFile(absFilePath());
+ }
+ ClangParser::instance()->writeSources(ol,this);
+ ol.endCodeFragment();
+ }
+ else
+#endif
+ {
+ ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension());
+ pIntf->resetCodeParserState();
+ ol.startCodeFragment();
+ pIntf->parseCode(ol,0,
+ fileToString(absFilePath(),filterSourceFiles,TRUE),
+ FALSE,0,this
+ );
+ ol.endCodeFragment();
+ }
ol.endContents();
endFileWithNavPath(this,ol);
ol.enableAll();
}
-void FileDef::parseSource()
+void FileDef::parseSource(bool sameTu,QStrList &filesInSameTu)
{
static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES");
DevNullCodeDocInterface devNullIntf;
- ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension());
- pIntf->resetCodeParserState();
- pIntf->parseCode(
+ (void)sameTu;
+ (void)filesInSameTu;
+#if USE_LIBCLANG
+ static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
+ if (clangAssistedParsing &&
+ (getLanguage()==SrcLangExt_Cpp || getLanguage()==SrcLangExt_ObjC))
+ {
+ if (!sameTu)
+ {
+ ClangParser::instance()->start(absFilePath(),filesInSameTu);
+ }
+ else
+ {
+ ClangParser::instance()->switchToFile(absFilePath());
+ }
+ ClangParser::instance()->writeSources(devNullIntf,this);
+ }
+ else
+#endif
+ {
+ ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension());
+ pIntf->resetCodeParserState();
+ pIntf->parseCode(
devNullIntf,0,
fileToString(absFilePath(),filterSourceFiles,TRUE),
FALSE,0,this
);
+ }
+}
+
+void FileDef::startParsing()
+{
+}
+
+void FileDef::finishParsing()
+{
+ ClangParser::instance()->finish();
}
void FileDef::addMembersToMemberGroup()
@@ -877,14 +939,14 @@ void FileDef::addMembersToMemberGroup()
{
if (ml->listType()&MemberListType_declarationLists)
{
- ::addMembersToMemberGroup(ml,&memberGroupSDict,this);
+ ::addMembersToMemberGroup(ml,&m_memberGroupSDict,this);
}
}
// add members inside sections to their groups
- if (memberGroupSDict)
+ if (m_memberGroupSDict)
{
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
@@ -955,14 +1017,18 @@ void FileDef::insertMember(MemberDef *md)
void FileDef::insertClass(ClassDef *cd)
{
if (cd->isHidden()) return;
- if (classSDict==0)
+ if (m_classSDict==0)
{
- classSDict = new ClassSDict(17);
+ m_classSDict = new ClassSDict(17);
}
if (Config_getBool("SORT_BRIEF_DOCS"))
- classSDict->inSort(cd->name(),cd);
+ {
+ m_classSDict->inSort(cd->name(),cd);
+ }
else
- classSDict->append(cd->name(),cd);
+ {
+ m_classSDict->append(cd->name(),cd);
+ }
}
/*! Adds namespace definition \a nd to the list of all compounds of this file */
@@ -970,23 +1036,27 @@ void FileDef::insertNamespace(NamespaceDef *nd)
{
if (nd->isHidden()) return;
if (!nd->name().isEmpty() &&
- (namespaceSDict==0 || namespaceSDict->find(nd->name())==0))
+ (m_namespaceSDict==0 || m_namespaceSDict->find(nd->name())==0))
{
- if (namespaceSDict==0)
+ if (m_namespaceSDict==0)
{
- namespaceSDict = new NamespaceSDict;
+ m_namespaceSDict = new NamespaceSDict;
}
if (Config_getBool("SORT_BRIEF_DOCS"))
- namespaceSDict->inSort(nd->name(),nd);
+ {
+ m_namespaceSDict->inSort(nd->name(),nd);
+ }
else
- namespaceSDict->append(nd->name(),nd);
+ {
+ m_namespaceSDict->append(nd->name(),nd);
+ }
}
}
QCString FileDef::name() const
{
if (Config_getBool("FULL_PATH_NAMES"))
- return filename;
+ return m_fileName;
else
return Definition::name();
}
@@ -996,45 +1066,47 @@ void FileDef::addSourceRef(int line,Definition *d,MemberDef *md)
//printf("FileDef::addSourceDef(%d,%p,%p)\n",line,d,md);
if (d)
{
- if (srcDefDict==0) srcDefDict = new QIntDict<Definition>(257);
- if (srcMemberDict==0) srcMemberDict = new QIntDict<MemberDef>(257);
- srcDefDict->insert(line,d);
- if (md) srcMemberDict->insert(line,md);
+ if (m_srcDefDict==0) m_srcDefDict = new QIntDict<Definition>(257);
+ if (m_srcMemberDict==0) m_srcMemberDict = new QIntDict<MemberDef>(257);
+ m_srcDefDict->insert(line,d);
+ if (md) m_srcMemberDict->insert(line,md);
//printf("Adding member %s with anchor %s at line %d to file %s\n",
// md?md->name().data():"<none>",md?md->anchor().data():"<none>",line,name().data());
}
}
-Definition *FileDef::getSourceDefinition(int lineNr)
+Definition *FileDef::getSourceDefinition(int lineNr) const
{
Definition *result=0;
- if (srcDefDict)
+ if (m_srcDefDict)
{
- result = srcDefDict->find(lineNr);
+ result = m_srcDefDict->find(lineNr);
}
+ //printf("%s::getSourceDefinition(%d)=%s\n",name().data(),lineNr,result?result->name().data():"none");
return result;
}
-MemberDef *FileDef::getSourceMember(int lineNr)
+MemberDef *FileDef::getSourceMember(int lineNr) const
{
MemberDef *result=0;
- if (srcMemberDict)
+ if (m_srcMemberDict)
{
- result = srcMemberDict->find(lineNr);
+ result = m_srcMemberDict->find(lineNr);
}
+ //printf("%s::getSourceMember(%d)=%s\n",name().data(),lineNr,result?result->name().data():"none");
return result;
}
void FileDef::addUsingDirective(NamespaceDef *nd)
{
- if (usingDirList==0)
+ if (m_usingDirList==0)
{
- usingDirList = new NamespaceSDict;
+ m_usingDirList = new NamespaceSDict;
}
- if (usingDirList->find(nd->qualifiedName())==0)
+ if (m_usingDirList->find(nd->qualifiedName())==0)
{
- usingDirList->append(nd->qualifiedName(),nd);
+ m_usingDirList->append(nd->qualifiedName(),nd);
}
//printf("%p: FileDef::addUsingDirective: %s:%d\n",this,name().data(),usingDirList->count());
}
@@ -1042,18 +1114,18 @@ void FileDef::addUsingDirective(NamespaceDef *nd)
NamespaceSDict *FileDef::getUsedNamespaces() const
{
//printf("%p: FileDef::getUsedNamespace: %s:%d\n",this,name().data(),usingDirList?usingDirList->count():0);
- return usingDirList;
+ return m_usingDirList;
}
void FileDef::addUsingDeclaration(Definition *d)
{
- if (usingDeclList==0)
+ if (m_usingDeclList==0)
{
- usingDeclList = new SDict<Definition>(17);
+ m_usingDeclList = new SDict<Definition>(17);
}
- if (usingDeclList->find(d->qualifiedName())==0)
+ if (m_usingDeclList->find(d->qualifiedName())==0)
{
- usingDeclList->append(d->qualifiedName(),d);
+ m_usingDeclList->append(d->qualifiedName(),d);
}
}
@@ -1062,13 +1134,13 @@ void FileDef::addIncludeDependency(FileDef *fd,const char *incName,bool local,
{
//printf("FileDef::addIncludeDependency(%p,%s,%d)\n",fd,incName,local);
QCString iName = fd ? fd->absFilePath().data() : incName;
- if (!iName.isEmpty() && (!includeDict || includeDict->find(iName)==0))
+ if (!iName.isEmpty() && (!m_includeDict || m_includeDict->find(iName)==0))
{
- if (includeDict==0)
+ if (m_includeDict==0)
{
- includeDict = new QDict<IncludeInfo>(61);
- includeList = new QList<IncludeInfo>;
- includeList->setAutoDelete(TRUE);
+ m_includeDict = new QDict<IncludeInfo>(61);
+ m_includeList = new QList<IncludeInfo>;
+ m_includeList->setAutoDelete(TRUE);
}
IncludeInfo *ii = new IncludeInfo;
ii->fileDef = fd;
@@ -1076,8 +1148,8 @@ void FileDef::addIncludeDependency(FileDef *fd,const char *incName,bool local,
ii->local = local;
ii->imported = imported;
ii->indirect = indirect;
- includeList->append(ii);
- includeDict->insert(iName,ii);
+ m_includeList->append(ii);
+ m_includeDict->insert(iName,ii);
}
}
@@ -1088,10 +1160,10 @@ void FileDef::addIncludedUsingDirectives()
//printf("( FileDef::addIncludedUsingDirectives for file %s\n",name().data());
NamespaceList nl;
- if (includeList) // file contains #includes
+ if (m_includeList) // file contains #includes
{
{
- QListIterator<IncludeInfo> iii(*includeList);
+ QListIterator<IncludeInfo> iii(*m_includeList);
IncludeInfo *ii;
for (iii.toFirst();(ii=iii.current());++iii) // foreach #include...
{
@@ -1103,7 +1175,7 @@ void FileDef::addIncludedUsingDirectives()
}
}
{
- QListIterator<IncludeInfo> iii(*includeList);
+ QListIterator<IncludeInfo> iii(*m_includeList);
IncludeInfo *ii;
// iterate through list from last to first
for (iii.toLast();(ii=iii.current());--iii)
@@ -1111,7 +1183,7 @@ void FileDef::addIncludedUsingDirectives()
if (ii->fileDef && ii->fileDef!=this)
{
// add using directives
- NamespaceSDict *unl = ii->fileDef->usingDirList;
+ NamespaceSDict *unl = ii->fileDef->m_usingDirList;
if (unl)
{
NamespaceSDict::Iterator nli(*unl);
@@ -1119,17 +1191,17 @@ void FileDef::addIncludedUsingDirectives()
for (nli.toLast();(nd=nli.current());--nli)
{
// append each using directive found in a #include file
- if (usingDirList==0) usingDirList = new NamespaceSDict;
+ if (m_usingDirList==0) m_usingDirList = new NamespaceSDict;
//printf("Prepending used namespace %s to the list of file %s\n",
// nd->name().data(),name().data());
- if (usingDirList->find(nd->qualifiedName())==0) // not yet added
+ if (m_usingDirList->find(nd->qualifiedName())==0) // not yet added
{
- usingDirList->prepend(nd->qualifiedName(),nd);
+ m_usingDirList->prepend(nd->qualifiedName(),nd);
}
}
}
// add using declarations
- SDict<Definition> *udl = ii->fileDef->usingDeclList;
+ SDict<Definition> *udl = ii->fileDef->m_usingDeclList;
if (udl)
{
SDict<Definition>::Iterator udi(*udl);
@@ -1137,13 +1209,13 @@ void FileDef::addIncludedUsingDirectives()
for (udi.toLast();(d=udi.current());--udi)
{
//printf("Adding using declaration %s\n",d->name().data());
- if (usingDeclList==0)
+ if (m_usingDeclList==0)
{
- usingDeclList = new SDict<Definition>(17);
+ m_usingDeclList = new SDict<Definition>(17);
}
- if (usingDeclList->find(d->qualifiedName())==0)
+ if (m_usingDeclList->find(d->qualifiedName())==0)
{
- usingDeclList->prepend(d->qualifiedName(),d);
+ m_usingDeclList->prepend(d->qualifiedName(),d);
}
}
}
@@ -1160,13 +1232,13 @@ void FileDef::addIncludedByDependency(FileDef *fd,const char *incName,
{
//printf("FileDef::addIncludedByDependency(%p,%s,%d)\n",fd,incName,local);
QCString iName = fd ? fd->absFilePath().data() : incName;
- if (!iName.isEmpty() && (includedByDict==0 || includedByDict->find(iName)==0))
+ if (!iName.isEmpty() && (m_includedByDict==0 || m_includedByDict->find(iName)==0))
{
- if (includedByDict==0)
+ if (m_includedByDict==0)
{
- includedByDict = new QDict<IncludeInfo>(61);
- includedByList = new QList<IncludeInfo>;
- includedByList->setAutoDelete(TRUE);
+ m_includedByDict = new QDict<IncludeInfo>(61);
+ m_includedByList = new QList<IncludeInfo>;
+ m_includedByList->setAutoDelete(TRUE);
}
IncludeInfo *ii = new IncludeInfo;
ii->fileDef = fd;
@@ -1174,15 +1246,15 @@ void FileDef::addIncludedByDependency(FileDef *fd,const char *incName,
ii->local = local;
ii->imported = imported;
ii->indirect = FALSE;
- includedByList->append(ii);
- includedByDict->insert(iName,ii);
+ m_includedByList->append(ii);
+ m_includedByDict->insert(iName,ii);
}
}
bool FileDef::isIncluded(const QCString &name) const
{
if (name.isEmpty()) return FALSE;
- return includeDict!=0 && includeDict->find(name)!=0;
+ return m_includeDict!=0 && m_includeDict->find(name)!=0;
}
bool FileDef::generateSourceFile() const
@@ -1202,17 +1274,17 @@ bool FileDef::generateSourceFile() const
void FileDef::addListReferences()
{
{
- LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
- addRefItem(xrefItems.pointer(),
+ QList<ListItemInfo> *xrefItems = xrefListItems();
+ addRefItem(xrefItems,
getOutputFileBase(),
theTranslator->trFile(TRUE,TRUE),
getOutputFileBase(),name(),
0
);
}
- if (memberGroupSDict)
+ if (m_memberGroupSDict)
{
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+ MemberGroupSDict::Iterator mgli(*m_memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
@@ -1481,9 +1553,9 @@ void FileDef::combineUsingRelations()
{
if (visited) return; // already done
visited=TRUE;
- if (usingDirList)
+ if (m_usingDirList)
{
- NamespaceSDict::Iterator nli(*usingDirList);
+ NamespaceSDict::Iterator nli(*m_usingDirList);
NamespaceDef *nd;
for (nli.toFirst();(nd=nli.current());++nli)
{
@@ -1529,24 +1601,24 @@ bool FileDef::isDocumentationFile() const
void FileDef::acquireFileVersion()
{
QCString vercmd = Config_getString("FILE_VERSION_FILTER");
- if (!vercmd.isEmpty() && !filepath.isEmpty() && filepath!="generated")
+ if (!vercmd.isEmpty() && !m_filePath.isEmpty() && m_filePath!="generated")
{
- msg("Version of %s : ",filepath.data());
- QCString cmd = vercmd+" \""+filepath+"\"";
+ msg("Version of %s : ",m_filePath.data());
+ QCString cmd = vercmd+" \""+m_filePath+"\"";
Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",cmd.data());
FILE *f=portable_popen(cmd,"r");
if (!f)
{
- err("error: could not execute %s\n",vercmd.data());
+ err("could not execute %s\n",vercmd.data());
return;
}
const int bufSize=1024;
char buf[bufSize];
int numRead = (int)fread(buf,1,bufSize,f);
portable_pclose(f);
- if (numRead>0 && !(fileVersion=QCString(buf,numRead).stripWhiteSpace()).isEmpty())
+ if (numRead>0 && !(m_fileVersion=QCString(buf,numRead).stripWhiteSpace()).isEmpty())
{
- msg("%s\n",fileVersion.data());
+ msg("%s\n",m_fileVersion.data());
}
else
{
@@ -1560,11 +1632,11 @@ QCString FileDef::getSourceFileBase() const
{
if (Htags::useHtags)
{
- return Htags::path2URL(filepath);
+ return Htags::path2URL(m_filePath);
}
else
{
- return convertNameToFile(diskname)+"_source";
+ return convertNameToFile(m_diskName)+"_source";
}
}
@@ -1573,11 +1645,11 @@ QCString FileDef::includeName() const
{
if (Htags::useHtags)
{
- return Htags::path2URL(filepath);
+ return Htags::path2URL(m_filePath);
}
else
{
- return convertNameToFile(diskname)+"_source";
+ return convertNameToFile(m_diskName)+"_source";
}
}
@@ -1659,7 +1731,7 @@ void FileDef::writeMemberDeclarations(OutputList &ol,MemberListType lt,const QCS
}
else
{
- ml->writeDeclarations(ol,0,0,this,0,title,0);
+ ml->writeDeclarations(ol,0,0,this,0,title,0,definitionType());
}
}
}
@@ -1676,42 +1748,29 @@ bool FileDef::isLinkableInProject() const
return hasDocumentation() && !isReference() && showFiles;
}
-#if 0
-bool FileDef::includes(FileDef *incFile,QDict<FileDef> *includedFiles) const
+static void getAllIncludeFilesRecursively(
+ QDict<void> *filesVisited,const FileDef *fd,QStrList &incFiles)
{
- //printf("%s::includes(%s)\n",name().data(),incFile->name().data());
- if (incFile==this) return TRUE;
- includedFiles->insert(absFilePath(),this);
- if (includeList)
+ if (fd->includeFileList())
{
- QListIterator<IncludeInfo> ili(*includeList);
+ QListIterator<IncludeInfo> iii(*fd->includeFileList());
IncludeInfo *ii;
- for (;(ii=ili.current());++ili)
+ for (iii.toFirst();(ii=iii.current());++iii)
{
- //printf("ii=%s\n",ii->includeName.data());
- if ((ii->fileDef &&
- includedFiles->find(ii->fileDef->absFilePath())==0 &&
- ii->fileDef->includes(incFile,includedFiles)
- ) ||
- incFile->absFilePath()==ii->includeName
- ) return TRUE;
+ if (ii->fileDef && !ii->fileDef->isReference() &&
+ !filesVisited->find(ii->fileDef->absFilePath()))
+ {
+ //printf("FileDef::addIncludeDependency(%s)\n",ii->fileDef->absFilePath().data());
+ incFiles.append(ii->fileDef->absFilePath());
+ filesVisited->insert(ii->fileDef->absFilePath(),(void*)0x8);
+ getAllIncludeFilesRecursively(filesVisited,ii->fileDef,incFiles);
+ }
}
}
- return FALSE;
}
-bool FileDef::includesByName(const QCString &fileName) const
+void FileDef::getAllIncludeFilesRecursively(QStrList &incFiles) const
{
- if (includeList)
- {
- QListIterator<IncludeInfo> ili(*includeList);
- IncludeInfo *ii;
- for (;(ii=ili.current());++ili)
- {
- //printf("ii=%s\n",ii->includeName.data());
- if (fileName==ii->includeName) return TRUE;
- }
- }
- return FALSE;
+ QDict<void> includes(257);
+ ::getAllIncludeFilesRecursively(&includes,this,incFiles);
}
-#endif
diff --git a/src/filedef.h b/src/filedef.h
index adf0f49..f6e5bad 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -69,20 +69,22 @@ class FileDef : public Definition
FileDef(const char *p,const char *n,const char *ref=0,const char *dn=0);
~FileDef();
+
+ // ----------------------------------------------------------------------
+
DefType definitionType() const { return TypeFile; }
/*! Returns the unique file name (this may include part of the path). */
QCString name() const;
QCString displayName(bool=TRUE) const { return name(); }
- QCString fileName() const { return filename; }
+ QCString fileName() const { return m_fileName; }
QCString getOutputFileBase() const
- { return convertNameToFile(diskname); }
- QCString anchor() const
- { return QCString(); }
+ { return convertNameToFile(m_diskName); }
- QCString getFileBase() const
- { return diskname; }
+ QCString anchor() const { return QCString(); }
+
+ QCString getFileBase() const { return m_diskName; }
QCString getSourceFileBase() const;
@@ -90,59 +92,71 @@ class FileDef : public Definition
QCString includeName() const;
/*! Returns the absolute path including the file name. */
- QCString absFilePath() const { return filepath; }
-
+ QCString absFilePath() const { return m_filePath; }
/*! Returns the name as it is used in the documentation */
- QCString docName() const { return docname; }
-
- void addSourceRef(int line,Definition *d,MemberDef *md);
- Definition *getSourceDefinition(int lineNr);
- MemberDef *getSourceMember(int lineNr);
+ QCString docName() const { return m_docname; }
- /* Sets the name of the include file to \a n. */
- //void setIncludeName(const char *n_) { incName=n_; }
+ /*! Returns TRUE if this file is a source file. */
+ bool isSource() const { return m_isSource; }
+
+ bool isDocumentationFile() const;
+ Definition *getSourceDefinition(int lineNr) const;
+ MemberDef *getSourceMember(int lineNr) const;
+
/*! Returns the absolute path of this file. */
- QCString getPath() const { return path; }
+ QCString getPath() const { return m_path; }
/*! Returns version of this file. */
- QCString getVersion() const { return fileVersion; }
+ QCString getVersion() const { return m_fileVersion; }
bool isLinkableInProject() const;
- bool isLinkable() const
- {
- return isLinkableInProject() || isReference();
- }
+ bool isLinkable() const { return isLinkableInProject() || isReference(); }
bool isIncluded(const QCString &name) const;
- //bool isJava() const { return m_isJava; }
- //bool isCSharp() const { return m_isCSharp; }
+ PackageDef *packageDef() const { return m_package; }
+ DirDef *getDirDef() const { return m_dir; }
+ NamespaceSDict *getUsedNamespaces() const;
+ SDict<Definition> *getUsedClasses() const { return m_usingDeclList; }
+ QList<IncludeInfo> *includeFileList() const { return m_includeList; }
+ QList<IncludeInfo> *includedByFileList() const { return m_includedByList; }
+ void getAllIncludeFilesRecursively(QStrList &incFiles) const;
+
+ MemberList *getMemberList(MemberListType lt) const;
+ const QList<MemberList> &getMemberLists() const { return m_memberLists; }
+
+ /* user defined member groups */
+ MemberGroupSDict *getMemberGroupSDict() const { return m_memberGroupSDict; }
+ NamespaceSDict *getNamespaceSDict() const { return m_namespaceSDict; }
+ ClassSDict *getClassSDict() const { return m_classSDict; }
+
+ //---------------------------------
+
+ void addSourceRef(int line,Definition *d,MemberDef *md);
void writeDocumentation(OutputList &ol);
void writeMemberPages(OutputList &ol);
void writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const;
void writeSummaryLinks(OutputList &ol);
- void writeSource(OutputList &ol);
- void parseSource();
+ void startParsing();
+ void writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu);
+ void parseSource(bool sameTu,QStrList &filesInSameTu);
+ void finishParsing();
+
friend void generatedFileNames();
void insertMember(MemberDef *md);
void insertClass(ClassDef *cd);
void insertNamespace(NamespaceDef *nd);
void computeAnchors();
- void setPackageDef(PackageDef *pd) { package=pd; }
- PackageDef *packageDef() const { return package; }
-
- void setDirDef(DirDef *dd) { dir=dd; }
- DirDef *getDirDef() const { return dir; }
+ void setPackageDef(PackageDef *pd) { m_package=pd; }
+ void setDirDef(DirDef *dd) { m_dir=dd; }
void addUsingDirective(NamespaceDef *nd);
- NamespaceSDict *getUsedNamespaces() const;
void addUsingDeclaration(Definition *def);
- SDict<Definition> *getUsedClasses() const { return usingDeclList; }
void combineUsingRelations();
bool generateSourceFile() const;
@@ -150,8 +164,6 @@ class FileDef : public Definition
void addIncludeDependency(FileDef *fd,const char *incName,bool local,bool imported,bool indirect);
void addIncludedByDependency(FileDef *fd,const char *incName,bool local,bool imported);
- QList<IncludeInfo> *includeFileList() const { return includeList; }
- QList<IncludeInfo> *includedByFileList() const { return includedByList; }
void addMembersToMemberGroup();
void distributeMemberGroupDocumentation();
@@ -159,18 +171,8 @@ class FileDef : public Definition
void addIncludedUsingDirectives();
void addListReferences();
- bool isDocumentationFile() const;
//bool includes(FileDef *incFile,QDict<FileDef> *includedFiles) const;
//bool includesByName(const QCString &name) const;
-
- MemberList *getMemberList(MemberListType lt) const;
- const QList<MemberList> &getMemberLists() const { return m_memberLists; }
-
- /* user defined member groups */
- MemberGroupSDict *getMemberGroupSDict() const { return memberGroupSDict; }
- NamespaceSDict *getNamespaceSDict() const { return namespaceSDict; }
- ClassSDict *getClassSDict() const { return classSDict; }
-
bool visited;
protected:
@@ -190,7 +192,8 @@ class FileDef : public Definition
void writeMemberGroups(OutputList &ol);
void writeAuthorSection(OutputList &ol);
void writeSourceLink(OutputList &ol);
- void writeNamespaceDeclarations(OutputList &ol,const QCString &title);
+ void writeNamespaceDeclarations(OutputList &ol,const QCString &title,
+ bool isConstantGroup);
void writeClassDeclarations(OutputList &ol,const QCString &title);
void writeInlineClasses(OutputList &ol);
void startMemberDeclarations(OutputList &ol);
@@ -200,27 +203,27 @@ class FileDef : public Definition
void writeDetailedDescription(OutputList &ol,const QCString &title);
void writeBriefDescription(OutputList &ol);
- QDict<IncludeInfo> *includeDict;
- QList<IncludeInfo> *includeList;
- QDict<IncludeInfo> *includedByDict;
- QList<IncludeInfo> *includedByList;
- NamespaceSDict *usingDirList;
- SDict<Definition> *usingDeclList;
- QCString path;
- QCString filepath;
- QCString diskname;
- QCString filename;
- QCString docname;
- QIntDict<Definition> *srcDefDict;
- QIntDict<MemberDef> *srcMemberDict;
- bool isSource;
- QCString fileVersion;
- PackageDef *package;
- DirDef *dir;
+ QDict<IncludeInfo> *m_includeDict;
+ QList<IncludeInfo> *m_includeList;
+ QDict<IncludeInfo> *m_includedByDict;
+ QList<IncludeInfo> *m_includedByList;
+ NamespaceSDict *m_usingDirList;
+ SDict<Definition> *m_usingDeclList;
+ QCString m_path;
+ QCString m_filePath;
+ QCString m_diskName;
+ QCString m_fileName;
+ QCString m_docname;
+ QIntDict<Definition> *m_srcDefDict;
+ QIntDict<MemberDef> *m_srcMemberDict;
+ bool m_isSource;
+ QCString m_fileVersion;
+ PackageDef *m_package;
+ DirDef *m_dir;
QList<MemberList> m_memberLists;
- MemberGroupSDict *memberGroupSDict;
- NamespaceSDict *namespaceSDict;
- ClassSDict *classSDict;
+ MemberGroupSDict *m_memberGroupSDict;
+ NamespaceSDict *m_namespaceSDict;
+ ClassSDict *m_classSDict;
bool m_subGrouping;
};
@@ -236,7 +239,7 @@ class FileList : public QList<FileDef>
{
FileDef *md1 = (FileDef *)item1;
FileDef *md2 = (FileDef *)item2;
- return stricmp(md1->name(),md2->name());
+ return qstricmp(md1->name(),md2->name());
}
private:
QCString m_pathName;
@@ -251,7 +254,7 @@ class OutputNameList : public QList<FileList>
{
FileList *fl1 = (FileList *)item1;
FileList *fl2 = (FileList *)item2;
- return stricmp(fl1->path(),fl2->path());
+ return qstricmp(fl1->path(),fl2->path());
}
};
diff --git a/src/filename.cpp b/src/filename.cpp
index 2b0dffe..da0dccc 100644
--- a/src/filename.cpp
+++ b/src/filename.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -48,7 +48,7 @@ void FileName::generateDiskNames()
while (fd && fd->isReference()) fd=next();
// name if unique, so diskname is simply the name
//printf("!!!!!!!! Unique disk name=%s for fd=%s\n",name.data(),fd->diskname.data());
- fd->diskname=name.copy();
+ fd->m_diskName=name;
}
else if (count>1) // multiple occurrences of the same file name
{
@@ -59,7 +59,7 @@ void FileName::generateDiskNames()
{
fd=first();
while (fd && fd->isReference()) fd=next();
- char c=fd->path.at(i);
+ char c=fd->m_path.at(i);
if (c=='/') j=i; // remember last position of dirname
fd=next();
while (fd && !found)
@@ -67,13 +67,13 @@ void FileName::generateDiskNames()
if (!fd->isReference())
{
//printf("i=%d j=%d fd->path=`%s' fd->name=`%s'\n",i,j,fd->path.left(i).data(),fd->name().data());
- if (i==(int)fd->path.length())
+ if (i==(int)fd->m_path.length())
{
- //warning("Warning: Input file %s found multiple times!\n"
+ //warning("Input file %s found multiple times!\n"
// " The generated documentation for this file may not be correct!\n",fd->absFilePath().data());
found=TRUE;
}
- else if (fd->path[i]!=c)
+ else if (fd->m_path[i]!=c)
{
found=TRUE;
}
@@ -88,10 +88,10 @@ void FileName::generateDiskNames()
//printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data());
if (!fd->isReference())
{
- QCString prefix = fd->path.right(fd->path.length()-j-1);
+ QCString prefix = fd->m_path.right(fd->m_path.length()-j-1);
fd->setName(prefix+name);
//printf("!!!!!!!! non unique disk name=%s for fd=%s\n",(prefix+name).data(),fd->diskname.data());
- fd->diskname=prefix+name;
+ fd->m_diskName=prefix+name;
}
fd=next();
}
@@ -102,7 +102,7 @@ int FileName::compareItems(QCollection::Item item1, QCollection::Item item2)
{
FileName *f1=(FileName *)item1;
FileName *f2=(FileName *)item2;
- return stricmp(f1->fileName(),f2->fileName());
+ return qstricmp(f1->fileName(),f2->fileName());
}
FileNameIterator::FileNameIterator(const FileName &fname) :
@@ -135,8 +135,8 @@ int FileNameList::compareItems(QCollection::Item item1, QCollection::Item item2)
//printf("FileNameList::compareItems `%s'<->`%s'\n",
// f1->fileName(),f2->fileName());
return Config_getBool("FULL_PATH_NAMES") ?
- stricmp(f1->fullName(),f2->fullName()) :
- stricmp(f1->fileName(),f2->fileName());
+ qstricmp(f1->fullName(),f2->fullName()) :
+ qstricmp(f1->fileName(),f2->fileName());
}
FileNameListIterator::FileNameListIterator(const FileNameList &fnlist) :
diff --git a/src/filename.h b/src/filename.h
index e038659..1cd160c 100644
--- a/src/filename.h
+++ b/src/filename.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/filestorage.h b/src/filestorage.h
index ddffeda..a6ee5b4 100644
--- a/src/filestorage.h
+++ b/src/filestorage.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/footer.html b/src/footer.html
index 80222ad..d2aa9e6 100644
--- a/src/footer.html
+++ b/src/footer.html
@@ -5,14 +5,14 @@
$navpath
<li class="footer">$generatedby
<a href="http://www.doxygen.org/index.html">
- <img class="footer" src="$relpath$doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
+ <img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
</ul>
</div>
<!--END GENERATE_TREEVIEW-->
<!--BEGIN !GENERATE_TREEVIEW-->
<hr class="footer"/><address class="footer"><small>
$generatedby &#160;<a href="http://www.doxygen.org/index.html">
-<img class="footer" src="$relpath$doxygen.png" alt="doxygen"/>
+<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/>
</a> $doxygenversion
</small></address>
<!--END !GENERATE_TREEVIEW-->
diff --git a/src/footer_html.h b/src/footer_html.h
index b193c41..2891692 100644
--- a/src/footer_html.h
+++ b/src/footer_html.h
@@ -5,14 +5,14 @@
" $navpath\n"
" <li class=\"footer\">$generatedby\n"
" <a href=\"http://www.doxygen.org/index.html\">\n"
-" <img class=\"footer\" src=\"$relpath$doxygen.png\" alt=\"doxygen\"/></a> $doxygenversion </li>\n"
+" <img class=\"footer\" src=\"$relpath^doxygen.png\" alt=\"doxygen\"/></a> $doxygenversion </li>\n"
" </ul>\n"
"</div>\n"
"<!--END GENERATE_TREEVIEW-->\n"
"<!--BEGIN !GENERATE_TREEVIEW-->\n"
"<hr class=\"footer\"/><address class=\"footer\"><small>\n"
"$generatedby &#160;<a href=\"http://www.doxygen.org/index.html\">\n"
-"<img class=\"footer\" src=\"$relpath$doxygen.png\" alt=\"doxygen\"/>\n"
+"<img class=\"footer\" src=\"$relpath^doxygen.png\" alt=\"doxygen\"/>\n"
"</a> $doxygenversion\n"
"</small></address>\n"
"<!--END !GENERATE_TREEVIEW-->\n"
diff --git a/src/formula.cpp b/src/formula.cpp
index a1f2328..0d3c4cd 100644
--- a/src/formula.cpp
+++ b/src/formula.cpp
@@ -1,7 +1,7 @@
/******************************************************************************
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -53,7 +53,7 @@ void FormulaList::generateBitmaps(const char *path)
int x1,y1,x2,y2;
QDir d(path);
// store the original directory
- if (!d.exists()) { err("error: Output dir %s does not exist!\n",path); exit(1); }
+ if (!d.exists()) { err("Output dir %s does not exist!\n",path); exit(1); }
QCString oldDir = QDir::currentDirPath().utf8();
// go to the html output directory (i.e. path)
QDir::setCurrent(d.absPath());
@@ -149,7 +149,7 @@ void FormulaList::generateBitmaps(const char *path)
}
else
{
- err("error: Couldn't extract bounding box!\n");
+ err("Couldn't extract bounding box!\n");
}
}
// next we generate a postscript file which contains the eps
@@ -207,7 +207,7 @@ void FormulaList::generateBitmaps(const char *path)
if (!t.eof())
s=t.readLine().utf8();
if (s.length()<2 || s.left(2)!="P6")
- err("error: ghostscript produced an illegal image format!");
+ err("ghostscript produced an illegal image format!");
else
{
// assume the size is after the first line that does not start with
diff --git a/src/formula.h b/src/formula.h
index 553ee77..79821bf 100644
--- a/src/formula.h
+++ b/src/formula.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/fortrancode.h b/src/fortrancode.h
index 45b3333..4b709c5 100644
--- a/src/fortrancode.h
+++ b/src/fortrancode.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -21,6 +21,8 @@
class CodeOutputInterface;
class FileDef;
class MemberDef;
+class QCString;
+class Definition;
void parseFortranCode(CodeOutputInterface &,const char *,const QCString &,
bool ,const char *,FileDef *fd,
diff --git a/src/fortrancode.l b/src/fortrancode.l
index b598b73..203a2ed 100644
--- a/src/fortrancode.l
+++ b/src/fortrancode.l
@@ -50,9 +50,27 @@
#include "filedef.h"
#include "namespacedef.h"
+// Toggle for some debugging info
+//#define DBG_CTX(x) fprintf x
+#define DBG_CTX(x) do { } while(0)
+
#define YY_NEVER_INTERACTIVE 1
#define YY_NO_TOP_STATE 1
#define YY_NO_INPUT 1
+
+/*
+ * For fixed formatted code position 6 is of importance (continuation character).
+ * The following variables and macros keep track of the column number
+ * YY_USER_ACTION is always called for each scan action
+ * YY_FTN_REST is used to handle end of lines and reset the column counter
+ * YY_FTN_REJECT resets the column counters when a pattern is rejected and thus rescanned.
+ */
+int yy_old_start = 0;
+int yy_my_start = 0;
+int yy_end = 1;
+#define YY_USER_ACTION {yy_old_start = yy_my_start; yy_my_start = yy_end; yy_end += yyleng;}
+#define YY_FTN_RESET {yy_old_start = 0; yy_my_start = 0; yy_end = 1;}
+#define YY_FTN_REJECT {yy_end = yy_my_start; yy_my_start = yy_old_start; REJECT;}
//--------------------------------------------------------------------------------
@@ -350,6 +368,16 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol,
}
}
+#if 0
+static QCString fileLocation()
+{
+ QCString result = g_sourceFileDef?g_sourceFileDef->absFilePath():QCString("[unknown]");
+ result+=":"+QCString().setNum(g_yyLineNr);
+ result+=":"+QCString().setNum(1);
+ return result;
+}
+
+
/**
generates dictionay entries that are used if REFERENCED_BY_RELATION ... options are set
(e.g. the "referenced by ..." list after the function documentation)
@@ -362,13 +390,14 @@ static void addDocCrossReference(MemberDef *src, MemberDef *dst)
if ((Config_getBool("REFERENCED_BY_RELATION") || Config_getBool("CALLER_GRAPH")) &&
(src->isFunction()))
{
- dst->addSourceReferencedBy(src);
+ dst->addSourceReferencedBy(src,fileLocation());
}
if ((Config_getBool("REFERENCES_RELATION") || Config_getBool("CALL_GRAPH")) && (src->isFunction()))
{
- src->addSourceReferences(dst);
+ src->addSourceReferences(dst,fileLocation());
}
}
+#endif
//-------------------------------------------------------------------------------
/**
@@ -530,8 +559,6 @@ static bool getLink(UseSDict *usedict, // dictonary with used modules
{
addDocCrossReference(g_currentMemberDef,md);
}
- ol.linkableSymbol(g_yyLineNr,md->name(),md,
- g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(ol,md->getReference(),
md->getOutputFileBase(),
md->anchor(),
@@ -560,7 +587,6 @@ static void generateLink(CodeOutputInterface &ol, char *lname)
}
else
{ // write type or interface link
- ol.linkableSymbol(g_yyLineNr, tmp, cd, g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),tmp);
addToSearchIndex(tmp.data());
}
@@ -573,7 +599,6 @@ static void generateLink(CodeOutputInterface &ol, char *lname)
else
{
// nothing found, just write out the word
- ol.linkableSymbol(g_yyLineNr, tmp, 0, g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
//startFontClass("charliteral"); //test
codifyLines(tmp);
//endFontClass(); //test
@@ -605,7 +630,7 @@ static int countLines()
/** start scope */
static void startScope()
{
- // fprintf(stderr, "===> startScope %s",yytext);
+ DBG_CTX((stderr, "===> startScope %s",yytext));
Scope *scope = new Scope;
scopeStack.append(scope);
}
@@ -613,10 +638,10 @@ static void startScope()
/** end scope */
static void endScope()
{
- // fprintf(stderr,"===> endScope %s",yytext);
+ DBG_CTX((stderr,"===> endScope %s",yytext));
if (scopeStack.isEmpty())
{
- //fprintf(stderr,"WARNING: fortrancode.l: stack empty!\n");
+ DBG_CTX((stderr,"WARNING: fortrancode.l: stack empty!\n"));
return;
}
@@ -680,8 +705,8 @@ CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS}))
TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}COMPLEX|DOUBLE{BS_}PRECISION|{CHAR})
INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")"
-ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|ELEMENTAL)
-ACCESS_SPEC (PRIVATE|PUBLIC)
+ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|ELEMENTAL)
+ACCESS_SPEC (PROTECTED|PRIVATE|PUBLIC)
/* Assume that attribute statements are almost the same as attributes. */
ATTR_STMT {ATTR_SPEC}|DIMENSION
FLOW (DO|SELECT|CASE|WHERE|IF|THEN|ELSE|WHILE|FORALL|ELSEWHERE|ELSEIF|RETURN|CONTINUE|EXIT)
@@ -729,6 +754,10 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
endFontClass();
}
<Start>{FLOW}/[,( \t\n].* {
+ if (g_isFixedForm)
+ {
+ if ((yy_my_start == 1) && ((yytext[0] == 'c') || (yytext[0] == 'C'))) YY_FTN_REJECT;
+ }
/* font class is defined e.g. in doxygen.css */
startFontClass("keywordflow");
codifyLines(yytext);
@@ -777,7 +806,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
BEGIN(UseOnly);
}
<UseOnly>{BS},{BS} { codifyLines(yytext); }
-<UseOnly>{BS}&{BS}"\n" { codifyLines(yytext); }
+<UseOnly>{BS}&{BS}"\n" { codifyLines(yytext); YY_FTN_RESET}
<UseOnly>{ID} {
g_insideBody=TRUE;
generateLink(*g_code, yytext);
@@ -786,7 +815,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
}
<Use,UseOnly>"\n" {
unput(*yytext);
- yy_pop_state();
+ yy_pop_state();YY_FTN_RESET
}
/*-------- fortran module -----------------------------------------*/
@@ -797,7 +826,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
endFontClass();
yy_push_state(YY_START);
BEGIN(ClassName);
- if (!stricmp(yytext,"module")) currentModule="module";
+ if (!qstricmp(yytext,"module")) currentModule="module";
}
<ClassName>{ID} {
if (currentModule == "module")
@@ -810,11 +839,11 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
}
<ClassName>\n { // interface may be without name
yy_pop_state();
- REJECT;
+ YY_FTN_REJECT;
}
<Start>"end"({BS_}"module").* { // just reset currentModule, rest is done in following rule
currentModule=0;
- REJECT;
+ YY_FTN_REJECT;
}
/*-------- subprog definition -------------------------------------*/
<Start>({PREFIX}{BS_})?{TYPE_SPEC}{BS_}({PREFIX}{BS_})?{BS}/{SUBPROG}{BS_} { // TYPE_SPEC is for old function style function result
@@ -830,7 +859,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
BEGIN(Subprog);
}
<Subprog>{ID} { // subroutine/function name
- // fprintf(stderr, "===> start subprogram %s\n", yytext);
+ DBG_CTX((stderr, "===> start subprogram %s\n", yytext));
startScope();
generateLink(*g_code,yytext);
}
@@ -839,6 +868,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
}
<Subprog,Subprogend>"\n" { codifyLines(yytext);
yy_pop_state();
+ YY_FTN_RESET
}
<Start>^{BS}"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"type"|"interface"){BS} { // Fortran subroutine or function ends
//cout << "===> end function " << yytext << endl;
@@ -926,11 +956,13 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
codifyLines(yytext);
bracketCount = 0;
yy_pop_state();
+ YY_FTN_RESET
}
<Declaration>"\n" { // end declaration line
codifyLines(yytext);
bracketCount = 0;
yy_pop_state();
+ YY_FTN_RESET
}
/*-------- subprog calls -----------------------------------------*/
@@ -954,6 +986,14 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
/*-------- comments ---------------------------------------------------*/
<Start>\n?{BS}"!>"|"!<" { // start comment line or comment block
+ if (yytext[0] == '\n')
+ {
+ yy_old_start = 0;
+ yy_my_start = 1;
+ yy_end = yyleng;
+ }
+ // Actually we should see if ! on position 6, can be continuation
+ // but the chance is very unlikely, so no effort to solve it here
yy_push_state(YY_START);
BEGIN(DocBlock);
docBlock=yytext;
@@ -967,7 +1007,12 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
<DocBlock>.* { // contents of current comment line
docBlock+=yytext;
}
-<DocBlock>"\n"{BS}("!>"|"!<"|"!!") { //| comment block (next line is also comment line)
+<DocBlock>"\n"{BS}("!>"|"!<"|"!!") { // comment block (next line is also comment line)
+ yy_old_start = 0;
+ yy_my_start = 1;
+ yy_end = yyleng;
+ // Actually we should see if ! on position 6, can be continuation
+ // but the chance is very unlikely, so no effort to solve it here
docBlock+=yytext;
}
<DocBlock>"\n" { // comment block ends at the end of this line
@@ -989,17 +1034,19 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
endFontClass();
}
yy_pop_state();
+ YY_FTN_RESET
}
<*>"!"[^><\n].*|"!"$ { // normal comment
- if(YY_START == String) REJECT; // ignore in strings
+ if(YY_START == String) YY_FTN_REJECT; // ignore in strings
+ if (g_isFixedForm && yy_my_start == 6) YY_FTN_REJECT;
startFontClass("comment");
codifyLines(yytext);
endFontClass();
}
<*>^[Cc*].* { // normal comment
- if(! g_isFixedForm) REJECT;
+ if(! g_isFixedForm) YY_FTN_REJECT;
startFontClass("comment");
codifyLines(yytext);
@@ -1007,9 +1054,12 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
}
/*------ preprocessor --------------------------------------------*/
-<Start>"#".*\n { startFontClass("preprocessor");
+<Start>"#".*\n {
+ if (g_isFixedForm && yy_my_start == 6) YY_FTN_REJECT;
+ startFontClass("preprocessor");
codifyLines(yytext);
endFontClass();
+ YY_FTN_RESET
}
/*------ variable references? -------------------------------------*/
@@ -1031,9 +1081,10 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
codifyLines(str);
endFontClass();
str = "";
+ YY_FTN_RESET
}
<String>\"|\' { // string ends with next quote without previous backspace
- if(yytext[0]!=stringStartSymbol) REJECT; // single vs double quote
+ if(yytext[0]!=stringStartSymbol) YY_FTN_REJECT; // single vs double quote
str+=yytext;
startFontClass("stringliteral");
codifyLines(str);
@@ -1043,7 +1094,8 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
<String>. {str+=yytext;}
<*>\"|\' { /* string starts */
- /* if(YY_START == StrIgnore) REJECT; // ignore in simple comments */
+ /* if(YY_START == StrIgnore) YY_FTN_REJECT; // ignore in simple comments */
+ if (g_isFixedForm && yy_my_start == 6) YY_FTN_REJECT;
yy_push_state(YY_START);
stringStartSymbol=yytext[0]; // single or double quote
BEGIN(String);
@@ -1053,6 +1105,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
<*>\n {
codifyLines(yytext);
+ YY_FTN_RESET
}
<*>. {
g_code->codify(yytext);
diff --git a/src/fortranscanner.h b/src/fortranscanner.h
index d904b87..c70f948 100644
--- a/src/fortranscanner.h
+++ b/src/fortranscanner.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -28,9 +28,13 @@ class FortranLanguageScanner : public ParserInterface
{
public:
virtual ~FortranLanguageScanner() {}
+ void startTranslationUnit(const char *) {}
+ void finishTranslationUnit() {}
void parseInput(const char *fileName,
const char *fileBuf,
- Entry *root);
+ Entry *root,
+ bool sameTranslationUnit,
+ QStrList &filesInSameTranslationUnit);
bool needsPreprocessing(const QCString &extension);
void parseCode(CodeOutputInterface &codeOutIntf,
const char *scopeName,
diff --git a/src/fortranscanner.l b/src/fortranscanner.l
index 3a7a8c1..eae6d6e 100644
--- a/src/fortranscanner.l
+++ b/src/fortranscanner.l
@@ -65,6 +65,10 @@
#include "pre.h"
#include "arguments.h"
+// Toggle for some debugging info
+//#define DBG_CTX(x) fprintf x
+#define DBG_CTX(x) do { } while(0)
+
#define YY_NEVER_INTERACTIVE 1
#define YY_NO_INPUT 1
@@ -82,6 +86,7 @@ struct SymbolModifiers {
Protection protection;
Direction direction;
bool optional;
+ bool protect;
QCString dimension;
bool allocatable;
bool external;
@@ -97,7 +102,7 @@ struct SymbolModifiers {
QCString passVar;
SymbolModifiers() : type(), returnName(), protection(NONE_P), direction(NONE_D),
- optional(FALSE), dimension(), allocatable(FALSE),
+ optional(FALSE), protect(FALSE), dimension(), allocatable(FALSE),
external(FALSE), intrinsic(FALSE), parameter(FALSE),
pointer(FALSE), target(FALSE), save(FALSE), deferred(FALSE), nonoverridable(FALSE),
nopass(FALSE), pass(FALSE), passVar() {}
@@ -141,9 +146,9 @@ struct CommentInPrepass {
};
static QList<CommentInPrepass> comments;
-#define MAX_INCLUDE_DEPTH 10
-YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
+YY_BUFFER_STATE *include_stack = NULL;
int include_stack_ptr = 0;
+int include_stack_cnt = 0;
static QFile inputFile;
static QCString yyFileName;
@@ -252,7 +257,7 @@ CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS}))
TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}COMPLEX|DOUBLE{BS_}PRECISION|{CHAR}|TYPE{ARGS}|CLASS{ARGS}|PROCEDURE{ARGS}?)
INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")"
-ATTR_SPEC (ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PRIVATE|PUBLIC|SAVE|TARGET|NOPASS|PASS{ARGS}?|DEFERRED|NON_OVERRIDABLE)
+ATTR_SPEC (ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|NOPASS|PASS{ARGS}?|DEFERRED|NON_OVERRIDABLE)
ACCESS_SPEC (PRIVATE|PUBLIC)
LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")"
/* Assume that attribute statements are almost the same as attributes. */
@@ -309,7 +314,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
<*>^.*\n { // prepass: look for line continuations
functionLine = FALSE;
- //fprintf(stderr, "---%s", yytext);
+ DBG_CTX((stderr, "---%s", yytext));
int indexStart = getAmpersandAtTheStart(yytext, (int)yyleng);
int indexEnd = getAmpOrExclAtTheEnd(yytext, (int)yyleng);
@@ -391,11 +396,11 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
yy_push_state(YY_START);
BEGIN(StrIgnore);
debugStr="*!";
- //fprintf(stderr,"start comment %d\n",yyLineNr);
+ DBG_CTX((stderr,"start comment %d\n",yyLineNr));
}
}
<StrIgnore>.?/\n { yy_pop_state(); // comment ends with endline character
- //fprintf(stderr,"end comment %d %s\n",yyLineNr,debugStr.data());
+ DBG_CTX((stderr,"end comment %d %s\n",yyLineNr,debugStr.data()));
} // comment line ends
<StrIgnore>. { debugStr+=yytext; }
@@ -411,7 +416,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
yy_push_state(Use);
}
<Use>{ID} {
- //fprintf(stderr,"using dir %s\n",yytext);
+ DBG_CTX((stderr,"using dir %s\n",yytext));
current->name=yytext;
current->fileName = yyFileName;
current->section=Entry::USINGDIR_SEC;
@@ -716,7 +721,7 @@ private {
{ATTR_STMT}/{BS_}{ID} |
{ATTR_STMT}/{BS}"::" {
/* attribute statement starts */
- //fprintf(stderr,"5=========> Attribute statement: %s\n", yytext);
+ DBG_CTX((stderr,"5=========> Attribute statement: %s\n", yytext));
QCString tmp = yytext;
currentModifiers |= tmp.stripWhiteSpace();
argType="";
@@ -882,11 +887,13 @@ private {
pushBuffer(inputStringSemi);
}
+<Initialization,ArrayInitializer>"[" |
<Initialization,ArrayInitializer>"(/" { initializer+=yytext;
initializerArrayScope++;
BEGIN(ArrayInitializer); // initializer may contain comma
}
-<ArrayInitializer>"/)" { initializer+=yytext;
+<ArrayInitializer>"]" |
+<ArrayInitializer>"/)" { initializer+=yytext;
initializerArrayScope--;
if(initializerArrayScope<=0)
{
@@ -1106,7 +1113,7 @@ private {
<*><<EOF>> {
if ( include_stack_ptr <= 0 ) {
if (YY_START!=INITIAL && YY_START!=Start) {
- //fprintf(stderr,"==== Error: EOF reached in wrong state (end missing)");
+ DBG_CTX((stderr,"==== Error: EOF reached in wrong state (end missing)"));
scanner_abort();
}
yyterminate();
@@ -1393,20 +1400,20 @@ static const char* prepassFixedForm(const char* contents)
static void pushBuffer(QCString& buffer)
{
- if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
+ if (include_stack_cnt <= include_stack_ptr)
{
- fprintf( stderr, "Stack buffers nested too deeply" );
- exit( 1 );
+ include_stack_cnt++;
+ include_stack = (YY_BUFFER_STATE *)realloc(include_stack, include_stack_cnt * sizeof(YY_BUFFER_STATE));
}
include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER;
yy_switch_to_buffer(yy_scan_string(buffer));
- //fprintf(stderr, "--PUSH--%s", (const char *)buffer);
+ DBG_CTX((stderr, "--PUSH--%s", (const char *)buffer));
buffer = NULL;
}
static void popBuffer() {
- //fprintf(stderr, "--POP--");
+ DBG_CTX((stderr, "--POP--"));
include_stack_ptr --;
yy_delete_buffer( YY_CURRENT_BUFFER );
yy_switch_to_buffer( include_stack[include_stack_ptr] );
@@ -1488,6 +1495,7 @@ SymbolModifiers& SymbolModifiers::operator|=(const SymbolModifiers &mdfs)
allocatable |= mdfs.allocatable;
external |= mdfs.external;
intrinsic |= mdfs.intrinsic;
+ protect |= mdfs.protect;
parameter |= mdfs.parameter;
pointer |= mdfs.pointer;
target |= mdfs.target;
@@ -1527,6 +1535,10 @@ SymbolModifiers& SymbolModifiers::operator|=(QCString mdfString)
{
newMdf.protection = SymbolModifiers::PRIVATE;
}
+ else if (mdfString=="protected")
+ {
+ newMdf.protect = TRUE;
+ }
else if (mdfString=="optional")
{
newMdf.optional = TRUE;
@@ -1717,6 +1729,11 @@ static QCString applyModifiers(QCString typeName, SymbolModifiers& mdfs)
if (!typeName.isEmpty()) typeName += ", ";
typeName += "private";
}
+ if (mdfs.protect)
+ {
+ if (!typeName.isEmpty()) typeName += ", ";
+ typeName += "protected";
+ }
return typeName;
}
@@ -1917,7 +1934,7 @@ static int max(int a, int b) {return a>b?a:b;}
static void addModule(const char *name, bool isModule)
{
- //fprintf(stderr, "0=========> got module %s\n", name);
+ DBG_CTX((stderr, "0=========> got module %s\n", name));
if (isModule)
current->section = Entry::CLASS_SEC;
@@ -1947,7 +1964,7 @@ static void addModule(const char *name, bool isModule)
static void addSubprogram(const char *text)
{
- //fprintf(stderr,"1=========> got subprog, type: %s\n",text);
+ DBG_CTX((stderr,"1=========> got subprog, type: %s\n",text));
subrCurrent.prepend(current);
current->section = Entry::FUNCTION_SEC ;
QCString subtype = text; subtype=subtype.lower().stripWhiteSpace();
@@ -2055,7 +2072,7 @@ static void handleCommentBlock(const QCString &doc,bool brief)
static bool hideInBodyDocs = Config_getBool("HIDE_IN_BODY_DOCS");
int position=0;
if (docBlockInBody && hideInBodyDocs) return;
- //fprintf(stderr,"call parseCommentBlock [%s]\n",doc.data());
+ DBG_CTX((stderr,"call parseCommentBlock [%s]\n",doc.data()));
int lineNr = brief ? current->briefLine : current->docLine;
while (parseCommentBlock(
g_thisParser,
@@ -2071,10 +2088,10 @@ static void handleCommentBlock(const QCString &doc,bool brief)
needsEntry
))
{
- //fprintf(stderr,"parseCommentBlock position=%d [%s] needsEntry=%d\n",position,doc.data()+position,needsEntry);
+ DBG_CTX((stderr,"parseCommentBlock position=%d [%s] needsEntry=%d\n",position,doc.data()+position,needsEntry));
if (needsEntry) addCurrentEntry(0);
}
- //fprintf(stderr,"parseCommentBlock position=%d [%s] needsEntry=%d\n",position,doc.data()+position,needsEntry);
+ DBG_CTX((stderr,"parseCommentBlock position=%d [%s] needsEntry=%d\n",position,doc.data()+position,needsEntry));
if (needsEntry) addCurrentEntry(0);
}
@@ -2083,6 +2100,7 @@ static void handleCommentBlock(const QCString &doc,bool brief)
static void subrHandleCommentBlock(const QCString &doc,bool brief)
{
+ QCString loc_doc;
Entry *tmp_entry = current;
current = subrCurrent.first(); // temporarily switch to the entry of the subroutine / function
if (docBlock.stripWhiteSpace().find("\\param") == 0)
@@ -2096,8 +2114,57 @@ static void subrHandleCommentBlock(const QCString &doc,bool brief)
else
{
int dir1 = modifiers[current_root][argName.lower()].direction;
- handleCommentBlock(QCString("\n\n@param ") + directionParam[dir1] + " " +
- argName + " " + doc,brief);
+ loc_doc = doc.stripWhiteSpace();
+ if (loc_doc.lower().find(directionParam[SymbolModifiers::IN]) == 0)
+ {
+ if ((directionParam[dir1] == directionParam[SymbolModifiers::NONE_D]) ||
+ (directionParam[dir1] == directionParam[SymbolModifiers::IN]))
+ {
+ handleCommentBlock(QCString("\n\n@param ") + directionParam[SymbolModifiers::IN] + " " +
+ argName + " " + loc_doc.right(loc_doc.length()-strlen(directionParam[SymbolModifiers::IN])),brief);
+ }
+ else
+ {
+ warn(yyFileName,yyLineNr, "inconsistency between intent attribute and documenation for variable: "+argName);
+ handleCommentBlock(QCString("\n\n@param ") + directionParam[dir1] + " " +
+ argName + " " + doc,brief);
+ }
+ }
+ else if (loc_doc.lower().find(directionParam[SymbolModifiers::OUT]) == 0)
+ {
+ if ((directionParam[dir1] == directionParam[SymbolModifiers::NONE_D]) ||
+ (directionParam[dir1] == directionParam[SymbolModifiers::OUT]))
+ {
+ handleCommentBlock(QCString("\n\n@param ") + directionParam[SymbolModifiers::OUT] + " " +
+ argName + " " + loc_doc.right(loc_doc.length()-strlen(directionParam[SymbolModifiers::OUT])),brief);
+ }
+ else
+ {
+ warn(yyFileName,yyLineNr, "inconsistency between intent attribute and documenation for variable: "+argName);
+ handleCommentBlock(QCString("\n\n@param ") + directionParam[dir1] + " " +
+ argName + " " + doc,brief);
+ }
+ }
+ else if (loc_doc.lower().find(directionParam[SymbolModifiers::INOUT]) == 0)
+ {
+ if ((directionParam[dir1] == directionParam[SymbolModifiers::NONE_D]) ||
+ (directionParam[dir1] == directionParam[SymbolModifiers::INOUT]))
+ {
+ handleCommentBlock(QCString("\n\n@param ") + directionParam[SymbolModifiers::INOUT] + " " +
+ argName + " " + loc_doc.right(loc_doc.length()-strlen(directionParam[SymbolModifiers::INOUT])),brief);
+ }
+ else
+ {
+ warn(yyFileName,yyLineNr, "inconsistency between intent attribute and documenation for variable: "+argName);
+ handleCommentBlock(QCString("\n\n@param ") + directionParam[dir1] + " " +
+ argName + " " + doc,brief);
+ }
+ }
+ else
+ {
+ handleCommentBlock(QCString("\n\n@param ") + directionParam[dir1] + " " +
+ argName + " " + doc,brief);
+ }
}
current=tmp_entry;
}
@@ -2197,7 +2264,11 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
//----------------------------------------------------------------------------
-void FortranLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+void FortranLanguageScanner::parseInput(const char *fileName,
+ const char *fileBuf,
+ Entry *root,
+ bool /*sameTranslationUnit*/,
+ QStrList & /*filesInSameTranslationUnit*/)
{
g_thisParser = this;
::parseMain(fileName,fileBuf,root);
@@ -2233,7 +2304,7 @@ void FortranLanguageScanner::resetCodeParserState()
void FortranLanguageScanner::parsePrototype(const char *text)
{
- (void)text;
+ current->name = QCString(text).lower();
}
static void scanner_abort()
diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp
index 5727647..dd3c3d1 100644
--- a/src/ftvhelp.cpp
+++ b/src/ftvhelp.cpp
@@ -1,7 +1,7 @@
/******************************************************************************
* ftvhelp.cpp,v 1.0 2000/09/06 16:09:00
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/ftvhelp.h b/src/ftvhelp.h
index d3ba3b9..9794d8b 100644
--- a/src/ftvhelp.h
+++ b/src/ftvhelp.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index a72a19b..2b41594 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -44,7 +44,7 @@
//---------------------------------------------------------------------------
GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t,
- const char *refFileName) : Definition(df,dl,na)
+ const char *refFileName) : Definition(df,dl,1,na)
{
fileList = new FileList;
classSDict = new ClassSDict(17);
@@ -89,7 +89,7 @@ GroupDef::~GroupDef()
void GroupDef::setGroupTitle( const char *t )
{
- if ( t && strlen(t) )
+ if ( t && qstrlen(t) )
{
title = t;
titleSet = TRUE;
@@ -273,19 +273,19 @@ bool GroupDef::insertMember(MemberDef *md,bool docOnly)
bool sameScope = srcMd->getOuterScope()==md->getOuterScope() || // same class or namespace
// both inside a file => definition and declaration do not have to be in the same file
(srcMd->getOuterScope()->definitionType()==Definition::TypeFile &&
- md->getOuterScope()->definitionType()==Definition::TypeFile);
+ md->getOuterScope()->definitionType()==Definition::TypeFile);
- LockingPtr<ArgumentList> srcMdAl = srcMd->argumentList();
- LockingPtr<ArgumentList> mdAl = md->argumentList();
- LockingPtr<ArgumentList> tSrcMdAl = srcMd->templateArguments();
- LockingPtr<ArgumentList> tMdAl = md->templateArguments();
+ ArgumentList *srcMdAl = srcMd->argumentList();
+ ArgumentList *mdAl = md->argumentList();
+ ArgumentList *tSrcMdAl = srcMd->templateArguments();
+ ArgumentList *tMdAl = md->templateArguments();
if (srcMd->isFunction() && md->isFunction() && // both are a function
- ((tSrcMdAl.pointer()==0 && tMdAl.pointer()==0) ||
- (tSrcMdAl.pointer()!=0 && tMdAl.pointer()!=0 && tSrcMdAl->count()==tMdAl->count())
+ ((tSrcMdAl==0 && tMdAl==0) ||
+ (tSrcMdAl!=0 && tMdAl!=0 && tSrcMdAl->count()==tMdAl->count())
) && // same number of template arguments
- matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),srcMdAl.pointer(),
- md->getOuterScope(),md->getFileDef(),mdAl.pointer(),
+ matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),srcMdAl,
+ md->getOuterScope(),md->getFileDef(),mdAl,
TRUE
) && // matching parameters
sameScope // both are found in the same scope
@@ -295,7 +295,7 @@ bool GroupDef::insertMember(MemberDef *md,bool docOnly)
{
md->setGroupAlias(srcMd);
}
- else
+ else if (md!=srcMd->getGroupAlias())
{
md->setGroupAlias(srcMd->getGroupAlias());
}
@@ -439,7 +439,6 @@ void GroupDef::removeMember(MemberDef *md)
if( mni->isEmpty() )
{
allMemberNameInfoSDict->remove(md->name());
- delete mni;
}
removeMemberFromList(MemberListType_allMembersList,md);
@@ -524,7 +523,7 @@ void GroupDef::addGroup(const GroupDef *def)
bool GroupDef::isASubGroup() const
{
- LockingPtr<GroupList> groups = partOfGroups();
+ GroupList *groups = partOfGroups();
return groups!=0 && groups->count()!=0;
}
@@ -570,7 +569,7 @@ void GroupDef::writeDetailedDescription(OutputList &ol,const QCString &title)
// repeat brief description
if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
{
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
}
// write separator between brief and details
if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
@@ -589,13 +588,13 @@ void GroupDef::writeDetailedDescription(OutputList &ol,const QCString &title)
// write detailed documentation
if (!documentation().isEmpty())
{
- ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+ ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
}
// write inbody documentation
if (!inbodyDocumentation().isEmpty())
{
- ol.parseDoc(inbodyFile(),inbodyLine(),this,0,inbodyDocumentation()+"\n",TRUE,FALSE);
+ ol.generateDoc(inbodyFile(),inbodyLine(),this,0,inbodyDocumentation()+"\n",TRUE,FALSE);
}
}
}
@@ -604,25 +603,30 @@ void GroupDef::writeBriefDescription(OutputList &ol)
{
if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
- ol.startParagraph();
- ol.parseDoc(briefFile(),briefLine(),this,0,
- briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::RTF);
- ol.writeString(" \n");
- ol.enable(OutputGenerator::RTF);
-
- if (Config_getBool("REPEAT_BRIEF") ||
- !documentation().isEmpty()
- )
+ DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
+ briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+ if (rootNode && !rootNode->isEmpty())
{
- ol.disableAllBut(OutputGenerator::Html);
- ol.startTextLink(0,"details");
- ol.parseText(theTranslator->trMore());
- ol.endTextLink();
+ ol.startParagraph();
+ ol.writeDoc(rootNode,this,0);
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::RTF);
+ ol.writeString(" \n");
+ ol.enable(OutputGenerator::RTF);
+
+ if (Config_getBool("REPEAT_BRIEF") ||
+ !documentation().isEmpty()
+ )
+ {
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.startTextLink(0,"details");
+ ol.parseText(theTranslator->trMore());
+ ol.endTextLink();
+ }
+ ol.popGeneratorState();
+ ol.endParagraph();
}
- ol.popGeneratorState();
- ol.endParagraph();
+ delete rootNode;
}
}
@@ -671,7 +675,7 @@ void GroupDef::writeFiles(OutputList &ol,const QCString &title)
if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
ol.startMemberDescription(fd->getOutputFileBase());
- ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
ol.endMemberDescription();
}
ol.endMemberDeclaration(0,0);
@@ -729,7 +733,7 @@ void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title)
if (!gd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
ol.startMemberDescription(gd->getOutputFileBase());
- ol.parseDoc(briefFile(),briefLine(),gd,0,gd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),gd,0,gd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
ol.endMemberDescription();
}
ol.endMemberDeclaration(0,0);
@@ -765,7 +769,7 @@ void GroupDef::writeDirs(OutputList &ol,const QCString &title)
if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
ol.startMemberDescription(dd->getOutputFileBase());
- ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
ol.endMemberDescription();
}
ol.endMemberDeclaration(0,0);
@@ -811,7 +815,7 @@ void GroupDef::writePageDocumentation(OutputList &ol)
ol.endSection(si->label,SectionInfo::Subsection);
}
ol.startTextBlock();
- ol.parseDoc(pd->docFile(),pd->docLine(),pd,0,pd->documentation()+pd->inbodyDocumentation(),TRUE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc(pd->docFile(),pd->docLine(),pd,0,pd->documentation()+pd->inbodyDocumentation(),TRUE,FALSE,0,TRUE,FALSE);
ol.endTextBlock();
}
}
@@ -1060,10 +1064,12 @@ void GroupDef::writeDocumentation(OutputList &ol)
case LayoutDocEntry::ClassUsedFiles:
case LayoutDocEntry::ClassInlineClasses:
case LayoutDocEntry::NamespaceNestedNamespaces:
+ case LayoutDocEntry::NamespaceNestedConstantGroups:
case LayoutDocEntry::NamespaceClasses:
case LayoutDocEntry::NamespaceInlineClasses:
case LayoutDocEntry::FileClasses:
case LayoutDocEntry::FileNamespaces:
+ case LayoutDocEntry::FileConstantGroups:
case LayoutDocEntry::FileIncludes:
case LayoutDocEntry::FileIncludeGraph:
case LayoutDocEntry::FileIncludedByGraph:
@@ -1256,7 +1262,7 @@ void addMemberToGroups(Entry *root,MemberDef *md)
if (fgd && gd!=fgd && g->pri==pri)
{
warn(root->fileName.data(), root->startLine,
- "warning: Member %s found in multiple %s groups! "
+ "Member %s found in multiple %s groups! "
"The member will be put in group %s, and not in group %s",
md->name().data(), Grouping::getGroupPriName( pri ),
gd->name().data(), fgd->name().data()
@@ -1301,7 +1307,7 @@ void addMemberToGroups(Entry *root,MemberDef *md)
else if (!root->doc.isEmpty() && md->getGroupHasDocs())
{
warn(md->getGroupFileName(),md->getGroupStartLine(),
- "warning: Member documentation for %s found several times in %s groups!\n"
+ "Member documentation for %s found several times in %s groups!\n"
"%s:%d: The member will remain in group %s, and won't be put into group %s",
md->name().data(), Grouping::getGroupPriName( pri ),
root->fileName.data(), root->startLine,
@@ -1373,8 +1379,8 @@ QCString GroupDef::getOutputFileBase() const
void GroupDef::addListReferences()
{
{
- LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
- addRefItem(xrefItems.pointer(),
+ QList<ListItemInfo> *xrefItems = xrefListItems();
+ addRefItem(xrefItems,
getOutputFileBase(),
theTranslator->trGroup(TRUE,TRUE),
getOutputFileBase(),name(),
@@ -1466,7 +1472,7 @@ void GroupDef::writeMemberDeclarations(OutputList &ol,MemberListType lt,const QC
}
if (ml)
{
- ml->writeDeclarations(ol,0,0,0,this,title,0);
+ ml->writeDeclarations(ol,0,0,0,this,title,0,definitionType());
}
}
diff --git a/src/groupdef.h b/src/groupdef.h
index 3978397..bd53ff5 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -161,7 +161,7 @@ class GroupSDict : public SDict<GroupDef>
virtual ~GroupSDict() {}
int compareItems(QCollection::Item item1,QCollection::Item item2)
{
- return strcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle());
+ return qstrcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle());
}
};
@@ -171,7 +171,7 @@ class GroupList : public QList<GroupDef>
public:
int compareItems(QCollection::Item item1,QCollection::Item item2)
{
- return strcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle());
+ return qstrcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle());
}
};
diff --git a/src/growbuf.h b/src/growbuf.h
index f1bf315..bc8e4b5 100644
--- a/src/growbuf.h
+++ b/src/growbuf.h
@@ -4,6 +4,8 @@
#include <stdlib.h>
#include <string.h>
+#define GROW_AMOUNT 1024
+
/** Class representing a string buffer optimised for growing. */
class GrowBuf
{
@@ -11,21 +13,27 @@ class GrowBuf
GrowBuf() : str(0), pos(0), len(0) {}
~GrowBuf() { free(str); str=0; pos=0; len=0; }
void clear() { pos=0; }
- void addChar(char c) { if (pos>=len) { len+=1024; str = (char*)realloc(str,len); }
+ void addChar(char c) { if (pos>=len) { len+=GROW_AMOUNT; str = (char*)realloc(str,len); }
str[pos++]=c;
}
void addStr(const char *s) {
- int l=strlen(s);
- if (pos+l>=len) { len+=l+1024; str = (char*)realloc(str,len); }
- strcpy(&str[pos],s);
- pos+=l;
+ if (s)
+ {
+ int l=strlen(s);
+ if (pos+l>=len) { len+=l+GROW_AMOUNT; str = (char*)realloc(str,len); }
+ strcpy(&str[pos],s);
+ pos+=l;
+ }
}
void addStr(const char *s,int n) {
- int l=strlen(s);
- if (n<l) l=n;
- if (pos+l>=len) { len+=l+1024; str = (char*)realloc(str,len); }
- strncpy(&str[pos],s,n);
- pos+=l;
+ if (s)
+ {
+ int l=strlen(s);
+ if (n<l) l=n;
+ if (pos+l>=len) { len+=l+GROW_AMOUNT; str = (char*)realloc(str,len); }
+ strncpy(&str[pos],s,n);
+ pos+=l;
+ }
}
const char *get() { return str; }
int getPos() const { return pos; }
diff --git a/src/header.html b/src/header.html
index 0a0194b..70305df 100644
--- a/src/header.html
+++ b/src/header.html
@@ -6,13 +6,13 @@
<meta name="generator" content="Doxygen $doxygenversion"/>
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
-<link href="$relpath$tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="$relpath$jquery.js"></script>
-<script type="text/javascript" src="$relpath$dynsections.js"></script>
+<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="$relpath^jquery.js"></script>
+<script type="text/javascript" src="$relpath^dynsections.js"></script>
$treeview
$search
$mathjax
-<link href="$relpath$$stylesheet" rel="stylesheet" type="text/css" />
+<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
$extrastylesheet
</head>
<body>
@@ -24,7 +24,7 @@ $extrastylesheet
<tbody>
<tr style="height: 56px;">
<!--BEGIN PROJECT_LOGO-->
- <td id="projectlogo"><img alt="Logo" src="$relpath$$projectlogo"/></td>
+ <td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
<!--END PROJECT_LOGO-->
<!--BEGIN PROJECT_NAME-->
<td style="padding-left: 0.5em;">
diff --git a/src/header_html.h b/src/header_html.h
index 505960a..62960d6 100644
--- a/src/header_html.h
+++ b/src/header_html.h
@@ -6,13 +6,13 @@
"<meta name=\"generator\" content=\"Doxygen $doxygenversion\"/>\n"
"<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->\n"
"<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->\n"
-"<link href=\"$relpath$tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
-"<script type=\"text/javascript\" src=\"$relpath$jquery.js\"></script>\n"
-"<script type=\"text/javascript\" src=\"$relpath$dynsections.js\"></script>\n"
+"<link href=\"$relpath^tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
+"<script type=\"text/javascript\" src=\"$relpath^jquery.js\"></script>\n"
+"<script type=\"text/javascript\" src=\"$relpath^dynsections.js\"></script>\n"
"$treeview\n"
"$search\n"
"$mathjax\n"
-"<link href=\"$relpath$$stylesheet\" rel=\"stylesheet\" type=\"text/css\" />\n"
+"<link href=\"$relpath^$stylesheet\" rel=\"stylesheet\" type=\"text/css\" />\n"
"$extrastylesheet\n"
"</head>\n"
"<body>\n"
@@ -24,7 +24,7 @@
" <tbody>\n"
" <tr style=\"height: 56px;\">\n"
" <!--BEGIN PROJECT_LOGO-->\n"
-" <td id=\"projectlogo\"><img alt=\"Logo\" src=\"$relpath$$projectlogo\"/></td>\n"
+" <td id=\"projectlogo\"><img alt=\"Logo\" src=\"$relpath^$projectlogo\"/></td>\n"
" <!--END PROJECT_LOGO-->\n"
" <!--BEGIN PROJECT_NAME-->\n"
" <td style=\"padding-left: 0.5em;\">\n"
diff --git a/src/htags.cpp b/src/htags.cpp
index 2acceb8..5f0c71a 100644
--- a/src/htags.cpp
+++ b/src/htags.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -32,7 +32,7 @@ static QDict<QCString> g_symbolDict(10007);
/*! constructs command line of htags(1) and executes it.
* \retval TRUE success
- * \retval FALSE an error has occured.
+ * \retval FALSE an error has occurred.
*/
bool Htags::execute(const QCString &htmldir)
{
@@ -52,14 +52,14 @@ bool Htags::execute(const QCString &htmldir)
{
g_inputDir.setPath(inputSource.first());
if (!g_inputDir.exists())
- err("error: Cannot find directory %s. "
+ err("Cannot find directory %s. "
"Check the value of the INPUT tag in the configuration file.\n",
inputSource.first()
);
}
else
{
- err("error: If you use USE_HTAGS then INPUT should specific a single directory. \n");
+ err("If you use USE_HTAGS then INPUT should specific a single directory. \n");
return FALSE;
}
@@ -145,7 +145,7 @@ bool Htags::loadFilemap(const QCString &htmlDir)
}
else
{
- err("error: file %s cannot be opened\n",fileMapName.data());
+ err("file %s cannot be opened\n",fileMapName.data());
}
}
return FALSE;
diff --git a/src/htags.h b/src/htags.h
index 4a164a6..474b098 100644
--- a/src/htags.h
+++ b/src/htags.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/htmlattrib.h b/src/htmlattrib.h
index b391861..203fb48 100644
--- a/src/htmlattrib.h
+++ b/src/htmlattrib.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -15,6 +15,9 @@
#ifndef _HTMLATTRIB_H
#define _HTMLATTRIB_H
+#include <qcstring.h>
+#include <qlist.h>
+
/*! A Html option. A name, value pair */
struct HtmlAttrib
{
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index 3c06837..767fa5b 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -39,26 +39,30 @@ static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
static QCString convertIndexWordToAnchor(const QString &word)
{
static char hex[] = "0123456789abcdef";
- uint i;
QCString result;
- for (i=0;i<word.length();i++)
- {
- int c = word.at(i);
- if (isId(c))
+ const char *str = word.data();
+ unsigned char c;
+ while ((c = *str++))
+ {
+ if ((c >= 'a' && c <= 'z') || // ALPHA
+ (c >= 'A' && c <= 'A') || // ALPHA
+ (c >= '0' && c <= '9') || // DIGIT
+ c == '-' ||
+ c == '.' ||
+ c == '_' ||
+ c == '~'
+ )
{
- result+=c;
+ result += c;
}
- else if (isspace(c))
+ else
{
- result+="_";
- }
- else
- {
- char cs[3];
- cs[0]=hex[c>>4];
- cs[1]=hex[c&0xf];
- cs[2]=0;
- result+=cs;
+ char enc[4];
+ enc[0] = '%';
+ enc[1] = hex[(c & 0xf0) >> 4];
+ enc[2] = hex[c & 0xf];
+ enc[3] = 0;
+ result += enc;
}
}
return result;
@@ -153,6 +157,7 @@ void HtmlDocVisitor::visit(DocWord *w)
void HtmlDocVisitor::visit(DocLinkedWord *w)
{
if (m_hide) return;
+ //printf("linked word: %s\n",w->word().data());
startLink(w->ref(),w->file(),w->relPath(),w->anchor(),w->tooltip());
filter(w->word());
endLink();
@@ -277,7 +282,7 @@ void HtmlDocVisitor::visit(DocSymbol *s)
case DocSymbol::LeftFloor: m_t << "&lfloor;"; break;
case DocSymbol::RightFloor: m_t << "&rfloor;"; break;
default:
- err("error: unknown symbol found\n");
+ err("unknown symbol found\n");
}
}
@@ -447,7 +452,8 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
case DocVerbatim::ManOnly:
case DocVerbatim::LatexOnly:
case DocVerbatim::XmlOnly:
- case DocVerbatim::RtfOnly:
+ case DocVerbatim::RtfOnly:
+ case DocVerbatim::DocbookOnly:
/* nothing */
break;
@@ -478,31 +484,7 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
if (Config_getBool("DOT_CLEANUP")) file.remove();
}
break;
-#if 0
- case DocVerbatim::Vhdf:
- if (VhdlDocGen::getFlowMember()) // use VHDL flow chart creator
- {
- QCString fname=FlowNode::convertNameToFileName();
- // fprintf(stderr,"\n create flow mem %s \n",fname.data());
- //m_t << "<div align=\"left\">" << endl; // TODO: use CSS
- m_t << "<p>";
- m_t << "flowchart: " ; // TODO: translate me
- m_t << "<a href=\"";
- m_t << fname.data();
- m_t << ".svg\">";
- m_t << VhdlDocGen::getFlowMember()->name().data();
- m_t << "</a>";
- if (!s->text().isEmpty())
- {
- m_t << "<br/>";
- m_t << s->text().data();
- }
- m_t << "</p>";
- VhdlDocGen::setFlowMember(NULL);
- }
- break;
-#endif
- case DocVerbatim::Msc:
+ case DocVerbatim::Msc:
{
forceEndParagraph(s);
@@ -560,7 +542,7 @@ void HtmlDocVisitor::visit(DocInclude *inc)
-1, // endLine
TRUE, // inlineFragment
0, // memberDef
- TRUE, // show line numbers
+ FALSE, // show line numbers
m_ctx // search context
);
m_t << PREFRAG_END;
@@ -1796,7 +1778,7 @@ void HtmlDocVisitor::visitPre(DocVhdlFlow *vf)
if (VhdlDocGen::getFlowMember()) // use VHDL flow chart creator
{
forceEndParagraph(vf);
- QCString fname=FlowNode::convertNameToFileName();
+ QCString fname=FlowChart::convertNameToFileName();
m_t << "<p>";
m_t << "flowchart: " ; // TODO: translate me
m_t << "<a href=\"";
@@ -1857,11 +1839,11 @@ void HtmlDocVisitor::filterQuotedCdataAttr(const char* str)
// it's enough to replace these two, provided that the declaration
// for the HTML version we generate (and as supported by the browser)
// specifies that all the other symbols used in rawVal are
- // within the right charachter class (i.e., they're not
- // some multinational weird charachters not in the BASESET).
+ // within the right character class (i.e., they're not
+ // some multinational weird characters not in the BASESET).
// We assume that 1) the browser will support whatever is remaining
// in the formula and 2) the TeX formulae are generally governed
- // by even stricter charachter restrictions so it should be enough.
+ // by even stricter character restrictions so it should be enough.
//
// On some incompliant browsers, additional translation of
// '>' and '<' into "&gt;" and "&lt;", respectively, might be needed;
@@ -1880,6 +1862,7 @@ void HtmlDocVisitor::startLink(const QCString &ref,const QCString &file,
const QCString &relPath,const QCString &anchor,
const QCString &tooltip)
{
+ //printf("HtmlDocVisitor: file=%s anchor=%s\n",file.data(),anchor.data());
if (!ref.isEmpty()) // link to entity imported via tag file
{
m_t << "<a class=\"elRef\" ";
diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h
index 150493b..3624224 100644
--- a/src/htmldocvisitor.h
+++ b/src/htmldocvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 90d9f84..1644f23 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -104,6 +104,7 @@ static const char extsearch_script[]=
static QCString g_header;
static QCString g_footer;
+static QCString g_mathjax_code;
//------------------------- Pictures for the Tabs ------------------------
@@ -804,7 +805,7 @@ static void writeImgData(const char *dir,img_data_item *data)
if (f.open(IO_WriteOnly))
{
f.writeBlock((char*)data->content,
- data->len>0 ? data->len : strlen((char*)data->content));
+ data->len>0 ? data->len : qstrlen((char*)data->content));
}
else
{
@@ -912,18 +913,18 @@ QCString substitute(const char *s,const char *src,const char *dst)
{
if (s==0 || src==0) return s;
const char *p, *q;
- int srcLen = strlen(src);
- int dstLen = dst ? strlen(dst) : 0;
+ int srcLen = qstrlen(src);
+ int dstLen = dst ? qstrlen(dst) : 0;
int resLen;
if (srcLen!=dstLen)
{
int count;
for (count=0, p=s; (q=strstr(p,src))!=0; p=q+srcLen) count++;
- resLen = (int)(p-s)+strlen(p)+count*(dstLen-srcLen);
+ resLen = (int)(p-s)+qstrlen(p)+count*(dstLen-srcLen);
}
else // result has same size as s
{
- resLen = strlen(s);
+ resLen = qstrlen(s);
}
QCString result(resLen+1);
char *r;
@@ -935,7 +936,7 @@ QCString substitute(const char *s,const char *src,const char *dst)
if (dst) memcpy(r,dst,dstLen);
r+=dstLen;
}
- strcpy(r,p);
+ qstrcpy(r,p);
//printf("substitute(%s,%s,%s)->%s\n",s,src,dst,result.data());
return result;
}
@@ -946,8 +947,8 @@ QCString clearBlock(const char *s,const char *begin,const char *end)
{
if (s==0 || begin==0 || end==0) return s;
const char *p, *q;
- int beginLen = strlen(begin);
- int endLen = strlen(end);
+ int beginLen = qstrlen(begin);
+ int endLen = qstrlen(end);
int resLen = 0;
for (p=s; (q=strstr(p,begin))!=0; p=q+endLen)
{
@@ -959,7 +960,7 @@ QCString clearBlock(const char *s,const char *begin,const char *end)
break;
}
}
- resLen+=strlen(p);
+ resLen+=qstrlen(p);
// resLen is the length of the string without the marked block
QCString result(resLen+1);
@@ -977,7 +978,7 @@ QCString clearBlock(const char *s,const char *begin,const char *end)
break;
}
}
- strcpy(r,p);
+ qstrcpy(r,p);
return result;
}
//----------------------------------------------------------------------
@@ -1098,7 +1099,7 @@ static QCString substituteHtmlKeywords(const QCString &s,
extraCssFile = Config_getString("HTML_EXTRA_STYLESHEET");
if (!extraCssFile.isEmpty())
{
- extraCssText = "<link href=\"$relpath$"+stripPath(extraCssFile)+"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+ extraCssText = "<link href=\"$relpath^"+stripPath(extraCssFile)+"\" rel=\"stylesheet\" type=\"text/css\"/>\n";
}
if (timeStamp) {
@@ -1110,9 +1111,9 @@ static QCString substituteHtmlKeywords(const QCString &s,
if (treeView)
{
- treeViewCssJs = "<link href=\"$relpath$navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
- "<script type=\"text/javascript\" src=\"$relpath$resize.js\"></script>\n"
- "<script type=\"text/javascript\" src=\"$relpath$navtree.js\"></script>\n"
+ treeViewCssJs = "<link href=\"$relpath^navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"
+ "<script type=\"text/javascript\" src=\"$relpath^resize.js\"></script>\n"
+ "<script type=\"text/javascript\" src=\"$relpath^navtree.js\"></script>\n"
"<script type=\"text/javascript\">\n"
" $(document).ready(initResizable);\n"
" $(window).load(resizeHeight);\n"
@@ -1121,8 +1122,8 @@ static QCString substituteHtmlKeywords(const QCString &s,
if (searchEngine)
{
- searchCssJs = "<link href=\"$relpath$search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
- searchCssJs += "<script type=\"text/javascript\" src=\"$relpath$search/search.js\"></script>\n";
+ searchCssJs = "<link href=\"$relpath^search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n";
+ searchCssJs += "<script type=\"text/javascript\" src=\"$relpath^search/search.js\"></script>\n";
if (!serverBasedSearch)
{
@@ -1176,8 +1177,13 @@ static QCString substituteHtmlKeywords(const QCString &s,
}
mathJaxJs += "],\n"
" jax: [\"input/TeX\",\"output/"+mathJaxFormat+"\"],\n"
- "});\n"
- "</script>";
+ "});\n";
+ if (!g_mathjax_code.isEmpty())
+ {
+ mathJaxJs += g_mathjax_code;
+ mathJaxJs += "\n";
+ }
+ mathJaxJs += "</script>";
mathJaxJs += "<script src=\"" + path + "MathJax.js\"></script>\n";
}
@@ -1196,7 +1202,8 @@ static QCString substituteHtmlKeywords(const QCString &s,
result = substitute(result,"$mathjax",mathJaxJs);
result = substitute(result,"$generatedby",generatedBy);
result = substitute(result,"$extrastylesheet",extraCssText);
- result = substitute(result,"$relpath$",relPath); //<-- must be last
+ result = substitute(result,"$relpath$",relPath); //<-- obsolete: for backwards compatibility only
+ result = substitute(result,"$relpath^",relPath); //<-- must be last
// additional HTML only conditional blocks
result = selectBlock(result,"DISABLE_INDEX",disableIndex);
@@ -1277,7 +1284,7 @@ void HtmlCodeGenerator::codify(const char *str)
m_t << "\\";
m_col++;
break;
- default: m_t << c;
+ default: p=writeUtf8Char(m_t,p-1);
m_col++;
break;
}
@@ -1361,7 +1368,7 @@ void HtmlCodeGenerator::writeCodeLink(const char *ref,const char *f,
m_t << ">";
docify(name);
m_t << "</a>";
- m_col+=strlen(name);
+ m_col+=qstrlen(name);
}
void HtmlCodeGenerator::startCodeLine(bool hasLineNumbers)
@@ -1402,11 +1409,6 @@ void HtmlCodeGenerator::writeCodeAnchor(const char *anchor)
if (m_streamSet) m_t << "<a name=\"" << anchor << "\"></a>";
}
-void HtmlCodeGenerator::linkableSymbol(int,const char *,Definition *,Definition *)
-{
-}
-
-
//--------------------------------------------------------------------------
HtmlGenerator::HtmlGenerator() : OutputGenerator()
@@ -1449,6 +1451,15 @@ void HtmlGenerator::init()
{
g_footer = defaultHtmlFooter;
}
+
+ if (Config_getBool("USE_MATHJAX"))
+ {
+ if (!Config_getString("MATHJAX_CODEFILE").isEmpty())
+ {
+ g_mathjax_code=fileToString(Config_getString("MATHJAX_CODEFILE"));
+ //printf("g_mathjax_code='%s'\n",g_mathjax_code.data());
+ }
+ }
createSubDirs(d);
QCString fileName=dname+"/tabs.css";
@@ -1699,7 +1710,7 @@ void HtmlGenerator::writeStyleInfo(int part)
QFileInfo cssfi(cssname);
if (!cssfi.exists() || !cssfi.isFile() || !cssfi.isReadable())
{
- err("error: style sheet %s does not exist or is not readable!", Config_getString("HTML_STYLESHEET").data());
+ err("style sheet %s does not exist or is not readable!", Config_getString("HTML_STYLESHEET").data());
}
else
{
@@ -2387,7 +2398,7 @@ void HtmlGenerator::endParameterName(bool last,bool emptyList,bool closeBracket)
{
if (emptyList)
{
- if (closeBracket) t << "</td><td>)";
+ if (closeBracket) t << ")</td><td>";
t << "</td>" << endl;
t << " <td>";
}
@@ -2417,6 +2428,22 @@ void HtmlGenerator::endParameterList()
t << " </tr>" << endl;
}
+void HtmlGenerator::exceptionEntry(const char* prefix,bool closeBracket)
+{
+ DBG_HTML(t << "<!-- exceptionEntry -->" << endl;)
+ t << "</td>" << endl;
+ t << " </tr>" << endl;
+ t << " <tr>" << endl;
+ t << " <td align=\"right\">";
+ // colspan 2 so it gets both parameter type and parameter name columns
+ if (prefix)
+ t << prefix << "</td><td>(</td><td colspan=\"2\">";
+ else if (closeBracket)
+ t << "</td><td>)</td><td></td><td>";
+ else
+ t << "</td><td></td><td colspan=\"2\">";
+}
+
void HtmlGenerator::endMemberDoc(bool hasArgs)
{
DBG_HTML(t << "<!-- endMemberDoc -->" << endl;)
@@ -2926,7 +2953,7 @@ void HtmlGenerator::writeSplitBar(const char *name)
void HtmlGenerator::writeNavigationPath(const char *s)
{
- t << substitute(s,"$relpath$",relPath);
+ t << substitute(s,"$relpath^",relPath);
}
void HtmlGenerator::startContents()
@@ -3108,17 +3135,8 @@ void HtmlGenerator::writeExternalSearchPage()
<< "\"" << theTranslator->trSearchResults(2) << "\"];" << endl;
t << "var serverUrl=\"" << Config_getString("SEARCHENGINE_URL") << "\";" << endl;
t << "var tagMap = {" << endl;
- // add standard tag file mappings
- QDictIterator<QCString> it(Doxygen::tagDestinationDict);
- QCString *dest;
bool first=TRUE;
- for (it.toFirst();(dest=it.current());++it)
- {
- if (!first) t << "," << endl;
- t << " \"" << it.currentKey() << "\": \"" << *dest << "\"";
- first=FALSE;
- }
- // add additional user specified mappings
+ // add search mappings
QStrList &extraSearchMappings = Config_getList("EXTRA_SEARCH_MAPPINGS");
char *ml=extraSearchMappings.first();
while (ml)
@@ -3129,7 +3147,7 @@ void HtmlGenerator::writeExternalSearchPage()
{
QCString tagName = mapLine.left(eqPos).stripWhiteSpace();
QCString destName = mapLine.right(mapLine.length()-eqPos-1).stripWhiteSpace();
- if (!tagName.isEmpty() && Doxygen::tagDestinationDict.find(tagName)==0)
+ if (!tagName.isEmpty())
{
if (!first) t << "," << endl;
t << " \"" << tagName << "\": \"" << destName << "\"";
diff --git a/src/htmlgen.h b/src/htmlgen.h
index 17f12fb..34eb1e5 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -47,7 +47,6 @@ class HtmlCodeGenerator : public CodeOutputInterface
void startFontClass(const char *s);
void endFontClass();
void writeCodeAnchor(const char *anchor);
- void linkableSymbol(int,const char *,Definition *,Definition *);
void setCurrentDoc(Definition *,const char *,bool) {}
void addWord(const char *,bool) {}
@@ -109,9 +108,6 @@ class HtmlGenerator : public OutputGenerator
{ m_codeGen.endFontClass(); }
void writeCodeAnchor(const char *anchor)
{ m_codeGen.writeCodeAnchor(anchor); }
- void linkableSymbol(int line,const char *symName,
- Definition *symDef,Definition *context)
- { m_codeGen.linkableSymbol(line,symName,symDef,context); }
// ---------------------------
void setCurrentDoc(Definition *context,const char *anchor,bool isSourceFile);
@@ -312,6 +308,7 @@ class HtmlGenerator : public OutputGenerator
void endParameterName(bool last,bool emptyList,bool closeBracket);
void startParameterList(bool);
void endParameterList();
+ virtual void exceptionEntry(const char*,bool);
void startConstraintList(const char *);
void startConstraintParam();
diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp
index 945a7c5..6b1f98b 100644
--- a/src/htmlhelp.cpp
+++ b/src/htmlhelp.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -56,7 +56,7 @@ class IndexFieldSDict : public SDict<IndexField>
~IndexFieldSDict() {}
int compareItems(QCollection::Item item1, QCollection::Item item2)
{
- return stricmp(((IndexField *)item1)->name,((IndexField *)item2)->name);
+ return qstricmp(((IndexField *)item1)->name,((IndexField *)item2)->name);
}
};
@@ -304,7 +304,7 @@ void HtmlHelp::initialize()
m_fromUtf8 = portable_iconv_open(str,"UTF-8");
if (m_fromUtf8==(void *)(-1))
{
- err("Error: unsupported character conversion for CHM_INDEX_ENCODING: '%s'->'UTF-8'\n", str);
+ err("unsupported character conversion for CHM_INDEX_ENCODING: '%s'->'UTF-8'\n", str);
exit(1);
}
@@ -383,6 +383,7 @@ void HtmlHelp::initialize()
0x422 Ukrainian
0x81A Serbian (Serbia, Latin)
0x403 Catalan
+ 0x426 Latvian
0x427 Lithuanian
0x436 Afrikaans
0x42A Vietnamese
@@ -431,6 +432,7 @@ void HtmlHelp::initialize()
s_languageDict.insert("vietnamese", new QCString("0x42A Vietnamese"));
s_languageDict.insert("persian", new QCString("0x429 Persian (Iran)"));
s_languageDict.insert("arabic", new QCString("0xC01 Arabic (Egypt)"));
+ s_languageDict.insert("latvian", new QCString("0x426 Latvian"));
}
diff --git a/src/htmlhelp.h b/src/htmlhelp.h
index 4b8064d..85e46e0 100644
--- a/src/htmlhelp.h
+++ b/src/htmlhelp.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -22,6 +22,7 @@
#define HTMLHELP_H
#include <qstrlist.h>
+#include <qdict.h>
#include "index.h"
#include "ftextstream.h"
diff --git a/src/image.cpp b/src/image.cpp
index 2293d1f..49485af 100644
--- a/src/image.cpp
+++ b/src/image.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/image.h b/src/image.h
index 5fb98e6..d2311a1 100644
--- a/src/image.h
+++ b/src/image.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/index.cpp b/src/index.cpp
index 2f9b06a..944d5db 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -125,7 +125,7 @@ class MemberIndexList : public QList<MemberDef>
{
MemberDef *md1=(MemberDef *)item1;
MemberDef *md2=(MemberDef *)item2;
- return stricmp(md1->name(),md2->name());
+ return qstricmp(md1->name(),md2->name());
}
};
@@ -332,7 +332,7 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
MemberDef *md;
for (mi.toFirst();(md=mi.current());++mi)
{
- LockingPtr<MemberList> enumList = md->enumFieldList();
+ MemberList *enumList = md->enumFieldList();
bool isDir = enumList!=0 && md->isEnumerate();
bool isAnonymous = md->name().find('@')!=-1;
static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS");
@@ -602,7 +602,7 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
if (level>20)
{
warn(dd->getDefFileName(),dd->getDefLine(),
- "warning: maximum nesting level exceeded for directory %s: "
+ "maximum nesting level exceeded for directory %s: "
"check for possible recursive directory relation!\n",dd->name().data()
);
return;
@@ -1265,7 +1265,7 @@ static void writeFileIndex(OutputList &ol)
if (hasBrief)
{
//ol.docify(" (");
- ol.parseDoc(
+ ol.generateDoc(
fd->briefFile(),fd->briefLine(),
fd,0,
fd->briefDescription(TRUE),
@@ -1384,13 +1384,13 @@ void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalO
ftv->addContentsItem(count>0,cd->displayName(FALSE),cd->getReference(),
cd->getOutputFileBase(),cd->anchor(),FALSE,TRUE,cd);
if (addToIndex &&
- cd->partOfGroups()==0 &&
+ /*cd->partOfGroups()==0 &&*/
(cd->getOuterScope()==0 ||
cd->getOuterScope()->definitionType()!=Definition::TypeClass
)
)
{
- addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor());
+ addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor(),cd->partOfGroups()==0);
}
if (count>0)
{
@@ -1461,7 +1461,7 @@ static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv,
file = nd->getOutputFileBase();
if (nd->getLanguage()==SrcLangExt_VHDL) // UGLY HACK
{
- file=file.replace(0,strlen("namespace"),"class");
+ file=file.replace(0,qstrlen("namespace"),"class");
}
}
@@ -1537,7 +1537,7 @@ static void writeNamespaceIndex(OutputList &ol)
ol.startIndexKey();
if (nd->getLanguage()==SrcLangExt_VHDL)
{
- ol.writeObjectLink(0, nd->getOutputFileBase().replace(0,strlen("namespace"),"class"),0,nd->displayName());
+ ol.writeObjectLink(0, nd->getOutputFileBase().replace(0,qstrlen("namespace"),"class"),0,nd->displayName());
}
else
{
@@ -1550,7 +1550,7 @@ static void writeNamespaceIndex(OutputList &ol)
if (hasBrief)
{
//ol.docify(" (");
- ol.parseDoc(
+ ol.generateDoc(
nd->briefFile(),nd->briefLine(),
nd,0,
nd->briefDescription(TRUE),
@@ -1667,7 +1667,7 @@ static void writeAnnotatedClassList(OutputList &ol)
ol.startIndexValue(hasBrief);
if (hasBrief)
{
- ol.parseDoc(
+ ol.generateDoc(
cd->briefFile(),cd->briefLine(),
cd,0,
cd->briefDescription(TRUE),
@@ -1722,7 +1722,7 @@ public:
QCString n1 = c1->className();
QCString n2 = c2->className();
- return stricmp (n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2));
+ return qstricmp (n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2));
}
};
@@ -3458,7 +3458,7 @@ void writeGraphInfo(OutputList &ol)
//printf("legendDocs=%s\n",legendDocs.data());
}
FileDef fd("","graph_legend");
- ol.parseDoc("graph_legend",1,&fd,0,legendDocs,FALSE,FALSE);
+ ol.generateDoc("graph_legend",1,&fd,0,legendDocs,FALSE,FALSE);
stripCommentsStateRef = oldStripCommentsState;
endFile(ol);
ol.popGeneratorState();
@@ -3477,7 +3477,7 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
if (level>20)
{
warn(gd->getDefFileName(),gd->getDefLine(),
- "warning: maximum nesting level exceeded for group %s: check for possible recursive group relation!\n",gd->name().data()
+ "maximum nesting level exceeded for group %s: check for possible recursive group relation!\n",gd->name().data()
);
return;
}
@@ -3558,7 +3558,7 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp*
MemberDef *md;
for (mi.toFirst();(md=mi.current());++mi)
{
- LockingPtr<MemberList> enumList = md->enumFieldList();
+ MemberList *enumList = md->enumFieldList();
bool isDir = enumList!=0 && md->isEnumerate();
if (md->isVisible() && md->name().find('@')==-1)
{
@@ -3907,35 +3907,38 @@ static void writeDirIndex(OutputList &ol)
static void writeUserGroupStubPage(OutputList &ol,LayoutNavEntry *lne)
{
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- startFile(ol,lne->baseFile(),0,lne->title(),HLI_UserGroup);
- startTitle(ol,0);
- ol.parseText(lne->title());
- endTitle(ol,0,0);
- ol.startContents();
- QListIterator<LayoutNavEntry> li(lne->children());
- LayoutNavEntry *entry;
- int count=0;
- for (li.toFirst();(entry=li.current());++li)
- {
- if (entry->visible()) count++;
- }
- if (count>0)
+ if (lne->baseFile().left(9)=="usergroup")
{
- ol.writeString("<ul>\n");
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ startFile(ol,lne->baseFile(),0,lne->title(),HLI_UserGroup);
+ startTitle(ol,0);
+ ol.parseText(lne->title());
+ endTitle(ol,0,0);
+ ol.startContents();
+ QListIterator<LayoutNavEntry> li(lne->children());
+ LayoutNavEntry *entry;
+ int count=0;
for (li.toFirst();(entry=li.current());++li)
{
- if (entry->visible())
+ if (entry->visible()) count++;
+ }
+ if (count>0)
+ {
+ ol.writeString("<ul>\n");
+ for (li.toFirst();(entry=li.current());++li)
{
- ol.writeString("<li><a href=\""+entry->url()+"\"><span>"+
- fixSpaces(entry->title())+"</span></a></li>\n");
+ if (entry->visible())
+ {
+ ol.writeString("<li><a href=\""+entry->url()+"\"><span>"+
+ fixSpaces(entry->title())+"</span></a></li>\n");
+ }
}
+ ol.writeString("</ul>\n");
}
- ol.writeString("</ul>\n");
+ endFile(ol);
+ ol.popGeneratorState();
}
- endFile(ol);
- ol.popGeneratorState();
}
//----------------------------------------------------------------------------
@@ -3945,13 +3948,14 @@ static void writeIndex(OutputList &ol)
{
static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ static QCString projectName = Config_getString("PROJECT_NAME");
// save old generator state
ol.pushGeneratorState();
QCString projPrefix;
- if (!Config_getString("PROJECT_NAME").isEmpty())
+ if (!projectName.isEmpty())
{
- projPrefix=Config_getString("PROJECT_NAME")+" ";
+ projPrefix=projectName+" ";
}
//--------------------------------------------------------------------
@@ -3979,8 +3983,8 @@ static void writeIndex(OutputList &ol)
if (Doxygen::mainPage)
{
- if (/*Doxygen::mainPage->hasSubPages() || */
- (!Config_getString("PROJECT_NAME").isEmpty() && mainPageHasTitle())
+ if (
+ (!projectName.isEmpty() && mainPageHasTitle() && qstricmp(title,projectName)!=0)
) // to avoid duplicate entries in the treeview
{
Doxygen::indexList->addContentsItem(Doxygen::mainPage->hasSubPages(),title,0,indexName,0,Doxygen::mainPage->hasSubPages(),TRUE);
@@ -4006,7 +4010,7 @@ static void writeIndex(OutputList &ol)
{
ol.startHeaderSection();
ol.startTitleHead(0);
- ol.parseDoc(Doxygen::mainPage->docFile(),Doxygen::mainPage->docLine(),
+ ol.generateDoc(Doxygen::mainPage->docFile(),Doxygen::mainPage->docLine(),
Doxygen::mainPage,0,Doxygen::mainPage->title(),
TRUE,FALSE,0,TRUE,FALSE);
headerWritten = TRUE;
@@ -4014,7 +4018,7 @@ static void writeIndex(OutputList &ol)
}
else
{
- if (!Config_getString("PROJECT_NAME").isEmpty())
+ if (!projectName.isEmpty())
{
ol.startHeaderSection();
ol.startTitleHead(0);
@@ -4043,7 +4047,7 @@ static void writeIndex(OutputList &ol)
}
ol.startTextBlock();
- ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,
+ ol.generateDoc(defFileName,defLine,Doxygen::mainPage,0,
Doxygen::mainPage->documentation(),TRUE,FALSE
/*,Doxygen::mainPage->sectionDict*/);
ol.endTextBlock();
@@ -4079,7 +4083,7 @@ static void writeIndex(OutputList &ol)
if (!Config_getString("PROJECT_NUMBER").isEmpty())
{
ol.startProjectNumber();
- ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Config_getString("PROJECT_NUMBER"),FALSE,FALSE);
+ ol.generateDoc(defFileName,defLine,Doxygen::mainPage,0,Config_getString("PROJECT_NUMBER"),FALSE,FALSE);
ol.endProjectNumber();
}
ol.endIndexSection(isTitlePageStart);
@@ -4234,7 +4238,7 @@ static void writeIndex(OutputList &ol)
startFile(ol,Doxygen::mainPage->name(),0,Doxygen::mainPage->title());
ol.startContents();
ol.startTextBlock();
- ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,
+ ol.generateDoc(defFileName,defLine,Doxygen::mainPage,0,
Doxygen::mainPage->documentation(),FALSE,FALSE
);
ol.endTextBlock();
@@ -4391,18 +4395,40 @@ static void writeIndexHierarchyEntries(OutputList &ol,const QList<LayoutNavEntry
{
// prepend a ! or ^ marker to the URL to avoid tampering with it
QCString url = correctURL(lne->url(),"!"); // add ! to relative URL
- if (!url.isEmpty() && url.at(0)!='!') // absolute URL
+ bool isRelative=url.at(0)=='!';
+ if (!url.isEmpty() && !isRelative) // absolute URL
{
url.prepend("^"); // prepend ^ to absolute URL
}
bool isRef = lne->baseFile().left(4)=="@ref" || lne->baseFile().left(4)=="\\ref";
- Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,url,0,FALSE,isRef);
+ Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,url,0,FALSE,isRef || isRelative);
}
break;
case LayoutNavEntry::UserGroup:
if (addToIndex)
{
- Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,lne->baseFile(),0,TRUE,TRUE);
+ QCString url = correctURL(lne->url(),"!"); // add ! to relative URL
+ if (!url.isEmpty())
+ {
+ if (url=="![none]")
+ {
+ Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,0,0,FALSE,FALSE);
+ }
+ else
+ {
+ bool isRelative=url.at(0)=='!';
+ if (!isRelative) // absolute URL
+ {
+ url.prepend("^"); // prepend ^ to absolute URL
+ }
+ bool isRef = lne->baseFile().left(4)=="@ref" || lne->baseFile().left(4)=="\\ref";
+ Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,url,0,FALSE,isRef || isRelative);
+ }
+ }
+ else
+ {
+ Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,lne->baseFile(),0,TRUE,TRUE);
+ }
Doxygen::indexList->incContentsDepth();
needsClosing=TRUE;
}
diff --git a/src/index.h b/src/index.h
index fa3c8fe..ae15f16 100644
--- a/src/index.h
+++ b/src/index.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/jquery_fx.js b/src/jquery_fx.js
index f242cb9..97e5843 100644
--- a/src/jquery_fx.js
+++ b/src/jquery_fx.js
@@ -1,11 +1 @@
-/**
- * jQuery.ScrollTo - Easy element scrolling using jQuery.
- * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
- * Dual licensed under MIT and GPL.
- * Date: 5/25/2009
- * @author Ariel Flesler
- * @version 1.4.2
- *
- * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
- */
-;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
+(function(c){var a=c.scrollTo=function(f,e,d){c(window).scrollTo(f,e,d)};a.defaults={axis:"xy",duration:parseFloat(c.fn.jquery)>=1.3?0:1};a.window=function(d){return c(window)._scrollable()};c.fn._scrollable=function(){return this.map(function(){var e=this,d=!e.nodeName||c.inArray(e.nodeName.toLowerCase(),["iframe","#document","html","body"])!=-1;if(!d){return e}var f=(e.contentWindow||e).document||e.ownerDocument||e;return c.browser.safari||f.compatMode=="BackCompat"?f.body:f.documentElement})};c.fn.scrollTo=function(f,e,d){if(typeof e=="object"){d=e;e=0}if(typeof d=="function"){d={onAfter:d}}if(f=="max"){f=9000000000}d=c.extend({},a.defaults,d);e=e||d.speed||d.duration;d.queue=d.queue&&d.axis.length>1;if(d.queue){e/=2}d.offset=b(d.offset);d.over=b(d.over);return this._scrollable().each(function(){var l=this,j=c(l),k=f,i,g={},m=j.is("html,body");switch(typeof k){case"number":case"string":if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(k)){k=b(k);break}k=c(k,this);case"object":if(k.is||k.style){i=(k=c(k)).offset()}}c.each(d.axis.split(""),function(q,r){var s=r=="x"?"Left":"Top",u=s.toLowerCase(),p="scroll"+s,o=l[p],n=a.max(l,r);if(i){g[p]=i[u]+(m?0:o-j.offset()[u]);if(d.margin){g[p]-=parseInt(k.css("margin"+s))||0;g[p]-=parseInt(k.css("border"+s+"Width"))||0}g[p]+=d.offset[u]||0;if(d.over[u]){g[p]+=k[r=="x"?"width":"height"]()*d.over[u]}}else{var t=k[u];g[p]=t.slice&&t.slice(-1)=="%"?parseFloat(t)/100*n:t}if(/^\d+$/.test(g[p])){g[p]=g[p]<=0?0:Math.min(g[p],n)}if(!q&&d.queue){if(o!=g[p]){h(d.onAfterFirst)}delete g[p]}});h(d.onAfter);function h(n){j.animate(g,e,d.easing,n&&function(){n.call(this,f,d)})}}).end()};a.max=function(j,i){var h=i=="x"?"Width":"Height",e="scroll"+h;if(!c(j).is("html,body")){return j[e]-c(j)[h.toLowerCase()]()}var g="client"+h,f=j.ownerDocument.documentElement,d=j.ownerDocument.body;return Math.max(f[e],d[e])-Math.min(f[g],d[g])};function b(d){return typeof d=="object"?d:{top:d,left:d}}})(jQuery); \ No newline at end of file
diff --git a/src/jquery_fx_js.h b/src/jquery_fx_js.h
index f5b0da2..7fd7f2e 100644
--- a/src/jquery_fx_js.h
+++ b/src/jquery_fx_js.h
@@ -1,11 +1 @@
-"/**\n"
-" * jQuery.ScrollTo - Easy element scrolling using jQuery.\n"
-" * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com\n"
-" * Dual licensed under MIT and GPL.\n"
-" * Date: 5/25/2009\n"
-" * @author Ariel Flesler\n"
-" * @version 1.4.2\n"
-" *\n"
-" * http://flesler.blogspot.com/2007/10/jqueryscrollto.html\n"
-" */\n"
-";(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\\d+(\\.\\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);\n"
+"(function(c){var a=c.scrollTo=function(f,e,d){c(window).scrollTo(f,e,d)};a.defaults={axis:\"xy\",duration:parseFloat(c.fn.jquery)>=1.3?0:1};a.window=function(d){return c(window)._scrollable()};c.fn._scrollable=function(){return this.map(function(){var e=this,d=!e.nodeName||c.inArray(e.nodeName.toLowerCase(),[\"iframe\",\"#document\",\"html\",\"body\"])!=-1;if(!d){return e}var f=(e.contentWindow||e).document||e.ownerDocument||e;return c.browser.safari||f.compatMode==\"BackCompat\"?f.body:f.documentElement})};c.fn.scrollTo=function(f,e,d){if(typeof e==\"object\"){d=e;e=0}if(typeof d==\"function\"){d={onAfter:d}}if(f==\"max\"){f=9000000000}d=c.extend({},a.defaults,d);e=e||d.speed||d.duration;d.queue=d.queue&&d.axis.length>1;if(d.queue){e/=2}d.offset=b(d.offset);d.over=b(d.over);return this._scrollable().each(function(){var l=this,j=c(l),k=f,i,g={},m=j.is(\"html,body\");switch(typeof k){case\"number\":case\"string\":if(/^([+-]=)?\\d+(\\.\\d+)?(px|%)?$/.test(k)){k=b(k);break}k=c(k,this);case\"object\":if(k.is||k.style){i=(k=c(k)).offset()}}c.each(d.axis.split(\"\"),function(q,r){var s=r==\"x\"?\"Left\":\"Top\",u=s.toLowerCase(),p=\"scroll\"+s,o=l[p],n=a.max(l,r);if(i){g[p]=i[u]+(m?0:o-j.offset()[u]);if(d.margin){g[p]-=parseInt(k.css(\"margin\"+s))||0;g[p]-=parseInt(k.css(\"border\"+s+\"Width\"))||0}g[p]+=d.offset[u]||0;if(d.over[u]){g[p]+=k[r==\"x\"?\"width\":\"height\"]()*d.over[u]}}else{var t=k[u];g[p]=t.slice&&t.slice(-1)==\"%\"?parseFloat(t)/100*n:t}if(/^\\d+$/.test(g[p])){g[p]=g[p]<=0?0:Math.min(g[p],n)}if(!q&&d.queue){if(o!=g[p]){h(d.onAfterFirst)}delete g[p]}});h(d.onAfter);function h(n){j.animate(g,e,d.easing,n&&function(){n.call(this,f,d)})}}).end()};a.max=function(j,i){var h=i==\"x\"?\"Width\":\"Height\",e=\"scroll\"+h;if(!c(j).is(\"html,body\")){return j[e]-c(j)[h.toLowerCase()]()}var g=\"client\"+h,f=j.ownerDocument.documentElement,d=j.ownerDocument.body;return Math.max(f[e],d[e])-Math.min(f[g],d[g])};function b(d){return typeof d==\"object\"?d:{top:d,left:d}}})(jQuery);\n"
diff --git a/src/jquery_p1.js b/src/jquery_p1.js
index 1f06e57..06eb7e6 100644
--- a/src/jquery_p1.js
+++ b/src/jquery_p1.js
@@ -1,3 +1,18 @@
-/*! jQuery v1.7.1 jquery.com | jquery.org/license */
-(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function()
-{g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+/*!
+ * jQuery JavaScript Library v1.7.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Mon Nov 21 21:11:03 2011 -0500
+ */
+(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b4<b3;b4++){if((b9=arguments[b4])!=null){for(b2 in b9){b0=b5[b2];b1=b9[b2];if(b5===b1){continue}if(b8&&b1&&(bF.isPlainObject(b1)||(b6=bF.isArray(b1)))){if(b6){b6=false;b7=b0&&bF.isArray(b0)?b0:[]}else{b7=b0&&bF.isPlainObject(b0)?b0:{}}b5[b2]=bF.extend(b8,b7,b1)}else{if(b1!==L){b5[b2]=b1}}}}}return b5};bF.extend({noConflict:function(b0){if(bb.$===bF){bb.$=bH}if(b0&&bb.jQuery===bF){bb.jQuery=bU}return bF},isReady:false,readyWait:1,holdReady:function(b0){if(b0){bF.readyWait++}else{bF.ready(true)}},ready:function(b0){if((b0===true&&!--bF.readyWait)||(b0!==true&&!bF.isReady)){if(!av.body){return setTimeout(bF.ready,1)}bF.isReady=true;if(b0!==true&&--bF.readyWait>0){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b4<b5;){if(b6.apply(b3[b4++],b2)===false){break}}}}else{if(b0){for(b1 in b3){if(b6.call(b3[b1],b1,b3[b1])===false){break}}}else{for(;b4<b5;){if(b6.call(b3[b4],b4,b3[b4++])===false){break}}}}return b3},trim:bO?function(b0){return b0==null?"":bO.call(b0)}:function(b0){return b0==null?"":b0.toString().replace(bI,"").replace(bE,"")},makeArray:function(b3,b1){var b0=b1||[];if(b3!=null){var b2=bF.type(b3);if(b3.length==null||b2==="string"||b2==="function"||b2==="regexp"||bF.isWindow(b3)){bz.call(b0,b3)}else{bF.merge(b0,b3)}}return b0},inArray:function(b2,b3,b1){var b0;if(b3){if(bv){return bv.call(b3,b2,b1)}b0=b3.length;b1=b1?b1<0?Math.max(0,b0+b1):b1:0;for(;b1<b0;b1++){if(b1 in b3&&b3[b1]===b2){return b1}}}return -1},merge:function(b4,b2){var b3=b4.length,b1=0;if(typeof b2.length==="number"){for(var b0=b2.length;b1<b0;b1++){b4[b3++]=b2[b1]}}else{while(b2[b1]!==L){b4[b3++]=b2[b1++]}}b4.length=b3;return b4},grep:function(b1,b6,b0){var b2=[],b5;b0=!!b0;for(var b3=0,b4=b1.length;b3<b4;b3++){b5=!!b6(b1[b3],b3);if(b0!==b5){b2.push(b1[b3])}}return b2},map:function(b0,b7,b8){var b5,b6,b4=[],b2=0,b1=b0.length,b3=b0 instanceof bF||b1!==L&&typeof b1==="number"&&((b1>0&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b2<b1;b2++){b5=b7(b0[b2],b2,b8);if(b5!=null){b4[b4.length]=b5}}}else{for(b6 in b0){b5=b7(b0[b6],b6,b8);if(b5!=null){b4[b4.length]=b5}}}return b4.concat.apply([],b4)},guid:1,proxy:function(b4,b3){if(typeof b3==="string"){var b2=b4[b3];b3=b4;b4=b2}if(!bF.isFunction(b4)){return L}var b0=bK.call(arguments,2),b1=function(){return b4.apply(b3,b0.concat(bK.call(arguments)))};b1.guid=b4.guid=b4.guid||b1.guid||bF.guid++;return b1},access:function(b0,b8,b6,b2,b5,b7){var b1=b0.length;if(typeof b8==="object"){for(var b3 in b8){bF.access(b0,b3,b8[b3],b2,b5,b6)}return b0}if(b6!==L){b2=!b7&&b2&&bF.isFunction(b6);for(var b4=0;b4<b1;b4++){b5(b0[b4],b8,b2?b6.call(b0[b4],b4,b5(b0[b4],b8)):b6,b7)}return b0}return b1?b5(b0[0],b8):L},now:function(){return(new Date()).getTime()},uaMatch:function(b1){b1=b1.toLowerCase();var b0=by.exec(b1)||bR.exec(b1)||bQ.exec(b1)||b1.indexOf("compatible")<0&&bS.exec(b1)||[];return{browser:b0[1]||"",version:b0[2]||"0"}},sub:function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bF.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bF&&!(b4 instanceof b0)){b4=b0(b4)}return bF.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(av);return b0},browser:{}});bF.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(b1,b0){bx["[object "+b0+"]"]=b0.toLowerCase()});bV=bF.uaMatch(bX);if(bV.browser){bF.browser[bV.browser]=true;bF.browser.version=bV.version}if(bF.browser.webkit){bF.browser.safari=true}if(bM.test("\xA0")){bI=/^[\s\xA0]+/;bE=/[\s\xA0]+$/}bD=bF(av);if(av.addEventListener){e=function(){av.removeEventListener("DOMContentLoaded",e,false);bF.ready()}}else{if(av.attachEvent){e=function(){if(av.readyState==="complete"){av.detachEvent("onreadystatechange",e);bF.ready()}}}}function bw(){if(bF.isReady){return}try{av.documentElement.doScroll("left")}catch(b0){setTimeout(bw,1);return}bF.ready()}return bF})();var a2={};function X(e){var bv=a2[e]={},bw,bx;e=e.split(/\s+/);for(bw=0,bx=e.length;bw<bx;bw++){bv[e[bw]]=true}return bv}b.Callbacks=function(bw){bw=bw?(a2[bw]||X(bw)):{};var bB=[],bC=[],bx,by,bv,bz,bA,bE=function(bF){var bG,bJ,bI,bH,bK;for(bG=0,bJ=bF.length;bG<bJ;bG++){bI=bF[bG];bH=b.type(bI);if(bH==="array"){bE(bI)}else{if(bH==="function"){if(!bw.unique||!bD.has(bI)){bB.push(bI)}}}}},e=function(bG,bF){bF=bF||[];bx=!bw.memory||[bG,bF];by=true;bA=bv||0;bv=0;bz=bB.length;for(;bB&&bA<bz;bA++){if(bB[bA].apply(bG,bF)===false&&bw.stopOnFalse){bx=true;break}}by=false;if(bB){if(!bw.once){if(bC&&bC.length){bx=bC.shift();bD.fireWith(bx[0],bx[1])}}else{if(bx===true){bD.disable()}else{bB=[]}}}},bD={add:function(){if(bB){var bF=bB.length;bE(arguments);if(by){bz=bB.length}else{if(bx&&bx!==true){bv=bF;e(bx[0],bx[1])}}}return this},remove:function(){if(bB){var bF=arguments,bH=0,bI=bF.length;for(;bH<bI;bH++){for(var bG=0;bG<bB.length;bG++){if(bF[bH]===bB[bG]){if(by){if(bG<=bz){bz--;if(bG<=bA){bA--}}}bB.splice(bG--,1);if(bw.unique){break}}}}}return this},has:function(bG){if(bB){var bF=0,bH=bB.length;for(;bF<bH;bF++){if(bG===bB[bF]){return true}}}return false},empty:function(){bB=[];return this},disable:function(){bB=bC=bx=L;return this},disabled:function(){return !bB},lock:function(){bC=L;if(!bx||bx===true){bD.disable()}return this},locked:function(){return !bC},fireWith:function(bG,bF){if(bC){if(by){if(!bw.once){bC.push([bG,bF])}}else{if(!(bw.once&&bx)){e(bG,bF)}}}return this},fire:function(){bD.fireWith(this,arguments);return this},fired:function(){return !!bx}};return bD};var aJ=[].slice;b.extend({Deferred:function(by){var bx=b.Callbacks("once memory"),bw=b.Callbacks("once memory"),bv=b.Callbacks("memory"),e="pending",bA={resolve:bx,reject:bw,notify:bv},bC={done:bx.add,fail:bw.add,progress:bv.add,state:function(){return e},isResolved:bx.fired,isRejected:bw.fired,then:function(bE,bD,bF){bB.done(bE).fail(bD).progress(bF);return this},always:function(){bB.done.apply(bB,arguments).fail.apply(bB,arguments);return this},pipe:function(bF,bE,bD){return b.Deferred(function(bG){b.each({done:[bF,"resolve"],fail:[bE,"reject"],progress:[bD,"notify"]},function(bI,bL){var bH=bL[0],bK=bL[1],bJ;if(b.isFunction(bH)){bB[bI](function(){bJ=bH.apply(this,arguments);if(bJ&&b.isFunction(bJ.promise)){bJ.promise().then(bG.resolve,bG.reject,bG.notify)}else{bG[bK+"With"](this===bB?bG:this,[bJ])}})}else{bB[bI](bG[bK])}})}).promise()},promise:function(bE){if(bE==null){bE=bC}else{for(var bD in bC){bE[bD]=bC[bD]}}return bE}},bB=bC.promise({}),bz;for(bz in bA){bB[bz]=bA[bz].fire;bB[bz+"With"]=bA[bz].fireWith}bB.done(function(){e="resolved"},bw.disable,bv.lock).fail(function(){e="rejected"},bx.disable,bv.lock);if(by){by.call(bB,bB)}return bB},when:function(bA){var bx=aJ.call(arguments,0),bv=0,e=bx.length,bB=new Array(e),bw=e,by=e,bC=e<=1&&bA&&b.isFunction(bA.promise)?bA:b.Deferred(),bE=bC.promise();function bD(bF){return function(bG){bx[bF]=arguments.length>1?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv<e;bv++){if(bx[bv]&&bx[bv].promise&&b.isFunction(bx[bv].promise)){bx[bv].promise().then(bD(bv),bC.reject,bz(bv))
+}else{--bw}}if(!bw){bC.resolveWith(bC,bx)}}else{if(bC!==bA){bC.resolveWith(bC,e?[bA]:[])}}return bE}});b.support=(function(){var bJ,bI,bF,bG,bx,bE,bA,bD,bz,bK,bB,by,bw,bv=av.createElement("div"),bH=av.documentElement;bv.setAttribute("className","t");bv.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="<div "+e+"><div></div></div><table "+e+" cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="<div style='width:4px;'></div>";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA<bz;bA++){delete bB[bv[bA]]}if(!(by?S:b.isEmptyObject)(bB)){return}}}if(!by){delete e[bw].data;if(!S(e[bw])){return}}if(b.support.deleteExpando||!e.setInterval){delete e[bw]}else{e[bw]=null}if(bD){if(b.support.deleteExpando){delete bx[bC]}else{if(bx.removeAttribute){bx.removeAttribute(bC)}else{bx[bC]=null}}}},_data:function(bv,e,bw){return b.data(bv,e,bw,true)},acceptData:function(bv){if(bv.nodeName){var e=b.noData[bv.nodeName.toLowerCase()];if(e){return !(e===true||bv.getAttribute("classid")!==e)}}return true}});b.fn.extend({data:function(by,bA){var bB,e,bw,bz=null;if(typeof by==="undefined"){if(this.length){bz=b.data(this[0]);if(this[0].nodeType===1&&!b._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var bx=0,bv=e.length;bx<bv;bx++){bw=e[bx].name;if(bw.indexOf("data-")===0){bw=b.camelCase(bw.substring(5));a5(this[0],bw,bz[bw])}}b._data(this[0],"parsedAttrs",true)}}return bz}else{if(typeof by==="object"){return this.each(function(){b.data(this,by)})}}bB=by.split(".");bB[1]=bB[1]?"."+bB[1]:"";if(bA===L){bz=this.triggerHandler("getData"+bB[1]+"!",[bB[0]]);if(bz===L&&this.length){bz=b.data(this[0],by);bz=a5(this[0],by,bz)}return bz===L&&bB[1]?this.data(bB[0]):bz}else{return this.each(function(){var bC=b(this),bD=[bB[0],bA];bC.triggerHandler("setData"+bB[1]+"!",bD);b.data(this,by,bA);bC.triggerHandler("changeData"+bB[1]+"!",bD)})}},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a5(bx,bw,by){if(by===L&&bx.nodeType===1){var bv="data-"+bw.replace(aA,"-$1").toLowerCase();by=bx.getAttribute(bv);if(typeof by==="string"){try{by=by==="true"?true:by==="false"?false:by==="null"?null:b.isNumeric(by)?parseFloat(by):aS.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e==="data"&&b.isEmptyObject(bv[e])){continue}if(e!=="toJSON"){return false}}return true}function bi(by,bx,bA){var bw=bx+"defer",bv=bx+"queue",e=bx+"mark",bz=b._data(by,bw);if(bz&&(bA==="queue"||!b._data(by,bv))&&(bA==="mark"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||"fx")+"mark";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||"fx";var e=bv+"mark",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bi(bx,bv,"mark")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||"fx")+"queue";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||"fx";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw==="inprogress"){bw=bv.shift()}if(bw){if(bx==="fx"){bv.unshift("inprogress")}b._data(by,bx+".run",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+"queue "+bx+".run",true);bi(by,bx,"queue")}}});b.fn.extend({queue:function(e,bv){if(typeof e!=="string"){bv=e;e="fx"}if(bv===L){return b.queue(this[0],e)}return this.each(function(){var bw=b.queue(this,e,bv);if(e==="fx"&&bw[0]!=="inprogress"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bv,e){bv=b.fx?b.fx.speeds[bv]||bv:bv;e=e||"fx";return this.queue(e,function(bx,bw){var by=setTimeout(bx,bv);bw.stop=function(){clearTimeout(by)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(bD,bw){if(typeof bD!=="string"){bw=bD;bD=L}bD=bD||"fx";var e=b.Deferred(),bv=this,by=bv.length,bB=1,bz=bD+"defer",bA=bD+"queue",bC=bD+"mark",bx;function bE(){if(!(--bB)){e.resolveWith(bv,[bv])}}while(by--){if((bx=b.data(bv[by],bz,L,true)||(b.data(bv[by],bA,L,true)||b.data(bv[by],bC,L,true))&&b.data(bv[by],bz,b.Callbacks("once memory"),true))){bB++;bx.add(bE)}}bE();return e.promise()}});var aP=/[\n\t\r]/g,af=/\s+/,aU=/\r/g,g=/^(?:button|input)$/i,D=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,ao=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,F=b.support.getSetAttribute,be,aY,aF;b.fn.extend({attr:function(e,bv){return b.access(this,e,bv,true,b.attr)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,e,bv,true,b.prop)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by==="string"){bA=by.split(af);for(bw=0,bv=this.length;bw<bv;bw++){bx=this[bw];if(bx.nodeType===1){if(!bx.className&&bA.length===1){bx.className=by}else{bz=" "+bx.className+" ";for(bB=0,e=bA.length;bB<e;bB++){if(!~bz.indexOf(" "+bA[bB]+" ")){bz+=bA[bB]+" "}}bx.className=b.trim(bz)}}}}return this},removeClass:function(bz){var bA,bw,bv,by,bx,bB,e;if(b.isFunction(bz)){return this.each(function(bC){b(this).removeClass(bz.call(this,bC,this.className))})}if((bz&&typeof bz==="string")||bz===L){bA=(bz||"").split(af);for(bw=0,bv=this.length;bw<bv;bw++){by=this[bw];if(by.nodeType===1&&by.className){if(bz){bx=(" "+by.className+" ").replace(aP," ");for(bB=0,e=bA.length;bB<e;bB++){bx=bx.replace(" "+bA[bB]+" "," ")}by.className=b.trim(bx)}else{by.className=""}}}}return this},toggleClass:function(bx,bv){var bw=typeof bx,e=typeof bv==="boolean";if(b.isFunction(bx)){return this.each(function(by){b(this).toggleClass(bx.call(this,by,this.className,bv),bv)})}return this.each(function(){if(bw==="string"){var bA,bz=0,by=b(this),bB=bv,bC=bx.split(af);while((bA=bC[bz++])){bB=e?bB:!by.hasClass(bA);by[bB?"addClass":"removeClass"](bA)}}else{if(bw==="undefined"||bw==="boolean"){if(this.className){b._data(this,"__className__",this.className)}this.className=this.className||bx===false?"":b._data(this,"__className__")||""}}})},hasClass:function(e){var bx=" "+e+" ",bw=0,bv=this.length;for(;bw<bv;bw++){if(this[bw].nodeType===1&&(" "+this[bw].className+" ").replace(aP," ").indexOf(bx)>-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv<bz;bv++){bx=bC[bv];if(bx.selected&&(b.support.optDisabled?!bx.disabled:bx.getAttribute("disabled")===null)&&(!bx.parentNode.disabled||!b.nodeName(bx.parentNode,"optgroup"))){bA=b(bx).val();if(bw){return bA}bB.push(bA)}}if(bw&&!bB.length&&bC.length){return b(bC[by]).val()}return bB},set:function(bv,bw){var e=b.makeArray(bw);b(bv).find("option").each(function(){this.selected=b.inArray(b(this).val(),e)>=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;
+if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw<e;bw++){bv=bA[bw];if(bv){by=b.propFix[bv]||bv;b.attr(bx,bv,"");bx.removeAttribute(F?bv:by);if(ao.test(bv)&&by in bx){bx[by]=false}}}}},attrHooks:{type:{set:function(e,bv){if(g.test(e.nodeName)&&e.parentNode){b.error("type property can't be changed")}else{if(!b.support.radioValue&&bv==="radio"&&b.nodeName(e,"input")){var bw=e.value;e.setAttribute("type",bv);if(bw){e.value=bw}return bv}}}},value:{get:function(bv,e){if(be&&b.nodeName(bv,"button")){return be.get(bv,e)}return e in bv?bv.value:null},set:function(bv,bw,e){if(be&&b.nodeName(bv,"button")){return be.set(bv,bw,e)}bv.value=bw}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(bz,bx,bA){var bw,e,by,bv=bz.nodeType;if(!bz||bv===3||bv===8||bv===2){return}by=bv!==1||!b.isXMLDoc(bz);if(by){bx=b.propFix[bx]||bx;e=b.propHooks[bx]}if(bA!==L){if(e&&"set" in e&&(bw=e.set(bz,bA,bx))!==L){return bw}else{return(bz[bx]=bA)}}else{if(e&&"get" in e&&(bw=e.get(bz,bx))!==null){return bw}else{return bz[bx]}}},propHooks:{tabIndex:{get:function(bv){var e=bv.getAttributeNode("tabindex");return e&&e.specified?parseInt(e.value,10):D.test(bv.nodeName)||l.test(bv.nodeName)&&bv.href?0:L}}}});b.attrHooks.tabindex=b.propHooks.tabIndex;aY={get:function(bv,e){var bx,bw=b.prop(bv,e);return bw===true||typeof bw!=="boolean"&&(bx=bv.getAttributeNode(e))&&bx.nodeValue!==false?e.toLowerCase():L},set:function(bv,bx,e){var bw;if(bx===false){b.removeAttr(bv,e)}else{bw=b.propFix[e]||e;if(bw in bv){bv[bw]=true}bv.setAttribute(e,e.toLowerCase())}return e}};if(!F){aF={name:true,id:true};be=b.valHooks.button={get:function(bw,bv){var e;e=bw.getAttributeNode(bv);return e&&(aF[bv]?e.nodeValue!=="":e.specified)?e.nodeValue:L},set:function(bw,bx,bv){var e=bw.getAttributeNode(bv);if(!e){e=av.createAttribute(bv);bw.setAttributeNode(e)}return(e.nodeValue=bx+"")}};b.attrHooks.tabindex.set=be.set;b.each(["width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{set:function(bw,bx){if(bx===""){bw.setAttribute(e,"auto");return bx}}})});b.attrHooks.contenteditable={get:be.get,set:function(bv,bw,e){if(bw===""){bw="false"}be.set(bv,bw,e)}}}if(!b.support.hrefNormalized){b.each(["href","src","width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{get:function(bx){var bw=bx.getAttribute(e,2);return bw===null?L:bw}})})}if(!b.support.style){b.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||L},set:function(e,bv){return(e.style.cssText=""+bv)}}}if(!b.support.optSelected){b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(bv){var e=bv.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}})}if(!b.support.enctype){b.propFix.enctype="encoding"}if(!b.support.checkOn){b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}})}b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,bv){if(b.isArray(bv)){return(e.checked=b.inArray(b(e).val(),bv)>=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI<bC.length;bI++){bH=n.exec(bC[bI])||[];bF=bH[1];e=(bH[2]||"").split(".").sort();bE=b.event.special[bF]||{};bF=(by?bE.delegateType:bE.bindType)||bF;bE=b.event.special[bF]||{};bG=b.extend({type:bF,origType:bH[1],data:bA,handler:bJ,guid:bJ.guid,selector:by,quick:Y(by),namespace:e.join(".")},bv);bw=bK[bF];if(!bw){bw=bK[bF]=[];bw.delegateCount=0;if(!bE.setup||bE.setup.call(bx,bA,e,bB)===false){if(bx.addEventListener){bx.addEventListener(bF,bB,false)}else{if(bx.attachEvent){bx.attachEvent("on"+bF,bB)}}}}if(bE.add){bE.add.call(bx,bG);if(!bG.handler.guid){bG.handler.guid=bJ.guid}}if(by){bw.splice(bw.delegateCount++,0,bG)}else{bw.push(bG)}b.event.global[bF]=true}bx=null},global:{},remove:function(bJ,bE,bv,bH,bB){var bI=b.hasData(bJ)&&b._data(bJ),bF,bx,bz,bL,bC,bA,bG,bw,by,bK,bD,e;if(!bI||!(bw=bI.events)){return}bE=b.trim(bt(bE||"")).split(" ");for(bF=0;bF<bE.length;bF++){bx=n.exec(bE[bF])||[];bz=bL=bx[1];bC=bx[2];if(!bz){for(bz in bw){b.event.remove(bJ,bz+bE[bF],bv,bH,true)}continue}by=b.event.special[bz]||{};bz=(bH?by.delegateType:by.bindType)||bz;bD=bw[bz]||[];bA=bD.length;bC=bC?new RegExp("(^|\\.)"+bC.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(bG=0;bG<bD.length;bG++){e=bD[bG];if((bB||bL===e.origType)&&(!bv||bv.guid===e.guid)&&(!bC||bC.test(e.namespace))&&(!bH||bH===e.selector||bH==="**"&&e.selector)){bD.splice(bG--,1);if(e.selector){bD.delegateCount--}if(by.remove){by.remove.call(bJ,e)}}}if(bD.length===0&&bA!==bD.length){if(!by.teardown||by.teardown.call(bJ,bC)===false){b.removeEvent(bJ,bz,bI.handle)}delete bw[bz]}}if(b.isEmptyObject(bw)){bK=bI.handle;if(bK){bK.elem=null}b.removeData(bJ,["events","handle"],true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(bv,bD,bA,bJ){if(bA&&(bA.nodeType===3||bA.nodeType===8)){return}var bG=bv.type||bv,bx=[],e,bw,bC,bH,bz,by,bF,bE,bB,bI;if(T.test(bG+b.event.triggered)){return}if(bG.indexOf("!")>=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bC<bB.length&&!bv.isPropagationStopped();bC++){bH=bB[bC][0];bv.type=bB[bC][1];bE=(b._data(bH,"events")||{})[bv.type]&&b._data(bH,"handle");if(bE){bE.apply(bH,bD)}bE=by&&bH[by];if(bE&&b.acceptData(bH)&&bE.apply(bH,bD)===false){bv.preventDefault()}}bv.type=bG;if(!bJ&&!bv.isDefaultPrevented()){if((!bF._default||bF._default.apply(bA.ownerDocument,bD)===false)&&!(bG==="click"&&b.nodeName(bA,"a"))&&b.acceptData(bA)){if(by&&bA[bG]&&((bG!=="focus"&&bG!=="blur")||bv.target.offsetWidth!==0)&&!b.isWindow(bA)){bz=bA[by];if(bz){bA[by]=null}b.event.triggered=bG;bA[bG]();b.event.triggered=L;if(bz){bA[by]=bz}}}}return bv.result},dispatch:function(e){e=b.event.fix(e||bb.event);var bz=((b._data(this,"events")||{})[e.type]||[]),bA=bz.delegateCount,bG=[].slice.call(arguments,0),by=!e.exclusive&&!e.namespace,bH=[],bC,bB,bK,bx,bF,bE,bv,bD,bI,bw,bJ;bG[0]=e;e.delegateTarget=this;if(bA&&!e.target.disabled&&!(e.button&&e.type==="click")){bx=b(this);bx.context=this.ownerDocument||this;for(bK=e.target;bK!=this;bK=bK.parentNode||this){bE={};bD=[];bx[0]=bK;for(bC=0;bC<bA;bC++){bI=bz[bC];bw=bI.selector;if(bE[bw]===L){bE[bw]=(bI.quick?j(bK,bI.quick):bx.is(bw))}if(bE[bw]){bD.push(bI)}}if(bD.length){bH.push({elem:bK,matches:bD})}}}if(bz.length>bA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC<bH.length&&!e.isPropagationStopped();bC++){bv=bH[bC];e.currentTarget=bv.elem;for(bB=0;bB<bv.matches.length&&!e.isImmediatePropagationStopped();bB++){bI=bv.matches[bB];if(by||(!e.namespace&&!bI.namespace)||e.namespace_re&&e.namespace_re.test(bI.namespace)){e.data=bI.data;e.handleObj=bI;bF=((b.event.special[bI.origType]||{}).handle||bI.handler).apply(bv.elem,bG);if(bF!==L){e.result=bF;if(bF===false){e.preventDefault();e.stopPropagation()}}}}}return e.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(bv,e){if(bv.which==null){bv.which=e.charCode!=null?e.charCode:e.keyCode}return bv}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(bx,bw){var by,bz,e,bv=bw.button,bA=bw.fromElement;if(bx.pageX==null&&bw.clientX!=null){by=bx.target.ownerDocument||av;bz=by.documentElement;e=by.body;bx.pageX=bw.clientX+(bz&&bz.scrollLeft||e&&e.scrollLeft||0)-(bz&&bz.clientLeft||e&&e.clientLeft||0);bx.pageY=bw.clientY+(bz&&bz.scrollTop||e&&e.scrollTop||0)-(bz&&bz.clientTop||e&&e.clientTop||0)}if(!bx.relatedTarget&&bA){bx.relatedTarget=bA===bx.target?bw.toElement:bA}if(!bx.which&&bv!==L){bx.which=(bv&1?1:(bv&2?3:(bv&4?2:0)))}return bx}},fix:function(bw){if(bw[b.expando]){return bw}var bv,bz,e=bw,bx=b.event.fixHooks[bw.type]||{},by=bx.props?this.props.concat(bx.props):this.props;bw=b.Event(e);for(bv=by.length;bv;){bz=by[--bv];bw[bz]=e[bz]}if(!bw.target){bw.target=e.srcElement||av}if(bw.target.nodeType===3){bw.target=bw.target.parentNode}if(bw.metaKey===L){bw.metaKey=bw.ctrlKey}return bx.filter?bx.filter(bw,e):bw},special:{ready:{setup:b.bindReady},load:{noBubble:true},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(bw,bv,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bv,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}},simulate:function(bw,by,bx,bv){var bz=b.extend(new b.Event(),bx,{type:bw,isSimulated:true,originalEvent:{}});if(bv){b.event.trigger(bz,null,by)}else{b.event.dispatch.call(by,bz)}if(bz.isDefaultPrevented()){bx.preventDefault()}}};b.event.handle=b.event.dispatch;b.removeEvent=av.removeEventListener?function(bv,e,bw){if(bv.removeEventListener){bv.removeEventListener(e,bw,false)}}:function(bv,e,bw){if(bv.detachEvent){bv.detachEvent("on"+e,bw)}};b.Event=function(bv,e){if(!(this instanceof b.Event)){return new b.Event(bv,e)}if(bv&&bv.type){this.originalEvent=bv;this.type=bv.type;this.isDefaultPrevented=(bv.defaultPrevented||bv.returnValue===false||bv.getPreventDefault&&bv.getPreventDefault())?i:bk}else{this.type=bv}if(e){b.extend(this,e)}this.timeStamp=bv&&bv.timeStamp||b.now();this[b.expando]=true};function bk(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bv=this.originalEvent;if(!bv){return}if(bv.preventDefault){bv.preventDefault()}else{bv.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bv=this.originalEvent;if(!bv){return}if(bv.stopPropagation){bv.stopPropagation()}bv.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:bk,isPropagationStopped:bk,isImmediatePropagationStopped:bk};b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(bv,e){b.event.special[bv]={delegateType:e,bindType:e,handle:function(bz){var bB=this,bA=bz.relatedTarget,by=bz.handleObj,bw=by.selector,bx;if(!bA||(bA!==bB&&!b.contains(bB,bA))){bz.type=by.origType;bx=by.handler.apply(this,arguments);bz.type=e}return bx}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(){if(b.nodeName(this,"form")){return false
diff --git a/src/jquery_p1_js.h b/src/jquery_p1_js.h
index e48ba50..1effb45 100644
--- a/src/jquery_p1_js.h
+++ b/src/jquery_p1_js.h
@@ -1,3 +1,18 @@
-"/*! jQuery v1.7.1 jquery.com | jquery.org/license */\n"
-"(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f(\"<\"+a+\">\").appendTo(b),e=d.css(\"display\");d.remove();if(e===\"none\"||e===\"\"){cl||(cl=c.createElement(\"iframe\"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode===\"CSS1Compat\"?\"<!doctype html>\":\"\")+\"<html><body>\"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,\"display\"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject(\"Microsoft.XMLHTTP\")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==\"string\"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k===\"*\")k=l;else if(l!==\"*\"&&l!==k){m=l+\" \"+k,n=e[m]||e[\"* \"+k];if(!n){p=b;for(o in e){j=o.split(\" \");if(j[0]===l||j[0]===\"*\"){p=e[j[1]+\" \"+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error(\"No conversion from \"+m.replace(\" \",\" to \")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]===\"*\")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader(\"content-type\"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+\" \"+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+\"[\"+(typeof e==\"object\"||f.isArray(e)?b:\"\")+\"]\",e,c,d)});else if(!c&&b!=null&&typeof b==\"object\")for(var e in b)ca(a+\"[\"+e+\"]\",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==\"string\"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g[\"*\"]&&(l=b$(a,c,d,e,\"*\",g));return l}function bZ(a){return function(b,c){typeof b!=\"string\"&&(c=b,b=\"*\");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\\+/.test(h),j&&(h=h.substr(1)||\"*\"),i=a[h]=a[h]||[],i[j?\"unshift\":\"push\"](c)}}}function bC(a,b,c){var d=b===\"width\"?a.offsetWidth:a.offsetHeight,e=b===\"width\"?bx:by,g=0,h=e.length;if(d>0){if(c!==\"border\")for(;g<h;g++)c||(d-=parseFloat(f.css(a,\"padding\"+e[g]))||0),c===\"margin\"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,\"border\"+e[g]+\"Width\"))||0;return d+\"px\"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,\"padding\"+e[g]))||0,c!==\"padding\"&&(d+=parseFloat(f.css(a,\"border\"+e[g]+\"Width\"))||0),c===\"margin\"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+\"px\"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:\"script\"}):f.globalEval((b.text||b.textContent||b.innerHTML||\"\").replace(bf,\"/*$0*/\")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement(\"div\");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||\"\").toLowerCase();b===\"input\"?bm(a):b!==\"script\"&&typeof a.getElementsByTagName!=\"undefined\"&&f.grep(a.getElementsByTagName(\"input\"),bm)}function bm(a){if(a.type===\"checkbox\"||a.type===\"radio\")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!=\"undefined\"?a.getElementsByTagName(\"*\"):typeof a.querySelectorAll!=\"undefined\"?a.querySelectorAll(\"*\"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c===\"object\")b.outerHTML=a.outerHTML;else if(c!==\"input\"||a.type!==\"checkbox\"&&a.type!==\"radio\"){if(c===\"option\")b.selected=a.defaultSelected;else if(c===\"input\"||c===\"textarea\")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?\".\":\"\")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,\"table\")?a.getElementsByTagName(\"tbody\")[0]||a.appendChild(a.ownerDocument.createElement(\"tbody\")):a}function U(a){var b=V.split(\"|\"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b==\"string\"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+\"defer\",e=b+\"queue\",g=b+\"mark\",h=f._data(a,d);h&&(c===\"queue\"||!f._data(a,e))&&(c===\"mark\"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b===\"data\"&&f.isEmptyObject(a[b]))continue;if(b!==\"toJSON\")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e=\"data-\"+c.replace(k,\"-$1\").toLowerCase();d=a.getAttribute(e);if(typeof d==\"string\"){try{d=d===\"true\"?!0:d===\"false\"?!1:d===\"null\"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll(\"left\")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,j=/\\S/,k=/^\\s+/,l=/\\s+$/,m=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,n=/^[\\],:{}\\s]*$/,o=/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,q=/(?:^|:|,)(?:\\s*\\[)+/g,r=/(webkit)[ \\/]([\\w.]+)/,s=/(opera)(?:.*version)?[ \\/]([\\w.]+)/,t=/(msie) ([\\w.]+)/,u=/(mozilla)(?:.*? rv:([\\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+\"\").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a===\"body\"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a==\"string\"){a.charAt(0)!==\"<\"||a.charAt(a.length-1)!==\">\"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:\"\",jquery:\"1.7.1\",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b===\"find\"?d.selector=this.selector+(this.selector?\" \":\"\")+c:b&&(d.selector=this.selector+\".\"+b+\"(\"+c+\")\");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),\"slice\",F.call(arguments).join(\",\"))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==\"boolean\"&&(l=i,i=arguments[1]||{},j=2),typeof i!=\"object\"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger(\"ready\").off(\"ready\")}},bindReady:function(){if(!A){A=e.Callbacks(\"once memory\");if(c.readyState===\"complete\")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener(\"DOMContentLoaded\",B,!1),a.addEventListener(\"load\",e.ready,!1);else if(c.attachEvent){c.attachEvent(\"onreadystatechange\",B),a.attachEvent(\"onload\",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)===\"function\"},isArray:Array.isArray||function(a){return e.type(a)===\"array\"},isWindow:function(a){return a&&typeof a==\"object\"&&\"setInterval\"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||\"object\"},isPlainObject:function(a){if(!a||e.type(a)!==\"object\"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,\"constructor\")&&!D.call(a.constructor.prototype,\"isPrototypeOf\"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!=\"string\"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,\"@\").replace(p,\"]\").replace(q,\"\")))return(new Function(\"return \"+b))();e.error(\"Invalid JSON: \"+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,\"text/xml\")):(d=new ActiveXObject(\"Microsoft.XMLDOM\"),d.async=\"false\",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName(\"parsererror\").length)&&e.error(\"Invalid XML: \"+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,\"ms-\").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?\"\":G.call(a)}:function(a){return a==null?\"\":(a+\"\").replace(k,\"\").replace(l,\"\")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d===\"string\"||d===\"function\"||d===\"regexp\"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==\"number\")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j==\"number\"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c==\"string\"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c==\"object\"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf(\"compatible\")<0&&u.exec(a)||[];return{browser:b[1]||\"\",version:b[2]||\"0\"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"),function(a,b){I[\"[object \"+b+\"]\"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(\" \")&&(k=/^[\\s\\xA0]+/,l=/[\\s\\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener(\"DOMContentLoaded\",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState===\"complete\"&&(c.detachEvent(\"onreadystatechange\",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h===\"array\"?m(g):h===\"function\"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks(\"once memory\"),c=f.Callbacks(\"once memory\"),d=f.Callbacks(\"memory\"),e=\"pending\",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,\"resolve\"],fail:[b,\"reject\"],progress:[c,\"notify\"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function()\n"
-"{g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+\"With\"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+\"With\"]=g[j].fireWith;i.done(function(){e=\"resolved\"},c.disable,d.lock).fail(function(){e=\"rejected\"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement(\"div\"),r=c.documentElement;q.setAttribute(\"className\",\"t\"),q.innerHTML=\" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>\",d=q.getElementsByTagName(\"*\"),e=q.getElementsByTagName(\"a\")[0];if(!d||!d.length||!e)return{};g=c.createElement(\"select\"),h=g.appendChild(c.createElement(\"option\")),i=q.getElementsByTagName(\"input\")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName(\"tbody\").length,htmlSerialize:!!q.getElementsByTagName(\"link\").length,style:/top/.test(e.getAttribute(\"style\")),hrefNormalized:e.getAttribute(\"href\")===\"/a\",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value===\"on\",optSelected:h.selected,getSetAttribute:q.className!==\"t\",enctype:!!c.createElement(\"form\").enctype,html5Clone:c.createElement(\"nav\").cloneNode(!0).outerHTML!==\"<:nav></:nav>\",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent(\"onclick\",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent(\"onclick\")),i=c.createElement(\"input\"),i.value=\"t\",i.setAttribute(\"type\",\"radio\"),b.radioValue=i.value===\"t\",i.setAttribute(\"checked\",\"checked\"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML=\"\",a.getComputedStyle&&(j=c.createElement(\"div\"),j.style.width=\"0\",j.style.marginRight=\"0\",q.style.width=\"2px\",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n=\"on\"+o,p=n in q,p||(q.setAttribute(n,\"return;\"),p=typeof q[n]==\"function\"),b[o+\"Bubbles\"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName(\"body\")[0];!r||(j=1,k=\"position:absolute;top:0;left:0;width:1px;height:1px;margin:0;\",m=\"visibility:hidden;border:0;\",n=\"style='\"+k+\"border:5px solid #000;padding:0;'\",o=\"<div \"+n+\"><div></div></div>\"+\"<table \"+n+\" cellpadding='0' cellspacing='0'>\"+\"<tr><td></td></tr></table>\",a=c.createElement(\"div\"),a.style.cssText=m+\"width:0;height:0;position:static;top:0;margin-top:\"+j+\"px\",r.insertBefore(a,r.firstChild),q=c.createElement(\"div\"),a.appendChild(q),q.innerHTML=\"<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>\",l=q.getElementsByTagName(\"td\"),p=l[0].offsetHeight===0,l[0].style.display=\"\",l[1].style.display=\"none\",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML=\"\",q.style.width=q.style.paddingLeft=\"1px\",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!=\"undefined\"&&(q.style.display=\"inline\",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display=\"\",q.innerHTML=\"<div style='width:4px;'></div>\",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position=\"fixed\",e.style.top=\"20px\",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top=\"\",d.style.overflow=\"hidden\",d.style.position=\"relative\",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\\{.*\\}|\\[.*\\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:\"jQuery\"+(f.fn.jquery+Math.random()).replace(/\\D/g,\"\"),noData:{embed:!0,object:\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c==\"string\",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c===\"events\";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c==\"object\"||typeof c==\"function\")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(\" \")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute(\"classid\")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a==\"undefined\"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],\"parsedAttrs\")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf(\"data-\")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],\"parsedAttrs\",!0)}}return h}if(typeof a==\"object\")return this.each(function(){f.data(this,a)});d=a.split(\".\"),d[1]=d[1]?\".\"+d[1]:\"\";if(c===b){h=this.triggerHandler(\"getData\"+d[1]+\"!\",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler(\"setData\"+d[1]+\"!\",e),f.data(this,a,c),b.triggerHandler(\"changeData\"+d[1]+\"!\",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||\"fx\")+\"mark\",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||\"fx\";var d=c+\"mark\",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,\"mark\"))}},queue:function(a,b,c){var d;if(a){b=(b||\"fx\")+\"queue\",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||\"fx\";var c=f.queue(a,b),d=c.shift(),e={};d===\"inprogress\"&&(d=c.shift()),d&&(b===\"fx\"&&c.unshift(\"inprogress\"),f._data(a,b+\".run\",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+\"queue \"+b+\".run\",!0),n(a,b,\"queue\"))}}),f.fn.extend({queue:function(a,c){typeof a!=\"string\"&&(c=a,a=\"fx\");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a===\"fx\"&&b[0]!==\"inprogress\"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||\"fx\";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||\"fx\",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!=\"string\"&&(c=a,a=b),a=a||\"fx\";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+\"defer\",j=a+\"queue\",k=a+\"mark\",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks(\"once memory\"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\\n\\t\\r]/g,p=/\\s+/,q=/\\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a==\"string\"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=\" \"+e.className+\" \";for(h=0,i=b.length;h<i;h++)~g.indexOf(\" \"+b[h]+\" \")||(g+=b[h]+\" \");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a==\"string\"||a===b){c=(a||\"\").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(\" \"+g.className+\" \").replace(o,\" \");for(i=0,j=c.length;i<j;i++)h=h.replace(\" \"+c[i]+\" \",\" \");g.className=f.trim(h)}else g.className=\"\"}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b==\"boolean\";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c===\"string\"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?\"addClass\":\"removeClass\"](e)}else if(c===\"undefined\"||c===\"boolean\")this.className&&f._data(this,\"__className__\",this.className),this.className=this.className||a===!1?\"\":f._data(this,\"__className__\")||\"\"})},hasClass:function(a){var b=\" \"+a+\" \",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(\" \"+this[c].className+\" \").replace(o,\" \").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h=\"\":typeof h==\"number\"?h+=\"\":f.isArray(h)&&(h=f.map(h,function(a){return a==null?\"\":a+\"\"})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!(\"set\"in c)||c.set(this,h,\"value\")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&\"get\"in c&&(d=c.get(g,\"value\"))!==b)return d;d=g.value;return typeof d==\"string\"?d.replace(q,\"\"):d==null?\"\":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type===\"select-one\";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute(\"disabled\")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,\"optgroup\"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find(\"option\").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute==\"undefined\")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&\"set\"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,\"\"+d);return d}if(h&&\"get\"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,\"\"),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error(\"type property can't be changed\");else if(!f.support.radioValue&&b===\"radio\"&&f.nodeName(a,\"input\")){var c=a.value;a.setAttribute(\"type\",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,\"button\"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,\"button\"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:\"tabIndex\",readonly:\"readOnly\",\"for\":\"htmlFor\",\"class\":\"className\",maxlength:\"maxLength\",cellspacing:\"cellSpacing\",cellpadding:\"cellPadding\",rowspan:\"rowSpan\",colspan:\"colSpan\",usemap:\"useMap\",frameborder:\"frameBorder\",contenteditable:\"contentEditable\"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&\"set\"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&\"get\"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode(\"tabindex\");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!=\"boolean\"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!==\"\":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+\"\"}},f.attrHooks.tabindex.set=w.set,f.each([\"width\",\"height\"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===\"\"){a.setAttribute(b,\"auto\");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===\"\"&&(b=\"false\"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each([\"href\",\"src\",\"width\",\"height\"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=\"\"+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype=\"encoding\"),f.support.checkOn||f.each([\"radio\",\"checkbox\"],function(){f.valHooks[this]={get:function(a){return a.getAttribute(\"value\")===null?\"on\":a.value}}}),f.each([\"radio\",\"checkbox\"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\\.]*)?(?:\\.(.+))?$/,B=/\\bhover(\\.\\S+)?\\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||\"\").toLowerCase(),b[3]=b[3]&&new RegExp(\"(?:^|\\\\s)\"+b[3]+\"(?:\\\\s|$)\"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c[\"class\"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,\"mouseenter$1 mouseleave$1\")};\n"
+"/*!\n"
+" * jQuery JavaScript Library v1.7.1\n"
+" * http://jquery.com/\n"
+" *\n"
+" * Copyright 2011, John Resig\n"
+" * Dual licensed under the MIT or GPL Version 2 licenses.\n"
+" * http://jquery.org/license\n"
+" *\n"
+" * Includes Sizzle.js\n"
+" * http://sizzlejs.com/\n"
+" * Copyright 2011, The Dojo Foundation\n"
+" * Released under the MIT, BSD, and GPL Licenses.\n"
+" *\n"
+" * Date: Mon Nov 21 21:11:03 2011 -0500\n"
+" */\n"
+"(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,bM=/\\S/,bI=/^\\s+/,bE=/\\s+$/,bA=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,bN=/^[\\],:{}\\s]*$/,bW=/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,bJ=/(?:^|:|,)(?:\\s*\\[)+/g,by=/(webkit)[ \\/]([\\w.]+)/,bR=/(opera)(?:.*version)?[ \\/]([\\w.]+)/,bQ=/(msie) ([\\w.]+)/,bS=/(mozilla)(?:.*? rv:([\\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+\"\").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0===\"body\"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0===\"string\"){if(b0.charAt(0)===\"<\"&&b0.charAt(b0.length-1)===\">\"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:\"\",jquery:\"1.7.1\",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3===\"find\"){b2.selector=this.selector+(this.selector?\" \":\"\")+b0}else{if(b3){b2.selector=this.selector+\".\"+b3+\"(\"+b0+\")\"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),\"slice\",bK.call(arguments).join(\",\"))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5===\"boolean\"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!==\"object\"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b4<b3;b4++){if((b9=arguments[b4])!=null){for(b2 in b9){b0=b5[b2];b1=b9[b2];if(b5===b1){continue}if(b8&&b1&&(bF.isPlainObject(b1)||(b6=bF.isArray(b1)))){if(b6){b6=false;b7=b0&&bF.isArray(b0)?b0:[]}else{b7=b0&&bF.isPlainObject(b0)?b0:{}}b5[b2]=bF.extend(b8,b7,b1)}else{if(b1!==L){b5[b2]=b1}}}}}return b5};bF.extend({noConflict:function(b0){if(bb.$===bF){bb.$=bH}if(b0&&bb.jQuery===bF){bb.jQuery=bU}return bF},isReady:false,readyWait:1,holdReady:function(b0){if(b0){bF.readyWait++}else{bF.ready(true)}},ready:function(b0){if((b0===true&&!--bF.readyWait)||(b0!==true&&!bF.isReady)){if(!av.body){return setTimeout(bF.ready,1)}bF.isReady=true;if(b0!==true&&--bF.readyWait>0){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger(\"ready\").off(\"ready\")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks(\"once memory\");if(av.readyState===\"complete\"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener(\"DOMContentLoaded\",e,false);bb.addEventListener(\"load\",bF.ready,false)}else{if(av.attachEvent){av.attachEvent(\"onreadystatechange\",e);bb.attachEvent(\"onload\",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)===\"function\"},isArray:Array.isArray||function(b0){return bF.type(b0)===\"array\"},isWindow:function(b0){return b0&&typeof b0===\"object\"&&\"setInterval\" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||\"object\"},isPlainObject:function(b2){if(!b2||bF.type(b2)!==\"object\"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,\"constructor\")&&!bG.call(b2.constructor.prototype,\"isPrototypeOf\")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!==\"string\"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,\"@\").replace(bP,\"]\").replace(bJ,\"\"))){return(new Function(\"return \"+b0))()}bF.error(\"Invalid JSON: \"+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,\"text/xml\")}else{b0=new ActiveXObject(\"Microsoft.XMLDOM\");b0.async=\"false\";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName(\"parsererror\").length){bF.error(\"Invalid XML: \"+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb[\"eval\"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,\"ms-\").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b4<b5;){if(b6.apply(b3[b4++],b2)===false){break}}}}else{if(b0){for(b1 in b3){if(b6.call(b3[b1],b1,b3[b1])===false){break}}}else{for(;b4<b5;){if(b6.call(b3[b4],b4,b3[b4++])===false){break}}}}return b3},trim:bO?function(b0){return b0==null?\"\":bO.call(b0)}:function(b0){return b0==null?\"\":b0.toString().replace(bI,\"\").replace(bE,\"\")},makeArray:function(b3,b1){var b0=b1||[];if(b3!=null){var b2=bF.type(b3);if(b3.length==null||b2===\"string\"||b2===\"function\"||b2===\"regexp\"||bF.isWindow(b3)){bz.call(b0,b3)}else{bF.merge(b0,b3)}}return b0},inArray:function(b2,b3,b1){var b0;if(b3){if(bv){return bv.call(b3,b2,b1)}b0=b3.length;b1=b1?b1<0?Math.max(0,b0+b1):b1:0;for(;b1<b0;b1++){if(b1 in b3&&b3[b1]===b2){return b1}}}return -1},merge:function(b4,b2){var b3=b4.length,b1=0;if(typeof b2.length===\"number\"){for(var b0=b2.length;b1<b0;b1++){b4[b3++]=b2[b1]}}else{while(b2[b1]!==L){b4[b3++]=b2[b1++]}}b4.length=b3;return b4},grep:function(b1,b6,b0){var b2=[],b5;b0=!!b0;for(var b3=0,b4=b1.length;b3<b4;b3++){b5=!!b6(b1[b3],b3);if(b0!==b5){b2.push(b1[b3])}}return b2},map:function(b0,b7,b8){var b5,b6,b4=[],b2=0,b1=b0.length,b3=b0 instanceof bF||b1!==L&&typeof b1===\"number\"&&((b1>0&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b2<b1;b2++){b5=b7(b0[b2],b2,b8);if(b5!=null){b4[b4.length]=b5}}}else{for(b6 in b0){b5=b7(b0[b6],b6,b8);if(b5!=null){b4[b4.length]=b5}}}return b4.concat.apply([],b4)},guid:1,proxy:function(b4,b3){if(typeof b3===\"string\"){var b2=b4[b3];b3=b4;b4=b2}if(!bF.isFunction(b4)){return L}var b0=bK.call(arguments,2),b1=function(){return b4.apply(b3,b0.concat(bK.call(arguments)))};b1.guid=b4.guid=b4.guid||b1.guid||bF.guid++;return b1},access:function(b0,b8,b6,b2,b5,b7){var b1=b0.length;if(typeof b8===\"object\"){for(var b3 in b8){bF.access(b0,b3,b8[b3],b2,b5,b6)}return b0}if(b6!==L){b2=!b7&&b2&&bF.isFunction(b6);for(var b4=0;b4<b1;b4++){b5(b0[b4],b8,b2?b6.call(b0[b4],b4,b5(b0[b4],b8)):b6,b7)}return b0}return b1?b5(b0[0],b8):L},now:function(){return(new Date()).getTime()},uaMatch:function(b1){b1=b1.toLowerCase();var b0=by.exec(b1)||bR.exec(b1)||bQ.exec(b1)||b1.indexOf(\"compatible\")<0&&bS.exec(b1)||[];return{browser:b0[1]||\"\",version:b0[2]||\"0\"}},sub:function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bF.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bF&&!(b4 instanceof b0)){b4=b0(b4)}return bF.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(av);return b0},browser:{}});bF.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"),function(b1,b0){bx[\"[object \"+b0+\"]\"]=b0.toLowerCase()});bV=bF.uaMatch(bX);if(bV.browser){bF.browser[bV.browser]=true;bF.browser.version=bV.version}if(bF.browser.webkit){bF.browser.safari=true}if(bM.test(\"\\xA0\")){bI=/^[\\s\\xA0]+/;bE=/[\\s\\xA0]+$/}bD=bF(av);if(av.addEventListener){e=function(){av.removeEventListener(\"DOMContentLoaded\",e,false);bF.ready()}}else{if(av.attachEvent){e=function(){if(av.readyState===\"complete\"){av.detachEvent(\"onreadystatechange\",e);bF.ready()}}}}function bw(){if(bF.isReady){return}try{av.documentElement.doScroll(\"left\")}catch(b0){setTimeout(bw,1);return}bF.ready()}return bF})();var a2={};function X(e){var bv=a2[e]={},bw,bx;e=e.split(/\\s+/);for(bw=0,bx=e.length;bw<bx;bw++){bv[e[bw]]=true}return bv}b.Callbacks=function(bw){bw=bw?(a2[bw]||X(bw)):{};var bB=[],bC=[],bx,by,bv,bz,bA,bE=function(bF){var bG,bJ,bI,bH,bK;for(bG=0,bJ=bF.length;bG<bJ;bG++){bI=bF[bG];bH=b.type(bI);if(bH===\"array\"){bE(bI)}else{if(bH===\"function\"){if(!bw.unique||!bD.has(bI)){bB.push(bI)}}}}},e=function(bG,bF){bF=bF||[];bx=!bw.memory||[bG,bF];by=true;bA=bv||0;bv=0;bz=bB.length;for(;bB&&bA<bz;bA++){if(bB[bA].apply(bG,bF)===false&&bw.stopOnFalse){bx=true;break}}by=false;if(bB){if(!bw.once){if(bC&&bC.length){bx=bC.shift();bD.fireWith(bx[0],bx[1])}}else{if(bx===true){bD.disable()}else{bB=[]}}}},bD={add:function(){if(bB){var bF=bB.length;bE(arguments);if(by){bz=bB.length}else{if(bx&&bx!==true){bv=bF;e(bx[0],bx[1])}}}return this},remove:function(){if(bB){var bF=arguments,bH=0,bI=bF.length;for(;bH<bI;bH++){for(var bG=0;bG<bB.length;bG++){if(bF[bH]===bB[bG]){if(by){if(bG<=bz){bz--;if(bG<=bA){bA--}}}bB.splice(bG--,1);if(bw.unique){break}}}}}return this},has:function(bG){if(bB){var bF=0,bH=bB.length;for(;bF<bH;bF++){if(bG===bB[bF]){return true}}}return false},empty:function(){bB=[];return this},disable:function(){bB=bC=bx=L;return this},disabled:function(){return !bB},lock:function(){bC=L;if(!bx||bx===true){bD.disable()}return this},locked:function(){return !bC},fireWith:function(bG,bF){if(bC){if(by){if(!bw.once){bC.push([bG,bF])}}else{if(!(bw.once&&bx)){e(bG,bF)}}}return this},fire:function(){bD.fireWith(this,arguments);return this},fired:function(){return !!bx}};return bD};var aJ=[].slice;b.extend({Deferred:function(by){var bx=b.Callbacks(\"once memory\"),bw=b.Callbacks(\"once memory\"),bv=b.Callbacks(\"memory\"),e=\"pending\",bA={resolve:bx,reject:bw,notify:bv},bC={done:bx.add,fail:bw.add,progress:bv.add,state:function(){return e},isResolved:bx.fired,isRejected:bw.fired,then:function(bE,bD,bF){bB.done(bE).fail(bD).progress(bF);return this},always:function(){bB.done.apply(bB,arguments).fail.apply(bB,arguments);return this},pipe:function(bF,bE,bD){return b.Deferred(function(bG){b.each({done:[bF,\"resolve\"],fail:[bE,\"reject\"],progress:[bD,\"notify\"]},function(bI,bL){var bH=bL[0],bK=bL[1],bJ;if(b.isFunction(bH)){bB[bI](function(){bJ=bH.apply(this,arguments);if(bJ&&b.isFunction(bJ.promise)){bJ.promise().then(bG.resolve,bG.reject,bG.notify)}else{bG[bK+\"With\"](this===bB?bG:this,[bJ])}})}else{bB[bI](bG[bK])}})}).promise()},promise:function(bE){if(bE==null){bE=bC}else{for(var bD in bC){bE[bD]=bC[bD]}}return bE}},bB=bC.promise({}),bz;for(bz in bA){bB[bz]=bA[bz].fire;bB[bz+\"With\"]=bA[bz].fireWith}bB.done(function(){e=\"resolved\"},bw.disable,bv.lock).fail(function(){e=\"rejected\"},bx.disable,bv.lock);if(by){by.call(bB,bB)}return bB},when:function(bA){var bx=aJ.call(arguments,0),bv=0,e=bx.length,bB=new Array(e),bw=e,by=e,bC=e<=1&&bA&&b.isFunction(bA.promise)?bA:b.Deferred(),bE=bC.promise();function bD(bF){return function(bG){bx[bF]=arguments.length>1?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv<e;bv++){if(bx[bv]&&bx[bv].promise&&b.isFunction(bx[bv].promise)){bx[bv].promise().then(bD(bv),bC.reject,bz(bv))\n"
+"}else{--bw}}if(!bw){bC.resolveWith(bC,bx)}}else{if(bC!==bA){bC.resolveWith(bC,e?[bA]:[])}}return bE}});b.support=(function(){var bJ,bI,bF,bG,bx,bE,bA,bD,bz,bK,bB,by,bw,bv=av.createElement(\"div\"),bH=av.documentElement;bv.setAttribute(\"className\",\"t\");bv.innerHTML=\" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>\";bI=bv.getElementsByTagName(\"*\");bF=bv.getElementsByTagName(\"a\")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement(\"select\");bx=bG.appendChild(av.createElement(\"option\"));bE=bv.getElementsByTagName(\"input\")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName(\"tbody\").length,htmlSerialize:!!bv.getElementsByTagName(\"link\").length,style:/top/.test(bF.getAttribute(\"style\")),hrefNormalized:(bF.getAttribute(\"href\")===\"/a\"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value===\"on\"),optSelected:bx.selected,getSetAttribute:bv.className!==\"t\",enctype:!!av.createElement(\"form\").enctype,html5Clone:av.createElement(\"nav\").cloneNode(true).outerHTML!==\"<:nav></:nav>\",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent(\"onclick\",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent(\"onclick\")}bE=av.createElement(\"input\");bE.value=\"t\";bE.setAttribute(\"type\",\"radio\");bJ.radioValue=bE.value===\"t\";bE.setAttribute(\"checked\",\"checked\");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML=\"\";if(bb.getComputedStyle){bA=av.createElement(\"div\");bA.style.width=\"0\";bA.style.marginRight=\"0\";bv.style.width=\"2px\";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB=\"on\"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,\"return;\");bw=(typeof bv[bB]===\"function\")}bJ[by+\"Bubbles\"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName(\"body\")[0];if(!bQ){return}bL=1;bS=\"position:absolute;top:0;left:0;width:1px;height:1px;margin:0;\";bR=\"visibility:hidden;border:0;\";e=\"style='\"+bS+\"border:5px solid #000;padding:0;'\";bP=\"<div \"+e+\"><div></div></div><table \"+e+\" cellpadding='0' cellspacing='0'><tr><td></td></tr></table>\";bM=av.createElement(\"div\");bM.style.cssText=bR+\"width:0;height:0;position:static;top:0;margin-top:\"+bL+\"px\";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement(\"div\");bM.appendChild(bv);bv.innerHTML=\"<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>\";bz=bv.getElementsByTagName(\"td\");bw=(bz[0].offsetHeight===0);bz[0].style.display=\"\";bz[1].style.display=\"none\";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML=\"\";bv.style.width=bv.style.paddingLeft=\"1px\";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!==\"undefined\"){bv.style.display=\"inline\";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display=\"\";bv.innerHTML=\"<div style='width:4px;'></div>\";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position=\"fixed\";bV.style.top=\"20px\";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top=\"\";bU.style.overflow=\"hidden\";bU.style.position=\"relative\";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\\{.*\\}|\\[.*\\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:\"jQuery\"+(b.fn.jquery+Math.random()).replace(/\\D/g,\"\"),noData:{embed:true,object:\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv===\"string\",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv===\"events\";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv===\"object\"||typeof bv===\"function\"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(\" \")}}}for(bA=0,bz=bv.length;bA<bz;bA++){delete bB[bv[bA]]}if(!(by?S:b.isEmptyObject)(bB)){return}}}if(!by){delete e[bw].data;if(!S(e[bw])){return}}if(b.support.deleteExpando||!e.setInterval){delete e[bw]}else{e[bw]=null}if(bD){if(b.support.deleteExpando){delete bx[bC]}else{if(bx.removeAttribute){bx.removeAttribute(bC)}else{bx[bC]=null}}}},_data:function(bv,e,bw){return b.data(bv,e,bw,true)},acceptData:function(bv){if(bv.nodeName){var e=b.noData[bv.nodeName.toLowerCase()];if(e){return !(e===true||bv.getAttribute(\"classid\")!==e)}}return true}});b.fn.extend({data:function(by,bA){var bB,e,bw,bz=null;if(typeof by===\"undefined\"){if(this.length){bz=b.data(this[0]);if(this[0].nodeType===1&&!b._data(this[0],\"parsedAttrs\")){e=this[0].attributes;for(var bx=0,bv=e.length;bx<bv;bx++){bw=e[bx].name;if(bw.indexOf(\"data-\")===0){bw=b.camelCase(bw.substring(5));a5(this[0],bw,bz[bw])}}b._data(this[0],\"parsedAttrs\",true)}}return bz}else{if(typeof by===\"object\"){return this.each(function(){b.data(this,by)})}}bB=by.split(\".\");bB[1]=bB[1]?\".\"+bB[1]:\"\";if(bA===L){bz=this.triggerHandler(\"getData\"+bB[1]+\"!\",[bB[0]]);if(bz===L&&this.length){bz=b.data(this[0],by);bz=a5(this[0],by,bz)}return bz===L&&bB[1]?this.data(bB[0]):bz}else{return this.each(function(){var bC=b(this),bD=[bB[0],bA];bC.triggerHandler(\"setData\"+bB[1]+\"!\",bD);b.data(this,by,bA);bC.triggerHandler(\"changeData\"+bB[1]+\"!\",bD)})}},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a5(bx,bw,by){if(by===L&&bx.nodeType===1){var bv=\"data-\"+bw.replace(aA,\"-$1\").toLowerCase();by=bx.getAttribute(bv);if(typeof by===\"string\"){try{by=by===\"true\"?true:by===\"false\"?false:by===\"null\"?null:b.isNumeric(by)?parseFloat(by):aS.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e===\"data\"&&b.isEmptyObject(bv[e])){continue}if(e!==\"toJSON\"){return false}}return true}function bi(by,bx,bA){var bw=bx+\"defer\",bv=bx+\"queue\",e=bx+\"mark\",bz=b._data(by,bw);if(bz&&(bA===\"queue\"||!b._data(by,bv))&&(bA===\"mark\"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||\"fx\")+\"mark\";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||\"fx\";var e=bv+\"mark\",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bi(bx,bv,\"mark\")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||\"fx\")+\"queue\";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||\"fx\";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw===\"inprogress\"){bw=bv.shift()}if(bw){if(bx===\"fx\"){bv.unshift(\"inprogress\")}b._data(by,bx+\".run\",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+\"queue \"+bx+\".run\",true);bi(by,bx,\"queue\")}}});b.fn.extend({queue:function(e,bv){if(typeof e!==\"string\"){bv=e;e=\"fx\"}if(bv===L){return b.queue(this[0],e)}return this.each(function(){var bw=b.queue(this,e,bv);if(e===\"fx\"&&bw[0]!==\"inprogress\"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bv,e){bv=b.fx?b.fx.speeds[bv]||bv:bv;e=e||\"fx\";return this.queue(e,function(bx,bw){var by=setTimeout(bx,bv);bw.stop=function(){clearTimeout(by)}})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(bD,bw){if(typeof bD!==\"string\"){bw=bD;bD=L}bD=bD||\"fx\";var e=b.Deferred(),bv=this,by=bv.length,bB=1,bz=bD+\"defer\",bA=bD+\"queue\",bC=bD+\"mark\",bx;function bE(){if(!(--bB)){e.resolveWith(bv,[bv])}}while(by--){if((bx=b.data(bv[by],bz,L,true)||(b.data(bv[by],bA,L,true)||b.data(bv[by],bC,L,true))&&b.data(bv[by],bz,b.Callbacks(\"once memory\"),true))){bB++;bx.add(bE)}}bE();return e.promise()}});var aP=/[\\n\\t\\r]/g,af=/\\s+/,aU=/\\r/g,g=/^(?:button|input)$/i,D=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,ao=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,F=b.support.getSetAttribute,be,aY,aF;b.fn.extend({attr:function(e,bv){return b.access(this,e,bv,true,b.attr)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,e,bv,true,b.prop)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by===\"string\"){bA=by.split(af);for(bw=0,bv=this.length;bw<bv;bw++){bx=this[bw];if(bx.nodeType===1){if(!bx.className&&bA.length===1){bx.className=by}else{bz=\" \"+bx.className+\" \";for(bB=0,e=bA.length;bB<e;bB++){if(!~bz.indexOf(\" \"+bA[bB]+\" \")){bz+=bA[bB]+\" \"}}bx.className=b.trim(bz)}}}}return this},removeClass:function(bz){var bA,bw,bv,by,bx,bB,e;if(b.isFunction(bz)){return this.each(function(bC){b(this).removeClass(bz.call(this,bC,this.className))})}if((bz&&typeof bz===\"string\")||bz===L){bA=(bz||\"\").split(af);for(bw=0,bv=this.length;bw<bv;bw++){by=this[bw];if(by.nodeType===1&&by.className){if(bz){bx=(\" \"+by.className+\" \").replace(aP,\" \");for(bB=0,e=bA.length;bB<e;bB++){bx=bx.replace(\" \"+bA[bB]+\" \",\" \")}by.className=b.trim(bx)}else{by.className=\"\"}}}}return this},toggleClass:function(bx,bv){var bw=typeof bx,e=typeof bv===\"boolean\";if(b.isFunction(bx)){return this.each(function(by){b(this).toggleClass(bx.call(this,by,this.className,bv),bv)})}return this.each(function(){if(bw===\"string\"){var bA,bz=0,by=b(this),bB=bv,bC=bx.split(af);while((bA=bC[bz++])){bB=e?bB:!by.hasClass(bA);by[bB?\"addClass\":\"removeClass\"](bA)}}else{if(bw===\"undefined\"||bw===\"boolean\"){if(this.className){b._data(this,\"__className__\",this.className)}this.className=this.className||bx===false?\"\":b._data(this,\"__className__\")||\"\"}}})},hasClass:function(e){var bx=\" \"+e+\" \",bw=0,bv=this.length;for(;bw<bv;bw++){if(this[bw].nodeType===1&&(\" \"+this[bw].className+\" \").replace(aP,\" \").indexOf(bx)>-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&\"get\" in e&&(bv=e.get(bw,\"value\"))!==L){return bv}bv=bw.value;return typeof bv===\"string\"?bv.replace(aU,\"\"):bv==null?\"\":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=\"\"}else{if(typeof bB===\"number\"){bB+=\"\"}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?\"\":bC+\"\"})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!(\"set\" in e)||e.set(this,bB,\"value\")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type===\"select-one\";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv<bz;bv++){bx=bC[bv];if(bx.selected&&(b.support.optDisabled?!bx.disabled:bx.getAttribute(\"disabled\")===null)&&(!bx.parentNode.disabled||!b.nodeName(bx.parentNode,\"optgroup\"))){bA=b(bx).val();if(bw){return bA}bB.push(bA)}}if(bw&&!bB.length&&bC.length){return b(bC[by]).val()}return bB},set:function(bv,bw){var e=b.makeArray(bw);b(bv).find(\"option\").each(function(){this.selected=b.inArray(b(this).val(),e)>=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;\n"
+"if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute===\"undefined\"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&\"set\" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,\"\"+bB);return bB}}}else{if(e&&\"get\" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw<e;bw++){bv=bA[bw];if(bv){by=b.propFix[bv]||bv;b.attr(bx,bv,\"\");bx.removeAttribute(F?bv:by);if(ao.test(bv)&&by in bx){bx[by]=false}}}}},attrHooks:{type:{set:function(e,bv){if(g.test(e.nodeName)&&e.parentNode){b.error(\"type property can't be changed\")}else{if(!b.support.radioValue&&bv===\"radio\"&&b.nodeName(e,\"input\")){var bw=e.value;e.setAttribute(\"type\",bv);if(bw){e.value=bw}return bv}}}},value:{get:function(bv,e){if(be&&b.nodeName(bv,\"button\")){return be.get(bv,e)}return e in bv?bv.value:null},set:function(bv,bw,e){if(be&&b.nodeName(bv,\"button\")){return be.set(bv,bw,e)}bv.value=bw}}},propFix:{tabindex:\"tabIndex\",readonly:\"readOnly\",\"for\":\"htmlFor\",\"class\":\"className\",maxlength:\"maxLength\",cellspacing:\"cellSpacing\",cellpadding:\"cellPadding\",rowspan:\"rowSpan\",colspan:\"colSpan\",usemap:\"useMap\",frameborder:\"frameBorder\",contenteditable:\"contentEditable\"},prop:function(bz,bx,bA){var bw,e,by,bv=bz.nodeType;if(!bz||bv===3||bv===8||bv===2){return}by=bv!==1||!b.isXMLDoc(bz);if(by){bx=b.propFix[bx]||bx;e=b.propHooks[bx]}if(bA!==L){if(e&&\"set\" in e&&(bw=e.set(bz,bA,bx))!==L){return bw}else{return(bz[bx]=bA)}}else{if(e&&\"get\" in e&&(bw=e.get(bz,bx))!==null){return bw}else{return bz[bx]}}},propHooks:{tabIndex:{get:function(bv){var e=bv.getAttributeNode(\"tabindex\");return e&&e.specified?parseInt(e.value,10):D.test(bv.nodeName)||l.test(bv.nodeName)&&bv.href?0:L}}}});b.attrHooks.tabindex=b.propHooks.tabIndex;aY={get:function(bv,e){var bx,bw=b.prop(bv,e);return bw===true||typeof bw!==\"boolean\"&&(bx=bv.getAttributeNode(e))&&bx.nodeValue!==false?e.toLowerCase():L},set:function(bv,bx,e){var bw;if(bx===false){b.removeAttr(bv,e)}else{bw=b.propFix[e]||e;if(bw in bv){bv[bw]=true}bv.setAttribute(e,e.toLowerCase())}return e}};if(!F){aF={name:true,id:true};be=b.valHooks.button={get:function(bw,bv){var e;e=bw.getAttributeNode(bv);return e&&(aF[bv]?e.nodeValue!==\"\":e.specified)?e.nodeValue:L},set:function(bw,bx,bv){var e=bw.getAttributeNode(bv);if(!e){e=av.createAttribute(bv);bw.setAttributeNode(e)}return(e.nodeValue=bx+\"\")}};b.attrHooks.tabindex.set=be.set;b.each([\"width\",\"height\"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{set:function(bw,bx){if(bx===\"\"){bw.setAttribute(e,\"auto\");return bx}}})});b.attrHooks.contenteditable={get:be.get,set:function(bv,bw,e){if(bw===\"\"){bw=\"false\"}be.set(bv,bw,e)}}}if(!b.support.hrefNormalized){b.each([\"href\",\"src\",\"width\",\"height\"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{get:function(bx){var bw=bx.getAttribute(e,2);return bw===null?L:bw}})})}if(!b.support.style){b.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||L},set:function(e,bv){return(e.style.cssText=\"\"+bv)}}}if(!b.support.optSelected){b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(bv){var e=bv.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}})}if(!b.support.enctype){b.propFix.enctype=\"encoding\"}if(!b.support.checkOn){b.each([\"radio\",\"checkbox\"],function(){b.valHooks[this]={get:function(e){return e.getAttribute(\"value\")===null?\"on\":e.value}}})}b.each([\"radio\",\"checkbox\"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,bv){if(b.isArray(bv)){return(e.checked=b.inArray(b(e).val(),bv)>=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\\.]*)?(?:\\.(.+))?$/,J=/\\bhover(\\.\\S+)?\\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||\"\").toLowerCase();bv[3]=bv[3]&&new RegExp(\"(?:^|\\\\s)\"+bv[3]+\"(?:\\\\s|$)\")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv[\"class\"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,\"mouseenter$1 mouseleave$1\")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!==\"undefined\"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(\" \");for(bI=0;bI<bC.length;bI++){bH=n.exec(bC[bI])||[];bF=bH[1];e=(bH[2]||\"\").split(\".\").sort();bE=b.event.special[bF]||{};bF=(by?bE.delegateType:bE.bindType)||bF;bE=b.event.special[bF]||{};bG=b.extend({type:bF,origType:bH[1],data:bA,handler:bJ,guid:bJ.guid,selector:by,quick:Y(by),namespace:e.join(\".\")},bv);bw=bK[bF];if(!bw){bw=bK[bF]=[];bw.delegateCount=0;if(!bE.setup||bE.setup.call(bx,bA,e,bB)===false){if(bx.addEventListener){bx.addEventListener(bF,bB,false)}else{if(bx.attachEvent){bx.attachEvent(\"on\"+bF,bB)}}}}if(bE.add){bE.add.call(bx,bG);if(!bG.handler.guid){bG.handler.guid=bJ.guid}}if(by){bw.splice(bw.delegateCount++,0,bG)}else{bw.push(bG)}b.event.global[bF]=true}bx=null},global:{},remove:function(bJ,bE,bv,bH,bB){var bI=b.hasData(bJ)&&b._data(bJ),bF,bx,bz,bL,bC,bA,bG,bw,by,bK,bD,e;if(!bI||!(bw=bI.events)){return}bE=b.trim(bt(bE||\"\")).split(\" \");for(bF=0;bF<bE.length;bF++){bx=n.exec(bE[bF])||[];bz=bL=bx[1];bC=bx[2];if(!bz){for(bz in bw){b.event.remove(bJ,bz+bE[bF],bv,bH,true)}continue}by=b.event.special[bz]||{};bz=(bH?by.delegateType:by.bindType)||bz;bD=bw[bz]||[];bA=bD.length;bC=bC?new RegExp(\"(^|\\\\.)\"+bC.split(\".\").sort().join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\"):null;for(bG=0;bG<bD.length;bG++){e=bD[bG];if((bB||bL===e.origType)&&(!bv||bv.guid===e.guid)&&(!bC||bC.test(e.namespace))&&(!bH||bH===e.selector||bH===\"**\"&&e.selector)){bD.splice(bG--,1);if(e.selector){bD.delegateCount--}if(by.remove){by.remove.call(bJ,e)}}}if(bD.length===0&&bA!==bD.length){if(!by.teardown||by.teardown.call(bJ,bC)===false){b.removeEvent(bJ,bz,bI.handle)}delete bw[bz]}}if(b.isEmptyObject(bw)){bK=bI.handle;if(bK){bK.elem=null}b.removeData(bJ,[\"events\",\"handle\"],true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(bv,bD,bA,bJ){if(bA&&(bA.nodeType===3||bA.nodeType===8)){return}var bG=bv.type||bv,bx=[],e,bw,bC,bH,bz,by,bF,bE,bB,bI;if(T.test(bG+b.event.triggered)){return}if(bG.indexOf(\"!\")>=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(\".\")>=0){bx=bG.split(\".\");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv===\"object\"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(\".\");bv.namespace_re=bv.namespace?new RegExp(\"(^|\\\\.)\"+bx.join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\"):null;by=bG.indexOf(\":\")<0?\"on\"+bG:\"\";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bC<bB.length&&!bv.isPropagationStopped();bC++){bH=bB[bC][0];bv.type=bB[bC][1];bE=(b._data(bH,\"events\")||{})[bv.type]&&b._data(bH,\"handle\");if(bE){bE.apply(bH,bD)}bE=by&&bH[by];if(bE&&b.acceptData(bH)&&bE.apply(bH,bD)===false){bv.preventDefault()}}bv.type=bG;if(!bJ&&!bv.isDefaultPrevented()){if((!bF._default||bF._default.apply(bA.ownerDocument,bD)===false)&&!(bG===\"click\"&&b.nodeName(bA,\"a\"))&&b.acceptData(bA)){if(by&&bA[bG]&&((bG!==\"focus\"&&bG!==\"blur\")||bv.target.offsetWidth!==0)&&!b.isWindow(bA)){bz=bA[by];if(bz){bA[by]=null}b.event.triggered=bG;bA[bG]();b.event.triggered=L;if(bz){bA[by]=bz}}}}return bv.result},dispatch:function(e){e=b.event.fix(e||bb.event);var bz=((b._data(this,\"events\")||{})[e.type]||[]),bA=bz.delegateCount,bG=[].slice.call(arguments,0),by=!e.exclusive&&!e.namespace,bH=[],bC,bB,bK,bx,bF,bE,bv,bD,bI,bw,bJ;bG[0]=e;e.delegateTarget=this;if(bA&&!e.target.disabled&&!(e.button&&e.type===\"click\")){bx=b(this);bx.context=this.ownerDocument||this;for(bK=e.target;bK!=this;bK=bK.parentNode||this){bE={};bD=[];bx[0]=bK;for(bC=0;bC<bA;bC++){bI=bz[bC];bw=bI.selector;if(bE[bw]===L){bE[bw]=(bI.quick?j(bK,bI.quick):bx.is(bw))}if(bE[bw]){bD.push(bI)}}if(bD.length){bH.push({elem:bK,matches:bD})}}}if(bz.length>bA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC<bH.length&&!e.isPropagationStopped();bC++){bv=bH[bC];e.currentTarget=bv.elem;for(bB=0;bB<bv.matches.length&&!e.isImmediatePropagationStopped();bB++){bI=bv.matches[bB];if(by||(!e.namespace&&!bI.namespace)||e.namespace_re&&e.namespace_re.test(bI.namespace)){e.data=bI.data;e.handleObj=bI;bF=((b.event.special[bI.origType]||{}).handle||bI.handler).apply(bv.elem,bG);if(bF!==L){e.result=bF;if(bF===false){e.preventDefault();e.stopPropagation()}}}}}return e.result},props:\"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(bv,e){if(bv.which==null){bv.which=e.charCode!=null?e.charCode:e.keyCode}return bv}},mouseHooks:{props:\"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(bx,bw){var by,bz,e,bv=bw.button,bA=bw.fromElement;if(bx.pageX==null&&bw.clientX!=null){by=bx.target.ownerDocument||av;bz=by.documentElement;e=by.body;bx.pageX=bw.clientX+(bz&&bz.scrollLeft||e&&e.scrollLeft||0)-(bz&&bz.clientLeft||e&&e.clientLeft||0);bx.pageY=bw.clientY+(bz&&bz.scrollTop||e&&e.scrollTop||0)-(bz&&bz.clientTop||e&&e.clientTop||0)}if(!bx.relatedTarget&&bA){bx.relatedTarget=bA===bx.target?bw.toElement:bA}if(!bx.which&&bv!==L){bx.which=(bv&1?1:(bv&2?3:(bv&4?2:0)))}return bx}},fix:function(bw){if(bw[b.expando]){return bw}var bv,bz,e=bw,bx=b.event.fixHooks[bw.type]||{},by=bx.props?this.props.concat(bx.props):this.props;bw=b.Event(e);for(bv=by.length;bv;){bz=by[--bv];bw[bz]=e[bz]}if(!bw.target){bw.target=e.srcElement||av}if(bw.target.nodeType===3){bw.target=bw.target.parentNode}if(bw.metaKey===L){bw.metaKey=bw.ctrlKey}return bx.filter?bx.filter(bw,e):bw},special:{ready:{setup:b.bindReady},load:{noBubble:true},focus:{delegateType:\"focusin\"},blur:{delegateType:\"focusout\"},beforeunload:{setup:function(bw,bv,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bv,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}},simulate:function(bw,by,bx,bv){var bz=b.extend(new b.Event(),bx,{type:bw,isSimulated:true,originalEvent:{}});if(bv){b.event.trigger(bz,null,by)}else{b.event.dispatch.call(by,bz)}if(bz.isDefaultPrevented()){bx.preventDefault()}}};b.event.handle=b.event.dispatch;b.removeEvent=av.removeEventListener?function(bv,e,bw){if(bv.removeEventListener){bv.removeEventListener(e,bw,false)}}:function(bv,e,bw){if(bv.detachEvent){bv.detachEvent(\"on\"+e,bw)}};b.Event=function(bv,e){if(!(this instanceof b.Event)){return new b.Event(bv,e)}if(bv&&bv.type){this.originalEvent=bv;this.type=bv.type;this.isDefaultPrevented=(bv.defaultPrevented||bv.returnValue===false||bv.getPreventDefault&&bv.getPreventDefault())?i:bk}else{this.type=bv}if(e){b.extend(this,e)}this.timeStamp=bv&&bv.timeStamp||b.now();this[b.expando]=true};function bk(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bv=this.originalEvent;if(!bv){return}if(bv.preventDefault){bv.preventDefault()}else{bv.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bv=this.originalEvent;if(!bv){return}if(bv.stopPropagation){bv.stopPropagation()}bv.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:bk,isPropagationStopped:bk,isImmediatePropagationStopped:bk};b.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},function(bv,e){b.event.special[bv]={delegateType:e,bindType:e,handle:function(bz){var bB=this,bA=bz.relatedTarget,by=bz.handleObj,bw=by.selector,bx;if(!bA||(bA!==bB&&!b.contains(bB,bA))){bz.type=by.origType;bx=by.handler.apply(this,arguments);bz.type=e}return bx}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(){if(b.nodeName(this,\"form\")){return false\n"
diff --git a/src/jquery_p2.js b/src/jquery_p2.js
index e1f8314..bc16cf6 100644
--- a/src/jquery_p2.js
+++ b/src/jquery_p2.js
@@ -1,3 +1,10 @@
-f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d
-&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),
-f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+}b.event.add(this,"click._submit keypress._submit",function(bx){var bw=bx.target,bv=b.nodeName(bw,"input")||b.nodeName(bw,"button")?bw.form:L;if(bv&&!bv._submit_attached){b.event.add(bv,"submit._submit",function(e){if(this.parentNode&&!e.isTrigger){b.event.simulate("submit",this.parentNode,e,true)}});bv._submit_attached=true}})},teardown:function(){if(b.nodeName(this,"form")){return false}b.event.remove(this,"._submit")}}}if(!b.support.changeBubbles){b.event.special.change={setup:function(){if(bd.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){b.event.add(this,"propertychange._change",function(e){if(e.originalEvent.propertyName==="checked"){this._just_changed=true}});b.event.add(this,"click._change",function(e){if(this._just_changed&&!e.isTrigger){this._just_changed=false;b.event.simulate("change",this,e,true)}})}return false}b.event.add(this,"beforeactivate._change",function(bw){var bv=bw.target;if(bd.test(bv.nodeName)&&!bv._change_attached){b.event.add(bv,"change._change",function(e){if(this.parentNode&&!e.isSimulated&&!e.isTrigger){b.event.simulate("change",this.parentNode,e,true)}});bv._change_attached=true}})},handle:function(bv){var e=bv.target;if(this!==e||bv.isSimulated||bv.isTrigger||(e.type!=="radio"&&e.type!=="checkbox")){return bv.handleObj.handler.apply(this,arguments)}},teardown:function(){b.event.remove(this,"._change");return bd.test(this.nodeName)}}}if(!b.support.focusinBubbles){b.each({focus:"focusin",blur:"focusout"},function(bx,e){var bv=0,bw=function(by){b.event.simulate(e,by.target,b.event.fix(by),true)};b.event.special[e]={setup:function(){if(bv++===0){av.addEventListener(bx,bw,true)}},teardown:function(){if(--bv===0){av.removeEventListener(bx,bw,true)}}}})}b.fn.extend({on:function(bw,e,bz,by,bv){var bA,bx;if(typeof bw==="object"){if(typeof e!=="string"){bz=e;e=L}for(bx in bw){this.on(bx,e,bz,bw[bx],bv)}return this}if(bz==null&&by==null){by=e;bz=e=L}else{if(by==null){if(typeof e==="string"){by=bz;bz=L}else{by=bz;bz=e;e=L}}}if(by===false){by=bk}else{if(!by){return this}}if(bv===1){bA=by;by=function(bB){b().off(bB);return bA.apply(this,arguments)};by.guid=bA.guid||(bA.guid=b.guid++)}return this.each(function(){b.event.add(this,bw,by,bz,e)})},one:function(bv,e,bx,bw){return this.on.call(this,bv,e,bx,bw,1)},off:function(bw,e,by){if(bw&&bw.preventDefault&&bw.handleObj){var bv=bw.handleObj;b(bw.delegateTarget).off(bv.namespace?bv.type+"."+bv.namespace:bv.type,bv.selector,bv.handler);return this}if(typeof bw==="object"){for(var bx in bw){this.off(bx,e,bw[bx])}return this}if(e===false||typeof e==="function"){by=e;e=L}if(by===false){by=bk}return this.each(function(){b.event.remove(this,bw,by,e)})},bind:function(e,bw,bv){return this.on(e,null,bw,bv)},unbind:function(e,bv){return this.off(e,null,bv)},live:function(e,bw,bv){b(this.context).on(e,this.selector,bw,bv);return this},die:function(e,bv){b(this.context).off(e,this.selector||"**",bv);return this},delegate:function(e,bv,bx,bw){return this.on(bv,e,bx,bw)},undelegate:function(e,bv,bw){return arguments.length==1?this.off(e,"**"):this.off(bv,e,bw)},trigger:function(e,bv){return this.each(function(){b.event.trigger(e,bv,this)})},triggerHandler:function(e,bv){if(this[0]){return b.event.trigger(e,bv,this[0],true)}},toggle:function(bx){var bv=arguments,e=bx.guid||b.guid++,bw=0,by=function(bz){var bA=(b._data(this,"lastToggle"+bx.guid)||0)%bw;b._data(this,"lastToggle"+bx.guid,bA+1);bz.preventDefault();return bv[bA].apply(this,arguments)||false};by.guid=e;while(bw<bv.length){bv[bw++].guid=e}return this.click(by)},hover:function(e,bv){return this.mouseenter(e).mouseleave(bv||e)}});b.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(bv,e){b.fn[e]=function(bx,bw){if(bw==null){bw=bx;bx=null}return arguments.length>0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}});
+/*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e<bR.length;e++){if(bR[e]===bR[e-1]){bR.splice(e--,1)}}}}return bR};by.matches=function(e,bR){return by(e,null,null,bR)};by.matchesSelector=function(e,bR){return by(bR,null,null,[e]).length>0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS<bU;bS++){bV=bE.order[bS];if((bT=bE.leftMatch[bV].exec(bX))){bR=bT[1];bT.splice(1,1);if(bR.substr(bR.length-1)!=="\\"){bT[1]=(bT[1]||"").replace(bK,"");bW=bE.find[bV](bT,e,bY);if(bW!=null){bX=bX.replace(bE.match[bV],"");break}}}}if(!bW){bW=typeof e.getElementsByTagName!=="undefined"?e.getElementsByTagName("*"):[]}return{set:bW,expr:bX}};by.filter=function(b1,b0,b4,bU){var bW,e,bZ,b6,b3,bR,bT,bV,b2,bS=b1,b5=[],bY=b0,bX=b0&&b0[0]&&by.isXML(b0[0]);while(b1&&b0.length){for(bZ in bE.filter){if((bW=bE.leftMatch[bZ].exec(b1))!=null&&bW[2]){bR=bE.filter[bZ];bT=bW[1];e=false;bW.splice(1,1);if(bT.substr(bT.length-1)==="\\"){continue}if(bY===b5){b5=[]}if(bE.preFilter[bZ]){bW=bE.preFilter[bZ](bW,bY,b4,b5,bU,bX);if(!bW){e=b6=true}else{if(bW===true){continue}}}if(bW){for(bV=0;(b3=bY[bV])!=null;bV++){if(b3){b6=bR(b3,bW,bV,bY);b2=bU^b6;if(b4&&b6!=null){if(b2){e=true}else{bY[bV]=false}}else{if(b2){b5.push(b3);e=true}}}}}if(b6!==L){if(!b4){bY=b5}b1=b1.replace(bE.match[bZ],"");if(!e){return[]}break}}}if(b1===bS){if(e==null){by.error(b1)}else{break}}bS=b1}return bY};by.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};var bw=by.getText=function(bU){var bS,bT,e=bU.nodeType,bR="";if(e){if(e===1||e===9){if(typeof bU.textContent==="string"){return bU.textContent}else{if(typeof bU.innerText==="string"){return bU.innerText.replace(bO,"")}else{for(bU=bU.firstChild;bU;bU=bU.nextSibling){bR+=bw(bU)}}}}else{if(e===3||e===4){return bU.nodeValue}}}else{for(bS=0;(bT=bU[bS]);bS++){if(bT.nodeType!==8){bR+=bw(bT)}}}return bR};var bE=by.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(bW,bR){var bT=typeof bR==="string",bV=bT&&!bQ.test(bR),bX=bT&&!bV;if(bV){bR=bR.toLowerCase()}for(var bS=0,e=bW.length,bU;bS<e;bS++){if((bU=bW[bS])){while((bU=bU.previousSibling)&&bU.nodeType!==1){}bW[bS]=bX||bU&&bU.nodeName.toLowerCase()===bR?bU||false:bU===bR}}if(bX){by.filter(bR,bW,true)}},">":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS<e;bS++){bV=bW[bS];if(bV){var bT=bV.parentNode;bW[bS]=bT.nodeName.toLowerCase()===bR?bT:false}}}else{for(;bS<e;bS++){bV=bW[bS];if(bV){bW[bS]=bU?bV.parentNode:bV.parentNode===bR}}if(bU){by.filter(bR,bW,true)}}},"":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("parentNode",bR,bS,bT,bU,bV)},"~":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("previousSibling",bR,bS,bT,bU,bV)}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!=="undefined"&&!bT){var e=bS.getElementById(bR[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bS,bV){if(typeof bV.getElementsByName!=="undefined"){var bR=[],bU=bV.getElementsByName(bS[1]);for(var bT=0,e=bU.length;bT<e;bT++){if(bU[bT].getAttribute("name")===bS[1]){bR.push(bU[bT])}}return bR.length===0?null:bR}},TAG:function(e,bR){if(typeof bR.getElementsByTagName!=="undefined"){return bR.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bT,bR,bS,e,bW,bX){bT=" "+bT[1].replace(bK,"")+" ";if(bX){return bT}for(var bU=0,bV;(bV=bR[bU])!=null;bU++){if(bV){if(bW^(bV.className&&(" "+bV.className+" ").replace(/[\t\n\r]/g," ").indexOf(bT)>=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1
+},lt:function(bS,bR,e){return bR<e[3]-0},gt:function(bS,bR,e){return bR>e[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV<bU;bV++){if(bT[bV]===bS){return false}}return true}else{by.error(e)}}}},CHILD:function(bS,bU){var bT,b0,bW,bZ,e,bV,bY,bX=bU[1],bR=bS;switch(bX){case"only":case"first":while((bR=bR.previousSibling)){if(bR.nodeType===1){return false}}if(bX==="first"){return true}bR=bS;case"last":while((bR=bR.nextSibling)){if(bR.nodeType===1){return false}}return true;case"nth":bT=bU[2];b0=bU[3];if(bT===1&&b0===0){return true}bW=bU[0];bZ=bS.parentNode;if(bZ&&(bZ[bC]!==bW||!bS.nodeIndex)){bV=0;for(bR=bZ.firstChild;bR;bR=bR.nextSibling){if(bR.nodeType===1){bR.nodeIndex=++bV}}bZ[bC]=bW}bY=bS.nodeIndex-b0;if(bT===0){return bY===0}else{return(bY%bT===0&&bY/bT>=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS<e;bS++){bR.push(bU[bS])}}else{for(;bU[bS];bS++){bR.push(bU[bS])}}}return bR}}var bJ,bG;if(av.documentElement.compareDocumentPosition){bJ=function(bR,e){if(bR===e){bB=true;return 0}if(!bR.compareDocumentPosition||!e.compareDocumentPosition){return bR.compareDocumentPosition?-1:1}return bR.compareDocumentPosition(e)&4?-1:1}}else{bJ=function(bY,bX){if(bY===bX){bB=true;return 0}else{if(bY.sourceIndex&&bX.sourceIndex){return bY.sourceIndex-bX.sourceIndex}}var bV,bR,bS=[],e=[],bU=bY.parentNode,bW=bX.parentNode,bZ=bU;if(bU===bW){return bG(bY,bX)}else{if(!bU){return -1}else{if(!bW){return 1}}}while(bZ){bS.unshift(bZ);bZ=bZ.parentNode}bZ=bW;while(bZ){e.unshift(bZ);bZ=bZ.parentNode}bV=bS.length;bR=e.length;for(var bT=0;bT<bV&&bT<bR;bT++){if(bS[bT]!==e[bT]){return bG(bS[bT],e[bT])}}return bT===bV?bG(bY,e[bT],-1):bG(bS[bT],bX,1)};bG=function(bR,e,bS){if(bR===e){return bS}var bT=bR.nextSibling;while(bT){if(bT===e){return -1}bT=bT.nextSibling}return 1}}(function(){var bR=av.createElement("div"),bS="script"+(new Date()).getTime(),e=av.documentElement;bR.innerHTML="<a name='"+bS+"'/>";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="<p class='TEST'></p>";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1&&!bY){e[bC]=bV;e.sizset=bT}if(e.nodeName.toLowerCase()===bW){bU=e;break}e=e[bR]}bZ[bT]=bU}}}function bN(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1){if(!bY){e[bC]=bV;e.sizset=bT}if(typeof bW!=="string"){if(e===bW){bU=true;break}}else{if(by.filter(bW,[e]).length>0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT<bR;bT++){by(bS,bY[bT],bX,bW)}return by.filter(bU,bX)};by.attr=b.attr;by.selectors.attrMap={};b.find=by;b.expr=by.selectors;b.expr[":"]=b.expr.filters;b.unique=by.uniqueSort;b.text=by.getText;b.isXMLDoc=by.isXML;b.contains=by.contains})();var ab=/Until$/,aq=/^(?:parents|prevUntil|prevAll)/,a9=/,/,bp=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,H=b.expr.match.POS,ay={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bw=this,by,bv;if(typeof e!=="string"){return b(e).filter(function(){for(by=0,bv=bw.length;by<bv;by++){if(b.contains(bw[by],this)){return true}}})}var bx=this.pushStack("","find",e),bA,bB,bz;for(by=0,bv=this.length;by<bv;by++){bA=bx.length;b.find(e,this[by],bx);if(by>0){for(bB=bA;bB<bx.length;bB++){for(bz=0;bz<bA;bz++){if(bx[bz]===bx[bB]){bx.splice(bB--,1);break}}}}}return bx},has:function(bv){var e=b(bv);return this.filter(function(){for(var bx=0,bw=e.length;bx<bw;bx++){if(b.contains(this,e[bx])){return true}}})},not:function(e){return this.pushStack(aG(this,e,false),"not",e)},filter:function(e){return this.pushStack(aG(this,e,true),"filter",e)},is:function(e){return !!e&&(typeof e==="string"?H.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw<by.length;bw++){if(b(bz).is(by[bw])){bv.push({selector:by[bw],elem:bz,level:bB})}}bz=bz.parentNode;bB++}return bv}var bA=H.test(by)||typeof by!=="string"?b(by,bx||this.context):0;for(bw=0,e=this.length;bw<e;bw++){bz=this[bw];while(bz){if(bA?bA.index(bz)>-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/<tbody/i,W=/<|&#?\w+;/,ae=/<(?:script|style)/i,O=/<(?:script|object|embed|option|style)/i,ah=new RegExp("<(?:"+aR+")","i"),o=/checked\s*(?:[^=]|=\s*.checked.)/i,bm=/\/(java|ecma)script/i,aN=/^\s*<!(?:\[CDATA\[|\-\-)/,ax={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},ac=a(av);
+ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div<div>","</div>"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1></$2>");try{for(var bw=0,bv=this.length;bw<bv;bw++){if(this[bw].nodeType===1){b.cleanData(this[bw].getElementsByTagName("*"));this[bw].innerHTML=bx}}}catch(by){this.empty().append(bx)}}else{if(b.isFunction(bx)){this.each(function(bz){var e=b(this);e.html(bx.call(this,bz,e.html()))})}else{this.empty().append(bx)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bx){var bw=b(this),bv=bw.html();bw.replaceWith(e.call(this,bx,bv))})}if(typeof e!=="string"){e=b(e).detach()}return this.each(function(){var bw=this.nextSibling,bv=this.parentNode;b(this).remove();if(bw){b(bw).before(e)}else{b(bv).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),"replaceWith",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bB,bF,bE){var bx,by,bA,bD,bC=bB[0],bv=[];if(!b.support.checkClone&&arguments.length===3&&typeof bC==="string"&&o.test(bC)){return this.each(function(){b(this).domManip(bB,bF,bE,true)})}if(b.isFunction(bC)){return this.each(function(bH){var bG=b(this);bB[0]=bC.call(this,bH,bF?bG.html():L);bG.domManip(bB,bF,bE)})}if(this[0]){bD=bC&&bC.parentNode;if(b.support.parentNode&&bD&&bD.nodeType===11&&bD.childNodes.length===this.length){bx={fragment:bD}}else{bx=b.buildFragment(bB,this,bv)}bA=bx.fragment;if(bA.childNodes.length===1){by=bA=bA.firstChild}else{by=bA.firstChild}if(by){bF=bF&&b.nodeName(by,"tr");for(var bw=0,e=this.length,bz=e-1;bw<e;bw++){bE.call(bF?ba(this[bw],by):this[bw],bx.cacheable||(e>1&&bw<bz)?b.clone(bA,true,true):bA)}}if(bv.length){b.each(bv,bo)}}return this}});function ba(e,bv){return b.nodeName(e,"table")?(e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody"))):e}function t(bB,bv){if(bv.nodeType!==1||!b.hasData(bB)){return}var by,bx,e,bA=b._data(bB),bz=b._data(bv,bA),bw=bA.events;if(bw){delete bz.handle;bz.events={};for(by in bw){for(bx=0,e=bw[by].length;bx<e;bx++){b.event.add(bv,by+(bw[by][bx].namespace?".":"")+bw[by][bx].namespace,bw[by][bx],bw[by][bx].data)}}}if(bz.data){bz.data=b.extend({},bz.data)}}function ai(bv,e){var bw;if(e.nodeType!==1){return}if(e.clearAttributes){e.clearAttributes()}if(e.mergeAttributes){e.mergeAttributes(bv)}bw=e.nodeName.toLowerCase();if(bw==="object"){e.outerHTML=bv.outerHTML}else{if(bw==="input"&&(bv.type==="checkbox"||bv.type==="radio")){if(bv.checked){e.defaultChecked=e.checked=bv.checked}if(e.value!==bv.value){e.value=bv.value}}else{if(bw==="option"){e.selected=bv.defaultSelected}else{if(bw==="input"||bw==="textarea"){e.defaultValue=bv.defaultValue}}}}e.removeAttribute(b.expando)}b.buildFragment=function(bz,bx,bv){var by,e,bw,bA,bB=bz[0];if(bx&&bx[0]){bA=bx[0].ownerDocument||bx[0]}if(!bA.createDocumentFragment){bA=av}if(bz.length===1&&typeof bB==="string"&&bB.length<512&&bA===av&&bB.charAt(0)==="<"&&!O.test(bB)&&(b.support.checkClone||!o.test(bB))&&(b.support.html5Clone||!ah.test(bB))){e=true;bw=b.fragments[bB];if(bw&&bw!==1){by=bw}}if(!by){by=bA.createDocumentFragment();b.clean(bz,bA,by,bv)}if(e){b.fragments[bB]=bw?by:1}return{fragment:by,cacheable:e}};b.fragments={};b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,bv){b.fn[e]=function(bw){var bz=[],bC=b(bw),bB=this.length===1&&this[0].parentNode;if(bB&&bB.nodeType===11&&bB.childNodes.length===1&&bC.length===1){bC[bv](this[0]);return this}else{for(var bA=0,bx=bC.length;bA<bx;bA++){var by=(bA>0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1></$2>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]==="<table>"&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB<bG;bB++){E(bz[bB])}}else{E(bz)}}if(bz.nodeType){bI.push(bz)}else{bI=b.merge(bI,bz)}}if(bH){bF=function(bL){return !bL.type||bm.test(bL.type)};for(bE=0;bI[bE];bE++){if(bA&&b.nodeName(bI[bE],"script")&&(!bI[bE].type||bI[bE].type.toLowerCase()==="text/javascript")){bA.push(bI[bE].parentNode?bI[bE].parentNode.removeChild(bI[bE]):bI[bE])}else{if(bI[bE].nodeType===1){var bJ=b.grep(bI[bE].getElementsByTagName("script"),bF);bI.splice.apply(bI,[bE+1,0].concat(bJ))}bH.appendChild(bI[bE])}}}return bI},cleanData:function(bv){var by,bw,e=b.cache,bB=b.event.special,bA=b.support.deleteExpando;for(var bz=0,bx;(bx=bv[bz])!=null;bz++){if(bx.nodeName&&b.noData[bx.nodeName.toLowerCase()]){continue}bw=bx[b.expando];if(bw){by=e[bw];if(by&&by.events){for(var bC in by.events){if(bB[bC]){b.event.remove(bx,bC)}else{b.removeEvent(bx,bC,by.handle)}}if(by.handle){by.handle.elem=null}}if(bA){delete bx[b.expando]}else{if(bx.removeAttribute){bx.removeAttribute(b.expando)}}delete e[bw]}}}});function bo(e,bv){if(bv.src){b.ajax({url:bv.src,async:false,dataType:"script"})}else{b.globalEval((bv.text||bv.textContent||bv.innerHTML||"").replace(aN,"/*$0*/"))}if(bv.parentNode){bv.parentNode.removeChild(bv)}}var ak=/alpha\([^)]*\)/i,au=/opacity=([^)]*)/,z=/([A-Z]|^ms)/g,bc=/^-?\d+(?:px)?$/i,bn=/^-?\d/,I=/^([\-+])=([\-+.\de]+)/,a7={position:"absolute",visibility:"hidden",display:"block"},an=["Left","Right"],a1=["Top","Bottom"],Z,aI,aX;b.fn.css=function(e,bv){if(arguments.length===2&&bv===L){return this}return b.access(this,e,bv,true,function(bx,bw,by){return by!==L?b.style(bx,bw,by):b.css(bx,bw)})};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,"opacity","opacity");return e===""?"1":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC==="string"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC="number"}if(bD==null||bC==="number"&&isNaN(bD)){return}if(bC==="number"&&!b.cssNumber[bz]){bD+="px"}if(!bE||!("set" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&"get" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx==="cssFloat"){bx="float"}if(e&&"get" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(bx,bw,by){var e={};for(var bv in bw){e[bv]=bx.style[bv];bx.style[bv]=bw[bv]}by.call(bx);for(bv in bw){bx.style[bv]=e[bv]}}});b.curCSS=b.css;b.each(["height","width"],function(bv,e){b.cssHooks[e]={get:function(by,bx,bw){var bz;if(bx){if(by.offsetWidth!==0){return p(by,e,bw)}else{b.swap(by,a7,function(){bz=p(by,e,bw)})}return bz}},set:function(bw,bx){if(bc.test(bx)){bx=parseFloat(bx);if(bx>=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;
diff --git a/src/jquery_p2_js.h b/src/jquery_p2_js.h
index c31afa7..7c905ef 100644
--- a/src/jquery_p2_js.h
+++ b/src/jquery_p2_js.h
@@ -1,3 +1,10 @@
-"f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!=\"undefined\"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(\" \");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||\"\").split(\".\").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(\".\")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent(\"on\"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||\"\")).split(\" \");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp(\"(^|\\\\.)\"+l.split(\".\").sort().join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d===\"**\"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,[\"events\",\"handle\"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf(\"!\")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(\".\")>=0&&(i=h.split(\".\"),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c==\"object\"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join(\".\"),c.namespace_re=c.namespace?new RegExp(\"(^|\\\\.)\"+i.join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\"):null,o=h.indexOf(\":\")<0?\"on\"+h:\"\";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,\"events\")||{})[c.type]&&f._data(m,\"handle\"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!==\"click\"||!f.nodeName(e,\"a\"))&&f.acceptData(e)&&o&&e[h]&&(h!==\"focus\"&&h!==\"blur\"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,\"events\")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!==\"click\")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:\"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:\"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:\"focusin\"},blur:{delegateType:\"focusout\"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent(\"on\"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,\"form\"))return!1;f.event.add(this,\"click._submit keypress._submit\",function(a){var c=a.target,d=f.nodeName(c,\"input\")||f.nodeName(c,\"button\")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,\"submit._submit\",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate(\"submit\",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,\"form\"))return!1;f.event.remove(this,\"._submit\")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type===\"checkbox\"||this.type===\"radio\")f.event.add(this,\"propertychange._change\",function(a){a.originalEvent.propertyName===\"checked\"&&(this._just_changed=!0)}),f.event.add(this,\"click._change\",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate(\"change\",this,a,!0))});return!1}f.event.add(this,\"beforeactivate._change\",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,\"change._change\",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate(\"change\",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!==\"radio\"&&b.type!==\"checkbox\")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,\"._change\");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:\"focusin\",blur:\"focusout\"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a==\"object\"){typeof c!=\"string\"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c==\"string\"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+\".\"+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a==\"object\"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c==\"function\")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||\"**\",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,\"**\"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,\"lastToggle\"+a.guid)||0)%d;f._data(this,\"lastToggle\"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each(\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\".split(\" \"),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!=\"string\"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,d=\"sizcache\"+(Math.random()+\"\").replace(\".\",\"\"),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\\\/g,k=/\\r\\n/g,l=/\\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=\"string\")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(\"\"),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]===\"~\"||w[0]===\"+\")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q=\"\",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)===\"[object Array]\")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!==\"\\\\\"){g[1]=(g[1]||\"\").replace(j,\"\"),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],\"\");break}}}}d||(d=typeof b.getElementsByTagName!=\"undefined\"?b.getElementsByTagName(\"*\"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)===\"\\\\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],\"\");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error(\"Syntax error, unrecognized expression: \"+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e=\"\";if(d){if(d===1||d===9){if(typeof a.textContent==\"string\")return a.textContent;if(typeof a.innerText==\"string\")return a.innerText.replace(k,\"\");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:[\"ID\",\"NAME\",\"TAG\"],match:{ID:/#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,CLASS:/\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,NAME:/\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,ATTR:/\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,TAG:/^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,PSEUDO:/:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/},leftMatch:{},attrMap:{\"class\":\"className\",\"for\":\"htmlFor\"},attrHandle:{href:function(a){return a.getAttribute(\"href\")},type:function(a){return a.getAttribute(\"type\")}},relative:{\"+\":function(a,b){var c=typeof b==\"string\",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},\">\":function(a,b){var c,d=typeof b==\"string\",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d\n"
-"&&m.filter(b,a,!0)}},\"\":function(a,b,c){var d,f=e++,g=x;typeof b==\"string\"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g(\"parentNode\",b,f,a,d,c)},\"~\":function(a,b,c){var d,f=e++,g=x;typeof b==\"string\"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g(\"previousSibling\",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=\"undefined\"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=\"undefined\"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute(\"name\")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=\"undefined\")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=\" \"+a[1].replace(j,\"\")+\" \";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(\" \"+h.className+\" \").replace(/[\\t\\n\\r]/g,\" \").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,\"\")},TAG:function(a,b){return a[1].replace(j,\"\").toLowerCase()},CHILD:function(a){if(a[1]===\"nth\"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\\+|\\s*/g,\"\");var b=/(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(a[2]===\"even\"&&\"2n\"||a[2]===\"odd\"&&\"2n+1\"||!/\\D/.test(a[2])&&\"0n+\"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,\"\");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||\"\").replace(j,\"\"),a[2]===\"~=\"&&(a[4]=\" \"+a[4]+\" \");return a},PSEUDO:function(b,c,d,e,f){if(b[1]===\"not\")if((a.exec(b[3])||\"\").length>1||/^\\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!==\"hidden\"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute(\"type\"),c=a.type;return a.nodeName.toLowerCase()===\"input\"&&\"text\"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"radio\"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"checkbox\"===a.type},file:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"file\"===a.type},password:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"password\"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b===\"input\"||b===\"button\")&&\"submit\"===a.type},image:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"image\"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b===\"input\"||b===\"button\")&&\"reset\"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b===\"input\"&&\"button\"===a.type||b===\"button\"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e===\"contains\")return(a.textContent||a.innerText||n([a])||\"\").indexOf(b[3])>=0;if(e===\"not\"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case\"only\":case\"first\":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k===\"first\")return!0;l=a;case\"last\":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case\"nth\":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute(\"id\")===b},TAG:function(a,b){return b===\"*\"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(\" \"+(a.className||a.getAttribute(\"class\"))+\" \").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+\"\",f=b[2],g=b[4];return d==null?f===\"!=\":!f&&m.attr?d!=null:f===\"=\"?e===g:f===\"*=\"?e.indexOf(g)>=0:f===\"~=\"?(\" \"+e+\" \").indexOf(g)>=0:g?f===\"!=\"?e!==g:f===\"^=\"?e.indexOf(g)===0:f===\"$=\"?e.substr(e.length-g.length)===g:f===\"|=\"?e===g||e.substr(0,g.length+1)===g+\"-\":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return\"\\\\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\\[]*\\])(?![^\\(]*\\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\\r|\\n)*?)/.source+o.match[r].source.replace(/\\\\(\\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)===\"[object Array]\")Array.prototype.push.apply(d,a);else if(typeof a.length==\"number\")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement(\"div\"),d=\"script\"+(new Date).getTime(),e=c.documentElement;a.innerHTML=\"<a name='\"+d+\"'/>\",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!=\"undefined\"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=\"undefined\"&&e.getAttributeNode(\"id\").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=\"undefined\"&&a.getAttributeNode(\"id\");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement(\"div\");a.appendChild(c.createComment(\"\")),a.getElementsByTagName(\"*\").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]===\"*\"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML=\"<a href='#'></a>\",a.firstChild&&typeof a.firstChild.getAttribute!=\"undefined\"&&a.firstChild.getAttribute(\"href\")!==\"#\"&&(o.attrHandle.href=function(a){return a.getAttribute(\"href\",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement(\"div\"),d=\"__sizzle__\";b.innerHTML=\"<p class='TEST'></p>\";if(!b.querySelectorAll||b.querySelectorAll(\".TEST\").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b===\"body\"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!==\"object\"){var k=e,l=e.getAttribute(\"id\"),n=l||d,p=e.parentNode,q=/^\\s*[+~]/.test(b);l?n=n.replace(/'/g,\"\\\\$&\"):e.setAttribute(\"id\",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll(\"[id='\"+n+\"'] \"+b),f)}catch(r){}finally{l||k.removeAttribute(\"id\")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement(\"div\"),\"div\"),e=!1;try{b.call(c.documentElement,\"[test!='']:sizzle\")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g,\"='$1']\");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement(\"div\");a.innerHTML=\"<div class='test e'></div><div class='test'></div>\";if(!!a.getElementsByClassName&&a.getElementsByClassName(\"e\").length!==0){a.lastChild.className=\"e\";if(a.getElementsByClassName(\"e\").length===1)return;o.order.splice(1,0,\"CLASS\"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=\"undefined\"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!==\"HTML\":!1};var y=function(a,b,c){var d,e=[],f=\"\",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,\"\");a=o.relative[a]?a+\"*\":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[\":\"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\\[\\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!=\"string\")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack(\"\",\"find\",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),\"not\",a)},filter:function(a){return this.pushStack(T(this,a,!0),\"filter\",a)},is:function(a){return!!a&&(typeof a==\"string\"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!=\"string\"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,\"closest\",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a==\"string\")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==\"string\"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,\"parentNode\")},parentsUntil:function(a,b,c){return f.dir(a,\"parentNode\",c)},next:function(a){return f.nth(a,2,\"nextSibling\")},prev:function(a){return f.nth(a,2,\"previousSibling\")},nextAll:function(a){return f.dir(a,\"nextSibling\")},prevAll:function(a){return f.dir(a,\"previousSibling\")},nextUntil:function(a,b,c){return f.dir(a,\"nextSibling\",c)},prevUntil:function(a,b,c){return f.dir(a,\"previousSibling\",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,\"iframe\")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d==\"string\"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(\",\"))}}),f.extend({filter:function(a,b,c){c&&(a=\":not(\"+a+\")\");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V=\"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",W=/ jQuery\\d+=\"(?:\\d+|null)\"/g,X=/^\\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,Z=/<([\\w:]+)/,$=/<tbody/i,_=/<|&#?\\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp(\"<(?:\"+V+\")\",\"i\"),bd=/checked\\s*(?:[^=]|=\\s*.checked.)/i,be=/\\/(java|ecma)script/i,bf=/^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,bg={option:[1,\"<select multiple='multiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],thead:[1,\"<table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],area:[1,\"<map>\",\"</map>\"],_default:[0,\"\",\"\"]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,\"div<div>\",\"</div>\"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!=\"object\"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,\"body\")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,\"before\",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,\"after\",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName(\"*\")),\n"
-"f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()\n"
+"}b.event.add(this,\"click._submit keypress._submit\",function(bx){var bw=bx.target,bv=b.nodeName(bw,\"input\")||b.nodeName(bw,\"button\")?bw.form:L;if(bv&&!bv._submit_attached){b.event.add(bv,\"submit._submit\",function(e){if(this.parentNode&&!e.isTrigger){b.event.simulate(\"submit\",this.parentNode,e,true)}});bv._submit_attached=true}})},teardown:function(){if(b.nodeName(this,\"form\")){return false}b.event.remove(this,\"._submit\")}}}if(!b.support.changeBubbles){b.event.special.change={setup:function(){if(bd.test(this.nodeName)){if(this.type===\"checkbox\"||this.type===\"radio\"){b.event.add(this,\"propertychange._change\",function(e){if(e.originalEvent.propertyName===\"checked\"){this._just_changed=true}});b.event.add(this,\"click._change\",function(e){if(this._just_changed&&!e.isTrigger){this._just_changed=false;b.event.simulate(\"change\",this,e,true)}})}return false}b.event.add(this,\"beforeactivate._change\",function(bw){var bv=bw.target;if(bd.test(bv.nodeName)&&!bv._change_attached){b.event.add(bv,\"change._change\",function(e){if(this.parentNode&&!e.isSimulated&&!e.isTrigger){b.event.simulate(\"change\",this.parentNode,e,true)}});bv._change_attached=true}})},handle:function(bv){var e=bv.target;if(this!==e||bv.isSimulated||bv.isTrigger||(e.type!==\"radio\"&&e.type!==\"checkbox\")){return bv.handleObj.handler.apply(this,arguments)}},teardown:function(){b.event.remove(this,\"._change\");return bd.test(this.nodeName)}}}if(!b.support.focusinBubbles){b.each({focus:\"focusin\",blur:\"focusout\"},function(bx,e){var bv=0,bw=function(by){b.event.simulate(e,by.target,b.event.fix(by),true)};b.event.special[e]={setup:function(){if(bv++===0){av.addEventListener(bx,bw,true)}},teardown:function(){if(--bv===0){av.removeEventListener(bx,bw,true)}}}})}b.fn.extend({on:function(bw,e,bz,by,bv){var bA,bx;if(typeof bw===\"object\"){if(typeof e!==\"string\"){bz=e;e=L}for(bx in bw){this.on(bx,e,bz,bw[bx],bv)}return this}if(bz==null&&by==null){by=e;bz=e=L}else{if(by==null){if(typeof e===\"string\"){by=bz;bz=L}else{by=bz;bz=e;e=L}}}if(by===false){by=bk}else{if(!by){return this}}if(bv===1){bA=by;by=function(bB){b().off(bB);return bA.apply(this,arguments)};by.guid=bA.guid||(bA.guid=b.guid++)}return this.each(function(){b.event.add(this,bw,by,bz,e)})},one:function(bv,e,bx,bw){return this.on.call(this,bv,e,bx,bw,1)},off:function(bw,e,by){if(bw&&bw.preventDefault&&bw.handleObj){var bv=bw.handleObj;b(bw.delegateTarget).off(bv.namespace?bv.type+\".\"+bv.namespace:bv.type,bv.selector,bv.handler);return this}if(typeof bw===\"object\"){for(var bx in bw){this.off(bx,e,bw[bx])}return this}if(e===false||typeof e===\"function\"){by=e;e=L}if(by===false){by=bk}return this.each(function(){b.event.remove(this,bw,by,e)})},bind:function(e,bw,bv){return this.on(e,null,bw,bv)},unbind:function(e,bv){return this.off(e,null,bv)},live:function(e,bw,bv){b(this.context).on(e,this.selector,bw,bv);return this},die:function(e,bv){b(this.context).off(e,this.selector||\"**\",bv);return this},delegate:function(e,bv,bx,bw){return this.on(bv,e,bx,bw)},undelegate:function(e,bv,bw){return arguments.length==1?this.off(e,\"**\"):this.off(bv,e,bw)},trigger:function(e,bv){return this.each(function(){b.event.trigger(e,bv,this)})},triggerHandler:function(e,bv){if(this[0]){return b.event.trigger(e,bv,this[0],true)}},toggle:function(bx){var bv=arguments,e=bx.guid||b.guid++,bw=0,by=function(bz){var bA=(b._data(this,\"lastToggle\"+bx.guid)||0)%bw;b._data(this,\"lastToggle\"+bx.guid,bA+1);bz.preventDefault();return bv[bA].apply(this,arguments)||false};by.guid=e;while(bw<bv.length){bv[bw++].guid=e}return this.click(by)},hover:function(e,bv){return this.mouseenter(e).mouseleave(bv||e)}});b.each((\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\").split(\" \"),function(bv,e){b.fn[e]=function(bx,bw){if(bw==null){bw=bx;bx=null}return arguments.length>0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}});\n"
+"/*!\n"
+" * Sizzle CSS Selector Engine\n"
+" * Copyright 2011, The Dojo Foundation\n"
+" * Released under the MIT, BSD, and GPL Licenses.\n"
+" * More information: http://sizzlejs.com/\n"
+" */\n"
+"(function(){var bH=/((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,bC=\"sizcache\"+(Math.random()+\"\").replace(\".\",\"\"),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\\\/g,bO=/\\r\\n/g,bQ=/\\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!==\"string\"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec(\"\");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]===\"~\"||bW[0]===\"+\")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=\"\"}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)===\"[object Array]\"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e<bR.length;e++){if(bR[e]===bR[e-1]){bR.splice(e--,1)}}}}return bR};by.matches=function(e,bR){return by(e,null,null,bR)};by.matchesSelector=function(e,bR){return by(bR,null,null,[e]).length>0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS<bU;bS++){bV=bE.order[bS];if((bT=bE.leftMatch[bV].exec(bX))){bR=bT[1];bT.splice(1,1);if(bR.substr(bR.length-1)!==\"\\\\\"){bT[1]=(bT[1]||\"\").replace(bK,\"\");bW=bE.find[bV](bT,e,bY);if(bW!=null){bX=bX.replace(bE.match[bV],\"\");break}}}}if(!bW){bW=typeof e.getElementsByTagName!==\"undefined\"?e.getElementsByTagName(\"*\"):[]}return{set:bW,expr:bX}};by.filter=function(b1,b0,b4,bU){var bW,e,bZ,b6,b3,bR,bT,bV,b2,bS=b1,b5=[],bY=b0,bX=b0&&b0[0]&&by.isXML(b0[0]);while(b1&&b0.length){for(bZ in bE.filter){if((bW=bE.leftMatch[bZ].exec(b1))!=null&&bW[2]){bR=bE.filter[bZ];bT=bW[1];e=false;bW.splice(1,1);if(bT.substr(bT.length-1)===\"\\\\\"){continue}if(bY===b5){b5=[]}if(bE.preFilter[bZ]){bW=bE.preFilter[bZ](bW,bY,b4,b5,bU,bX);if(!bW){e=b6=true}else{if(bW===true){continue}}}if(bW){for(bV=0;(b3=bY[bV])!=null;bV++){if(b3){b6=bR(b3,bW,bV,bY);b2=bU^b6;if(b4&&b6!=null){if(b2){e=true}else{bY[bV]=false}}else{if(b2){b5.push(b3);e=true}}}}}if(b6!==L){if(!b4){bY=b5}b1=b1.replace(bE.match[bZ],\"\");if(!e){return[]}break}}}if(b1===bS){if(e==null){by.error(b1)}else{break}}bS=b1}return bY};by.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)};var bw=by.getText=function(bU){var bS,bT,e=bU.nodeType,bR=\"\";if(e){if(e===1||e===9){if(typeof bU.textContent===\"string\"){return bU.textContent}else{if(typeof bU.innerText===\"string\"){return bU.innerText.replace(bO,\"\")}else{for(bU=bU.firstChild;bU;bU=bU.nextSibling){bR+=bw(bU)}}}}else{if(e===3||e===4){return bU.nodeValue}}}else{for(bS=0;(bT=bU[bS]);bS++){if(bT.nodeType!==8){bR+=bw(bT)}}}return bR};var bE=by.selectors={order:[\"ID\",\"NAME\",\"TAG\"],match:{ID:/#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,CLASS:/\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,NAME:/\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,ATTR:/\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,TAG:/^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,PSEUDO:/:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/},leftMatch:{},attrMap:{\"class\":\"className\",\"for\":\"htmlFor\"},attrHandle:{href:function(e){return e.getAttribute(\"href\")},type:function(e){return e.getAttribute(\"type\")}},relative:{\"+\":function(bW,bR){var bT=typeof bR===\"string\",bV=bT&&!bQ.test(bR),bX=bT&&!bV;if(bV){bR=bR.toLowerCase()}for(var bS=0,e=bW.length,bU;bS<e;bS++){if((bU=bW[bS])){while((bU=bU.previousSibling)&&bU.nodeType!==1){}bW[bS]=bX||bU&&bU.nodeName.toLowerCase()===bR?bU||false:bU===bR}}if(bX){by.filter(bR,bW,true)}},\">\":function(bW,bR){var bV,bU=typeof bR===\"string\",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS<e;bS++){bV=bW[bS];if(bV){var bT=bV.parentNode;bW[bS]=bT.nodeName.toLowerCase()===bR?bT:false}}}else{for(;bS<e;bS++){bV=bW[bS];if(bV){bW[bS]=bU?bV.parentNode:bV.parentNode===bR}}if(bU){by.filter(bR,bW,true)}}},\"\":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR===\"string\"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e(\"parentNode\",bR,bS,bT,bU,bV)},\"~\":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR===\"string\"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e(\"previousSibling\",bR,bS,bT,bU,bV)}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!==\"undefined\"&&!bT){var e=bS.getElementById(bR[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bS,bV){if(typeof bV.getElementsByName!==\"undefined\"){var bR=[],bU=bV.getElementsByName(bS[1]);for(var bT=0,e=bU.length;bT<e;bT++){if(bU[bT].getAttribute(\"name\")===bS[1]){bR.push(bU[bT])}}return bR.length===0?null:bR}},TAG:function(e,bR){if(typeof bR.getElementsByTagName!==\"undefined\"){return bR.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bT,bR,bS,e,bW,bX){bT=\" \"+bT[1].replace(bK,\"\")+\" \";if(bX){return bT}for(var bU=0,bV;(bV=bR[bU])!=null;bU++){if(bV){if(bW^(bV.className&&(\" \"+bV.className+\" \").replace(/[\\t\\n\\r]/g,\" \").indexOf(bT)>=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,\"\")},TAG:function(bR,e){return bR[1].replace(bK,\"\").toLowerCase()},CHILD:function(e){if(e[1]===\"nth\"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\\+|\\s*/g,\"\");var bR=/(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(e[2]===\"even\"&&\"2n\"||e[2]===\"odd\"&&\"2n+1\"||!/\\D/.test(e[2])&&\"0n+\"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,\"\");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||\"\").replace(bK,\"\");if(bU[2]===\"~=\"){bU[4]=\" \"+bU[4]+\" \"}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]===\"not\"){if((bH.exec(bU[3])||\"\").length>1||/^\\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!==\"hidden\"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute(\"type\"),bR=bS.type;return bS.nodeName.toLowerCase()===\"input\"&&\"text\"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"radio\"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"checkbox\"===e.type},file:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"file\"===e.type},password:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"password\"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e===\"input\"||e===\"button\")&&\"submit\"===bR.type},image:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"image\"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e===\"input\"||e===\"button\")&&\"reset\"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e===\"input\"&&\"button\"===bR.type||e===\"button\"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1\n"
+"},lt:function(bS,bR,e){return bR<e[3]-0},gt:function(bS,bR,e){return bR>e[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e===\"contains\"){return(bS.textContent||bS.innerText||bw([bS])||\"\").indexOf(bX[3])>=0}else{if(e===\"not\"){var bT=bX[3];for(var bV=0,bU=bT.length;bV<bU;bV++){if(bT[bV]===bS){return false}}return true}else{by.error(e)}}}},CHILD:function(bS,bU){var bT,b0,bW,bZ,e,bV,bY,bX=bU[1],bR=bS;switch(bX){case\"only\":case\"first\":while((bR=bR.previousSibling)){if(bR.nodeType===1){return false}}if(bX===\"first\"){return true}bR=bS;case\"last\":while((bR=bR.nextSibling)){if(bR.nodeType===1){return false}}return true;case\"nth\":bT=bU[2];b0=bU[3];if(bT===1&&b0===0){return true}bW=bU[0];bZ=bS.parentNode;if(bZ&&(bZ[bC]!==bW||!bS.nodeIndex)){bV=0;for(bR=bZ.firstChild;bR;bR=bR.nextSibling){if(bR.nodeType===1){bR.nodeIndex=++bV}}bZ[bC]=bW}bY=bS.nodeIndex-b0;if(bT===0){return bY===0}else{return(bY%bT===0&&bY/bT>=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute(\"id\")===e},TAG:function(bR,e){return(e===\"*\"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(\" \"+(bR.className||bR.getAttribute(\"class\"))+\" \").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+\"\",bU=bT[2],bR=bT[4];return e==null?bU===\"!=\":!bU&&by.attr?e!=null:bU===\"=\"?bW===bR:bU===\"*=\"?bW.indexOf(bR)>=0:bU===\"~=\"?(\" \"+bW+\" \").indexOf(bR)>=0:!bR?bW&&e!==false:bU===\"!=\"?bW!==bR:bU===\"^=\"?bW.indexOf(bR)===0:bU===\"$=\"?bW.substr(bW.length-bR.length)===bR:bU===\"|=\"?bW===bR||bW.substr(0,bR.length+1)===bR+\"-\":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return\"\\\\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\\[]*\\])(?![^\\(]*\\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\\r|\\n)*?)/.source+bE.match[bz].source.replace(/\\\\(\\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)===\"[object Array]\"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length===\"number\"){for(var e=bU.length;bS<e;bS++){bR.push(bU[bS])}}else{for(;bU[bS];bS++){bR.push(bU[bS])}}}return bR}}var bJ,bG;if(av.documentElement.compareDocumentPosition){bJ=function(bR,e){if(bR===e){bB=true;return 0}if(!bR.compareDocumentPosition||!e.compareDocumentPosition){return bR.compareDocumentPosition?-1:1}return bR.compareDocumentPosition(e)&4?-1:1}}else{bJ=function(bY,bX){if(bY===bX){bB=true;return 0}else{if(bY.sourceIndex&&bX.sourceIndex){return bY.sourceIndex-bX.sourceIndex}}var bV,bR,bS=[],e=[],bU=bY.parentNode,bW=bX.parentNode,bZ=bU;if(bU===bW){return bG(bY,bX)}else{if(!bU){return -1}else{if(!bW){return 1}}}while(bZ){bS.unshift(bZ);bZ=bZ.parentNode}bZ=bW;while(bZ){e.unshift(bZ);bZ=bZ.parentNode}bV=bS.length;bR=e.length;for(var bT=0;bT<bV&&bT<bR;bT++){if(bS[bT]!==e[bT]){return bG(bS[bT],e[bT])}}return bT===bV?bG(bY,e[bT],-1):bG(bS[bT],bX,1)};bG=function(bR,e,bS){if(bR===e){return bS}var bT=bR.nextSibling;while(bT){if(bT===e){return -1}bT=bT.nextSibling}return 1}}(function(){var bR=av.createElement(\"div\"),bS=\"script\"+(new Date()).getTime(),e=av.documentElement;bR.innerHTML=\"<a name='\"+bS+\"'/>\";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!==\"undefined\"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!==\"undefined\"&&bT.getAttributeNode(\"id\").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!==\"undefined\"&&bV.getAttributeNode(\"id\");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement(\"div\");e.appendChild(av.createComment(\"\"));if(e.getElementsByTagName(\"*\").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]===\"*\"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML=\"<a href='#'></a>\";if(e.firstChild&&typeof e.firstChild.getAttribute!==\"undefined\"&&e.firstChild.getAttribute(\"href\")!==\"#\"){bE.attrHandle.href=function(bR){return bR.getAttribute(\"href\",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement(\"div\"),bS=\"__sizzle__\";bT.innerHTML=\"<p class='TEST'></p>\";if(bT.querySelectorAll&&bT.querySelectorAll(\".TEST\").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4===\"body\"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!==\"object\"){var bW=bV,bX=bV.getAttribute(\"id\"),bU=bX||bS,b6=bV.parentNode,b5=/^\\s*[+~]/.test(b4);if(!bX){bV.setAttribute(\"id\",bU)}else{bU=bU.replace(/'/g,\"\\\\$&\")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll(\"[id='\"+bU+\"'] \"+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute(\"id\")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement(\"div\"),\"div\"),bR=false;try{bS.call(av.documentElement,\"[test!='']:sizzle\")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g,\"='$1']\");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement(\"div\");e.innerHTML=\"<div class='test e'></div><div class='test'></div>\";if(!e.getElementsByClassName||e.getElementsByClassName(\"e\").length===0){return}e.lastChild.className=\"e\";if(e.getElementsByClassName(\"e\").length===1){return}bE.order.splice(1,0,\"CLASS\");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!==\"undefined\"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1&&!bY){e[bC]=bV;e.sizset=bT}if(e.nodeName.toLowerCase()===bW){bU=e;break}e=e[bR]}bZ[bT]=bU}}}function bN(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1){if(!bY){e[bC]=bV;e.sizset=bT}if(typeof bW!==\"string\"){if(e===bW){bU=true;break}}else{if(by.filter(bW,[e]).length>0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!==\"HTML\":false};var bM=function(bS,e,bW){var bV,bX=[],bU=\"\",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,\"\")}bS=bE.relative[bS]?bS+\"*\":bS;for(var bT=0,bR=bY.length;bT<bR;bT++){by(bS,bY[bT],bX,bW)}return by.filter(bU,bX)};by.attr=b.attr;by.selectors.attrMap={};b.find=by;b.expr=by.selectors;b.expr[\":\"]=b.expr.filters;b.unique=by.uniqueSort;b.text=by.getText;b.isXMLDoc=by.isXML;b.contains=by.contains})();var ab=/Until$/,aq=/^(?:parents|prevUntil|prevAll)/,a9=/,/,bp=/^.[^:#\\[\\.,]*$/,P=Array.prototype.slice,H=b.expr.match.POS,ay={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bw=this,by,bv;if(typeof e!==\"string\"){return b(e).filter(function(){for(by=0,bv=bw.length;by<bv;by++){if(b.contains(bw[by],this)){return true}}})}var bx=this.pushStack(\"\",\"find\",e),bA,bB,bz;for(by=0,bv=this.length;by<bv;by++){bA=bx.length;b.find(e,this[by],bx);if(by>0){for(bB=bA;bB<bx.length;bB++){for(bz=0;bz<bA;bz++){if(bx[bz]===bx[bB]){bx.splice(bB--,1);break}}}}}return bx},has:function(bv){var e=b(bv);return this.filter(function(){for(var bx=0,bw=e.length;bx<bw;bx++){if(b.contains(this,e[bx])){return true}}})},not:function(e){return this.pushStack(aG(this,e,false),\"not\",e)},filter:function(e){return this.pushStack(aG(this,e,true),\"filter\",e)},is:function(e){return !!e&&(typeof e===\"string\"?H.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw<by.length;bw++){if(b(bz).is(by[bw])){bv.push({selector:by[bw],elem:bz,level:bB})}}bz=bz.parentNode;bB++}return bv}var bA=H.test(by)||typeof by!==\"string\"?b(by,bx||this.context):0;for(bw=0,e=this.length;bw<e;bw++){bz=this[bw];while(bz){if(bA?bA.index(bz)>-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,\"closest\",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e===\"string\"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e===\"string\"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,\"parentNode\")},parentsUntil:function(bv,e,bw){return b.dir(bv,\"parentNode\",bw)},next:function(e){return b.nth(e,2,\"nextSibling\")},prev:function(e){return b.nth(e,2,\"previousSibling\")},nextAll:function(e){return b.dir(e,\"nextSibling\")},prevAll:function(e){return b.dir(e,\"previousSibling\")},nextUntil:function(bv,e,bw){return b.dir(bv,\"nextSibling\",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,\"previousSibling\",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,\"iframe\")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw===\"string\"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(\",\"))}});b.extend({filter:function(bw,e,bv){if(bv){bw=\":not(\"+bw+\")\"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw===\"string\"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split(\"|\"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR=\"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",ag=/ jQuery\\d+=\"(?:\\d+|null)\"/g,ar=/^\\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,d=/<([\\w:]+)/,w=/<tbody/i,W=/<|&#?\\w+;/,ae=/<(?:script|style)/i,O=/<(?:script|object|embed|option|style)/i,ah=new RegExp(\"<(?:\"+aR+\")\",\"i\"),o=/checked\\s*(?:[^=]|=\\s*.checked.)/i,bm=/\\/(java|ecma)script/i,aN=/^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,ax={option:[1,\"<select multiple='multiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],thead:[1,\"<table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],area:[1,\"<map>\",\"</map>\"],_default:[0,\"\",\"\"]},ac=a(av);\n"
+"ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,\"div<div>\",\"</div>\"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!==\"object\"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,\"body\")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,\"before\",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,\"after\",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName(\"*\"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName(\"*\"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,\"\"):null}else{if(typeof bx===\"string\"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||[\"\",\"\"])[1].toLowerCase()]){bx=bx.replace(R,\"<$1></$2>\");try{for(var bw=0,bv=this.length;bw<bv;bw++){if(this[bw].nodeType===1){b.cleanData(this[bw].getElementsByTagName(\"*\"));this[bw].innerHTML=bx}}}catch(by){this.empty().append(bx)}}else{if(b.isFunction(bx)){this.each(function(bz){var e=b(this);e.html(bx.call(this,bz,e.html()))})}else{this.empty().append(bx)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bx){var bw=b(this),bv=bw.html();bw.replaceWith(e.call(this,bx,bv))})}if(typeof e!==\"string\"){e=b(e).detach()}return this.each(function(){var bw=this.nextSibling,bv=this.parentNode;b(this).remove();if(bw){b(bw).before(e)}else{b(bv).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),\"replaceWith\",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bB,bF,bE){var bx,by,bA,bD,bC=bB[0],bv=[];if(!b.support.checkClone&&arguments.length===3&&typeof bC===\"string\"&&o.test(bC)){return this.each(function(){b(this).domManip(bB,bF,bE,true)})}if(b.isFunction(bC)){return this.each(function(bH){var bG=b(this);bB[0]=bC.call(this,bH,bF?bG.html():L);bG.domManip(bB,bF,bE)})}if(this[0]){bD=bC&&bC.parentNode;if(b.support.parentNode&&bD&&bD.nodeType===11&&bD.childNodes.length===this.length){bx={fragment:bD}}else{bx=b.buildFragment(bB,this,bv)}bA=bx.fragment;if(bA.childNodes.length===1){by=bA=bA.firstChild}else{by=bA.firstChild}if(by){bF=bF&&b.nodeName(by,\"tr\");for(var bw=0,e=this.length,bz=e-1;bw<e;bw++){bE.call(bF?ba(this[bw],by):this[bw],bx.cacheable||(e>1&&bw<bz)?b.clone(bA,true,true):bA)}}if(bv.length){b.each(bv,bo)}}return this}});function ba(e,bv){return b.nodeName(e,\"table\")?(e.getElementsByTagName(\"tbody\")[0]||e.appendChild(e.ownerDocument.createElement(\"tbody\"))):e}function t(bB,bv){if(bv.nodeType!==1||!b.hasData(bB)){return}var by,bx,e,bA=b._data(bB),bz=b._data(bv,bA),bw=bA.events;if(bw){delete bz.handle;bz.events={};for(by in bw){for(bx=0,e=bw[by].length;bx<e;bx++){b.event.add(bv,by+(bw[by][bx].namespace?\".\":\"\")+bw[by][bx].namespace,bw[by][bx],bw[by][bx].data)}}}if(bz.data){bz.data=b.extend({},bz.data)}}function ai(bv,e){var bw;if(e.nodeType!==1){return}if(e.clearAttributes){e.clearAttributes()}if(e.mergeAttributes){e.mergeAttributes(bv)}bw=e.nodeName.toLowerCase();if(bw===\"object\"){e.outerHTML=bv.outerHTML}else{if(bw===\"input\"&&(bv.type===\"checkbox\"||bv.type===\"radio\")){if(bv.checked){e.defaultChecked=e.checked=bv.checked}if(e.value!==bv.value){e.value=bv.value}}else{if(bw===\"option\"){e.selected=bv.defaultSelected}else{if(bw===\"input\"||bw===\"textarea\"){e.defaultValue=bv.defaultValue}}}}e.removeAttribute(b.expando)}b.buildFragment=function(bz,bx,bv){var by,e,bw,bA,bB=bz[0];if(bx&&bx[0]){bA=bx[0].ownerDocument||bx[0]}if(!bA.createDocumentFragment){bA=av}if(bz.length===1&&typeof bB===\"string\"&&bB.length<512&&bA===av&&bB.charAt(0)===\"<\"&&!O.test(bB)&&(b.support.checkClone||!o.test(bB))&&(b.support.html5Clone||!ah.test(bB))){e=true;bw=b.fragments[bB];if(bw&&bw!==1){by=bw}}if(!by){by=bA.createDocumentFragment();b.clean(bz,bA,by,bv)}if(e){b.fragments[bB]=bw?by:1}return{fragment:by,cacheable:e}};b.fragments={};b.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,bv){b.fn[e]=function(bw){var bz=[],bC=b(bw),bB=this.length===1&&this[0].parentNode;if(bB&&bB.nodeType===11&&bB.childNodes.length===1&&bC.length===1){bC[bv](this[0]);return this}else{for(var bA=0,bx=bC.length;bA<bx;bA++){var by=(bA>0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!==\"undefined\"){return e.getElementsByTagName(\"*\")}else{if(typeof e.querySelectorAll!==\"undefined\"){return e.querySelectorAll(\"*\")}else{return[]}}}function az(e){if(e.type===\"checkbox\"||e.type===\"radio\"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||\"\").toLowerCase();if(bv===\"input\"){az(e)}else{if(bv!==\"script\"&&typeof e.getElementsByTagName!==\"undefined\"){b.grep(e.getElementsByTagName(\"input\"),az)}}}function al(e){var bv=av.createElement(\"div\");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test(\"<\"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement===\"undefined\"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz===\"number\"){bz+=\"\"}if(!bz){continue}if(typeof bz===\"string\"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,\"<$1></$2>\");var bK=(d.exec(bz)||[\"\",\"\"])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement(\"div\");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK===\"table\"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===\"<table>\"&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],\"tbody\")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)===\"number\"){for(bB=0;bB<bG;bB++){E(bz[bB])}}else{E(bz)}}if(bz.nodeType){bI.push(bz)}else{bI=b.merge(bI,bz)}}if(bH){bF=function(bL){return !bL.type||bm.test(bL.type)};for(bE=0;bI[bE];bE++){if(bA&&b.nodeName(bI[bE],\"script\")&&(!bI[bE].type||bI[bE].type.toLowerCase()===\"text/javascript\")){bA.push(bI[bE].parentNode?bI[bE].parentNode.removeChild(bI[bE]):bI[bE])}else{if(bI[bE].nodeType===1){var bJ=b.grep(bI[bE].getElementsByTagName(\"script\"),bF);bI.splice.apply(bI,[bE+1,0].concat(bJ))}bH.appendChild(bI[bE])}}}return bI},cleanData:function(bv){var by,bw,e=b.cache,bB=b.event.special,bA=b.support.deleteExpando;for(var bz=0,bx;(bx=bv[bz])!=null;bz++){if(bx.nodeName&&b.noData[bx.nodeName.toLowerCase()]){continue}bw=bx[b.expando];if(bw){by=e[bw];if(by&&by.events){for(var bC in by.events){if(bB[bC]){b.event.remove(bx,bC)}else{b.removeEvent(bx,bC,by.handle)}}if(by.handle){by.handle.elem=null}}if(bA){delete bx[b.expando]}else{if(bx.removeAttribute){bx.removeAttribute(b.expando)}}delete e[bw]}}}});function bo(e,bv){if(bv.src){b.ajax({url:bv.src,async:false,dataType:\"script\"})}else{b.globalEval((bv.text||bv.textContent||bv.innerHTML||\"\").replace(aN,\"/*$0*/\"))}if(bv.parentNode){bv.parentNode.removeChild(bv)}}var ak=/alpha\\([^)]*\\)/i,au=/opacity=([^)]*)/,z=/([A-Z]|^ms)/g,bc=/^-?\\d+(?:px)?$/i,bn=/^-?\\d/,I=/^([\\-+])=([\\-+.\\de]+)/,a7={position:\"absolute\",visibility:\"hidden\",display:\"block\"},an=[\"Left\",\"Right\"],a1=[\"Top\",\"Bottom\"],Z,aI,aX;b.fn.css=function(e,bv){if(arguments.length===2&&bv===L){return this}return b.access(this,e,bv,true,function(bx,bw,by){return by!==L?b.style(bx,bw,by):b.css(bx,bw)})};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,\"opacity\",\"opacity\");return e===\"\"?\"1\":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{\"float\":b.support.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC===\"string\"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC=\"number\"}if(bD==null||bC===\"number\"&&isNaN(bD)){return}if(bC===\"number\"&&!b.cssNumber[bz]){bD+=\"px\"}if(!bE||!(\"set\" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&\"get\" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx===\"cssFloat\"){bx=\"float\"}if(e&&\"get\" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(bx,bw,by){var e={};for(var bv in bw){e[bv]=bx.style[bv];bx.style[bv]=bw[bv]}by.call(bx);for(bv in bw){bx.style[bv]=e[bv]}}});b.curCSS=b.css;b.each([\"height\",\"width\"],function(bv,e){b.cssHooks[e]={get:function(by,bx,bw){var bz;if(bx){if(by.offsetWidth!==0){return p(by,e,bw)}else{b.swap(by,a7,function(){bz=p(by,e,bw)})}return bz}},set:function(bw,bx){if(bc.test(bx)){bx=parseFloat(bx);if(bx>=0){return bx+\"px\"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||\"\")?(parseFloat(RegExp.$1)/100)+\"\":e?\"1\":\"\"},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?\"alpha(opacity=\"+bz*100+\")\":\"\",bw=bv&&bv.filter||bx.filter||\"\";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,\"\"))===\"\"){bx.removeAttribute(\"filter\");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+\" \"+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:\"inline-block\"},function(){if(bv){e=Z(bw,\"margin-right\",\"marginRight\")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,\"-$1\").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===\"\"&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw===\"fontSize\"?\"1em\":(bv||0);bv=bx.pixelLeft+\"px\";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===\"\"?\"auto\":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw===\"width\"?by.offsetWidth:by.offsetHeight,bz=bw===\"width\"?an:a1,bx=0,e=bz.length;\n"
diff --git a/src/jquery_p3.js b/src/jquery_p3.js
index 3635172..c0f18ce 100644
--- a/src/jquery_p3.js
+++ b/src/jquery_p3.js
@@ -1,2 +1,3 @@
-{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c)
-{if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
+if(bA>0){if(bv!=="border"){for(;bx<e;bx++){if(!bv){bA-=parseFloat(b.css(by,"padding"+bz[bx]))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}else{bA-=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}}}return bA+"px"}bA=Z(by,bw,bw);if(bA<0||bA==null){bA=by.style[bw]||0}bA=parseFloat(bA)||0;if(bv){for(;bx<e;bx++){bA+=parseFloat(b.css(by,"padding"+bz[bx]))||0;if(bv!=="padding"){bA+=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}}}return bA+"px"}if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}var k=/%20/g,ap=/\[\]$/,bs=/\r?\n/g,bq=/#.*$/,aD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,aZ=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aM=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,aQ=/^(?:GET|HEAD)$/,c=/^\/\//,M=/\?/,a6=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\+/.test(bv);if(bC){bv=bv.substr(1)||"*"}bB=e[bv]=e[bv]||[];bB[bC?"unshift":"push"](bA)}}}}function aW(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC==="string"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aW(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx["*"]){bC=aW(bv,bE,bz,bD,"*",bx)}return bC}function am(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!=="string"&&A){return A.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(" ");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("<div>").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE==="string"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC==="*"){bC=bx}else{if(bx!=="*"&&bx!==bC){by=bx+" "+bC;bF=bG[by]||bG["* "+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(" ");if(bB[0]===bx||bB[0]==="*"){e=bG[bB[1]+" "+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error("No conversion from "+by.replace(" "," to "))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),u=/(\=)\?(&|$)|\?\?/i;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return b.expando+"_"+(aC++)}});b.ajaxPrefilter("json jsonp",function(bD,bA,bC){var bx=bD.contentType==="application/x-www-form-urlencoded"&&(typeof bD.data==="string");if(bD.dataTypes[0]==="jsonp"||bD.jsonp!==false&&(u.test(bD.url)||bx&&u.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bb[bw],e=bD.url,by=bD.data,bv="$1"+bw+"$2";if(bD.jsonp!==false){e=e.replace(u,bv);if(bD.url===e){if(bx){by=by.replace(u,bv)}if(bD.data===by){e+=(/\?/.test(e)?"&":"?")+bD.jsonp+"="+bw}}}bD.url=e;bD.data=by;bb[bw]=function(bE){bB=[bE]};bC.always(function(){bb[bw]=bz;if(bB&&b.isFunction(bz)){bb[bw](bB[0])}});bD.converters["script json"]=function(){if(!bB){b.error(bw+" was not called")}return bB[0]};bD.dataTypes[0]="json";return"script"}});b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter("script",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});b.ajaxTransport("script",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName("head")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement("script");e.async="async";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,"success")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var B=bb.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,y=0,N;function aL(){try{return new bb.XMLHttpRequest()}catch(bv){}}function aj(){try{return new bb.ActiveXObject("Microsoft.XMLHTTP")}catch(bv){}}b.ajaxSettings.xhr=bb.ActiveXObject?function(){return !this.isLocal&&aL()||aj()}:aL;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&("withCredentials" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB["X-Requested-With"]){bB["X-Requested-With"]="XMLHttpRequest"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(B){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}bI.text=bA.responseText;try{bD=bA.statusText}catch(bJ){bD=""}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++y;if(B){if(!N){N={};b(bb).unload(B)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)
+}}}}})}var Q={},a8,m,aB=/^(?:toggle|show|hide)$/,aT=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,a3,aH=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],a4;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a0("show",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,"olddisplay")&&by==="none"){by=bw.style.display=""}if(by===""&&b.css(bw,"display")==="none"){b._data(bw,"olddisplay",x(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===""||by==="none"){bw.style.display=b._data(bw,"olddisplay")||""}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a0("hide",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,"display");if(by!=="none"&&!b._data(bw,"olddisplay")){b._data(bw,"olddisplay",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display="none"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw==="boolean";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(":hidden");b(this)[by?"show":"hide"]()})}else{this.animate(a0("toggle",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bK=this.nodeType===1,bI=bK&&b(this).is(":hidden"),bB,bF,bD,bJ,bH,bC,bG,bL,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}bF=bz[bB];if(b.isArray(bF)){bE.animatedProperties[bB]=bF[1];bF=bz[bB]=bF[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||"swing"}if(bF==="hide"&&bI||bF==="show"&&!bI){return bE.complete.call(this)}if(bK&&(bB==="height"||bB==="width")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,"display")==="inline"&&b.css(this,"float")==="none"){if(!b.support.inlineBlockNeedsLayout||x(this.nodeName)==="inline"){this.style.display="inline-block"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow="hidden"}for(bD in bz){bJ=new b.fx(this,bE,bD);bF=bz[bD];if(aB.test(bF)){bA=b._data(this,"toggle"+bD)||(bF==="toggle"?bI?"show":"hide":0);if(bA){b._data(this,"toggle"+bD,bA==="show"?"hide":"show");bJ[bA]()}else{bJ[bF]()}}else{bH=aT.exec(bF);bC=bJ.cur();if(bH){bG=parseFloat(bH[2]);bL=bH[3]||(b.cssNumber[bD]?"":"px");if(bL!=="px"){b.style(this,bD,(bG||1)+bL);bC=((bG||1)/bJ.cur())*bC;b.style(this,bD,bC+bL)}if(bH[1]){bG=((bH[1]==="-="?-1:1)*bG)+bC}bJ.custom(bC,bG,bL)}else{bJ.custom(bC,bF,"")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!=="string"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||"fx",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(".run")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+".run"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bh(){setTimeout(at,0);return(a4=b.now())}function at(){a4=L}function a0(bv,e){var bw={};b.each(aH.concat.apply([],aH.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a0("show",1),slideUp:a0("hide",1),slideToggle:a0("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw==="object"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue="fx"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(bw,bx,e,bv){return e+bv*bw},swing:function(bw,bx,e,bv){return((-Math.cos(bw*Math.PI)/2)+0.5)*bv+e}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv==="auto"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a4||bh();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?"":"px");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(e.options.hide&&b._data(e.elem,"fxshow"+e.prop)===L){b._data(e.elem,"fxshow"+e.prop,e.start)}};if(bv()&&b.timers.push(bv)&&!a3){a3=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,"fxshow"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a4||bh(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a3);a3=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,"opacity",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each(["width","height"],function(e,bv){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function x(bx){if(!Q[bx]){var e=av.body,bv=b("<"+bx+">").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b
+})}})(window); \ No newline at end of file
diff --git a/src/jquery_p3_js.h b/src/jquery_p3_js.h
index 9fe869c..880da7f 100644
--- a/src/jquery_p3_js.h
+++ b/src/jquery_p3_js.h
@@ -1,2 +1,3 @@
-"{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName(\"*\"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,\"\"):null;if(typeof a==\"string\"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||[\"\",\"\"])[1].toLowerCase()]){a=a.replace(Y,\"<$1></$2>\");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName(\"*\")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!=\"string\"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),\"replaceWith\",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j==\"string\"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,\"tr\");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j==\"string\"&&j.length<512&&i===c&&j.charAt(0)===\"<\"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test(\"<\"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement==\"undefined\"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k==\"number\"&&(k+=\"\");if(!k)continue;if(typeof k==\"string\")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,\"<$1></$2>\");var l=(Z.exec(k)||[\"\",\"\"])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement(\"div\");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l===\"table\"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===\"<table>\"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],\"tbody\")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)==\"number\")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],\"script\")&&(!h[j].type||h[j].type.toLowerCase()===\"text/javascript\"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName(\"script\"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\\([^)]*\\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\\d+(?:px)?$/i,bu=/^-?\\d/,bv=/^([\\-+])=([\\-+.\\de]+)/,bw={position:\"absolute\",visibility:\"hidden\",display:\"block\"},bx=[\"Left\",\"Right\"],by=[\"Top\",\"Bottom\"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,\"opacity\",\"opacity\");return c===\"\"?\"1\":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{\"float\":f.support.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&\"get\"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h===\"string\"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h=\"number\");if(d==null||h===\"number\"&&isNaN(d))return;h===\"number\"&&!f.cssNumber[i]&&(d+=\"px\");if(!k||!(\"set\"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c===\"cssFloat\"&&(c=\"float\");if(g&&\"get\"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each([\"height\",\"width\"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+\"px\"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||\"\")?parseFloat(RegExp.$1)/100+\"\":b?\"1\":\"\"},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?\"alpha(opacity=\"+b*100+\")\":\"\",g=d&&d.filter||c.filter||\"\";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,\"\"))===\"\"){c.removeAttribute(\"filter\");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+\" \"+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:\"inline-block\"},function(){b?c=bz(a,\"margin-right\",\"marginRight\"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,\"-$1\").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===\"\"&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b===\"fontSize\"?\"1em\":f||0,f=g.pixelLeft+\"px\",g.left=c,d&&(a.runtimeStyle.left=d));return f===\"\"?\"auto\":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,\"display\"))===\"none\"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\\[\\]$/,bF=/\\r?\\n/g,bG=/#.*$/,bH=/^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\\/\\//,bM=/\\?/,bN=/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=[\"*/\"]+[\"*\"];try{bV=e.href}catch(bY){bV=c.createElement(\"a\"),bV.href=\"\",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!=\"string\"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(\" \");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h=\"GET\";c&&(f.isFunction(c)?(d=c,c=b):typeof c==\"object\"&&(c=f.param(c,f.ajaxSettings.traditional),h=\"POST\"));var i=this;f.ajax({url:a,type:h,dataType:\"html\",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f(\"<div>\").append(c.replace(bN,\"\")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,\"\\r\\n\")}}):{name:b.name,value:c.replace(bF,\"\\r\\n\")}}).get()}}),f.each(\"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split(\" \"),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each([\"get\",\"post\"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,\"script\")},getJSON:function(a,b,c){return f.get(a,b,c,\"json\")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:\"GET\",contentType:\"application/x-www-form-urlencoded\",processData:!0,async:!0,accepts:{xml:\"application/xml, text/xml\",html:\"text/html\",text:\"text/plain\",json:\"application/json, text/javascript\",\"*\":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\"},converters:{\"* text\":a.String,\"text html\":!0,\"text json\":f.parseJSON,\"text xml\":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||\"\",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader(\"Last-Modified\"))f.lastModified[k]=y;if(z=v.getResponseHeader(\"Etag\"))f.etag[k]=z}if(a===304)w=\"notmodified\",o=!0;else try{r=cc(d,x),w=\"success\",o=!0}catch(A){w=\"parsererror\",u=A}}else{u=w;if(!w||a)w=\"error\",a<0&&(a=0)}v.status=a,v.statusText=\"\"+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger(\"ajax\"+(o?\"Success\":\"Error\"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger(\"ajaxComplete\",[v,d]),--f.active||f.event.trigger(\"ajaxStop\"))}}typeof a==\"object\"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks(\"once memory\"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||\"abort\",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+\"\").replace(bG,\"\").replace(bL,bW[1]+\"//\"),d.dataTypes=f.trim(d.dataType||\"*\").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]===\"http:\"?80:443))==(bW[3]||(bW[1]===\"http:\"?80:443)))),d.data&&d.processData&&typeof d.data!=\"string\"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger(\"ajaxStart\");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?\"&\":\"?\")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,\"$1_=\"+x);d.url=y+(y===d.url?(bM.test(d.url)?\"&\":\"?\")+\"_=\"+x:\"\")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader(\"Content-Type\",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader(\"If-Modified-Since\",f.lastModified[k]),f.etag[k]&&v.setRequestHeader(\"If-None-Match\",f.etag[k])),v.setRequestHeader(\"Accept\",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!==\"*\"?\", \"+bX+\"; q=0.01\":\"\"):d.accepts[\"*\"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,\"No Transport\");else{v.readyState=1,t&&g.trigger(\"ajaxSend\",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort(\"timeout\")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+\"=\"+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join(\"&\").replace(bD,\"+\")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\\=)\\?(&|$)|\\?\\?/i;f.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){return f.expando+\"_\"+cd++}}),f.ajaxPrefilter(\"json jsonp\",function(b,c,d){var e=b.contentType===\"application/x-www-form-urlencoded\"&&typeof b.data==\"string\";if(b.dataTypes[0]===\"jsonp\"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l=\"$1\"+h+\"$2\";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\\?/.test(j)?\"&\":\"?\")+b.jsonp+\"=\"+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters[\"script json\"]=function(){g||f.error(h+\" was not called\");return g[0]},b.dataTypes[0]=\"json\";return\"script\"}}),f.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/javascript|ecmascript/},converters:{\"text script\":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter(\"script\",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type=\"GET\",a.global=!1)}),f.ajaxTransport(\"script\",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName(\"head\")[0]||c.documentElement;return{send:function(f,g){d=c.createElement(\"script\"),d.async=\"async\",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,\"success\")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&\"withCredentials\"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c)\n"
-"{if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e[\"X-Requested-With\"]&&(e[\"X-Requested-With\"]=\"XMLHttpRequest\");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=\"\"}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,cp,cq=[[\"height\",\"marginTop\",\"marginBottom\",\"paddingTop\",\"paddingBottom\"],[\"width\",\"marginLeft\",\"marginRight\",\"paddingLeft\",\"paddingRight\"],[\"opacity\"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu(\"show\",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,\"olddisplay\")&&e===\"none\"&&(e=d.style.display=\"\"),e===\"\"&&f.css(d,\"display\")===\"none\"&&f._data(d,\"olddisplay\",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===\"\"||e===\"none\")d.style.display=f._data(d,\"olddisplay\")||\"\"}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu(\"hide\",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,\"display\"),e!==\"none\"&&!f._data(d,\"olddisplay\")&&f._data(d,\"olddisplay\",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display=\"none\");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a==\"boolean\";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(\":hidden\");f(this)[b?\"show\":\"hide\"]()}):this.animate(cu(\"toggle\",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(\":hidden\").css(\"opacity\",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(\":hidden\"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||\"swing\";if(h===\"hide\"&&d||h===\"show\"&&!d)return b.complete.call(this);c&&(g===\"height\"||g===\"width\")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,\"display\")===\"inline\"&&f.css(this,\"float\")===\"none\"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)===\"inline\"?this.style.display=\"inline-block\":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow=\"hidden\");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,\"toggle\"+i)||(h===\"toggle\"?d?\"show\":\"hide\":0),o?(f._data(this,\"toggle\"+i,o===\"show\"?\"hide\":\"show\"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?\"\":\"px\"),n!==\"px\"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]===\"-=\"?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,\"\"));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!=\"string\"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||\"fx\",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(\".run\")===b.length-4&&h(this,g,b);else g[b=a+\".run\"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu(\"show\",1),slideUp:cu(\"hide\",1),slideToggle:cu(\"toggle\",1),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a==\"object\"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration==\"number\"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue=\"fx\";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b===\"auto\"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?\"\":\"px\"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,\"fxshow\"+e.prop)===b&&f._data(e.elem,\"fxshow\"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,\"fxshow\"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop===\"width\"||this.prop===\"height\"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,\"fxshow\"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each([\"\",\"X\",\"Y\"],function(a,b){h.style[\"overflow\"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,\"fxshow\"+b,!0),f.removeData(h,\"toggle\"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,\"opacity\",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each([\"width\",\"height\"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;\"getBoundingClientRect\"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position===\"fixed\")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!==\"visible\"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position===\"relative\"||k.position===\"static\")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position===\"fixed\"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,\"marginTop\"))||0,c+=parseFloat(f.css(a,\"marginLeft\"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,\"position\");d===\"static\"&&(a.style.position=\"relative\");var e=f(a),g=e.offset(),h=f.css(a,\"top\"),i=f.css(a,\"left\"),j=(d===\"absolute\"||d===\"fixed\")&&f.inArray(\"auto\",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),\"using\"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,\"marginTop\"))||0,c.left-=parseFloat(f.css(a,\"marginLeft\"))||0,d.top+=parseFloat(f.css(b[0],\"borderTopWidth\"))||0,d.left+=parseFloat(f.css(b[0],\"borderLeftWidth\"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,\"position\")===\"static\")a=a.offsetParent;return a})}}),f.each([\"Left\",\"Top\"],function(a,c){var d=\"scroll\"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?\"pageXOffset\"in g?g[a?\"pageYOffset\":\"pageXOffset\"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each([\"Height\",\"Width\"],function(a,c){var d=c.toLowerCase();f.fn[\"inner\"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,\"padding\")):this[d]():null},f.fn[\"outer\"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?\"margin\":\"border\")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement[\"client\"+c],h=e.document.body;return e.document.compatMode===\"CSS1Compat\"&&g||h&&h[\"client\"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement[\"client\"+c],e.body[\"scroll\"+c],e.documentElement[\"scroll\"+c],e.body[\"offset\"+c],e.documentElement[\"offset\"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a==\"string\"?a:a+\"px\")}}),a.jQuery=a.$=f,typeof define==\"function\"&&define.amd&&define.amd.jQuery&&define(\"jquery\",[],function(){return f})})(window);\n"
+"if(bA>0){if(bv!==\"border\"){for(;bx<e;bx++){if(!bv){bA-=parseFloat(b.css(by,\"padding\"+bz[bx]))||0}if(bv===\"margin\"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}else{bA-=parseFloat(b.css(by,\"border\"+bz[bx]+\"Width\"))||0}}}return bA+\"px\"}bA=Z(by,bw,bw);if(bA<0||bA==null){bA=by.style[bw]||0}bA=parseFloat(bA)||0;if(bv){for(;bx<e;bx++){bA+=parseFloat(b.css(by,\"padding\"+bz[bx]))||0;if(bv!==\"padding\"){bA+=parseFloat(b.css(by,\"border\"+bz[bx]+\"Width\"))||0}if(bv===\"margin\"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}}}return bA+\"px\"}if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,\"display\"))===\"none\")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}var k=/%20/g,ap=/\\[\\]$/,bs=/\\r?\\n/g,bq=/#.*$/,aD=/^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg,aZ=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aM=/^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,aQ=/^(?:GET|HEAD)$/,c=/^\\/\\//,M=/\\?/,a6=/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,q=/^(?:select|textarea)/i,h=/\\s+/,br=/([?&])_=[^&]*/,K=/^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=[\"*/\"]+[\"*\"];try{aE=bl.href}catch(aw){aE=av.createElement(\"a\");aE.href=\"\";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!==\"string\"){bA=by;by=\"*\"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\\+/.test(bv);if(bC){bv=bv.substr(1)||\"*\"}bB=e[bv]=e[bv]||[];bB[bC?\"unshift\":\"push\"](bA)}}}}function aW(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC===\"string\"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aW(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx[\"*\"]){bC=aW(bv,bE,bz,bD,\"*\",bx)}return bC}function am(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!==\"string\"&&A){return A.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(\" \");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx=\"GET\";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz===\"object\"){bz=b.param(bz,b.ajaxSettings.traditional);bx=\"POST\"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:\"html\",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b(\"<div>\").append(bD.replace(a6,\"\")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,\"\\r\\n\")}}):{name:bv.name,value:bw.replace(bs,\"\\r\\n\")}}).get()}});b.each(\"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split(\" \"),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each([\"get\",\"post\"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,\"script\")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,\"json\")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:\"GET\",contentType:\"application/x-www-form-urlencoded\",processData:true,async:true,accepts:{xml:\"application/xml, text/xml\",html:\"text/html\",text:\"text/plain\",json:\"application/json, text/javascript\",\"*\":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\"},converters:{\"* text\":bb.String,\"text html\":true,\"text json\":b.parseJSON,\"text xml\":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz===\"object\"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks(\"once memory\"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||\"abort\";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||\"\";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader(\"Last-Modified\"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader(\"Etag\"))){b.etag[bC]=b2}}if(bZ===304){bX=\"notmodified\";bT=true}else{try{b4=G(bD,bY);bX=\"success\";bT=true}catch(b1){bX=\"parsererror\";b3=b1}}}else{b3=bX;if(!bX||bZ){bX=\"error\";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=\"\"+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger(\"ajax\"+(bT?\"Success\":\"Error\"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger(\"ajaxComplete\",[bJ,bD]);if(!(--b.active)){b.event.trigger(\"ajaxStop\")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+\"\").replace(bq,\"\").replace(c,s[1]+\"//\");bD.dataTypes=b.trim(bD.dataType||\"*\").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]===\"http:\"?80:443))!=(s[3]||(s[1]===\"http:\"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!==\"string\"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger(\"ajaxStart\")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?\"&\":\"?\")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,\"$1_=\"+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?\"&\":\"?\")+\"_=\"+bv:\"\")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader(\"Content-Type\",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader(\"If-Modified-Since\",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader(\"If-None-Match\",b.etag[bC])}}bJ.setRequestHeader(\"Accept\",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!==\"*\"?\", \"+aV+\"; q=0.01\":\"\"):bD.accepts[\"*\"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,\"No Transport\")}else{bJ.readyState=1;if(bw){bG.trigger(\"ajaxSend\",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort(\"timeout\")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+\"=\"+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join(\"&\").replace(k,\"+\")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+\"[\"+(typeof bz===\"object\"||b.isArray(bz)?bA:\"\")+\"]\",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by===\"object\"){for(var e in by){v(bw+\"[\"+e+\"]\",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]===\"*\"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader(\"content-type\")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+\" \"+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE===\"string\"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC===\"*\"){bC=bx}else{if(bx!==\"*\"&&bx!==bC){by=bx+\" \"+bC;bF=bG[by]||bG[\"* \"+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(\" \");if(bB[0]===bx||bB[0]===\"*\"){e=bG[bB[1]+\" \"+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error(\"No conversion from \"+by.replace(\" \",\" to \"))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),u=/(\\=)\\?(&|$)|\\?\\?/i;b.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){return b.expando+\"_\"+(aC++)}});b.ajaxPrefilter(\"json jsonp\",function(bD,bA,bC){var bx=bD.contentType===\"application/x-www-form-urlencoded\"&&(typeof bD.data===\"string\");if(bD.dataTypes[0]===\"jsonp\"||bD.jsonp!==false&&(u.test(bD.url)||bx&&u.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bb[bw],e=bD.url,by=bD.data,bv=\"$1\"+bw+\"$2\";if(bD.jsonp!==false){e=e.replace(u,bv);if(bD.url===e){if(bx){by=by.replace(u,bv)}if(bD.data===by){e+=(/\\?/.test(e)?\"&\":\"?\")+bD.jsonp+\"=\"+bw}}}bD.url=e;bD.data=by;bb[bw]=function(bE){bB=[bE]};bC.always(function(){bb[bw]=bz;if(bB&&b.isFunction(bz)){bb[bw](bB[0])}});bD.converters[\"script json\"]=function(){if(!bB){b.error(bw+\" was not called\")}return bB[0]};bD.dataTypes[0]=\"json\";return\"script\"}});b.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/javascript|ecmascript/},converters:{\"text script\":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter(\"script\",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type=\"GET\";e.global=false}});b.ajaxTransport(\"script\",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName(\"head\")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement(\"script\");e.async=\"async\";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,\"success\")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var B=bb.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,y=0,N;function aL(){try{return new bb.XMLHttpRequest()}catch(bv){}}function aj(){try{return new bb.ActiveXObject(\"Microsoft.XMLHTTP\")}catch(bv){}}b.ajaxSettings.xhr=bb.ActiveXObject?function(){return !this.isLocal&&aL()||aj()}:aL;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&(\"withCredentials\" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB[\"X-Requested-With\"]){bB[\"X-Requested-With\"]=\"XMLHttpRequest\"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(B){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}bI.text=bA.responseText;try{bD=bA.statusText}catch(bJ){bD=\"\"}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++y;if(B){if(!N){N={};b(bb).unload(B)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)\n"
+"}}}}})}var Q={},a8,m,aB=/^(?:toggle|show|hide)$/,aT=/^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,a3,aH=[[\"height\",\"marginTop\",\"marginBottom\",\"paddingTop\",\"paddingBottom\"],[\"width\",\"marginLeft\",\"marginRight\",\"paddingLeft\",\"paddingRight\"],[\"opacity\"]],a4;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a0(\"show\",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,\"olddisplay\")&&by===\"none\"){by=bw.style.display=\"\"}if(by===\"\"&&b.css(bw,\"display\")===\"none\"){b._data(bw,\"olddisplay\",x(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===\"\"||by===\"none\"){bw.style.display=b._data(bw,\"olddisplay\")||\"\"}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a0(\"hide\",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,\"display\");if(by!==\"none\"&&!b._data(bw,\"olddisplay\")){b._data(bw,\"olddisplay\",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display=\"none\"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw===\"boolean\";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(\":hidden\");b(this)[by?\"show\":\"hide\"]()})}else{this.animate(a0(\"toggle\",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(\":hidden\").css(\"opacity\",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bK=this.nodeType===1,bI=bK&&b(this).is(\":hidden\"),bB,bF,bD,bJ,bH,bC,bG,bL,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}bF=bz[bB];if(b.isArray(bF)){bE.animatedProperties[bB]=bF[1];bF=bz[bB]=bF[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||\"swing\"}if(bF===\"hide\"&&bI||bF===\"show\"&&!bI){return bE.complete.call(this)}if(bK&&(bB===\"height\"||bB===\"width\")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,\"display\")===\"inline\"&&b.css(this,\"float\")===\"none\"){if(!b.support.inlineBlockNeedsLayout||x(this.nodeName)===\"inline\"){this.style.display=\"inline-block\"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow=\"hidden\"}for(bD in bz){bJ=new b.fx(this,bE,bD);bF=bz[bD];if(aB.test(bF)){bA=b._data(this,\"toggle\"+bD)||(bF===\"toggle\"?bI?\"show\":\"hide\":0);if(bA){b._data(this,\"toggle\"+bD,bA===\"show\"?\"hide\":\"show\");bJ[bA]()}else{bJ[bF]()}}else{bH=aT.exec(bF);bC=bJ.cur();if(bH){bG=parseFloat(bH[2]);bL=bH[3]||(b.cssNumber[bD]?\"\":\"px\");if(bL!==\"px\"){b.style(this,bD,(bG||1)+bL);bC=((bG||1)/bJ.cur())*bC;b.style(this,bD,bC+bL)}if(bH[1]){bG=((bH[1]===\"-=\"?-1:1)*bG)+bC}bJ.custom(bC,bG,bL)}else{bJ.custom(bC,bF,\"\")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!==\"string\"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||\"fx\",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(\".run\")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+\".run\"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bh(){setTimeout(at,0);return(a4=b.now())}function at(){a4=L}function a0(bv,e){var bw={};b.each(aH.concat.apply([],aH.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a0(\"show\",1),slideUp:a0(\"hide\",1),slideToggle:a0(\"toggle\",1),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw===\"object\"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration===\"number\"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue=\"fx\"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(bw,bx,e,bv){return e+bv*bw},swing:function(bw,bx,e,bv){return((-Math.cos(bw*Math.PI)/2)+0.5)*bv+e}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv===\"auto\"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a4||bh();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?\"\":\"px\");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(e.options.hide&&b._data(e.elem,\"fxshow\"+e.prop)===L){b._data(e.elem,\"fxshow\"+e.prop,e.start)}};if(bv()&&b.timers.push(bv)&&!a3){a3=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,\"fxshow\"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop===\"width\"||this.prop===\"height\"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,\"fxshow\"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a4||bh(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each([\"\",\"X\",\"Y\"],function(bC,bD){bz.style[\"overflow\"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,\"fxshow\"+bA,true);b.removeData(bz,\"toggle\"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a3);a3=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,\"opacity\",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each([\"width\",\"height\"],function(e,bv){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function x(bx){if(!Q[bx]){var e=av.body,bv=b(\"<\"+bx+\">\").appendTo(e),bw=bv.css(\"display\");bv.remove();if(bw===\"none\"||bw===\"\"){if(!a8){a8=av.createElement(\"iframe\");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode===\"CSS1Compat\"?\"<!doctype html>\":\"\")+\"<html><body>\");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,\"display\");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if(\"getBoundingClientRect\" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position===\"fixed\"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!==\"visible\"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position===\"relative\"||e.position===\"static\"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position===\"fixed\"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,\"marginTop\"))||0;bv+=parseFloat(b.css(e,\"marginLeft\"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,\"position\");if(bB===\"static\"){bx.style.position=\"relative\"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,\"top\"),bE=b.css(bx,\"left\"),bF=(bB===\"absolute\"||bB===\"fixed\")&&b.inArray(\"auto\",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if(\"using\" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,\"marginTop\"))||0;bx.left-=parseFloat(b.css(bw,\"marginLeft\"))||0;e.top+=parseFloat(b.css(bv[0],\"borderTopWidth\"))||0;e.left+=parseFloat(b.css(bv[0],\"borderLeftWidth\"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,\"position\")===\"static\")){e=e.offsetParent}return e})}});b.each([\"Left\",\"Top\"],function(bv,e){var bw=\"scroll\"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?(\"pageXOffset\" in by)?by[bv?\"pageYOffset\":\"pageXOffset\"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each([\"Height\",\"Width\"],function(bv,e){var bw=e.toLowerCase();b.fn[\"inner\"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,\"padding\")):this[bw]():null};b.fn[\"outer\"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?\"margin\":\"border\")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement[\"client\"+e],bx=bA.document.body;return bA.document.compatMode===\"CSS1Compat\"&&bB||bx&&bx[\"client\"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement[\"client\"+e],bA.body[\"scroll\"+e],bA.documentElement[\"scroll\"+e],bA.body[\"offset\"+e],bA.documentElement[\"offset\"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz===\"string\"?bz:bz+\"px\")}}}}});bb.jQuery=bb.$=b;if(typeof define===\"function\"&&define.amd&&define.amd.jQuery){define(\"jquery\",[],function(){return b\n"
+"})}})(window);\n"
diff --git a/src/jquery_ui.js b/src/jquery_ui.js
index b705d2e..0ef321d 100644
--- a/src/jquery_ui.js
+++ b/src/jquery_ui.js
@@ -7,8 +7,7 @@
*
* http://docs.jquery.com/UI
*/
-(function(a,b){function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;if(!b.href||!g||f.nodeName.toLowerCase()!=="map")return!1;h=a("img[usemap=#"+g+"]")[0];return!!h&&d(h)}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}a.ui=a.ui||{};a.ui.version||(a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)});return c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){if(c===b)return g["inner"+d].call(this);return this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){if(typeof b!="number")return g["outer"+d].call(this,b);return this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!!d&&!!a.element[0].parentNode)for(var e=0;e<d.length;e++)a.options[d[e][0]]&&d[e][1].apply(a.element,c)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(b,c){if(a(b).css("overflow")==="hidden")return!1;var d=c&&c==="left"?"scrollLeft":"scrollTop",e=!1;if(b[d]>0)return!0;b[d]=1,e=b[d]>0,b[d]=0;return e},isOverAxis:function(a,b,c){return a>b&&a<b+c},isOver:function(b,c,d,e,f,g){return a.ui.isOverAxis(b,d,f)&&a.ui.isOverAxis(c,e,g)}}))})(jQuery);
-/*!
+(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h<j.length;h++){if(e.options[j[h][0]]){j[h][1].apply(e.element,f)}}}},contains:function(f,e){return document.compareDocumentPosition?f.compareDocumentPosition(e)&16:f!==e&&f.contains(e)},hasScroll:function(h,f){if(a(h).css("overflow")==="hidden"){return false}var e=(f&&f==="left")?"scrollLeft":"scrollTop",g=false;if(h[e]>0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*!
* jQuery UI Widget 1.8.18
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
@@ -17,8 +16,7 @@
*
* http://docs.jquery.com/UI/Widget
*/
-(function(a,b){if(a.cleanData){var c=a.cleanData;a.cleanData=function(b){for(var d=0,e;(e=b[d])!=null;d++)try{a(e).triggerHandler("remove")}catch(f){}c(b)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){c||(!b||a.filter(b,[this]).length)&&a("*",this).add([this]).each(function(){try{a(this).triggerHandler("remove")}catch(b){}});return d.call(a(this),b,c)})}}a.widget=function(b,c,d){var e=b.split(".")[0],f;b=b.split(".")[1],f=e+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][f]=function(c){return!!a.data(c,b)},a[e]=a[e]||{},a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};var g=new c;g.options=a.extend(!0,{},g.options),a[e][b].prototype=a.extend(!0,g,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:f},d),a.widget.bridge(b,a[e][b])},a.widget.bridge=function(c,d){a.fn[c]=function(e){var f=typeof e=="string",g=Array.prototype.slice.call(arguments,1),h=this;e=!f&&g.length?a.extend.apply(null,[!0,e].concat(g)):e;if(f&&e.charAt(0)==="_")return h;f?this.each(function(){var d=a.data(this,c),f=d&&a.isFunction(d[e])?d[e].apply(d,g):d;if(f!==d&&f!==b){h=f;return!1}}):this.each(function(){var b=a.data(this,c);b?b.option(e||{})._init():a.data(this,c,new d(e,this))});return h}},a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)},a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:!1},_createWidget:function(b,c){a.data(c,this.widgetName,this),this.element=a(c),this.options=a.extend(!0,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()}),this._create(),this._trigger("create"),this._init()},_getCreateOptions:function(){return a.metadata&&a.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName),this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled "+"ui-state-disabled")},widget:function(){return this.element},option:function(c,d){var e=c;if(arguments.length===0)return a.extend({},this.options);if(typeof c=="string"){if(d===b)return this.options[c];e={},e[c]=d}this._setOptions(e);return this},_setOptions:function(b){var c=this;a.each(b,function(a,b){c._setOption(a,b)});return this},_setOption:function(a,b){this.options[a]=b,a==="disabled"&&this.widget()[b?"addClass":"removeClass"](this.widgetBaseClass+"-disabled"+" "+"ui-state-disabled").attr("aria-disabled",b);return this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_trigger:function(b,c,d){var e,f,g=this.options[b];d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent;if(f)for(e in f)e in c||(c[e]=f[e]);this.element.trigger(c,d);return!(a.isFunction(g)&&g.call(this.element[0],c,d)===!1||c.isDefaultPrevented())}}})(jQuery);
-/*!
+(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*!
* jQuery UI Mouse 1.8.18
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
@@ -30,24 +28,8 @@
* Depends:
* jquery.ui.widget.js
*/
-(function(a,b){var c=!1;a(document).mouseup(function(a){c=!1}),a.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var b=this;this.element.bind("mousedown."+this.widgetName,function(a){return b._mouseDown(a)}).bind("click."+this.widgetName,function(c){if(!0===a.data(c.target,b.widgetName+".preventClickEvent")){a.removeData(c.target,b.widgetName+".preventClickEvent"),c.stopImmediatePropagation();return!1}}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(b){if(!c){this._mouseStarted&&this._mouseUp(b),this._mouseDownEvent=b;var d=this,e=b.which==1,f=typeof this.options.cancel=="string"&&b.target.nodeName?a(b.target).closest(this.options.cancel).length:!1;if(!e||f||!this._mouseCapture(b))return!0;this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){d.mouseDelayMet=!0},this.options.delay));if(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)){this._mouseStarted=this._mouseStart(b)!==!1;if(!this._mouseStarted){b.preventDefault();return!0}}!0===a.data(b.target,this.widgetName+".preventClickEvent")&&a.removeData(b.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(a){return d._mouseMove(a)},this._mouseUpDelegate=function(a){return d._mouseUp(a)},a(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),b.preventDefault(),c=!0;return!0}},_mouseMove:function(b){if(a.browser.msie&&!(document.documentMode>=9)&&!b.button)return this._mouseUp(b);if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b));return!this._mouseStarted},_mouseUp:function(b){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b));return!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);
-/*
- * jQuery UI Resizable 1.8.18
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Resizables
- *
- * Depends:
- * jquery.ui.core.js
- * jquery.ui.mouse.js
- * jquery.ui.widget.js
- */
-(function(a,b){a.widget("ui.resizable",a.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1e3},_create:function(){var b=this,c=this.options;this.element.addClass("ui-resizable"),a.extend(this,{_aspectRatio:!!c.aspectRatio,aspectRatio:c.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:c.helper||c.ghost||c.animate?c.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(a('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e<d.length;e++){var f=a.trim(d[e]),g="ui-resizable-"+f,h=a('<div class="ui-resizable-handle '+g+'"></div>');/sw|se|ne|nw/.test(f)&&h.css({zIndex:++c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){c.disabled||(a(this).removeClass("ui-resizable-autohide"),b._handles.show())},function(){c.disabled||b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement);return this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b);return!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui());return!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove();return!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),e<h.maxWidth&&(h.maxWidth=e),g<h.maxHeight&&(h.maxHeight=g);this._vBoundaries=h},_updateCache:function(a){var b=this.options;this.offset=this.helper.offset(),d(a.left)&&(this.position.left=a.left),d(a.top)&&(this.position.top=a.top),d(a.height)&&(this.size.height=a.height),d(a.width)&&(this.size.width=a.width)},_updateRatio:function(a,b){var c=this.options,e=this.position,f=this.size,g=this.axis;d(a.height)?a.width=a.height*this.aspectRatio:d(a.width)&&(a.height=a.width/this.aspectRatio),g=="sw"&&(a.left=e.left+(f.width-a.width),a.top=null),g=="nw"&&(a.top=e.top+(f.height-a.height),a.left=e.left+(f.width-a.width));return a},_respectSize:function(a,b){var c=this.helper,e=this._vBoundaries,f=this._aspectRatio||b.shiftKey,g=this.axis,h=d(a.width)&&e.maxWidth&&e.maxWidth<a.width,i=d(a.height)&&e.maxHeight&&e.maxHeight<a.height,j=d(a.width)&&e.minWidth&&e.minWidth>a.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null);return a},_proportionallyResize:function(){var b=this.options;if(!!this._proportionallyResizeElements.length){var c=this.helper||this.element;for(var d=0;d<this._proportionallyResizeElements.length;d++){var e=this._proportionallyResizeElements[d];if(!this.borderDif){var f=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],g=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];this.borderDif=a.map(f,function(a,b){var c=parseInt(a,10)||0,d=parseInt(g[b],10)||0;return c+d})}if(a.browser.msie&&(!!a(c).is(":hidden")||!!a(c).parents(":hidden").length))continue;e.css({height:c.height()-this.borderDif[0]-this.borderDif[2]||0,width:c.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var b=this.element,c=this.options;this.elementOffset=b.offset();if(this._helper){this.helper=this.helper||a('<div style="overflow:hidden;"></div>');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.18"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!!i){e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/e.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*e.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p
-&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);
-/*
+(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g<l.length;g++){var j=c.trim(l[g]),e="ui-resizable-"+j;var h=c('<div class="ui-resizable-handle '+e+'"></div>');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(h<e.maxWidth){e.maxWidth=h}if(k<e.maxHeight){e.maxHeight=k}}this._vBoundaries=e},_updateCache:function(e){var f=this.options;this.offset=this.helper.offset();if(a(e.left)){this.position.left=e.left}if(a(e.top)){this.position.top=e.top}if(a(e.height)){this.size.height=e.height}if(a(e.width)){this.size.width=e.width}},_updateRatio:function(h,g){var i=this.options,j=this.position,f=this.size,e=this.axis;if(a(h.height)){h.width=(h.height*this.aspectRatio)}else{if(a(h.width)){h.height=(h.width/this.aspectRatio)}}if(e=="sw"){h.left=j.left+(f.width-h.width);h.top=null}if(e=="nw"){h.top=j.top+(f.height-h.height);h.left=j.left+(f.width-h.width)}return h},_respectSize:function(l,g){var j=this.helper,i=this._vBoundaries,r=this._aspectRatio||g.shiftKey,q=this.axis,t=a(l.width)&&i.maxWidth&&(i.maxWidth<l.width),m=a(l.height)&&i.maxHeight&&(i.maxHeight<l.height),h=a(l.width)&&i.minWidth&&(i.minWidth>l.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f<this._proportionallyResizeElements.length;f++){var h=this._proportionallyResizeElements[f];if(!this.borderDif){var e=[h.css("borderTopWidth"),h.css("borderRightWidth"),h.css("borderBottomWidth"),h.css("borderLeftWidth")],j=[h.css("paddingTop"),h.css("paddingRight"),h.css("paddingBottom"),h.css("paddingLeft")];this.borderDif=c.map(e,function(l,n){var m=parseInt(l,10)||0,o=parseInt(j[n],10)||0;return m+o})}if(c.browser.msie&&!(!(c(g).is(":hidden")||c(g).parents(":hidden").length))){continue}h.css({height:(g.height()-this.borderDif[0]-this.borderDif[2])||0,width:(g.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var f=this.element,i=this.options;this.elementOffset=f.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;
+p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*!
* jQuery hashchange event - v1.3 - 7/21/2010
* http://benalman.com/projects/jquery-hashchange-plugin/
*
@@ -55,4 +37,4 @@
* Dual licensed under the MIT and GPL licenses.
* http://benalman.com/about/license/
*/
-(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this); \ No newline at end of file
diff --git a/src/jquery_ui_js.h b/src/jquery_ui_js.h
index f27a5ba..c860682 100644
--- a/src/jquery_ui_js.h
+++ b/src/jquery_ui_js.h
@@ -7,8 +7,7 @@
" *\n"
" * http://docs.jquery.com/UI\n"
" */\n"
-"(function(a,b){function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,\"visibility\")===\"hidden\"||a.expr.filters.hidden(this)}).length}function c(b,c){var e=b.nodeName.toLowerCase();if(\"area\"===e){var f=b.parentNode,g=f.name,h;if(!b.href||!g||f.nodeName.toLowerCase()!==\"map\")return!1;h=a(\"img[usemap=#\"+g+\"]\")[0];return!!h&&d(h)}return(/input|select|textarea|button|object/.test(e)?!b.disabled:\"a\"==e?b.href||c:c)&&d(b)}a.ui=a.ui||{};a.ui.version||(a.extend(a.ui,{version:\"1.8.18\",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b==\"number\"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;a.browser.msie&&/(static|relative)/.test(this.css(\"position\"))||/absolute/.test(this.css(\"position\"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,\"position\",1))&&/(auto|scroll)/.test(a.curCSS(this,\"overflow\",1)+a.curCSS(this,\"overflow-y\",1)+a.curCSS(this,\"overflow-x\",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,\"overflow\",1)+a.curCSS(this,\"overflow-y\",1)+a.curCSS(this,\"overflow-x\",1))}).eq(0);return/fixed/.test(this.css(\"position\"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css(\"zIndex\",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css(\"position\");if(e===\"absolute\"||e===\"relative\"||e===\"fixed\"){f=parseInt(d.css(\"zIndex\"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?\"selectstart\":\"mousedown\")+\".ui-disableSelection\",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(\".ui-disableSelection\")}}),a.each([\"Width\",\"Height\"],function(c,d){function h(b,c,d,f){a.each(e,function(){c-=parseFloat(a.curCSS(b,\"padding\"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,\"border\"+this+\"Width\",!0))||0),f&&(c-=parseFloat(a.curCSS(b,\"margin\"+this,!0))||0)});return c}var e=d===\"Width\"?[\"Left\",\"Right\"]:[\"Top\",\"Bottom\"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn[\"inner\"+d]=function(c){if(c===b)return g[\"inner\"+d].call(this);return this.each(function(){a(this).css(f,h(this,c)+\"px\")})},a.fn[\"outer\"+d]=function(b,c){if(typeof b!=\"number\")return g[\"outer\"+d].call(this,b);return this.each(function(){a(this).css(f,h(this,b,!0,c)+\"px\")})}}),a.extend(a.expr[\":\"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,\"tabindex\")))},tabbable:function(b){var d=a.attr(b,\"tabindex\"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement(\"div\"));c.offsetHeight,a.extend(c.style,{minHeight:\"100px\",height:\"auto\",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart=\"onselectstart\"in c,b.removeChild(c).style.display=\"none\"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!!d&&!!a.element[0].parentNode)for(var e=0;e<d.length;e++)a.options[d[e][0]]&&d[e][1].apply(a.element,c)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(b,c){if(a(b).css(\"overflow\")===\"hidden\")return!1;var d=c&&c===\"left\"?\"scrollLeft\":\"scrollTop\",e=!1;if(b[d]>0)return!0;b[d]=1,e=b[d]>0,b[d]=0;return e},isOverAxis:function(a,b,c){return a>b&&a<b+c},isOver:function(b,c,d,e,f,g){return a.ui.isOverAxis(b,d,f)&&a.ui.isOverAxis(c,e,g)}}))})(jQuery);\n"
-"/*!\n"
+"(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:\"1.8.18\",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e===\"number\"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css(\"position\")))||(/absolute/).test(this.css(\"position\"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,\"position\",1))&&(/(auto|scroll)/).test(a.curCSS(this,\"overflow\",1)+a.curCSS(this,\"overflow-y\",1)+a.curCSS(this,\"overflow-x\",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,\"overflow\",1)+a.curCSS(this,\"overflow-y\",1)+a.curCSS(this,\"overflow-x\",1))}).eq(0)}return(/fixed/).test(this.css(\"position\"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css(\"zIndex\",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css(\"position\");if(e===\"absolute\"||e===\"relative\"||e===\"fixed\"){g=parseInt(f.css(\"zIndex\"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?\"selectstart\":\"mousedown\")+\".ui-disableSelection\",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(\".ui-disableSelection\")}});a.each([\"Width\",\"Height\"],function(g,e){var f=e===\"Width\"?[\"Left\",\"Right\"]:[\"Top\",\"Bottom\"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,\"padding\"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,\"border\"+this+\"Width\",true))||0}if(n){l-=parseFloat(a.curCSS(m,\"margin\"+this,true))||0}});return l}a.fn[\"inner\"+e]=function(i){if(i===d){return k[\"inner\"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+\"px\")})};a.fn[\"outer\"+e]=function(i,l){if(typeof i!==\"number\"){return k[\"outer\"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+\"px\")})}});function c(g,e){var j=g.nodeName.toLowerCase();if(\"area\"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!==\"map\"){return false}f=a(\"img[usemap=#\"+h+\"]\")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:\"a\"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,\"visibility\")===\"hidden\"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[\":\"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,\"tabindex\")))},tabbable:function(g){var e=a.attr(g,\"tabindex\"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement(\"div\"));f.offsetHeight;a.extend(f.style,{minHeight:\"100px\",height:\"auto\",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart=\"onselectstart\" in f;e.removeChild(f).style.display=\"none\"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h<j.length;h++){if(e.options[j[h][0]]){j[h][1].apply(e.element,f)}}}},contains:function(f,e){return document.compareDocumentPosition?f.compareDocumentPosition(e)&16:f!==e&&f.contains(e)},hasScroll:function(h,f){if(a(h).css(\"overflow\")===\"hidden\"){return false}var e=(f&&f===\"left\")?\"scrollLeft\":\"scrollTop\",g=false;if(h[e]>0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*!\n"
" * jQuery UI Widget 1.8.18\n"
" *\n"
" * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n"
@@ -17,8 +16,7 @@
" *\n"
" * http://docs.jquery.com/UI/Widget\n"
" */\n"
-"(function(a,b){if(a.cleanData){var c=a.cleanData;a.cleanData=function(b){for(var d=0,e;(e=b[d])!=null;d++)try{a(e).triggerHandler(\"remove\")}catch(f){}c(b)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){c||(!b||a.filter(b,[this]).length)&&a(\"*\",this).add([this]).each(function(){try{a(this).triggerHandler(\"remove\")}catch(b){}});return d.call(a(this),b,c)})}}a.widget=function(b,c,d){var e=b.split(\".\")[0],f;b=b.split(\".\")[1],f=e+\"-\"+b,d||(d=c,c=a.Widget),a.expr[\":\"][f]=function(c){return!!a.data(c,b)},a[e]=a[e]||{},a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};var g=new c;g.options=a.extend(!0,{},g.options),a[e][b].prototype=a.extend(!0,g,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:f},d),a.widget.bridge(b,a[e][b])},a.widget.bridge=function(c,d){a.fn[c]=function(e){var f=typeof e==\"string\",g=Array.prototype.slice.call(arguments,1),h=this;e=!f&&g.length?a.extend.apply(null,[!0,e].concat(g)):e;if(f&&e.charAt(0)===\"_\")return h;f?this.each(function(){var d=a.data(this,c),f=d&&a.isFunction(d[e])?d[e].apply(d,g):d;if(f!==d&&f!==b){h=f;return!1}}):this.each(function(){var b=a.data(this,c);b?b.option(e||{})._init():a.data(this,c,new d(e,this))});return h}},a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)},a.Widget.prototype={widgetName:\"widget\",widgetEventPrefix:\"\",options:{disabled:!1},_createWidget:function(b,c){a.data(c,this.widgetName,this),this.element=a(c),this.options=a.extend(!0,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind(\"remove.\"+this.widgetName,function(){d.destroy()}),this._create(),this._trigger(\"create\"),this._init()},_getCreateOptions:function(){return a.metadata&&a.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind(\".\"+this.widgetName).removeData(this.widgetName),this.widget().unbind(\".\"+this.widgetName).removeAttr(\"aria-disabled\").removeClass(this.widgetBaseClass+\"-disabled \"+\"ui-state-disabled\")},widget:function(){return this.element},option:function(c,d){var e=c;if(arguments.length===0)return a.extend({},this.options);if(typeof c==\"string\"){if(d===b)return this.options[c];e={},e[c]=d}this._setOptions(e);return this},_setOptions:function(b){var c=this;a.each(b,function(a,b){c._setOption(a,b)});return this},_setOption:function(a,b){this.options[a]=b,a===\"disabled\"&&this.widget()[b?\"addClass\":\"removeClass\"](this.widgetBaseClass+\"-disabled\"+\" \"+\"ui-state-disabled\").attr(\"aria-disabled\",b);return this},enable:function(){return this._setOption(\"disabled\",!1)},disable:function(){return this._setOption(\"disabled\",!0)},_trigger:function(b,c,d){var e,f,g=this.options[b];d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent;if(f)for(e in f)e in c||(c[e]=f[e]);this.element.trigger(c,d);return!(a.isFunction(g)&&g.call(this.element[0],c,d)===!1||c.isDefaultPrevented())}}})(jQuery);\n"
-"/*!\n"
+"(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler(\"remove\")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b(\"*\",this).add([this]).each(function(){try{b(this).triggerHandler(\"remove\")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(\".\")[0],j;f=f.split(\".\")[1];j=g+\"-\"+f;if(!e){e=h;h=b.Widget}b.expr[\":\"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i===\"string\",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)===\"_\"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:\"widget\",widgetEventPrefix:\"\",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind(\"remove.\"+this.widgetName,function(){e.destroy()});this._create();this._trigger(\"create\");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind(\".\"+this.widgetName).removeData(this.widgetName);this.widget().unbind(\".\"+this.widgetName).removeAttr(\"aria-disabled\").removeClass(this.widgetBaseClass+\"-disabled ui-state-disabled\")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f===\"string\"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e===\"disabled\"){this.widget()[f?\"addClass\":\"removeClass\"](this.widgetBaseClass+\"-disabled ui-state-disabled\").attr(\"aria-disabled\",f)}return this},enable:function(){return this._setOption(\"disabled\",false)},disable:function(){return this._setOption(\"disabled\",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*!\n"
" * jQuery UI Mouse 1.8.18\n"
" *\n"
" * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n"
@@ -30,24 +28,8 @@
" * Depends:\n"
" * jquery.ui.widget.js\n"
" */\n"
-"(function(a,b){var c=!1;a(document).mouseup(function(a){c=!1}),a.widget(\"ui.mouse\",{options:{cancel:\":input,option\",distance:1,delay:0},_mouseInit:function(){var b=this;this.element.bind(\"mousedown.\"+this.widgetName,function(a){return b._mouseDown(a)}).bind(\"click.\"+this.widgetName,function(c){if(!0===a.data(c.target,b.widgetName+\".preventClickEvent\")){a.removeData(c.target,b.widgetName+\".preventClickEvent\"),c.stopImmediatePropagation();return!1}}),this.started=!1},_mouseDestroy:function(){this.element.unbind(\".\"+this.widgetName)},_mouseDown:function(b){if(!c){this._mouseStarted&&this._mouseUp(b),this._mouseDownEvent=b;var d=this,e=b.which==1,f=typeof this.options.cancel==\"string\"&&b.target.nodeName?a(b.target).closest(this.options.cancel).length:!1;if(!e||f||!this._mouseCapture(b))return!0;this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){d.mouseDelayMet=!0},this.options.delay));if(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)){this._mouseStarted=this._mouseStart(b)!==!1;if(!this._mouseStarted){b.preventDefault();return!0}}!0===a.data(b.target,this.widgetName+\".preventClickEvent\")&&a.removeData(b.target,this.widgetName+\".preventClickEvent\"),this._mouseMoveDelegate=function(a){return d._mouseMove(a)},this._mouseUpDelegate=function(a){return d._mouseUp(a)},a(document).bind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).bind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate),b.preventDefault(),c=!0;return!0}},_mouseMove:function(b){if(a.browser.msie&&!(document.documentMode>=9)&&!b.button)return this._mouseUp(b);if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b));return!this._mouseStarted},_mouseUp:function(b){a(document).unbind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).unbind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+\".preventClickEvent\",!0),this._mouseStop(b));return!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);\n"
-"/*\n"
-" * jQuery UI Resizable 1.8.18\n"
-" *\n"
-" * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n"
-" * Dual licensed under the MIT or GPL Version 2 licenses.\n"
-" * http://jquery.org/license\n"
-" *\n"
-" * http://docs.jquery.com/UI/Resizables\n"
-" *\n"
-" * Depends:\n"
-" * jquery.ui.core.js\n"
-" * jquery.ui.mouse.js\n"
-" * jquery.ui.widget.js\n"
-" */\n"
-"(function(a,b){a.widget(\"ui.resizable\",a.ui.mouse,{widgetEventPrefix:\"resize\",options:{alsoResize:!1,animate:!1,animateDuration:\"slow\",animateEasing:\"swing\",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:\"e,s,se\",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1e3},_create:function(){var b=this,c=this.options;this.element.addClass(\"ui-resizable\"),a.extend(this,{_aspectRatio:!!c.aspectRatio,aspectRatio:c.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:c.helper||c.ghost||c.animate?c.helper||\"ui-resizable-helper\":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(a('<div class=\"ui-wrapper\" style=\"overflow: hidden;\"></div>').css({position:this.element.css(\"position\"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css(\"top\"),left:this.element.css(\"left\")})),this.element=this.element.parent().data(\"resizable\",this.element.data(\"resizable\")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css(\"marginLeft\"),marginTop:this.originalElement.css(\"marginTop\"),marginRight:this.originalElement.css(\"marginRight\"),marginBottom:this.originalElement.css(\"marginBottom\")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css(\"resize\"),this.originalElement.css(\"resize\",\"none\"),this._proportionallyResizeElements.push(this.originalElement.css({position:\"static\",zoom:1,display:\"block\"})),this.originalElement.css({margin:this.originalElement.css(\"margin\")}),this._proportionallyResize()),this.handles=c.handles||(a(\".ui-resizable-handle\",this.element).length?{n:\".ui-resizable-n\",e:\".ui-resizable-e\",s:\".ui-resizable-s\",w:\".ui-resizable-w\",se:\".ui-resizable-se\",sw:\".ui-resizable-sw\",ne:\".ui-resizable-ne\",nw:\".ui-resizable-nw\"}:\"e,s,se\");if(this.handles.constructor==String){this.handles==\"all\"&&(this.handles=\"n,e,s,w,se,sw,ne,nw\");var d=this.handles.split(\",\");this.handles={};for(var e=0;e<d.length;e++){var f=a.trim(d[e]),g=\"ui-resizable-\"+f,h=a('<div class=\"ui-resizable-handle '+g+'\"></div>');/sw|se|ne|nw/.test(f)&&h.css({zIndex:++c.zIndex}),\"se\"==f&&h.addClass(\"ui-icon ui-icon-gripsmall-diagonal-se\"),this.handles[f]=\".ui-resizable-\"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=[\"padding\",/ne|nw|n/.test(c)?\"Top\":/se|sw|s/.test(c)?\"Bottom\":/^e$/.test(c)?\"Right\":\"Left\"].join(\"\");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(\".ui-resizable-handle\",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:\"se\"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass(\"ui-resizable-autohide\").hover(function(){c.disabled||(a(this).removeClass(\"ui-resizable-autohide\"),b._handles.show())},function(){c.disabled||b.resizing||(a(this).addClass(\"ui-resizable-autohide\"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass(\"ui-resizable ui-resizable-disabled ui-resizable-resizing\").removeData(\"resizable\").unbind(\".resizable\").find(\".ui-resizable-handle\").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css(\"position\"),width:c.outerWidth(),height:c.outerHeight(),top:c.css(\"top\"),left:c.css(\"left\")})).remove()}this.originalElement.css(\"resize\",this.originalResizeStyle),b(this.originalElement);return this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(\".ui-draggable\")||/absolute/.test(f.css(\"position\")))&&f.css({position:\"absolute\",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css(\"left\")),h=c(this.helper.css(\"top\"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio==\"number\"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(\".ui-resizable-\"+this.axis).css(\"cursor\");a(\"body\").css(\"cursor\",i==\"auto\"?this.axis+\"-resize\":i),f.addClass(\"ui-resizable-resizing\"),this._propagate(\"start\",b);return!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);l=this._respectSize(l,b),this._propagate(\"resize\",b),c.css({top:this.position.top+\"px\",left:this.position.left+\"px\",width:this.size.width+\"px\",height:this.size.height+\"px\"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger(\"resize\",b,this.ui());return!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],\"left\")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css(\"left\"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css(\"top\"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}a(\"body\").css(\"cursor\",\"auto\"),this.element.removeClass(\"ui-resizable-resizing\"),this._propagate(\"stop\",b),this._helper&&this.helper.remove();return!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),e<h.maxWidth&&(h.maxWidth=e),g<h.maxHeight&&(h.maxHeight=g);this._vBoundaries=h},_updateCache:function(a){var b=this.options;this.offset=this.helper.offset(),d(a.left)&&(this.position.left=a.left),d(a.top)&&(this.position.top=a.top),d(a.height)&&(this.size.height=a.height),d(a.width)&&(this.size.width=a.width)},_updateRatio:function(a,b){var c=this.options,e=this.position,f=this.size,g=this.axis;d(a.height)?a.width=a.height*this.aspectRatio:d(a.width)&&(a.height=a.width/this.aspectRatio),g==\"sw\"&&(a.left=e.left+(f.width-a.width),a.top=null),g==\"nw\"&&(a.top=e.top+(f.height-a.height),a.left=e.left+(f.width-a.width));return a},_respectSize:function(a,b){var c=this.helper,e=this._vBoundaries,f=this._aspectRatio||b.shiftKey,g=this.axis,h=d(a.width)&&e.maxWidth&&e.maxWidth<a.width,i=d(a.height)&&e.maxHeight&&e.maxHeight<a.height,j=d(a.width)&&e.minWidth&&e.minWidth>a.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null);return a},_proportionallyResize:function(){var b=this.options;if(!!this._proportionallyResizeElements.length){var c=this.helper||this.element;for(var d=0;d<this._proportionallyResizeElements.length;d++){var e=this._proportionallyResizeElements[d];if(!this.borderDif){var f=[e.css(\"borderTopWidth\"),e.css(\"borderRightWidth\"),e.css(\"borderBottomWidth\"),e.css(\"borderLeftWidth\")],g=[e.css(\"paddingTop\"),e.css(\"paddingRight\"),e.css(\"paddingBottom\"),e.css(\"paddingLeft\")];this.borderDif=a.map(f,function(a,b){var c=parseInt(a,10)||0,d=parseInt(g[b],10)||0;return c+d})}if(a.browser.msie&&(!!a(c).is(\":hidden\")||!!a(c).parents(\":hidden\").length))continue;e.css({height:c.height()-this.borderDif[0]-this.borderDif[2]||0,width:c.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var b=this.element,c=this.options;this.elementOffset=b.offset();if(this._helper){this.helper=this.helper||a('<div style=\"overflow:hidden;\"></div>');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:\"absolute\",left:this.elementOffset.left-e+\"px\",top:this.elementOffset.top-e+\"px\",zIndex:++c.zIndex}),this.helper.appendTo(\"body\").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!=\"resize\"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:\"1.8.18\"}),a.ui.plugin.add(\"resizable\",\"alsoResize\",{start:function(b,c){var d=a(this).data(\"resizable\"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data(\"resizable-alsoresize\",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css(\"left\"),10),top:parseInt(b.css(\"top\"),10)})})};typeof e.alsoResize==\"object\"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data(\"resizable\"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data(\"resizable-alsoresize\"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?[\"width\",\"height\"]:[\"width\",\"height\",\"top\",\"left\"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize==\"object\"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData(\"resizable-alsoresize\")}}),a.ui.plugin.add(\"resizable\",\"animate\",{stop:function(b,c){var d=a(this).data(\"resizable\"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],\"left\")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css(\"left\"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css(\"top\"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css(\"width\"),10),height:parseInt(d.element.css(\"height\"),10),top:parseInt(d.element.css(\"top\"),10),left:parseInt(d.element.css(\"left\"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate(\"resize\",b)}})}}),a.ui.plugin.add(\"resizable\",\"containment\",{start:function(b,d){var e=a(this).data(\"resizable\"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!!i){e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a([\"Top\",\"Right\",\"Left\",\"Bottom\"]).each(function(a,b){k[a]=c(j.css(\"padding\"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,\"left\")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}}},resize:function(b,c){var d=a(this).data(\"resizable\"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css(\"position\"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/e.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*e.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css(\"position\"));o&&p\n"
-"&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data(\"resizable\"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css(\"position\"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css(\"position\"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add(\"resizable\",\"ghost\",{start:function(b,c){var d=a(this).data(\"resizable\"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:\"block\",position:\"relative\",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass(\"ui-resizable-ghost\").addClass(typeof e.ghost==\"string\"?e.ghost:\"\"),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data(\"resizable\"),e=d.options;d.ghost&&d.ghost.css({position:\"relative\",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data(\"resizable\"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add(\"resizable\",\"grid\",{resize:function(b,c){var d=a(this).data(\"resizable\"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid==\"number\"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);\n"
-"/*\n"
+"(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget(\"ui.mouse\",{options:{cancel:\":input,option\",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind(\"mousedown.\"+this.widgetName,function(e){return d._mouseDown(e)}).bind(\"click.\"+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+\".preventClickEvent\")){b.removeData(e.target,d.widgetName+\".preventClickEvent\");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind(\".\"+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel==\"string\"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+\".preventClickEvent\")){b.removeData(f.target,this.widgetName+\".preventClickEvent\")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).bind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).unbind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+\".preventClickEvent\",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget(\"ui.resizable\",c.ui.mouse,{widgetEventPrefix:\"resize\",options:{alsoResize:false,animate:false,animateDuration:\"slow\",animateEasing:\"swing\",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:\"e,s,se\",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass(\"ui-resizable\");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||\"ui-resizable-helper\":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('<div class=\"ui-wrapper\" style=\"overflow: hidden;\"></div>').css({position:this.element.css(\"position\"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css(\"top\"),left:this.element.css(\"left\")}));this.element=this.element.parent().data(\"resizable\",this.element.data(\"resizable\"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css(\"marginLeft\"),marginTop:this.originalElement.css(\"marginTop\"),marginRight:this.originalElement.css(\"marginRight\"),marginBottom:this.originalElement.css(\"marginBottom\")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css(\"resize\");this.originalElement.css(\"resize\",\"none\");this._proportionallyResizeElements.push(this.originalElement.css({position:\"static\",zoom:1,display:\"block\"}));this.originalElement.css({margin:this.originalElement.css(\"margin\")});this._proportionallyResize()}this.handles=k.handles||(!c(\".ui-resizable-handle\",this.element).length?\"e,s,se\":{n:\".ui-resizable-n\",e:\".ui-resizable-e\",s:\".ui-resizable-s\",w:\".ui-resizable-w\",se:\".ui-resizable-se\",sw:\".ui-resizable-sw\",ne:\".ui-resizable-ne\",nw:\".ui-resizable-nw\"});if(this.handles.constructor==String){if(this.handles==\"all\"){this.handles=\"n,e,s,w,se,sw,ne,nw\"}var l=this.handles.split(\",\");this.handles={};for(var g=0;g<l.length;g++){var j=c.trim(l[g]),e=\"ui-resizable-\"+j;var h=c('<div class=\"ui-resizable-handle '+e+'\"></div>');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if(\"se\"==j){h.addClass(\"ui-icon ui-icon-gripsmall-diagonal-se\")}this.handles[j]=\".ui-resizable-\"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=[\"padding\",/ne|nw|n/.test(n)?\"Top\":/se|sw|s/.test(n)?\"Bottom\":/^e$/.test(n)?\"Right\":\"Left\"].join(\"\");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(\".ui-resizable-handle\",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:\"se\"}});if(k.autoHide){this._handles.hide();c(this.element).addClass(\"ui-resizable-autohide\").hover(function(){if(k.disabled){return}c(this).removeClass(\"ui-resizable-autohide\");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass(\"ui-resizable-autohide\");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass(\"ui-resizable ui-resizable-disabled ui-resizable-resizing\").removeData(\"resizable\").unbind(\".resizable\").find(\".ui-resizable-handle\").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css(\"position\"),width:f.outerWidth(),height:f.outerHeight(),top:f.css(\"top\"),left:f.css(\"left\")})).remove()}this.originalElement.css(\"resize\",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(\".ui-draggable\")||(/absolute/).test(e.css(\"position\"))){e.css({position:\"absolute\",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css(\"left\")),h=b(this.helper.css(\"top\"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio==\"number\")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(\".ui-resizable-\"+this.axis).css(\"cursor\");c(\"body\").css(\"cursor\",i==\"auto\"?this.axis+\"-resize\":i);e.addClass(\"ui-resizable-resizing\");this._propagate(\"start\",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate(\"resize\",e);h.css({top:this.position.top+\"px\",left:this.position.left+\"px\",width:this.size.width+\"px\",height:this.size.height+\"px\"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger(\"resize\",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],\"left\")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css(\"left\"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css(\"top\"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c(\"body\").css(\"cursor\",\"auto\");this.element.removeClass(\"ui-resizable-resizing\");this._propagate(\"stop\",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(h<e.maxWidth){e.maxWidth=h}if(k<e.maxHeight){e.maxHeight=k}}this._vBoundaries=e},_updateCache:function(e){var f=this.options;this.offset=this.helper.offset();if(a(e.left)){this.position.left=e.left}if(a(e.top)){this.position.top=e.top}if(a(e.height)){this.size.height=e.height}if(a(e.width)){this.size.width=e.width}},_updateRatio:function(h,g){var i=this.options,j=this.position,f=this.size,e=this.axis;if(a(h.height)){h.width=(h.height*this.aspectRatio)}else{if(a(h.width)){h.height=(h.width/this.aspectRatio)}}if(e==\"sw\"){h.left=j.left+(f.width-h.width);h.top=null}if(e==\"nw\"){h.top=j.top+(f.height-h.height);h.left=j.left+(f.width-h.width)}return h},_respectSize:function(l,g){var j=this.helper,i=this._vBoundaries,r=this._aspectRatio||g.shiftKey,q=this.axis,t=a(l.width)&&i.maxWidth&&(i.maxWidth<l.width),m=a(l.height)&&i.maxHeight&&(i.maxHeight<l.height),h=a(l.width)&&i.minWidth&&(i.minWidth>l.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f<this._proportionallyResizeElements.length;f++){var h=this._proportionallyResizeElements[f];if(!this.borderDif){var e=[h.css(\"borderTopWidth\"),h.css(\"borderRightWidth\"),h.css(\"borderBottomWidth\"),h.css(\"borderLeftWidth\")],j=[h.css(\"paddingTop\"),h.css(\"paddingRight\"),h.css(\"paddingBottom\"),h.css(\"paddingLeft\")];this.borderDif=c.map(e,function(l,n){var m=parseInt(l,10)||0,o=parseInt(j[n],10)||0;return m+o})}if(c.browser.msie&&!(!(c(g).is(\":hidden\")||c(g).parents(\":hidden\").length))){continue}h.css({height:(g.height()-this.borderDif[0]-this.borderDif[2])||0,width:(g.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var f=this.element,i=this.options;this.elementOffset=f.offset();if(this._helper){this.helper=this.helper||c('<div style=\"overflow:hidden;\"></div>');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:\"absolute\",left:this.elementOffset.left-g+\"px\",top:this.elementOffset.top-g+\"px\",zIndex:++i.zIndex});this.helper.appendTo(\"body\").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!=\"resize\"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:\"1.8.18\"});c.ui.plugin.add(\"resizable\",\"alsoResize\",{start:function(f,g){var e=c(this).data(\"resizable\"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data(\"resizable-alsoresize\",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css(\"left\"),10),top:parseInt(k.css(\"top\"),10)})})};if(typeof(i.alsoResize)==\"object\"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data(\"resizable\"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data(\"resizable-alsoresize\"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?[\"width\",\"height\"]:[\"width\",\"height\",\"top\",\"left\"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)==\"object\"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData(\"resizable-alsoresize\")}});c.ui.plugin.add(\"resizable\",\"animate\",{stop:function(i,n){var p=c(this).data(\"resizable\"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],\"left\")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css(\"left\"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css(\"top\"),10)+(p.position.top-p.originalPosition.top))||null;\n"
+"p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css(\"width\"),10),height:parseInt(p.element.css(\"height\"),10),top:parseInt(p.element.css(\"top\"),10),left:parseInt(p.element.css(\"left\"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate(\"resize\",i)}})}});c.ui.plugin.add(\"resizable\",\"containment\",{start:function(f,r){var t=c(this).data(\"resizable\"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c([\"Top\",\"Right\",\"Left\",\"Bottom\"]).each(function(p,o){i[p]=b(n.css(\"padding\"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,\"left\")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data(\"resizable\"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css(\"position\"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css(\"position\"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data(\"resizable\"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css(\"position\"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css(\"position\"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add(\"resizable\",\"ghost\",{start:function(g,h){var e=c(this).data(\"resizable\"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:\"block\",position:\"relative\",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass(\"ui-resizable-ghost\").addClass(typeof i.ghost==\"string\"?i.ghost:\"\");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data(\"resizable\"),h=e.options;if(e.ghost){e.ghost.css({position:\"relative\",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data(\"resizable\"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add(\"resizable\",\"grid\",{resize:function(e,m){var p=c(this).data(\"resizable\"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid==\"number\"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*!\n"
" * jQuery hashchange event - v1.3 - 7/21/2010\n"
" * http://benalman.com/projects/jquery-hashchange-plugin/\n"
" * \n"
diff --git a/src/language.cpp b/src/language.cpp
index d7a95ca..1037d7f 100644
--- a/src/language.cpp
+++ b/src/language.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -127,6 +127,9 @@
#ifdef LANG_LT
#include "translator_lt.h"
#endif
+#ifdef LANG_LV
+#include "translator_lv.h"
+#endif
#ifdef LANG_ZA
#include "translator_za.h"
#endif
@@ -150,7 +153,7 @@
#endif
#endif // !ENGLISH_ONLY
-#define L_EQUAL(a) !stricmp(langName,a)
+#define L_EQUAL(a) !qstricmp(langName,a)
Translator *theTranslator=0;
@@ -336,7 +339,7 @@ bool setTranslator(const char *langName)
#ifdef LANG_UA
else if (L_EQUAL("ukrainian"))
{
- theTranslator=new TranslatorDecoder(new TranslatorUkrainian);
+ theTranslator=new TranslatorUkrainian;
}
#endif
#ifdef LANG_GR
@@ -369,6 +372,12 @@ bool setTranslator(const char *langName)
theTranslator=new TranslatorDecoder(new TranslatorLithuanian);
}
#endif
+#ifdef LANG_LV
+ else if (L_EQUAL("latvian"))
+ {
+ theTranslator=new TranslatorDecoder(new TranslatorLatvian);
+ }
+#endif
#ifdef LANG_ZA
else if (L_EQUAL("afrikaans"))
{
@@ -378,7 +387,7 @@ bool setTranslator(const char *langName)
#ifdef LANG_AR
else if (L_EQUAL("arabic"))
{
- theTranslator=new TranslatorDecoder(new TranslatorArabic);
+ theTranslator=new TranslatorArabic;
}
#endif
#ifdef LANG_FA
@@ -419,6 +428,6 @@ bool setTranslator(const char *langName)
}
QCString msg = theTranslator->updateNeededMessage();
- if (!msg.isEmpty()) err(msg);
+ if (!msg.isEmpty()) warn_uncond(msg);
return TRUE;
}
diff --git a/src/language.h b/src/language.h
index 17f5800..9550cb9 100644
--- a/src/language.h
+++ b/src/language.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
index f3610a3..0a96530 100644
--- a/src/latexdocvisitor.cpp
+++ b/src/latexdocvisitor.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -15,6 +15,7 @@
* input used in their production; they are not affected by this license.
*
*/
+#include "htmlattrib.h"
#include <qfileinfo.h>
#include "latexdocvisitor.h"
#include "docparser.h"
@@ -26,7 +27,6 @@
#include "message.h"
#include "parserintf.h"
#include "msc.h"
-#include "htmlattrib.h"
#include "cite.h"
#include "filedef.h"
#include "config.h"
@@ -257,7 +257,7 @@ void LatexDocVisitor::visit(DocSymbol *s)
case DocSymbol::LeftFloor: m_t << "{$\\lfloor$}"; break;
case DocSymbol::RightFloor: m_t << "{$\\rfloor$}"; break;
default:
- err("error: unknown symbol found\n");
+ err("unknown symbol found\n");
}
}
@@ -358,7 +358,8 @@ void LatexDocVisitor::visit(DocVerbatim *s)
case DocVerbatim::HtmlOnly:
case DocVerbatim::XmlOnly:
case DocVerbatim::ManOnly:
- case DocVerbatim::RtfOnly:
+ case DocVerbatim::RtfOnly:
+ case DocVerbatim::DocbookOnly:
/* nothing */
break;
case DocVerbatim::LatexOnly:
@@ -423,10 +424,10 @@ void LatexDocVisitor::visit(DocVerbatim *s)
void LatexDocVisitor::visit(DocAnchor *anc)
{
if (m_hide) return;
- m_t << "\\label{" << anc->file() << "_" << anc->anchor() << "}%" << endl;
+ m_t << "\\label{" << stripPath(anc->file()) << "_" << anc->anchor() << "}%" << endl;
if (!anc->file().isEmpty() && Config_getBool("PDF_HYPERLINKS"))
{
- m_t << "\\hypertarget{" << anc->file() << "_" << anc->anchor()
+ m_t << "\\hypertarget{" << stripPath(anc->file()) << "_" << anc->anchor()
<< "}{}%" << endl;
}
}
@@ -797,11 +798,11 @@ void LatexDocVisitor::visitPre(DocSection *s)
if (m_hide) return;
if (Config_getBool("PDF_HYPERLINKS"))
{
- m_t << "\\hypertarget{" << s->file() << "_" << s->anchor() << "}{}";
+ m_t << "\\hypertarget{" << stripPath(s->file()) << "_" << s->anchor() << "}{}";
}
m_t << "\\" << getSectionName(s->level()) << "{";
filter(convertCharEntitiesToUTF8(s->title().data()));
- m_t << "}\\label{" << s->file() << "_" << s->anchor() << "}" << endl;
+ m_t << "}\\label{" << stripPath(s->file()) << "_" << s->anchor() << "}" << endl;
}
void LatexDocVisitor::visitPost(DocSection *)
@@ -1665,7 +1666,16 @@ void LatexDocVisitor::startDotFile(const QCString &fileName,
{
m_t << "[width=\\textwidth,height=\\textheight/2,keepaspectratio=true]";
}
- m_t << "{" << baseName << "}";
+ m_t << "{" << baseName;
+ //if (Config_getBool("USE_PDFLATEX"))
+ //{
+ // m_t << ".pdf";
+ //}
+ //else
+ //{
+ // m_t << ".eps";
+ //}
+ m_t << "}";
if (hasCaption)
{
@@ -1729,7 +1739,16 @@ void LatexDocVisitor::startMscFile(const QCString &fileName,
{
m_t << "[width=\\textwidth,height=\\textheight/2,keepaspectratio=true]";
}
- m_t << "{" << baseName << "}";
+ m_t << "{" << baseName;
+ //if (Config_getBool("USE_PDFLATEX"))
+ //{
+ // m_t << ".pdf";
+ //}
+ //else
+ //{
+ // m_t << ".eps";
+ //}
+ m_t << "}";
if (hasCaption)
{
diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h
index 4745800..3fea33c 100644
--- a/src/latexdocvisitor.h
+++ b/src/latexdocvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 8a7555d..1434dca 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -37,6 +37,10 @@
#include "namespacedef.h"
#include "filename.h"
+static const char doxygenLatexStyle[] =
+#include "doxygen_sty.h"
+;
+
//static QCString filterTitle(const char *s)
//{
// QCString tmp=s,result;
@@ -128,7 +132,9 @@ static void writeLatexMakefile()
<< "\t echo \"Rerunning latex....\" ;\\" << endl
<< "\t " << latex_command << " refman.tex ;\\" << endl
<< "\t latex_count=`expr $$latex_count - 1` ;\\" << endl
- << "\t done" << endl << endl
+ << "\t done" << endl
+ << "\t" << mkidx_command << " refman.idx" << endl
+ << "\t" << latex_command << " refman.tex" << endl << endl
<< "refman_2on1.ps: refman.ps" << endl
<< "\tpsnup -2 refman.ps >refman_2on1.ps" << endl
<< endl
@@ -154,7 +160,9 @@ static void writeLatexMakefile()
<< "\t echo \"Rerunning latex....\" ;\\" << endl
<< "\t pdflatex refman ;\\" << endl
<< "\t latex_count=`expr $$latex_count - 1` ;\\" << endl
- << "\t done" << endl << endl;
+ << "\t done" << endl
+ << "\t" << mkidx_command << " refman.idx" << endl
+ << "\tpdflatex refman" << endl << endl;
}
t << endl
@@ -204,6 +212,8 @@ static void writeMakeBat()
t << "goto :repeat\n";
t << ":skip\n";
t << "endlocal\n";
+ t << mkidx_command << " refman.idx\n";
+ t << latex_command << " refman.tex\n";
t << "dvips -o refman.ps refman.dvi\n";
t << "gswin32c -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "
"-sOutputFile=refman.pdf -c save pop -f refman.ps\n";
@@ -234,6 +244,8 @@ static void writeMakeBat()
t << "goto :repeat\n";
t << ":skip\n";
t << "endlocal\n";
+ t << mkidx_command << " refman.idx\n";
+ t << "pdflatex refman\n";
}
#endif
}
@@ -259,699 +271,263 @@ static void writeDefaultHeaderPart1(FTextStream &t)
{
// part 1
+ // Handle batch mode
+ if (Config_getBool("LATEX_BATCHMODE"))
+ t << "\\batchmode\n";
+
+ // Set document class depending on configuration
+ QCString documentClass;
+ if (Config_getBool("COMPACT_LATEX"))
+ documentClass = "article";
+ else
+ documentClass = "book";
+ t << "\\documentclass[twoside]{" << documentClass << "}\n"
+ "\n";
+
+ // Load required packages
+ t << "% Packages required by doxygen\n"
+ "\\usepackage{calc}\n"
+ "\\usepackage{doxygen}\n"
+ "\\usepackage{graphicx}\n"
+ "\\usepackage[utf8]{inputenc}\n"
+ "\\usepackage{makeidx}\n"
+ "\\usepackage{multicol}\n"
+ "\\usepackage{multirow}\n"
+ "\\usepackage{textcomp}\n"
+ "\\usepackage[table]{xcolor}\n"
+ "\n";
+
+ // Language support
+ QCString languageSupport = theTranslator->latexLanguageSupportCommand();
+ if (!languageSupport.isEmpty())
+ {
+ t << "% NLS support packages\n"
+ << languageSupport
+ << "\n";
+ }
+
+ // Define default fonts
+ t << "% Font selection\n"
+ "\\usepackage[T1]{fontenc}\n"
+ "\\usepackage{mathptmx}\n"
+ "\\usepackage[scaled=.90]{helvet}\n"
+ "\\usepackage{courier}\n"
+ "\\usepackage{amssymb}\n"
+ "\\usepackage{sectsty}\n"
+ "\\renewcommand{\\familydefault}{\\sfdefault}\n"
+ "\\allsectionsfont{%\n"
+ " \\fontseries{bc}\\selectfont%\n"
+ " \\color{darkgray}%\n"
+ "}\n"
+ "\\renewcommand{\\DoxyLabelFont}{%\n"
+ " \\fontseries{bc}\\selectfont%\n"
+ " \\color{darkgray}%\n"
+ "}\n"
+ "\n";
+
+ // Define page & text layout
QCString paperName;
- if (Config_getBool("LATEX_BATCHMODE")) t << "\\batchmode" << endl;
QCString &paperType=Config_getEnum("PAPER_TYPE");
- if (paperType=="a4wide")
- paperName="a4";
- else
+ // "a4wide" package is obsolete (see bug 563698)
+ if (paperType=="a4wide")
+ paperName="a4";
+ else
paperName=paperType;
- t << "\\documentclass";
- //"[" << paperName << "paper";
- //t << "]";
- t << "{";
- if (Config_getBool("COMPACT_LATEX")) t << "article"; else t << "book";
- t << "}\n";
- // the next package is obsolete (see bug 563698)
- //if (paperType=="a4wide") t << "\\usepackage{a4wide}\n";
- t <<
- "\\usepackage["<<paperName<<"paper,top=2.5cm,bottom=2.5cm,left=2.5cm,right=2.5cm]{geometry}\n"
- "\\usepackage{makeidx}\n"
- "\\usepackage{natbib}\n"
- "\\usepackage{graphicx}\n"
- "\\usepackage{multicol}\n"
- "\\usepackage{float}\n"
- "\\usepackage{listings}\n"
- "\\usepackage{color}\n"
- "\\usepackage{ifthen}\n"
- "\\usepackage[table]{xcolor}\n"
- "\\usepackage{textcomp}\n"
- "\\usepackage{alltt}\n"
- //"\\usepackage{ae,aecompl,aeguill}\n"
- ;
- //if (Config_getBool("USE_PDFLATEX"))
- //{
- // t << "\\usepackage{times}" << endl;
- //}
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- t << "\\usepackage{ifpdf}" << endl
- << "\\ifpdf" << endl
- << "\\usepackage[pdftex," << endl
- << " pagebackref=true," << endl
- << " colorlinks=true," << endl
- << " linkcolor=blue," << endl
- << " unicode" << endl
- << " ]{hyperref}" << endl
- << "\\else" << endl
- << "\\usepackage[ps2pdf," << endl
- << " pagebackref=true," << endl
- << " colorlinks=true," << endl
- << " linkcolor=blue," << endl
- << " unicode" << endl
- << " ]{hyperref}" << endl
- << "\\usepackage{pspicture}" << endl
- << "\\fi" << endl;
- }
- // Try to get the command for switching on the language
- // support
- t << "\\usepackage[utf8]{inputenc}" << endl;
- QCString sLanguageSupportCommand(
- theTranslator->latexLanguageSupportCommand());
-
- if (!sLanguageSupportCommand.isEmpty())
- {
- // The command is not empty. Put it to the output.
- // if the command is empty, no output is needed.
- t << sLanguageSupportCommand << endl;
- }
- t << "\\usepackage{mathptmx}\n";
- t << "\\usepackage[scaled=.90]{helvet}\n";
- t << "\\usepackage{courier}\n";
- t << "\\usepackage{sectsty}\n";
- t << "\\usepackage{amssymb}\n";
- t << "\\usepackage[titles]{tocloft}\n";
- t << "\\usepackage{doxygen}\n";
-
- // define option for listings
- t << "\\lstset{language=C++,"
- "inputencoding=utf8,"
- "basicstyle=\\footnotesize,"
- "breaklines=true,"
- "breakatwhitespace=true,"
- "tabsize=" << Config_getInt("TAB_SIZE") <<","
- "numbers=left }" << endl;
-
+ t << "% Page & text layout\n"
+ "\\usepackage{geometry}\n"
+ "\\geometry{%\n"
+ " " << paperName << "paper,%\n"
+ " top=2.5cm,%\n"
+ " bottom=2.5cm,%\n"
+ " left=2.5cm,%\n"
+ " right=2.5cm%\n"
+ "}\n";
+ // \sloppy is obsolete (see bug 563698)
+ // Allow a bit of overflow to go unnoticed by other means
+ t << "\\tolerance=750\n"
+ "\\hfuzz=15pt\n"
+ "\\hbadness=750\n"
+ "\\setlength{\\emergencystretch}{15pt}\n"
+ "\\setlength{\\parindent}{0cm}\n"
+ "\\setlength{\\parskip}{0.2cm}\n";
+ // Redefine paragraph/subparagraph environments, using sectsty fonts
+ t << "\\makeatletter\n"
+ "\\renewcommand{\\paragraph}{%\n"
+ " \\@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{%\n"
+ " \\normalfont\\normalsize\\bfseries\\SS@parafont%\n"
+ " }%\n"
+ "}\n"
+ "\\renewcommand{\\subparagraph}{%\n"
+ " \\@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{%\n"
+ " \\normalfont\\normalsize\\bfseries\\SS@subparafont%\n"
+ " }%\n"
+ "}\n"
+ "\\makeatother\n"
+ "\n";
+
+ // Headers & footers
+ QCString genString =
+ theTranslator->trGeneratedAt(dateToString(TRUE),Config_getString("PROJECT_NAME"));
+ t << "% Headers & footers\n"
+ "\\usepackage{fancyhdr}\n"
+ "\\pagestyle{fancyplain}\n"
+ "\\fancyhead[LE]{\\fancyplain{}{\\bfseries\\thepage}}\n"
+ "\\fancyhead[CE]{\\fancyplain{}{}}\n"
+ "\\fancyhead[RE]{\\fancyplain{}{\\bfseries\\leftmark}}\n"
+ "\\fancyhead[LO]{\\fancyplain{}{\\bfseries\\rightmark}}\n"
+ "\\fancyhead[CO]{\\fancyplain{}{}}\n"
+ "\\fancyhead[RO]{\\fancyplain{}{\\bfseries\\thepage}}\n"
+ "\\fancyfoot[LE]{\\fancyplain{}{}}\n"
+ "\\fancyfoot[CE]{\\fancyplain{}{}}\n"
+ "\\fancyfoot[RE]{\\fancyplain{}{\\bfseries\\scriptsize " << genString << " Doxygen }}\n"
+ "\\fancyfoot[LO]{\\fancyplain{}{\\bfseries\\scriptsize " << genString << " Doxygen }}\n"
+ "\\fancyfoot[CO]{\\fancyplain{}{}}\n"
+ "\\fancyfoot[RO]{\\fancyplain{}{}}\n"
+ "\\renewcommand{\\footrulewidth}{0.4pt}\n";
+ if (!Config_getBool("COMPACT_LATEX"))
+ {
+ t << "\\renewcommand{\\chaptermark}[1]{%\n"
+ " \\markboth{#1}{}%\n"
+ "}\n";
+ }
+ t << "\\renewcommand{\\sectionmark}[1]{%\n"
+ " \\markright{\\thesection\\ #1}%\n"
+ "}\n"
+ "\n";
+
+ // ToC, LoF, LoT, bibliography, and index
+ t << "% Indices & bibliography\n"
+ "\\usepackage{natbib}\n"
+ "\\usepackage[titles]{tocloft}\n"
+ "\\setcounter{tocdepth}{3}\n"
+ "\\setcounter{secnumdepth}{5}\n"
+ "\\makeindex\n"
+ "\n";
+
+ // User-specified packages
QStrList &extraPackages = Config_getList("EXTRA_PACKAGES");
- const char *s=extraPackages.first();
- while (s)
- {
- t << "\\usepackage{" << s << "}\n";
- s=extraPackages.next();
- }
- t << "\\makeindex\n"
- "\\setcounter{tocdepth}{3}\n"
- "\\renewcommand{\\footrulewidth}{0.4pt}\n"
- "\\renewcommand{\\familydefault}{\\sfdefault}\n"
- "\\hfuzz=15pt\n" // allow a bit of overflow to go unnoticed
- "\\setlength{\\emergencystretch}{15pt}\n"
- "\\hbadness=750\n"
- "\\tolerance=750\n"
- "\\begin{document}\n";
- static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
- static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+ if (!extraPackages.isEmpty()) {
+ t << "% Packages requested by user\n";
+ const char *pkgName=extraPackages.first();
+ while (pkgName)
+ {
+ t << "\\usepackage{" << pkgName << "}\n";
+ pkgName=extraPackages.next();
+ }
+ t << "\n";
+ }
+
+ // Hyperlinks
+ bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+ if (pdfHyperlinks)
+ {
+ t << "% Hyperlinks (required, but should be loaded last)\n"
+ "\\usepackage{ifpdf}\n"
+ "\\ifpdf\n"
+ " \\usepackage[pdftex,pagebackref=true]{hyperref}\n"
+ "\\else\n"
+ " \\usepackage[ps2pdf,pagebackref=true]{hyperref}\n"
+ "\\fi\n"
+ "\\hypersetup{%\n"
+ " colorlinks=true,%\n"
+ " linkcolor=blue,%\n"
+ " citecolor=blue,%\n"
+ " unicode%\n"
+ "}\n"
+ "\n";
+ }
+
+ // Custom commands used by the header
+ t << "% Custom commands\n"
+ "\\newcommand{\\clearemptydoublepage}{%\n"
+ " \\newpage{\\pagestyle{empty}\\cleardoublepage}%\n"
+ "}\n"
+ "\n"
+ "\n";
+
+ // End of preamble, now comes the document contents
+ t << "%===== C O N T E N T S =====\n"
+ "\n"
+ "\\begin{document}\n";
+ if (theTranslator->idLanguage()=="greek")
+ t << "\\selectlanguage{greek}\n";
+ t << "\n";
+
+ // Front matter
+ t << "% Titlepage & ToC\n";
+ bool usePDFLatex = Config_getBool("USE_PDFLATEX");
if (pdfHyperlinks && usePDFLatex)
{
- // to avoid duplicate page anchors due to reuse of same numbers for
+ // To avoid duplicate page anchors due to reuse of same numbers for
// the index (be it as roman numbers)
- t << "\\hypersetup{pageanchor=false,citecolor=blue}" << endl;
+ t << "\\hypersetup{pageanchor=false}\n";
}
- if (theTranslator->idLanguage()=="greek") t << "\\selectlanguage{greek}\n";
- t << "\\begin{titlepage}\n"
- "\\vspace*{7cm}\n"
- "\\begin{center}\n"
- "{\\Large ";
-
+ t << "\\pagenumbering{roman}\n"
+ "\\begin{titlepage}\n"
+ "\\vspace*{7cm}\n"
+ "\\begin{center}%\n"
+ "{\\Large ";
}
static void writeDefaultHeaderPart2(FTextStream &t)
{
// part 2
- t << "}\\\\" << endl
- << "\\vspace*{1cm}" << endl
- << "{\\large ";
+ // Finalize project name
+ t << "}\\\\\n"
+ "\\vspace*{1cm}\n"
+ "{\\large ";
}
static void writeDefaultHeaderPart3(FTextStream &t)
{
// part 3
- t << " Doxygen " << versionString << "}\\\\" << endl
- << "\\vspace*{0.5cm}" << endl
- << "{\\small " << dateToString(TRUE) << "}\\\\" << endl
- << "\\end{center}" << endl
- << "\\end{titlepage}" << endl;
- if (!Config_getBool("COMPACT_LATEX")) t << "\\clearemptydoublepage\n";
- t << "\\pagenumbering{roman}\n";
+ // Finalize project number
+ t << " Doxygen " << versionString << "}\\\\\n"
+ "\\vspace*{0.5cm}\n"
+ "{\\small " << dateToString(TRUE) << "}\\\\\n"
+ "\\end{center}\n"
+ "\\end{titlepage}\n";
+ bool compactLatex = Config_getBool("COMPACT_LATEX");
+ if (!compactLatex)
+ t << "\\clearemptydoublepage\n";
+
+ // ToC
t << "\\tableofcontents\n";
- if (!Config_getBool("COMPACT_LATEX")) t << "\\clearemptydoublepage\n";
+ if (!compactLatex)
+ t << "\\clearemptydoublepage\n";
t << "\\pagenumbering{arabic}\n";
- static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
- static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+ bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+ bool usePDFLatex = Config_getBool("USE_PDFLATEX");
if (pdfHyperlinks && usePDFLatex)
{
- t << "\\hypersetup{pageanchor=true,citecolor=blue}" << endl;
+ // re-enable anchors again
+ t << "\\hypersetup{pageanchor=true}\n";
}
+ t << "\n"
+ "%--- Begin generated contents ---\n";
}
-static void writeDefaultStyleSheetPart1(FTextStream &t)
+static void writeDefaultStyleSheet(FTextStream &t)
{
- // part 1
- t << "\\NeedsTeXFormat{LaTeX2e}\n"
- "\\ProvidesPackage{doxygen}\n\n";
- t << "% Packages used by this style file\n"
- "\\RequirePackage{alltt}\n"
- "\\RequirePackage{array}\n"
- "\\RequirePackage{calc}\n"
- "\\RequirePackage{color}\n"
- "\\RequirePackage{fancyhdr}\n"
- "\\RequirePackage{longtable}\n"
- "\\RequirePackage{verbatim}\n"
- "\\RequirePackage{ifthen}\n"
- "\\RequirePackage{xtab}\n"
- "\\RequirePackage{multirow}\n"
- "\\RequirePackage[table]{xcolor}\n\n";
-
- t << "% Use helvetica font instead of times roman\n"
- "\\RequirePackage{helvet}\n"
- "\\RequirePackage{sectsty}\n"
- "\\RequirePackage{tocloft}\n"
-// "\\allsectionsfont{\\usefont{OT1}{phv}{bc}{n}\\selectfont}\n"
-// "\\providecommand{\\cftchapfont}{%\n"
-// " \\fontsize{11}{13}\\usefont{OT1}{phv}{bc}{n}\\selectfont\n"
-// "}\n"
-// "\\providecommand{\\cftchappagefont}{%\n"
-// " \\fontsize{11}{13}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-// "}\n"
-// "\\providecommand{\\cftsecfont}{%\n"
-// " \\fontsize{10}{12}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-// "}\n"
-// "\\providecommand{\\cftsecpagefont}{%\n"
-// " \\fontsize{10}{12}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-// "}\n"
-// "\\providecommand{\\cftsubsecfont}{%\n"
-// " \\fontsize{10}{12}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-// "}\n"
-// "\\providecommand{\\cftsubsecpagefont}{%\n"
-// " \\fontsize{10}{12}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-// "}\n"
-// "\\providecommand{\\cftsubsubsecfont}{%\n"
-// " \\fontsize{9}{11}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-// "}\n"
-// "\\providecommand{\\cftsubsubsecpagefont}{%\n"
-// " \\fontsize{9}{11}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-// "}\n"
-// "\\providecommand{\\cftparafont}{%\n"
-// " \\fontsize{9}{11}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-// "}\n"
-// "\\providecommand{\\cftparapagefont}{%\n"
-// " \\fontsize{9}{11}\\usefont{OT1}{phv}{c}{n}\\selectfont\n"
-// "}\n"
-// "\\providecommand{\\cfttoctitlefont}{%\n"
-// " \\fontsize{20}{22}\\usefont{OT1}{phv}{b}{n}\\selectfont\n"
-// "}\n"
- "\\providecommand{\\rmdefault}{phv}\n"
- "\\providecommand{\\bfdefault}{bc}\n"
- "\n\n";
-
- t << "% Setup fancy headings\n"
- "\\pagestyle{fancyplain}\n"
- "\\newcommand{\\clearemptydoublepage}{%\n"
- " \\newpage{\\pagestyle{empty}\\cleardoublepage}%\n"
- "}\n";
- if (!Config_getBool("COMPACT_LATEX"))
- t << "\\renewcommand{\\chaptermark}[1]{%\n"
- " \\markboth{#1}{}%\n"
- "}\n";
- t << "\\renewcommand{\\sectionmark}[1]{%\n"
- " \\markright{\\thesection\\ #1}%\n"
- "}\n";
-
- //t << "\\lhead[\\fancyplain{}{\\bfseries\\thepage}]{%\n"
- // " \\fancyplain{}{\\bfseries\\rightmark}%\n"
- // "}\n";
- //t << "\\rhead[\\fancyplain{}{\\bfseries\\leftmark}]{%\n"
- // " \\fancyplain{}{\\bfseries\\thepage}%\n"
- // "}\n";
- //t << "\\rfoot[\\fancyplain{}{\\bfseries\\scriptsize%\n ";
- t << "\\fancyhead[LE]{\\fancyplain{}{\\bfseries\\thepage}}\n";
- t << "\\fancyhead[CE]{\\fancyplain{}{}}\n";
- t << "\\fancyhead[RE]{\\fancyplain{}{\\bfseries\\leftmark}}\n";
- t << "\\fancyhead[LO]{\\fancyplain{}{\\bfseries\\rightmark}}\n";
- t << "\\fancyhead[CO]{\\fancyplain{}{}}\n";
- t << "\\fancyhead[RO]{\\fancyplain{}{\\bfseries\\thepage}}\n";
-
- t << "\\fancyfoot[LE]{\\fancyplain{}{}}\n";
- t << "\\fancyfoot[CE]{\\fancyplain{}{}}\n";
- t << "\\fancyfoot[RE]{\\fancyplain{}{\\bfseries\\scriptsize ";
-}
-
-static void writeDefaultStyleSheetPart2(FTextStream &t)
-{
- t << "}}\n";
- t << "\\fancyfoot[LO]{\\fancyplain{}{\\bfseries\\scriptsize ";
- //t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize%\n ";
-
-}
-
-static void writeDefaultStyleSheetPart3(FTextStream &t)
-{
- //static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE");
- t << "}}\n";
- //t << "\\cfoot{}\n\n";
- t << "\\fancyfoot[CO]{\\fancyplain{}{}}\n";
- t << "\\fancyfoot[RO]{\\fancyplain{}{}}\n";
-
- t << "%---------- Internal commands used in this style file ----------------\n\n";
-
- t << "\\newcommand\\tabfill[1]{%\n";
- t << " \\dimen@\\linewidth%\n";
- t << " \\advance\\dimen@\\@totalleftmargin%\n";
- t << " \\advance\\dimen@-\\dimen\\@curtab%\n";
- t << " \\parbox[t]\\dimen@{\\raggedright #1\\ifhmode\\strut\\fi}%\n";
- t << "}\n\n";
-
- t << "\\newcommand{\\ensurespace}[1]{%\n";
- t << " \\begingroup\n";
- t << " \\setlength{\\dimen@}{#1}%\n";
- t << " \\vskip\\z@\\@plus\\dimen@\n";
- t << " \\penalty -100\\vskip\\z@\\@plus -\\dimen@\n";
- t << " \\vskip\\dimen@\n";
- t << " \\penalty 9999%\n";
- t << " \\vskip -\\dimen@\n";
- t << " \\vskip\\z@skip % hide the previous |\\vskip| from |\\addvspace|\n";
- t << " \\endgroup\n";
- t << "}\n\n";
-
- t << "% Generic environment used by all paragraph-based environments defined\n"
- "% below. Note that the command \\title{...} needs to be defined inside\n"
- "% those environments!\n"
- "\\newenvironment{DoxyDesc}[1]{%\n"
- //" \\filbreak%\n"
- " \\ensurespace{4\\baselineskip}%\n"
- " \\begin{list}{}%\n"
- " {%\n"
- " \\settowidth{\\labelwidth}{40pt}%\n"
- " \\setlength{\\leftmargin}{\\labelwidth}%\n"
- " \\setlength{\\parsep}{0pt}%\n"
- " \\setlength{\\itemsep}{-4pt}%\n"
- " \\renewcommand{\\makelabel}{\\entrylabel}%\n"
- " }%\n"
- " \\item[#1]%\n"
- "}{%\n"
- " \\end{list}%\n"
- "}\n\n";
- t << "%---------- Commands used by doxygen LaTeX output generator ----------\n\n";
- t << "% Used by <pre> ... </pre>\n"
- "\\newenvironment{DoxyPre}{%\n"
- " \\small%\n"
- " \\begin{alltt}%\n"
- "}{%\n"
- " \\end{alltt}%\n"
- " \\normalsize%\n"
- "}\n\n";
- t << "% Used by @code ... @endcode\n"
- "\\newenvironment{DoxyCode}{%\n";
- //if (latexSourceCode)
- //{
- t << "\n\n\\begin{scriptsize}\\begin{alltt}%" << endl;
- //}
- //else
- //{
- // t << " \\footnotesize%\n"
- // " \\verbatim%\n";
- //}
- t << "}{%\n";
- //if (latexSourceCode)
- //{
- t << "\\end{alltt}\\end{scriptsize}%" << endl;
- //}
- //else
- //{
- // t << " \\endverbatim%\n"
- // " \\normalsize%\n";
- //}
- t << "}\n\n";
- t << "% Used by @example, @include, @includelineno and @dontinclude\n"
- "\\newenvironment{DoxyCodeInclude}{%\n"
- " \\DoxyCode%\n"
- "}{%\n"
- " \\endDoxyCode%\n"
- "}\n\n";
- t << "% Used by @verbatim ... @endverbatim\n"
- "\\newenvironment{DoxyVerb}{%\n"
- " \\footnotesize%\n"
- " \\verbatim%\n"
- "}{%\n"
- " \\endverbatim%\n"
- " \\normalsize%\n"
- "}\n\n";
- t << "% Used by @verbinclude\n"
- "\\newenvironment{DoxyVerbInclude}{%\n"
- " \\DoxyVerb%\n"
- "}{%\n"
- " \\endDoxyVerb%\n"
- "}\n\n";
- t << "% Used by numbered lists (using '-#' or <ol> ... </ol>)\n"
- "\\newenvironment{DoxyEnumerate}{%\n"
- " \\enumerate%\n"
- "}{%\n"
- " \\endenumerate%\n"
- "}\n\n";
- t << "% Used by bullet lists (using '-', @li, @arg, or <ul> ... </ul>)\n"
- "\\newenvironment{DoxyItemize}{%\n"
- " \\itemize%\n"
- "}{%\n"
- " \\enditemize%\n"
- "}\n\n";
- t << "% Used by description lists (using <dl> ... </dl>)\n"
- "\\newenvironment{DoxyDescription}{%\n"
- " \\description%\n"
- "}{%\n"
- " \\enddescription%\n"
- "}\n\n";
- t << "% Used by @image, @dotfile, and @dot ... @enddot\n"
- "% (only if caption is specified)\n"
- "\\newenvironment{DoxyImage}{%\n"
- " \\begin{figure}[H]%\n"
- " \\begin{center}%\n"
- "}{%\n"
- " \\end{center}%\n"
- " \\end{figure}%\n"
- "}\n\n";
- t << "% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc\n"
- "% (only if no caption is specified)\n"
- "\\newenvironment{DoxyImageNoCaption}{%\n"
- "}{%\n"
- "}\n\n";
- t << "% Used by @attention\n"
- "\\newenvironment{DoxyAttention}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- "}{%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by @author and @authors\n"
- "\\newenvironment{DoxyAuthor}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- "}{%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by @date\n"
- "\\newenvironment{DoxyDate}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- "}{%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by @invariant\n"
- "\\newenvironment{DoxyInvariant}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- "}{%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by @note\n"
- "\\newenvironment{DoxyNote}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- "}{%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by @post\n"
- "\\newenvironment{DoxyPostcond}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- "}{%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by @pre\n"
- "\\newenvironment{DoxyPrecond}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- "}{%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by @copyright\n"
- "\\newenvironment{DoxyCopyright}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- "}{%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by @remark\n"
- "\\newenvironment{DoxyRemark}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- "}{%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by @return\n"
- "\\newenvironment{DoxyReturn}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- "}{%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by @since\n"
- "\\newenvironment{DoxySince}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- "}{%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by @see\n"
- "\\newenvironment{DoxySeeAlso}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- "}{%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by @version\n"
- "\\newenvironment{DoxyVersion}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- "}{%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by @warning\n"
- "\\newenvironment{DoxyWarning}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- "}{%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by @internal\n"
- "\\newenvironment{DoxyInternal}[1]{%\n"
- " \\paragraph*{#1}%\n"
- "}{%\n"
- "}\n\n";
- t << "% Used by @par and @paragraph\n"
- "\\newenvironment{DoxyParagraph}[1]{%\n"
- " \\begin{list}{}%\n"
- " {%\n"
- " \\settowidth{\\labelwidth}{40pt}%\n"
- " \\setlength{\\leftmargin}{\\labelwidth}%\n"
- " \\setlength{\\parsep}{0pt}%\n"
- " \\setlength{\\itemsep}{-4pt}%\n"
- " \\renewcommand{\\makelabel}{\\entrylabel}%\n"
- " }%\n"
- " \\item[#1]%\n"
- "}{%\n"
- " \\end{list}%\n"
- "}\n\n";
- t << "% Used by parameter lists\n"
- "\\newenvironment{DoxyParams}[2][]{%\n"
- " \\begin{DoxyDesc}{#2}%\n"
- //" \\begin{description}%\n"
- " \\item[] \\hspace{\\fill} \\vspace{-40pt}%\n"
- //" \\definecolor{tableShade}{HTML}{F8F8F8}%\n"
- //" \\rowcolors{1}{white}{tableShade}%\n"
- //" \\arrayrulecolor{gray}%\n"
- " \\settowidth{\\labelwidth}{40pt}%\n"
- //" \\setlength{\\LTleft}{\\labelwidth}%\n"
- " \\setlength{\\LTleft}{0pt}%\n"
- " \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
- " \\ifthenelse{\\equal{#1}{}}%\n" // default: name, docs columns
- " {\\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
- " p{0.815\\textwidth}|}}%\n"
- " {\\ifthenelse{\\equal{#1}{1}}%\n" // inout, name, docs columns, or type, name, docs columns
- " {\\begin{longtable}{|>{\\centering}p{0.10\\textwidth}|%\n"
- " >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
- " p{0.685\\textwidth}|}}%\n"
- " {\\begin{longtable}{|>{\\centering}p{0.10\\textwidth}|%\n" // inout, type, name, docs columns
- " >{\\centering\\hspace{0pt}}p{0.15\\textwidth}|%\n"
- " >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
- " p{0.515\\textwidth}|}}%\n"
- " }\\hline%\n"
- "}{%\n"
- " \\end{longtable}%\n"
- //" \\end{description}%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used for fields of simple structs\n"
- "\\newenvironment{DoxyFields}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- " \\item[] \\hspace{\\fill} \\vspace{-40pt}%\n"
- " \\settowidth{\\labelwidth}{40pt}%\n"
- " \\setlength{\\LTleft}{0pt}%\n"
- " \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
- " \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n"
- " p{0.15\\textwidth}|%\n"
- " p{0.635\\textwidth}|}%\n"
- //"\\hline{\\sf\\textbf{Type}} & {\\sf\\textbf{Name}} & {\\sf\\textbf{Description}}\\endhead%\n"
- " \\hline%\n"
- "}{%\n"
- " \\end{longtable}%\n"
- //" \\end{description}%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% is used for parameters within a detailed function description\n"
- "\\newenvironment{DoxyParamCaption}{%\n"
- " \\renewcommand{\\item}[2][]{##1 {\\em ##2}}%\n"
- " }{%\n"
- "}\n\n";
- t << "% Used by return value lists\n"
- "\\newenvironment{DoxyRetVals}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- " \\begin{description}%\n"
- " \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n"
- //" \\definecolor{tableShade}{HTML}{F8F8F8}%\n"
- //" \\rowcolors{1}{white}{tableShade}%\n"
- //" \\arrayrulecolor{gray}%\n"
- " \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
- " \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
- " p{0.705\\textwidth}|}%\n"
- " \\hline%\n"
- "}{%\n"
- " \\end{longtable}%\n"
- " \\end{description}%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by exception lists\n"
- "\\newenvironment{DoxyExceptions}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- " \\begin{description}%\n"
- " \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n"
- " \\definecolor{tableShade}{HTML}{F8F8F8}%\n"
- " \\rowcolors{1}{white}{tableShade}%\n"
- " \\arrayrulecolor{gray}%\n"
- " \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
- " \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
- " p{0.705\\textwidth}|}%\n"
- " \\hline%\n"
- "}{%\n"
- " \\end{longtable}%\n"
- " \\end{description}%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "% Used by template parameter lists\n"
- "\\newenvironment{DoxyTemplParams}[1]{%\n"
- " \\begin{DoxyDesc}{#1}%\n"
- " \\begin{description}%\n"
- " \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n"
- " \\definecolor{tableShade}{HTML}{F8F8F8}%\n"
- " \\rowcolors{1}{white}{tableShade}%\n"
- " \\arrayrulecolor{gray}%\n"
- " \\setlength{\\tabcolsep}{0.01\\textwidth}%\n"
- " \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n"
- " p{0.705\\textwidth}|}%\n"
- " \\hline%\n"
- "}{%\n"
- " \\end{longtable}%\n"
- " \\end{description}%\n"
- " \\end{DoxyDesc}%\n"
- "}\n\n";
- t << "\\newcommand{\\doxyref}[3]{\\textbf{#1} (\\textnormal{#2}\\,\\pageref{#3})}\n";
- t << "\\newenvironment{DoxyCompactList}\n";
- t << "{\\begin{list}{}{\n";
- t << " \\setlength{\\leftmargin}{0.5cm}\n";
- t << " \\setlength{\\itemsep}{0pt}\n";
- t << " \\setlength{\\parsep}{0pt}\n";
- t << " \\setlength{\\topsep}{0pt}\n";
- t << " \\renewcommand{\\makelabel}{\\hfill}}}\n";
- t << "{\\end{list}}\n";
- t << "\\newenvironment{DoxyCompactItemize}\n";
- t << "{\n";
- t << " \\begin{itemize}\n";
- t << " \\setlength{\\itemsep}{-3pt}\n";
- t << " \\setlength{\\parsep}{0pt}\n";
- t << " \\setlength{\\topsep}{0pt}\n";
- t << " \\setlength{\\partopsep}{0pt}\n";
- t << "}\n";
- t << "{\\end{itemize}}\n";
- t << "\\newcommand{\\PBS}[1]{\\let\\temp=\\\\#1\\let\\\\=\\temp}\n";
- t << "\\newlength{\\tmplength}\n";
- t << "\\newenvironment{TabularC}[1]\n";
- t << "{\n";
- t << "\\setlength{\\tmplength}\n";
- t << " {\\linewidth/(#1)-\\tabcolsep*2-\\arrayrulewidth*(#1+1)/(#1)}\n";
- t << " \\par\\begin{xtabular*}{\\linewidth}\n";
- t << " {*{#1}{|>{\\PBS\\raggedright\\hspace{0pt}}p{\\the\\tmplength}}|}\n";
- t << "}\n";
- t << "{\\end{xtabular*}\\par}\n";
- t << "\\newcommand{\\entrylabel}[1]{\n";
- t << " {\\parbox[b]{\\labelwidth-4pt}{\\makebox[0pt][l]{%\n";
- t << " \\usefont{OT1}{phv}{bc}{n}\\color{darkgray}#1}\\vspace{1.5\\baselineskip}}}}\n";
- t << "\\newenvironment{Desc}\n";
- t << "{\\begin{list}{}\n";
- t << " {\n";
- t << " \\settowidth{\\labelwidth}{40pt}\n";
- t << " \\setlength{\\leftmargin}{\\labelwidth}\n";
- t << " \\setlength{\\parsep}{0pt}\n";
- t << " \\setlength{\\itemsep}{-4pt}\n";
- t << " \\renewcommand{\\makelabel}{\\entrylabel}\n";
- t << " }\n";
- t << "}\n";
- t << "{\\end{list}}\n";
-
- t << "\\newsavebox{\\xrefbox}\n";
- t << "\\newlength{\\xreflength}\n";
- t << "\\newcommand{\\xreflabel}[1]{%\n";
- t << " \\sbox{\\xrefbox}{#1}%\n";
- t << " \\setlength{\\xreflength}{\\wd\\xrefbox}%\n";
- t << " \\ifthenelse{\\xreflength>\\labelwidth}{%\n";
- t << " \\begin{minipage}{\\textwidth}%\n";
- t << " \\setlength{\\parindent}{0pt}%\n";
- t << " \\hangindent=15pt\\bfseries #1\\vspace{1.2\\itemsep}%\n";
- t << " \\end{minipage}%\n";
- t << " }{%\n";
- t << " \\parbox[b]{\\labelwidth}{\\makebox[0pt][l]{\\textbf{#1}}}%\n";
- t << " }}%\n";
- t << "\\newenvironment{DoxyRefList}{%\n";
- t << " \\begin{list}{}{%\n";
- t << " \\setlength{\\labelwidth}{10pt}%\n";
- t << " \\setlength{\\leftmargin}{\\labelwidth}%\n";
- t << " \\addtolength{\\leftmargin}{\\labelsep}%\n";
- t << " \\renewcommand{\\makelabel}{\\xreflabel}%\n";
- t << " }%\n";
- t << " }%\n";
- t << "{\\end{list}}\n";
- t << "\\newenvironment{DoxyRefDesc}[1]\n";
- t << "{\\begin{list}{}{%\n";
- t << " \\renewcommand\\makelabel[1]{\\textbf{##1}}\n";
- t << " \\settowidth\\labelwidth{\\makelabel{#1}}\n";
- t << " \\setlength\\leftmargin{\\labelwidth+\\labelsep}}}\n";
- t << "{\\end{list}}\n";
- t << "\\newenvironment{Indent}\n";
- t << " {\\begin{list}{}{\\setlength{\\leftmargin}{0.5cm}}\n";
- t << " \\item[]\\ignorespaces}\n";
- t << " {\\unskip\\end{list}}\n";
-
- t << "\\setlength{\\parindent}{0cm}\n";
- t << "\\setlength{\\parskip}{0.2cm}\n";
- t << "\\addtocounter{secnumdepth}{2}\n";
- // \sloppy should not be used, see bug 563698
- //t << "\\sloppy\n";
- t << "\\usepackage[T1]{fontenc}\n";
- t << "\\makeatletter\n";
- t << "\\renewcommand{\\paragraph}{\\@startsection{paragraph}{4}{0ex}%\n";
- t << " {-1.0ex}%\n";
- t << " {1.0ex}%\n";
- t << " {\\usefont{OT1}{phv}{bc}{n}\\color{darkgray}}}\n";
- t << "\\renewcommand{\\subparagraph}{\\@startsection{subparagraph}{5}{0ex}%\n";
- t << " {-1.0ex}%\n";
- t << " {1.0ex}%\n";
- t << " {\\usefont{OT1}{phv}{bc}{n}\\color{darkgray}}}\n";
- t << "\\makeatother\n";
- t << "\\allsectionsfont{\\usefont{OT1}{phv}{bc}{n}\\selectfont\\color{darkgray}}\n";
- t << "\\stepcounter{secnumdepth}\n";
- t << "\\stepcounter{tocdepth}\n";
- t << "\\definecolor{comment}{rgb}{0.5,0.0,0.0}\n";
- t << "\\definecolor{keyword}{rgb}{0.0,0.5,0.0}\n";
- t << "\\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}\n";
- t << "\\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}\n";
- t << "\\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}\n";
- t << "\\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}\n";
- t << "\\definecolor{charliteral}{rgb}{0.0,0.5,0.5}\n";
- t << "\\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}\n";
- t << "\\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}\n";
- t << "\\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}\n";
- t << "\\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}\n";
+ t << doxygenLatexStyle;
}
static void writeDefaultFooter(FTextStream &t)
{
+ t << "%--- End generated contents ---\n"
+ "\n";
+
+ // Bibliography
Doxygen::citeDict->writeLatexBibliography(t);
- t << "\\addcontentsline{toc}{part}{" << theTranslator->trRTFGeneralIndex() << "}\n";
- t << "\\printindex\n";
- t << "\\end{document}\n";
+
+ // Index
+ t << "% Index\n"
+ "\\newpage\n"
+ "\\phantomsection\n"
+ "\\addcontentsline{toc}{part}{" << theTranslator->trRTFGeneralIndex() << "}\n"
+ "\\printindex\n"
+ "\n"
+ "\\end{document}\n";
}
void LatexGenerator::writeHeaderFile(QFile &f)
@@ -976,20 +552,7 @@ void LatexGenerator::writeStyleSheetFile(QFile &f)
{
FTextStream t(&f);
t << "% stylesheet for doxygen " << versionString << endl;
-
- writeDefaultStyleSheetPart1(t);
- QCString &projectName = Config_getString("PROJECT_NAME");
-
- t << theTranslator->trGeneratedAt( dateToString(TRUE), projectName );
- t << " doxygen";
- //t << " " << theTranslator->trWrittenBy() << " ";
- //t << "Dimitri van Heesch \\copyright~1997-2012";
- writeDefaultStyleSheetPart2(t);
- t << theTranslator->trGeneratedAt( dateToString(TRUE), projectName );
- t << " doxygen";
- //t << " << theTranslator->trWrittenBy() << " ";
- //t << "Dimitri van Heesch \\copyright~1997-2012";
- writeDefaultStyleSheetPart3(t);
+ writeDefaultStyleSheet(t);
}
void LatexGenerator::startFile(const char *name,const char *,const char *)
@@ -1454,31 +1017,12 @@ void LatexGenerator::writePageLink(const char *name, bool /*first*/)
void LatexGenerator::writeStyleInfo(int part)
{
- switch(part)
- {
- case 0:
- {
- //QCString pname=Config_getString("PROJECT_NAME").stripWhiteSpace();
- startPlainFile("doxygen.sty");
- writeDefaultStyleSheetPart1(t);
- }
- break;
- case 1:
- case 3:
- t << " Doxygen ";
- break;
- case 2:
- {
- writeDefaultStyleSheetPart2(t);
- }
- break;
- case 4:
- {
- writeDefaultStyleSheetPart3(t);
- endPlainFile();
- }
- break;
- }
+ if (part > 0)
+ return;
+
+ startPlainFile("doxygen.sty");
+ writeDefaultStyleSheet(t);
+ endPlainFile();
}
void LatexGenerator::newParagraph()
@@ -1658,7 +1202,7 @@ void LatexGenerator::writeCodeLink(const char *ref,const char *f,
{
static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
- int l = strlen(name);
+ int l = qstrlen(name);
if (col+l>80)
{
t << "\n ";
@@ -1706,7 +1250,7 @@ void LatexGenerator::endTitleHead(const char *fileName,const char *name)
t << "}" << endl;
if (name)
{
- t << "\\label{" << fileName << "}\\index{";
+ t << "\\label{" << stripPath(fileName) << "}\\index{";
escapeLabelName(name);
t << "@{";
escapeMakeIndexChars(name);
@@ -1866,7 +1410,7 @@ void LatexGenerator::endDoxyAnchor(const char *fName,const char *anchor)
t << "}";
}
t << "\\label{";
- if (fName) t << fName;
+ if (fName) t << stripPath(fName);
if (anchor) t << "_" << anchor;
t << "}" << endl;
}
@@ -2378,6 +1922,14 @@ void LatexGenerator::endParameterName(bool last,bool /* emptyList */,bool closeB
}
}
+void LatexGenerator::exceptionEntry(const char* prefix,bool closeBracket)
+{
+ if (prefix)
+ t << " " << prefix;
+ else if (closeBracket)
+ t << ")";
+ t << " ";
+}
void LatexGenerator::writeDoc(DocNode *n,Definition *ctx,MemberDef *)
{
@@ -2433,7 +1985,7 @@ void LatexGenerator::escapeLabelName(const char *s)
if (s==0) return;
const char *p=s;
char c;
- QCString result(strlen(s)+1); // worst case allocation
+ QCString result(qstrlen(s)+1); // worst case allocation
int i;
while ((c=*p++))
{
@@ -2462,7 +2014,7 @@ void LatexGenerator::escapeMakeIndexChars(const char *s)
if (s==0) return;
const char *p=s;
char c;
- QCString result(strlen(s)+1); // worst case allocation
+ QCString result(qstrlen(s)+1); // worst case allocation
int i;
while ((c=*p++))
{
diff --git a/src/latexgen.h b/src/latexgen.h
index 76069d3..2712d31 100644
--- a/src/latexgen.h
+++ b/src/latexgen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -240,6 +240,7 @@ class LatexGenerator : public OutputGenerator
void endParameterName(bool,bool,bool);
void startParameterList(bool);
void endParameterList();
+ void exceptionEntry(const char*,bool);
void startConstraintList(const char *);
void startConstraintParam();
@@ -267,7 +268,6 @@ class LatexGenerator : public OutputGenerator
void endFontClass(); // {}
void writeCodeAnchor(const char *) {}
- void linkableSymbol(int,const char *,Definition *,Definition *) {}
void setCurrentDoc(Definition *,const char *,bool) {}
void addWord(const char *,bool) {}
diff --git a/src/layout.cpp b/src/layout.cpp
index d1e02ac..c2b1ac5 100644
--- a/src/layout.cpp
+++ b/src/layout.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -64,7 +64,7 @@ static bool elemIsVisible(const QXmlAttributes &attrib,bool defVal=TRUE)
}
else if (!opt)
{
- err("error: found unsupported value %s for visible attribute in layout file\n",
+ err("found unsupported value %s for visible attribute in layout file\n",
visible.data());
}
}
@@ -96,7 +96,8 @@ LayoutNavEntry *LayoutNavEntry::find(LayoutNavEntry::Kind kind,
QCString LayoutNavEntry::url() const
{
QCString url = baseFile().stripWhiteSpace();
- if (kind()!=LayoutNavEntry::User)
+ if ((kind()!=LayoutNavEntry::User && kind()!=LayoutNavEntry::UserGroup) ||
+ (kind()==LayoutNavEntry::UserGroup && url.left(9)=="usergroup"))
{
url+=Doxygen::htmlFileExtension;
}
@@ -119,7 +120,7 @@ QCString LayoutNavEntry::url() const
}
if (!found)
{
- msg("warning: explicit link request to '%s' in layout file '%s' could not be resolved\n",qPrint(url.mid(5)),qPrint(Config_getString("LAYOUT_FILE")));
+ msg("explicit link request to '%s' in layout file '%s' could not be resolved\n",qPrint(url.mid(5)),qPrint(Config_getString("LAYOUT_FILE")));
}
}
//printf("LayoutNavEntry::url()=%s\n",url.data());
@@ -312,6 +313,12 @@ class LayoutParser : public QXmlDefaultHandler
SrcLangExt_VHDL,VhdlDocGen::trVhdlType(VhdlDocGen::ENTITY,FALSE),
SrcLangExt_Fortran,theTranslator->trDataTypes()
)));
+ m_sHandler.insert("class/memberdecl/services",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberListType_services,theTranslator->trServices()));
+ m_sHandler.insert("class/memberdecl/interfaces",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+ MemberListType_interfaces,theTranslator->trInterfaces()));
m_sHandler.insert("class/memberdecl/publictypes",
new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
MemberListType_pubTypes,theTranslator->trPublicTypes()));
@@ -421,6 +428,12 @@ class LayoutParser : public QXmlDefaultHandler
m_sHandler.insert("class/memberdef/enums",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
MemberListType_enumMembers,theTranslator->trMemberEnumerationDocumentation()));
+ m_sHandler.insert("class/memberdef/services",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberListType_serviceMembers,theTranslator->trInterfaces()));
+ m_sHandler.insert("class/memberdef/interfaces",
+ new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+ MemberListType_interfaceMembers,theTranslator->trInterfaces()));
m_sHandler.insert("class/memberdef/constructors",
new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
MemberListType_constructors,theTranslator->trConstructorDocumentation()));
@@ -464,12 +477,16 @@ class LayoutParser : public QXmlDefaultHandler
new StartElementHandler(this,&LayoutParser::startMemberDecl));
m_sHandler.insert("namespace/memberdecl/nestednamespaces",
new StartElementHandlerSection(this,LayoutDocEntry::NamespaceNestedNamespaces,&LayoutParser::startSectionEntry,
- COMPILE_FOR_3_OPTIONS(
+ COMPILE_FOR_4_OPTIONS(
theTranslator->trNamespaces(),
SrcLangExt_Java,theTranslator->trPackages(),
SrcLangExt_VHDL,theTranslator->trPackages(),
+ SrcLangExt_IDL,theTranslator->trModules(),
SrcLangExt_Fortran,theTranslator->trModules()
)));
+ m_sHandler.insert("namespace/memberdecl/constantgroups",
+ new StartElementHandlerSection(this,LayoutDocEntry::NamespaceNestedConstantGroups,&LayoutParser::startSectionEntry,
+ theTranslator->trConstantGroups()));
m_sHandler.insert("namespace/memberdecl/classes",
new StartElementHandlerSection(this,LayoutDocEntry::NamespaceClasses,&LayoutParser::startSectionEntry,
COMPILE_FOR_2_OPTIONS(
@@ -558,11 +575,15 @@ class LayoutParser : public QXmlDefaultHandler
)));
m_sHandler.insert("file/memberdecl/namespaces",
new StartElementHandlerSection(this,LayoutDocEntry::FileNamespaces,&LayoutParser::startSectionEntry,
- COMPILE_FOR_2_OPTIONS(
+ COMPILE_FOR_3_OPTIONS(
theTranslator->trNamespaces(),
SrcLangExt_Java,theTranslator->trPackages(),
+ SrcLangExt_IDL,theTranslator->trModules(),
SrcLangExt_Fortran,theTranslator->trModules()
)));
+ m_sHandler.insert("file/memberdecl/constantgroups",
+ new StartElementHandlerSection(this,LayoutDocEntry::FileNamespaces,&LayoutParser::startSectionEntry,
+ theTranslator->trConstantGroups()));
m_sHandler.insert("file/memberdecl/defines",
new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
MemberListType_decDefineMembers,theTranslator->trDefines()));
@@ -1040,11 +1061,11 @@ class LayoutParser : public QXmlDefaultHandler
{
if (type.isEmpty())
{
- err("error: an entry tag within a navindex has no type attribute! Check your layout file!\n");
+ err("an entry tag within a navindex has no type attribute! Check your layout file!\n");
}
else
{
- err("error: the type '%s' is not supported for the entry tag within a navindex! Check your layout file!\n",type.data());
+ err("the type '%s' is not supported for the entry tag within a navindex! Check your layout file!\n",type.data());
}
m_invalidEntry=TRUE;
return;
@@ -1073,7 +1094,14 @@ class LayoutParser : public QXmlDefaultHandler
}
else if (kind==LayoutNavEntry::UserGroup)
{
- baseFile+=QCString().sprintf("%d",m_userGroupCount++);
+ if (!url.isEmpty())
+ {
+ baseFile=url;
+ }
+ else
+ {
+ baseFile+=QCString().sprintf("%d",m_userGroupCount++);
+ }
}
// create new item and make it the new root
m_rootNav = new LayoutNavEntry(m_rootNav,kind,kind==LayoutNavEntry::MainPage?TRUE:isVisible,baseFile,title,intro);
@@ -1211,7 +1239,7 @@ class LayoutParser : public QXmlDefaultHandler
}
else
{
- err("error: Unexpected start tag `%s' found in scope='%s'!\n",
+ err("Unexpected start tag `%s' found in scope='%s'!\n",
name.data(),m_scope.data());
}
return TRUE;
@@ -1261,21 +1289,21 @@ class LayoutErrorHandler : public QXmlErrorHandler
LayoutErrorHandler(const char *fn) : fileName(fn) {}
bool warning( const QXmlParseException &exception )
{
- err("warning: at line %d column %d of %s: %s\n",
+ warn_uncond("at line %d column %d of %s: %s\n",
exception.lineNumber(),exception.columnNumber(),fileName.data(),
exception.message().data());
return FALSE;
}
bool error( const QXmlParseException &exception )
{
- err("error: at line %d column %d of %s: %s\n",
+ err("at line %d column %d of %s: %s\n",
exception.lineNumber(),exception.columnNumber(),fileName.data(),
exception.message().data());
return FALSE;
}
bool fatalError( const QXmlParseException &exception )
{
- err("fatal error: at line %d column %d of %s: %s\n",
+ err("fatal: at line %d column %d of %s: %s\n",
exception.lineNumber(),exception.columnNumber(),fileName.data(),
exception.message().data());
return FALSE;
diff --git a/src/layout.h b/src/layout.h
index 830ee70..2506076 100644
--- a/src/layout.h
+++ b/src/layout.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -45,11 +45,11 @@ struct LayoutDocEntry
ClassUsedFiles,
// Namespace specific items
- NamespaceNestedNamespaces, NamespaceClasses,
- NamespaceInlineClasses,
+ NamespaceNestedNamespaces, NamespaceNestedConstantGroups,
+ NamespaceClasses, NamespaceInlineClasses,
// File specific items
- FileClasses, FileNamespaces,
+ FileClasses, FileNamespaces, FileConstantGroups,
FileIncludes, FileIncludeGraph,
FileIncludedByGraph, FileSourceLink,
FileInlineClasses,
diff --git a/src/layout_default.h b/src/layout_default.h
index d2dfce6..d775926 100644
--- a/src/layout_default.h
+++ b/src/layout_default.h
@@ -31,6 +31,8 @@
" <memberdecl>\n"
" <nestedclasses visible=\"yes\" title=\"\"/>\n"
" <publictypes title=\"\"/>\n"
+" <services title=\"\"/>\n"
+" <interfaces title=\"\"/>\n"
" <publicslots title=\"\"/>\n"
" <signals title=\"\"/>\n"
" <publicmethods title=\"\"/>\n"
@@ -65,6 +67,8 @@
" <inlineclasses title=\"\"/>\n"
" <typedefs title=\"\"/>\n"
" <enums title=\"\"/>\n"
+" <services title=\"\"/>\n"
+" <interfaces title=\"\"/>\n"
" <constructors title=\"\"/>\n"
" <functions title=\"\"/>\n"
" <related title=\"\"/>\n"
@@ -82,6 +86,7 @@
" <briefdescription visible=\"yes\"/>\n"
" <memberdecl>\n"
" <nestednamespaces visible=\"yes\" title=\"\"/>\n"
+" <constantgroups visible=\"yes\" title=\"\"/>\n"
" <classes visible=\"yes\" title=\"\"/>\n"
" <typedefs title=\"\"/>\n"
" <enums title=\"\"/>\n"
@@ -110,6 +115,7 @@
" <memberdecl>\n"
" <classes visible=\"yes\" title=\"\"/>\n"
" <namespaces visible=\"yes\" title=\"\"/>\n"
+" <constantgroups visible=\"yes\" title=\"\"/>\n"
" <defines title=\"\"/>\n"
" <typedefs title=\"\"/>\n"
" <enums title=\"\"/>\n"
diff --git a/src/layout_default.xml b/src/layout_default.xml
index b0bbec4..f087958 100644
--- a/src/layout_default.xml
+++ b/src/layout_default.xml
@@ -31,6 +31,8 @@
<memberdecl>
<nestedclasses visible="yes" title=""/>
<publictypes title=""/>
+ <services title=""/>
+ <interfaces title=""/>
<publicslots title=""/>
<signals title=""/>
<publicmethods title=""/>
@@ -65,6 +67,8 @@
<inlineclasses title=""/>
<typedefs title=""/>
<enums title=""/>
+ <services title=""/>
+ <interfaces title=""/>
<constructors title=""/>
<functions title=""/>
<related title=""/>
@@ -82,6 +86,7 @@
<briefdescription visible="yes"/>
<memberdecl>
<nestednamespaces visible="yes" title=""/>
+ <constantgroups visible="yes" title=""/>
<classes visible="yes" title=""/>
<typedefs title=""/>
<enums title=""/>
@@ -110,6 +115,7 @@
<memberdecl>
<classes visible="yes" title=""/>
<namespaces visible="yes" title=""/>
+ <constantgroups visible="yes" title=""/>
<defines title=""/>
<typedefs title=""/>
<enums title=""/>
diff --git a/src/libdoxycfg.pro.in b/src/libdoxycfg.pro.in
index 800c373..6a63828 100644
--- a/src/libdoxycfg.pro.in
+++ b/src/libdoxycfg.pro.in
@@ -1,7 +1,7 @@
#
#
#
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
diff --git a/src/libdoxycfg.t.in b/src/libdoxycfg.t.in
index 29b1623..4f885a7 100644
--- a/src/libdoxycfg.t.in
+++ b/src/libdoxycfg.t.in
@@ -1,7 +1,7 @@
#
#
#
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in
index 39d303a..d63f7ac 100644
--- a/src/libdoxygen.pro.in
+++ b/src/libdoxygen.pro.in
@@ -1,7 +1,7 @@
#
#
#
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
@@ -19,6 +19,7 @@ CONFIG = console warn_on staticlib $extraopts
HEADERS = arguments.h \
bufstr.h \
cite.h \
+ clangparser.h \
classdef.h \
classlist.h \
cmdmapper.h \
@@ -46,6 +47,7 @@ HEADERS = arguments.h \
doxygen.h \
doxygen_bst.h \
doxygen_css.h \
+ doxygen_sty.h \
eclipsehelp.h \
entry.h \
example.h \
@@ -77,10 +79,10 @@ HEADERS = arguments.h \
latexgen.h \
layout.h \
layout_default.h \
- lockingptr.h \
logos.h \
mandocvisitor.h \
mangen.h \
+ sqlite3gen.h \
markdown.h \
marshal.h \
memberdef.h \
@@ -170,12 +172,15 @@ HEADERS = arguments.h \
vhdldocgen.h \
vhdlscanner.h \
xmldocvisitor.h \
- xmlgen.h
+ xmlgen.h \
+ docbookvisitor.h \
+ docbookgen.h
SOURCES = arguments.cpp \
ce_lex.cpp \
ce_parse.cpp \
cite.cpp \
+ clangparser.cpp \
classdef.cpp \
classlist.cpp \
cmdmapper.cpp \
@@ -222,6 +227,7 @@ SOURCES = arguments.cpp \
logos.cpp \
mandocvisitor.cpp \
mangen.cpp \
+ sqlite3gen.cpp \
markdown.cpp \
marshal.cpp \
memberdef.cpp \
@@ -259,7 +265,9 @@ SOURCES = arguments.cpp \
vhdlparser.cpp \
vhdlscanner.cpp \
xmldocvisitor.cpp \
- xmlgen.cpp
+ xmlgen.cpp \
+ docbookvisitor.cpp \
+ docbookgen.cpp
win32:TMAKE_CXXFLAGS += -DQT_NODLL
win32-msvc:TMAKE_CXXFLAGS += -Zm200
diff --git a/src/libdoxygen.t.in b/src/libdoxygen.t.in
index e11e010..526a097 100644
--- a/src/libdoxygen.t.in
+++ b/src/libdoxygen.t.in
@@ -1,7 +1,7 @@
#
#
#
-# Copyright (C) 1997-2012 by Dimitri van Heesch.
+# Copyright (C) 1997-2013 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
@@ -144,6 +144,9 @@ extsearch_js.h: extsearch.js
doxygen_css.h: doxygen.css
cat doxygen.css | $(TO_C_CMD) >doxygen_css.h
+doxygen_sty.h: doxygen.sty
+ cat doxygen.sty | $(TO_C_CMD) >doxygen_sty.h
+
navtree_js.h: navtree.js
cat navtree.js | $(TO_C_CMD) >navtree_js.h
@@ -162,6 +165,9 @@ jquery_p2_js.h: jquery_p2.js
jquery_p3_js.h: jquery_p3.js
cat jquery_p3.js | $(TO_C_CMD) >jquery_p3_js.h
+jquery_p4_js.h: jquery_p4.js
+ cat jquery_p4.js | $(TO_C_CMD) >jquery_p4_js.h
+
jquery_ui_js.h: jquery_ui.js
cat jquery_ui.js | $(TO_C_CMD) >jquery_ui_js.h
diff --git a/src/lockingptr.h b/src/lockingptr.h
index 5fc328d..024758f 100644
--- a/src/lockingptr.h
+++ b/src/lockingptr.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/logos.cpp b/src/logos.cpp
index 120a449..6aea996 100644
--- a/src/logos.cpp
+++ b/src/logos.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/logos.h b/src/logos.h
index 3050819..13406e1 100644
--- a/src/logos.h
+++ b/src/logos.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/main.cpp b/src/main.cpp
index dd1ea1e..09798ec 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp
index 38a3ab3..e854bfc 100644
--- a/src/mandocvisitor.cpp
+++ b/src/mandocvisitor.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -32,7 +32,7 @@
ManDocVisitor::ManDocVisitor(FTextStream &t,CodeOutputInterface &ci,
const char *langExt)
- : DocVisitor(DocVisitor_Man), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE), m_firstCol(TRUE),
+ : DocVisitor(DocVisitor_Man), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE), m_firstCol(FALSE),
m_indent(0), m_langExt(langExt)
{
}
@@ -223,7 +223,8 @@ void ManDocVisitor::visit(DocVerbatim *s)
case DocVerbatim::HtmlOnly:
case DocVerbatim::XmlOnly:
case DocVerbatim::LatexOnly:
- case DocVerbatim::RtfOnly:
+ case DocVerbatim::RtfOnly:
+ case DocVerbatim::DocbookOnly:
case DocVerbatim::Dot:
case DocVerbatim::Msc:
/* nothing */
diff --git a/src/mandocvisitor.h b/src/mandocvisitor.h
index d595644..cc4e85f 100644
--- a/src/mandocvisitor.h
+++ b/src/mandocvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/mangen.cpp b/src/mangen.cpp
index cea01ce..a50ee73 100644
--- a/src/mangen.cpp
+++ b/src/mangen.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -33,15 +33,33 @@
static QCString getExtension()
{
+ /*
+ * [.][nuber][rest]
+ * in case of . missing, just ignore it
+ * in case number missing, just place a 3 in front of it
+ */
QCString ext = Config_getString("MAN_EXTENSION");
- if( ext.length() >= 2 &&
- ext.data()[0] == '.')
+ if (ext.isEmpty())
{
- ext = ext.mid(1, ext.length()-1);
+ ext = "3";
}
else
{
- ext = "3";
+ if (ext.at(0)=='.')
+ {
+ if (ext.length()==1)
+ {
+ ext = "3";
+ }
+ else // strip .
+ {
+ ext = ext.mid(1);
+ }
+ }
+ if (ext.at(0)<='0' || ext.at(0)>='9')
+ {
+ ext.prepend("3");
+ }
}
return ext;
}
@@ -50,7 +68,7 @@ ManGenerator::ManGenerator() : OutputGenerator()
{
dir=Config_getString("MAN_OUTPUT")+"/man" + getExtension();
firstCol=TRUE;
- paragraph=FALSE;
+ paragraph=TRUE;
col=0;
upperCase=FALSE;
insideTabbing=FALSE;
@@ -129,8 +147,8 @@ static QCString buildFileName(const char *name)
}
}
- QCString &manExtension = Config_getString("MAN_EXTENSION");
- if (fileName.right(2)!=manExtension)
+ QCString manExtension = "." + getExtension();
+ if (fileName.right(manExtension.length())!=manExtension)
{
fileName+=manExtension;
}
@@ -313,7 +331,7 @@ void ManGenerator::codify(const char *str)
case '\n': t << "\n"; firstCol=TRUE; col=0; break;
case '\\': t << "\\"; col++; break;
case '\"': c = '\''; // no break!
- default: t << c; firstCol=FALSE; col++; break;
+ default: p=writeUtf8Char(t,p-1); firstCol=FALSE; col++; break;
}
}
//printf("%s",str);fflush(stdout);
@@ -798,4 +816,12 @@ void ManGenerator::endLabels()
{
}
+void ManGenerator::endHeaderSection()
+{
+ if (!firstCol)
+ {
+ t<< endl; firstCol=TRUE;
+ }
+}
+
diff --git a/src/mangen.h b/src/mangen.h
index f40d0c3..eda360e 100644
--- a/src/mangen.h
+++ b/src/mangen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -95,7 +95,7 @@ class ManGenerator : public OutputGenerator
void startMemberSections() {}
void endMemberSections() {}
void startHeaderSection() {}
- void endHeaderSection() {}
+ void endHeaderSection();
void startMemberHeader(const char *);
void endMemberHeader();
void insertMemberAlign(bool) {}
@@ -229,6 +229,7 @@ class ManGenerator : public OutputGenerator
void endParameterName(bool,bool,bool) {}
void startParameterList(bool) {}
void endParameterList() {}
+ void exceptionEntry(const char*,bool) {}
void startFontClass(const char *) {}
void endFontClass() {}
@@ -256,7 +257,6 @@ class ManGenerator : public OutputGenerator
void endLabels();
void writeCodeAnchor(const char *) {}
- void linkableSymbol(int,const char *,Definition *,Definition *) {}
void setCurrentDoc(Definition *,const char *,bool) {}
void addWord(const char *,bool) {}
diff --git a/src/markdown.cpp b/src/markdown.cpp
index 15b36a3..a3ac468 100644
--- a/src/markdown.cpp
+++ b/src/markdown.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -192,15 +192,16 @@ static QCString isBlockCommand(const char *data,int offset,int size)
{
return "}";
}
- else if (blockName=="dot" ||
- blockName=="code" ||
- blockName=="msc" ||
- blockName=="verbatim" ||
- blockName=="latexonly" ||
- blockName=="htmlonly" ||
- blockName=="xmlonly" ||
- blockName=="rtfonly" ||
- blockName=="manonly"
+ else if (blockName=="dot" ||
+ blockName=="code" ||
+ blockName=="msc" ||
+ blockName=="verbatim" ||
+ blockName=="latexonly" ||
+ blockName=="htmlonly" ||
+ blockName=="xmlonly" ||
+ blockName=="rtfonly" ||
+ blockName=="manonly" ||
+ blockName=="docbookonly"
)
{
return "end"+blockName;
@@ -291,7 +292,7 @@ static int findEmphasisChar(const char *data, int size, char c, int c_size)
if ((data[i]=='\\' || data[i]=='@') && // command
data[i-1]!='\\' && data[i-1]!='@') // not escaped
{
- if (strncmp(&data[i+1],endBlockName,l)==0)
+ if (qstrncmp(&data[i+1],endBlockName,l)==0)
{
break;
}
@@ -472,6 +473,25 @@ static int processNmdash(GrowBuf &out,const char *data,int,int size)
return 0;
}
+/** Process quoted section "...", can contain one embedded newline */
+static int processQuoted(GrowBuf &out,const char *data,int,int size)
+{
+ int i=1;
+ int nl=0;
+ while (i<size && data[i]!='"' && nl<2)
+ {
+ if (data[i]=='\n') nl++;
+ i++;
+ }
+ if (i<size && data[i]=='"' && nl<2)
+ {
+ out.addStr(data,i+1);
+ return i+1;
+ }
+ // not a quoted section
+ return 0;
+}
+
/** Process a HTML tag. Note that <pre>..</pre> are treated specially, in
* the sense that all code inside is written unprocessed
*/
@@ -960,7 +980,7 @@ static int processSpecialCommand(GrowBuf &out, const char *data, int offset, int
if ((data[i]=='\\' || data[i]=='@') && // command
data[i-1]!='\\' && data[i-1]!='@') // not escaped
{
- if (strncmp(&data[i+1],endBlockName,l)==0)
+ if (qstrncmp(&data[i+1],endBlockName,l)==0)
{
//printf("found end at %d\n",i);
out.addStr(data,i+1+l);
@@ -1175,13 +1195,13 @@ static int isHRuler(const char *data,int size)
static QCString extractTitleId(QCString &title)
{
//static QRegExp r1("^[a-z_A-Z][a-z_A-Z0-9\\-]*:");
- static QRegExp r2("\\{#[a-z_A-Z][a-z_A-Z0-9\\-]*\\}$");
+ static QRegExp r2("\\{#[a-z_A-Z][a-z_A-Z0-9\\-]*\\}");
int l=0;
int i = r2.match(title,0,&l);
- if (i!=-1) // found {#id} style id
+ if (i!=-1 && title.mid(i+l).stripWhiteSpace().isEmpty()) // found {#id} style id
{
QCString id = title.mid(i+2,l-3);
- title = title.left(i)+title.mid(i+l);
+ title = title.left(i);
//printf("found id='%s' title='%s'\n",id.data(),title.data());
return id;
}
@@ -1429,11 +1449,11 @@ static bool isCodeBlock(const char *data,int offset,int size,int &indent)
*/
int findTableColumns(const char *data,int size,int &start,int &end,int &columns)
{
- int i=0;
+ int i=0,n=0;
int eol;
// find start character of the table line
while (i<size && data[i]==' ') i++;
- if (i<size && data[i]=='|') i++; // leading | does not count
+ if (i<size && data[i]=='|' && data[i]!='\n') i++,n++; // leading | does not count
start = i;
// find end character of the table line
@@ -1441,20 +1461,25 @@ int findTableColumns(const char *data,int size,int &start,int &end,int &columns)
eol=i+1;
i--;
while (i>0 && data[i]==' ') i--;
- if (i>0 && data[i]=='|') i--; // trailing | does not count
+ if (i>0 && data[i]=='|') i--,n++; // trailing | does not count
end = i;
// count columns between start and end
- columns=1;
+ columns=0;
if (end>start)
{
i=start;
- while (i<=end)
+ while (i<=end) // look for more column markers
{
if (data[i]=='|' && (i==0 || data[i-1]!='\\')) columns++;
+ if (columns==1) columns++; // first | make a non-table into a two column table
i++;
}
}
+ if (n==2 && columns==0) // table row has | ... |
+ {
+ columns++;
+ }
//printf("findTableColumns(start=%d,end=%d,columns=%d) eol=%d\n",
// start,end,columns,eol);
return eol;
@@ -1467,7 +1492,7 @@ static bool isTableBlock(const char *data,int size)
// the first line should have at least two columns separated by '|'
int i = findTableColumns(data,size,start,end,cc0);
- if (i>=size || cc0<2)
+ if (i>=size || cc0<1)
{
//printf("isTableBlock: no |'s in the header\n");
return FALSE;
@@ -1560,9 +1585,9 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size)
out.addStr("<th");
switch (columnAlignment[k])
{
- case AlignLeft: out.addStr(" align=left"); break;
- case AlignRight: out.addStr(" align=right"); break;
- case AlignCenter: out.addStr(" align=center"); break;
+ case AlignLeft: out.addStr(" align=\"left\""); break;
+ case AlignRight: out.addStr(" align=\"right\""); break;
+ case AlignCenter: out.addStr(" align=\"center\""); break;
case AlignNone: break;
}
out.addStr(">");
@@ -1572,6 +1597,7 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size)
}
m++;
}
+ out.addStr("\n</th>\n");
// write table cells
while (i<size)
@@ -1591,9 +1617,9 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size)
out.addStr("<td");
switch (columnAlignment[k])
{
- case AlignLeft: out.addStr(" align=left"); break;
- case AlignRight: out.addStr(" align=right"); break;
- case AlignCenter: out.addStr(" align=center"); break;
+ case AlignLeft: out.addStr(" align=\"left\""); break;
+ case AlignRight: out.addStr(" align=\"right\""); break;
+ case AlignCenter: out.addStr(" align=\"center\""); break;
case AlignNone: break;
}
out.addStr(">");
@@ -1615,7 +1641,7 @@ static int writeTableBlock(GrowBuf &out,const char *data,int size)
i+=ret;
}
- out.addStr("</table>\n");
+ out.addStr("</table> ");
delete[] columnAlignment;
return i;
@@ -1814,7 +1840,7 @@ static void findEndOfLine(GrowBuf &out,const char *data,int size,
data[end-1]!='\\' && data[end-1]!='@'
)
{
- if (strncmp(&data[end+1],endBlockName,l)==0)
+ if (qstrncmp(&data[end+1],endBlockName,l)==0)
{
if (pi!=-1) // output previous line if available
{
@@ -1977,6 +2003,7 @@ static QCString processBlocks(const QCString &s,int indent)
QCString header,id;
convertStringFragment(header,data+pi,i-pi-1);
id = extractTitleId(header);
+ //printf("header='%s' is='%s'\n",header.data(),id.data());
if (!header.isEmpty())
{
if (!id.isEmpty())
@@ -1985,7 +2012,7 @@ static QCString processBlocks(const QCString &s,int indent)
out.addStr(id);
out.addStr(" ");
out.addStr(header);
- out.addStr("\n");
+ out.addStr("\n\n");
SectionInfo *si = new SectionInfo(g_fileName,id,header,
level==1 ? SectionInfo::Section : SectionInfo::Subsection,level);
if (g_current)
@@ -1998,7 +2025,7 @@ static QCString processBlocks(const QCString &s,int indent)
{
out.addStr(level==1?"<h1>":"<h2>");
out.addStr(header);
- out.addStr(level==1?"</h1>\n":"</h2>\n");
+ out.addStr(level==1?"\n</h1>\n":"\n</h2>\n");
}
}
else
@@ -2081,12 +2108,17 @@ static QCString processBlocks(const QCString &s,int indent)
static QCString extractPageTitle(QCString &docs,QCString &id)
{
+ int ln=0;
// first first non-empty line
QCString title;
const char *data = docs.data();
int i=0;
int size=docs.size();
- while (i<size && (data[i]==' ' || data[i]=='\n')) i++;
+ while (i<size && (data[i]==' ' || data[i]=='\n'))
+ {
+ if (data[i]=='\n') ln++;
+ i++;
+ }
if (i>=size) return "";
int end1=i+1;
while (end1<size && data[end1-1]!='\n') end1++;
@@ -2094,13 +2126,16 @@ static QCString extractPageTitle(QCString &docs,QCString &id)
// first line from i..end1
if (end1<size)
{
+ ln++;
// second line form end1..end2
int end2=end1+1;
while (end2<size && data[end2-1]!='\n') end2++;
if (isHeaderline(data+end1,size-end1))
{
convertStringFragment(title,data+i,end1-i-1);
- docs=docs.mid(end2);
+ QCString lns;
+ lns.fill('\n',ln);
+ docs=lns+docs.mid(end2);
id = extractTitleId(title);
//printf("extractPageTitle(title='%s' docs='%s' id='%s')\n",title.data(),docs.data(),id.data());
return title;
@@ -2148,6 +2183,18 @@ static QCString detab(const QCString &s,int &refIndent)
break;
default: // non-whitespace => update minIndent
out.addChar(c);
+ if (c<0 && i<size) // multibyte sequence
+ {
+ out.addChar(data[i++]); // >= 2 bytes
+ if (((uchar)c&0xE0)==0xE0 && i<size)
+ {
+ out.addChar(data[i++]); // 3 bytes
+ }
+ if (((uchar)c&0xF0)==0xF0 && i<size)
+ {
+ out.addChar(data[i++]); // 4 byres
+ }
+ }
if (col<minIndent) minIndent=col;
col++;
}
@@ -2175,6 +2222,7 @@ QCString processMarkdown(const QCString &fileName,Entry *e,const QCString &input
g_actions[(unsigned int)'!']=processLink;
g_actions[(unsigned int)'<']=processHtmlTag;
g_actions[(unsigned int)'-']=processNmdash;
+ g_actions[(unsigned int)'"']=processQuoted;
init=TRUE;
}
@@ -2206,16 +2254,19 @@ QCString processMarkdown(const QCString &fileName,Entry *e,const QCString &input
void MarkdownFileParser::parseInput(const char *fileName,
const char *fileBuf,
- Entry *root)
+ Entry *root,
+ bool /*sameTranslationUnit*/,
+ QStrList & /*filesInSameTranslationUnit*/)
{
Entry *current = new Entry;
current->lang = SrcLangExt_Markdown;
current->fileName = fileName;
current->docFile = fileName;
- int len = strlen(fileBuf);
+ current->docLine = 1;
+ int len = qstrlen(fileBuf);
BufStr input(len);
BufStr output(len);
- input.addArray(fileBuf,strlen(fileBuf));
+ input.addArray(fileBuf,qstrlen(fileBuf));
input.addChar('\0');
convertCppComments(&input,&output,fileName);
output.addChar('\0');
@@ -2223,12 +2274,15 @@ void MarkdownFileParser::parseInput(const char *fileName,
QCString id;
QCString title=extractPageTitle(docs,id).stripWhiteSpace();
//g_correctSectionLevel = !title.isEmpty();
- QCString baseFn = QFileInfo(fileName).baseName().utf8();
- QCString fn = QFileInfo(fileName).fileName().utf8();
- QCString baseName = substitute(baseFn," ","_");
+ QCString baseFn = stripFromPath(QFileInfo(fileName).absFilePath().utf8());
+ int i = baseFn.findRev('.');
+ if (i!=-1) baseFn = baseFn.left(i);
+ QCString titleFn = QFileInfo(fileName).baseName().utf8();
+ QCString fn = QFileInfo(fileName).fileName().utf8();
+ QCString baseName = substitute(substitute(baseFn," ","_"),"/","_");
static QCString mdfileAsMainPage = Config_getString("USE_MDFILE_AS_MAINPAGE");
if (id.isEmpty()) id = "md_"+baseName;
- if (title.isEmpty()) title = baseName;
+ if (title.isEmpty()) title = titleFn;
if (fn==mdfileAsMainPage)
{
docs.prepend("@mainpage\n");
diff --git a/src/markdown.h b/src/markdown.h
index f41de5e..71884d5 100644
--- a/src/markdown.h
+++ b/src/markdown.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -28,9 +28,13 @@ class MarkdownFileParser : public ParserInterface
{
public:
virtual ~MarkdownFileParser() {}
+ void startTranslationUnit(const char *) {}
+ void finishTranslationUnit() {}
void parseInput(const char *fileName,
const char *fileBuf,
- Entry *root);
+ Entry *root,
+ bool sameTranslationUnit,
+ QStrList &filesInSameTranslationUnit);
bool needsPreprocessing(const QCString &) { return FALSE; }
void parseCode(CodeOutputInterface &codeOutIntf,
const char *scopeName,
diff --git a/src/marshal.cpp b/src/marshal.cpp
index daf1850..a6b3e75 100644
--- a/src/marshal.cpp
+++ b/src/marshal.cpp
@@ -33,6 +33,12 @@ void marshalUInt(StorageIntf *s,uint v)
s->write((const char *)b,4);
}
+void marshalUInt64(StorageIntf *s,uint64 v)
+{
+ marshalUInt(s, uint(v>>32));
+ marshalUInt(s, uint(v&0xFFFFFFFF));
+}
+
void marshalBool(StorageIntf *s,bool b)
{
char c = b;
@@ -345,7 +351,7 @@ void marshalEntry(StorageIntf *s,Entry *e)
marshalInt(s,e->section);
marshalInt(s,(int)e->protection);
marshalInt(s,(int)e->mtype);
- marshalInt(s,e->spec);
+ marshalUInt64(s,e->spec);
marshalInt(s,e->initLines);
marshalBool(s,e->stat);
marshalBool(s,e->explicitExternal);
@@ -391,6 +397,7 @@ void marshalEntry(StorageIntf *s,Entry *e)
marshalBool(s,e->hidden);
marshalBool(s,e->artificial);
marshalInt(s,(int)e->groupDocType);
+ marshalQCString(s,e->id);
}
void marshalEntryTree(StorageIntf *s,Entry *e)
@@ -425,6 +432,13 @@ uint unmarshalUInt(StorageIntf *s)
return result;
}
+uint64 unmarshalUInt64(StorageIntf *s)
+{
+ uint64 result=uint64(unmarshalUInt(s))<<32;
+ result|=unmarshalUInt(s);
+ return result;
+}
+
bool unmarshalBool(StorageIntf *s)
{
char result;
@@ -718,7 +732,7 @@ Entry * unmarshalEntry(StorageIntf *s)
e->section = unmarshalInt(s);
e->protection = (Protection)unmarshalInt(s);
e->mtype = (MethodTypes)unmarshalInt(s);
- e->spec = unmarshalInt(s);
+ e->spec = unmarshalUInt64(s);
e->initLines = unmarshalInt(s);
e->stat = unmarshalBool(s);
e->explicitExternal = unmarshalBool(s);
@@ -768,6 +782,7 @@ Entry * unmarshalEntry(StorageIntf *s)
e->hidden = unmarshalBool(s);
e->artificial = unmarshalBool(s);
e->groupDocType = (Entry::GroupDocType)unmarshalInt(s);
+ e->id = unmarshalQCString(s);
return e;
}
diff --git a/src/marshal.h b/src/marshal.h
index 3728339..977a89b 100644
--- a/src/marshal.h
+++ b/src/marshal.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -44,6 +44,7 @@ class Entry;
void marshalInt(StorageIntf *s,int v);
void marshalUInt(StorageIntf *s,uint v);
+void marshalUInt64(StorageIntf *s,uint64 v);
void marshalBool(StorageIntf *s,bool b);
void marshalQCString(StorageIntf *s,const QCString &str);
void marshalQGString(StorageIntf *s,const QGString &str);
@@ -70,6 +71,7 @@ void marshalEntryTree(StorageIntf *s,Entry *e);
int unmarshalInt(StorageIntf *s);
uint unmarshalUInt(StorageIntf *s);
+uint64 unmarshalUInt64(StorageIntf *s);
bool unmarshalBool(StorageIntf *s);
QCString unmarshalQCString(StorageIntf *s);
QGString unmarshalQGString(StorageIntf *s);
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 1482180..c5bf787 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -45,18 +45,6 @@
#include "filedef.h"
#include "config.h"
-#define START_MARKER 0x4D454D5B // MEM[
-#define END_MARKER 0x4D454D5D // MEM]
-
-#if defined(_OS_WIN32_)
-#define snprintf _snprintf
-#endif
-
-// Put this macro at the start of any method of MemberDef that can directly
-// or indirectly access other MemberDefs. It prevents that the content
-// pointed to by m_impl gets flushed to disk in the middle of the method call!
-#define KEEP_RESIDENT_DURING_CALL makeResident();LockingPtr<MemberDef> lock(this,this)
-
//-----------------------------------------------------------------------------
int MemberDef::s_indentLevel = 0;
@@ -97,10 +85,43 @@ static QCString addTemplateNames(const QCString &s,const QCString &n,const QCStr
return result;
}
+// ol.startMemberDocName has already been done before this is called.
+// when this function returns TRUE, ol.endParameterList will be called.
+//
+// typical sequence:
+// ol.startMemberDoc
+// ol.startMemberDocName
+// --- enter writeDefArgumentList
+// ol.endMemberDocName
+// ol.startParameterList
+// ...
+// ol.startParameterType(first=TRUE)
+// ol.endParameterType
+// ol.startParameterName
+// ol.endParameterName(last==FALSE)
+// ...
+// ol.startParameterType(first=FALSE)
+// ol.endParamtereType
+// ol.startParameterName
+// ol.endParameterName(last==TRUE)
+// ...
+// --- leave writeDefArgumentList with return value TRUE
+// ol.endParameterList
+// ol.endMemberDoc(hasArgs=TRUE)
+//
+// For an empty list the function should return FALSE, the sequence is
+// ol.startMemberDoc
+// ol.startMemberDocName
+// --- enter writeDefArgumentList
+// --- leave writeDefArgumentList with return value FALSE
+// ol.endMemberDocName
+// ol.endMemberDoc(hasArgs=FALSE);
+//
+
static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
const QCString & /*scopeName*/,MemberDef *md)
{
- LockingPtr<ArgumentList> defArgList=(md->isDocsForDefinition()) ?
+ ArgumentList *defArgList=(md->isDocsForDefinition()) ?
md->argumentList() : md->declArgumentList();
//printf("writeDefArgumentList `%s' isDocsForDefinition()=%d\n",md->name().data(),md->isDocsForDefinition());
if (defArgList==0 || md->isProperty())
@@ -112,7 +133,12 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
// simple argument list for tcl
if (md->getLanguage()==SrcLangExt_Tcl)
{
+ if (defArgList->count()==0) return FALSE;
Argument *a=defArgList->first();
+ ol.endMemberDocName();
+ ol.startParameterList(FALSE);
+ ol.startParameterType(TRUE,0);
+ ol.endParameterType();
ol.startParameterName(FALSE);
while (a)
{
@@ -126,8 +152,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
}
a=defArgList->next();
}
- ol.endParameterName(FALSE,FALSE,FALSE);
- ol.endMemberDocName();
+ ol.endParameterName(TRUE,FALSE,FALSE);
return TRUE;
}
@@ -341,6 +366,68 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
return TRUE;
}
+static void writeExceptionListImpl(
+ OutputList &ol, ClassDef *cd, MemberDef *md, QCString const& exception)
+{
+ // this is ordinary exception spec - there must be a '('
+ int index = exception.find('(');
+ if (-1!=index)
+ {
+ ol.exceptionEntry(exception.left(index),false);
+ ++index; // paren in second column so skip it here
+ for (int comma = exception.find(',', index); -1!=comma; )
+ {
+ ++comma; // include comma
+ linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md,
+ exception.mid(index,comma-index));
+ ol.exceptionEntry(0,false);
+ index=comma;
+ comma = exception.find(',', index);
+ }
+ int close = exception.find(')', index);
+ if (-1!=close)
+ {
+ QCString type=removeRedundantWhiteSpace(exception.mid(index,close-index));
+ linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md,type);
+ ol.exceptionEntry(0,true);
+ }
+ else
+ warn(md->getDefFileName(),md->getDefLine(),
+ "missing ) in exception list on member %s",qPrint(md->name()));
+ }
+ else
+ {
+ // fallback - is it possible to get here?
+ warn(md->getDefFileName(),md->getDefLine(),
+ "missing ( in exception list on member %s",qPrint(md->name()));
+ ol.docify(" ");
+ linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md,exception);
+ }
+}
+
+static void writeExceptionList(OutputList &ol, ClassDef *cd, MemberDef *md)
+{
+ QCString exception(QCString(md->excpString()).stripWhiteSpace());
+ if ('{'==exception.at(0))
+ {
+ // this is an UNO IDL attribute - need special handling
+ int index = exception.find(';');
+ int oldIndex = 1;
+ while (-1 != index) // there should be no more than 2 (set / get)
+ {
+ // omit '{' and ';' -> "set raises (...)"
+ writeExceptionListImpl(ol,cd,md,exception.mid(oldIndex,index-oldIndex));
+ oldIndex=index+1;
+ index = exception.find(';',oldIndex);
+ }
+ // the rest is now just '}' - omit that
+ }
+ else
+ {
+ writeExceptionListImpl(ol,cd,md,exception);
+ }
+}
+
static void writeTemplatePrefix(OutputList &ol,ArgumentList *al)
{
ol.docify("template<");
@@ -402,6 +489,7 @@ class MemberDefImpl
NamespaceDef *nspace; // the namespace this member is in.
MemberDef *enumScope; // the enclosing scope, if this is an enum field
+ bool livesInsideEnum;
MemberDef *annEnumType; // the anonymous enum that is the type of this member
MemberList *enumFields; // enumeration fields
@@ -433,7 +521,7 @@ class MemberDefImpl
QCString enumBaseType; // base type of the enum (C++11)
int initLines; // number of lines in the initializer
- int memSpec; // The specifiers present for this member
+ uint64 memSpec; // The specifiers present for this member
MemberType mtype; // returns the kind of member
int maxInitLines; // when the initializer will be displayed
int userInitLines; // result of explicit \hideinitializer or \showinitializer
@@ -502,7 +590,7 @@ class MemberDefImpl
ClassDef *category;
MemberDef *categoryRelation;
- bool tagDataWritten;
+ unsigned tagDataWritten;
};
MemberDefImpl::MemberDefImpl() :
@@ -554,6 +642,7 @@ void MemberDefImpl::init(Definition *def,
exampleSDict=0;
enumFields=0;
enumScope=0;
+ livesInsideEnum=FALSE;
defTmpArgLists=0;
hasCallGraph = FALSE;
hasCallerGraph = FALSE;
@@ -631,7 +720,7 @@ void MemberDefImpl::init(Definition *def,
hasDocumentedReturnType = FALSE;
docProvider = 0;
isDMember = def->getDefFileName().right(2).lower()==".d";
- tagDataWritten = FALSE;
+ tagDataWritten = 0; // save separate written status for file, group, class, etc.
}
@@ -643,6 +732,7 @@ void MemberDefImpl::init(Definition *def,
*
* \param df File containing the definition of this member.
* \param dl Line at which the member definition was found.
+ * \param dc Column at which the member definition was found.
* \param t A string representing the type of the member.
* \param na A string representing the name of the member.
* \param a A string representing the arguments of the member.
@@ -653,25 +743,22 @@ void MemberDefImpl::init(Definition *def,
* \c Normal, \c Virtual, \c Pure.
* \param s A boolean that is true iff the member is static.
* \param r The relationship between the class and the member.
- * \param mt The kind of member. See #MemberDef::MemberType for a list of
+ * \param mt The kind of member. See #MemberType for a list of
* all types.
* \param tal The template arguments of this member.
* \param al The arguments of this member. This is a structured form of
* the string past as argument \a a.
*/
-MemberDef::MemberDef(const char *df,int dl,
+MemberDef::MemberDef(const char *df,int dl,int dc,
const char *t,const char *na,const char *a,const char *e,
Protection p,Specifier v,bool s,Relationship r,MemberType mt,
const ArgumentList *tal,const ArgumentList *al
- ) : Definition(df,dl,removeRedundantWhiteSpace(na))
+ ) : Definition(df,dl,dc,removeRedundantWhiteSpace(na))
{
//printf("MemberDef::MemberDef(%s)\n",na);
- m_storagePos=-1;
- m_cacheHandle=-1;
m_impl = new MemberDefImpl;
m_impl->init(this,t,a,e,p,v,s,r,mt,tal,al);
- m_flushPending = FALSE;
m_isLinkableCached = 0;
m_isConstructorCached = 0;
m_isDestructorCached = 0;
@@ -679,10 +766,7 @@ MemberDef::MemberDef(const char *df,int dl,
MemberDef::MemberDef(const MemberDef &md) : Definition(md)
{
- m_storagePos=-1;
- m_cacheHandle=-1;
m_impl = new MemberDefImpl;
- m_flushPending = FALSE;
m_isLinkableCached = 0;
m_isConstructorCached = 0;
m_isDestructorCached = 0;
@@ -690,7 +774,6 @@ MemberDef::MemberDef(const MemberDef &md) : Definition(md)
MemberDef *MemberDef::deepCopy() const
{
- makeResident();
//MemberDef *result = new MemberDef(getDefFileName(),getDefLine(),name());
MemberDef *result = new MemberDef(*this);
// first copy everything by reference
@@ -789,23 +872,15 @@ MemberDef::~MemberDef()
delete m_impl;
//printf("%p: ~MemberDef()\n",this);
m_impl=0;
- if (m_cacheHandle!=-1)
- {
- Doxygen::symbolCache->del(m_cacheHandle);
- m_cacheHandle=-1;
- }
}
void MemberDef::setReimplements(MemberDef *md)
{
- makeResident();
-
m_impl->redefines = md;
}
void MemberDef::insertReimplementedBy(MemberDef *md)
{
- makeResident();
if (m_impl->templateMaster)
{
m_impl->templateMaster->insertReimplementedBy(md);
@@ -819,19 +894,16 @@ void MemberDef::insertReimplementedBy(MemberDef *md)
MemberDef *MemberDef::reimplements() const
{
- makeResident();
return m_impl->redefines;
}
-LockingPtr<MemberList> MemberDef::reimplementedBy() const
+MemberList *MemberDef::reimplementedBy() const
{
- makeResident();
- return LockingPtr<MemberList>(this,m_impl->redefinedBy);
+ return m_impl->redefinedBy;
}
bool MemberDef::isReimplementedBy(ClassDef *cd) const
{
- makeResident();
if (cd && m_impl->redefinedBy)
{
MemberListIterator mi(*m_impl->redefinedBy);
@@ -853,7 +925,6 @@ bool MemberDef::isReimplementedBy(ClassDef *cd) const
void MemberDef::insertEnumField(MemberDef *md)
{
- makeResident();
if (m_impl->enumFields==0) m_impl->enumFields=new MemberList(MemberListType_enumFields);
m_impl->enumFields->append(md);
}
@@ -861,7 +932,6 @@ void MemberDef::insertEnumField(MemberDef *md)
bool MemberDef::addExample(const char *anchor,const char *nameStr,
const char *file)
{
- makeResident();
//printf("%s::addExample(%s,%s,%s)\n",name().data(),anchor,nameStr,file);
if (m_impl->exampleSDict==0) m_impl->exampleSDict = new ExampleSDict;
if (m_impl->exampleSDict->find(nameStr)==0)
@@ -879,7 +949,6 @@ bool MemberDef::addExample(const char *anchor,const char *nameStr,
bool MemberDef::hasExamples()
{
- makeResident();
if (m_impl->exampleSDict==0)
return FALSE;
else
@@ -888,7 +957,6 @@ bool MemberDef::hasExamples()
QCString MemberDef::getOutputFileBase() const
{
- makeResident();
static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
QCString baseName;
//printf("Member: %s: templateMaster=%p group=%p classDef=%p nspace=%p fileDef=%p\n",
@@ -922,7 +990,7 @@ QCString MemberDef::getOutputFileBase() const
if (baseName.isEmpty())
{
warn(getDefFileName(),getDefLine(),
- "warning: Internal inconsistency: member %s does not belong to any"
+ "Internal inconsistency: member %s does not belong to any"
" container!",qPrint(name())
);
return "dummy";
@@ -943,7 +1011,6 @@ QCString MemberDef::getOutputFileBase() const
QCString MemberDef::getReference() const
{
- makeResident();
QCString ref = Definition::getReference();
if (!ref.isEmpty())
{
@@ -974,7 +1041,6 @@ QCString MemberDef::getReference() const
QCString MemberDef::anchor() const
{
- KEEP_RESIDENT_DURING_CALL;
QCString result=m_impl->anc;
if (m_impl->groupAlias) return m_impl->groupAlias->anchor();
if (m_impl->templateMaster) return m_impl->templateMaster->anchor();
@@ -998,7 +1064,6 @@ QCString MemberDef::anchor() const
void MemberDef::_computeLinkableInProject()
{
- KEEP_RESIDENT_DURING_CALL;
static bool extractStatic = Config_getBool("EXTRACT_STATIC");
m_isLinkableCached = 2; // linkable
//printf("MemberDef::isLinkableInProject(name=%s)\n",name().data());
@@ -1070,28 +1135,24 @@ void MemberDef::_computeLinkableInProject()
void MemberDef::setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace)
{
- makeResident();
Definition::setDocumentation(d,docFile,docLine,stripWhiteSpace);
m_isLinkableCached = 0;
}
void MemberDef::setBriefDescription(const char *b,const char *briefFile,int briefLine)
{
- makeResident();
Definition::setBriefDescription(b,briefFile,briefLine);
m_isLinkableCached = 0;
}
void MemberDef::setInbodyDocumentation(const char *d,const char *inbodyFile,int inbodyLine)
{
- makeResident();
Definition::setInbodyDocumentation(d,inbodyFile,inbodyLine);
m_isLinkableCached = 0;
}
void MemberDef::setHidden(bool b)
{
- makeResident();
Definition::setHidden(b);
m_isLinkableCached = 0;
}
@@ -1109,7 +1170,6 @@ bool MemberDef::isLinkableInProject() const
bool MemberDef::isLinkable() const
{
- makeResident();
if (m_impl->templateMaster)
{
return m_impl->templateMaster->isLinkable();
@@ -1125,7 +1185,6 @@ void MemberDef::setDefinitionTemplateParameterLists(QList<ArgumentList> *lists)
{
if (lists)
{
- makeResident();
if (m_impl->defTmpArgLists) delete m_impl->defTmpArgLists;
m_impl->defTmpArgLists = copyArgumentLists(lists);
}
@@ -1134,13 +1193,16 @@ void MemberDef::setDefinitionTemplateParameterLists(QList<ArgumentList> *lists)
void MemberDef::writeLink(OutputList &ol,ClassDef *,NamespaceDef *,
FileDef *fd,GroupDef *gd,bool onlyText)
{
- KEEP_RESIDENT_DURING_CALL;
SrcLangExt lang = getLanguage();
static bool hideScopeNames = Config_getBool("HIDE_SCOPE_NAMES");
QCString sep = getLanguageSpecificSeparator(lang,TRUE);
QCString n = name();
if (!hideScopeNames)
{
+ if (m_impl->enumScope && m_impl->livesInsideEnum)
+ {
+ n.prepend(m_impl->enumScope->displayName()+sep);
+ }
if (m_impl->classDef && gd && !isRelated())
{
n.prepend(m_impl->classDef->displayName()+sep);
@@ -1183,12 +1245,7 @@ void MemberDef::writeLink(OutputList &ol,ClassDef *,NamespaceDef *,
*/
ClassDef *MemberDef::getClassDefOfAnonymousType()
{
- // split KEEP_RESIDENT_DURING_CALL for performance
- makeResident();
if (m_impl->cachedAnonymousType) return m_impl->cachedAnonymousType;
- LockingPtr<MemberDef> lock(this,this); // since this memberDef can access
- // other memberDefs prevent it from
- // being flushed to disk halfway
QCString cname;
if (getClassDef()!=0)
@@ -1253,8 +1310,6 @@ bool MemberDef::isBriefSectionVisible() const
// "", //getFileDef()->name().data(),
// argsString());
- KEEP_RESIDENT_DURING_CALL;
-
MemberGroupInfo *info = Doxygen::memGrpInfoDict[m_impl->grpId];
//printf("name=%s m_impl->grpId=%d info=%p\n",name().data(),m_impl->grpId,info);
//QCString *pMemGrp = Doxygen::memberDocDict[grpId];
@@ -1338,14 +1393,13 @@ bool MemberDef::isBriefSectionVisible() const
void MemberDef::writeDeclaration(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
- bool inGroup,ClassDef *inheritedFrom,const char *inheritId
- )
+ bool inGroup, const DefType compoundType,
+ ClassDef *inheritedFrom,const char *inheritId)
{
//printf("%s MemberDef::writeDeclaration() inGroup=%d\n",qualifiedName().data(),inGroup);
// hide enum value, since they appear already as part of the enum, unless they
// are explicitly grouped.
- KEEP_RESIDENT_DURING_CALL;
if (!inGroup && m_impl->mtype==MemberType_EnumValue) return;
// hide members whose brief section should not be visible
@@ -1355,7 +1409,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
ASSERT (cd!=0 || nd!=0 || fd!=0 || gd!=0); // member should belong to something
if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
- _writeTagData();
+ _writeTagData(compoundType);
QCString cname = d->name();
QCString cdname = d->displayName();
@@ -1469,7 +1523,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
ltype.left(i), // text
TRUE // autoBreak
);
- getAnonymousEnumType()->writeEnumDeclaration(ol,cd,nd,fd,gd);
+ getAnonymousEnumType()->writeEnumDeclaration(ol,cd,nd,fd,gd,compoundType);
//ol+=*getAnonymousEnumType()->enumDecl();
linkifyText(TextGeneratorOLImpl(ol),d,m_impl->fileDef,this,ltype.right(ltype.length()-i-l),TRUE);
}
@@ -1715,35 +1769,42 @@ void MemberDef::writeDeclaration(OutputList &ol,
/* && !annMemb */
)
{
- ol.startMemberDescription(anchor(),inheritId);
- ol.parseDoc(briefFile(),briefLine(),
+ DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),
getOuterScope()?getOuterScope():d,this,briefDescription(),
TRUE,FALSE,0,TRUE,FALSE);
- if (detailsVisible)
+
+ if (rootNode && !rootNode->isEmpty())
{
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- //ol.endEmphasis();
- ol.docify(" ");
- if (m_impl->group!=0 && gd==0) // forward link to the group
+ ol.startMemberDescription(anchor(),inheritId);
+ ol.writeDoc(rootNode,getOuterScope()?getOuterScope():d,this);
+ if (detailsVisible)
{
- ol.startTextLink(getOutputFileBase(),anchor());
- }
- else // local link
- {
- ol.startTextLink(0,anchor());
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ //ol.endEmphasis();
+ ol.docify(" ");
+ if (m_impl->group!=0 && gd==0) // forward link to the group
+ {
+ ol.startTextLink(getOutputFileBase(),anchor());
+ }
+ else // local link
+ {
+ ol.startTextLink(0,anchor());
+ }
+ ol.parseText(theTranslator->trMore());
+ ol.endTextLink();
+ //ol.startEmphasis();
+ ol.popGeneratorState();
}
- ol.endTextLink();
- //ol.startEmphasis();
- ol.popGeneratorState();
- }
- // for RTF we need to add an extra empty paragraph
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::RTF);
+ // for RTF we need to add an extra empty paragraph
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::RTF);
ol.startParagraph();
ol.endParagraph();
- ol.popGeneratorState();
- ol.endMemberDescription();
+ ol.popGeneratorState();
+ ol.endMemberDescription();
+ }
+ delete rootNode;
}
ol.endMemberDeclaration(anchor(),inheritId);
@@ -1760,8 +1821,6 @@ bool MemberDef::isDetailedSectionLinkable() const
static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS");
static bool extractStatic = Config_getBool("EXTRACT_STATIC");
- KEEP_RESIDENT_DURING_CALL;
-
// the member has details documentation for any of the following reasons
bool docFilter =
// treat everything as documented
@@ -1787,6 +1846,8 @@ bool MemberDef::isDetailedSectionLinkable() const
(hasMultiLineInitializer() && !hideUndocMembers) ||
// has one or more documented arguments
(m_impl->defArgList!=0 && m_impl->defArgList->hasDocumentation()) ||
+ // is an attribute or property - need to display that tag
+ (m_impl->memSpec & (Entry::Attribute|Entry::Property)) ||
// has user comments
Doxygen::userComments
;
@@ -1876,7 +1937,7 @@ void MemberDef::_getLabels(QStrList &sl,Definition *container) const
if (isGettable()) sl.append("get");
if (isSettable()) sl.append("set");
if (isAddable()) sl.append("add");
- if (isRemovable()) sl.append("remove");
+ if (!isUNOProperty() && isRemovable()) sl.append("remove");
if (isRaisable()) sl.append("raise");
if (isReadable()) sl.append("read");
if (isWritable()) sl.append("write");
@@ -1913,6 +1974,17 @@ void MemberDef::_getLabels(QStrList &sl,Definition *container) const
if (isDefault()) sl.append("default");
if (isDelete()) sl.append("delete");
if (isNoExcept()) sl.append("noexcept");
+ if (isAttribute()) sl.append("attribute");
+ if (isUNOProperty()) sl.append("property");
+ if (isReadonly()) sl.append("readonly");
+ if (isBound()) sl.append("bound");
+ if (isUNOProperty() && isRemovable()) sl.append("removable");
+ if (isConstrained()) sl.append("constrained");
+ if (isTransient()) sl.append("transient");
+ if (isMaybeVoid()) sl.append("maybevoid");
+ if (isMaybeDefault()) sl.append("maybedefault");
+ if (isMaybeAmbiguous()) sl.append("maybeambiguous");
+ if (isPublished()) sl.append("published"); // enum
}
if (isObjCProperty() && isImplementation())
{
@@ -1945,7 +2017,7 @@ void MemberDef::_writeCallGraph(OutputList &ol)
DotCallGraph callGraph(this,FALSE);
if (callGraph.isTooBig())
{
- err("warning: Call graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",qPrint(qualifiedName()));
+ warn_uncond("Call graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",qPrint(qualifiedName()));
}
else if (!callGraph.isTrivial())
{
@@ -1970,7 +2042,7 @@ void MemberDef::_writeCallerGraph(OutputList &ol)
DotCallGraph callerGraph(this, TRUE);
if (callerGraph.isTooBig())
{
- err("warning: Caller graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",qPrint(qualifiedName()));
+ warn_uncond("Caller graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",qPrint(qualifiedName()));
}
else if (!callerGraph.isTrivial() && !callerGraph.isTooBig())
{
@@ -2038,7 +2110,7 @@ void MemberDef::_writeReimplements(OutputList &ol)
}
else
{
- err("error: translation error: no marker in trReimplementsFromList()\n");
+ err("translation error: no marker in trReimplementsFromList()\n");
}
ol.endParagraph();
}
@@ -2047,8 +2119,8 @@ void MemberDef::_writeReimplements(OutputList &ol)
void MemberDef::_writeReimplementedBy(OutputList &ol)
{
- LockingPtr<MemberList> bml=reimplementedBy();
- if (bml!=0)
+ MemberList *bml=reimplementedBy();
+ if (bml)
{
MemberListIterator mli(*bml);
MemberDef *bmd=0;
@@ -2202,9 +2274,9 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container,
if (isEnumerate())
{
bool first=TRUE;
- LockingPtr<MemberList> fmdl=enumFieldList();
+ MemberList *fmdl=enumFieldList();
//printf("** %s: enum values=%d\n",name().data(),fmdl!=0 ? fmdl->count() : 0);
- if (fmdl!=0)
+ if (fmdl)
{
MemberDef *fmd=fmdl->first();
while (fmd)
@@ -2251,7 +2323,7 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container,
if (hasBrief)
{
- ol.parseDoc(fmd->briefFile(),fmd->briefLine(),
+ ol.generateDoc(fmd->briefFile(),fmd->briefLine(),
getOuterScope()?getOuterScope():container,
fmd,fmd->briefDescription(),TRUE,FALSE);
}
@@ -2263,7 +2335,7 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container,
//}
if (hasDetails)
{
- ol.parseDoc(fmd->docFile(),fmd->docLine(),
+ ol.generateDoc(fmd->docFile(),fmd->docLine(),
getOuterScope()?getOuterScope():container,
fmd,fmd->documentation()+"\n",TRUE,FALSE);
}
@@ -2306,8 +2378,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if ( !hasDocs ) return;
if (isEnumValue() && !showEnumValues) return;
- KEEP_RESIDENT_DURING_CALL;
-
SrcLangExt lang = getLanguage();
//printf("member=%s lang=%d\n",name().data(),lang);
bool optVhdl = lang==SrcLangExt_VHDL;
@@ -2391,7 +2461,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
ol.startMemberDoc(ciname,name(),memAnchor,name(),showInline);
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),this,ldef.left(i));
- vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef());
+ vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef(),definitionType());
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),this,ldef.right(ldef.length()-i-l));
found=TRUE;
@@ -2554,8 +2624,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
}
if (excpString()) // add exception list
{
- ol.docify(" ");
- linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),this,excpString());
+ writeExceptionList(ol,cd,this);
+ hasParameterList=true; // call endParameterList below
}
}
@@ -2638,7 +2708,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
QCString brief = briefDescription();
QCString detailed = documentation();
- LockingPtr<ArgumentList> docArgList = LockingPtr<ArgumentList>(this,m_impl->defArgList);
+ ArgumentList *docArgList = m_impl->defArgList;
if (m_impl->templateMaster)
{
brief = m_impl->templateMaster->briefDescription();
@@ -2654,7 +2724,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
)
{
ol.startParagraph();
- ol.parseDoc(briefFile(),briefLine(),
+ ol.generateDoc(briefFile(),briefLine(),
getOuterScope()?getOuterScope():container,this,
brief,FALSE,FALSE,0,TRUE,FALSE);
ol.endParagraph();
@@ -2672,12 +2742,12 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
}
else
{
- ol.parseDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,detailed+"\n",TRUE,FALSE);
+ ol.generateDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,detailed+"\n",TRUE,FALSE);
}
if (!inbodyDocumentation().isEmpty())
{
- ol.parseDoc(inbodyFile(),inbodyLine(),
+ ol.generateDoc(inbodyFile(),inbodyLine(),
getOuterScope()?getOuterScope():container,this,
inbodyDocumentation()+"\n",TRUE,FALSE);
}
@@ -2687,7 +2757,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
{
if (!inbodyDocumentation().isEmpty())
{
- ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,inbodyDocumentation()+"\n",TRUE,FALSE);
+ ol.generateDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,inbodyDocumentation()+"\n",TRUE,FALSE);
}
}
@@ -2710,7 +2780,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
}
}
// feed the result to the documentation parser
- ol.parseDoc(
+ ol.generateDoc(
docFile(),docLine(),
getOuterScope()?getOuterScope():container,
this, // memberDef
@@ -2761,13 +2831,13 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if (!hasDocumentedParams())
{
warn_doc_error(docFile(),docLine(),
- "warning: parameters of member %s are not (all) documented",
+ "parameters of member %s are not (all) documented",
qPrint(qualifiedName()));
}
if (!hasDocumentedReturnType() && isFunction() && hasDocumentation())
{
warn_doc_error(docFile(),docLine(),
- "warning: return type of member %s is not documented",
+ "return type of member %s is not documented",
qPrint(qualifiedName()));
}
}
@@ -2839,8 +2909,6 @@ static Definition *getClassFromType(Definition *scope,const QCString &type,SrcLa
void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
{
- KEEP_RESIDENT_DURING_CALL;
-
Definition *scope = getOuterScope();
QCString doxyName = name();
QCString doxyArgs = argsString();
@@ -2864,6 +2932,9 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
{
type = m_impl->type;
}
+
+ if (isTypedef()) type.prepend("typedef ");
+
QCString ts = simplifyTypeForTable(type);
if (cd) // cd points to an anonymous struct pointed to by this member
@@ -2874,7 +2945,7 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
const char **p = prefixes;
while (*p)
{
- int l=strlen(*p);
+ int l=qstrlen(*p);
if (ts.left(l)==*p)
{
ol.writeString(*p);
@@ -2923,7 +2994,7 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
)
)
{
- ol.parseDoc(briefFile(),briefLine(),
+ ol.generateDoc(briefFile(),briefLine(),
getOuterScope()?getOuterScope():container,this,
brief,FALSE,FALSE,0,TRUE,FALSE);
}
@@ -2931,7 +3002,7 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
/* write detailed description */
if (!detailed.isEmpty())
{
- ol.parseDoc(docFile(),docLine(),
+ ol.generateDoc(docFile(),docLine(),
getOuterScope()?getOuterScope():container,this,
detailed+"\n",FALSE,FALSE,0,FALSE,FALSE);
@@ -2942,7 +3013,6 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
QCString MemberDef::memberTypeName() const
{
- makeResident();
switch (m_impl->mtype)
{
case MemberType_Define: return "macro definition";
@@ -2957,13 +3027,14 @@ QCString MemberDef::memberTypeName() const
case MemberType_DCOP: return "dcop";
case MemberType_Property: return "property";
case MemberType_Event: return "event";
+ case MemberType_Interface: return "interface";
+ case MemberType_Service: return "service";
default: return "unknown";
}
}
void MemberDef::warnIfUndocumented()
{
- makeResident();
if (m_impl->memberGroup) return;
ClassDef *cd = getClassDef();
NamespaceDef *nd = getNamespaceDef();
@@ -2992,7 +3063,7 @@ void MemberDef::warnIfUndocumented()
!isReference()
)
{
- warn_undoc(getDefFileName(),getDefLine(),"warning: Member %s%s (%s) of %s %s is not documented.",
+ warn_undoc(getDefFileName(),getDefLine(),"Member %s%s (%s) of %s %s is not documented.",
qPrint(name()),qPrint(argsString()),qPrint(memberTypeName()),t,qPrint(d->name()));
}
}
@@ -3001,7 +3072,6 @@ void MemberDef::warnIfUndocumented()
bool MemberDef::isFriendClass() const
{
- makeResident();
return (isFriend() &&
(m_impl->type=="friend class" || m_impl->type=="friend struct" ||
m_impl->type=="friend union"));
@@ -3009,7 +3079,6 @@ bool MemberDef::isFriendClass() const
bool MemberDef::isDocumentedFriendClass() const
{
- makeResident();
ClassDef *fcd=0;
QCString baseName=name();
int i=baseName.find('<');
@@ -3020,7 +3089,6 @@ bool MemberDef::isDocumentedFriendClass() const
bool MemberDef::hasDocumentation() const
{
- makeResident();
return Definition::hasDocumentation() ||
(m_impl->mtype==MemberType_Enumeration && m_impl->docEnumValues) || // has enum values
(m_impl->defArgList!=0 && m_impl->defArgList->hasDocumentation()); // has doc arguments
@@ -3037,20 +3105,17 @@ bool MemberDef::hasUserDocumentation() const
void MemberDef::setMemberGroup(MemberGroup *grp)
{
- makeResident();
m_impl->memberGroup = grp;
}
bool MemberDef::visibleMemberGroup(bool hideNoHeader)
{
- makeResident();
return m_impl->memberGroup!=0 &&
(!hideNoHeader || m_impl->memberGroup->header()!="[NOHEADER]");
}
QCString MemberDef::getScopeString() const
{
- makeResident();
QCString result;
if (getClassDef()) result=getClassDef()->displayName();
else if (getNamespaceDef()) result=getNamespaceDef()->displayName();
@@ -3084,7 +3149,6 @@ static QCString escapeAnchor(const QCString &anchor)
void MemberDef::setAnchor()
{
- makeResident();
QCString memAnchor = name();
if (!m_impl->args.isEmpty()) memAnchor+=m_impl->args;
@@ -3098,7 +3162,7 @@ void MemberDef::setAnchor()
if (m_impl->tArgList)
{
char buf[20];
- snprintf(buf,20,"%d:",m_impl->tArgList->count());
+ qsnprintf(buf,20,"%d:",m_impl->tArgList->count());
buf[19]='\0';
memAnchor.prepend(buf);
}
@@ -3117,7 +3181,6 @@ void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
bool hasDocs,MemberDef *member)
{
//printf("%s MemberDef::setGroupDef(%s)\n",name().data(),gd->name().data());
- makeResident();
m_impl->group=gd;
m_impl->grouppri=pri;
m_impl->groupFileName=fileName;
@@ -3127,10 +3190,10 @@ void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
m_isLinkableCached = 0;
}
-void MemberDef::setEnumScope(MemberDef *md)
+void MemberDef::setEnumScope(MemberDef *md,bool livesInsideEnum)
{
- makeResident();
m_impl->enumScope=md;
+ m_impl->livesInsideEnum=livesInsideEnum;
if (md->getGroupDef())
{
m_impl->group=md->getGroupDef();
@@ -3144,7 +3207,6 @@ void MemberDef::setEnumScope(MemberDef *md)
void MemberDef::setMemberClass(ClassDef *cd)
{
- makeResident();
m_impl->classDef=cd;
m_isLinkableCached = 0;
m_isConstructorCached = 0;
@@ -3153,7 +3215,6 @@ void MemberDef::setMemberClass(ClassDef *cd)
void MemberDef::setNamespace(NamespaceDef *nd)
{
- makeResident();
m_impl->nspace=nd;
setOuterScope(nd);
}
@@ -3161,7 +3222,6 @@ void MemberDef::setNamespace(NamespaceDef *nd)
MemberDef *MemberDef::createTemplateInstanceMember(
ArgumentList *formalArgs,ArgumentList *actualArgs)
{
- KEEP_RESIDENT_DURING_CALL;
//printf(" Member %s %s %s\n",typeString(),name().data(),argsString());
ArgumentList *actualArgList = 0;
if (m_impl->defArgList)
@@ -3186,7 +3246,7 @@ MemberDef *MemberDef::createTemplateInstanceMember(
}
MemberDef *imd = new MemberDef(
- getDefFileName(),getDefLine(),
+ getDefFileName(),getDefLine(),getDefColumn(),
substituteTemplateArgumentsInString(m_impl->type,formalArgs,actualArgs),
methodName,
substituteTemplateArgumentsInString(m_impl->args,formalArgs,actualArgs),
@@ -3206,7 +3266,6 @@ MemberDef *MemberDef::createTemplateInstanceMember(
bool MemberDef::hasOneLineInitializer() const
{
- makeResident();
//printf("%s: init=%s, initLines=%d maxInitLines=%d userInitLines=%d\n",
// name().data(),m_impl->initializer.data(),m_impl->initLines,
// m_impl->maxInitLines,m_impl->userInitLines);
@@ -3216,7 +3275,6 @@ bool MemberDef::hasOneLineInitializer() const
bool MemberDef::hasMultiLineInitializer() const
{
- makeResident();
//printf("initLines=%d userInitLines=%d maxInitLines=%d\n",
// initLines,userInitLines,maxInitLines);
return m_impl->initLines>0 &&
@@ -3227,7 +3285,6 @@ bool MemberDef::hasMultiLineInitializer() const
void MemberDef::setInitializer(const char *initializer)
{
- makeResident();
m_impl->initializer=initializer;
int l=m_impl->initializer.length();
int p=l-1;
@@ -3239,7 +3296,6 @@ void MemberDef::setInitializer(const char *initializer)
void MemberDef::addListReference(Definition *)
{
- KEEP_RESIDENT_DURING_CALL;
static bool optimizeOutputForC = Config_getBool("OPTIMIZE_OUTPUT_FOR_C");
//static bool hideScopeNames = Config_getBool("HIDE_SCOPE_NAMES");
//static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
@@ -3288,10 +3344,10 @@ void MemberDef::addListReference(Definition *)
memArgs = argsString();
}
}
- LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
- if (xrefItems!=0)
+ QList<ListItemInfo> *xrefItems = xrefListItems();
+ if (xrefItems)
{
- addRefItem(xrefItems.pointer(),
+ addRefItem(xrefItems,
qualifiedName()+argsString(), // argsString is needed for overloaded functions (see bug 609624)
memLabel,
getOutputFileBase()+"#"+anchor(),memName,memArgs);
@@ -3300,7 +3356,6 @@ void MemberDef::addListReference(Definition *)
MemberList *MemberDef::getSectionList(Definition *d) const
{
- makeResident();
char key[20];
sprintf(key,"%p",d);
return (d!=0 && m_impl->classSectionSDict) ? m_impl->classSectionSDict->find(key) : 0;
@@ -3308,7 +3363,6 @@ MemberList *MemberDef::getSectionList(Definition *d) const
void MemberDef::setSectionList(Definition *d, MemberList *sl)
{
- makeResident();
//printf("MemberDef::setSectionList(%p,%p) name=%s\n",d,sl,name().data());
char key[20];
sprintf(key,"%p",d);
@@ -3321,16 +3375,14 @@ void MemberDef::setSectionList(Definition *d, MemberList *sl)
Specifier MemberDef::virtualness(int count) const
{
- KEEP_RESIDENT_DURING_CALL;
if (count>25)
{
warn(getDefFileName(),getDefLine(),
- "warning: Internal inconsistency: recursion detected in overload relation for member %s!"
+ "Internal inconsistency: recursion detected in overload relation for member %s!"
,qPrint(name())
);
return Normal;
}
- makeResident();
Specifier v = m_impl->virt;
MemberDef *rmd = reimplements();
while (rmd && v==Normal)
@@ -3341,9 +3393,10 @@ Specifier MemberDef::virtualness(int count) const
return v;
}
-void MemberDef::_writeTagData()
-{
- if (m_impl->tagDataWritten) return;
+void MemberDef::_writeTagData(const DefType compoundType)
+{
+ unsigned typeMask = 1 << compoundType;
+ if ((m_impl->tagDataWritten) & typeMask) return; // member already written for this type
static bool generateTagFile = !Config_getString("GENERATE_TAGFILE").isEmpty();
// write tag file information of this member
if (generateTagFile && isLinkableInProject())
@@ -3363,6 +3416,8 @@ void MemberDef::_writeTagData()
case MemberType_Friend: Doxygen::tagFile << "friend"; break;
case MemberType_DCOP: Doxygen::tagFile << "dcop"; break;
case MemberType_Slot: Doxygen::tagFile << "slot"; break;
+ case MemberType_Interface: Doxygen::tagFile << "interface"; break;
+ case MemberType_Service: Doxygen::tagFile << "service"; break;
}
if (m_impl->prot!=Public)
{
@@ -3386,6 +3441,11 @@ void MemberDef::_writeTagData()
Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
Doxygen::tagFile << " <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl;
Doxygen::tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>" << endl;
+ QCString idStr = id();
+ if (!idStr.isEmpty())
+ {
+ Doxygen::tagFile << " <clangid>" << convertToXML(idStr) << "</clangid>" << endl;
+ }
Doxygen::tagFile << " <arglist>" << convertToXML(argsString()) << "</arglist>" << endl;
writeDocAnchorsToTagFile();
Doxygen::tagFile << " </member>" << endl;
@@ -3406,19 +3466,24 @@ void MemberDef::_writeTagData()
Doxygen::tagFile << " <name>" << convertToXML(fmd->name()) << "</name>" << endl;
Doxygen::tagFile << " <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl;
Doxygen::tagFile << " <anchor>" << convertToXML(fmd->anchor()) << "</anchor>" << endl;
+ QCString idStr = fmd->id();
+ if (!idStr.isEmpty())
+ {
+ Doxygen::tagFile << " <clangid>" << convertToXML(idStr) << "</clangid>" << endl;
+ }
Doxygen::tagFile << " <arglist>" << convertToXML(fmd->argsString()) << "</arglist>" << endl;
Doxygen::tagFile << " </member>" << endl;
+ fmd->m_impl->tagDataWritten |= typeMask;
fmd->_addToSearchIndex();
}
}
}
}
- m_impl->tagDataWritten=TRUE;
+ m_impl->tagDataWritten |= typeMask;
}
void MemberDef::_computeIsConstructor()
{
- KEEP_RESIDENT_DURING_CALL;
m_isConstructorCached=1; // FALSE
if (m_impl->classDef)
{
@@ -3474,7 +3539,6 @@ bool MemberDef::isConstructor() const
void MemberDef::_computeIsDestructor()
{
- KEEP_RESIDENT_DURING_CALL;
bool isDestructor;
if (m_impl->isDMember) // for D
{
@@ -3514,10 +3578,9 @@ bool MemberDef::isDestructor() const
}
void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd)
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ const DefType compoundType)
{
- KEEP_RESIDENT_DURING_CALL;
-
int enumMemCount=0;
MemberList *fmdl=m_impl->enumFields;
@@ -3543,7 +3606,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
{
if (isLinkableInProject() || hasDocumentedEnumValues())
{
- _writeTagData();
+ _writeTagData(compoundType);
writeLink(typeDecl,cd,nd,fd,gd);
}
else
@@ -3590,7 +3653,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
if (fmd->hasDocumentation()) // enum value has docs
{
- fmd->_writeTagData();
+ fmd->_writeTagData(compoundType);
fmd->writeLink(typeDecl,cd,nd,fd,gd);
}
else // no docs for this enum value
@@ -3635,14 +3698,12 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
void MemberDef::setArgumentList(ArgumentList *al)
{
- makeResident();
if (m_impl->defArgList) delete m_impl->defArgList;
m_impl->defArgList = al;
}
void MemberDef::setDeclArgumentList(ArgumentList *al)
{
- makeResident();
if (m_impl->declArgList) delete m_impl->declArgList;
m_impl->declArgList = al;
}
@@ -3650,7 +3711,6 @@ void MemberDef::setDeclArgumentList(ArgumentList *al)
void MemberDef::setTypeConstraints(ArgumentList *al)
{
if (al==0) return;
- makeResident();
if (m_impl->typeConstraints) delete m_impl->typeConstraints;
m_impl->typeConstraints = new ArgumentList;
m_impl->typeConstraints->setAutoDelete(TRUE);
@@ -3664,33 +3724,28 @@ void MemberDef::setTypeConstraints(ArgumentList *al)
void MemberDef::setType(const char *t)
{
- makeResident();
m_impl->type = t;
}
void MemberDef::setAccessorType(ClassDef *cd,const char *t)
{
- makeResident();
m_impl->accessorClass = cd;
m_impl->accessorType = t;
}
void MemberDef::findSectionsInDocumentation()
{
- makeResident();
docFindSections(documentation(),this,0,docFile());
}
void MemberDef::enableCallGraph(bool e)
{
- makeResident();
m_impl->hasCallGraph=e;
if (e) Doxygen::parseSourcesNeeded = TRUE;
}
void MemberDef::enableCallerGraph(bool e)
{
- makeResident();
m_impl->hasCallerGraph=e;
if (e) Doxygen::parseSourcesNeeded = TRUE;
}
@@ -3698,7 +3753,6 @@ void MemberDef::enableCallerGraph(bool e)
#if 0
bool MemberDef::protectionVisible() const
{
- makeResident();
return m_impl->prot==Public ||
(m_impl->prot==Private && Config_getBool("EXTRACT_PRIVATE")) ||
(m_impl->prot==Protected && Config_getBool("EXTRACT_PROTECTED")) ||
@@ -3710,7 +3764,6 @@ bool MemberDef::protectionVisible() const
void MemberDef::setInbodyDocumentation(const char *docs,
const char *docFile,int docLine)
{
- makeResident();
m_impl->inbodyDocs = docs;
m_impl->inbodyDocs = m_impl->inbodyDocs.stripWhiteSpace();
m_impl->inbodyLine = docLine;
@@ -3720,21 +3773,18 @@ void MemberDef::setInbodyDocumentation(const char *docs,
bool MemberDef::isObjCMethod() const
{
- makeResident();
if (m_impl->classDef && m_impl->classDef->isObjectiveC() && isFunction()) return TRUE;
return FALSE;
}
bool MemberDef::isObjCProperty() const
{
- makeResident();
if (m_impl->classDef && m_impl->classDef->isObjectiveC() && isProperty()) return TRUE;
return FALSE;
}
QCString MemberDef::qualifiedName() const
{
- makeResident();
if (isObjCMethod())
{
QCString qm;
@@ -3755,7 +3805,6 @@ void MemberDef::setTagInfo(TagInfo *ti)
{
if (ti)
{
- makeResident();
//printf("%s: Setting tag name=%s anchor=%s\n",name().data(),ti->tagName.data(),ti->anchor.data());
m_impl->anc=ti->anchor;
setReference(ti->tagName);
@@ -3765,7 +3814,6 @@ void MemberDef::setTagInfo(TagInfo *ti)
QCString MemberDef::objCMethodName(bool localLink,bool showStatic) const
{
- makeResident();
QCString qm;
if (showStatic)
{
@@ -3783,623 +3831,578 @@ QCString MemberDef::objCMethodName(bool localLink,bool showStatic) const
const char *MemberDef::declaration() const
{
- makeResident();
return m_impl->decl;
}
const char *MemberDef::definition() const
{
- makeResident();
return m_impl->def;
}
const char *MemberDef::extraTypeChars() const
{
- makeResident();
return m_impl->extraTypeChars;
}
const char *MemberDef::typeString() const
{
- makeResident();
return m_impl->type;
}
const char *MemberDef::argsString() const
{
- makeResident();
return m_impl->args;
}
const char *MemberDef::excpString() const
{
- makeResident();
return m_impl->exception;
}
const char *MemberDef::bitfieldString() const
{
- makeResident();
return m_impl->bitfields;
}
const QCString &MemberDef::initializer() const
{
- makeResident();
return m_impl->initializer;
}
int MemberDef::initializerLines() const
{
- makeResident();
return m_impl->initLines;
}
-int MemberDef::getMemberSpecifiers() const
+uint64 MemberDef::getMemberSpecifiers() const
{
- makeResident();
return m_impl->memSpec;
}
ClassDef *MemberDef::getClassDef() const
{
- makeResident();
return m_impl->classDef;
}
FileDef *MemberDef::getFileDef() const
{
- makeResident();
return m_impl->fileDef;
}
NamespaceDef* MemberDef::getNamespaceDef() const
{
- makeResident();
return m_impl->nspace;
}
const char *MemberDef::getReadAccessor() const
{
- makeResident();
return m_impl->read;
}
const char *MemberDef::getWriteAccessor() const
{
- makeResident();
return m_impl->write;
}
GroupDef *MemberDef::getGroupDef() const
{
- makeResident();
return m_impl->group;
}
Grouping::GroupPri_t MemberDef::getGroupPri() const
{
- makeResident();
return m_impl->grouppri;
}
const char *MemberDef::getGroupFileName() const
{
- makeResident();
return m_impl->groupFileName;
}
int MemberDef::getGroupStartLine() const
{
- makeResident();
return m_impl->groupStartLine;
}
bool MemberDef::getGroupHasDocs() const
{
- makeResident();
return m_impl->groupHasDocs;
}
Protection MemberDef::protection() const
{
- makeResident();
return m_impl->prot;
}
MemberType MemberDef::memberType() const
{
- makeResident();
return m_impl->mtype;
}
bool MemberDef::isSignal() const
{
- makeResident();
return m_impl->mtype==MemberType_Signal;
}
bool MemberDef::isSlot() const
{
- makeResident();
return m_impl->mtype==MemberType_Slot;
}
bool MemberDef::isVariable() const
{
- makeResident();
return m_impl->mtype==MemberType_Variable;
}
bool MemberDef::isEnumerate() const
{
- makeResident();
return m_impl->mtype==MemberType_Enumeration;
}
bool MemberDef::isEnumValue() const
{
- makeResident();
return m_impl->mtype==MemberType_EnumValue;
}
bool MemberDef::isTypedef() const
{
- makeResident();
return m_impl->mtype==MemberType_Typedef;
}
bool MemberDef::isFunction() const
{
- makeResident();
return m_impl->mtype==MemberType_Function;
}
bool MemberDef::isFunctionPtr() const
{
- makeResident();
return m_impl->mtype==MemberType_Variable && QCString(argsString()).find(")(")!=-1;
}
bool MemberDef::isDefine() const
{
- makeResident();
return m_impl->mtype==MemberType_Define;
}
bool MemberDef::isFriend() const
{
- makeResident();
return m_impl->mtype==MemberType_Friend;
}
bool MemberDef::isDCOP() const
{
- makeResident();
return m_impl->mtype==MemberType_DCOP;
}
bool MemberDef::isProperty() const
{
- makeResident();
return m_impl->mtype==MemberType_Property;
}
bool MemberDef::isEvent() const
{
- makeResident();
return m_impl->mtype==MemberType_Event;
}
bool MemberDef::isRelated() const
{
- makeResident();
return m_impl->related == Related;
}
bool MemberDef::isForeign() const
{
- makeResident();
return m_impl->related == Foreign;
}
bool MemberDef::isStatic() const
{
- makeResident();
return m_impl->stat;
}
bool MemberDef::isInline() const
{
- makeResident();
return (m_impl->memSpec&Entry::Inline)!=0;
}
bool MemberDef::isExplicit() const
{
- makeResident();
return (m_impl->memSpec&Entry::Explicit)!=0;
}
bool MemberDef::isMutable() const
{
- makeResident();
return (m_impl->memSpec&Entry::Mutable)!=0;
}
bool MemberDef::isGettable() const
{
- makeResident();
return (m_impl->memSpec&Entry::Gettable)!=0;
}
bool MemberDef::isSettable() const
{
- makeResident();
return (m_impl->memSpec&Entry::Settable)!=0;
}
bool MemberDef::isAddable() const
{
- makeResident();
return (m_impl->memSpec&Entry::Addable)!=0;
}
bool MemberDef::isRemovable() const
{
- makeResident();
return (m_impl->memSpec&Entry::Removable)!=0;
}
bool MemberDef::isRaisable() const
{
- makeResident();
return (m_impl->memSpec&Entry::Raisable)!=0;
}
bool MemberDef::isReadable() const
{
- makeResident();
return (m_impl->memSpec&Entry::Readable)!=0;
}
bool MemberDef::isWritable() const
{
- makeResident();
return (m_impl->memSpec&Entry::Writable)!=0;
}
bool MemberDef::isFinal() const
{
- makeResident();
return (m_impl->memSpec&Entry::Final)!=0;
}
bool MemberDef::isNew() const
{
- makeResident();
return (m_impl->memSpec&Entry::New)!=0;
}
bool MemberDef::isSealed() const
{
- makeResident();
return (m_impl->memSpec&Entry::Sealed)!=0;
}
bool MemberDef::isOverride() const
{
- makeResident();
return (m_impl->memSpec&Entry::Override)!=0;
}
bool MemberDef::isInitonly() const
{
- makeResident();
return (m_impl->memSpec&Entry::Initonly)!=0;
}
bool MemberDef::isAbstract() const
{
- makeResident();
return (m_impl->memSpec&Entry::Abstract)!=0;
}
bool MemberDef::isOptional() const
{
- makeResident();
return (m_impl->memSpec&Entry::Optional)!=0;
}
bool MemberDef::isRequired() const
{
- makeResident();
return (m_impl->memSpec&Entry::Required)!=0;
}
bool MemberDef::isNonAtomic() const
{
- makeResident();
return (m_impl->memSpec&Entry::NonAtomic)!=0;
}
bool MemberDef::isCopy() const
{
- makeResident();
return (m_impl->memSpec&Entry::Copy)!=0;
}
bool MemberDef::isAssign() const
{
- makeResident();
return (m_impl->memSpec&Entry::Assign)!=0;
}
bool MemberDef::isRetain() const
{
- makeResident();
return (m_impl->memSpec&Entry::Retain)!=0;
}
bool MemberDef::isWeak() const
{
- makeResident();
return (m_impl->memSpec&Entry::Weak)!=0;
}
bool MemberDef::isStrong() const
{
- makeResident();
return (m_impl->memSpec&Entry::Strong)!=0;
}
bool MemberDef::isUnretained() const
{
- makeResident();
return (m_impl->memSpec&Entry::Unretained)!=0;
}
bool MemberDef::isAlias() const
{
- makeResident();
return (m_impl->memSpec&Entry::Alias)!=0;
}
bool MemberDef::isDefault() const
{
- makeResident();
return (m_impl->memSpec&Entry::Default)!=0;
}
bool MemberDef::isDelete() const
{
- makeResident();
return (m_impl->memSpec&Entry::Delete)!=0;
}
bool MemberDef::isNoExcept() const
{
- makeResident();
return (m_impl->memSpec&Entry::NoExcept)!=0;
}
+bool MemberDef::isAttribute() const
+{
+ return (m_impl->memSpec&Entry::Attribute)!=0;
+}
+
+bool MemberDef::isUNOProperty() const
+{
+ return (m_impl->memSpec&Entry::Property)!=0;
+}
+
+bool MemberDef::isReadonly() const
+{
+ return (m_impl->memSpec&Entry::Readonly)!=0;
+}
+
+bool MemberDef::isBound() const
+{
+ return (m_impl->memSpec&Entry::Bound)!=0;
+}
+
+bool MemberDef::isConstrained() const
+{
+ return (m_impl->memSpec&Entry::Constrained)!=0;
+}
+
+bool MemberDef::isTransient() const
+{
+ return (m_impl->memSpec&Entry::Transient)!=0;
+}
+
+bool MemberDef::isMaybeVoid() const
+{
+ return (m_impl->memSpec&Entry::MaybeVoid)!=0;
+}
+
+bool MemberDef::isMaybeDefault() const
+{
+ return (m_impl->memSpec&Entry::MaybeDefault)!=0;
+}
+
+bool MemberDef::isMaybeAmbiguous() const
+{
+ return (m_impl->memSpec&Entry::MaybeAmbiguous)!=0;
+}
+
+bool MemberDef::isPublished() const
+{
+ return (m_impl->memSpec&Entry::Published)!=0;
+}
bool MemberDef::isImplementation() const
{
- makeResident();
return m_impl->implOnly;
}
bool MemberDef::isExternal() const
{
- makeResident();
return m_impl->explExt;
}
bool MemberDef::isTemplateSpecialization() const
{
- makeResident();
return m_impl->tspec;
}
bool MemberDef::hasDocumentedParams() const
{
- makeResident();
return m_impl->hasDocumentedParams;
}
bool MemberDef::hasDocumentedReturnType() const
{
- makeResident();
return m_impl->hasDocumentedReturnType;
}
+bool MemberDef::showInCallGraph() const
+{
+ return isFunction() ||
+ isSlot() ||
+ isConstructor() ||
+ isDestructor() ||
+ isObjCMethod();
+}
+
ClassDef *MemberDef::relatedAlso() const
{
- makeResident();
return m_impl->relatedAlso;
}
bool MemberDef::hasDocumentedEnumValues() const
{
- makeResident();
return m_impl->docEnumValues;
}
MemberDef *MemberDef::getAnonymousEnumType() const
{
- makeResident();
return m_impl->annEnumType;
}
bool MemberDef::isDocsForDefinition() const
{
- makeResident();
return m_impl->docsForDefinition;
}
MemberDef *MemberDef::getEnumScope() const
{
- makeResident();
return m_impl->enumScope;
}
-LockingPtr<MemberList> MemberDef::enumFieldList() const
+MemberList *MemberDef::enumFieldList() const
{
- makeResident();
- return LockingPtr<MemberList>(this,m_impl->enumFields);
+ return m_impl->enumFields;
}
-LockingPtr<ExampleSDict> MemberDef::getExamples() const
+ExampleSDict *MemberDef::getExamples() const
{
- makeResident();
- return LockingPtr<ExampleSDict>(this,m_impl->exampleSDict);
+ return m_impl->exampleSDict;
}
bool MemberDef::isPrototype() const
{
- makeResident();
return m_impl->proto;
}
-LockingPtr<ArgumentList> MemberDef::argumentList() const
+ArgumentList *MemberDef::argumentList() const
{
- makeResident();
- return LockingPtr<ArgumentList>(this,m_impl->defArgList);
+ return m_impl->defArgList;
}
-LockingPtr<ArgumentList> MemberDef::declArgumentList() const
+ArgumentList *MemberDef::declArgumentList() const
{
- makeResident();
- return LockingPtr<ArgumentList>(this,m_impl->declArgList);
+ return m_impl->declArgList;
}
-LockingPtr<ArgumentList> MemberDef::templateArguments() const
+ArgumentList *MemberDef::templateArguments() const
{
- makeResident();
- return LockingPtr<ArgumentList>(this,m_impl->tArgList);
+ return m_impl->tArgList;
}
-LockingPtr< QList<ArgumentList> > MemberDef::definitionTemplateParameterLists() const
+QList<ArgumentList> *MemberDef::definitionTemplateParameterLists() const
{
- makeResident();
- return LockingPtr< QList<ArgumentList> >(this,m_impl->defTmpArgLists);
+ return m_impl->defTmpArgLists;
}
int MemberDef::getMemberGroupId() const
{
- makeResident();
return m_impl->grpId;
}
MemberGroup *MemberDef::getMemberGroup() const
{
- makeResident();
return m_impl->memberGroup;
}
bool MemberDef::fromAnonymousScope() const
{
- makeResident();
return m_impl->annScope;
}
bool MemberDef::anonymousDeclShown() const
{
- makeResident();
return m_impl->annUsed;
}
void MemberDef::setAnonymousUsed()
{
- makeResident();
m_impl->annUsed = TRUE;
}
bool MemberDef::hasCallGraph() const
{
- makeResident();
return m_impl->hasCallGraph;
}
bool MemberDef::hasCallerGraph() const
{
- makeResident();
return m_impl->hasCallerGraph;
}
MemberDef *MemberDef::templateMaster() const
{
- makeResident();
return m_impl->templateMaster;
}
bool MemberDef::isTypedefValCached() const
{
- makeResident();
return m_impl->isTypedefValCached;
}
ClassDef *MemberDef::getCachedTypedefVal() const
{
- makeResident();
return m_impl->cachedTypedefValue;
}
QCString MemberDef::getCachedTypedefTemplSpec() const
{
- makeResident();
return m_impl->cachedTypedefTemplSpec;
}
QCString MemberDef::getCachedResolvedTypedef() const
{
- makeResident();
//printf("MemberDef::getCachedResolvedTypedef()=%s m_impl=%p\n",m_impl->cachedResolvedType.data(),m_impl);
return m_impl->cachedResolvedType;
}
MemberDef *MemberDef::memberDefinition() const
{
- makeResident();
return m_impl->memDef;
}
MemberDef *MemberDef::memberDeclaration() const
{
- makeResident();
return m_impl->memDec;
}
MemberDef *MemberDef::inheritsDocsFrom() const
{
- makeResident();
return m_impl->docProvider;
}
MemberDef *MemberDef::getGroupAlias() const
{
- makeResident();
return m_impl->groupAlias;
}
void MemberDef::setMemberType(MemberType t)
{
- makeResident();
m_impl->mtype=t;
m_isLinkableCached = 0;
}
void MemberDef::setDefinition(const char *d)
{
- makeResident();
m_impl->def=d;
}
void MemberDef::setFileDef(FileDef *fd)
{
- makeResident();
m_impl->fileDef=fd;
m_isLinkableCached = 0;
m_isConstructorCached = 0;
@@ -4408,26 +4411,22 @@ void MemberDef::setFileDef(FileDef *fd)
void MemberDef::setProtection(Protection p)
{
- makeResident();
m_impl->prot=p;
m_isLinkableCached = 0;
}
-void MemberDef::setMemberSpecifiers(int s)
+void MemberDef::setMemberSpecifiers(uint64 s)
{
- makeResident();
m_impl->memSpec=s;
}
-void MemberDef::mergeMemberSpecifiers(int s)
+void MemberDef::mergeMemberSpecifiers(uint64 s)
{
- makeResident();
m_impl->memSpec|=s;
}
void MemberDef::setBitfields(const char *s)
{
- makeResident();
m_impl->bitfields = s;
}
@@ -4435,82 +4434,69 @@ void MemberDef::setMaxInitLines(int lines)
{
if (lines!=-1)
{
- makeResident();
m_impl->userInitLines=lines;
}
}
void MemberDef::setExplicitExternal(bool b)
{
- makeResident();
m_impl->explExt=b;
}
void MemberDef::setReadAccessor(const char *r)
{
- makeResident();
m_impl->read=r;
}
void MemberDef::setWriteAccessor(const char *w)
{
- makeResident();
m_impl->write=w;
}
void MemberDef::setTemplateSpecialization(bool b)
{
- makeResident();
m_impl->tspec=b;
}
void MemberDef::makeRelated()
{
- makeResident();
m_impl->related = Related;
m_isLinkableCached = 0;
}
void MemberDef::makeForeign()
{
- makeResident();
m_impl->related = Foreign;
m_isLinkableCached = 0;
}
void MemberDef::setHasDocumentedParams(bool b)
{
- makeResident();
m_impl->hasDocumentedParams = b;
}
void MemberDef::setHasDocumentedReturnType(bool b)
{
- makeResident();
m_impl->hasDocumentedReturnType = b;
}
void MemberDef::setInheritsDocsFrom(MemberDef *md)
{
- makeResident();
m_impl->docProvider = md;
}
void MemberDef::setArgsString(const char *as)
{
- makeResident();
m_impl->args = as;
}
void MemberDef::setRelatedAlso(ClassDef *cd)
{
- makeResident();
m_impl->relatedAlso=cd;
}
void MemberDef::setEnumClassScope(ClassDef *cd)
{
- makeResident();
m_impl->classDef = cd;
m_isLinkableCached = 0;
m_isConstructorCached = 0;
@@ -4518,123 +4504,103 @@ void MemberDef::setEnumClassScope(ClassDef *cd)
void MemberDef::setDocumentedEnumValues(bool value)
{
- makeResident();
m_impl->docEnumValues=value;
}
void MemberDef::setAnonymousEnumType(MemberDef *md)
{
- makeResident();
m_impl->annEnumType = md;
}
void MemberDef::setPrototype(bool p)
{
- makeResident();
m_impl->proto=p;
}
void MemberDef::setMemberGroupId(int id)
{
- makeResident();
m_impl->grpId=id;
}
void MemberDef::makeImplementationDetail()
{
- makeResident();
m_impl->implOnly=TRUE;
}
void MemberDef::setFromAnonymousScope(bool b)
{
- makeResident();
m_impl->annScope=b;
}
void MemberDef::setFromAnonymousMember(MemberDef *m)
{
- makeResident();
m_impl->annMemb=m;
}
void MemberDef::setTemplateMaster(MemberDef *mt)
{
- makeResident();
m_impl->templateMaster=mt;
m_isLinkableCached = 0;
}
void MemberDef::setDocsForDefinition(bool b)
{
- makeResident();
m_impl->docsForDefinition = b;
}
void MemberDef::setGroupAlias(MemberDef *md)
{
- makeResident();
m_impl->groupAlias = md;
}
void MemberDef::invalidateTypedefValCache()
{
- makeResident();
m_impl->isTypedefValCached=FALSE;
}
void MemberDef::setMemberDefinition(MemberDef *md)
{
- makeResident();
m_impl->memDef=md;
}
void MemberDef::setMemberDeclaration(MemberDef *md)
{
- makeResident();
m_impl->memDec=md;
}
ClassDef *MemberDef::category() const
{
- makeResident();
return m_impl->category;
}
void MemberDef::setCategory(ClassDef *def)
{
- makeResident();
m_impl->category = def;
}
MemberDef *MemberDef::categoryRelation() const
{
- makeResident();
return m_impl->categoryRelation;
}
void MemberDef::setCategoryRelation(MemberDef *md)
{
- makeResident();
m_impl->categoryRelation = md;
}
void MemberDef::setEnumBaseType(const QCString &type)
{
- makeResident();
m_impl->enumBaseType = type;
}
QCString MemberDef::enumBaseType() const
{
- makeResident();
return m_impl->enumBaseType;
}
void MemberDef::cacheTypedefVal(ClassDef*val, const QCString & templSpec, const QCString &resolvedType)
{
- makeResident();
m_impl->isTypedefValCached=TRUE;
m_impl->cachedTypedefValue=val;
m_impl->cachedTypedefTemplSpec=templSpec;
@@ -4644,10 +4610,9 @@ void MemberDef::cacheTypedefVal(ClassDef*val, const QCString & templSpec, const
void MemberDef::copyArgumentNames(MemberDef *bmd)
{
- makeResident();
{
- LockingPtr<ArgumentList> arguments = bmd->argumentList();
- if (m_impl->defArgList && arguments!=0)
+ ArgumentList *arguments = bmd->argumentList();
+ if (m_impl->defArgList && arguments)
{
ArgumentListIterator aliDst(*m_impl->defArgList);
ArgumentListIterator aliSrc(*arguments);
@@ -4659,8 +4624,8 @@ void MemberDef::copyArgumentNames(MemberDef *bmd)
}
}
{
- LockingPtr<ArgumentList> arguments = bmd->declArgumentList();
- if (m_impl->declArgList && arguments!=0)
+ ArgumentList *arguments = bmd->declArgumentList();
+ if (m_impl->declArgList && arguments)
{
ArgumentListIterator aliDst(*m_impl->declArgList);
ArgumentListIterator aliSrc(*arguments);
@@ -4688,295 +4653,10 @@ static void invalidateCachedTypesInArgumentList(ArgumentList *al)
void MemberDef::invalidateCachedArgumentTypes()
{
- makeResident();
invalidateCachedTypesInArgumentList(m_impl->defArgList);
invalidateCachedTypesInArgumentList(m_impl->declArgList);
}
-
-//-----------------------------------------------------------------
-
-void MemberDef::flushToDisk() const
-{
- if (isLocked()) return;
- MemberDef *that = (MemberDef*)this;
- that->m_storagePos = Doxygen::symbolStorage->alloc();
- //printf("%p: MemberDef::flushToDisk() m_impl=%p\n",this,m_impl);
- // write the definition base class member variables to disk
- Definition::flushToDisk();
-
- //printf("%p: flushing specific part\n",this);
-
- // write the memberdef member variables to disk
- marshalUInt(Doxygen::symbolStorage,START_MARKER);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->classDef);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->fileDef);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->nspace);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->enumScope);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->annEnumType);
- marshalMemberList (Doxygen::symbolStorage,m_impl->enumFields);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->redefines);
- marshalMemberList (Doxygen::symbolStorage,m_impl->redefinedBy);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->memDef);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->memDec);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->relatedAlso);
- marshalExampleSDict (Doxygen::symbolStorage,m_impl->exampleSDict);
- marshalQCString (Doxygen::symbolStorage,m_impl->type);
- marshalQCString (Doxygen::symbolStorage,m_impl->enumBaseType);
- marshalQCString (Doxygen::symbolStorage,m_impl->accessorType);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->accessorClass);
- marshalQCString (Doxygen::symbolStorage,m_impl->args);
- marshalQCString (Doxygen::symbolStorage,m_impl->def);
- marshalQCString (Doxygen::symbolStorage,m_impl->anc);
- marshalInt (Doxygen::symbolStorage,(int)m_impl->virt);
- marshalInt (Doxygen::symbolStorage,(int)m_impl->prot);
- marshalQCString (Doxygen::symbolStorage,m_impl->decl);
- marshalQCString (Doxygen::symbolStorage,m_impl->bitfields);
- marshalQCString (Doxygen::symbolStorage,m_impl->read);
- marshalQCString (Doxygen::symbolStorage,m_impl->write);
- marshalQCString (Doxygen::symbolStorage,m_impl->exception);
- marshalQCString (Doxygen::symbolStorage,m_impl->initializer);
- marshalQCString (Doxygen::symbolStorage,m_impl->extraTypeChars);
- marshalInt (Doxygen::symbolStorage,m_impl->initLines);
- marshalInt (Doxygen::symbolStorage,m_impl->memSpec);
- marshalInt (Doxygen::symbolStorage,(int)m_impl->mtype);
- marshalInt (Doxygen::symbolStorage,m_impl->maxInitLines);
- marshalInt (Doxygen::symbolStorage,m_impl->userInitLines);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->annMemb);
- marshalArgumentList (Doxygen::symbolStorage,m_impl->defArgList);
- marshalArgumentList (Doxygen::symbolStorage,m_impl->declArgList);
- marshalArgumentList (Doxygen::symbolStorage,m_impl->tArgList);
- marshalArgumentList (Doxygen::symbolStorage,m_impl->typeConstraints);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->templateMaster);
- marshalArgumentLists(Doxygen::symbolStorage,m_impl->defTmpArgLists);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->cachedAnonymousType);
- marshalMemberLists (Doxygen::symbolStorage,m_impl->classSectionSDict);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->groupAlias);
- marshalInt (Doxygen::symbolStorage,m_impl->grpId);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->memberGroup);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->group);
- marshalInt (Doxygen::symbolStorage,(int)m_impl->grouppri);
- marshalQCString (Doxygen::symbolStorage,m_impl->groupFileName);
- marshalInt (Doxygen::symbolStorage,m_impl->groupStartLine);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->groupMember);
- marshalBool (Doxygen::symbolStorage,m_impl->isTypedefValCached);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->cachedTypedefValue);
- marshalQCString (Doxygen::symbolStorage,m_impl->cachedTypedefTemplSpec);
- marshalQCString (Doxygen::symbolStorage,m_impl->cachedResolvedType);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->docProvider);
- marshalQCString (Doxygen::symbolStorage,m_impl->explicitOutputFileBase);
- marshalBool (Doxygen::symbolStorage,m_impl->implOnly);
- marshalBool (Doxygen::symbolStorage,m_impl->hasDocumentedParams);
- marshalBool (Doxygen::symbolStorage,m_impl->hasDocumentedReturnType);
- marshalBool (Doxygen::symbolStorage,m_impl->isDMember);
- marshalInt (Doxygen::symbolStorage,(int)m_impl->related);
- marshalBool (Doxygen::symbolStorage,m_impl->stat);
- marshalBool (Doxygen::symbolStorage,m_impl->proto);
- marshalBool (Doxygen::symbolStorage,m_impl->docEnumValues);
- marshalBool (Doxygen::symbolStorage,m_impl->annScope);
- marshalBool (Doxygen::symbolStorage,m_impl->annUsed);
- marshalBool (Doxygen::symbolStorage,m_impl->hasCallGraph);
- marshalBool (Doxygen::symbolStorage,m_impl->hasCallerGraph);
- marshalBool (Doxygen::symbolStorage,m_impl->explExt);
- marshalBool (Doxygen::symbolStorage,m_impl->tspec);
- marshalBool (Doxygen::symbolStorage,m_impl->groupHasDocs);
- marshalBool (Doxygen::symbolStorage,m_impl->docsForDefinition);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->category);
- marshalObjPointer (Doxygen::symbolStorage,m_impl->categoryRelation);
- marshalBool (Doxygen::symbolStorage,m_impl->tagDataWritten);
- marshalUInt(Doxygen::symbolStorage,END_MARKER);
-
- // function doesn't modify the object conceptually but compiler doesn't know this.
- delete that->m_impl;
- that->m_impl=0;
- that->m_flushPending=FALSE;
-}
-
-void MemberDef::loadFromDisk() const
-{
- MemberDef *that = (MemberDef *)this;
- if (isLocked())
- {
- //printf("%p: loadFromDisk() locked: so still in memory\n",this);
- assert(m_impl!=0);
- return;
- }
- assert(m_impl==0);
-
- Doxygen::symbolStorage->seek(m_storagePos);
- Definition::loadFromDisk();
-
- //printf("%p: loading specific part\n",this);
-
- that->m_impl = new MemberDefImpl;
- //printf("%p: MemberDef::loadFromDisk(): m_impl=%p\n",this,m_impl);
-
- uint marker = unmarshalUInt(Doxygen::symbolStorage);
- assert(marker==START_MARKER);
- m_impl->classDef = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->fileDef = (FileDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->nspace = (NamespaceDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->enumScope = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->annEnumType = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->enumFields = unmarshalMemberList (Doxygen::symbolStorage);
- m_impl->redefines = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->redefinedBy = unmarshalMemberList (Doxygen::symbolStorage);
- m_impl->memDef = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->memDec = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->relatedAlso = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->exampleSDict = unmarshalExampleSDict (Doxygen::symbolStorage);
- m_impl->type = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->enumBaseType = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->accessorType = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->accessorClass = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->args = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->def = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->anc = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->virt = (Specifier)unmarshalInt (Doxygen::symbolStorage);
- m_impl->prot = (Protection)unmarshalInt(Doxygen::symbolStorage);
- m_impl->decl = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->bitfields = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->read = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->write = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->exception = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->initializer = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->extraTypeChars = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->initLines = unmarshalInt (Doxygen::symbolStorage);
- m_impl->memSpec = unmarshalInt (Doxygen::symbolStorage);
- m_impl->mtype = (MemberType)unmarshalInt (Doxygen::symbolStorage);
- m_impl->maxInitLines = unmarshalInt (Doxygen::symbolStorage);
- m_impl->userInitLines = unmarshalInt (Doxygen::symbolStorage);
- m_impl->annMemb = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->defArgList = unmarshalArgumentList (Doxygen::symbolStorage);
- m_impl->declArgList = unmarshalArgumentList (Doxygen::symbolStorage);
- m_impl->tArgList = unmarshalArgumentList (Doxygen::symbolStorage);
- m_impl->typeConstraints = unmarshalArgumentList (Doxygen::symbolStorage);
- m_impl->templateMaster = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->defTmpArgLists = unmarshalArgumentLists(Doxygen::symbolStorage);
- m_impl->cachedAnonymousType = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->classSectionSDict = unmarshalMemberLists (Doxygen::symbolStorage);
- m_impl->groupAlias = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->grpId = unmarshalInt (Doxygen::symbolStorage);
- m_impl->memberGroup = (MemberGroup*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->group = (GroupDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->grouppri = (Grouping::GroupPri_t)unmarshalInt (Doxygen::symbolStorage);
- m_impl->groupFileName = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->groupStartLine = unmarshalInt (Doxygen::symbolStorage);
- m_impl->groupMember = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->isTypedefValCached = unmarshalBool (Doxygen::symbolStorage);
- m_impl->cachedTypedefValue = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->cachedTypedefTemplSpec = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->cachedResolvedType = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->docProvider = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->explicitOutputFileBase = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->implOnly = unmarshalBool (Doxygen::symbolStorage);
- m_impl->hasDocumentedParams = unmarshalBool (Doxygen::symbolStorage);
- m_impl->hasDocumentedReturnType = unmarshalBool (Doxygen::symbolStorage);
- m_impl->isDMember = unmarshalBool (Doxygen::symbolStorage);
- m_impl->related = (Relationship)unmarshalInt(Doxygen::symbolStorage);
- m_impl->stat = unmarshalBool (Doxygen::symbolStorage);
- m_impl->proto = unmarshalBool (Doxygen::symbolStorage);
- m_impl->docEnumValues = unmarshalBool (Doxygen::symbolStorage);
- m_impl->annScope = unmarshalBool (Doxygen::symbolStorage);
- m_impl->annUsed = unmarshalBool (Doxygen::symbolStorage);
- m_impl->hasCallGraph = unmarshalBool (Doxygen::symbolStorage);
- m_impl->hasCallerGraph = unmarshalBool (Doxygen::symbolStorage);
- m_impl->explExt = unmarshalBool (Doxygen::symbolStorage);
- m_impl->tspec = unmarshalBool (Doxygen::symbolStorage);
- m_impl->groupHasDocs = unmarshalBool (Doxygen::symbolStorage);
- m_impl->docsForDefinition = unmarshalBool (Doxygen::symbolStorage);
- m_impl->category = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->categoryRelation = (MemberDef*)unmarshalObjPointer (Doxygen::symbolStorage);
- m_impl->tagDataWritten = unmarshalBool (Doxygen::symbolStorage);
- marker = unmarshalUInt(Doxygen::symbolStorage);
- assert(marker==END_MARKER);
-
- //printf("%p: MemberDef::loadFromDisk(): sorting\n",this);
-}
-
-void MemberDef::makeResident() const
-{
- if (Doxygen::symbolCache==0) return;
- if (m_cacheHandle==-1) // not yet in cache
- {
- MemberDef *victim = 0;
- MemberDef *that = (MemberDef*)this; // fake method constness
- that->m_cacheHandle = Doxygen::symbolCache->add(that,(void **)&victim);
- //printf("adding %s to cache, handle=%d\n",m_impl->name.data(),that->m_cacheHandle);
- if (victim) // cache was full, victim was the least recently used item and has to go
- {
- //printf("%p: makeResident(): cache full %p::saveToDisk(): m_impl=%p\n",this,victim,victim->m_impl);
- victim->m_cacheHandle=-1; // invalidate cache handle
- victim->saveToDisk(); // store the item on disk
- }
- else // cache not yet full
- {
- //printf("Adding %s to cache, handle=%d\n",m_impl->name.data(),m_cacheHandle);
- }
- if (m_storagePos!=-1) // already been written to disk
- {
- if (isLocked()) // locked in memory
- {
- assert(m_impl!=0);
- that->m_flushPending=FALSE; // no need to flush anymore
- }
- else // not locked in memory
- {
- assert(m_impl==0);
- loadFromDisk();
- }
- }
- }
- else // already cached, make this object the most recently used.
- {
- assert(m_impl!=0);
- //printf("Touching symbol %s\n",m_impl->name.data());
- Doxygen::symbolCache->use(m_cacheHandle);
- }
-}
-
-void MemberDef::saveToDisk() const
-{
- assert(m_impl!=0);
- MemberDef *that = (MemberDef *)this;
- //printf("%p: saveToDisk(): m_impl=%p\n",this,m_impl);
- if (isLocked()) // cannot flush the item as it is locked
- {
- that->m_flushPending=TRUE; // flush when unlocked
- }
- else // ready to flush the item to disk
- {
- //printf("Adding %s to cache, handle=%d by replacing %s\n",
- // m_impl->name.data(),m_cacheHandle,victim->m_impl->name.data());
- if (m_storagePos!=-1)
- // if victim was stored on disk already and is not locked
- {
- // free the storage space occupied by the old store item
- Doxygen::symbolStorage->release(m_storagePos); // free up space for others
- }
- // write a the new (possibly modified) instance to disk
- flushToDisk();
- // end to write sequence (unless nothing was written due to the lock)
- Doxygen::symbolStorage->end();
- }
-}
-
-void MemberDef::lock() const
-{
-}
-
-void MemberDef::unlock() const
-{
- if (m_flushPending && !isLocked())
- {
- //printf("%p: flush after unlock\n",this);
- // write a the new (possibly modified) instance to disk
- flushToDisk();
- // end to write sequence (unless nothing was written due to the lock)
- Doxygen::symbolStorage->end();
- }
-}
-
//----------------
QCString MemberDef::displayName(bool) const
@@ -5050,10 +4730,10 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
// mdef, mdef ? mdef->name().data() : "",
// mdec, mdec ? mdec->name().data() : "");
- LockingPtr<ArgumentList> mdefAl = mdef->argumentList();
- LockingPtr<ArgumentList> mdecAl = mdec->argumentList();
- if (matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdefAl.pointer(),
- mdec->getOuterScope(),mdec->getFileDef(),mdecAl.pointer(),
+ ArgumentList *mdefAl = mdef->argumentList();
+ ArgumentList *mdecAl = mdec->argumentList();
+ if (matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdefAl,
+ mdec->getOuterScope(),mdec->getFileDef(),mdecAl,
TRUE
)
) /* match found */
@@ -5065,7 +4745,7 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
// );
// first merge argument documentation
- transferArgumentDocumentation(mdecAl.pointer(),mdefAl.pointer());
+ transferArgumentDocumentation(mdecAl,mdefAl);
/* copy documentation between function definition and declaration */
if (!mdec->briefDescription().isEmpty())
@@ -5078,27 +4758,27 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
}
if (!mdef->documentation().isEmpty())
{
- //printf("transfering docs mdef->mdec (%s->%s)\n",mdef->argsString(),mdec->argsString());
+ //printf("transferring docs mdef->mdec (%s->%s)\n",mdef->argsString(),mdec->argsString());
mdec->setDocumentation(mdef->documentation(),mdef->docFile(),mdef->docLine());
mdec->setDocsForDefinition(mdef->isDocsForDefinition());
if (mdefAl!=0)
{
ArgumentList *mdefAlComb = new ArgumentList;
stringToArgumentList(mdef->argsString(),mdefAlComb);
- transferArgumentDocumentation(mdefAl.pointer(),mdefAlComb);
+ transferArgumentDocumentation(mdefAl,mdefAlComb);
mdec->setArgumentList(mdefAlComb);
}
}
else if (!mdec->documentation().isEmpty())
{
- //printf("transfering docs mdec->mdef (%s->%s)\n",mdec->argsString(),mdef->argsString());
+ //printf("transferring docs mdec->mdef (%s->%s)\n",mdec->argsString(),mdef->argsString());
mdef->setDocumentation(mdec->documentation(),mdec->docFile(),mdec->docLine());
mdef->setDocsForDefinition(mdec->isDocsForDefinition());
if (mdecAl!=0)
{
ArgumentList *mdecAlComb = new ArgumentList;
stringToArgumentList(mdec->argsString(),mdecAlComb);
- transferArgumentDocumentation(mdecAl.pointer(),mdecAlComb);
+ transferArgumentDocumentation(mdecAl,mdecAlComb);
mdef->setDeclArgumentList(mdecAlComb);
}
}
@@ -5165,3 +4845,4 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef)
}
}
+
diff --git a/src/memberdef.h b/src/memberdef.h
index 8727302..8c88f7c 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -44,7 +44,7 @@ class MemberDef : public Definition
{
public:
- MemberDef(const char *defFileName,int defLine,
+ MemberDef(const char *defFileName,int defLine,int defColumn,
const char *type,const char *name,const char *args,
const char *excp,Protection prot,Specifier virt,bool stat,
Relationship related,MemberType t,const ArgumentList *tal,
@@ -73,7 +73,7 @@ class MemberDef : public Definition
const char *extraTypeChars() const;
const QCString &initializer() const;
int initializerLines() const;
- int getMemberSpecifiers() const;
+ uint64 getMemberSpecifiers() const;
MemberList *getSectionList(Definition *d) const;
// scope query members
@@ -148,6 +148,16 @@ class MemberDef : public Definition
bool isDefault() const;
bool isDelete() const;
bool isNoExcept() const;
+ bool isAttribute() const; // UNO IDL attribute
+ bool isUNOProperty() const; // UNO IDL property
+ bool isReadonly() const;
+ bool isBound() const;
+ bool isConstrained() const;
+ bool isTransient() const;
+ bool isMaybeVoid() const;
+ bool isMaybeDefault() const;
+ bool isMaybeAmbiguous() const;
+ bool isPublished() const; // UNO IDL published
bool isTemplateSpecialization() const;
bool hasDocumentedParams() const;
bool hasDocumentedReturnType() const;
@@ -158,6 +168,7 @@ class MemberDef : public Definition
bool hasOneLineInitializer() const;
bool hasMultiLineInitializer() const;
bool protectionVisible() const;
+ bool showInCallGraph() const;
// output info
bool isLinkableInProject() const;
@@ -171,7 +182,7 @@ class MemberDef : public Definition
bool isDocumentedFriendClass() const;
MemberDef *reimplements() const;
- LockingPtr< MemberList > reimplementedBy() const;
+ MemberList *reimplementedBy() const;
bool isReimplementedBy(ClassDef *cd) const;
//int inbodyLine() const;
@@ -184,19 +195,19 @@ class MemberDef : public Definition
MemberDef *getAnonymousEnumType() const;
bool isDocsForDefinition() const;
MemberDef *getEnumScope() const;
- LockingPtr< MemberList > enumFieldList() const;
+ MemberList *enumFieldList() const;
void setEnumBaseType(const QCString &type);
QCString enumBaseType() const;
bool hasExamples();
- LockingPtr<ExampleSDict> getExamples() const;
+ ExampleSDict *getExamples() const;
bool isPrototype() const;
// argument related members
- LockingPtr<ArgumentList> argumentList() const;
- LockingPtr<ArgumentList> declArgumentList() const;
- LockingPtr<ArgumentList> templateArguments() const;
- LockingPtr< QList<ArgumentList> > definitionTemplateParameterLists() const;
+ ArgumentList *argumentList() const;
+ ArgumentList *declArgumentList() const;
+ ArgumentList *templateArguments() const;
+ QList<ArgumentList> *definitionTemplateParameterLists() const;
// member group related members
int getMemberGroupId() const;
@@ -240,8 +251,8 @@ class MemberDef : public Definition
void setFileDef(FileDef *fd);
void setAnchor();
void setProtection(Protection p);
- void setMemberSpecifiers(int s);
- void mergeMemberSpecifiers(int s);
+ void setMemberSpecifiers(uint64 s);
+ void mergeMemberSpecifiers(uint64 s);
void setInitializer(const char *i);
void setBitfields(const char *s);
void setMaxInitLines(int lines);
@@ -274,7 +285,7 @@ class MemberDef : public Definition
// enumeration specific members
void insertEnumField(MemberDef *md);
- void setEnumScope(MemberDef *md);
+ void setEnumScope(MemberDef *md,bool livesInsideEnum=FALSE);
void setEnumClassScope(ClassDef *cd);
void setDocumentedEnumValues(bool value);
void setAnonymousEnumType(MemberDef *md);
@@ -341,14 +352,16 @@ class MemberDef : public Definition
// output generation
void writeDeclaration(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
- bool inGroup,ClassDef *inheritFrom=0,const char *inheritId=0);
+ bool inGroup, const DefType compoundType,
+ ClassDef *inheritFrom=0,const char *inheritId=0);
void writeDocumentation(MemberList *ml,OutputList &ol,
const char *scopeName,Definition *container,
bool inGroup,bool showEnumValues=FALSE,bool
showInline=FALSE);
void writeMemberDocSimple(OutputList &ol,Definition *container);
void writeEnumDeclaration(OutputList &typeDecl,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ const DefType compoundType);
void warnIfUndocumented();
MemberDef *createTemplateInstanceMember(ArgumentList *formalArgs,
@@ -380,7 +393,7 @@ class MemberDef : public Definition
const QCString &cfname,const QCString &ciname,
const QCString &cname);
void _writeCategoryRelation(OutputList &ol);
- void _writeTagData();
+ void _writeTagData(const DefType);
void _addToSearchIndex();
static int s_indentLevel;
@@ -393,9 +406,6 @@ class MemberDef : public Definition
bool onlyText=FALSE);
MemberDefImpl *m_impl;
- int m_cacheHandle;
- off_t m_storagePos; // location where the item is stored in file (if impl==0)
- bool m_flushPending;
uchar m_isLinkableCached; // 0 = not cached, 1=FALSE, 2=TRUE
uchar m_isConstructorCached; // 0 = not cached, 1=FALSE, 2=TRUE
uchar m_isDestructorCached; // 0 = not cached, 1=FALSE, 2=TRUE
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index e7ce2b5..2df4a89 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -112,7 +112,7 @@ void MemberGroup::writeDeclarations(OutputList &ol,
//printf("MemberGroup::writeDeclarations() %s\n",grpHeader.data());
QCString ldoc = doc;
if (!ldoc.isEmpty()) ldoc.prepend("<a name=\""+anchor()+"\" id=\""+anchor()+"\"></a>");
- memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,ldoc,FALSE,showInline);
+ memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,ldoc,DefinitionIntf::TypeGroup,FALSE,showInline);
}
void MemberGroup::writePlainDeclarations(OutputList &ol,
@@ -121,7 +121,7 @@ void MemberGroup::writePlainDeclarations(OutputList &ol,
)
{
//printf("MemberGroup::writePlainDeclarations() memberList->count()=%d\n",memberList->count());
- memberList->writePlainDeclarations(ol,cd,nd,fd,gd,inheritedFrom,inheritId);
+ memberList->writePlainDeclarations(ol,cd,nd,fd,gd,DefinitionIntf::TypeGroup,inheritedFrom,inheritId);
}
void MemberGroup::writeDocumentation(OutputList &ol,const char *scopeName,
@@ -150,7 +150,7 @@ void MemberGroup::addGroupedInheritedMembers(OutputList &ol,ClassDef *cd,
{
MemberList ml(lt);
ml.append(md);
- ml.writePlainDeclarations(ol,cd,0,0,0,inheritedFrom,inheritId);
+ ml.writePlainDeclarations(ol,cd,0,0,0,DefinitionIntf::TypeGroup,inheritedFrom,inheritId);
}
}
}
diff --git a/src/membergroup.h b/src/membergroup.h
index 84b7d32..64a521b 100644
--- a/src/membergroup.h
+++ b/src/membergroup.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index 5a36ef8..76ffff1 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -31,6 +31,7 @@
#include "filedef.h"
#include "membergroup.h"
#include "config.h"
+#include "docparser.h"
MemberList::MemberList()
{
@@ -67,7 +68,7 @@ int MemberList::compareItems(QCollection::Item item1, QCollection::Item item2)
else if (ord2 > ord1)
return 1;
}
- int cmp = stricmp(c1->name(),c2->name());
+ int cmp = qstricmp(c1->name(),c2->name());
return cmp!=0 ? cmp : c1->getDefLine()-c2->getDefLine();
}
@@ -136,6 +137,9 @@ void MemberList::countDecMembers(bool countEnumValues,GroupDef *gd)
case MemberType_Event: // fall through
case MemberType_Property: m_varCnt++,m_numDecMembers++;
break;
+// apparently necessary to get this to show up in declarations section?
+ case MemberType_Interface: // fall through
+ case MemberType_Service: // fall through
case MemberType_Function: // fall through
case MemberType_Signal: // fall through
case MemberType_DCOP: // fall through
@@ -157,7 +161,7 @@ void MemberList::countDecMembers(bool countEnumValues,GroupDef *gd)
case MemberType_Friend: m_friendCnt++,m_numDecMembers++;
break;
default:
- err("Error: Unknown member type found for member `%s'\n!",md->name().data());
+ err("Unknown member type found for member `%s'\n!",md->name().data());
}
}
}
@@ -250,6 +254,8 @@ bool MemberList::declVisible() const
case MemberType_Slot: // fall through
case MemberType_DCOP: // fall through
case MemberType_Property: // fall through
+ case MemberType_Interface: // fall through
+ case MemberType_Service: // fall through
case MemberType_Event:
return TRUE;
case MemberType_Enumeration:
@@ -296,7 +302,8 @@ bool MemberList::declVisible() const
}
void MemberList::writePlainDeclarations(OutputList &ol,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,
+ GroupDef *gd, const DefinitionIntf::DefType compoundType,
ClassDef *inheritedFrom,const char *inheritId
)
{
@@ -333,10 +340,12 @@ void MemberList::writePlainDeclarations(OutputList &ol,
case MemberType_Slot: // fall through
case MemberType_DCOP: // fall through
case MemberType_Property: // fall through
+ case MemberType_Interface: // fall through
+ case MemberType_Service: // fall through
case MemberType_Event:
{
if (first) ol.startMemberList(),first=FALSE;
- md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,inheritedFrom,inheritId);
+ md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,compoundType,inheritedFrom,inheritId);
break;
}
case MemberType_Enumeration:
@@ -373,28 +382,33 @@ void MemberList::writePlainDeclarations(OutputList &ol,
ol.startMemberItem(md->anchor(),0,inheritId);
ol.writeString("enum ");
ol.insertMemberAlign();
- md->writeEnumDeclaration(ol,cd,nd,fd,gd);
+ md->writeEnumDeclaration(ol,cd,nd,fd,gd,compoundType);
ol.endMemberItem();
if (!md->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
- ol.startMemberDescription(md->anchor());
- ol.parseDoc(
+ DocRoot *rootNode = validatingParseDoc(
md->briefFile(),md->briefLine(),
cd,md,
md->briefDescription(),
TRUE,FALSE,0,TRUE,FALSE
);
- if (md->isDetailedSectionLinkable())
+ if (rootNode && !rootNode->isEmpty())
{
- ol.disableAllBut(OutputGenerator::Html);
- ol.docify(" ");
- ol.startTextLink(md->getOutputFileBase(),
- md->anchor());
- ol.parseText(theTranslator->trMore());
- ol.endTextLink();
- ol.enableAll();
+ ol.startMemberDescription(md->anchor());
+ ol.writeDoc(rootNode,cd,md);
+ if (md->isDetailedSectionLinkable())
+ {
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.docify(" ");
+ ol.startTextLink(md->getOutputFileBase(),
+ md->anchor());
+ ol.parseText(theTranslator->trMore());
+ ol.endTextLink();
+ ol.enableAll();
+ }
+ ol.endMemberDescription();
}
- ol.endMemberDescription();
+ delete rootNode;
}
ol.endMemberDeclaration(md->anchor(),inheritId);
}
@@ -409,7 +423,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
ol.startMemberList();
first=FALSE;
}
- md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,inheritedFrom,inheritId);
+ md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,compoundType,inheritedFrom,inheritId);
break;
}
case MemberType_EnumValue:
@@ -418,7 +432,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
{
//printf("EnumValue!\n");
if (first) ol.startMemberList(),first=FALSE;
- md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,inheritedFrom,inheritId);
+ md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,compoundType,inheritedFrom,inheritId);
}
}
break;
@@ -444,7 +458,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
ol.startMemberList();
first=FALSE;
}
- md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
+ md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,compoundType);
}
md->setFromAnonymousScope(TRUE);
}
@@ -468,6 +482,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
* @param gd non-null if this list is part of group documentation.
* @param title Title to use for the member list.
* @param subtitle Sub title to use for the member list.
+ * @param compoundType Container type for this member list.
* @param showEnumValues Obsolete, always set to FALSE.
* @param showInline if set to TRUE if title is rendered differently
* @param inheritedFrom if not 0, the list is shown inside the
@@ -476,7 +491,8 @@ void MemberList::writePlainDeclarations(OutputList &ol,
*/
void MemberList::writeDeclarations(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
- const char *title,const char *subtitle, bool showEnumValues,
+ const char *title,const char *subtitle,
+ const DefinitionIntf::DefType compoundType,bool showEnumValues,
bool showInline,ClassDef *inheritedFrom)
{
(void)showEnumValues; // unused
@@ -543,7 +559,7 @@ void MemberList::writeDeclarations(OutputList &ol,
if (!st.isEmpty())
{
ol.startMemberSubtitle();
- ol.parseDoc("[generated]",-1,ctx,0,subtitle,FALSE,FALSE,0,FALSE,FALSE);
+ ol.generateDoc("[generated]",-1,ctx,0,subtitle,FALSE,FALSE,0,FALSE,FALSE);
ol.endMemberSubtitle();
}
}
@@ -562,7 +578,7 @@ void MemberList::writeDeclarations(OutputList &ol,
}
else
{
- writePlainDeclarations(ol,cd,nd,fd,gd,inheritedFrom,inheritId);
+ writePlainDeclarations(ol,cd,nd,fd,gd,compoundType,inheritedFrom,inheritId);
}
//printf("memberGroupList=%p\n",memberGroupList);
@@ -586,7 +602,7 @@ void MemberList::writeDeclarations(OutputList &ol,
{
//printf("Member group has docs!\n");
ol.startMemberGroupDocs();
- ol.parseDoc("[generated]",-1,ctx,0,mg->documentation()+"\n",FALSE,FALSE);
+ ol.generateDoc("[generated]",-1,ctx,0,mg->documentation()+"\n",FALSE,FALSE);
ol.endMemberGroupDocs();
}
ol.startMemberGroup();
@@ -747,8 +763,8 @@ void MemberList::addListReferences(Definition *def)
if (md->getGroupDef()==0 || def->definitionType()==Definition::TypeGroup)
{
md->addListReference(def);
- LockingPtr<MemberList> enumFields = md->enumFieldList();
- if (md->memberType()==MemberType_Enumeration && enumFields!=0)
+ MemberList *enumFields = md->enumFieldList();
+ if (md->memberType()==MemberType_Enumeration && enumFields)
{
//printf(" Adding enum values!\n");
MemberListIterator vmli(*enumFields);
@@ -889,6 +905,8 @@ QCString MemberList::listTypeAsString() const
case MemberListType_dcopMethods: return "dcop-methods";
case MemberListType_properties: return "properties";
case MemberListType_events: return "events";
+ case MemberListType_interfaces: return "interfaces";
+ case MemberListType_services: return "services";
case MemberListType_decDefineMembers: return "define-members";
case MemberListType_decProtoMembers: return "proto-members";
case MemberListType_decTypedefMembers: return "typedef-members";
@@ -926,7 +944,7 @@ int MemberSDict::compareItems(QCollection::Item item1, QCollection::Item item2)
MemberDef *c1=(MemberDef *)item1;
MemberDef *c2=(MemberDef *)item2;
//printf("MemberSDict::compareItems(%s,%s)\n",c1->name().data(),c2->name().data());
- int cmp = stricmp(c1->name(),c2->name());
+ int cmp = qstricmp(c1->name(),c2->name());
if (cmp)
{
return cmp;
diff --git a/src/memberlist.h b/src/memberlist.h
index a047300..ce5a3d2 100644
--- a/src/memberlist.h
+++ b/src/memberlist.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -56,11 +56,12 @@ class MemberList : public QList<MemberDef>
void countDocMembers(bool countEnumValues=FALSE);
int countInheritableMembers(ClassDef *inheritedFrom) const;
void writePlainDeclarations(OutputList &ol,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+ ClassDef *cd,NamespaceDef *nd,FileDef *fd,
+ GroupDef *gd,const DefinitionIntf::DefType compoundType,
ClassDef *inheritedFrom,const char *inheritId);
void writeDeclarations(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
- const char *title,const char *subtitle,
+ const char *title,const char *subtitle,const DefinitionIntf::DefType compoundType,
bool showEnumValues=FALSE,bool showInline=FALSE,
ClassDef *inheritedFrom=0);
void writeDocumentation(OutputList &ol,const char *scopeName,
diff --git a/src/membername.cpp b/src/membername.cpp
index 324db7f..58eaf8c 100644
--- a/src/membername.cpp
+++ b/src/membername.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -39,9 +39,9 @@ int MemberName::compareItems(QCollection::Item item1, QCollection::Item item2)
FileDef *f1=m1->getFileDef();
FileDef *f2=m2->getFileDef();
if (c1 && c2)
- return strcmp(c1->name(),c2->name());
+ return qstrcmp(c1->name(),c2->name());
else if (f1 && f2)
- return strcmp(f1->name(),f2->name());
+ return qstrcmp(f1->name(),f2->name());
else
return 0;
}
@@ -61,9 +61,9 @@ int MemberNameInfo::compareItems(QCollection::Item item1, QCollection::Item item
FileDef *f1=m1->memberDef->getFileDef();
FileDef *f2=m2->memberDef->getFileDef();
if (c1 && c2)
- return strcmp(c1->name(),c2->name());
+ return qstrcmp(c1->name(),c2->name());
else if (f1 && f2)
- return strcmp(f1->name(),f2->name());
+ return qstrcmp(f1->name(),f2->name());
else
return 0;
}
@@ -76,7 +76,7 @@ int MemberNameSDict::compareItems(QCollection::Item item1, QCollection::Item ite
{
MemberName *n1=(MemberName *)item1;
MemberName *n2=(MemberName *)item2;
- return stricmp(n1->memberName()+getPrefixIndex(n1->memberName()),
+ return qstricmp(n1->memberName()+getPrefixIndex(n1->memberName()),
n2->memberName()+getPrefixIndex(n2->memberName())
);
}
diff --git a/src/membername.h b/src/membername.h
index 2abcbf3..0004aea 100644
--- a/src/membername.h
+++ b/src/membername.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -94,7 +94,7 @@ class MemberNameInfoSDict : public SDict<MemberNameInfo>
MemberNameInfoSDict(int size) : SDict<MemberNameInfo>(size) {}
~MemberNameInfoSDict() {}
int compareItems(QCollection::Item item1,QCollection::Item item2)
- { return stricmp(
+ { return qstricmp(
((MemberNameInfo *)item1)->memberName(),
((MemberNameInfo *)item2)->memberName()
);
diff --git a/src/message.cpp b/src/message.cpp
index ed438bb..dd1f05c 100644
--- a/src/message.cpp
+++ b/src/message.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -26,6 +26,8 @@
#include "filedef.h"
static QCString outputFormat;
+static const char *warning_str = "Warning: ";
+static const char *error_str = "Error: ";
//static int warnFormatOrder; // 1 = $file,$line,$text
// // 2 = $text,$line,$file
// // 3 = $line,$text,$file
@@ -149,11 +151,17 @@ static void format_warn(const char *file,int line,const char *text)
fwrite(msgText.data(),1,msgText.length(),warnFile);
}
-static void do_warn(const char *tag, const char *file, int line, const char *fmt, va_list args)
+static void do_warn(const char *tag, const char *file, int line, const char *prefix, const char *fmt, va_list args)
{
if (!Config_getBool(tag)) return; // warning type disabled
char text[4096];
- vsnprintf(text, 4096, fmt, args);
+ int l=0;
+ if (prefix)
+ {
+ strcpy(text,prefix);
+ l=strlen(prefix);
+ }
+ vsnprintf(text+l, 4096-l, fmt, args);
text[4095]='\0';
format_warn(file,line,text);
}
@@ -162,21 +170,21 @@ void warn(const char *file,int line,const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
- do_warn("WARNINGS", file, line, fmt, args);
+ do_warn("WARNINGS", file, line, warning_str, fmt, args);
va_end(args);
}
void warn_simple(const char *file,int line,const char *text)
{
if (!Config_getBool("WARNINGS")) return; // warning type disabled
- format_warn(file,line,text);
+ format_warn(file,line,QCString(warning_str) + text);
}
void warn_undoc(const char *file,int line,const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
- do_warn("WARN_IF_UNDOCUMENTED", file, line, fmt, args);
+ do_warn("WARN_IF_UNDOCUMENTED", file, line, warning_str, fmt, args);
va_end(args);
}
@@ -184,14 +192,22 @@ void warn_doc_error(const char *file,int line,const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
- do_warn("WARN_IF_DOC_ERROR", file, line, fmt, args);
+ do_warn("WARN_IF_DOC_ERROR", file, line, warning_str, fmt, args);
va_end(args);
}
+void warn_uncond(const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(warnFile, (QCString(warning_str) + fmt).data(), args);
+ va_end(args);
+}
+
void err(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
- vfprintf(warnFile, fmt, args);
+ vfprintf(warnFile, (QCString(error_str) + fmt).data(), args);
va_end(args);
}
diff --git a/src/message.h b/src/message.h
index 46b736c..e01b8be 100644
--- a/src/message.h
+++ b/src/message.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -25,6 +25,7 @@ extern void warn(const char *file,int line,const char *fmt, ...);
extern void warn_simple(const char *file,int line,const char *text);
extern void warn_undoc(const char *file,int line,const char *fmt, ...);
extern void warn_doc_error(const char *file,int line,const char *fmt, ...);
+extern void warn_uncond(const char *fmt, ...);
extern void err(const char *fmt, ...);
void initWarningFormat();
diff --git a/src/msc.cpp b/src/msc.cpp
index fadbc0c..f9b069e 100644
--- a/src/msc.cpp
+++ b/src/msc.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -34,7 +34,7 @@ static bool convertMapFile(QTextStream &t,const char *mapName,const QCString rel
QFile f(mapName);
if (!f.open(IO_ReadOnly))
{
- err("error: failed to open map file %s for inclusion in the docs!\n"
+ err("failed to open map file %s for inclusion in the docs!\n"
"If you installed Graphviz/dot after a previous failing run, \n"
"try deleting the output directory and rerun doxygen.\n",mapName);
return FALSE;
@@ -50,7 +50,7 @@ static bool convertMapFile(QTextStream &t,const char *mapName,const QCString rel
int numBytes = f.readLine(buf,maxLineLen);
buf[numBytes-1]='\0';
//printf("ReadLine `%s'\n",buf);
- if (strncmp(buf,"rect",4)==0)
+ if (qstrncmp(buf,"rect",4)==0)
{
// obtain the url and the coordinates in the order used by graphviz-1.5
sscanf(buf,"rect %s %d,%d %d,%d",url,&x1,&y1,&x2,&y2);
@@ -136,7 +136,7 @@ void writeMscGraphFromFile(const char *inFile,const char *outDir,
portable_sysTimerStart();
if (portable_system("epstopdf",epstopdfArgs)!=0)
{
- err("error: Problems running epstopdf. Check your TeX installation!\n");
+ err("Problems running epstopdf. Check your TeX installation!\n");
}
portable_sysTimerStop();
}
diff --git a/src/msc.h b/src/msc.h
index 98beb56..711e3de 100644
--- a/src/msc.h
+++ b/src/msc.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index c57c7ca..cfca6d6 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -33,10 +33,12 @@
//------------------------------------------------------------------
-NamespaceDef::NamespaceDef(const char *df,int dl,
+NamespaceDef::NamespaceDef(const char *df,int dl,int dc,
const char *name,const char *lref,
- const char *fName) :
- Definition(df,dl,name)
+ const char *fName, const char*type,
+ bool isPublished) :
+ Definition(df,dl,dc,name)
+ ,m_isPublished(isPublished)
{
if (fName)
{
@@ -58,6 +60,18 @@ NamespaceDef::NamespaceDef(const char *df,int dl,
memberGroupSDict->setAutoDelete(TRUE);
visited=FALSE;
m_subGrouping=Config_getBool("SUBGROUPING");
+ if (type && !strcmp("module", type))
+ {
+ m_type = MODULE;
+ }
+ else if (type && !strcmp("constants", type))
+ {
+ m_type = CONSTANT_GROUP;
+ }
+ else
+ {
+ m_type = NAMESPACE;
+ }
}
NamespaceDef::~NamespaceDef()
@@ -254,7 +268,7 @@ void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title
ol.startTextBlock();
if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
{
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+ ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
}
if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
!documentation().isEmpty())
@@ -270,7 +284,7 @@ void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title
}
if (!documentation().isEmpty())
{
- ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+ ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
}
ol.endTextBlock();
}
@@ -280,25 +294,30 @@ void NamespaceDef::writeBriefDescription(OutputList &ol)
{
if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
- ol.startParagraph();
- ol.parseDoc(briefFile(),briefLine(),this,0,
- briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::RTF);
- ol.writeString(" \n");
- ol.enable(OutputGenerator::RTF);
-
- if (Config_getBool("REPEAT_BRIEF") ||
- !documentation().isEmpty()
- )
+ DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
+ briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+ if (rootNode && !rootNode->isEmpty())
{
- ol.disableAllBut(OutputGenerator::Html);
- ol.startTextLink(0,"details");
- ol.parseText(theTranslator->trMore());
- ol.endTextLink();
+ ol.startParagraph();
+ ol.writeDoc(rootNode,this,0);
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::RTF);
+ ol.writeString(" \n");
+ ol.enable(OutputGenerator::RTF);
+
+ if (Config_getBool("REPEAT_BRIEF") ||
+ !documentation().isEmpty()
+ )
+ {
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.startTextLink(0,"details");
+ ol.parseText(theTranslator->trMore());
+ ol.endTextLink();
+ }
+ ol.popGeneratorState();
+ ol.endParagraph();
}
- ol.popGeneratorState();
- ol.endParagraph();
+ delete rootNode;
// FIXME:PARA
//ol.pushGeneratorState();
@@ -347,9 +366,10 @@ void NamespaceDef::writeInlineClasses(OutputList &ol)
if (classSDict) classSDict->writeDocumentation(ol,this);
}
-void NamespaceDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title)
+void NamespaceDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title,
+ bool const isConstantGroup)
{
- if (namespaceSDict) namespaceSDict->writeDeclaration(ol,title,TRUE);
+ if (namespaceSDict) namespaceSDict->writeDeclaration(ol,title,isConstantGroup,TRUE);
}
void NamespaceDef::writeMemberGroups(OutputList &ol)
@@ -421,6 +441,20 @@ void NamespaceDef::writeSummaryLinks(OutputList &ol)
ol.popGeneratorState();
}
+void NamespaceDef::addNamespaceAttributes(OutputList &ol)
+{
+ // UNO IDL constant groups may be published
+ if (getLanguage()==SrcLangExt_IDL && isConstantGroup() && m_isPublished)
+ {
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ ol.startLabels();
+ ol.writeLabel("published",false);
+ ol.endLabels();
+ ol.popGeneratorState();
+ }
+}
+
void NamespaceDef::writeDocumentation(OutputList &ol)
{
static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
@@ -437,6 +471,12 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{
pageTitle = theTranslator->trModuleReference(displayName());
}
+ else if (lang==SrcLangExt_IDL)
+ {
+ pageTitle = isConstantGroup()
+ ? theTranslator->trConstantGroupReference(displayName())
+ : theTranslator->trModuleReference(displayName());
+ }
else
{
pageTitle = theTranslator->trNamespaceReference(displayName());
@@ -455,6 +495,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
startTitle(ol,getOutputFileBase(),this);
ol.parseText(pageTitle);
addGroupListToTitle(ol,this);
+ addNamespaceAttributes(ol);
endTitle(ol,getOutputFileBase(),displayName());
ol.startContents();
@@ -470,6 +511,11 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
Doxygen::tagFile << " <compound kind=\"namespace\">" << endl;
Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
+ QCString idStr = id();
+ if (!idStr.isEmpty())
+ {
+ Doxygen::tagFile << " <clangid>" << convertToXML(idStr) << "</clangid>" << endl;
+ }
}
Doxygen::indexList->addIndexItem(this,0);
@@ -498,9 +544,15 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
case LayoutDocEntry::NamespaceNestedNamespaces:
{
LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
- writeNamespaceDeclarations(ol,ls->title(lang));
+ writeNamespaceDeclarations(ol,ls->title(lang),false);
}
break;
+ case LayoutDocEntry::NamespaceNestedConstantGroups:
+ {
+ LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+ writeNamespaceDeclarations(ol,ls->title(lang),true);
+ }
+ break;
case LayoutDocEntry::MemberGroups:
writeMemberGroups(ol);
break;
@@ -546,6 +598,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
case LayoutDocEntry::ClassInlineClasses:
case LayoutDocEntry::FileClasses:
case LayoutDocEntry::FileNamespaces:
+ case LayoutDocEntry::FileConstantGroups:
case LayoutDocEntry::FileIncludes:
case LayoutDocEntry::FileIncludeGraph:
case LayoutDocEntry::FileIncludedByGraph:
@@ -720,8 +773,8 @@ void NamespaceDef::addListReferences()
{
//bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
{
- LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
- addRefItem(xrefItems.pointer(),
+ QList<ListItemInfo> *xrefItems = xrefListItems();
+ addRefItem(xrefItems,
qualifiedName(),
getLanguage()==SrcLangExt_Fortran ?
theTranslator->trModule(TRUE,TRUE) :
@@ -825,7 +878,8 @@ bool NamespaceSDict::declVisible() const
return FALSE;
}
-void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool localName)
+void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,
+ bool const isConstantGroup,bool localName)
{
@@ -839,7 +893,27 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool loca
bool found=FALSE;
for (ni.toFirst();(nd=ni.current()) && !found;++ni)
{
- if (nd->isLinkable()) found=TRUE;
+ if (nd->isLinkable())
+ {
+ SrcLangExt lang = nd->getLanguage();
+ if (SrcLangExt_IDL==lang)
+ {
+ if (isConstantGroup == nd->isConstantGroup())
+ {
+ found=TRUE;
+ break;
+ }
+ }
+ else if (!isConstantGroup) // ensure we only get extra section in IDL
+ {
+ if (nd->isConstantGroup())
+ {
+ err("Internal inconsistency: constant group but not IDL?");
+ }
+ found=TRUE;
+ break;
+ }
+ }
}
if (!found) return; // no linkable namespaces in the list
@@ -855,6 +929,8 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool loca
if (nd->isLinkable())
{
SrcLangExt lang = nd->getLanguage();
+ if (lang==SrcLangExt_IDL && (isConstantGroup != nd->isConstantGroup()))
+ continue; // will be output in another pass, see layout_default.xml
ol.startMemberDeclaration();
ol.startMemberItem(nd->getOutputFileBase(),0);
if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp)
@@ -865,9 +941,20 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool loca
{
ol.docify("module ");
}
- else
+ else if (lang==SrcLangExt_IDL)
{
- ol.docify("namespace ");
+ if (nd->isModule())
+ {
+ ol.docify("module ");
+ }
+ else if (nd->isConstantGroup())
+ {
+ ol.docify("constants");
+ }
+ else
+ {
+ err("Internal inconsistency: namespace in IDL not module or cg");
+ }
}
ol.insertMemberAlign();
QCString name;
@@ -888,7 +975,7 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool loca
if (!nd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
{
ol.startMemberDescription(nd->getOutputFileBase());
- ol.parseDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE,0,TRUE);
+ ol.generateDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE,0,TRUE);
ol.endMemberDescription();
}
ol.endMemberDeclaration(0,0);
@@ -965,7 +1052,7 @@ MemberList *NamespaceDef::getMemberList(MemberListType lt) const
void NamespaceDef::writeMemberDeclarations(OutputList &ol,MemberListType lt,const QCString &title)
{
MemberList * ml = getMemberList(lt);
- if (ml) ml->writeDeclarations(ol,0,this,0,0,title,0);
+ if (ml) ml->writeDeclarations(ol,0,this,0,0,title,0,DefinitionIntf::TypeNamespace);
}
void NamespaceDef::writeMemberDocumentation(OutputList &ol,MemberListType lt,const QCString &title)
diff --git a/src/namespacedef.h b/src/namespacedef.h
index 8458a78..ff64107 100644
--- a/src/namespacedef.h
+++ b/src/namespacedef.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -37,9 +37,10 @@ class NamespaceSDict;
class NamespaceDef : public Definition
{
public:
- NamespaceDef(const char *defFileName,int defLine,
+ NamespaceDef(const char *defFileName,int defLine,int defColumn,
const char *name,const char *ref=0,
- const char *refFile=0);
+ const char *refFile=0,const char*type=0,
+ bool isPublished=false);
~NamespaceDef();
DefType definitionType() const { return TypeNamespace; }
QCString getOutputFileBase() const;
@@ -63,7 +64,10 @@ class NamespaceDef : public Definition
void combineUsingRelations();
QCString displayName(bool=TRUE) const;
QCString localName() const;
-
+
+ bool isConstantGroup() const { return CONSTANT_GROUP == m_type; }
+ bool isModule() const { return MODULE == m_type; }
+
bool isLinkableInProject() const;
bool isLinkable() const;
void addMembersToMemberGroup();
@@ -101,12 +105,14 @@ class NamespaceDef : public Definition
void endMemberDeclarations(OutputList &ol);
void writeClassDeclarations(OutputList &ol,const QCString &title);
void writeInlineClasses(OutputList &ol);
- void writeNamespaceDeclarations(OutputList &ol,const QCString &title);
+ void writeNamespaceDeclarations(OutputList &ol,const QCString &title,
+ bool isConstantGroup=false);
void writeMemberGroups(OutputList &ol);
void writeAuthorSection(OutputList &ol);
void startMemberDocumentation(OutputList &ol);
void endMemberDocumentation(OutputList &ol);
void writeSummaryLinks(OutputList &ol);
+ void addNamespaceAttributes(OutputList &ol);
QCString fileName;
QStrList files;
@@ -121,6 +127,8 @@ class NamespaceDef : public Definition
ClassSDict *classSDict;
NamespaceSDict *namespaceSDict;
bool m_subGrouping;
+ enum { NAMESPACE, MODULE, CONSTANT_GROUP } m_type;
+ bool m_isPublished;
};
/** A list of NamespaceDef objects. */
@@ -130,7 +138,7 @@ class NamespaceList : public QList<NamespaceDef>
~NamespaceList() {}
int compareItems(QCollection::Item item1,QCollection::Item item2)
{
- return stricmp(((NamespaceDef *)item1)->name(),
+ return qstricmp(((NamespaceDef *)item1)->name(),
((NamespaceDef *)item2)->name()
);
}
@@ -160,11 +168,12 @@ class NamespaceSDict : public SDict<NamespaceDef>
~NamespaceSDict() {}
int compareItems(QCollection::Item item1,QCollection::Item item2)
{
- return stricmp(((NamespaceDef *)item1)->name(),
+ return qstricmp(((NamespaceDef *)item1)->name(),
((NamespaceDef *)item2)->name()
);
}
- void writeDeclaration(OutputList &ol,const char *title,bool localName=FALSE);
+ void writeDeclaration(OutputList &ol,const char *title,
+ bool isConstantGroup=false, bool localName=FALSE);
bool declVisible() const;
};
diff --git a/src/objcache.cpp b/src/objcache.cpp
index 4258397..989811a 100644
--- a/src/objcache.cpp
+++ b/src/objcache.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -19,6 +19,9 @@
#include <assert.h>
#include <qglobal.h>
#include "objcache.h"
+#if !defined(_OS_WIN32_)
+#include <stdint.h>
+#endif
//----------------------------------------------------------------------
@@ -189,7 +192,7 @@ unsigned int ObjCache::hash(void *addr)
else
{
// Thomas Wang's 32 bit Mix Function
- unsigned long key = (unsigned long)addr;
+ uintptr_t key = (uintptr_t)addr;
key += ~(key << 15);
key ^= (key >> 10);
key += (key << 3);
diff --git a/src/objcache.h b/src/objcache.h
index 71e7178..d93c1f6 100644
--- a/src/objcache.h
+++ b/src/objcache.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/outputgen.cpp b/src/outputgen.cpp
index 13b6e62..89686e0 100644
--- a/src/outputgen.cpp
+++ b/src/outputgen.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/outputgen.h b/src/outputgen.h
index 8d67e3d..2a959e4 100644
--- a/src/outputgen.h
+++ b/src/outputgen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -71,8 +71,6 @@ class CodeOutputInterface
virtual void startFontClass(const char *) = 0;
virtual void endFontClass() = 0;
virtual void writeCodeAnchor(const char *name) = 0;
- virtual void linkableSymbol(int line,const char *symName,
- Definition *symDef,Definition *context) = 0;
virtual void setCurrentDoc(Definition *context,const char *anchor,bool isSourceFile) = 0;
virtual void addWord(const char *word,bool hiPriority) = 0;
};
@@ -98,7 +96,7 @@ class BaseOutputDocInterface : public CodeOutputInterface
Examples
};
- virtual void parseText(const QCString &) {}
+ virtual bool parseText(const QCString &s) { return s.isEmpty(); }
/*! Start of a bullet list: e.g. \c \<ul\> in html. startItemListItem() is
* Used for the bullet items.
@@ -406,6 +404,7 @@ class OutputGenerator : public BaseOutputDocInterface
virtual void endParameterName(bool,bool,bool) = 0;
virtual void startParameterList(bool) = 0;
virtual void endParameterList() = 0;
+ virtual void exceptionEntry(const char*,bool) = 0;
virtual void startConstraintList(const char *) = 0;
virtual void startConstraintParam() = 0;
diff --git a/src/outputlist.cpp b/src/outputlist.cpp
index 5ea2a21..2928400 100644
--- a/src/outputlist.cpp
+++ b/src/outputlist.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -130,14 +130,14 @@ void OutputList::popGeneratorState()
}
}
-void OutputList::parseDoc(const char *fileName,int startLine,
+bool OutputList::generateDoc(const char *fileName,int startLine,
Definition *ctx,MemberDef * md,
const QCString &docStr,bool indexWords,
bool isExample,const char *exampleName,
bool singleLine,bool linkFromIndex)
{
int count=0;
- if (docStr.isEmpty()) return;
+ if (docStr.isEmpty()) return TRUE;
OutputGenerator *og=outputs->first();
while (og)
@@ -145,23 +145,25 @@ void OutputList::parseDoc(const char *fileName,int startLine,
if (og->isEnabled()) count++;
og=outputs->next();
}
- if (count==0) return; // no output formats enabled.
+ if (count==0) return TRUE; // no output formats enabled.
- DocNode *root=0;
- if (docStr.at(docStr.length()-1)=='\n')
- {
- root = validatingParseDoc(fileName,startLine,
- ctx,md,docStr,indexWords,isExample,exampleName,
- singleLine,linkFromIndex);
- }
- else
- {
- root = validatingParseDoc(fileName,startLine,
- ctx,md,docStr+"\n",indexWords,isExample,exampleName,
- singleLine,linkFromIndex);
- }
+ DocRoot *root=0;
+ root = validatingParseDoc(fileName,startLine,
+ ctx,md,docStr,indexWords,isExample,exampleName,
+ singleLine,linkFromIndex);
- og=outputs->first();
+ writeDoc(root,ctx,md);
+
+ bool isEmpty = root->isEmpty();
+
+ delete root;
+
+ return isEmpty;
+}
+
+void OutputList::writeDoc(DocRoot *root,Definition *ctx,MemberDef *md)
+{
+ OutputGenerator *og=outputs->first();
while (og)
{
//printf("og->printDoc(extension=%s)\n",
@@ -171,11 +173,9 @@ void OutputList::parseDoc(const char *fileName,int startLine,
}
VhdlDocGen::setFlowMember(0);
-
- delete root;
}
-void OutputList::parseText(const QCString &textStr)
+bool OutputList::parseText(const QCString &textStr)
{
int count=0;
OutputGenerator *og=outputs->first();
@@ -184,9 +184,9 @@ void OutputList::parseText(const QCString &textStr)
if (og->isEnabled()) count++;
og=outputs->next();
}
- if (count==0) return; // no output formats enabled.
+ if (count==0) return TRUE; // no output formats enabled.
- DocNode *root = validatingParseText(textStr);
+ DocText *root = validatingParseText(textStr);
og=outputs->first();
while (og)
@@ -195,7 +195,11 @@ void OutputList::parseText(const QCString &textStr)
og=outputs->next();
}
+ bool isEmpty = root->isEmpty();
+
delete root;
+
+ return isEmpty;
}
diff --git a/src/outputlist.h b/src/outputlist.h
index 23221d3..b328056 100644
--- a/src/outputlist.h
+++ b/src/outputlist.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -42,6 +42,7 @@ class DotInclDepGraph;
class DotGfxHierarchyTable;
class SectionDict;
class DotGroupCollaboration;
+class DocRoot;
/** Class representing a list of output generators that are written to
* in parallel.
@@ -69,11 +70,12 @@ class OutputList : public OutputDocInterface
// OutputDocInterface implementation
//////////////////////////////////////////////////
- void parseDoc(const char *fileName,int startLine,
- Definition *ctx,MemberDef *md,const QCString &docStr,
- bool indexWords,bool isExample,const char *exampleName=0,
- bool singleLine=FALSE,bool linkFromIndex=FALSE);
- void parseText(const QCString &textStr);
+ bool generateDoc(const char *fileName,int startLine,
+ Definition *ctx,MemberDef *md,const QCString &docStr,
+ bool indexWords,bool isExample,const char *exampleName=0,
+ bool singleLine=FALSE,bool linkFromIndex=FALSE);
+ void writeDoc(DocRoot *root,Definition *ctx,MemberDef *md);
+ bool parseText(const QCString &textStr);
void startIndexSection(IndexSections is)
@@ -422,6 +424,8 @@ class OutputList : public OutputDocInterface
{ forall(&OutputGenerator::startParameterList,openBracket); }
void endParameterList()
{ forall(&OutputGenerator::endParameterList); }
+ void exceptionEntry(const char* prefix,bool closeBracket)
+ { forall(&OutputGenerator::exceptionEntry,prefix,closeBracket); }
void startConstraintList(const char *header)
{ forall(&OutputGenerator::startConstraintList,header); }
@@ -493,9 +497,6 @@ class OutputList : public OutputDocInterface
og=outputs->next();
}
}
- void linkableSymbol(int,const char *,Definition *,Definition *) {}
-
-
private:
void debug();
diff --git a/src/pagedef.cpp b/src/pagedef.cpp
index 7fc4639..e93b3fd 100644
--- a/src/pagedef.cpp
+++ b/src/pagedef.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -28,7 +28,7 @@
PageDef::PageDef(const char *f,int l,const char *n,
const char *d,const char *t)
- : Definition(f,l,n), m_title(t)
+ : Definition(f,l,1,n), m_title(t)
{
setDocumentation(d,f,l);
m_subPageDict = new PageSDict(7);
@@ -49,7 +49,7 @@ void PageDef::findSectionsInDocumentation()
GroupDef *PageDef::getGroupDef() const
{
- LockingPtr<GroupList> groups = partOfGroups();
+ GroupList *groups = partOfGroups();
return groups!=0 ? groups->getFirst() : 0;
}
@@ -90,8 +90,9 @@ void PageDef::writeDocumentation(OutputList &ol)
static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
//outputList->disable(OutputGenerator::Man);
- QCString pageName;
- pageName=escapeCharsInString(name(),FALSE,TRUE);
+ QCString pageName,manPageName;
+ pageName = escapeCharsInString(name(),FALSE,TRUE);
+ manPageName = escapeCharsInString(name(),TRUE,TRUE);
//printf("PageDef::writeDocumentation: %s\n",getOutputFileBase().data());
@@ -110,7 +111,15 @@ void PageDef::writeDocumentation(OutputList &ol)
ol.enable(OutputGenerator::Html);
}
+ ol.pushGeneratorState();
+ //2.{
+ ol.disableAllBut(OutputGenerator::Man);
+ startFile(ol,getOutputFileBase(),manPageName,title(),HLI_Pages,!generateTreeView);
+ ol.enableAll();
+ ol.disable(OutputGenerator::Man);
startFile(ol,getOutputFileBase(),pageName,title(),HLI_Pages,!generateTreeView);
+ ol.popGeneratorState();
+ //2.}
if (!generateTreeView)
{
@@ -126,11 +135,11 @@ void PageDef::writeDocumentation(OutputList &ol)
ol.pushGeneratorState();
//2.{
ol.disableAllBut(OutputGenerator::Man);
- ol.startTitleHead(pageName);
- ol.endTitleHead(pageName, pageName);
+ ol.startTitleHead(manPageName);
+ ol.endTitleHead(manPageName, manPageName);
if (si)
{
- ol.parseDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
ol.endSection(si->label,si->type);
}
ol.popGeneratorState();
@@ -146,7 +155,7 @@ void PageDef::writeDocumentation(OutputList &ol)
{
//ol.startSection(si->label,si->title,si->type);
startTitle(ol,getOutputFileBase(),this);
- ol.parseDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
//stringToSearchIndex(getOutputFileBase(),
// theTranslator->trPage(TRUE,TRUE)+" "+si->title,
// si->title);
@@ -179,10 +188,10 @@ void PageDef::writeDocumentation(OutputList &ol)
if (!Config_getString("GENERATE_TAGFILE").isEmpty())
{
- bool found=FALSE;
+ bool found = name()=="citelist";
QDictIterator<RefList> rli(*Doxygen::xrefLists);
RefList *rl;
- for (rli.toFirst();(rl=rli.current());++rli)
+ for (rli.toFirst();(rl=rli.current()) && !found;++rli)
{
if (rl->listName()==name())
{
@@ -214,7 +223,7 @@ void PageDef::writePageDocumentation(OutputList &ol)
}
ol.startTextBlock();
- ol.parseDoc(
+ ol.generateDoc(
docFile(), // fileName
docLine(), // startLine
this, // context
@@ -265,16 +274,11 @@ void PageDef::writePageDocumentation(OutputList &ol)
bool PageDef::visibleInIndex() const
{
- static bool allExternals = Config_getBool("ALLEXTERNALS");
+ static bool externalPages = Config_getBool("EXTERNAL_PAGES");
return // not part of a group
!getGroupDef() &&
// not an externally defined page
- (!isReference() || allExternals)
- // &&
- // not a subpage
- //(getOuterScope()==0 ||
- // getOuterScope()->definitionType()!=Definition::TypePage
- //)
+ (!isReference() || externalPages)
;
}
diff --git a/src/pagedef.h b/src/pagedef.h
index b73ed3b..4670ecd 100644
--- a/src/pagedef.h
+++ b/src/pagedef.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -84,7 +84,7 @@ class PageSDict : public SDict<PageDef>
virtual ~PageSDict() {}
int compareItems(QCollection::Item i1,QCollection::Item i2)
{
- return stricmp(((PageDef *)i1)->name(),((PageDef *)i2)->name());
+ return qstricmp(((PageDef *)i1)->name(),((PageDef *)i2)->name());
}
};
diff --git a/src/parserintf.h b/src/parserintf.h
index 7211274..0274c13 100644
--- a/src/parserintf.h
+++ b/src/parserintf.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -19,6 +19,7 @@
#define PARSERINTF_H
#include <qdict.h>
+#include <qstrlist.h>
class Entry;
class FileDef;
@@ -36,15 +37,37 @@ class ParserInterface
{
public:
virtual ~ParserInterface() {}
+
+ /** Starts processing a translation unit (source files + headers).
+ * After this call parseInput() is called with sameTranslationUnit
+ * set to FALSE. If parseInput() returns additional include files,
+ * these are also processed using parseInput() with
+ * sameTranslationUnit set to TRUE. After that
+ * finishTranslationUnit() is called.
+ */
+ virtual void startTranslationUnit(const char *fileName) = 0;
+
+ /** Called after all files in a translation unit have been
+ * processed.
+ */
+ virtual void finishTranslationUnit() = 0;
+
/** Parses a single input file with the goal to build an Entry tree.
* @param[in] fileName The full name of the file.
* @param[in] fileBuf The contents of the file (zero terminated).
* @param[in,out] root The root of the tree of Entry *nodes
* representing the information extracted from the file.
+ * @param[in] sameTranslationUnit TRUE if this file was found in the same
+ * translation unit (in the filesInSameTranslationUnit list
+ * returned for another file).
+ * @param[in,out] filesInSameTranslationUnit other files expected to be
+ * found in the same translation unit (used for libclang)
*/
virtual void parseInput(const char *fileName,
const char *fileBuf,
- Entry *root) = 0;
+ Entry *root,
+ bool sameTranslationUnit,
+ QStrList &filesInSameTranslationUnit) = 0;
/** Returns TRUE if the language identified by \a extension needs
* the C preprocessor to be run before feed the result to the input
diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp
index 2a80f8f..9257df0 100644
--- a/src/perlmodgen.cpp
+++ b/src/perlmodgen.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
* Authors: Dimitri van Heesch, Miguel Lobo.
*
* Permission to use, copy, modify, and distribute this software and its
@@ -642,7 +642,7 @@ void PerlModDocVisitor::visit(DocSymbol *sy)
case DocSymbol::RightCeil: symbol = "rceil"; break;
case DocSymbol::LeftFloor: symbol = "lfloor"; break;
case DocSymbol::RightFloor: symbol = "rfloor"; break;
- case DocSymbol::Unknown: err("error: unknown symbol found\n");
+ case DocSymbol::Unknown: err("unknown symbol found\n");
break;
}
if (c != 0)
@@ -718,14 +718,15 @@ void PerlModDocVisitor::visit(DocVerbatim *s)
m_output.add("</programlisting>");
#endif
return;
- case DocVerbatim::Verbatim: type = "preformatted"; break;
- case DocVerbatim::HtmlOnly: type = "htmlonly"; break;
- case DocVerbatim::RtfOnly: type = "rtfonly"; break;
- case DocVerbatim::ManOnly: type = "manonly"; break;
+ case DocVerbatim::Verbatim: type = "preformatted"; break;
+ case DocVerbatim::HtmlOnly: type = "htmlonly"; break;
+ case DocVerbatim::RtfOnly: type = "rtfonly"; break;
+ case DocVerbatim::ManOnly: type = "manonly"; break;
case DocVerbatim::LatexOnly: type = "latexonly"; break;
- case DocVerbatim::XmlOnly: type = "xmlonly"; break;
- case DocVerbatim::Dot: type = "dot"; break;
- case DocVerbatim::Msc: type = "msc"; break;
+ case DocVerbatim::XmlOnly: type = "xmlonly"; break;
+ case DocVerbatim::DocbookOnly: type = "docbookonly"; break;
+ case DocVerbatim::Dot: type = "dot"; break;
+ case DocVerbatim::Msc: type = "msc"; break;
}
openItem(type);
m_output.addFieldQuotedString("content", s->text());
@@ -909,7 +910,7 @@ void PerlModDocVisitor::visitPre(DocSimpleSect *s)
case DocSimpleSect::User: type = "par"; break;
case DocSimpleSect::Rcs: type = "rcs"; break;
case DocSimpleSect::Unknown:
- err("error: unknown simple section found\n");
+ err("unknown simple section found\n");
break;
}
leaveText();
@@ -1282,7 +1283,7 @@ void PerlModDocVisitor::visitPre(DocParamSect *s)
case DocParamSect::Exception: type = "exceptions"; break;
case DocParamSect::TemplateParam: type = "templateparam"; break;
case DocParamSect::Unknown:
- err("error: unknown parameter section found\n");
+ err("unknown parameter section found\n");
break;
}
openOther();
@@ -1574,6 +1575,8 @@ void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *)
case MemberType_DCOP: memType="dcop"; isFunc=TRUE; break;
case MemberType_Slot: memType="slot"; isFunc=TRUE; break;
case MemberType_Event: memType="event"; break;
+ case MemberType_Interface: memType="interface"; break;
+ case MemberType_Service: memType="service"; break;
}
m_output.openHash()
@@ -1589,16 +1592,16 @@ void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *)
md->memberType()!=MemberType_Enumeration)
m_output.addFieldQuotedString("type", md->typeString());
- LockingPtr<ArgumentList> al = md->argumentList();
+ ArgumentList *al = md->argumentList();
if (isFunc) //function
{
m_output.addFieldBoolean("const", al!=0 && al->constSpecifier)
.addFieldBoolean("volatile", al!=0 && al->volatileSpecifier);
m_output.openList("parameters");
- LockingPtr<ArgumentList> declAl = md->declArgumentList();
- LockingPtr<ArgumentList> defAl = md->argumentList();
- if (declAl!=0 && declAl->count()>0)
+ ArgumentList *declAl = md->declArgumentList();
+ ArgumentList *defAl = md->argumentList();
+ if (declAl && declAl->count()>0)
{
ArgumentListIterator declAli(*declAl);
ArgumentListIterator defAli(*defAl);
@@ -1659,8 +1662,8 @@ void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *)
if (md->memberType()==MemberType_Enumeration) // enum
{
- LockingPtr<MemberList> enumFields = md->enumFieldList();
- if (enumFields!=0)
+ MemberList *enumFields = md->enumFieldList();
+ if (enumFields)
{
m_output.openList("values");
MemberListIterator emli(*enumFields);
@@ -1689,8 +1692,8 @@ void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *)
.addFieldQuotedString("name", rmd->name())
.closeHash();
- LockingPtr<MemberList> rbml = md->reimplementedBy();
- if (rbml!=0)
+ MemberList *rbml = md->reimplementedBy();
+ if (rbml)
{
MemberListIterator mli(*rbml);
m_output.openList("reimplemented_by");
@@ -2255,13 +2258,13 @@ bool PerlModGenerator::createOutputDir(QDir &perlModDir)
dir.setPath(QDir::currentDirPath());
if (!dir.mkdir(outputDirectory))
{
- err("error: tag OUTPUT_DIRECTORY: Output directory `%s' does not "
+ err("tag OUTPUT_DIRECTORY: Output directory `%s' does not "
"exist and cannot be created\n",outputDirectory.data());
exit(1);
}
- else if (!Config_getBool("QUIET"))
+ else
{
- err("notice: Output directory `%s' does not exist. "
+ msg("Notice: Output directory `%s' does not exist. "
"I have created it for you.\n", outputDirectory.data());
}
dir.cd(outputDirectory);
diff --git a/src/perlmodgen.h b/src/perlmodgen.h
index 4307d9b..7f593b2 100644
--- a/src/perlmodgen.h
+++ b/src/perlmodgen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/portable.cpp b/src/portable.cpp
index 554bb0b..2083cbf 100644
--- a/src/portable.cpp
+++ b/src/portable.cpp
@@ -190,15 +190,15 @@ void portable_setenv(const char *name,const char *value)
#else
register char **ep = 0;
register size_t size;
- const size_t namelen=strlen(name);
- const size_t vallen=strlen(value) + 1;
+ const size_t namelen=qstrlen(name);
+ const size_t vallen=qstrlen(value) + 1;
size = 0;
if (environ!=0)
{
for (ep = environ; *ep; ++ep)
{
- if (!strncmp (*ep, name, (uint)namelen) &&
+ if (!qstrncmp (*ep, name, (uint)namelen) &&
(*ep)[namelen] == '=')
break;
else
@@ -244,7 +244,7 @@ void portable_setenv(const char *name,const char *value)
}
else /* replace existing string */
{
- size_t len = strlen (*ep);
+ size_t len = qstrlen (*ep);
if (len + 1 < namelen + 1 + vallen)
{
/* The existing string is too short; malloc a new one. */
@@ -277,12 +277,12 @@ void portable_unsetenv(const char *variable)
return; // not properly formatted
}
- len = strlen(variable);
+ len = qstrlen(variable);
ep = environ;
while (*ep != NULL)
{
- if (!strncmp(*ep, variable, (uint)len) && (*ep)[len]=='=')
+ if (!qstrncmp(*ep, variable, (uint)len) && (*ep)[len]=='=')
{
/* Found it. Remove this pointer by moving later ones back. */
char **dp = ep;
@@ -304,7 +304,9 @@ const char *portable_getenv(const char *variable)
portable_off_t portable_fseek(FILE *f,portable_off_t offset, int whence)
{
-#if defined(_WIN32) && !defined(__CYGWIN__)
+#if defined(__MINGW32__)
+ return fseeko64(f,offset,whence);
+#elif defined(_WIN32) && !defined(__CYGWIN__)
return _fseeki64(f,offset,whence);
#else
return fseeko(f,offset,whence);
@@ -313,7 +315,9 @@ portable_off_t portable_fseek(FILE *f,portable_off_t offset, int whence)
portable_off_t portable_ftell(FILE *f)
{
-#if defined(_WIN32) && !defined(__CYGWIN__)
+#if defined(__MINGW32__)
+ return ftello64(f);
+#elif defined(_WIN32) && !defined(__CYGWIN__)
return _ftelli64(f);
#else
return ftello(f);
diff --git a/src/pre.h b/src/pre.h
index dff17a0..7deb23c 100644
--- a/src/pre.h
+++ b/src/pre.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/pre.l b/src/pre.l
index fdaee6f..ae2f43d 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -54,13 +54,11 @@
#include "memberdef.h"
#include "membername.h"
-#define YY_NEVER_INTERACTIVE 1
-enum GuardType
-{
- Guard_Cond,
- Guard_CondNot
-};
+// Toggle for some debugging info
+//#define DBG_CTX(x) fprintf x
+#define DBG_CTX(x) do { } while(0)
+#define YY_NEVER_INTERACTIVE 1
struct FileState
{
FileState(int size) : fileBuf(size),
@@ -223,7 +221,9 @@ class DefineManager
*/
Define *isDefined(const char *name) const
{
- return m_contextDefines.find(name);
+ Define *d = m_contextDefines.find(name);
+ //printf("isDefined(%s)=%p\n",name,d);
+ return d;
}
/** Returns a reference to the defines found in the current context. */
const DefineDict &defineContext() const
@@ -317,6 +317,8 @@ void DefineManager::DefinesPerFile::collectDefines(
*/
static int g_yyLineNr = 1;
+static int g_yyMLines = 1;
+static int g_yyColNr = 1;
static QCString g_yyFileName;
static FileDef *g_yyFileDef;
static FileDef *g_inputFileDef;
@@ -363,8 +365,9 @@ static bool g_insideCS; // C# has simpler preprocessor
static bool g_isSource;
static bool g_lexInit = FALSE;
+static int g_fenceSize = 0;
+static bool g_ccomment;
-static GuardType guardType; // kind of guard for conditional section
//DefineDict* getGlobalDefineDict()
//{
// return g_globalDefineDict;
@@ -406,7 +409,7 @@ static void decrLevel()
}
else
{
- warn(g_yyFileName,g_yyLineNr,"warning: More #endif's than #if's found.\n");
+ warn(g_yyFileName,g_yyLineNr,"More #endif's than #if's found.\n");
}
}
@@ -414,7 +417,7 @@ static bool otherCaseDone()
{
if (g_level==0)
{
- warn(g_yyFileName,g_yyLineNr,"warning: Found an #else without a preceding #if.\n");
+ warn(g_yyFileName,g_yyLineNr,"Found an #else without a preceding #if.\n");
return TRUE;
}
else
@@ -428,57 +431,6 @@ static void setCaseDone(bool value)
g_levelGuard[g_level-1]=value;
}
-#if 0
-static bool macroIsAccessible(Define *def)
-{
- //printf("macroIsAccessible(%s) input=%s def=%s\n",
- // def->name.data(),g_inputFileDef?g_inputFileDef->name().data():"<none>",
- // def->fileDef ? def->fileDef->name().data() : "<none>");
- if (def && def->isPredefined) // predefined macro -> globally accessible
- {
- //printf("%s: predefined macro %s\n",g_inputFileDef->name().data(),def->name.data());
- return TRUE;
- }
- if (def && def->fileDef==g_inputFileDef)
- {
- //printf("%s: macro %s defined in this file at line %d now at %d\n",
- // g_inputFileDef->name().data(),def->name.data(),def->lineNr,g_yyLineNr);
- return def->lineNr<=g_yyLineNr;
- }
- if (g_inputFileDef && def && def->fileDef) // check if g_inputFileDef actually includes def->fileDef
- {
- QDict<FileDef> includedFiles(257);
- bool b = g_inputFileDef->includes(def->fileDef,&includedFiles);
- //printf("%s: Checking for accessibility of define '%s' (defined in %s): result=%d\n",
- // g_inputFileDef->name().data(),def->name.data(),def->fileDef->name().data(),b);
- return b;
- }
- if (g_inputFileDef && def && !def->fileName.isEmpty())
- {
- bool b = g_inputFileDef->includesByName(def->fileName);
- //printf("%s: Checking for accessibility of define '%s' (defined in %s): result=%d\n",
- // g_inputFileDef->name().data(),def->name.data(),def->fileName.data(),b);
- return b;
- }
- //printf("not accessible!\n");
- return FALSE;
-}
-
-static Define *isDefined(const char *name)
-{
- Define *def=0;
- if (name)
- {
- def=g_globalDefineDict->find(name);
- if (def && def->undef) def=0;
- if (def && !macroIsAccessible(def)) def=0;
- }
- //printf("isDefined(%s)=%p\n",name,def);
- return def;
-}
-#endif
-
-
static QDict<void> g_allIncludes(10009);
static FileState *checkAndOpenFile(const QCString &fileName,bool &alreadyIncluded)
@@ -1200,7 +1152,7 @@ QCString removeIdsAndMarkers(const char *s)
}
else if (c=='d' && !inNum) // identifier starting with a `d'
{
- if (strncmp(p,"defined ",8)==0 || strncmp(p,"defined(",8)==0)
+ if (qstrncmp(p,"defined ",8)==0 || qstrncmp(p,"defined(",8)==0)
// defined keyword
{
p+=7; // skip defined
@@ -1398,7 +1350,8 @@ Define *newDefine()
def->nargs = g_defArgs;
def->fileName = g_yyFileName;
def->fileDef = g_yyFileDef;
- def->lineNr = g_yyLineNr;
+ def->lineNr = g_yyLineNr-g_yyMLines;
+ def->columnNr = g_yyColNr;
def->varArgs = g_defVarArgs;
//printf("newDefine: %s %s file: %s\n",def->name.data(),def->definition.data(),
// def->fileDef ? def->fileDef->name().data() : def->fileName.data());
@@ -1420,7 +1373,7 @@ void addDefine()
//ArgumentList *al = new ArgumentList;
//stringToArgumentList(g_defArgsStr,al);
MemberDef *md=new MemberDef(
- g_yyFileName,g_yyLineNr,
+ g_yyFileName,g_yyLineNr-g_yyMLines,g_yyColNr,
"#define",g_defName,g_defArgsStr,0,
Public,Normal,FALSE,Member,MemberType_Define,0,0);
if (!g_defArgsStr.isEmpty())
@@ -1481,7 +1434,6 @@ static inline void outputArray(const char *a,int len)
static void readIncludeFile(const QCString &inc)
{
static bool searchIncludes = Config_getBool("SEARCH_INCLUDES");
- if (!searchIncludes) return; // do not read include files
uint i=0;
// find the start of the include file name
@@ -1516,7 +1468,6 @@ static void readIncludeFile(const QCString &inc)
// absIncFileName avoids difficulties for incFileName starting with "../" (bug 641336)
QCString absIncFileName = incFileName;
{
- static bool searchIncludes = Config_getBool("SEARCH_INCLUDES");
QFileInfo fi(g_yyFileName);
if (fi.exists())
{
@@ -1600,7 +1551,7 @@ static void readIncludeFile(const QCString &inc)
lineStr.sprintf("# 1 \"%s\" 1\n",g_yyFileName.data());
outputArray(lineStr.data(),lineStr.length());
- //fprintf(stderr,"Switching to include file %s\n",incFileName.data());
+ DBG_CTX((stderr,"Switching to include file %s\n",incFileName.data()));
g_expectGuard=TRUE;
g_inputBuf = &fs->fileBuf;
g_inputBufPos=0;
@@ -1649,7 +1600,7 @@ static void readIncludeFile(const QCString &inc)
}
if (g_curlyCount>0 && !alreadyIncluded) // failed to find #include inside { ... }
{
- warn(g_yyFileName,g_yyLineNr,"Warning: include file %s not found, perhaps you forgot to add its directory to INCLUDE_PATH?",incFileName.data());
+ warn(g_yyFileName,g_yyLineNr,"include file %s not found, perhaps you forgot to add its directory to INCLUDE_PATH?",incFileName.data());
}
}
}
@@ -1659,23 +1610,15 @@ static void readIncludeFile(const QCString &inc)
static void startCondSection(const char *sectId)
{
+ //printf("startCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count());
CondParser prs;
bool expResult = prs.parse(g_yyFileName,g_yyLineNr,sectId);
g_condStack.push(new bool(g_skip));
- if (guardType == Guard_Cond)
- {
- if (expResult)
- {
- g_skip=TRUE;
- }
- }
- else if (guardType == Guard_CondNot)
+ if (!expResult)
{
- if (!expResult)
- {
- g_skip=TRUE;
- }
+ g_skip=TRUE;
}
+ //printf(" expResult=%d skip=%d\n",expResult,g_skip);
}
static void endCondSection()
@@ -1689,6 +1632,7 @@ static void endCondSection()
bool *ctx = g_condStack.pop();
g_skip=*ctx;
}
+ //printf("endCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count());
}
static void forceEndCondSection()
@@ -1789,7 +1733,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
%x IgnoreLine
%x FindDefineArgs
%x ReadString
-%x CondLine
+%x CondLineC
+%x CondLineCpp
+%x SkipCond
%%
@@ -1799,7 +1745,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
<*>"??"[=/'()!<>-] { // Trigraph
unput(resolveTrigraph(yytext[2]));
}
-<Start>^{B}*"#" { BEGIN(Command); }
+<Start>^{B}*"#" { BEGIN(Command); g_yyColNr+=yyleng; g_yyMLines=0;}
<Start>^{B}*/[^#] {
outputArray(yytext,(int)yyleng);
BEGIN(CopyLine);
@@ -1949,6 +1895,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
outputChar('\n');
BEGIN(Start);
g_yyLineNr++;
+ g_yyColNr=1;
}
<FindDefineArgs>"(" {
g_defArgsStr+='(';
@@ -2043,6 +1990,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
<Command>("cmake")?"define"{B}+ {
//printf("!!!DefName\n");
+ g_yyColNr+=yyleng;
BEGIN(DefName);
}
<Command>"ifdef"/{B}*"(" {
@@ -2126,7 +2074,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
g_yyLineNr++;
}
<IgnoreLine>.
-<Command>.
+<Command>. {g_yyColNr+=yyleng;}
<UndefName>{ID} {
Define *def;
if ((def=DefineManager::instance().isDefined(yytext))
@@ -2330,7 +2278,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
g_defVarArgs = FALSE;
//printf("Guard check: %s!=%s || %d\n",
// g_defName.data(),g_lastGuardName.data(),g_expectGuard);
- if ( g_defName!=g_lastGuardName || !g_expectGuard)
+ if (g_curlyCount>0 || g_defName!=g_lastGuardName || !g_expectGuard)
{ // define may appear in the output
QCString tmp=(QCString)"#define "+g_defName;
outputArray(tmp.data(),tmp.length());
@@ -2360,7 +2308,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
g_defVarArgs = FALSE;
//printf("Guard check: %s!=%s || %d\n",
// g_defName.data(),g_lastGuardName.data(),g_expectGuard);
- if ( g_defName!=g_lastGuardName || !g_expectGuard)
+ if (g_curlyCount>0 || g_defName!=g_lastGuardName || !g_expectGuard)
{ // define may appear in the output
QCString tmp=(QCString)"#define "+g_defName;
outputArray(tmp.data(),tmp.length());
@@ -2475,49 +2423,134 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
<SkipCComment>[\\@][\\@]("f{"|"f$"|"f[") {
outputArray(yytext,(int)yyleng);
}
-<SkipCComment>[\\@][\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"){BN}+ {
+<SkipCComment>"~~~"[~]* {
+ static bool markdownSupport = Config_getBool("MARKDOWN_SUPPORT");
+ if (!markdownSupport)
+ {
+ REJECT;
+ }
+ else
+ {
+ outputArray(yytext,(int)yyleng);
+ g_fenceSize=yyleng;
+ BEGIN(SkipVerbatim);
+ }
+ }
+<SkipCComment>[\\@][\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"rtfonly"|"manonly"|"dot"|"code"("{"[^}]*"}")?){BN}+ {
outputArray(yytext,(int)yyleng);
g_yyLineNr+=QCString(yytext).contains('\n');
}
-<SkipCComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"){BN}+ {
+<SkipCComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"rtfonly"|"manonly"|"dot"|"code"("{"[^}]*"}")?){BN}+ {
outputArray(yytext,(int)yyleng);
g_yyLineNr+=QCString(yytext).contains('\n');
+ g_fenceSize=0;
if (yytext[1]=='f')
{
g_blockName="f";
}
else
{
- g_blockName=QCString(&yytext[1]).stripWhiteSpace();
+ QCString bn=&yytext[1];
+ int i = bn.find('{'); // for \code{.c}
+ if (i!=-1) bn=bn.left(i);
+ g_blockName=bn.stripWhiteSpace();
}
BEGIN(SkipVerbatim);
}
-<SkipCComment,SkipCPPComment>[\\@]"cond"[ \t]+ { // conditional section
- guardType = Guard_Cond;
- g_condCtx = YY_START;
- outputArray(yytext,yyleng);
- BEGIN(CondLine);
+<SkipCPPComment>[\\@]"cond"[ \t]+ { // conditional section
+ g_ccomment=TRUE;
+ g_condCtx=YY_START;
+ BEGIN(CondLineCpp);
}
-<CondLine>[!()&| \ta-z_A-Z0-9.\-]+ {
- startCondSection(yytext);
- outputArray(yytext,(int)yyleng);
- BEGIN(g_condCtx);
- }
-<SkipCComment,SkipCPPComment>[\\@]"cond"[ \t\r]*/\n {
- guardType = Guard_Cond;
- g_condCtx = YY_START;
- outputArray(yytext,(int)yyleng);
+<SkipCComment>[\\@]"cond"[ \t]+ { // conditional section
+ g_ccomment=FALSE;
+ g_condCtx=YY_START;
+ BEGIN(CondLineC);
}
-<CondLine>. {
+<CondLineC,CondLineCpp>[!()&| \ta-z_A-Z0-9.\-]+ {
+ startCondSection(yytext);
+ if (g_skip)
+ {
+ if (YY_START==CondLineC)
+ {
+ // end C comment
+ outputArray("*/",2);
+ g_ccomment=TRUE;
+ }
+ else
+ {
+ g_ccomment=FALSE;
+ }
+ BEGIN(SkipCond);
+ }
+ else
+ {
+ BEGIN(g_condCtx);
+ }
+ }
+<CondLineC,CondLineCpp>. { // non-guard character
unput(*yytext);
startCondSection(" ");
- BEGIN(g_condCtx);
- }
+ if (g_skip)
+ {
+ if (YY_START==CondLineC)
+ {
+ // end C comment
+ outputArray("*/",2);
+ g_ccomment=TRUE;
+ }
+ else
+ {
+ g_ccomment=FALSE;
+ }
+ BEGIN(SkipCond);
+ }
+ else
+ {
+ BEGIN(g_condCtx);
+ }
+ }
+<SkipCComment,SkipCPPComment>[\\@]"cond"[ \t\r]*/\n { // no guard
+ if (YY_START==SkipCComment)
+ {
+ g_ccomment=TRUE;
+ // end C comment
+ outputArray("*/",2);
+ }
+ else
+ {
+ g_ccomment=FALSE;
+ }
+ g_condCtx=YY_START;
+ startCondSection(" ");
+ BEGIN(SkipCond);
+ }
+<SkipCond>\n { g_yyLineNr++; outputChar('\n'); }
+<SkipCond>. { }
+<SkipCond>[^\/\!*\\@\n]+ { }
+<SkipCond>"//"[/!] { g_ccomment=FALSE; }
+<SkipCond>"/*"[*!] { g_ccomment=TRUE; }
+<SkipCond>[\\@]"endcond"/[^a-z_A-Z0-9] {
+ bool oldSkip = g_skip;
+ endCondSection();
+ if (oldSkip && !g_skip)
+ {
+ if (g_ccomment)
+ {
+ outputArray("/** ",4);
+ }
+ BEGIN(g_condCtx);
+ }
+ }
<SkipCComment,SkipCPPComment>[\\@]"endcond"/[^a-z_A-Z0-9] {
- outputArray(yytext,(int)yyleng);
+ bool oldSkip = g_skip;
endCondSection();
+ if (oldSkip && !g_skip)
+ {
+ BEGIN(g_condCtx);
+ }
}
-<SkipVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}") { /* end of verbatim block */
+<SkipVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}") { /* end of verbatim block */
outputArray(yytext,(int)yyleng);
if (yytext[1]=='f' && g_blockName=="f")
{
@@ -2528,10 +2561,17 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
BEGIN(SkipCComment);
}
}
+<SkipVerbatim>"~~~"[~]* {
+ outputArray(yytext,(int)yyleng);
+ if (g_fenceSize==yyleng)
+ {
+ BEGIN(SkipCComment);
+ }
+ }
<SkipVerbatim>"*/"|"/*" {
outputArray(yytext,(int)yyleng);
}
-<SkipCComment,SkipVerbatim>[^*\\@\x06\n\/]+ {
+<SkipCComment,SkipVerbatim>[^*\\@\x06~\n\/]+ {
outputArray(yytext,(int)yyleng);
}
<SkipCComment,SkipVerbatim>\n {
@@ -2639,7 +2679,9 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
<DefineText>\\[\r]?\n {
g_defLitText+=yytext;
outputChar('\n');
- g_defText += ' '; g_yyLineNr++;
+ g_defText += ' ';
+ g_yyLineNr++;
+ g_yyMLines++;
}
<DefineText>\n {
QCString comment=extractTrailingComment(g_defLitText);
@@ -2681,7 +2723,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
def->definition = g_defText.stripWhiteSpace();
def->nargs = g_defArgs;
def->fileName = g_yyFileName.copy();
- def->lineNr = g_yyLineNr;
+ def->lineNr = g_yyLineNr-g_yyMLines;
+ def->columnNr = g_yyColNr;
}
else
{
@@ -2690,6 +2733,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
delete g_argDict; g_argDict=0;
g_yyLineNr++;
+ g_yyColNr=1;
g_lastGuardName.resize(0);
BEGIN(Start);
}
@@ -2728,11 +2772,11 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
<SkipSingleQuote>. { g_defText += *yytext; g_defLitText+=yytext; }
<DefineText>. { g_defText += *yytext; g_defLitText+=yytext; }
<<EOF>> {
- //fprintf(stderr,"End of include file\n");
+ DBG_CTX((stderr,"End of include file\n"));
//printf("Include stack depth=%d\n",g_includeStack.count());
if (g_includeStack.isEmpty())
{
- //fprintf(stderr,"Terminating scanner!\n");
+ DBG_CTX((stderr,"Terminating scanner!\n"));
yyterminate();
}
else
@@ -2747,7 +2791,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
g_inputBuf = fs->oldFileBuf;
g_inputBufPos = fs->oldFileBufPos;
setFileName(fs->fileName);
- //fprintf(stderr,"######## FileName %s\n",g_yyFileName.data());
+ DBG_CTX((stderr,"######## FileName %s\n",g_yyFileName.data()));
// Deal with file changes due to
// #include's within { .. } blocks
@@ -2760,17 +2804,31 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
<*>"/*"/"*/" |
<*>"/*"[*]? {
- outputArray(yytext,(int)yyleng);
- g_lastCContext=YY_START;
- g_commentCount=1;
- if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented!
- BEGIN(SkipCComment);
+ if (YY_START==SkipVerbatim || YY_START==SkipCond)
+ {
+ REJECT;
+ }
+ else
+ {
+ outputArray(yytext,(int)yyleng);
+ g_lastCContext=YY_START;
+ g_commentCount=1;
+ if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented!
+ BEGIN(SkipCComment);
+ }
}
<*>"//"[/]? {
- outputArray(yytext,(int)yyleng);
- g_lastCPPContext=YY_START;
- if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented!
- BEGIN(SkipCPPComment);
+ if (YY_START==SkipVerbatim || YY_START==SkipCond)
+ {
+ REJECT;
+ }
+ else
+ {
+ outputArray(yytext,(int)yyleng);
+ g_lastCPPContext=YY_START;
+ if (yyleng==3) g_lastGuardName.resize(0); // reset guard in case the #define is documented!
+ BEGIN(SkipCPPComment);
+ }
}
<*>\n {
outputChar('\n');
@@ -2883,6 +2941,7 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output)
g_macroExpansion = Config_getBool("MACRO_EXPANSION");
g_expandOnlyPredef = Config_getBool("EXPAND_ONLY_PREDEF");
+ g_skip=FALSE;
g_curlyCount=0;
g_nospaces=FALSE;
g_inputBuf=&input;
@@ -3015,6 +3074,7 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output)
}
g_yyLineNr = 1;
+ g_yyColNr = 1;
g_level = 0;
g_ifcount = 0;
diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h
index 1138e8b..dc28d26 100644
--- a/src/printdocvisitor.h
+++ b/src/printdocvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -19,6 +19,7 @@
#ifndef _PRINTDOCVISITOR_H
#define _PRINTDOCVISITOR_H
+#include <qglobal.h>
#include "docvisitor.h"
/*! Concrete visitor implementation for pretty printing */
@@ -57,104 +58,104 @@ class PrintDocVisitor : public DocVisitor
indent_leaf();
switch(s->symbol())
{
- case DocSymbol::BSlash: printf("\\"); break;
- case DocSymbol::At: printf("@"); break;
- case DocSymbol::Less: printf("<"); break;
- case DocSymbol::Greater: printf(">"); break;
- case DocSymbol::Amp: printf("&"); break;
- case DocSymbol::Dollar: printf("$"); break;
- case DocSymbol::Hash: printf("#"); break;
- case DocSymbol::Percent: printf("%%"); break;
- case DocSymbol::Pipe: printf("|"); break;
- case DocSymbol::Copy: printf("&copy;"); break;
- case DocSymbol::Apos: printf("'"); break;
- case DocSymbol::Quot: printf("\""); break;
+ case DocSymbol::BSlash: printf("\\"); break;
+ case DocSymbol::At: printf("@"); break;
+ case DocSymbol::Less: printf("<"); break;
+ case DocSymbol::Greater: printf(">"); break;
+ case DocSymbol::Amp: printf("&"); break;
+ case DocSymbol::Dollar: printf("$"); break;
+ case DocSymbol::Hash: printf("#"); break;
+ case DocSymbol::Percent: printf("%%"); break;
+ case DocSymbol::Pipe: printf("|"); break;
+ case DocSymbol::Copy: printf("&copy;"); break;
+ case DocSymbol::Apos: printf("'"); break;
+ case DocSymbol::Quot: printf("\""); break;
case DocSymbol::Lsquo: printf("&lsquo;"); break;
case DocSymbol::Rsquo: printf("&rsquo;"); break;
case DocSymbol::Ldquo: printf("&ldquo;"); break;
case DocSymbol::Rdquo: printf("&rdquo;"); break;
case DocSymbol::Ndash: printf("&ndash;"); break;
case DocSymbol::Mdash: printf("&mdash;"); break;
- case DocSymbol::Uml: printf("&%cuml;",s->letter()); break;
- case DocSymbol::Acute: printf("&%cacute;",s->letter()); break;
- case DocSymbol::Grave: printf("&%cgrave;",s->letter()); break;
- case DocSymbol::Circ: printf("&%ccirc;",s->letter()); break;
- case DocSymbol::Tilde: printf("&%ctilde;",s->letter()); break;
- case DocSymbol::Szlig: printf("&szlig;"); break;
- case DocSymbol::Cedil: printf("&%ccedul;",s->letter()); break;
- case DocSymbol::Ring: printf("&%cring;",s->letter()); break;
- case DocSymbol::Nbsp: printf("&nbsp;"); break;
- case DocSymbol::Aelig: printf("&aelig;"); break;
- case DocSymbol::AElig: printf("&AElig;"); break;
- case DocSymbol::GrkGamma: printf("&Gamma;"); break;
- case DocSymbol::GrkDelta: printf("&Delta;"); break;
- case DocSymbol::GrkTheta: printf("&Theta;"); break;
- case DocSymbol::GrkLambda: printf("&Lambda;"); break;
- case DocSymbol::GrkXi: printf("&Xi;"); break;
- case DocSymbol::GrkPi: printf("&Pi;"); break;
- case DocSymbol::GrkSigma: printf("&Sigma;"); break;
- case DocSymbol::GrkUpsilon: printf("&Upsilon;"); break;
- case DocSymbol::GrkPhi: printf("&Phi;"); break;
- case DocSymbol::GrkPsi: printf("&Psi;"); break;
- case DocSymbol::GrkOmega: printf("&Omega;"); break;
- case DocSymbol::Grkalpha: printf("&alpha;"); break;
- case DocSymbol::Grkbeta: printf("&beta;"); break;
- case DocSymbol::Grkgamma: printf("&gamma;"); break;
- case DocSymbol::Grkdelta: printf("&delta;"); break;
- case DocSymbol::Grkepsilon: printf("&epsilon;"); break;
- case DocSymbol::Grkzeta: printf("&zeta;"); break;
- case DocSymbol::Grketa: printf("&eta;"); break;
- case DocSymbol::Grktheta: printf("&theta;"); break;
- case DocSymbol::Grkiota: printf("&iota;"); break;
- case DocSymbol::Grkkappa: printf("&kappa;"); break;
- case DocSymbol::Grklambda: printf("&lambda;"); break;
- case DocSymbol::Grkmu: printf("&mu;"); break;
- case DocSymbol::Grknu: printf("&nu;"); break;
- case DocSymbol::Grkxi: printf("&xi;"); break;
- case DocSymbol::Grkpi: printf("&pi;"); break;
- case DocSymbol::Grkrho: printf("&rho;"); break;
- case DocSymbol::Grksigma: printf("&sigma;"); break;
- case DocSymbol::Grktau: printf("&tau;"); break;
- case DocSymbol::Grkupsilon: printf("&upsilon;"); break;
- case DocSymbol::Grkphi: printf("&phi;"); break;
- case DocSymbol::Grkchi: printf("&chi;"); break;
- case DocSymbol::Grkpsi: printf("&psi;"); break;
- case DocSymbol::Grkomega: printf("&omega;"); break;
- case DocSymbol::Grkvarsigma: printf("&sigmaf;"); break;
- case DocSymbol::Section: printf("&sect;"); break;
- case DocSymbol::Degree: printf("&deg;"); break;
- case DocSymbol::Prime: printf("&prime;"); break;
- case DocSymbol::DoublePrime: printf("&Prime;"); break;
- case DocSymbol::Infinity: printf("&infin;"); break;
- case DocSymbol::EmptySet: printf("&empty;"); break;
- case DocSymbol::PlusMinus: printf("&plusmn;"); break;
- case DocSymbol::Times: printf("&times;"); break;
- case DocSymbol::Minus: printf("&minus;"); break;
- case DocSymbol::CenterDot: printf("&sdot;"); break;
- case DocSymbol::Partial: printf("&part;"); break;
- case DocSymbol::Nabla: printf("&nabla;"); break;
- case DocSymbol::SquareRoot: printf("&radic;"); break;
- case DocSymbol::Perpendicular: printf("&perp;"); break;
- case DocSymbol::Sum: printf("&sum;"); break;
- case DocSymbol::Integral: printf("&int;"); break;
- case DocSymbol::Product: printf("&prod;"); break;
- case DocSymbol::Similar: printf("&sim;"); break;
- case DocSymbol::Approx: printf("&asymp;"); break;
- case DocSymbol::NotEqual: printf("&ne;"); break;
- case DocSymbol::Equivalent: printf("&equiv;"); break;
- case DocSymbol::Proportional: printf("&prop;"); break;
- case DocSymbol::LessEqual: printf("&le;"); break;
- case DocSymbol::GreaterEqual: printf("&ge;"); break;
- case DocSymbol::LeftArrow: printf("&larr;"); break;
- case DocSymbol::RightArrow: printf("&rarr;"); break;
- case DocSymbol::SetIn: printf("&isin;"); break;
- case DocSymbol::SetNotIn: printf("&notin;"); break;
- case DocSymbol::LeftCeil: printf("&lceil;"); break;
- case DocSymbol::RightCeil: printf("&rceil;"); break;
- case DocSymbol::LeftFloor: printf("&lfloor;"); break;
- case DocSymbol::RightFloor: printf("&rfloor;"); break;
- default:
- printf("Error: unknown symbol found\n");
+ case DocSymbol::Uml: printf("&%cuml;",s->letter()); break;
+ case DocSymbol::Acute: printf("&%cacute;",s->letter()); break;
+ case DocSymbol::Grave: printf("&%cgrave;",s->letter()); break;
+ case DocSymbol::Circ: printf("&%ccirc;",s->letter()); break;
+ case DocSymbol::Tilde: printf("&%ctilde;",s->letter()); break;
+ case DocSymbol::Szlig: printf("&szlig;"); break;
+ case DocSymbol::Cedil: printf("&%ccedul;",s->letter()); break;
+ case DocSymbol::Ring: printf("&%cring;",s->letter()); break;
+ case DocSymbol::Nbsp: printf("&nbsp;"); break;
+ case DocSymbol::Aelig: printf("&aelig;"); break;
+ case DocSymbol::AElig: printf("&AElig;"); break;
+ case DocSymbol::GrkGamma: printf("&Gamma;"); break;
+ case DocSymbol::GrkDelta: printf("&Delta;"); break;
+ case DocSymbol::GrkTheta: printf("&Theta;"); break;
+ case DocSymbol::GrkLambda: printf("&Lambda;"); break;
+ case DocSymbol::GrkXi: printf("&Xi;"); break;
+ case DocSymbol::GrkPi: printf("&Pi;"); break;
+ case DocSymbol::GrkSigma: printf("&Sigma;"); break;
+ case DocSymbol::GrkUpsilon: printf("&Upsilon;"); break;
+ case DocSymbol::GrkPhi: printf("&Phi;"); break;
+ case DocSymbol::GrkPsi: printf("&Psi;"); break;
+ case DocSymbol::GrkOmega: printf("&Omega;"); break;
+ case DocSymbol::Grkalpha: printf("&alpha;"); break;
+ case DocSymbol::Grkbeta: printf("&beta;"); break;
+ case DocSymbol::Grkgamma: printf("&gamma;"); break;
+ case DocSymbol::Grkdelta: printf("&delta;"); break;
+ case DocSymbol::Grkepsilon: printf("&epsilon;"); break;
+ case DocSymbol::Grkzeta: printf("&zeta;"); break;
+ case DocSymbol::Grketa: printf("&eta;"); break;
+ case DocSymbol::Grktheta: printf("&theta;"); break;
+ case DocSymbol::Grkiota: printf("&iota;"); break;
+ case DocSymbol::Grkkappa: printf("&kappa;"); break;
+ case DocSymbol::Grklambda: printf("&lambda;"); break;
+ case DocSymbol::Grkmu: printf("&mu;"); break;
+ case DocSymbol::Grknu: printf("&nu;"); break;
+ case DocSymbol::Grkxi: printf("&xi;"); break;
+ case DocSymbol::Grkpi: printf("&pi;"); break;
+ case DocSymbol::Grkrho: printf("&rho;"); break;
+ case DocSymbol::Grksigma: printf("&sigma;"); break;
+ case DocSymbol::Grktau: printf("&tau;"); break;
+ case DocSymbol::Grkupsilon: printf("&upsilon;"); break;
+ case DocSymbol::Grkphi: printf("&phi;"); break;
+ case DocSymbol::Grkchi: printf("&chi;"); break;
+ case DocSymbol::Grkpsi: printf("&psi;"); break;
+ case DocSymbol::Grkomega: printf("&omega;"); break;
+ case DocSymbol::Grkvarsigma: printf("&sigmaf;"); break;
+ case DocSymbol::Section: printf("&sect;"); break;
+ case DocSymbol::Degree: printf("&deg;"); break;
+ case DocSymbol::Prime: printf("&prime;"); break;
+ case DocSymbol::DoublePrime: printf("&Prime;"); break;
+ case DocSymbol::Infinity: printf("&infin;"); break;
+ case DocSymbol::EmptySet: printf("&empty;"); break;
+ case DocSymbol::PlusMinus: printf("&plusmn;"); break;
+ case DocSymbol::Times: printf("&times;"); break;
+ case DocSymbol::Minus: printf("&minus;"); break;
+ case DocSymbol::CenterDot: printf("&sdot;"); break;
+ case DocSymbol::Partial: printf("&part;"); break;
+ case DocSymbol::Nabla: printf("&nabla;"); break;
+ case DocSymbol::SquareRoot: printf("&radic;"); break;
+ case DocSymbol::Perpendicular: printf("&perp;"); break;
+ case DocSymbol::Sum: printf("&sum;"); break;
+ case DocSymbol::Integral: printf("&int;"); break;
+ case DocSymbol::Product: printf("&prod;"); break;
+ case DocSymbol::Similar: printf("&sim;"); break;
+ case DocSymbol::Approx: printf("&asymp;"); break;
+ case DocSymbol::NotEqual: printf("&ne;"); break;
+ case DocSymbol::Equivalent: printf("&equiv;"); break;
+ case DocSymbol::Proportional: printf("&prop;"); break;
+ case DocSymbol::LessEqual: printf("&le;"); break;
+ case DocSymbol::GreaterEqual: printf("&ge;"); break;
+ case DocSymbol::LeftArrow: printf("&larr;"); break;
+ case DocSymbol::RightArrow: printf("&rarr;"); break;
+ case DocSymbol::SetIn: printf("&isin;"); break;
+ case DocSymbol::SetNotIn: printf("&notin;"); break;
+ case DocSymbol::LeftCeil: printf("&lceil;"); break;
+ case DocSymbol::RightCeil: printf("&rceil;"); break;
+ case DocSymbol::LeftFloor: printf("&lfloor;"); break;
+ case DocSymbol::RightFloor: printf("&rfloor;"); break;
+ default:
+ printf("unknown symbol found\n");
}
}
void visit(DocURL *u)
@@ -178,35 +179,35 @@ class PrintDocVisitor : public DocVisitor
switch (s->style())
{
case DocStyleChange::Bold:
- if (s->enable()) printf("<bold>"); else printf("</bold>");
- break;
+ if (s->enable()) printf("<bold>"); else printf("</bold>");
+ break;
case DocStyleChange::Italic:
- if (s->enable()) printf("<italic>"); else printf("</italic>");
- break;
+ if (s->enable()) printf("<italic>"); else printf("</italic>");
+ break;
case DocStyleChange::Code:
- if (s->enable()) printf("<code>"); else printf("</code>");
- break;
+ if (s->enable()) printf("<code>"); else printf("</code>");
+ break;
case DocStyleChange::Subscript:
- if (s->enable()) printf("<sub>"); else printf("</sub>");
- break;
+ if (s->enable()) printf("<sub>"); else printf("</sub>");
+ break;
case DocStyleChange::Superscript:
- if (s->enable()) printf("<sup>"); else printf("</sup>");
- break;
+ if (s->enable()) printf("<sup>"); else printf("</sup>");
+ break;
case DocStyleChange::Center:
- if (s->enable()) printf("<center>"); else printf("</center>");
- break;
+ if (s->enable()) printf("<center>"); else printf("</center>");
+ break;
case DocStyleChange::Small:
- if (s->enable()) printf("<small>"); else printf("</small>");
- break;
+ if (s->enable()) printf("<small>"); else printf("</small>");
+ break;
case DocStyleChange::Preformatted:
- if (s->enable()) printf("<pre>"); else printf("</pre>");
- break;
+ if (s->enable()) printf("<pre>"); else printf("</pre>");
+ break;
case DocStyleChange::Div:
- if (s->enable()) printf("<div>"); else printf("</div>");
- break;
+ if (s->enable()) printf("<div>"); else printf("</div>");
+ break;
case DocStyleChange::Span:
- if (s->enable()) printf("<span>"); else printf("</span>");
- break;
+ if (s->enable()) printf("<span>"); else printf("</span>");
+ break;
}
}
void visit(DocVerbatim *s)
@@ -221,6 +222,7 @@ class PrintDocVisitor : public DocVisitor
case DocVerbatim::ManOnly: printf("<manonly>"); break;
case DocVerbatim::LatexOnly: printf("<latexonly>"); break;
case DocVerbatim::XmlOnly: printf("<xmlonly>"); break;
+ case DocVerbatim::DocbookOnly: printf("<docbookonly>"); break;
case DocVerbatim::Dot: printf("<dot>"); break;
case DocVerbatim::Msc: printf("<msc>"); break;
}
@@ -234,6 +236,7 @@ class PrintDocVisitor : public DocVisitor
case DocVerbatim::ManOnly: printf("</manonly>"); break;
case DocVerbatim::LatexOnly: printf("</latexonly>"); break;
case DocVerbatim::XmlOnly: printf("</xmlonly>"); break;
+ case DocVerbatim::DocbookOnly: printf("</docbookonly>"); break;
case DocVerbatim::Dot: printf("</dot>"); break;
case DocVerbatim::Msc: printf("</msc>"); break;
}
diff --git a/src/pycode.h b/src/pycode.h
index e7c1b8b..ef9d47c 100644
--- a/src/pycode.h
+++ b/src/pycode.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -28,6 +28,7 @@
class CodeOutputInterface;
class FileDef;
class MemberDef;
+class QCString;
class Definition;
extern void parsePythonCode(CodeOutputInterface &,const char *,const QCString &,
diff --git a/src/pycode.l b/src/pycode.l
index df99758..c87f5bb 100644
--- a/src/pycode.l
+++ b/src/pycode.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -43,6 +43,10 @@
#include "filedef.h"
#include "namespacedef.h"
+// Toggle for some debugging info
+//#define DBG_CTX(x) fprintf x
+#define DBG_CTX(x) do { } while(0)
+
#define YY_NEVER_INTERACTIVE 1
#define YY_NO_INPUT 1
@@ -479,6 +483,15 @@ static void codifyLines(char *text)
}
}
+#if 0
+static QCString fileLocation()
+{
+ QCString result = g_sourceFileDef?g_sourceFileDef->absFilePath():QCString("[unknown]");
+ result+=":"+QCString().setNum(g_yyLineNr);
+ result+=":"+QCString().setNum(1);
+ return result;
+}
+
static void addDocCrossReference(MemberDef *src,MemberDef *dst)
{
static bool referencedByRelation = Config_getBool("REFERENCED_BY_RELATION");
@@ -489,13 +502,14 @@ static void addDocCrossReference(MemberDef *src,MemberDef *dst)
//printf("addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
if ((referencedByRelation || callerGraph) && (src->isFunction() || src->isSlot()))
{
- dst->addSourceReferencedBy(src);
+ dst->addSourceReferencedBy(src,fileLocation());
}
if ((referencesRelation || callGraph) && (src->isFunction() || src->isSlot()))
{
- src->addSourceReferences(dst);
+ src->addSourceReferences(dst,fileLocation());
}
}
+#endif
@@ -580,7 +594,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
// Don't do anything for empty text
if (className.isEmpty()) return;
- //fprintf(stderr,"generateClassOrGlobalLink(className=%s)\n",className.data());
+ DBG_CTX((stderr,"generateClassOrGlobalLink(className=%s)\n",className.data()));
ClassDef *cd=0,*lcd=0; /** Class def that we may find */
MemberDef *md=0; /** Member def that we may find */
@@ -593,10 +607,10 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
cd = getResolvedClass(d,g_sourceFileDef,substitute(className,".","::"),&md);
- //fprintf(stderr,"d=%s g_sourceFileDef=%s\n",
- // d?d->displayName().data():"<null>",
- // g_currentDefinition?g_currentDefinition->displayName().data():"<null>");
- //fprintf(stderr,"is found as a type %s\n",cd?cd->name().data():"<null>");
+ DBG_CTX((stderr,"d=%s g_sourceFileDef=%s\n",
+ d?d->displayName().data():"<null>",
+ g_currentDefinition?g_currentDefinition->displayName().data():"<null>"));
+ DBG_CTX((stderr,"is found as a type %s\n",cd?cd->name().data():"<null>"));
if (cd==0 && md==0) // also see if it is variable or enum or enum value
{
@@ -620,7 +634,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
g_theCallContext.setClass(lcd);
}
//isLocal=TRUE;
- //fprintf(stderr,"is a local variable cd=%p!\n",cd);
+ DBG_CTX((stderr,"is a local variable cd=%p!\n",cd));
}
if (cd && cd->isLinkable()) // is it a linkable class
@@ -646,7 +660,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
QCString scope = substitute(className.left(scopeEnd),".","::");
QCString locName = className.right(className.length()-scopeEnd-1);
ClassDef *mcd = getClass(scope);
- //fprintf(stderr,"scope=%s locName=%s mcd=%p\n",scope.data(),locName.data(),mcd);
+ DBG_CTX((stderr,"scope=%s locName=%s mcd=%p\n",scope.data(),locName.data(),mcd));
if (mcd)
{
MemberDef *md = mcd->getMemberByName(locName);
@@ -709,7 +723,7 @@ static void generateFunctionLink(CodeOutputInterface &ol,char *funcName)
ClassDef *ccd=0;
QCString locScope=g_classScope.copy();
QCString locFunc=removeRedundantWhiteSpace(funcName);
- //fprintf(stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data());
+ DBG_CTX((stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data()));
int i=locFunc.findRev("::");
if (i>0)
{
@@ -759,7 +773,7 @@ static bool findMemberLink(CodeOutputInterface &ol,Definition *sym,const char *s
addDocCrossReference(g_currentMemberDef,(MemberDef*)sym);
}
}
- //fprintf(stderr,"cd=%s thisCd=%s\n",cd?cd->name().data():"<none>",thisCd?thisCd->name().data():"<none>");
+ DBG_CTX((stderr,"cd=%s thisCd=%s\n",cd?cd->name().data():"<none>",thisCd?thisCd->name().data():"<none>"));
// TODO: find the nearest base class in case cd is a base class of
// thisCd
@@ -1045,7 +1059,7 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
// Push a class scope
- ClassDef *classDefToAdd = new ClassDef("<code>",1,g_curClassName,ClassDef::Class,0,0,FALSE);
+ ClassDef *classDefToAdd = new ClassDef("<code>",1,1,g_curClassName,ClassDef::Class,0,0,FALSE);
g_codeClassSDict.append(g_curClassName,classDefToAdd);
char *s=g_curClassBases.first();
while (s)
@@ -1161,7 +1175,7 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
codifyLines(yytext);
endFontClass();
- // No indentation necesary
+ // No indentation necessary
g_noSuiteFound = FALSE;
}
@@ -1170,7 +1184,7 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
codifyLines(yytext);
endFontClass();
- // No indentation necesary
+ // No indentation necessary
g_noSuiteFound = FALSE;
}
{IDENTIFIER} {
diff --git a/src/pyscanner.h b/src/pyscanner.h
index ad7cfaa..707edbd 100644
--- a/src/pyscanner.h
+++ b/src/pyscanner.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -35,9 +35,13 @@ class PythonLanguageScanner : public ParserInterface
{
public:
virtual ~PythonLanguageScanner() {}
+ void startTranslationUnit(const char *) {}
+ void finishTranslationUnit() {}
void parseInput(const char * fileName,
const char *fileBuf,
- Entry *root);
+ Entry *root,
+ bool sameTranslationUnit,
+ QStrList &filesInSameTranslationUnit);
bool needsPreprocessing(const QCString &extension);
void parseCode(CodeOutputInterface &codeOutIntf,
const char *scopeName,
diff --git a/src/pyscanner.l b/src/pyscanner.l
index 4e031bb..69b7558 100644
--- a/src/pyscanner.l
+++ b/src/pyscanner.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -51,6 +51,10 @@
#include "pycode.h"
#include "arguments.h"
+// Toggle for some debugging info
+//#define DBG_CTX(x) fprintf x
+#define DBG_CTX(x) do { } while(0)
+
#define YY_NEVER_INTERACTIVE 1
#define YY_NO_INPUT 1
@@ -226,7 +230,7 @@ static QCString findPackageScope(const char *fileName)
static void lineCount()
{
- //fprintf(stderr,"yyLineNr=%d\n",yyLineNr);
+ DBG_CTX((stderr,"yyLineNr=%d\n",yyLineNr));
for (const char *p = yytext; *p; ++p)
{
yyLineNr += (*p == '\n') ;
@@ -235,7 +239,7 @@ static void lineCount()
static void incLineNr()
{
- //fprintf(stderr,"yyLineNr=%d\n",yyLineNr);
+ DBG_CTX((stderr,"yyLineNr=%d\n",yyLineNr));
yyLineNr++;
}
@@ -537,7 +541,7 @@ STARTDOCSYMS "##"
<Search>{
^{B}"def"{BB} { // start of a function/method definition with indent
- //fprintf(stderr,"Found def at %d\n",yyLineNr);
+ DBG_CTX((stderr,"Found def at %d\n",yyLineNr));
g_indent=computeIndent(yytext);
searchFoundDef();
BEGIN( FunctionDec );
@@ -548,7 +552,7 @@ STARTDOCSYMS "##"
}
^{B}"class"{BB} { // start of a class definition with indent
- //fprintf(stderr,"Found class at %d\n",yyLineNr);
+ DBG_CTX((stderr,"Found class at %d\n",yyLineNr));
g_indent=computeIndent(yytext);
searchFoundClass();
BEGIN( ClassDec ) ;
@@ -731,7 +735,7 @@ STARTDOCSYMS "##"
<SearchMemVars>{
"self."{IDENTIFIER}/{B}"=" {
- //fprintf(stderr,"Found member variable %s in %s at %d\n",&yytext[5],current_root->name.data(),yyLineNr);
+ DBG_CTX((stderr,"Found member variable %s in %s at %d\n",&yytext[5],current_root->name.data(),yyLineNr));
current->name=&yytext[5];
current->section=Entry::VARIABLE_SEC;
current->fileName = yyFileName;
@@ -782,7 +786,7 @@ STARTDOCSYMS "##"
<FunctionBody>{
\n{B}/{IDENTIFIER}{BB} {
- //fprintf(stderr,"indent %d<=%d\n",computeIndent(&yytext[1]),g_indent);
+ DBG_CTX((stderr,"indent %d<=%d\n",computeIndent(&yytext[1]),g_indent));
if (computeIndent(&yytext[1])<=g_indent)
{
int i;
@@ -1002,7 +1006,7 @@ STARTDOCSYMS "##"
}
^{BB} { // something at indent >0
g_curIndent=computeIndent(yytext);
- //fprintf(stderr,"g_curIndent=%d g_indent=%d\n",g_curIndent,g_indent);
+ DBG_CTX((stderr,"g_curIndent=%d g_indent=%d\n",g_curIndent,g_indent));
if (g_curIndent<=g_indent)
// jumped out of the class/method
{
@@ -1133,7 +1137,7 @@ STARTDOCSYMS "##"
//current->startLine = yyLineNr;
g_curIndent=computeIndent(yytext);
bodyEntry = current;
- //fprintf(stderr,"setting indent %d\n",g_curIndent);
+ DBG_CTX((stderr,"setting indent %d\n",g_curIndent));
//printf("current->program=[%s]\n",current->program.data());
//g_hideClassDocs = TRUE;
BEGIN(ClassBody);
@@ -1155,36 +1159,38 @@ STARTDOCSYMS "##"
<VariableDec>{
"=" { // the assignment operator
//printf("====== VariableDec at line %d\n",yyLineNr);
+ current->initializer = yytext;
+ current->initializer += " ";
}
{B} { // spaces
}
{INTNUMBER} { // integer value
current->type = "int";
- current->initializer = yytext;
+ current->initializer += yytext;
BEGIN(VariableEnd);
}
{FLOATNUMBER} { // floating point value
current->type = "float";
- current->initializer = yytext;
+ current->initializer += yytext;
BEGIN(VariableEnd);
}
{STRINGPREFIX}?"'" { // string
current->type = "string";
- current->initializer = yytext;
+ current->initializer += yytext;
g_copyString=&current->initializer;
g_stringContext=VariableEnd;
BEGIN( SingleQuoteString );
}
{STRINGPREFIX}?"\"" { // string
current->type = "string";
- current->initializer = yytext;
+ current->initializer += yytext;
g_copyString=&current->initializer;
g_stringContext=VariableEnd;
BEGIN( DoubleQuoteString );
}
{TRIDOUBLEQUOTE} { // start of a comment block
current->type = "string";
- current->initializer = yytext;
+ current->initializer += yytext;
g_doubleQuote=TRUE;
g_copyString=&current->initializer;
g_stringContext=VariableEnd;
@@ -1193,7 +1199,7 @@ STARTDOCSYMS "##"
{TRISINGLEQUOTE} { // start of a comment block
current->type = "string";
- current->initializer = yytext;
+ current->initializer += yytext;
g_doubleQuote=FALSE;
g_copyString=&current->initializer;
g_stringContext=VariableEnd;
@@ -1350,11 +1356,11 @@ STARTDOCSYMS "##"
{ // strip g_curIndent amount of whitespace
int i;
for (i=0;i<indent-g_curIndent;i++) docBlock+=' ';
- //fprintf(stderr,"stripping indent %d\n",g_curIndent);
+ DBG_CTX((stderr,"stripping indent %d\n",g_curIndent));
}
else
{
- //fprintf(stderr,"not stripping: %d<%d\n",indent,g_curIndent);
+ DBG_CTX((stderr,"not stripping: %d<%d\n",indent,g_curIndent));
docBlock += yytext;
}
}
@@ -1673,7 +1679,11 @@ void pyscanFreeScanner()
//----------------------------------------------------------------------------
-void PythonLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+void PythonLanguageScanner::parseInput(const char *fileName,
+ const char *fileBuf,
+ Entry *root,
+ bool /*sameTranslationUnit*/,
+ QStrList & /*filesInSameTranslationUnit*/)
{
g_thisParser = this;
::parseMain(fileName,fileBuf,root);
diff --git a/src/qtbc.h b/src/qtbc.h
index 59eef3a..ab49733 100644
--- a/src/qtbc.h
+++ b/src/qtbc.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/reflist.cpp b/src/reflist.cpp
index 8f103d7..70bd9ba 100644
--- a/src/reflist.cpp
+++ b/src/reflist.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/reflist.h b/src/reflist.h
index a4a450e..3124582 100644
--- a/src/reflist.h
+++ b/src/reflist.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -48,7 +48,7 @@ class SortedRefItems : public SDict<RefItem>
{
RefItem *r1 = (RefItem*)item1;
RefItem *r2 = (RefItem*)item2;
- return stricmp(r1->title,r2->title);
+ return qstricmp(r1->title,r2->title);
}
};
diff --git a/src/resize.js b/src/resize.js
index 8365b25..a80dece 100644
--- a/src/resize.js
+++ b/src/resize.js
@@ -38,7 +38,7 @@ function resizeWidth()
{
var windowWidth = $(window).width() + "px";
var sidenavWidth = $(sidenav).outerWidth();
- content.css({marginLeft:parseInt(sidenavWidth)+6+"px"}); //account for 6px-wide handle-bar
+ content.css({marginLeft:parseInt(sidenavWidth)+"px"});
writeCookie('width',sidenavWidth, null);
}
diff --git a/src/resize_js.h b/src/resize_js.h
index e24c0b0..160b16c 100644
--- a/src/resize_js.h
+++ b/src/resize_js.h
@@ -38,7 +38,7 @@
"{\n"
" var windowWidth = $(window).width() + \"px\";\n"
" var sidenavWidth = $(sidenav).outerWidth();\n"
-" content.css({marginLeft:parseInt(sidenavWidth)+6+\"px\"}); //account for 6px-wide handle-bar\n"
+" content.css({marginLeft:parseInt(sidenavWidth)+\"px\"}); \n"
" writeCookie('width',sidenavWidth, null);\n"
"}\n"
"\n"
diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp
index d77a3d6..2d07957 100644
--- a/src/rtfdocvisitor.cpp
+++ b/src/rtfdocvisitor.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -311,7 +311,7 @@ void RTFDocVisitor::visit(DocSymbol *s)
case DocSymbol::LeftFloor: m_t << "lfloor "; break;
case DocSymbol::RightFloor: m_t << "rfloor "; break;
default:
- err("error: unknown symbol found\n");
+ err("unknown symbol found\n");
}
m_lastIsPara=FALSE;
}
@@ -446,7 +446,8 @@ void RTFDocVisitor::visit(DocVerbatim *s)
case DocVerbatim::HtmlOnly:
case DocVerbatim::LatexOnly:
case DocVerbatim::XmlOnly:
- case DocVerbatim::ManOnly:
+ case DocVerbatim::ManOnly:
+ case DocVerbatim::DocbookOnly:
/* nothing */
break;
case DocVerbatim::Dot:
diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h
index 2ad0d23..eb841e5 100644
--- a/src/rtfdocvisitor.h
+++ b/src/rtfdocvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index b51245c..9a7dbee 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Parker Waechter & Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Parker Waechter & Dimitri van Heesch.
*
* Style sheet additions by Alexander Bartolich
*
@@ -178,7 +178,7 @@ void RTFGenerator::init()
while(def->reference != 0)
{
if (def->definition == 0)
- err("Internal error: rtf_Style_Default[%s] has no definition.\n", def->name);
+ err("Internal: rtf_Style_Default[%s] has no definition.\n", def->name);
StyleData* styleData = new StyleData(def->reference, def->definition);
rtf_Style.insert(def->name, styleData);
def++;
@@ -1773,21 +1773,6 @@ void RTFGenerator::codify(const char *str)
c=*p++;
-#if 0
- if( MultiByte )
- {
- t << getMultiByte( c );
- MultiByte = FALSE;
- continue;
- }
- if( c >= 0x80 )
- {
- MultiByte = TRUE;
- t << getMultiByte( c );
- continue;
- }
-#endif
-
switch(c)
{
case '\t': spacesToNextTabStop = Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE"));
@@ -1800,7 +1785,7 @@ void RTFGenerator::codify(const char *str)
case '{': t << "\\{"; col++; break;
case '}': t << "\\}"; col++; break;
case '\\': t << "\\\\"; col++; break;
- default: t << (char)c; col++; break;
+ default: p=(const unsigned char *)writeUtf8Char(t,(const char *)p-1); col++; break;
}
}
}
@@ -2024,7 +2009,7 @@ void RTFGenerator::incrementIndentLevel()
m_listLevel++;
if (m_listLevel>rtf_maxIndentLevels-1)
{
- err("error: Maximum indent level (%d) exceeded while generating RTF output!\n",rtf_maxIndentLevels);
+ err("Maximum indent level (%d) exceeded while generating RTF output!\n",rtf_maxIndentLevels);
m_listLevel=rtf_maxIndentLevels-1;
}
}
@@ -2034,7 +2019,7 @@ void RTFGenerator::decrementIndentLevel()
m_listLevel--;
if (m_listLevel<0)
{
- err("error: Negative indent level while generating RTF output!\n");
+ err("Negative indent level while generating RTF output!\n");
m_listLevel=0;
}
}
@@ -2352,7 +2337,7 @@ static bool preProcessFile(QDir &d,QCString &infName, FTextStream &t, bool bIncl
QFile f(infName);
if (!f.open(IO_ReadOnly))
{
- err("error: problems opening rtf file %s for reading\n",infName.data());
+ err("problems opening rtf file %s for reading\n",infName.data());
return FALSE;
}
@@ -2367,7 +2352,7 @@ static bool preProcessFile(QDir &d,QCString &infName, FTextStream &t, bool bIncl
{
if (f.readLine(lineBuf.data(),maxLineLength)==-1)
{
- err("ERROR - read error in %s before end of RTF header!\n",infName.data());
+ err("read error in %s before end of RTF header!\n",infName.data());
return FALSE;
}
if (bIncludeHeader) encodeForOutput(t,lineBuf);
@@ -2550,9 +2535,9 @@ void testRTFOutput(const char *name)
}
if (bcount==0) return; // file is OK.
err:
- err("error: RTF integrity test failed at line %d of %s due to a bracket mismatch.\n",line,name);
- err(" Please try to create a small code example that produces this error \n"
- " and send that to dimitri@stack.nl.\n");
+ err("RTF integrity test failed at line %d of %s due to a bracket mismatch.\n"
+ " Please try to create a small code example that produces this error \n"
+ " and send that to dimitri@stack.nl.\n",line,name);
}
/**
@@ -2565,7 +2550,7 @@ bool RTFGenerator::preProcessFileInplace(const char *path,const char *name)
// store the original directory
if (!d.exists())
{
- err("error: Output dir %s does not exist!\n",path);
+ err("Output dir %s does not exist!\n",path);
return FALSE;
}
QCString oldDir = QDir::currentDirPath().utf8();
@@ -2716,6 +2701,16 @@ void RTFGenerator::endParameterType()
t << " ";
}
+void RTFGenerator::exceptionEntry(const char* prefix,bool closeBracket)
+{
+ DBG_RTF(t << "{\\comment (exceptionEntry)}" << endl)
+ if (prefix)
+ t << " " << prefix;
+ else if (closeBracket)
+ t << ")";
+ t << " ";
+}
+
void RTFGenerator::writeDoc(DocNode *n,Definition *ctx,MemberDef *)
{
RTFDocVisitor *visitor = new RTFDocVisitor(t,*this,ctx?ctx->getDefFileExtension():QCString(""));
diff --git a/src/rtfgen.h b/src/rtfgen.h
index 784cfcc..6c3393f 100644
--- a/src/rtfgen.h
+++ b/src/rtfgen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Parker Waechter & Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Parker Waechter & Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -230,6 +230,7 @@ class RTFGenerator : public OutputGenerator
void endParameterName(bool,bool,bool) {}
void startParameterList(bool) {}
void endParameterList() {}
+ void exceptionEntry(const char*,bool);
void startConstraintList(const char *);
void startConstraintParam();
@@ -257,7 +258,6 @@ class RTFGenerator : public OutputGenerator
void endFontClass() {}
void writeCodeAnchor(const char *) {}
- void linkableSymbol(int,const char *,Definition *,Definition *) {}
void setCurrentDoc(Definition *,const char *,bool) {}
void addWord(const char *,bool) {}
diff --git a/src/rtfstyle.cpp b/src/rtfstyle.cpp
index 1c565e1..2bede42 100644
--- a/src/rtfstyle.cpp
+++ b/src/rtfstyle.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -394,9 +394,9 @@ bool StyleData::setStyle(const char* s, const char* styleName)
}
else if (*end == '\\')
{
- if (0 == strncmp(end, "\\snext", 6))
+ if (0 == qstrncmp(end, "\\snext", 6))
break;
- if (0 == strncmp(end, "\\sbasedon", 9))
+ if (0 == qstrncmp(end, "\\sbasedon", 9))
break;
if (0 != any_clause.match(end, 0, &len))
break;
diff --git a/src/rtfstyle.h b/src/rtfstyle.h
index ef7cb9a..52488f1 100644
--- a/src/rtfstyle.h
+++ b/src/rtfstyle.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/scanner.h b/src/scanner.h
index 7e3b2a3..54a3c1c 100644
--- a/src/scanner.h
+++ b/src/scanner.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -30,9 +30,13 @@ class CLanguageScanner : public ParserInterface
{
public:
virtual ~CLanguageScanner() {}
+ void startTranslationUnit(const char *fileName);
+ void finishTranslationUnit();
void parseInput(const char *fileName,
const char *fileBuf,
- Entry *root);
+ Entry *root,
+ bool sameTranslationUnit,
+ QStrList &filesInSameTranslationUnit);
bool needsPreprocessing(const QCString &extension);
void parseCode(CodeOutputInterface &codeOutIntf,
const char *scopeName,
diff --git a/src/scanner.l b/src/scanner.l
index 8efca45..6bbf1c4 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -43,6 +43,12 @@
#include "code.h"
#include "arguments.h"
+#include "clangparser.h"
+
+// Toggle for some debugging info
+#define DBG_CTX(x) fprintf x
+//#define DBG_CTX(x) do { } while(0)
+
#define YY_NEVER_INTERACTIVE 1
#define YY_NO_INPUT 1
@@ -73,6 +79,7 @@ static int lastRawStringContext;
static int lastCSConstraint;
static int lastHereDocContext;
static int lastDefineContext;
+static int lastAlignAsContext;
static Protection protection;
static Protection baseProt;
static int sharpCount = 0 ;
@@ -89,6 +96,9 @@ static Entry* tempEntry = 0 ;
static Entry* firstTypedefEntry = 0 ;
static Entry* memspecEntry = 0 ;
static int yyLineNr = 1 ;
+static int yyBegLineNr = yyLineNr ;
+static int yyColNr = 1 ;
+static int yyBegColNr = yyColNr ;
static int anonCount = 0 ;
static int anonNSCount = 0 ;
static QCString yyFileName;
@@ -166,7 +176,6 @@ static QCString g_skipBlockName;
static QCString oldStyleArgType;
static QCString docBackup;
static QCString briefBackup;
-static bool g_inputFromFile;
static int docBlockContext;
static QGString docBlock;
@@ -185,6 +194,8 @@ static QCString g_delimiter;
static int g_column;
+static int g_fencedSize=0;
+
//-----------------------------------------------------------------------------
// forward declarations
@@ -216,6 +227,9 @@ static void initParser()
insideCode=FALSE;
insideCli=Config_getBool("CPP_CLI_SUPPORT");
previous = 0;
+ firstTypedefEntry = 0;
+ tempEntry = 0;
+ memspecEntry =0;
}
static void initEntry()
@@ -285,12 +299,19 @@ static void lineCount()
for (p = yytext ; *p ; ++p )
{
if (*p=='\n')
- yyLineNr++,g_column=0;
+ {
+ yyLineNr++,g_column=0,yyColNr=1;
+ }
else if (*p=='\t')
+ {
g_column+=tabSize - (g_column%tabSize);
+ }
else
- g_column++;
+ {
+ g_column++,yyColNr++;
+ }
}
+ //printf("lineCount()=%d\n",g_column);
}
static inline int computeIndent(const char *s,int startIndent)
@@ -505,7 +526,7 @@ static void splitKnRArg(QCString &oldStyleArgPtr,QCString &oldStyleArgName)
oldStyleArgName=current->args.copy().stripWhiteSpace();
}
}
- //fprintf(stderr,"type=%s ptr=%s name=%s\n",oldStyleArgType.data(),oldStyleArgPtr.data(),oldStyleArgName.data());
+ DBG_CTX((stderr,"type=%s ptr=%s name=%s\n",oldStyleArgType.data(),oldStyleArgPtr.data(),oldStyleArgName.data()));
}
//-----------------------------------------------------------------------------
@@ -571,19 +592,11 @@ void fixArgumentListForJavaScript(ArgumentList *al)
static int yyread(char *buf,int max_size)
{
int c=0;
- if (g_inputFromFile)
+ while( c < max_size && inputString[inputPosition] )
{
- c = inputFile.readBlock(buf,max_size);
- if (c==-1) yy_fatal_error("input in flex scanner failed");
- }
- else
- {
- while( c < max_size && inputString[inputPosition] )
- {
- *buf = inputString[inputPosition++] ;
- //printf("%d (%c)\n",*buf,*buf);
- c++; buf++;
- }
+ *buf = inputString[inputPosition++] ;
+ //printf("%d (%c)\n",*buf,*buf);
+ c++; buf++;
}
return c;
}
@@ -592,14 +605,11 @@ static int yyread(char *buf,int max_size)
/* start command character */
CMD ("\\"|"@")
-SECTIONCMD {CMD}("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"xrefitem"|"ingroup"|"callgraph"|"callergraph"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"{"|"verbatim"|"dotfile"|"dot"|"defgroup"|"addtogroup"|"weakgroup"|"class"|"namespace"|"union"|"struct"|"fn"|"var"|"details"|"typedef"|"def"|"overload")|("<"{PRE}">")
+SECTIONCMD {CMD}("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"xrefitem"|"ingroup"|"callgraph"|"callergraph"|"latexonly"|"htmlonly"|"xmlonly"|"docbookonly"|"manonly"|"{"|"verbatim"|"dotfile"|"dot"|"defgroup"|"addtogroup"|"weakgroup"|"class"|"namespace"|"union"|"struct"|"fn"|"var"|"details"|"typedef"|"def"|"overload")|("<"{PRE}">")
BN [ \t\n\r]
BL [ \t\r]*"\n"
B [ \t]
BS ^(({B}*"//")?)(({B}*"*"+)?){B}*
-FILESCHAR [a-z_A-Z0-9\x80-\xFF\\:\\\/\-\+]
-FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+]
-FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]+"\"")
ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)(((~|!){BN}*)?{ID})
@@ -619,6 +629,8 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
/* language parsing states */
+%x AlignAs
+%x AlignAsEnd
%x Define
%x DefineEnd
%x CompoundName
@@ -702,6 +714,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
%x QtPropRead
%x QtPropWrite
%x ReadInitializer
+%x UNOIDLAttributeBlock
%x GetCallType
%x CppQuote
%x EndCppQuote
@@ -1081,6 +1094,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
lineCount();
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
current->section = Entry::FUNCTION_SEC;
current->protection = protection = Public ;
@@ -1105,6 +1119,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type = "id";
}
current->name = yytext;
+ if (insideCpp || insideObjC)
+ {
+ current->id = ClangParser::instance()->lookup(yyLineNr,yytext);
+ }
}
<ObjCMethod>":"{B}* { // start of parameter list
current->name += ':';
@@ -1198,7 +1216,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
roundCount=1;
BEGIN( SkipRound );
}
- else if (strncmp(yytext,"@property",9)==0) // ObjC 2.0 property
+ else if (qstrncmp(yytext,"@property",9)==0) // ObjC 2.0 property
{
current->mtype = mtype = Property;
current->spec|=Entry::Readable | Entry::Writable | Entry::Assign;
@@ -1255,17 +1273,17 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
{
// skip annotation
}
- else if (strcmp(yytext,"@property")==0) // ObjC 2.0 property
+ else if (qstrcmp(yytext,"@property")==0) // ObjC 2.0 property
{
current->mtype = mtype = Property;
current->spec|=Entry::Writable | Entry::Readable;
current->protection = Public ;
}
- else if (strcmp(yytext,"@synthesize")==0)
+ else if (qstrcmp(yytext,"@synthesize")==0)
{
BEGIN( ObjCSkipStatement );
}
- else if (strcmp(yytext,"@dynamic")==0)
+ else if (qstrcmp(yytext,"@dynamic")==0)
{
BEGIN( ObjCSkipStatement );
}
@@ -1287,6 +1305,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type = "namespace" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
lineCount();
}
@@ -1319,6 +1338,17 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->virt = Virtual;
lineCount();
}
+<FindMembers>{B}*"published"{BN}+ { // UNO IDL published keyword
+ if (insideIDL)
+ {
+ lineCount();
+ current->spec |= Entry::Published;
+ }
+ else
+ {
+ REJECT;
+ }
+ }
<FindMembers>{B}*"abstract"{BN}+ {
if (!insidePHP)
{
@@ -1360,6 +1390,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type = "namespace" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
lineCount();
if (insidePHP)
@@ -1380,6 +1411,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type = "module" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
BEGIN( CompoundName );
}
@@ -1403,6 +1435,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type = "library" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
BEGIN( CompoundName );
}
@@ -1412,17 +1445,82 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->name = QCString(yytext).stripWhiteSpace();
}
}
-<FindMembers>{B}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba IDL/Java interface
+<FindMembers>{B}*"constants"{BN}+ { // UNO IDL constant group
+ lineCount();
+ if (insideIDL)
+ {
+ isTypedef=FALSE;
+ current->section = Entry::NAMESPACE_SEC;
+ current->type = "constants";
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+ else
+ {
+ addType( current ) ;
+ current->name = QCString(yytext).stripWhiteSpace();
+ }
+ }
+<FindMembers>{BN}*("service"){BN}+ { // UNO IDL service
+ lineCount();
+ if (insideIDL)
+ {
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Service |
+ // preserve UNO IDL [optional] or published
+ (current->spec & (Entry::Optional|Entry::Published));
+ addType( current ) ;
+ current->type += " service " ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+ else // TODO is addType right? just copy/pasted
+ {
+ addType( current ) ;
+ current->name = QCString(yytext).stripWhiteSpace();
+ }
+ }
+<FindMembers>{BN}*("singleton"){BN}+ { // UNO IDL singleton
+ lineCount();
+ if (insideIDL)
+ {
+ isTypedef=FALSE;
+ current->section = Entry::CLASS_SEC;
+ current->spec = Entry::Singleton |
+ (current->spec & Entry::Published); // preserve
+ addType( current ) ;
+ current->type += " singleton " ;
+ current->fileName = yyFileName;
+ current->startLine = yyLineNr;
+ current->bodyLine = yyLineNr;
+ BEGIN( CompoundName );
+ }
+ else // TODO is addType right? just copy/pasted
+ {
+ addType( current ) ;
+ current->name = QCString(yytext).stripWhiteSpace();
+ }
+ }
+<FindMembers>{BN}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba/UNO IDL/Java interface
lineCount();
if (insideIDL || insideJava || insideCS || insideD || insidePHP)
{
isTypedef=FALSE;
current->section = Entry::CLASS_SEC;
- current->spec = Entry::Interface;
+ current->spec = Entry::Interface |
+ // preserve UNO IDL [optional] or published
+ (current->spec & (Entry::Optional|Entry::Published));
addType( current ) ;
current->type += " interface" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
BEGIN( CompoundName );
}
@@ -1461,6 +1559,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type += " interface" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
BEGIN( CompoundName );
}
@@ -1476,17 +1575,20 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type += " protocol" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
BEGIN( CompoundName );
}
<FindMembers>{B}*"exception"{BN}+ { // Corba IDL exception
isTypedef=FALSE;
current->section = Entry::CLASS_SEC;
- current->spec = Entry::Exception;
+ current->spec = Entry::Exception |
+ (current->spec & Entry::Published); // preserve UNO IDL
addType( current ) ;
current->type += " exception" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
lineCount();
BEGIN( CompoundName );
@@ -1500,6 +1602,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type += " class" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
if (yytext[0]=='@')
{
@@ -1524,6 +1627,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type += " value class" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
lineCount() ;
if (yytext[yyleng-1]=='{') unput('{');
@@ -1538,6 +1642,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type += " ref class" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
lineCount() ;
if (yytext[yyleng-1]=='{') unput('{');
@@ -1552,6 +1657,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type += " interface class" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
lineCount() ;
if (yytext[yyleng-1]=='{') unput('{');
@@ -1566,6 +1672,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type += " coclass" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
lineCount() ;
BEGIN( CompoundName ) ;
@@ -1582,13 +1689,15 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
<FindMembers>{B}*{TYPEDEFPREFIX}"struct"/{BN}+ {
isTypedef=((QCString)yytext).find("typedef")!=-1;
current->section = Entry::CLASS_SEC ;
- current->spec = Entry::Struct;
+ current->spec = Entry::Struct |
+ (current->spec & Entry::Published); // preserve UNO IDL
// bug 582676: can be a struct nested in an interface so keep insideObjC state
//current->objc = insideObjC = FALSE;
addType( current ) ;
current->type += " struct" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
lineCount() ;
if (yytext[yyleng-1]=='{') unput('{');
@@ -1603,6 +1712,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type += " value struct" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
lineCount() ;
if (yytext[yyleng-1]=='{') unput('{');
@@ -1617,6 +1727,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type += " ref struct" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
lineCount() ;
if (yytext[yyleng-1]=='{') unput('{');
@@ -1631,6 +1742,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type += " interface struct";
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
lineCount() ;
if (yytext[yyleng-1]=='{') unput('{');
@@ -1647,6 +1759,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type += " union" ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
lineCount() ;
if (yytext[yyleng-1]=='{') unput('{');
@@ -1674,6 +1787,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->bodyLine = yyLineNr;
lineCount() ;
if (yytext[yyleng-1]=='{') unput('{');
@@ -1819,6 +1933,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
<FindMembers>"using"{BN}+ {
current->startLine=yyLineNr;
+ current->startColumn = yyColNr;
lineCount();
BEGIN(Using);
}
@@ -1840,6 +1955,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->name=yytext;
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->section=Entry::USINGDIR_SEC;
current_root->addSubEntry(current);
current = new Entry ;
@@ -1923,9 +2039,12 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
// *currentTemplateSpec+=yytext;
}
<EndTemplate>"<" {
- current->name+='<';
- // *currentTemplateSpec+='<';
- sharpCount++;
+ if (roundCount==0)
+ {
+ // *currentTemplateSpec+='<';
+ sharpCount++;
+ }
+ current->name+=yytext;
}
<ClassTemplSpec,EndTemplate>">>" {
if (insideJava || insideCS || insideCli || roundCount==0)
@@ -1943,7 +2062,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
<EndTemplate>">" {
current->name+='>';
// *currentTemplateSpec+='>';
- if (--sharpCount<=0)
+ if (roundCount==0 && --sharpCount<=0)
{
//printf("Found %s\n",current->name.data());
BEGIN(FindMembers);
@@ -1953,7 +2072,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
lineCount();
current->name+='>';
// *currentTemplateSpec+='>';
- if (--sharpCount<=0)
+ if (roundCount==0 && --sharpCount<=0)
{
current->bodyLine = yyLineNr;
current->args = "(";
@@ -1967,13 +2086,16 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
<EndTemplate>">"{BN}*/"("({BN}*{ID}{BN}*"::")*({BN}*"*"{BN}*)+ { // function pointer returning a template instance
lineCount();
current->name+='>';
- BEGIN(FindMembers);
+ if (roundCount==0)
+ {
+ BEGIN(FindMembers);
+ }
}
<EndTemplate>">"{BN}*/"::" {
lineCount();
current->name+='>';
// *currentTemplateSpec+='>';
- if (--sharpCount<=0)
+ if (roundCount==0 && --sharpCount<=0)
{
BEGIN(FindMemberName);
}
@@ -2090,57 +2212,68 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
BEGIN(FindMembers);
}
<FindMembers,FindMemberName>{SCOPENAME} {
+ if (insideCpp || insideObjC)
+ {
+ current->id = ClangParser::instance()->lookup(yyLineNr,yytext);
+ }
+ yyBegColNr=yyColNr;
+ yyBegLineNr=yyLineNr;
lineCount();
- if (insideIDL && yyleng==9 && strcmp(yytext,"cpp_quote")==0)
+ if (insideIDL && yyleng==9 && qstrcmp(yytext,"cpp_quote")==0)
{
BEGIN(CppQuote);
}
- else if ((insideIDL || insideJava || insideD) && yyleng==6 && strcmp(yytext,"import")==0)
+ else if ((insideIDL || insideJava || insideD) && yyleng==6 && qstrcmp(yytext,"import")==0)
{
if (insideIDL)
BEGIN(NextSemi);
else // insideJava or insideD
BEGIN(JavaImport);
}
- else if (insidePHP && strcmp(yytext,"use")==0)
+ else if (insidePHP && qstrcmp(yytext,"use")==0)
{
BEGIN(PHPUse);
}
- else if (insideJava && strcmp(yytext,"package")==0)
+ else if (insideJava && qstrcmp(yytext,"package")==0)
{
lineCount();
BEGIN(PackageName);
}
- else if (insideIDL && strcmp(yytext,"case")==0)
+ else if (insideIDL && qstrcmp(yytext,"case")==0)
{
BEGIN(IDLUnionCase);
}
- else if (insideTryBlock && strcmp(yytext,"catch")==0)
+ else if (insideTryBlock && qstrcmp(yytext,"catch")==0)
{
insideTryBlock=FALSE;
BEGIN(TryFunctionBlock);
}
- else if (insideJS && strcmp(yytext,"var")==0)
+ else if (insideCpp && qstrcmp(yytext,"alignas")==0)
+ {
+ lastAlignAsContext = YY_START;
+ BEGIN(AlignAs);
+ }
+ else if (insideJS && qstrcmp(yytext,"var")==0)
{ // javascript variable
current->type="var";
}
- else if (insideJS && strcmp(yytext,"function")==0)
+ else if (insideJS && qstrcmp(yytext,"function")==0)
{ // javascript function
current->type="function";
}
- else if (insideCS && strcmp(yytext,"this")==0)
+ else if (insideCS && qstrcmp(yytext,"this")==0)
{
// C# indexer
addType( current ) ;
current->name="this";
BEGIN(CSIndexer);
}
- else if (insideCpp && strcmp(yytext,"static_assert")==0)
+ else if (insideCpp && qstrcmp(yytext,"static_assert")==0)
{
// C++11 static_assert
BEGIN(StaticAssert);
}
- else if (insideCpp && strcmp(yytext,"decltype")==0)
+ else if (insideCpp && qstrcmp(yytext,"decltype")==0)
{
// C++11 decltype(x)
current->type+=yytext;
@@ -2153,23 +2286,23 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
addType( current ) ;
}
bool javaLike = insideJava || insideCS || insideD || insidePHP || insideJS;
- if (javaLike && strcmp(yytext,"public")==0)
+ if (javaLike && qstrcmp(yytext,"public")==0)
{
current->protection = Public;
}
- else if (javaLike && strcmp(yytext,"protected")==0)
+ else if (javaLike && qstrcmp(yytext,"protected")==0)
{
current->protection = Protected;
}
- else if (javaLike && strcmp(yytext,"internal")==0)
+ else if (javaLike && qstrcmp(yytext,"internal")==0)
{
current->protection = Package;
}
- else if (javaLike && strcmp(yytext,"private")==0)
+ else if (javaLike && qstrcmp(yytext,"private")==0)
{
current->protection = Private;
}
- else if (javaLike && strcmp(yytext,"static")==0)
+ else if (javaLike && qstrcmp(yytext,"static")==0)
{
if (YY_START==FindMembers)
current->name = yytext;
@@ -2366,6 +2499,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
*/
<Define>{ID} {
//printf("Define `%s' without args\n",yytext);
+ if (insideCpp || insideObjC)
+ {
+ current->id = ClangParser::instance()->lookup(yyLineNr,yytext);
+ }
current->bodyLine = yyLineNr;
current->name = yytext;
BEGIN(DefineEnd);
@@ -2375,6 +2512,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
lineCount();
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->type.resize(0);
current->args = current->args.simplifyWhiteSpace();
current->name = current->name.stripWhiteSpace();
@@ -2388,6 +2526,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
//printf("End define\n");
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->type.resize(0);
current->type = "const";
QCString init = current->initializer.data();
@@ -2445,7 +2584,6 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
addType( current );
}
<FindMembers,MemberSpec,Function,NextSemi,EnumBaseType,BitFields,ReadInitializer,OldStyleArgs>";"{BN}*("/**"|"//!"|"/*!"|"///")"<" {
- lineCount();
if (current->bodyLine==-1)
{
current->bodyLine=yyLineNr;
@@ -2456,8 +2594,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
( yytext[yyleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
QCString indent;
- indent.fill(' ',computeIndent(yytext+1,g_column));
+ indent.fill(' ',computeIndent(yytext,g_column));
docBlock=indent;
+ //printf("indent=%d\n",computeIndent(yytext+1,g_column));
+ lineCount();
docBlockTerm = ';';
if (YY_START==EnumBaseType && current->section==Entry::ENUM_SEC)
@@ -2478,15 +2618,15 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
}
<MemberSpec,FindFields,FindMembers,NextSemi,EnumBaseType,BitFields,ReadInitializer,OldStyleArgs>","{BN}*("/**"|"//!"|"/*!"|"///")"<" {
- lineCount();
docBlockContext = YY_START;
docBlockInBody = FALSE;
docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF") ) ||
( yytext[yyleng-2]=='!' && Config_getBool("QT_AUTOBRIEF") );
QCString indent;
- indent.fill(' ',computeIndent(yytext+1,g_column));
+ indent.fill(' ',computeIndent(yytext,g_column));
docBlock=indent;
+ lineCount();
docBlockTerm = ',';
if (YY_START==EnumBaseType && current->section==Entry::ENUM_SEC)
@@ -2507,7 +2647,6 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
}
<DefineEnd,FindFields,FindFieldArg,ReadInitializer,OldStyleArgs>{BN}*("/**"|"//!"|"/*!"|"///")"<" {
- lineCount();
if (current->bodyLine==-1)
{
current->bodyLine=yyLineNr;
@@ -2519,6 +2658,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
QCString indent;
indent.fill(' ',computeIndent(yytext,g_column));
docBlock=indent;
+ lineCount();
docBlockTerm = 0;
if (yytext[yyleng-3]=='/')
@@ -2595,6 +2735,15 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
initBracketCount=0;
BEGIN(ReadInitializer);
}
+<UNOIDLAttributeBlock>{BN}*[gs]"et"{BN}+"raises"{BN}*"("{BN}*{SCOPENAME}{BN}*(","{BN}*{SCOPENAME}{BN}*)*")"{BN}*";" {
+ lineCount();
+ current->exception += " ";
+ current->exception += removeRedundantWhiteSpace(yytext);
+ }
+<UNOIDLAttributeBlock>"}" {
+ current->exception += " }";
+ BEGIN(FindMembers);
+ }
/* Read initializer rules */
<ReadInitializer>"(" {
lastRoundContext=YY_START;
@@ -2616,6 +2765,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
{
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->args = current->args.simplifyWhiteSpace();
current->name = current->name.stripWhiteSpace();
current->section = Entry::VARIABLE_SEC;
@@ -3000,7 +3150,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
yyLineNr = line.mid(s,e-s).toInt();
if (yytext[yyleng-1]=='\n')
{
- yyLineNr++;
+ lineCount();
g_column=0;
}
}
@@ -3108,7 +3258,8 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
current->section = Entry::VARIABLE_SEC ;
current->fileName = yyFileName;
- current->startLine = yyLineNr;
+ current->startLine = yyBegLineNr;
+ current->startColumn = yyBegColNr;
current_root->addSubEntry( current ) ;
needNewCurrent=TRUE;
}
@@ -3201,6 +3352,39 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
current->spec |= Entry::Gettable;
}
+<IDLAttribute>"property" { // UNO IDL property
+ current->spec |= Entry::Property;
+ }
+<IDLAttribute>"attribute" { // UNO IDL attribute
+ current->spec |= Entry::Attribute;
+ }
+<IDLAttribute>"optional" { // on UNO IDL interface/service/attribute/property
+ current->spec |= Entry::Optional;
+ }
+<IDLAttribute>"readonly" { // on UNO IDL attribute or property
+ current->spec |= Entry::Readonly;
+ }
+<IDLAttribute>"bound" { // on UNO IDL attribute or property
+ current->spec |= Entry::Bound;
+ }
+<IDLAttribute>"removable" { // on UNO IDL property
+ current->spec |= Entry::Removable;
+ }
+<IDLAttribute>"constrained" { // on UNO IDL property
+ current->spec |= Entry::Constrained;
+ }
+<IDLAttribute>"transient" { // on UNO IDL property
+ current->spec |= Entry::Transient;
+ }
+<IDLAttribute>"maybevoid" { // on UNO IDL property
+ current->spec |= Entry::MaybeVoid;
+ }
+<IDLAttribute>"maybedefault" { // on UNO IDL property
+ current->spec |= Entry::MaybeDefault;
+ }
+<IDLAttribute>"maybeambiguous" { // on UNO IDL property
+ current->spec |= Entry::MaybeAmbiguous;
+ }
<IDLAttribute>. {
}
<IDLPropName>{BN}*{ID}{BN}* {
@@ -3210,6 +3394,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->name = yytext;
current->name = current->name.left(current->name.length()-1).stripWhiteSpace();
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
BEGIN( IDLProp );
}
<IDLProp>{BN}*"["[^\]]*"]"{BN}* { // attribute of a parameter
@@ -3291,6 +3476,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
<Sharp>. { current->type += *yytext ; }
<FindFields>{ID} {
+ if (insideCpp || insideObjC)
+ {
+ current->id = ClangParser::instance()->lookup(yyLineNr,yytext);
+ }
current->bodyLine = yyLineNr;
current->name = yytext;
}
@@ -3315,6 +3504,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
{
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
current->type = "@"; // enum marker
current->args = current->args.simplifyWhiteSpace();
current->name = current->name.stripWhiteSpace();
@@ -3343,6 +3533,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
{
current->fileName = yyFileName;
current->startLine = yyLineNr;
+ current->startColumn = yyColNr;
if (!(current_root->spec&Entry::Enum))
{
current->type = "@"; // enum marker
@@ -3503,7 +3694,9 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
else
{
- if (!isTypedef) // not typedef
+ static QRegExp re("@[0-9]+$");
+ if (!isTypedef && memspecEntry &&
+ memspecEntry->name.find(re)==-1) // not typedef or anonymous type (see bug691071)
{
// enabled the next two lines for bug 623424
current->doc.resize(0);
@@ -3691,6 +3884,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
varEntry->fileName = yyFileName;
varEntry->startLine = yyLineNr;
+ varEntry->startColumn = yyColNr;
varEntry->doc = current->doc.copy();
varEntry->brief = current->brief.copy();
varEntry->mGrpId = current->mGrpId;
@@ -4131,7 +4325,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
fullArgString+=yytext;
BEGIN(CopyArgVerbatim);
}
-<CopyArgVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}")/[^a-z_A-Z0-9] { // end of verbatim block
+<CopyArgVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}")/[^a-z_A-Z0-9] { // end of verbatim block
fullArgString+=yytext;
if (yytext[1]=='f') // end of formula
{
@@ -4148,7 +4342,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
<CopyArgComment,CopyArgVerbatim>. { fullArgString+=*yytext; }
<CopyArgComment>{CMD}("brief"|"short"){B}+ {
warn(yyFileName,yyLineNr,
- "warning: Ignoring %cbrief command inside argument documentation",*yytext
+ "Ignoring %cbrief command inside argument documentation",*yytext
);
fullArgString+=' ';
}
@@ -4264,7 +4458,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
*/
<FuncQual>[{:;,] {
- if ( strcmp(yytext,";")==0 &&
+ if ( qstrcmp(yytext,";")==0 &&
insidePHP &&
!containsWord(current->type,"function") )
{
@@ -4446,7 +4640,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
lineCount();
}
<FuncQual>{ID} { // typically a K&R style C function
- if (insideCS && strcmp(yytext,"where")==0)
+ if (insideCS && qstrcmp(yytext,"where")==0)
{
// type contraint for a method
delete current->typeConstr;
@@ -4457,7 +4651,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
else if (checkForKnRstyleC())
{
- //fprintf(stderr,"===> got a K&R style function\n");
+ DBG_CTX((stderr,"===> got a K&R style function\n"));
current->args = yytext;
oldStyleArgType.resize(0);
BEGIN(OldStyleArgs);
@@ -4562,7 +4756,8 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->args=removeRedundantWhiteSpace(current->args);
// was: current->args.simplifyWhiteSpace();
current->fileName = yyFileName;
- current->startLine = yyLineNr;
+ current->startLine = yyBegLineNr;
+ current->startColumn = yyBegColNr;
static QRegExp re("([^)]*[*&][^)]*)"); // (...*...)
if (*yytext!=';' || (current_root->section&Entry::COMPOUND_MASK) )
{
@@ -4846,7 +5041,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
<SkipInits>; {
warn(yyFileName,yyLineNr,
- "warning: Found ';' while parsing initializer list! "
+ "Found ';' while parsing initializer list! "
"(doxygen could be confused by a macro call without semicolon)"
);
BEGIN( FindMembers );
@@ -4892,7 +5087,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
unput(':');
BEGIN(ClassVar);
}
-<Bases,CompoundName>";" {
+<CompoundName>";" {
current->section = Entry::EMPTY_SEC ;
current->type.resize(0) ;
current->name.resize(0) ;
@@ -4900,6 +5095,37 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->argList->clear();
BEGIN( FindMembers ) ;
}
+<Bases>";" {
+ if (insideIDL && (current->spec & (Entry::Singleton |
+ Entry::Service)))
+ {
+ // in UNO IDL a service or singleton may be defined
+ // completely like this: "service Foo : XFoo;"
+ if (!current->name.isEmpty() && !current_root->name.isEmpty())
+ {
+ prependScope();
+ }
+ current->name = current->name.stripWhiteSpace();
+ // there can be only one base class here
+ if (!baseName.isEmpty())
+ {
+ current->extends->append(
+ new BaseInfo(baseName,Public,Normal));
+ baseName.resize(0);
+ }
+ current_root->addSubEntry( current ) ;
+ current = new Entry;
+ }
+ else
+ {
+ current->section = Entry::EMPTY_SEC ;
+ current->type.resize(0) ;
+ current->name.resize(0) ;
+ current->args.resize(0) ;
+ current->argList->clear();
+ }
+ BEGIN( FindMembers ) ;
+ }
<CompoundName>{SCOPENAME}{BN}*/"<" {
sharpCount = 0;
current->name = yytext ;
@@ -4979,9 +5205,37 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->name = yytext;
current->name=current->name.left(current->name.length()-1).stripWhiteSpace();
//printf("template class declaration for %s!\n",current->name.data());
+ QCString rn = current_root->name.copy();
+ //printf("cn=`%s' rn=`%s' isTypedef=%d\n",cn.data(),rn.data(),isTypedef);
+ if (!current->name.isEmpty() && !rn.isEmpty())
+ {
+ prependScope();
+ }
current_root->addSubEntry(current);
current = new Entry;
}
+ else if (insideIDL &&
+ (((current_root->spec & (Entry::Interface |
+ Entry::Service)) &&
+ (current->spec & Entry::Interface)) ||
+ ((current_root->spec & (Entry::Service |
+ Entry::Singleton)) &&
+ (current->spec & Entry::Service))))
+ {
+ // interface inside of UNO IDL service or interface
+ // service inside of UNO IDL service or singleton
+ // there may be documentation on the member,
+ // so do not throw it away...
+ current->name = yytext;
+ current->name=current->name.left(current->name.length()-1).stripWhiteSpace();
+ current->section = (current->spec & Entry::Interface)
+ ? Entry::EXPORTED_INTERFACE_SEC
+ : Entry::INCLUDED_SERVICE_SEC;
+// current->section = Entry::MEMBERDOC_SEC;
+ current->spec &= ~(Entry::Interface|Entry::Service); // FIXME: horrible: Interface == Gettable, so need to clear it - actually we're mixing values from different enums in this case... granted only Optional and Interface are actually valid in this context but urgh...
+ current_root->addSubEntry(current);
+ current = new Entry;
+ }
unput(';');
current->reset();
@@ -4995,12 +5249,33 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
<CompoundName>{SCOPENAME}/{BN}*"(" {
current->name = yytext ;
lineCount();
- if (current->spec & Entry::Protocol)
- {
- current->name += "-p";
- }
- BEGIN( ClassVar );
+ if (insideCpp && current->name=="alignas") // C++11
+ {
+ lastAlignAsContext = YY_START;
+ BEGIN( AlignAs );
+ }
+ else
+ {
+ if (current->spec & Entry::Protocol)
+ {
+ current->name += "-p";
+ }
+ BEGIN( ClassVar );
+ }
}
+<AlignAs>"(" { roundCount=1;
+ BEGIN( AlignAsEnd );
+ }
+<AlignAs>\n { lineCount(); }
+<AlignAs>.
+<AlignAsEnd>"(" { roundCount++; }
+<AlignAsEnd>")" { if (--roundCount<=0)
+ {
+ BEGIN( lastAlignAsContext );
+ }
+ }
+<AlignAsEnd>\n { lineCount(); }
+<AlignAsEnd>.
<CompoundName>{SCOPENAME}/{BN}*"," { // multiple forward declarations on one line
// e.g. @protocol A,B;
current->reset();
@@ -5008,6 +5283,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
<CompoundName>{SCOPENAME} {
current->name = yytext ;
+ if (insideCpp || insideObjC)
+ {
+ current->id = ClangParser::instance()->lookup(yyLineNr,yytext);
+ }
lineCount();
if (current->spec & Entry::Protocol)
{
@@ -5026,7 +5305,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
BEGIN( ClassVar );
}
<ClassVar>{SCOPENAME}{BN}*/"(" {
- if (insideIDL && strncmp(yytext,"switch",6)==0 && !isId(yytext[6]))
+ if (insideIDL && qstrncmp(yytext,"switch",6)==0 && !isId(yytext[6]))
{
// Corba IDL style union
roundCount=0;
@@ -5069,13 +5348,17 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
}
<ClassVar>{ID} {
- if (insideIDL && strcmp(yytext,"switch")==0)
+ if (insideCpp || insideObjC)
+ {
+ current->id = ClangParser::instance()->lookup(yyLineNr,yytext);
+ }
+ if (insideIDL && qstrcmp(yytext,"switch")==0)
{
// Corba IDL style union
roundCount=0;
BEGIN(SkipUnionSwitch);
}
- else if ((insideJava || insidePHP || insideJS) && (strcmp(yytext,"implements")==0 || strcmp(yytext,"extends")==0))
+ else if ((insideJava || insidePHP || insideJS) && (qstrcmp(yytext,"implements")==0 || qstrcmp(yytext,"extends")==0))
{
current->type.resize(0);
baseProt=Public;
@@ -5083,7 +5366,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
baseName.resize(0);
BEGIN( BasesProt ) ;
}
- else if (insideCS && strcmp(yytext,"where")==0) // C# type contraint
+ else if (insideCS && qstrcmp(yytext,"where")==0) // C# type contraint
{
delete current->typeConstr;
current->typeConstr = new ArgumentList;
@@ -5091,15 +5374,15 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
lastCSConstraint = YY_START;
BEGIN( CSConstraintName );
}
- else if (insideCli && strcmp(yytext,"abstract")==0)
+ else if (insideCli && qstrcmp(yytext,"abstract")==0)
{
current->spec|=Entry::Abstract;
}
- else if (insideCli && strcmp(yytext,"sealed")==0)
+ else if (insideCli && qstrcmp(yytext,"sealed")==0)
{
current->spec|=Entry::Sealed;
}
- else if (strcmp(yytext,"final")==0)
+ else if (qstrcmp(yytext,"final")==0)
{
current->spec|=Entry::Final;
}
@@ -5229,7 +5512,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
(current->spec & Entry::Struct) ||
(current->spec & Entry::Ref) ||
(current->spec & Entry::Value) ||
- insidePHP || insideCS || insideD || insideObjC
+ insidePHP || insideCS || insideD || insideObjC || insideIDL
)
baseProt=Public;
else
@@ -5263,6 +5546,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->program+=yytext;
current->fileName = yyFileName ;
current->startLine = yyLineNr ;
+ current->startColumn = yyColNr;
curlyCount=0;
BEGIN( ReadBodyIntf );
}
@@ -5281,6 +5565,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->program+=yytext;
current->fileName = yyFileName ;
current->startLine = yyLineNr ;
+ current->startColumn = yyColNr;
curlyCount=0;
BEGIN( ReadBodyIntf );
}
@@ -5288,6 +5573,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
<CompoundName,ClassVar>{B}*"{"{B}* {
current->fileName = yyFileName ;
current->startLine = yyLineNr ;
+ current->startColumn = yyColNr;
current->name = removeRedundantWhiteSpace(current->name);
if (current->name.isEmpty() && !isTypedef) // anonymous compound
{
@@ -5510,7 +5796,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
if ((current->spec & (Entry::Interface|Entry::Struct)) ||
insideJava || insidePHP || insideCS ||
- insideD || insideObjC)
+ insideD || insideObjC || insideIDL)
{
baseProt=Public;
}
@@ -5543,6 +5829,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
<Bases>{B}*"{"{B}* { current->fileName = yyFileName ;
current->startLine = yyLineNr ;
+ current->startColumn = yyColNr;
current->name = removeRedundantWhiteSpace(current->name);
if (!baseName.isEmpty())
current->extends->append(
@@ -5610,7 +5897,11 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
docBlockContext = YY_START;
docBlockInBody = YY_START==SkipCurly;
docBlockAutoBrief = Config_getBool("QT_AUTOBRIEF");
- docBlock.resize(0);
+
+ QCString indent;
+ indent.fill(' ',computeIndent(yytext,g_column));
+ docBlock=indent;
+
if (docBlockAutoBrief)
{
current->briefLine = yyLineNr;
@@ -5657,7 +5948,11 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
docBlockContext = YY_START;
docBlockInBody = YY_START==SkipCurly;
docBlockAutoBrief = FALSE;
- docBlock.resize(0);
+
+ QCString indent;
+ indent.fill(' ',computeIndent(yytext,g_column));
+ docBlock=indent;
+
startCommentBlock(current->brief.isEmpty());
BEGIN( DocLine );
}
@@ -5671,7 +5966,9 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
docBlockContext = YY_START;
docBlockInBody = YY_START==SkipCurly;
docBlockAutoBrief = FALSE;
- docBlock.resize(0);
+ QCString indent;
+ indent.fill(' ',computeIndent(yytext,g_column));
+ docBlock=indent;
startCommentBlock(current->brief.isEmpty());
BEGIN( DocLine );
}
@@ -5700,6 +5997,13 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
curlyCount=0;
BEGIN( CSAccessorDecl );
}
+ else if (insideIDL && (current->spec & Entry::Attribute))
+ {
+ // UNO IDL: attributes may have setter and getter
+ // exception specifications
+ current->exception = " {";
+ BEGIN(UNOIDLAttributeBlock);
+ }
else
{
if ((insideJava || insideCS || insideD) &&
@@ -5774,6 +6078,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
docBlock.resize(docBlock.length() - 3);
lineCount();
}
+<DocLine>{B}*"///"[/]+{B}*/"\n" { // ignore marker line (see bug700345)
+ handleCommentBlock(docBlock.data(),current->brief.isEmpty());
+ BEGIN( docBlockContext );
+ }
<DocLine>[^\n]*/"\n" { // whole line
docBlock+=yytext;
handleCommentBlock(docBlock.data(),current->brief.isEmpty());
@@ -5786,6 +6094,12 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
handleCommentBlock(docBlock.data(),FALSE);
BEGIN(docBlockContext);
}
+<DocBlock>^{B}*"*"+/[^/] {
+
+ QCString indent;
+ indent.fill(' ',computeIndent(yytext,g_column));
+ docBlock+=indent;
+ }
<DocBlock>^{B}*("//")?{B}*"*"+/[^//a-z_A-Z0-9*] { // start of a comment line
QCString indent;
indent.fill(' ',computeIndent(yytext,g_column));
@@ -5810,18 +6124,26 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
{
docBlockName.at(1)='}';
}
+ g_fencedSize=0;
BEGIN(DocCopyBlock);
}
<DocBlock>"<"{PRE}">" {
docBlock+=yytext;
docBlockName="<pre>";
+ g_fencedSize=0;
BEGIN(DocCopyBlock);
}
<DocBlock>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"dot"|"code")/[^a-z_A-Z0-9] { // verbatim command (which could contain nested comments!)
docBlock+=yytext;
docBlockName=&yytext[1];
+ g_fencedSize=0;
BEGIN(DocCopyBlock);
}
+<DocBlock>"~~~"[~]* {
+ docBlock+=yytext;
+ g_fencedSize=yyleng;
+ BEGIN(DocCopyBlock);
+ }
<DocBlock>{B}*"<code>" {
if (insideCS)
{
@@ -5834,7 +6156,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
REJECT;
}
}
-<DocBlock>[^@*\/\\\n]+ { // any character that isn't special
+<DocBlock>[^@*~\/\\\n]+ { // any character that isn't special
docBlock+=yytext;
}
<DocBlock>\n { // newline
@@ -5865,7 +6187,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
docBlock+=yytext;
BEGIN(DocBlock);
}
-<DocCopyBlock>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endmanonly"|"enddot"|"endcode")/[^a-z_A-Z0-9] { // end of verbatim block
+<DocCopyBlock>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endmanonly"|"enddot"|"endcode")/[^a-z_A-Z0-9] { // end of verbatim block
docBlock+=yytext;
if (&yytext[4]==docBlockName)
{
@@ -5877,6 +6199,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
{
REJECT;
}
+ else if (docBlockName=="code")
+ {
+ REJECT;
+ }
else
{
QCString indent;
@@ -5884,7 +6210,26 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
docBlock+=indent;
}
}
-<DocCopyBlock>[^\<@/*\]\$\\\n]+ { // any character that is not special
+<DocCopyBlock>^{B}*"*"+/{BN}* { // start of a comment line
+ if (docBlockName=="code")
+ {
+ QCString indent;
+ indent.fill(' ',computeIndent(yytext,0));
+ docBlock+=indent;
+ }
+ else
+ {
+ REJECT;
+ }
+ }
+<DocCopyBlock>"~~~"[~]* {
+ docBlock+=yytext;
+ if (g_fencedSize==yyleng)
+ {
+ BEGIN(DocBlock);
+ }
+ }
+<DocCopyBlock>[^\<@/*\]~\$\\\n]+ { // any character that is not special
docBlock+=yytext;
}
<DocCopyBlock>"/*"|"*/"|"//" {
@@ -5899,7 +6244,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
<DocCopyBlock><<EOF>> {
warn(yyFileName,yyLineNr,
- "warning: reached end of file while inside a %s block!\n"
+ "reached end of file while inside a %s block!\n"
"The command that should end the block seems to be missing!\n",
docBlockName.data());
yyterminate();
@@ -6174,7 +6519,6 @@ static void handleParametersCommentBlocks(ArgumentList *al)
static void parseCompounds(Entry *rt)
{
//printf("parseCompounds(%s)\n",rt->name.data());
- g_inputFromFile = FALSE;
EntryListIterator eli(*rt->children());
Entry *ce;
for (;(ce=eli.current());++eli)
@@ -6198,19 +6542,19 @@ static void parseCompounds(Entry *rt)
yyFileName = ce->fileName;
//setContext();
yyLineNr = ce->startLine ;
+ yyColNr = ce->startColumn ;
insideObjC = ce->lang==SrcLangExt_ObjC;
//printf("---> Inner block starts at line %d objC=%d\n",yyLineNr,insideObjC);
//current->reset();
if (current) delete current;
current = new Entry;
- initEntry();
gstat = FALSE;
+ initEntry();
int ni=ce->name.findRev("::"); if (ni==-1) ni=0; else ni+=2;
// set default protection based on the compound type
if( ce->section==Entry::CLASS_SEC ) // class
{
-
- if (insidePHP || insideD || insideJS)
+ if (insidePHP || insideD || insideJS || insideIDL)
{
current->protection = protection = Public ;
}
@@ -6280,14 +6624,16 @@ static void parseCompounds(Entry *rt)
//----------------------------------------------------------------------------
-static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
+static void parseMain(const char *fileName,
+ const char *fileBuf,
+ Entry *rt,
+ bool sameTranslationUnit,
+ QStrList & filesInSameTranslationUnit)
{
initParser();
- //g_inputFromFile = TRUE;
inputString = fileBuf;
inputPosition = 0;
- g_inputFromFile = FALSE;
g_column = 0;
//anonCount = 0; // don't reset per file
@@ -6304,6 +6650,18 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
yyLineNr= 1 ;
yyFileName = fileName;
setContext();
+ bool processWithClang = insideCpp || insideObjC;
+ if (processWithClang)
+ {
+ if (!sameTranslationUnit) // new file
+ {
+ ClangParser::instance()->start(fileName,filesInSameTranslationUnit);
+ }
+ else
+ {
+ ClangParser::instance()->switchToFile(fileName);
+ }
+ }
rt->lang = language;
msg("Parsing file %s...\n",yyFileName.data());
@@ -6337,7 +6695,7 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
if (YY_START==Comment)
{
- warn(yyFileName,yyLineNr,"warning: File ended in the middle of a comment block! Perhaps a missing \\endcode?");
+ warn(yyFileName,yyLineNr,"File ended in the middle of a comment block! Perhaps a missing \\endcode?");
}
//forceEndGroup();
@@ -6361,6 +6719,7 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
inputFile.close();
anonNSCount++;
+
}
}
@@ -6374,24 +6733,25 @@ static void parsePrototype(const QCString &text)
warn(yyFileName,yyLineNr,"Empty prototype found!");
return;
}
+ if (!current) // nothing to store (see bug683516)
+ {
+ return;
+ }
const char *orgInputString;
int orgInputPosition;
YY_BUFFER_STATE orgState;
- bool orgInputFromFile;
// save scanner state
orgState = YY_CURRENT_BUFFER;
yy_switch_to_buffer(yy_create_buffer(scanYYin, YY_BUF_SIZE));
orgInputString = inputString;
orgInputPosition = inputPosition;
- orgInputFromFile = g_inputFromFile;
// set new string
inputString = text;
inputPosition = 0;
g_column = 0;
- g_inputFromFile = FALSE;
scanYYrestart( scanYYin );
BEGIN(Prototype);
scanYYlex();
@@ -6407,7 +6767,6 @@ static void parsePrototype(const QCString &text)
yy_delete_buffer(tmpState);
inputString = orgInputString;
inputPosition = orgInputPosition;
- g_inputFromFile = orgInputFromFile;
//printf("**** parsePrototype end\n");
}
@@ -6436,10 +6795,28 @@ void scanFreeScanner()
//----------------------------------------------------------------------------
-void CLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+void CLanguageScanner::startTranslationUnit(const char *)
+{
+}
+
+void CLanguageScanner::finishTranslationUnit()
+{
+ bool processWithClang = insideCpp || insideObjC;
+ if (processWithClang)
+ {
+ ClangParser::instance()->finish();
+ }
+}
+
+void CLanguageScanner::parseInput(const char *fileName,
+ const char *fileBuf,
+ Entry *root,
+ bool sameTranslationUnit,
+ QStrList & filesInSameTranslationUnit)
{
g_thisParser = this;
- ::parseMain(fileName,fileBuf,root);
+ ::parseMain(fileName,fileBuf,root,
+ sameTranslationUnit,filesInSameTranslationUnit);
}
void CLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
@@ -6464,7 +6841,8 @@ void CLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
bool CLanguageScanner::needsPreprocessing(const QCString &extension)
{
QCString fe=extension.lower();
- return
+ SrcLangExt lang = getLanguageFromFileName(extension);
+ return (SrcLangExt_Cpp == lang) ||
!( fe==".java" || fe==".as" || fe==".d" || fe==".php" ||
fe==".php4" || fe==".inc" || fe==".phtml"
);
diff --git a/src/search.css b/src/search.css
index e467ae0..a77ab21 100644
--- a/src/search.css
+++ b/src/search.css
@@ -48,7 +48,7 @@
height:19px;
background:url('search_m.png') repeat-x;
border:none;
- width:116px;
+ width:111px;
margin-left:20px;
padding-left:4px;
color: #909090;
diff --git a/src/search_css.h b/src/search_css.h
index 9c3b08a..48c4df9 100644
--- a/src/search_css.h
+++ b/src/search_css.h
@@ -48,7 +48,7 @@
" height:19px;\n"
" background:url('search_m.png') repeat-x;\n"
" border:none;\n"
-" width:116px;\n"
+" width:111px;\n"
" margin-left:20px;\n"
" padding-left:4px;\n"
" color: #909090;\n"
diff --git a/src/searchindex.cpp b/src/searchindex.cpp
index fef0f13..0380b33 100644
--- a/src/searchindex.cpp
+++ b/src/searchindex.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -92,7 +92,9 @@ void SearchIndex::setCurrentDoc(Definition *ctx,const char *anchor,bool isSource
//printf("SearchIndex::setCurrentDoc(%s,%s,%s)\n",name,baseName,anchor);
QCString url=isSourceFile ? ((FileDef*)ctx)->getSourceFileBase() : ctx->getOutputFileBase();
url+=Config_getString("HTML_FILE_EXTENSION");
+ QCString baseUrl = url;
if (anchor) url+=QCString("#")+anchor;
+ if (!isSourceFile) baseUrl=url;
QCString name=ctx->qualifiedName();
if (ctx->definitionType()==Definition::TypeMember)
{
@@ -164,11 +166,11 @@ void SearchIndex::setCurrentDoc(Definition *ctx,const char *anchor,bool isSource
}
}
- int *pIndex = m_url2IdMap.find(url);
+ int *pIndex = m_url2IdMap.find(baseUrl);
if (pIndex==0)
{
++m_urlIndex;
- m_url2IdMap.insert(url,new int(m_urlIndex));
+ m_url2IdMap.insert(baseUrl,new int(m_urlIndex));
m_urls.insert(m_urlIndex,new URL(name,url));
}
else
@@ -414,7 +416,7 @@ struct SearchDocEntry
QCString type;
QCString name;
QCString args;
- QCString tagFile;
+ QCString extId;
QCString url;
GrowBuf importantText;
GrowBuf normalText;
@@ -422,11 +424,7 @@ struct SearchDocEntry
struct SearchIndexExternal::Private
{
- Private() : docEntries(257) {}
- //QFile f;
- //bool openOk;
- //FTextStream t;
- //bool insideDoc;
+ Private() : docEntries(12251) {}
SDict<SearchDocEntry> docEntries;
SearchDocEntry *current;
};
@@ -436,29 +434,11 @@ SearchIndexExternal::SearchIndexExternal() : SearchIndexIntf(External)
p = new SearchIndexExternal::Private;
p->docEntries.setAutoDelete(TRUE);
p->current=0;
- //p->f.setName(fileName);
- //p->openOk = p->f.open(IO_WriteOnly);
- //if (p->openOk)
- //{
- // p->t.setDevice(&p->f);
- // p->t << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl;
- // p->t << "<add>" << endl;
- // p->insideDoc=FALSE;
- //}
}
SearchIndexExternal::~SearchIndexExternal()
{
- //if (p->openOk)
- //{
- // if (p->insideDoc)
- // {
- // p->t << " </doc>" << endl;
- // }
- // p->t << "</add>" << endl;
- // p->f.close();
- // p->openOk=FALSE;
- //}
+ //printf("p->docEntries.count()=%d\n",p->docEntries.count());
delete p;
}
@@ -519,13 +499,14 @@ static QCString definitionToName(Definition *ctx)
void SearchIndexExternal::setCurrentDoc(Definition *ctx,const char *anchor,bool isSourceFile)
{
- QCString tagFile = stripPath(Config_getString("GENERATE_TAGFILE"));
+ QCString extId = stripPath(Config_getString("EXTERNAL_SEARCH_ID"));
QCString baseName = isSourceFile ? ((FileDef*)ctx)->getSourceFileBase() : ctx->getOutputFileBase();
QCString url = baseName + Doxygen::htmlFileExtension;
if (anchor) url+=QCString("#")+anchor;
- QCString key = tagFile+";"+url;
+ QCString key = extId+";"+url;
p->current = p->docEntries.find(key);
+ //printf("setCurrentDoc(url=%s,isSourceFile=%d) current=%p\n",url.data(),isSourceFile,p->current);
if (!p->current)
{
SearchDocEntry *e = new SearchDocEntry;
@@ -535,7 +516,7 @@ void SearchIndexExternal::setCurrentDoc(Definition *ctx,const char *anchor,bool
{
e->args = ((MemberDef*)ctx)->argsString();
}
- e->tagFile = tagFile;
+ e->extId = extId;
e->url = url;
p->current = e;
p->docEntries.append(key,e);
@@ -573,9 +554,9 @@ void SearchIndexExternal::write(const char *fileName)
{
t << " <field name=\"args\">" << convertToXML(doc->args) << "</field>" << endl;
}
- if (!doc->tagFile.isEmpty())
+ if (!doc->extId.isEmpty())
{
- t << " <field name=\"tag\">" << convertToXML(doc->tagFile) << "</field>" << endl;
+ t << " <field name=\"tag\">" << convertToXML(doc->extId) << "</field>" << endl;
}
t << " <field name=\"url\">" << convertToXML(doc->url) << "</field>" << endl;
t << " <field name=\"keywords\">" << convertToXML(doc->importantText.get()) << "</field>" << endl;
@@ -649,7 +630,7 @@ class SearchIndexList : public SDict< QList<Definition> >
QList<Definition> *md2=(QList<Definition> *)item2;
QCString n1 = md1->first()->localName();
QCString n2 = md2->first()->localName();
- return stricmp(n1.data(),n2.data());
+ return qstricmp(n1.data(),n2.data());
}
};
diff --git a/src/searchindex.h b/src/searchindex.h
index ddfe384..2ce80e8 100644
--- a/src/searchindex.h
+++ b/src/searchindex.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/section.h b/src/section.h
index d3dfc7e..486656d 100644
--- a/src/section.h
+++ b/src/section.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/settings.h b/src/settings.h
new file mode 100644
index 0000000..a9fd128
--- /dev/null
+++ b/src/settings.h
@@ -0,0 +1,12 @@
+#ifndef SETTINGS_H
+#define SETTINGS_H
+
+#define USE_SQLITE3 0
+#define USE_LIBCLANG 0
+
+#define IS_SUPPORTED(x) \
+ ((USE_SQLITE3 && strcmp("USE_SQLITE3",(x))==0) || \
+ (USE_LIBCLANG && strcmp("USE_LIBCLANG",(x))==0) || \
+ 0)
+
+#endif
diff --git a/src/sortdict.h b/src/sortdict.h
index 02f1f7b..14a221b 100644
--- a/src/sortdict.h
+++ b/src/sortdict.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/sqlite3gen.cpp b/src/sqlite3gen.cpp
new file mode 100644
index 0000000..931341d
--- /dev/null
+++ b/src/sqlite3gen.cpp
@@ -0,0 +1,1361 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "settings.h"
+#include "message.h"
+
+#if USE_SQLITE3
+
+#include "qtbc.h"
+#include "sqlite3gen.h"
+#include "doxygen.h"
+#include "config.h"
+#include "util.h"
+#include "docparser.h"
+#include "language.h"
+
+#include "arguments.h"
+#include "classlist.h"
+#include "filedef.h"
+#include "namespacedef.h"
+#include "filename.h"
+
+#include <qdir.h>
+#include <string.h>
+#include <sqlite3.h>
+
+//#define DBG_CTX(x) printf x
+#define DBG_CTX(x) do { } while(0)
+
+//////////////////////////////////////////////////////
+const char *i_q_includes="INSERT OR REPLACE INTO includes "
+ "( refid, local, name ) "
+ "VALUES "
+ "(:refid,:local,:name )" ;
+const char *c_q_includes="SELECT count(*) from includes where refid=:refid and local=:local and name=:name";
+static sqlite3_stmt *i_s_includes=0;
+static sqlite3_stmt *c_s_includes=0;
+//////////////////////////////////////////////////////
+const char *i_q_innerclass="INSERT OR REPLACE INTO innerclass "
+ "( refid, prot, name )"
+ "VALUES "
+ "(:refid,:prot,:name )";
+static sqlite3_stmt *i_s_innerclass=0;
+//////////////////////////////////////////////////////
+const char *i_q_files="INSERT OR REPLACE INTO files "
+ "( name )"
+ "VALUES "
+ "(:name )";
+const char *id_q_files="SELECT id from files where name=:name";
+static sqlite3_stmt *id_s_files=0;
+static sqlite3_stmt *i_s_files=0;
+//////////////////////////////////////////////////////
+const char *i_q_xrefs="INSERT OR REPLACE INTO xrefs "
+ "( src, dst, id_file, line, column )"
+ "VALUES "
+ "(:src,:dst,:id_file,:line,:column )";
+static sqlite3_stmt *i_s_xrefs=0;
+//////////////////////////////////////////////////////
+const char *i_q_memberdef="INSERT OR REPLACE INTO memberdef "
+ "( refid, prot, static, const, explicit, inline, final, sealed, new, optional, required, virt, mutable, initonly, readable, writable, gettable, settable, accessor, addable, removable, raisable, name, type, definition, argsstring, scope, kind, id_bfile, bline, bcolumn, id_file, line, column)"
+ "VALUES "
+ "(:refid,:prot,:static,:const,:explicit,:inline,:final,:sealed,:new,:optional,:required,:virt,:mutable,:initonly,:readable,:writable,:gettable,:settable,:accessor,:addable,:removable,:raisable,:name,:type,:definition,:argsstring,:scope,:kind,:id_bfile,:bline,:bcolumn,:id_file,:line,:column)";
+const char *id_q_memberdef="SELECT id from memberdef where refid=:refid and id is not null";
+static sqlite3_stmt *id_s_memberdef=0;
+static sqlite3_stmt *i_s_memberdef=0;
+//////////////////////////////////////////////////////
+const char *i_q_compounddef="INSERT OR REPLACE INTO compounddef "
+ "( name, kind, prot, refid, id_file, line, column ) "
+ "VALUES "
+ "(:name,:kind,:prot,:refid,:id_file,:line,:column )";
+static sqlite3_stmt *i_s_compounddef=0;
+//////////////////////////////////////////////////////
+const char *i_q_basecompoundref="INSERT OR REPLACE INTO basecompoundref "
+ "( base, derived, refid, prot, virt ) "
+ "VALUES "
+ "(:base,:derived,:refid,:prot,:virt )" ;
+static sqlite3_stmt *i_s_basecompoundref=0;
+//////////////////////////////////////////////////////
+const char *i_q_derivedcompoundref="INSERT OR REPLACE INTO derivedcompoundref "
+ "( refid, prot, virt, base, derived ) "
+ "VALUES "
+ "(:refid,:prot,:virt,:base,:derived )" ;
+static sqlite3_stmt *i_s_derivedcompoundref=0;
+//////////////////////////////////////////////////////
+
+const char * schema_queries[][2] =
+{
+ {
+ "compounddef",
+ "CREATE TABLE IF NOT EXISTS compounddef ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
+ "name TEXT NOT NULL,"
+ "kind TEXT NOT NULL,"
+ "prot INTEGER NOT NULL,"
+ "refid TEXT NOT NULL,"
+ "id_file INTEGER NOT NULL,"
+ "line INTEGER NOT NULL,"
+ "column INTEGER NOT NULL)"
+ },
+ {
+ "basecompoundref",
+ "CREATE TABLE IF NOT EXISTS basecompoundref ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "base TEXT NOT NULL,"
+ "derived TEXT NOT NULL,"
+ "refid TEXT NOT NULL,"
+ "prot INTEGER NOT NULL,"
+ "virt INTEGER NOT NULL)"
+ },
+ {
+ "derivedcompoundref",
+ "CREATE TABLE IF NOT EXISTS derivedcompoundref ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "base TEXT NOT NULL,"
+ "derived TEXT NOT NULL,"
+ "refid TEXT NOT NULL,"
+ "prot INTEGER NOT NULL,"
+ "virt INTEGER NOT NULL)"
+ },
+ {
+ "includes",
+ "CREATE TABLE IF NOT EXISTS includes ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "refid TEXT NOT NULL,"
+ "local INTEGER NOT NULL,"
+ "name TEXT NOT NULL)"
+ },
+ {
+ "innerclass",
+ "CREATE TABLE IF NOT EXISTS innerclass ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "refid TEXT NOT NULL,"
+ "prot INTEGER NOT NULL,"
+ "name TEXT NOT NULL)"
+ },
+ {
+ "files",
+ "CREATE TABLE IF NOT EXISTS files ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "name TEXT NOT NULL)"
+ },
+ {
+ "xrefs",
+ "CREATE TABLE IF NOT EXISTS xrefs ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "src TEXT NOT NULL, "
+ "dst TEXT NOT NULL, "
+ "id_file INTEGER NOT NULL, "
+ "line INTEGER, "
+ "column INTEGER)"
+ },
+ {
+ "memberdef",
+ "CREATE TABLE IF NOT EXISTS memberdef ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "name TEXT NOT NULL,"
+ "definition TEXT,"
+ "type TEXT,"
+ "argsstring TEXT,"
+ "scope TEXT,"
+ "prot INTEGER NOT NULL,"
+ "static INTEGER NOT NULL,"
+ "const INTEGER,"
+ "explicit INTEGER,"
+ "inline INTEGER,"
+ "final INTEGER,"
+ "sealed INTEGER,"
+ "new INTEGER,"
+ "optional INTEGER,"
+ "required INTEGER,"
+ "virt INTEGER,"
+ "mutable INTEGER,"
+ "initonly INTEGER,"
+ "readable INTEGER,"
+ "writable INTEGER,"
+ "gettable INTEGER,"
+ "settable INTEGER,"
+ "accessor INTEGER,"
+ "addable INTEGER,"
+ "removable INTEGER,"
+ "raisable INTEGER,"
+ "kind INTEGER,"
+ "refid TEXT NOT NULL,"
+ "id_bfile INTEGER,"
+ "bline INTEGER,"
+ "bcolumn INTEGER,"
+ "id_file INTEGER NOT NULL,"
+ "line INTEGER NOT NULL,"
+ "column INTEGER NOT NULL)"
+ },
+};
+
+
+class TextGeneratorSqlite3Impl : public TextGeneratorIntf
+{
+ public:
+ TextGeneratorSqlite3Impl(StringList &l) : l(l) {
+ l.setAutoDelete(TRUE);
+ }
+ void writeString(const char * /*s*/,bool /*keepSpaces*/) const
+ {
+ }
+ void writeBreak(int) const
+ {
+ DBG_CTX(("writeBreak\n"));
+ }
+ void writeLink(const char * /*extRef*/,const char *file,
+ const char *anchor,const char * /*text*/
+ ) const
+ {
+ QCString *rs=new QCString(file);
+ if (anchor)
+ {
+ rs->append("_1").append(anchor);
+ }
+ l.append(rs);
+ }
+ private:
+ StringList &l;
+ // the list is filled by linkifyText and consumed by the caller
+};
+
+static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def);
+
+
+static void bindTextParameter(sqlite3_stmt *stmt,const char *name,const char *value)
+{
+ int idx = sqlite3_bind_parameter_index(stmt, name);
+ sqlite3_bind_text(id_s_files, idx, value, -1, SQLITE_STATIC);
+}
+
+static void bindIntParameter(sqlite3_stmt *stmt,const char *name,int value)
+{
+ int idx = sqlite3_bind_parameter_index(stmt, name);
+ sqlite3_bind_int(stmt, idx, value);
+}
+
+static int step(sqlite3 *db, sqlite3_stmt *stmt,bool getRowId=FALSE)
+{
+ int id=-1;
+ int rc = sqlite3_step(stmt);
+ if (rc!=SQLITE_DONE && rc!=SQLITE_ROW)
+ {
+ msg("failed count files: %s\n", sqlite3_errmsg(db));
+ }
+ if (getRowId) id = sqlite3_column_int(stmt, 0);
+ sqlite3_reset(stmt);
+ return id;
+}
+
+#if 0
+static QCString memberOutputFileBase(MemberDef *md)
+{
+ //static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+ //if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
+ // return md->getClassDef()->getXmlOutputFileBase();
+ //else
+ // return md->getOutputFileBase();
+ return md->getOutputFileBase();
+}
+#endif
+
+static int insertFile(sqlite3 *db, const char* name)
+{
+ int id=-1;
+ if (name==0) return -1;
+ // see if it's already in DB
+
+ bindTextParameter(id_s_files,":name",name);
+ id=step(db,i_s_files,TRUE);
+ if (id==0)
+ {
+ // insert it
+ bindTextParameter(i_s_files,":name",name);
+
+ step(db,i_s_files);
+ id=sqlite3_last_insert_rowid(db);
+ }
+ return id;
+}
+
+static void insertMemberReference(sqlite3 *db, const char*src, const char*dst, const char *file, int line, int column)
+{
+#if 0
+ QCString scope = dst->getScopeString();
+ QCString src_name = src->name();
+ QCString dst_name = dst->name();
+ if (!dst->getScopeString().isEmpty() && dst->getScopeString()!=def->name())
+ {
+ dst_name.prepend(scope+getLanguageSpecificSeparator(dst->getLanguage()));
+ }
+ if (!src->getScopeString().isEmpty() && src->getScopeString()!=def->name())
+ {
+ src_name.prepend(scope+getLanguageSpecificSeparator(src->getLanguage()));
+ }
+#endif
+ //
+ bindTextParameter(i_s_xrefs,":src",src);
+ bindTextParameter(i_s_xrefs,":dst",dst);
+
+ int id_file = insertFile(db,file);
+
+ bindIntParameter(i_s_xrefs,":id_file",id_file);
+ bindIntParameter(i_s_xrefs,":line",line);
+ bindIntParameter(i_s_xrefs,":column",column);
+
+ step(db,i_s_xrefs);
+}
+
+static void insertMemberReference(sqlite3 *db, MemberDef *src, MemberDef *dst, const char*floc)
+{
+ if (dst->getStartBodyLine()!=-1 && dst->getBodyDef())
+ {
+ char file[4096] = { 0 };
+ int line=0,column=0;
+ if (floc)
+ {
+ sscanf(floc,"%[^:]:%d:%d",file,&line,&column);
+ }
+ insertMemberReference(db,src->anchor().data(),dst->anchor().data(),file,line,column);
+ }
+}
+
+static void stripQualifiers(QCString &typeStr)
+{
+ bool done=FALSE;
+ while (!done)
+ {
+ if (typeStr.stripPrefix("static "));
+ else if (typeStr.stripPrefix("virtual "));
+ else if (typeStr.stripPrefix("volatile "));
+ else if (typeStr=="virtual") typeStr="";
+ else done=TRUE;
+ }
+}
+
+////////////////////////////////////////////
+static void writeInnerClasses(sqlite3*db,const ClassSDict *cl)
+{
+ if (!cl) return;
+
+ ClassSDict::Iterator cli(*cl);
+ ClassDef *cd;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ if (!cd->isHidden() && cd->name().find('@')==-1) // skip anonymous scopes
+ {
+ bindTextParameter(i_s_innerclass,":refid",cd->getOutputFileBase());
+ bindIntParameter(i_s_innerclass,":prot",cd->protection());
+ bindTextParameter(i_s_innerclass,":name",cd->name());
+ step(db,i_s_innerclass);
+ }
+ }
+}
+
+static void writeInnerNamespaces(sqlite3 * /*db*/,const NamespaceSDict *nl)
+{
+ if (nl)
+ {
+ NamespaceSDict::Iterator nli(*nl);
+ NamespaceDef *nd;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
+ {
+// t << " <innernamespace refid=\"" << nd->getOutputFileBase()
+// << "\">" << convertToXML(nd->name()) << "</innernamespace>" << endl;
+ }
+ }
+ }
+}
+
+static void writeTemplateArgumentList(sqlite3* /*db*/,
+ ArgumentList * /*al*/,
+ Definition * /*scope*/,
+ FileDef * /*fileScope*/,
+ int /*indent*/)
+{
+#if 0
+ QCString indentStr;
+ indentStr.fill(' ',indent);
+ if (al)
+ {
+ t << indentStr << "<templateparamlist>" << endl;
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ t << indentStr << " <param>" << endl;
+ if (!a->type.isEmpty())
+ {
+ t << indentStr << " <type>";
+ linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->type);
+ t << "</type>" << endl;
+ }
+ if (!a->name.isEmpty())
+ {
+ t << indentStr << " <declname>" << a->name << "</declname>" << endl;
+ t << indentStr << " <defname>" << a->name << "</defname>" << endl;
+ }
+ if (!a->defval.isEmpty())
+ {
+ t << indentStr << " <defval>";
+ linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->defval);
+ t << "</defval>" << endl;
+ }
+ t << indentStr << " </param>" << endl;
+ }
+ t << indentStr << "</templateparamlist>" << endl;
+ }
+#endif
+}
+
+static void writeTemplateList(sqlite3*db,ClassDef *cd)
+{
+ writeTemplateArgumentList(db,cd->templateArguments(),cd,0,4);
+}
+
+static void generateSqlite3Section(sqlite3*db,
+ Definition *d,
+ MemberList *ml,const char * /*kind*/,const char * /*header*/=0,
+ const char * /*documentation*/=0)
+{
+ if (ml==0) return;
+ MemberListIterator mli(*ml);
+ MemberDef *md;
+ int count=0;
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ // namespace members are also inserted in the file scope, but
+ // to prevent this duplication in the XML output, we filter those here.
+ if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
+ {
+ count++;
+ }
+ }
+ if (count==0) return; // empty list
+#if 0
+
+ t << " <sectiondef kind=\"" << kind << "\">" << endl;
+ if (header)
+ {
+ t << " <header>" << convertToXML(header) << "</header>" << endl;
+ }
+ if (documentation)
+ {
+ t << " <description>";
+ writeXMLDocBlock(t,d->docFile(),d->docLine(),d,0,documentation);
+ t << "</description>" << endl;
+ }
+#endif
+ for (mli.toFirst();(md=mli.current());++mli)
+ {
+ // namespace members are also inserted in the file scope, but
+ // to prevent this duplication in the XML output, we filter those here.
+ //if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
+ {
+ generateSqlite3ForMember(db,md,d);
+ }
+ }
+ //t << " </sectiondef>" << endl;
+}
+
+static int prepareStatements(sqlite3 *db)
+{
+ int rc;
+ rc = sqlite3_prepare_v2(db,id_q_memberdef,-1,&id_s_memberdef,0);
+ if (rc!=SQLITE_OK)
+ {
+ msg("prepare failed for %s\n%s\n", id_q_memberdef, sqlite3_errmsg(db));
+ return -1;
+ }
+ rc = sqlite3_prepare_v2(db,id_q_files,-1,&id_s_files,0);
+ if (rc!=SQLITE_OK)
+ {
+ msg("prepare failed for %s\n%s\n", id_q_files, sqlite3_errmsg(db));
+ return -1;
+ }
+ rc = sqlite3_prepare_v2(db,i_q_files,-1,&i_s_files,0);
+ if (rc!=SQLITE_OK)
+ {
+ msg("prepare failed for %s\n%s\n",i_q_files,sqlite3_errmsg(db));
+ return -1;
+ }
+ rc = sqlite3_prepare_v2(db,i_q_xrefs,-1,&i_s_xrefs,0);
+ if (rc!=SQLITE_OK)
+ {
+ msg("prepare failed for %s\n%s\n", i_q_xrefs, sqlite3_errmsg(db));
+ return -1;
+ }
+ rc = sqlite3_prepare_v2(db, i_q_innerclass, -1, &i_s_innerclass, 0);
+ if (rc!=SQLITE_OK)
+ {
+ msg("prepare failed for %s\n%s\n", i_q_innerclass, sqlite3_errmsg(db));
+ return -1;
+ }
+ rc = sqlite3_prepare_v2(db,i_q_memberdef,-1,&i_s_memberdef,0);
+ if (rc!=SQLITE_OK)
+ {
+ msg("prepare failed for %s\n%s\n",i_q_memberdef,sqlite3_errmsg(db));
+ return -1;
+ }
+ rc = sqlite3_prepare_v2(db,i_q_compounddef,-1,&i_s_compounddef,0);
+ if (rc!=SQLITE_OK)
+ {
+ msg("prepare failed for %s\n%s\n",i_q_compounddef,sqlite3_errmsg(db));
+ return -1;
+ }
+ rc = sqlite3_prepare_v2(db,i_q_basecompoundref,-1,&i_s_basecompoundref,0);
+ if (rc!=SQLITE_OK)
+ {
+ msg("prepare failed for %s\n%s\n",i_q_basecompoundref,sqlite3_errmsg(db));
+ return -1;
+ }
+ rc = sqlite3_prepare_v2(db,i_q_derivedcompoundref,-1,&i_s_derivedcompoundref,0);
+ if (rc!=SQLITE_OK)
+ {
+ msg("prepare failed for %s\n%s\n",i_q_derivedcompoundref,sqlite3_errmsg(db));
+ return -1;
+ }
+ rc = sqlite3_prepare_v2(db, i_q_includes, -1, &i_s_includes, 0);
+ if (rc!=SQLITE_OK)
+ {
+ msg("prepare failed for %s\n%s\n", i_q_includes, sqlite3_errmsg(db));
+ return -1;
+ }
+ rc = sqlite3_prepare_v2(db, c_q_includes, -1, &c_s_includes, 0);
+ if (rc!=SQLITE_OK)
+ {
+ msg("prepare failed for %s\n%s\n", c_q_includes, sqlite3_errmsg(db));
+ return -1;
+ }
+ return 0;
+}
+
+static void beginTransaction(sqlite3 *db)
+{
+ char * sErrMsg = 0;
+ sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &sErrMsg);
+}
+
+static void endTransaction(sqlite3 *db)
+{
+ char * sErrMsg = 0;
+ sqlite3_exec(db, "END TRANSACTION", NULL, NULL, &sErrMsg);
+}
+
+static void pragmaTuning(sqlite3 *db)
+{
+ char * sErrMsg = 0;
+ sqlite3_exec(db, "PRAGMA synchronous = OFF", NULL, NULL, &sErrMsg);
+ sqlite3_exec(db, "PRAGMA journal_mode = MEMORY", NULL, NULL, &sErrMsg);
+}
+
+static void initializeSchema(sqlite3* db)
+{
+ int rc;
+ sqlite3_stmt *stmt = 0;
+
+ msg("Initializing DB schema...\n");
+ for (unsigned int k = 0; k < sizeof(schema_queries) / sizeof(schema_queries[0]); k++)
+ {
+ //const char *tname = schema_queries[k][0];
+ const char *q = schema_queries[k][1];
+ // create table
+ rc = sqlite3_prepare_v2(db, q, -1, &stmt, 0);
+ if (rc != SQLITE_OK)
+ {
+ msg("failed to prepare query: %s\n\t%s\n", q, sqlite3_errmsg(db));
+ exit(-1);
+ }
+ rc = sqlite3_step(stmt);
+ if (rc != SQLITE_DONE)
+ {
+ msg("failed to execute query: %s\n\t%s\n", q, sqlite3_errmsg(db));
+ exit(-1);
+ }
+ sqlite3_finalize(stmt);
+
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+static void generateSqlite3ForNamespace(sqlite3 *db, NamespaceDef *nd)
+{
+ // + contained class definitions
+ // + contained namespace definitions
+ // + member groups
+ // + normal members
+ // + brief desc
+ // + detailed desc
+ // + location
+ // - files containing (parts of) the namespace definition
+
+ if (nd->isReference() || nd->isHidden()) return; // skip external references
+#if 0
+ ti << " <compound refid=\"" << nd->getOutputFileBase()
+ << "\" kind=\"namespace\"" << "><name>"
+ << convertToXML(nd->name()) << "</name>" << endl;
+
+ QCString outputDirectory = Config_getString("XML_OUTPUT");
+ QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+
+ writeXMLHeader(t);
+ t << " <compounddef id=\""
+ << nd->getOutputFileBase() << "\" kind=\"namespace\">" << endl;
+ t << " <compoundname>";
+ writeXMLString(t,nd->name());
+ t << "</compoundname>" << endl;
+#endif
+ writeInnerClasses(db,nd->getClassSDict());
+ writeInnerNamespaces(db,nd->getNamespaceSDict());
+
+ if (nd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ generateSqlite3Section(db,nd,mg->members(),"user-defined",mg->header(),
+ mg->documentation());
+ }
+ }
+
+ QListIterator<MemberList> mli(nd->getMemberLists());
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberListType_declarationLists)!=0)
+ {
+ generateSqlite3Section(db,nd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
+ }
+ }
+#if 0
+ generateXMLSection(nd,ti,t,&nd->decDefineMembers,"define");
+ generateXMLSection(nd,ti,t,&nd->decProtoMembers,"prototype");
+ generateXMLSection(nd,ti,t,&nd->decTypedefMembers,"typedef");
+ generateXMLSection(nd,ti,t,&nd->decEnumMembers,"enum");
+ generateXMLSection(nd,ti,t,&nd->decFuncMembers,"func");
+ generateXMLSection(nd,ti,t,&nd->decVarMembers,"var");
+
+ t << " <briefdescription>" << endl;
+ writeXMLDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription());
+ t << " </briefdescription>" << endl;
+ t << " <detaileddescription>" << endl;
+ writeXMLDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation());
+ t << " </detaileddescription>" << endl;
+ t << " <location file=\""
+ << nd->getDefFileName() << "\" line=\""
+ << nd->getDefLine() << "\"" << " column=\""
+ << nd->getDefColumn() << "\"/>" << endl ;
+ t << " </compounddef>" << endl;
+ t << "</doxygen>" << endl;
+
+ ti << " </compound>" << endl;
+#endif
+}
+
+
+static void generateSqlite3ForFile(sqlite3 *db, FileDef *fd)
+{
+ // + includes files
+ // + includedby files
+ // + include graph
+ // + included by graph
+ // + contained class definitions
+ // + contained namespace definitions
+ // + member groups
+ // + normal members
+ // + brief desc
+ // + detailed desc
+ // + source code
+ // + location
+ // - number of lines
+
+ if (fd->isReference()) return; // skip external references
+#if 0
+ ti << " <compound refid=\"" << fd->getOutputFileBase()
+ << "\" kind=\"file\"><name>" << convertToXML(fd->name())
+ << "</name>" << endl;
+
+ QCString outputDirectory = Config_getString("XML_OUTPUT");
+ QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ FTextStream t(&f);
+ //t.setEncoding(FTextStream::UnicodeUTF8);
+
+ writeXMLHeader(t);
+ t << " <compounddef id=\""
+ << fd->getOutputFileBase() << "\" kind=\"file\">" << endl;
+ t << " <compoundname>";
+ writeXMLString(t,fd->name());
+ t << "</compoundname>" << endl;
+
+ IncludeInfo *inc;
+
+ if (fd->includeFileList())
+ {
+ QListIterator<IncludeInfo> ili1(*fd->includeFileList());
+ for (ili1.toFirst();(inc=ili1.current());++ili1)
+ {
+ t << " <includes";
+ if (inc->fileDef && !inc->fileDef->isReference()) // TODO: support external references
+ {
+ t << " refid=\"" << inc->fileDef->getOutputFileBase() << "\"";
+ }
+ t << " local=\"" << (inc->local ? "yes" : "no") << "\">";
+ t << inc->includeName;
+ t << "</includes>" << endl;
+ }
+ }
+
+ if (fd->includedByFileList())
+ {
+ QListIterator<IncludeInfo> ili2(*fd->includedByFileList());
+ for (ili2.toFirst();(inc=ili2.current());++ili2)
+ {
+ t << " <includedby";
+ if (inc->fileDef && !inc->fileDef->isReference()) // TODO: support external references
+ {
+ t << " refid=\"" << inc->fileDef->getOutputFileBase() << "\"";
+ }
+ t << " local=\"" << (inc->local ? "yes" : "no") << "\">";
+ t << inc->includeName;
+ t << "</includedby>" << endl;
+ }
+ }
+
+ DotInclDepGraph incDepGraph(fd,FALSE);
+ if (!incDepGraph.isTrivial())
+ {
+ t << " <incdepgraph>" << endl;
+ incDepGraph.writeXML(t);
+ t << " </incdepgraph>" << endl;
+ }
+
+ DotInclDepGraph invIncDepGraph(fd,TRUE);
+ if (!invIncDepGraph.isTrivial())
+ {
+ t << " <invincdepgraph>" << endl;
+ invIncDepGraph.writeXML(t);
+ t << " </invincdepgraph>" << endl;
+ }
+#endif
+ if (fd->getClassSDict())
+ {
+ writeInnerClasses(db,fd->getClassSDict());
+ }
+ if (fd->getNamespaceSDict())
+ {
+ writeInnerNamespaces(db,fd->getNamespaceSDict());
+ }
+
+ if (fd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ generateSqlite3Section(db,fd,mg->members(),"user-defined",mg->header(),
+ mg->documentation());
+ }
+ }
+
+ QListIterator<MemberList> mli(fd->getMemberLists());
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberListType_declarationLists)!=0)
+ {
+ generateSqlite3Section(db,fd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
+ }
+ }
+#if 0
+ generateXMLSection(fd,ti,t,fd->decDefineMembers,"define");
+ generateXMLSection(fd,ti,t,fd->decProtoMembers,"prototype");
+ generateXMLSection(fd,ti,t,fd->decTypedefMembers,"typedef");
+ generateXMLSection(fd,ti,t,fd->decEnumMembers,"enum");
+ generateXMLSection(fd,ti,t,fd->decFuncMembers,"func");
+ generateXMLSection(fd,ti,t,fd->decVarMembers,"var");
+#endif
+#if 0
+ t << " <briefdescription>" << endl;
+ writeXMLDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription());
+ t << " </briefdescription>" << endl;
+ t << " <detaileddescription>" << endl;
+ writeXMLDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation());
+ t << " </detaileddescription>" << endl;
+ if (Config_getBool("XML_PROGRAMLISTING"))
+ {
+ t << " <programlisting>" << endl;
+ writeXMLCodeBlock(t,fd);
+ t << " </programlisting>" << endl;
+ }
+ t << " <location file=\"" << fd->getDefFileName() << "\"/>" << endl;
+ t << " </compounddef>" << endl;
+ t << "</doxygen>" << endl;
+
+ ti << " </compound>" << endl;
+#endif
+}
+
+
+
+
+static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
+{
+ // + declaration/definition arg lists
+ // + reimplements
+ // + reimplementedBy
+ // + exceptions
+ // + const/volatile specifiers
+ // - examples
+ // + source definition
+ // + source references
+ // + source referenced by
+ // - body code
+ // + template arguments
+ // (templateArguments(), definitionTemplateParameterLists())
+ // - call graph
+
+ // enum values are written as part of the enum
+ if (md->memberType()==MemberType_EnumValue) return;
+ if (md->isHidden()) return;
+ //if (md->name().at(0)=='@') return; // anonymous member
+
+ // group members are only visible in their group
+ //if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
+ QCString memType;
+#if 0
+ // member
+ idx = sqlite3_bind_parameter_index(stmt, ":refid");
+ sqlite3_bind_text(stmt, idx, memberOutputFileBase(md).data(),-1,SQLITE_TRANSIENT);
+
+ idx = sqlite3_bind_parameter_index(stmt,":kind");
+ sqlite3_bind_int(stmt, idx, md->memberType());
+
+ idx = sqlite3_bind_parameter_index(stmt, ":name");
+ sqlite3_bind_text(stmt, idx, md->name().data(),-1,SQLITE_TRANSIENT);
+#endif
+ // memberdef
+ bindTextParameter(i_s_memberdef,":refid",md->anchor());
+ bindIntParameter(i_s_memberdef,":kind",md->memberType());
+ bindIntParameter(i_s_memberdef,":prot",md->protection());
+ bindIntParameter(i_s_memberdef,":static",md->isStatic());
+
+ bool isFunc=FALSE;
+ switch (md->memberType())
+ {
+ case MemberType_Function: // fall through
+ case MemberType_Signal: // fall through
+ case MemberType_Friend: // fall through
+ case MemberType_DCOP: // fall through
+ case MemberType_Slot:
+ isFunc=TRUE;
+ break;
+ default:
+ break;
+ }
+ if (isFunc)
+ {
+ LockingPtr<ArgumentList> al = md->argumentList();
+ if (al!=0 && al->constSpecifier)
+ {
+ bindIntParameter(i_s_memberdef,":const",al->constSpecifier);
+ }
+
+ bindIntParameter(i_s_memberdef,":explicit",md->isExplicit());
+ bindIntParameter(i_s_memberdef,":inline",md->isInline());
+ bindIntParameter(i_s_memberdef,":final",md->isFinal());
+ bindIntParameter(i_s_memberdef,":sealed",md->isSealed());
+ bindIntParameter(i_s_memberdef,":new",md->isNew());
+ bindIntParameter(i_s_memberdef,":optional",md->isOptional());
+ bindIntParameter(i_s_memberdef,":required",md->isRequired());
+ bindIntParameter(i_s_memberdef,":virt",md->virtualness());
+ }
+ // place in the arguments and linkify the arguments
+
+ if (md->memberType() == MemberType_Variable)
+ {
+ bindIntParameter(i_s_memberdef,":mutable",md->isMutable());
+ bindIntParameter(i_s_memberdef,":initonly",md->isInitonly());
+ }
+ else if (md->memberType() == MemberType_Property)
+ {
+ bindIntParameter(i_s_memberdef,":readable",md->isReadable());
+ bindIntParameter(i_s_memberdef,":writable",md->isWritable());
+ bindIntParameter(i_s_memberdef,":gettable",md->isGettable());
+ bindIntParameter(i_s_memberdef,":settable",md->isSettable());
+
+ if (md->isAssign() || md->isCopy() || md->isRetain())
+ {
+ int accessor = md->isAssign() ? md->isAssign() :
+ (md->isCopy() ? md->isCopy() : md->isRetain()) ;
+
+ bindIntParameter(i_s_memberdef,":accessor",accessor);
+ }
+ }
+ else if (md->memberType() == MemberType_Event)
+ {
+ bindIntParameter(i_s_memberdef,":addable",md->isAddable());
+ bindIntParameter(i_s_memberdef,":removable",md->isRemovable());
+ bindIntParameter(i_s_memberdef,":raisable",md->isRaisable());
+ }
+
+ if (md->memberType()!=MemberType_Define &&
+ md->memberType()!=MemberType_Enumeration
+ )
+ {
+ QCString typeStr = md->typeString();
+ stripQualifiers(typeStr);
+ StringList l;
+ linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,typeStr);
+ if (typeStr.data())
+ {
+ bindTextParameter(i_s_memberdef,":type",typeStr);
+ }
+
+ if (md->definition())
+ {
+ bindTextParameter(i_s_memberdef,":definition",md->definition());
+ }
+
+ if (md->argsString())
+ {
+ bindTextParameter(i_s_memberdef,":argsstring",md->argsString());
+ }
+ }
+
+ bindTextParameter(i_s_memberdef,":name",md->name());
+
+ if (md->memberType() == MemberType_Property)
+ {
+ if (md->isReadable())
+ {
+ DBG_CTX(("<read>\n"));
+ }
+ if (md->isWritable())
+ {
+ DBG_CTX(("<write>\n"));
+ }
+ }
+#if 0
+ if (md->memberType()==MemberType_Variable && md->bitfieldString())
+ {
+ QCString bitfield = md->bitfieldString();
+ if (bitfield.at(0)==':') bitfield=bitfield.mid(1);
+ t << " <bitfield>" << bitfield << "</bitfield>" << endl;
+ }
+
+ MemberDef *rmd = md->reimplements();
+ if (rmd)
+ {
+ t << " <reimplements refid=\""
+ << memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
+ << convertToXML(rmd->name()) << "</reimplements>" << endl;
+ }
+ LockingPtr<MemberList> rbml = md->reimplementedBy();
+ if (rbml!=0)
+ {
+ MemberListIterator mli(*rbml);
+ for (mli.toFirst();(rmd=mli.current());++mli)
+ {
+ t << " <reimplementedby refid=\""
+ << memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
+ << convertToXML(rmd->name()) << "</reimplementedby>" << endl;
+ }
+ }
+#endif
+ if (isFunc) //function
+ {
+ LockingPtr<ArgumentList> declAl = md->declArgumentList();
+ LockingPtr<ArgumentList> defAl = md->argumentList();
+ if (declAl!=0 && declAl->count()>0)
+ {
+ ArgumentListIterator declAli(*declAl);
+ ArgumentListIterator defAli(*defAl);
+ Argument *a;
+ for (declAli.toFirst();(a=declAli.current());++declAli)
+ {
+ Argument *defArg = defAli.current();
+ DBG_CTX(("<param>\n"));
+ if (!a->attrib.isEmpty())
+ {
+ DBG_CTX(("<attributes>:%s\n",a->attrib.data()));
+ }
+ if (!a->type.isEmpty())
+ {
+ StringList l;
+ linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->type);
+
+ QCString *s=l.first();
+ while (s)
+ {
+ insertMemberReference(db,md->anchor().data(),s->data(),def->getDefFileName().data(),md->getDefLine(),1);
+ s=l.next();
+ }
+ }
+ if (!a->name.isEmpty())
+ {
+ DBG_CTX(("<declname>%s\n",a->name.data()));
+ }
+ if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
+ {
+ DBG_CTX(("<defname>%s\n",defArg->name.data()));
+ }
+ if (!a->array.isEmpty())
+ {
+ DBG_CTX(("<array>%s",a->array.data()));
+ }
+ if (!a->defval.isEmpty())
+ {
+ StringList l;
+ linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->defval);
+ }
+ if (defArg) ++defAli;
+ }
+ }
+ }
+ else if (md->memberType()==MemberType_Define &&
+ md->argsString()) // define
+ {
+ if (md->argumentList()->count()==0) // special case for "foo()" to
+ // disguish it from "foo".
+ {
+ DBG_CTX(("no params\n"));
+ }
+ else
+ {
+ ArgumentListIterator ali(*md->argumentList());
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ DBG_CTX(("<param><defname>%s\n",a->type.data()));
+ }
+ }
+ }
+
+
+ // Extract references from initializer
+ // avoid that extremely large tables are written to the output.
+ // todo: it's better to adhere to MAX_INITIALIZER_LINES.
+ // drm_mod_register_buffer,
+ if (!md->initializer().isEmpty() && md->initializer().length()<2000)
+ {
+ StringList l;
+ linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,md->initializer());
+ QCString *s=l.first();
+ while (s)
+ {
+ DBG_CTX(("initializer:%s %s %s %d\n",
+ md->anchor().data(),
+ s->data(),
+ md->getBodyDef()->getDefFileName().data(),
+ md->getStartBodyLine()));
+ insertMemberReference(db,md->anchor().data(),s->data(),md->getBodyDef()->getDefFileName().data(),md->getStartBodyLine(),1);
+ s=l.next();
+ }
+ }
+
+#if 0
+ if (md->excpString())
+ {
+ linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md,md->excpString());
+ }
+#endif
+ if ( md->getScopeString() )
+ {
+ bindTextParameter(i_s_memberdef,":scope",md->getScopeString());
+ }
+
+ // File location
+ if (md->getDefLine() != -1)
+ {
+ int id_file = insertFile(db,md->getDefFileName());
+ if (id_file!=-1)
+ {
+ bindIntParameter(i_s_memberdef,":id_file",id_file);
+ bindIntParameter(i_s_memberdef,":line",md->getDefLine());
+ bindIntParameter(i_s_memberdef,":column",md->getDefColumn());
+
+ if (md->getStartBodyLine()!=-1)
+ {
+ int id_bfile = insertFile(db,md->getBodyDef()->absFilePath());
+ if (id_bfile == -1) exit(-1);
+ bindIntParameter(i_s_memberdef,":id_ibfile",id_bfile);
+ bindIntParameter(i_s_memberdef,":bline",md->getStartBodyLine());
+
+ // XXX implement getStartBodyColumn
+ bindIntParameter(i_s_memberdef,":bcolumn",1);
+ }
+ }
+ }
+
+
+ step(db,i_s_memberdef);
+ /*int id_src =*/ sqlite3_last_insert_rowid(db);
+
+ // + cross-references
+ // The cross-references in initializers only work when both the src and dst
+ // are defined.
+ LockingPtr<MemberSDict> mdict = md->getReferencesMembers();
+ // references
+ if (mdict!=0)
+ {
+ MemberSDict::IteratorDict mdi(*mdict);
+ MemberDef *rmd;
+ for (mdi.toFirst();(rmd=mdi.current());++mdi)
+ {
+ insertMemberReference(db,md,rmd,mdi.currentKey());
+ }
+ }
+
+ mdict = md->getReferencedByMembers();
+ // referencedby
+ if (mdict!=0)
+ {
+ MemberSDict::IteratorDict mdi(*mdict);
+ MemberDef *rmd;
+ for (mdi.toFirst();(rmd=mdi.current());++mdi)
+ {
+ insertMemberReference(db,rmd,md,mdi.currentKey());
+ }
+ }
+}
+
+static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
+{
+ // + brief description
+ // + detailed description
+ // + template argument list(s)
+ // - include file
+ // + member groups
+ // + inheritance diagram
+ // + list of direct super classes
+ // + list of direct sub classes
+ // + list of inner classes
+ // + collaboration diagram
+ // + list of all members
+ // + user defined member sections
+ // + standard member sections
+ // + detailed member documentation
+ // - examples using the class
+
+ if (cd->isReference()) return; // skip external references.
+ if (cd->isHidden()) return; // skip hidden classes.
+ if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
+ if (cd->templateMaster()!=0) return; // skip generated template instances.
+
+ msg("Generating Sqlite3 output for class %s\n",cd->name().data());
+
+ //int idx,rc;
+ //sqlite3_stmt *stmt ;
+
+ // + compounddef
+ //stmt = i_s_compounddef;
+
+ bindTextParameter(i_s_compounddef,":name",cd->name());
+ bindTextParameter(i_s_compounddef,":kind",cd->compoundTypeString());
+ bindIntParameter(i_s_compounddef,":prot",cd->protection());
+ bindTextParameter(i_s_compounddef,":refid",cd->getOutputFileBase());
+
+ int id_file = insertFile(db,cd->getDefFileName().data());
+ bindIntParameter(i_s_compounddef,":id_file",id_file);
+ bindIntParameter(i_s_compounddef,":line",cd->getDefLine());
+ bindIntParameter(i_s_compounddef,":column",cd->getDefColumn());
+
+ step(db,i_s_compounddef);
+ sqlite3_int64 id_compound=0 ;
+ id_compound = sqlite3_last_insert_rowid(db);
+
+ // + basecompoundref
+ if (cd->baseClasses())
+ {
+ BaseClassListIterator bcli(*cd->baseClasses());
+ BaseClassDef *bcd;
+ for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ {
+ bindTextParameter(i_s_basecompoundref,":refid",bcd->classDef->getOutputFileBase());
+ bindIntParameter(i_s_basecompoundref,":prot",bcd->prot);
+ bindIntParameter(i_s_basecompoundref,":virt",bcd->virt);
+
+ if (!bcd->templSpecifiers.isEmpty())
+ {
+ bindTextParameter(i_s_basecompoundref,":base",insertTemplateSpecifierInScope(bcd->classDef->name(),bcd->templSpecifiers));
+ }
+ else
+ {
+ bindTextParameter(i_s_basecompoundref,":base",bcd->classDef->displayName());
+ }
+ bindTextParameter(i_s_basecompoundref,":derived",cd->displayName());
+ step(db,i_s_basecompoundref);
+ }
+ }
+
+ // + derivedcompoundref
+ if (cd->subClasses())
+ {
+ BaseClassListIterator bcli(*cd->subClasses());
+ BaseClassDef *bcd;
+ for (bcli.toFirst();(bcd=bcli.current());++bcli)
+ {
+ bindTextParameter(i_s_derivedcompoundref,":base",cd->displayName());
+ bindTextParameter(i_s_derivedcompoundref,":dervied",bcd->classDef->displayName());
+ bindTextParameter(i_s_derivedcompoundref,":refid",bcd->classDef->getOutputFileBase());
+ bindIntParameter(i_s_derivedcompoundref,":prot",bcd->prot);
+ bindIntParameter(i_s_derivedcompoundref,":virt",bcd->virt);
+ step(db,i_s_derivedcompoundref);
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////
+ // INCLUDEINFO
+ IncludeInfo *ii=cd->includeInfo();
+ if (ii)
+ {
+ QCString nm = ii->includeName;
+ if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
+ if (!nm.isEmpty())
+ {
+ bindTextParameter(c_s_includes,":refid",ii->fileDef->getOutputFileBase());
+ bindIntParameter(c_s_includes,":local",ii->local);
+ bindTextParameter(c_s_includes,":name",nm);
+ int count=step(db,c_s_includes,TRUE);
+ if ( count==0 )
+ {
+ bindTextParameter(i_s_includes,":refid",ii->fileDef->getOutputFileBase());
+ bindIntParameter(i_s_includes,":local",ii->local);
+ bindTextParameter(i_s_includes,":name",nm);
+ step(db,i_s_includes);
+ }
+ }
+ }
+ ///////////////////////////////////////////////////////////////////
+ writeInnerClasses(db,cd->getClassSDict());
+ writeTemplateList(db,cd);
+
+ if (cd->getMemberGroupSDict())
+ {
+ MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ generateSqlite3Section(db,cd,mg->members(),"user-defined",mg->header(),
+ mg->documentation());
+ }
+ }
+
+ QListIterator<MemberList> mli(cd->getMemberLists());
+ MemberList *ml;
+ for (mli.toFirst();(ml=mli.current());++mli)
+ {
+ if ((ml->listType()&MemberListType_detailedLists)==0)
+ {
+ generateSqlite3Section(db,cd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+void generateSqlite3()
+{
+ // + classes
+ // + namespaces
+ // + files
+ // - groups
+ // - related pages
+ // - examples
+ //QCString outputDirectory = Config_getString("SQLITE3_OUTPUT");
+ QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY");
+ QDir sqlite3Dir(outputDirectory);
+ sqlite3 *db;
+ sqlite3_initialize();
+ int rc = sqlite3_open_v2(outputDirectory+"/doxygen_sqlite3.db", &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
+ if (rc != SQLITE_OK)
+ {
+ sqlite3_close(db);
+ msg("database open failed: %s\n", "doxygen_sqlite3.db");
+ exit(-1);
+ }
+ beginTransaction(db);
+ pragmaTuning(db);
+
+ initializeSchema(db);
+ if ( -1 == prepareStatements(db) )
+ {
+ err("sqlite generator: prepareStatements failed!");
+ return;
+ }
+
+ // + classes
+ ClassSDict::Iterator cli(*Doxygen::classSDict);
+ ClassDef *cd;
+ for (cli.toFirst();(cd=cli.current());++cli)
+ {
+ msg("Generating Sqlite3 output for class %s\n",cd->name().data());
+ generateSqlite3ForClass(db,cd);
+ }
+
+ // + namespaces
+ NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
+ NamespaceDef *nd;
+ for (nli.toFirst();(nd=nli.current());++nli)
+ {
+ msg("Generating Sqlite3 output for namespace %s\n",nd->name().data());
+ generateSqlite3ForNamespace(db,nd);
+ }
+
+ // + files
+ FileNameListIterator fnli(*Doxygen::inputNameList);
+ FileName *fn;
+ for (;(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ msg("Generating Sqlite3 output for file %s\n",fd->name().data());
+ generateSqlite3ForFile(db,fd);
+ }
+ }
+ endTransaction(db);
+}
+
+#else // USE_SQLITE3
+void generateSqlite3()
+{
+ err("sqlite3 support has not been compiled in!");
+}
+#endif
+
diff --git a/src/sqlite3gen.h b/src/sqlite3gen.h
new file mode 100644
index 0000000..689f1da
--- /dev/null
+++ b/src/sqlite3gen.h
@@ -0,0 +1,23 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef SQLITE3GEN_H
+#define SQLITE3GEN_H
+
+void generateSqlite3();
+
+#endif
diff --git a/src/store.cpp b/src/store.cpp
index 521aa9b..7e5118a 100644
--- a/src/store.cpp
+++ b/src/store.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/store.h b/src/store.h
index 816ce46..d075dc0 100644
--- a/src/store.h
+++ b/src/store.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
index 42dcf68..8b59c05 100644
--- a/src/tagreader.cpp
+++ b/src/tagreader.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -72,6 +72,7 @@ class TagMemberInfo
QCString anchor;
QCString arglist;
QCString kind;
+ QCString clangId;
TagAnchorInfoList docAnchors;
Protection prot;
Specifier virt;
@@ -87,6 +88,7 @@ class TagClassInfo
~TagClassInfo() { delete bases; delete templateArguments; }
QCString name;
QCString filename;
+ QCString clangId;
TagAnchorInfoList docAnchors;
QList<BaseInfo> *bases;
QList<TagMemberInfo> members;
@@ -103,6 +105,7 @@ class TagNamespaceInfo
TagNamespaceInfo() { members.setAutoDelete(TRUE); }
QCString name;
QCString filename;
+ QCString clangId;
QStringList classList;
QStringList namespaceList;
TagAnchorInfoList docAnchors;
@@ -335,7 +338,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("warning: Unknown compound attribute `%s' found!\n",kind.data());
+ warn("Unknown compound attribute `%s' found!\n",kind.data());
m_state = Invalid;
}
if (isObjC=="yes" && m_curClass)
@@ -363,7 +366,7 @@ class TagFileParser : public QXmlDefaultHandler
case InPackage: m_tagFilePackages.append(m_curPackage);
m_curPackage=0; break;
default:
- warn("warning: tag `compound' was not expected!\n");
+ warn("tag `compound' was not expected!\n");
}
}
@@ -409,7 +412,7 @@ class TagFileParser : public QXmlDefaultHandler
case InNamespace: m_curNamespace->members.append(m_curMember); break;
case InGroup: m_curGroup->members.append(m_curMember); break;
case InPackage: m_curPackage->members.append(m_curMember); break;
- default: warn("warning: Unexpected tag `member' found\n"); break;
+ default: warn("Unexpected tag `member' found\n"); break;
}
}
@@ -425,7 +428,7 @@ class TagFileParser : public QXmlDefaultHandler
case InMember: m_curMember->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
case InPackage: m_curPackage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
case InDir: m_curDir->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- default: warn("warning: Unexpected tag `member' found\n"); break;
+ default: warn("Unexpected tag `member' found\n"); break;
}
}
@@ -438,7 +441,7 @@ class TagFileParser : public QXmlDefaultHandler
case InNamespace: m_curNamespace->classList.append(m_curString); break;
case InGroup: m_curGroup->classList.append(m_curString); break;
case InPackage: m_curPackage->classList.append(m_curString); break;
- default: warn("warning: Unexpected tag `class' found\n"); break;
+ default: warn("Unexpected tag `class' found\n"); break;
}
}
@@ -449,7 +452,7 @@ class TagFileParser : public QXmlDefaultHandler
case InNamespace: m_curNamespace->classList.append(m_curString); break;
case InFile: m_curFile->namespaceList.append(m_curString); break;
case InGroup: m_curGroup->namespaceList.append(m_curString); break;
- default: warn("warning: Unexpected tag `namespace' found\n"); break;
+ default: warn("Unexpected tag `namespace' found\n"); break;
}
}
@@ -459,7 +462,7 @@ class TagFileParser : public QXmlDefaultHandler
{
case InGroup: m_curGroup->fileList.append(m_curString); break;
case InDir: m_curDir->fileList.append(m_curString); break;
- default: warn("warning: Unexpected tag `file' found\n"); break;
+ default: warn("Unexpected tag `file' found\n"); break;
}
}
@@ -468,7 +471,7 @@ class TagFileParser : public QXmlDefaultHandler
switch(m_state)
{
case InGroup: m_curGroup->fileList.append(m_curString); break;
- default: warn("warning: Unexpected tag `page' found\n"); break;
+ default: warn("Unexpected tag `page' found\n"); break;
}
}
@@ -477,7 +480,7 @@ class TagFileParser : public QXmlDefaultHandler
switch(m_state)
{
case InDir: m_curDir->subdirList.append(m_curString); break;
- default: warn("warning: Unexpected tag `page' found\n"); break;
+ default: warn("Unexpected tag `page' found\n"); break;
}
}
@@ -501,7 +504,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("warning: Unexpected tag `type' found\n");
+ warn("Unexpected tag `type' found\n");
}
}
@@ -517,7 +520,7 @@ class TagFileParser : public QXmlDefaultHandler
case InDir: m_curDir->name = m_curString; break;
case InMember: m_curMember->name = m_curString; break;
case InPackage: m_curPackage->name = m_curString; break;
- default: warn("warning: Unexpected tag `name' found\n"); break;
+ default: warn("Unexpected tag `name' found\n"); break;
}
}
@@ -551,7 +554,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("warning: Unexpected tag `base' found\n");
+ warn("Unexpected tag `base' found\n");
}
}
@@ -563,7 +566,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("warning: Unexpected tag `base' found\n");
+ warn("Unexpected tag `base' found\n");
}
}
@@ -580,7 +583,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("warning: Unexpected tag `includes' found\n");
+ warn("Unexpected tag `includes' found\n");
}
m_curString="";
}
@@ -603,7 +606,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("warning: Unexpected tag `templarg' found\n");
+ warn("Unexpected tag `templarg' found\n");
}
}
@@ -618,7 +621,7 @@ class TagFileParser : public QXmlDefaultHandler
case InPage: m_curPage->filename = m_curString; break;
case InPackage: m_curPackage->filename = m_curString; break;
case InDir: m_curDir->filename = m_curString; break;
- default: warn("warning: Unexpected tag `filename' found\n"); break;
+ default: warn("Unexpected tag `filename' found\n"); break;
}
}
@@ -628,7 +631,7 @@ class TagFileParser : public QXmlDefaultHandler
{
case InFile: m_curFile->path = m_curString; break;
case InDir: m_curDir->path = m_curString; break;
- default: warn("warning: Unexpected tag `path' found\n"); break;
+ default: warn("Unexpected tag `path' found\n"); break;
}
}
@@ -640,9 +643,31 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
+ warn("Unexpected tag `anchor' found\n");
+ }
+ }
+
+ void endClangId()
+ {
+ if (m_state==InMember)
+ {
+ m_curMember->clangId = m_curString;
+ }
+ else if (m_state==InClass)
+ {
+ m_curClass->clangId = m_curString;
+ }
+ else if (m_state==InNamespace)
+ {
+ m_curNamespace->clangId = m_curString;
+ }
+ else
+ {
warn("warning: Unexpected tag `anchor' found\n");
}
}
+
+
void endAnchorFile()
{
@@ -652,7 +677,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("warning: Unexpected tag `anchorfile' found\n");
+ warn("Unexpected tag `anchorfile' found\n");
}
}
@@ -664,7 +689,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("warning: Unexpected tag `arglist' found\n");
+ warn("Unexpected tag `arglist' found\n");
}
}
void endTitle()
@@ -673,7 +698,7 @@ class TagFileParser : public QXmlDefaultHandler
{
case InGroup: m_curGroup->title = m_curString; break;
case InPage: m_curPage->title = m_curString; break;
- default: warn("warning: Unexpected tag `title' found\n"); break;
+ default: warn("Unexpected tag `title' found\n"); break;
}
}
@@ -685,7 +710,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("warning: Unexpected tag `subgroup' found\n");
+ warn("Unexpected tag `subgroup' found\n");
}
}
@@ -727,6 +752,7 @@ class TagFileParser : public QXmlDefaultHandler
m_startElementHandlers.insert("path", new StartElementHandler(this,&TagFileParser::startStringValue));
m_startElementHandlers.insert("anchorfile", new StartElementHandler(this,&TagFileParser::startStringValue));
m_startElementHandlers.insert("anchor", new StartElementHandler(this,&TagFileParser::startStringValue));
+ m_startElementHandlers.insert("clangid", new StartElementHandler(this,&TagFileParser::startStringValue));
m_startElementHandlers.insert("arglist", new StartElementHandler(this,&TagFileParser::startStringValue));
m_startElementHandlers.insert("title", new StartElementHandler(this,&TagFileParser::startStringValue));
m_startElementHandlers.insert("subgroup", new StartElementHandler(this,&TagFileParser::startStringValue));
@@ -749,6 +775,7 @@ class TagFileParser : public QXmlDefaultHandler
m_endElementHandlers.insert("path", new EndElementHandler(this,&TagFileParser::endPath));
m_endElementHandlers.insert("anchorfile", new EndElementHandler(this,&TagFileParser::endAnchorFile));
m_endElementHandlers.insert("anchor", new EndElementHandler(this,&TagFileParser::endAnchor));
+ m_endElementHandlers.insert("clangid", new EndElementHandler(this,&TagFileParser::endClangId));
m_endElementHandlers.insert("arglist", new EndElementHandler(this,&TagFileParser::endArglist));
m_endElementHandlers.insert("title", new EndElementHandler(this,&TagFileParser::endTitle));
m_endElementHandlers.insert("subgroup", new EndElementHandler(this,&TagFileParser::endSubgroup));
@@ -776,7 +803,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("warning: Unknown tag `%s' found!\n",name.data());
+ warn("Unknown tag `%s' found!\n",name.data());
}
return TRUE;
}
@@ -791,7 +818,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else
{
- warn("warning: Unknown tag `%s' found!\n",name.data());
+ warn("Unknown tag `%s' found!\n",name.data());
}
return TRUE;
}
@@ -1079,6 +1106,7 @@ void TagFileParser::buildMemberList(Entry *ce,QList<TagMemberInfo> &members)
me->virt = tmi->virt;
me->stat = tmi->isStatic;
me->fileName = ce->fileName;
+ me->id = tmi->clangId;
if (ce->section == Entry::GROUPDOC_SEC)
{
me->groups->append(new Grouping(ce->name,Grouping::GROUPING_INGROUP));
@@ -1204,8 +1232,9 @@ void TagFileParser::buildLists(Entry *root)
TagInfo *ti = new TagInfo;
ti->tagName = m_tagName;
ti->fileName = tci->filename;
- ce->tagInfo = ti;
- ce->lang = tci->isObjC ? SrcLangExt_ObjC : SrcLangExt_Unknown;
+ ce->id = tci->clangId;
+ ce->tagInfo = ti;
+ ce->lang = tci->isObjC ? SrcLangExt_ObjC : SrcLangExt_Unknown;
// transfer base class list
if (tci->bases)
{
@@ -1286,6 +1315,7 @@ void TagFileParser::buildLists(Entry *root)
TagInfo *ti = new TagInfo;
ti->tagName = m_tagName;
ti->fileName = tni->filename;
+ ne->id = tni->clangId;
ne->tagInfo = ti;
buildMemberList(ne,tni->members);
@@ -1399,11 +1429,11 @@ void TagFileParser::addIncludes()
}
}
-void parseTagFile(Entry *root,const char *fullName,const char *tagName)
+void parseTagFile(Entry *root,const char *fullName)
{
QFileInfo fi(fullName);
if (!fi.exists()) return;
- TagFileParser handler( tagName );
+ TagFileParser handler( fullName ); // tagName
handler.setFileName(fullName);
TagFileErrorHandler errorHandler;
QFile xmlFile( fullName );
diff --git a/src/tagreader.h b/src/tagreader.h
index 427f674..73619db 100644
--- a/src/tagreader.h
+++ b/src/tagreader.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -21,6 +21,6 @@
class Entry;
-void parseTagFile(Entry *root,const char *fullPathName,const char *fileName);
+void parseTagFile(Entry *root,const char *fullPathName);
#endif
diff --git a/src/tclscanner.h b/src/tclscanner.h
index 24bf40b..a7c0dde 100644
--- a/src/tclscanner.h
+++ b/src/tclscanner.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
* Copyright (C) 2010-2011 by Rene Zaumseil
*
* Permission to use, copy, modify, and distribute this software and its
@@ -29,9 +29,13 @@ class TclLanguageScanner : public ParserInterface
{
public:
virtual ~TclLanguageScanner() {}
+ void startTranslationUnit(const char *) {}
+ void finishTranslationUnit() {}
void parseInput(const char *fileName,
const char *fileBuf,
- Entry *root);
+ Entry *root,
+ bool sameTranslationUnit,
+ QStrList &filesInSameTranslationUnit);
bool needsPreprocessing(const QCString &extension);
void parseCode(CodeOutputInterface &codeOutIntf,
const char *scopeName,
diff --git a/src/tclscanner.l b/src/tclscanner.l
index c3d5df0..73b2b58 100644
--- a/src/tclscanner.l
+++ b/src/tclscanner.l
@@ -80,34 +80,34 @@
// - Tcl_Interp removed
// - changes are marked with RZ
// #define's to adapt the code:
-#define CONST const
-#define UCHAR (unsigned char)
-#define TCL_ERROR 1
-#define TCL_OK 0
-#define ckalloc malloc
-#define ckfree free
+#define CONST const
+#define UCHAR (unsigned char)
+#define TCL_ERROR 1
+#define TCL_OK 0
+#define ckalloc malloc
+#define ckfree free
#define TclCopyAndCollapse(size,src,dest) memcpy(dest,src,size); *(dest+size)=0
int TclFindElement(
- CONST char *list, /* Points to the first byte of a string
- * containing a Tcl list with zero or more
- * elements (possibly in braces). */
- int listLength, /* Number of bytes in the list's string. */
- CONST char **elementPtr, /* Where to put address of first significant
- * character in first element of list. */
- CONST char **nextPtr, /* Fill in with location of character just
- * after all white space following end of
- * argument (next arg or end of list). */
- int *sizePtr, /* If non-zero, fill in with size of
- * element. */
- int *bracePtr) /* If non-zero, fill in with non-zero/zero to
- * indicate that arg was/wasn't in braces. */
+ CONST char *list, /* Points to the first byte of a string
+ * containing a Tcl list with zero or more
+ * elements (possibly in braces). */
+ int listLength, /* Number of bytes in the list's string. */
+ CONST char **elementPtr, /* Where to put address of first significant
+ * character in first element of list. */
+ CONST char **nextPtr, /* Fill in with location of character just
+ * after all white space following end of
+ * argument (next arg or end of list). */
+ int *sizePtr, /* If non-zero, fill in with size of
+ * element. */
+ int *bracePtr) /* If non-zero, fill in with non-zero/zero to
+ * indicate that arg was/wasn't in braces. */
{
CONST char *p = list;
- CONST char *elemStart; /* Points to first byte of first element. */
- CONST char *limit; /* Points just after list's last byte. */
- int openBraces = 0; /* Brace nesting level during parse. */
+ CONST char *elemStart; /* Points to first byte of first element. */
+ CONST char *limit; /* Points just after list's last byte. */
+ int openBraces = 0; /* Brace nesting level during parse. */
int inQuotes = 0;
- int size = 0; /* lint. */
+ int size = 0; /* lint. */
//RZ int numChars;
/*
@@ -122,7 +122,7 @@ int TclFindElement(
p++;
}
if (p == limit)
- { /* no element found */
+ { /* no element found */
elemStart = limit;
goto done;
}
@@ -157,54 +157,54 @@ int TclFindElement(
*/
case '{':
- if (openBraces != 0)
- {
- openBraces++;
- }
- break;
+ if (openBraces != 0)
+ {
+ openBraces++;
+ }
+ break;
- /*
- * Close brace: if element is in braces, keep nesting count and
- * quit when the last close brace is seen.
- */
+ /*
+ * Close brace: if element is in braces, keep nesting count and
+ * quit when the last close brace is seen.
+ */
case '}':
- if (openBraces > 1)
- {
- openBraces--;
- }
- else if (openBraces == 1)
- {
- size = (int)(p - elemStart);
- p++;
- if ((p >= limit) || isspace(UCHAR(*p)))
- { /* INTL: ISO space. */
- goto done;
- }
-
- /*
- * Garbage after the closing brace; return an error.
- */
-
- return TCL_ERROR;
- }
- break;
-
- /*
- * Backslash: skip over everything up to the end of the backslash
- * sequence.
- */
+ if (openBraces > 1)
+ {
+ openBraces--;
+ }
+ else if (openBraces == 1)
+ {
+ size = (int)(p - elemStart);
+ p++;
+ if ((p >= limit) || isspace(UCHAR(*p)))
+ { /* INTL: ISO space. */
+ goto done;
+ }
+
+ /*
+ * Garbage after the closing brace; return an error.
+ */
+
+ return TCL_ERROR;
+ }
+ break;
+
+ /*
+ * Backslash: skip over everything up to the end of the backslash
+ * sequence.
+ */
case '\\':
- //RZ Tcl_UtfBackslash(p, &numChars, NULL);
- //RZ p += (numChars - 1);
- p++; //RZ
- break;
+ //RZ Tcl_UtfBackslash(p, &numChars, NULL);
+ //RZ p += (numChars - 1);
+ p++; //RZ
+ break;
- /*
- * Space: ignore if element is in braces or quotes; otherwise
- * terminate element.
- */
+ /*
+ * Space: ignore if element is in braces or quotes; otherwise
+ * terminate element.
+ */
case ' ':
case '\f':
@@ -212,33 +212,33 @@ int TclFindElement(
case '\r':
case '\t':
case '\v':
- if ((openBraces == 0) && !inQuotes)
- {
- size = (int)(p - elemStart);
- goto done;
- }
- break;
+ if ((openBraces == 0) && !inQuotes)
+ {
+ size = (int)(p - elemStart);
+ goto done;
+ }
+ break;
- /*
- * Double-quote: if element is in quotes then terminate it.
- */
+ /*
+ * Double-quote: if element is in quotes then terminate it.
+ */
case '"':
- if (inQuotes)
- {
- size = (int)(p - elemStart);
- p++;
- if ((p >= limit) || isspace(UCHAR(*p)))
- { /* INTL: ISO space */
- goto done;
- }
-
- /*
- * Garbage after the closing quote; return an error.
- */
- return TCL_ERROR;
- }
- break;
+ if (inQuotes)
+ {
+ size = (int)(p - elemStart);
+ p++;
+ if ((p >= limit) || isspace(UCHAR(*p)))
+ { /* INTL: ISO space */
+ goto done;
+ }
+
+ /*
+ * Garbage after the closing quote; return an error.
+ */
+ return TCL_ERROR;
+ }
+ break;
}
p++;
}
@@ -275,11 +275,11 @@ done:
}
int Tcl_SplitList(
- CONST char *list, /* Pointer to string with list structure. */
- int *argcPtr, /* Pointer to location to fill in with the
- * number of elements in the list. */
- CONST char ***argvPtr) /* Pointer to place to store pointer to array
- * of pointers to list elements. */
+ CONST char *list, /* Pointer to string with list structure. */
+ int *argcPtr, /* Pointer to location to fill in with the
+ * number of elements in the list. */
+ CONST char ***argvPtr) /* Pointer to place to store pointer to array
+ * of pointers to list elements. */
{
CONST char **argv, *l, *element;
char *p;
@@ -295,7 +295,7 @@ int Tcl_SplitList(
for (size = 2, l = list; *l != 0; l++)
{
if (isspace(UCHAR(*l)))
- { /* INTL: ISO space. */
+ { /* INTL: ISO space. */
size++;
/*
@@ -304,18 +304,18 @@ int Tcl_SplitList(
while (1)
{
- char next = *(l + 1);
-
- if (next == '\0')
- {
- break;
- }
- ++l;
- if (isspace(UCHAR(next)))
- { /* INTL: ISO space. */
- continue;
- }
- break;
+ char next = *(l + 1);
+
+ if (next == '\0')
+ {
+ break;
+ }
+ ++l;
+ if (isspace(UCHAR(next)))
+ { /* INTL: ISO space. */
+ continue;
+ }
+ break;
}
}
}
@@ -328,7 +328,7 @@ int Tcl_SplitList(
CONST char *prevList = list;
result = TclFindElement(list, length, &element, &list,
- &elSize, &brace);
+ &elSize, &brace);
length -= (int)(list - prevList);
if (result != TCL_OK)
{
@@ -439,10 +439,10 @@ static struct
QCString string_comment; // contain current comment
QCString string_last; // contain last read word or part of word
QCString string; // temporary string value
- Entry* entry_main; // top level entry
- Entry* entry_file; // entry of current file
- Entry* entry_current; // currently used entry
- Entry* entry_inside; // contain entry of current scan context
+ Entry* entry_main; // top level entry
+ Entry* entry_file; // entry of current file
+ Entry* entry_current; // currently used entry
+ Entry* entry_inside; // contain entry of current scan context
QStringList list_commandwords; // list of command words
QList<tcl_scan> scan; // stack of scan contexts
QAsciiDict<Entry> ns; // all read namespace entries
@@ -481,7 +481,7 @@ Entry* tcl_entry_new()
myEntry->lang = SrcLangExt_Tcl;
initGroupInfo(myEntry);
// collect entries
- if (tcl.code==NULL)
+ if (!tcl.code)
{
tcl.entry.insert(0,myEntry);
}
@@ -508,7 +508,7 @@ static void tcl_name(const QCString &ns0, const QCString &name0, QCString &ns, Q
QCString myNm;
int myStart;
- if (strncmp(name0.data(),"::",2)==0)
+ if (qstrncmp(name0.data(),"::",2)==0)
{
myNm = name0.mid(2);
}
@@ -629,7 +629,7 @@ static int tcl_keyword(QCString str)
//! End codifying with special font class.
static void tcl_font_end()
{
- if (tcl.code==NULL) return;
+ if (!tcl.code) return;
if (tcl.code_font)
{
tcl.code->endFontClass();
@@ -640,8 +640,8 @@ static void tcl_font_end()
//! Codify 'str' with special font class 's'.
static void tcl_codify(const char *s,char *str)
{
- if (tcl.code==NULL||str==NULL) return;
- if (s && strcmp(s,"NULL")!=0)
+ if (!tcl.code || !str) return;
+ if (s && qstrcmp(s,"NULL")!=0)
{
tcl_font_end();
tcl.code->startFontClass(s);
@@ -659,20 +659,19 @@ static void tcl_codify(const char *s,char *str)
tcl.code_line++;
*(p-1)='\0';
tcl.code->codify(sp);
- //tcl_font_end();
+ if (tcl.code_font)
+ {
+ tcl.code->endFontClass();
+ }
tcl.code->endCodeLine();
+ tcl.code->startCodeLine(tcl.code_linenumbers);
if (tcl.code_linenumbers)
{
- if (tcl.code_font!=NULL)
- {
- tcl.code->endFontClass();
- tcl.code->writeLineNumber(0,0,0,tcl.code_line);
- tcl.code->startFontClass(tcl.code_font);
- }
- else
- {
- tcl.code->writeLineNumber(0,0,0,tcl.code_line);
- }
+ tcl.code->writeLineNumber(0,0,0,tcl.code_line);
+ }
+ if (tcl.code_font)
+ {
+ tcl.code->startFontClass(tcl.code_font);
}
}
else
@@ -706,7 +705,7 @@ static void tcl_codify(const char *s,const QString &str)
//! Codify 'str' with special font class 's'.
static void tcl_codify(const char *s,const QCString &str)
{
- if (tcl.code==NULL) return;
+ if (!tcl.code) return;
tcl_codify(s,str.data());
}
@@ -716,11 +715,11 @@ static void tcl_codify_cmd(const char *s,int i)
}
//-----------------------------------------------------------------------------
-#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
//-----------------------------------------------------------------------------
%}
-ws ([ \t]|\\\n)
+ws ([ \t]|\\\n)
%option yylineno
%option noyywrap
@@ -1247,8 +1246,8 @@ tcl_inf("(\\\n) ?%s?\n",tcl.string_last.data());
{
case '{':// {{x}}
myLevel--;
- if (myLevel==0 && tcl.code==NULL)
- {
+ if (myLevel==0 && !tcl.code)
+ {
myWhite=1;
}
break;
@@ -1287,7 +1286,7 @@ tcl_inf("(\\\n) ?%s?\n",tcl.string_last.data());
case '{':
break;
case '[':
- myLevel--;
+ myLevel--;
break;
case '"':
case '.':
@@ -1340,7 +1339,7 @@ tcl_inf("(%d) ?%s?\n",what,tcl.string_last.data());
yyless(0);
tcl_inf("(.%d) ?%s?\n",what,tcl.string_last.data());
return;
- }
+ }
else
{
myLevel--;
@@ -1464,24 +1463,24 @@ tcl_inf("-> %s\n",(const char *)tcl.string_comment);
myPos0=myPos;
myLine0=myLine;
while (parseCommentBlock(tcl.this_parser, &myEntry0, myDoc, tcl.file_name,
- myLine, FALSE, tcl.config_autobrief, FALSE, myProt, myPos, myNew))
+ myLine, FALSE, tcl.config_autobrief, FALSE, myProt, myPos, myNew))
{
if (myNew)
{ // we need a new entry in this case
myNew=0;
myEntry = tcl_entry_new();
parseCommentBlock(tcl.this_parser, myEntry, myDoc, tcl.file_name,
- myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
- tcl.entry_inside->addSubEntry(myEntry);
+ myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
+ tcl.entry_inside->addSubEntry(myEntry);
}
else
{ // we can add to current entry in this case
- if (myEntry1==NULL)
+ if (!myEntry1)
{
myEntry1=tcl_entry_namespace(tcl.scan.at(0)->ns);
}
parseCommentBlock(tcl.this_parser, myEntry1, myDoc, tcl.file_name,
- myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
+ myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
}
myPos0=myPos;
myLine0=myLine;
@@ -1491,35 +1490,35 @@ tcl_inf("-> %s\n",(const char *)tcl.string_comment);
myNew=0;
myEntry = tcl_entry_new();
parseCommentBlock(tcl.this_parser, myEntry, myDoc, tcl.file_name,
- myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
- tcl.entry_inside->addSubEntry(myEntry);
+ myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
+ tcl.entry_inside->addSubEntry(myEntry);
}
else
{ // we can add to current entry
- if (myEntry1==NULL)
+ if (!myEntry1)
{
myEntry1=tcl_entry_namespace(tcl.scan.at(0)->ns);
}
parseCommentBlock(tcl.this_parser, myEntry1, myDoc, tcl.file_name,
- myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
+ myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew);
}
}
else
{ // new entry
tcl.entry_current = tcl_entry_new();
while (parseCommentBlock(tcl.this_parser, tcl.entry_current, myDoc,
- tcl.file_name, myLine, FALSE, tcl.config_autobrief, FALSE,
- myProt, myPos, myNew))
+ tcl.file_name, myLine, FALSE, tcl.config_autobrief, FALSE,
+ myProt, myPos, myNew))
{
if (myNew)
{
- tcl.entry_inside->addSubEntry(tcl.entry_current);
- tcl.entry_current = tcl_entry_new();
+ tcl.entry_inside->addSubEntry(tcl.entry_current);
+ tcl.entry_current = tcl_entry_new();
}
else
{
- tcl.entry_current->section = tcl.entry_inside->section;
- tcl.entry_current->name = tcl.entry_inside->name;
+ tcl.entry_current->section = tcl.entry_inside->section;
+ tcl.entry_current->name = tcl.entry_inside->name;
}
}
if (myNew)
@@ -1554,7 +1553,7 @@ D
QStringList myArgs;
QString myArglist="";
- if (tcl.entry_current->argList==NULL)
+ if (!tcl.entry_current->argList)
{
tcl.entry_current->argList=new ArgumentList;
}
@@ -1571,7 +1570,7 @@ D
myArg->defval= (*myArgs1.at(1)).utf8();
if (myArg->defval.isEmpty())
{
- myArg->defval = " ";
+ myArg->defval = " ";
}
myArglist += "?" + QCString(myArg->name) + "? ";
}
@@ -1604,7 +1603,7 @@ static void tcl_codify_link(QCString name)
MemberNameIterator mi(*mn);
for (mi.toFirst();(md=mi.current());++mi)
{
- fn.insert(md->qualifiedName(),md);
+ fn.insert(md->qualifiedName(),md);
}
}
for (fni.toFirst();(mn=fni.current());++fni)
@@ -1612,7 +1611,7 @@ static void tcl_codify_link(QCString name)
MemberNameIterator fi(*mn);
for (fi.toFirst();(md=fi.current());++fi)
{
- fn.insert(md->qualifiedName(),md);
+ fn.insert(md->qualifiedName(),md);
}
}
}
@@ -1645,14 +1644,14 @@ static void tcl_codify_link(QCString name)
if (myDef != NULL) // documented command
{
tcl.code->writeCodeLink(myDef->getReference().data(),
- myDef->getOutputFileBase().data(),
- myDef->anchor().data(),
- name,
- myDef->qualifiedName().data());
+ myDef->getOutputFileBase().data(),
+ myDef->anchor().data(),
+ name,
+ myDef->qualifiedName().data());
if (tcl.memberdef)
{
- myDef->addSourceReferencedBy(tcl.memberdef);
- tcl.memberdef->addSourceReferences(myDef);
+ myDef->addSourceReferencedBy(tcl.memberdef);
+ tcl.memberdef->addSourceReferences(myDef);
}
}
else if (tcl_keyword(myName)) // check keyword
@@ -1675,7 +1674,7 @@ D
tcl_codify_cmd(NULL,1);
tcl_scan *myScan=tcl.scan.at(0);
myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2),
- myScan->ns,myScan->entry_cl,myScan->entry_fn);
+ myScan->ns,myScan->entry_cl,myScan->entry_fn);
for (unsigned int i = 3;i<tcl.list_commandwords.count();i++)
{
myScan->after << type[i] << tcl.list_commandwords[i];
@@ -1690,7 +1689,7 @@ D
tcl_codify_cmd(NULL,1);
tcl_scan *myScan=tcl.scan.at(0);
myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2),
- myScan->ns,myScan->entry_cl,myScan->entry_fn);
+ myScan->ns,myScan->entry_cl,myScan->entry_fn);
myScan->after << "NULL" << tcl.list_commandwords[3];
myScan->after << "script" << tcl.list_commandwords[4];
myScan->after << "NULL" << tcl.list_commandwords[5];
@@ -1713,7 +1712,7 @@ D
}
tcl_scan *myScan=tcl.scan.at(0);
myScan = tcl_scan_start('?',*tcl.list_commandwords.at(tcl.list_commandwords.count()-1),
- myScan->ns,myScan->entry_cl,myScan->entry_fn);
+ myScan->ns,myScan->entry_cl,myScan->entry_fn);
}
///! Handle internal tcl commands.
@@ -1725,7 +1724,7 @@ D
tcl_codify_cmd(NULL,1);
tcl_scan *myScan=tcl.scan.at(0);
myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2),
- myScan->ns,myScan->entry_cl,myScan->entry_fn);
+ myScan->ns,myScan->entry_cl,myScan->entry_fn);
myScan->after << "NULL" << tcl.list_commandwords[3];
myScan->after << "script" << tcl.list_commandwords[4];
}
@@ -1756,32 +1755,32 @@ D
for (i=0;i<myName.length();i++)
{
QChar c = myName[i];
- if (myCmd)
- {
- if (c==' '||c=='\t'||c=='\n'||c==']')
- {//end of command
- tcl_codify_link(myStr);
- myStr="";
- myCmd=0;
- }
- myStr+=c;
- }
- else
- {
- myStr+=c;
- if (c=='[')
- {//start of command
- for (;i<myName.length();i++)
+ if (myCmd)
+ {
+ if (c==' '||c=='\t'||c=='\n'||c==']')
+ {//end of command
+ tcl_codify_link(myStr);
+ myStr="";
+ myCmd=0;
+ }
+ myStr+=c;
+ }
+ else
+ {
+ myStr+=c;
+ if (c=='[')
+ {//start of command
+ for (;i<myName.length();i++)
{
c = myName[i+1];
- if (c!=' ' && c!='\t' && c!='\n') break;
- myStr+=c;
+ if (c!=' ' && c!='\t' && c!='\n') break;
+ myStr+=c;
}
tcl_codify(NULL,myStr);
- myStr="";
- myCmd=1;
- }
- }
+ myStr="";
+ myCmd=1;
+ }
+ }
}
tcl_codify(NULL,myStr);
}
@@ -1825,7 +1824,7 @@ D
myEntry = tcl.entry_current;
tcl.fn.insert(myName,myEntry);
myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),
- myEntryNs->name,NULL,myEntry);
+ myEntryNs->name,NULL,myEntry);
}
//! Handle \c itcl::body statements and \c oo::define method and method inside \c itcl::class statements.
@@ -1867,7 +1866,7 @@ D
tcl.fn.insert(myName,tcl.entry_current);
myEntry = tcl.entry_current;
myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),
- myNs, myEntryCl, myEntry);
+ myNs, myEntryCl, myEntry);
}
//! Handle \c constructor statements inside class definitions.
@@ -1900,11 +1899,11 @@ D
tcl.entry_current->endBodyLine = tcl.line_body1;
tcl_protection(tcl.entry_current);
tcl_command_ARGLIST(*tcl.list_commandwords.at(2));
- myEntryCl->addSubEntry(tcl.entry_current);
+ if (myEntryCl) myEntryCl->addSubEntry(tcl.entry_current);
myEntry = tcl.entry_current;
tcl.fn.insert(myName,myEntry);
myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(4),
- myNs, myEntryCl, myEntry);
+ myNs, myEntryCl, myEntry);
}
//! Handle \c destructor statements inside class definitions.
@@ -1938,7 +1937,7 @@ D
myEntry = tcl.entry_current;
tcl.fn.insert(myName,myEntry);
myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(2),
- myNs, myEntryCl, myEntry);
+ myNs, myEntryCl, myEntry);
}
//! Handle \c namespace statements.
@@ -2006,7 +2005,7 @@ D
tcl.cl.insert(myName,tcl.entry_current);
myEntryCl = tcl.entry_current;
myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(4),
- myName, myEntryCl, NULL);
+ myName, myEntryCl, NULL);
}
//! Handle \c oo::class statements.
@@ -2039,7 +2038,7 @@ D
tcl.cl.insert(myName,tcl.entry_current);
myEntryCl = tcl.entry_current;
myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),
- myName, myEntryCl, NULL);
+ myName, myEntryCl, NULL);
}
//! Handle \c oo::define statements.
@@ -2205,11 +2204,11 @@ tcl_inf("->\n");
{
tcl_scan *myScan = tcl.scan.at(0);
myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(0),
- myScan->ns,myScan->entry_cl,myScan->entry_fn);
+ myScan->ns,myScan->entry_cl,myScan->entry_fn);
myProt = tcl.protection;
goto command_end;
}
- myStr = (*tcl.list_commandwords.at(0)).utf8();
+ myStr = (*tcl.list_commandwords.at(0)).utf8();
// remove leading "::" and apply TCL_SUBST
if (myStr.left(2)=="::") myStr = myStr.mid(2);
if (tcl.config_subst.contains(myStr))
@@ -2296,7 +2295,7 @@ tcl_inf("->\n");
if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
if (tcl.scan.at(0)->entry_fn == NULL)
{// only parsed outside functions
- tcl_command_VARIABLE(tcl.scan.at(0)->entry_cl!=NULL&&tcl.scan.at(0)->entry_cl->name!="");
+ tcl_command_VARIABLE(tcl.scan.at(0)->entry_cl && tcl.scan.at(0)->entry_cl->name!="");
goto command_text;
}
}
@@ -2312,7 +2311,7 @@ tcl_inf("->\n");
if (myStr=="inherit" || myStr=="superclass")
{
if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
- if (tcl.scan.at(0)->entry_cl!=NULL&&tcl.scan.at(0)->entry_cl->name!="")
+ if (tcl.scan.at(0)->entry_cl && tcl.scan.at(0)->entry_cl->name!="")
{
for (unsigned int i = 2; i < tcl.list_commandwords.count(); i = i + 2)
{
@@ -2354,46 +2353,46 @@ if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?
if (myStr=="then")
{
myState='t';
- myType << "keyword" << "NULL";
+ myType << "keyword" << "NULL";
}
else
{
myState='b';
- myType << "script" << "NULL";
+ myType << "script" << "NULL";
}
}
else if (myState=='t')
{
myState='b';
- myType << "script" << "NULL";
+ myType << "script" << "NULL";
}
else if (myState=='b')
{
if (myStr=="elseif") {
myState='i';
- myType << "keyword" << "NULL";
+ myType << "keyword" << "NULL";
}
else if (myStr=="else" && i==tcl.list_commandwords.count()-3)
{
- myState = 'b';
- myType << "keyword" << "NULL" << "script";
- i = tcl.list_commandwords.count();
+ myState = 'b';
+ myType << "keyword" << "NULL" << "script";
+ i = tcl.list_commandwords.count();
}
else if (i==tcl.list_commandwords.count()-1)
{
- myState = 'b';
- myType << "script";
- i = tcl.list_commandwords.count();
- }
+ myState = 'b';
+ myType << "script";
+ i = tcl.list_commandwords.count();
+ }
else
{
- myLine=__LINE__;goto command_warn;
+ myLine=__LINE__;goto command_warn;
}
}
else if (myState=='i')
{
myState='x';
- myType << "script" << "NULL";
+ myType << "script" << "NULL";
}
}
if (myState != 'b') {myLine=__LINE__;goto command_warn;}
@@ -2472,20 +2471,20 @@ tcl_inf("TCL_SUBST: use '%s'\n",s);
tcl.string_command="";
tcl.string_commentline="";
tcl.string_commentcodify="";
- tcl.string_comment = "";
- tcl.string_last = "";
- tcl.entry_main = NULL;
- tcl.entry_file = NULL;
- tcl.entry_current = NULL;
- tcl.entry_inside = NULL;
+ tcl.string_comment = "";
+ tcl.string_last = "";
+ tcl.entry_main = NULL;
+ tcl.entry_file = NULL;
+ tcl.entry_current = NULL;
+ tcl.entry_inside = NULL;
tcl.list_commandwords.clear();
tcl.scan.clear();
tcl.ns.clear();
tcl.cl.clear();
tcl.fn.clear();
- yylineno = 1;
- tcl.protection = Public;
- tcl.memberdef = NULL;
+ yylineno = 1;
+ tcl.protection = Public;
+ tcl.memberdef = NULL;
}
//! Start parsing.
@@ -2528,7 +2527,11 @@ static void tcl_parse(const QCString ns, const QCString cls)
}
//! Parse text file and build up entry tree.
-void TclLanguageScanner::parseInput(const char *fileName,const char *input,Entry *root)
+void TclLanguageScanner::parseInput(const char *fileName,
+ const char *input,
+ Entry *root,
+ bool /*sameTranslationUnit*/,
+ QStrList & /*filesInSameTranslationUnit*/)
{
QFile myFile;
tcl_inf("%s\n",fileName);
@@ -2563,7 +2566,7 @@ void TclLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
int startLine,
int endLine,
bool inlineFragment,
- MemberDef *memberDef,
+ MemberDef *memberDef,
bool showLineNumbers,
Definition *searchCtx
)
@@ -2633,6 +2636,7 @@ tcl_inf("%s (%d,%d) %d %d\n",myStr.ascii(),startLine,endLine,isExampleBlock,inli
yylineno=startLine;
tcl.code_linenumbers = showLineNumbers;
tcl.code_line=yylineno;
+ tcl.code->startCodeLine(tcl.code_linenumbers);
if (tcl.code_linenumbers)
{
tcl.code->writeLineNumber(0,0,0,tcl.code_line);
@@ -2641,6 +2645,7 @@ tcl_inf("%s (%d,%d) %d %d\n",myStr.ascii(),startLine,endLine,isExampleBlock,inli
tcl.this_parser = NULL;
tcl.entry_main = tcl_entry_new();
tcl_parse(myNs,myCls);
+ tcl.code->endCodeLine();
tcl.scan.clear();
tcl.ns.clear();
tcl.cl.clear();
diff --git a/src/textdocvisitor.cpp b/src/textdocvisitor.cpp
index 33cb3f4..9275846 100644
--- a/src/textdocvisitor.cpp
+++ b/src/textdocvisitor.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -127,7 +127,7 @@ void TextDocVisitor::visit(DocSymbol *s)
case DocSymbol::LeftFloor: m_t << "&lfloor;"; break;
case DocSymbol::RightFloor: m_t << "&rfloor;"; break;
default:
- err("error: unknown symbol found\n");
+ err("unknown symbol found\n");
}
}
diff --git a/src/textdocvisitor.h b/src/textdocvisitor.h
index b6c50e0..81fd9e8 100644
--- a/src/textdocvisitor.h
+++ b/src/textdocvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator.h b/src/translator.h
index f96962e..4de5da7 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -335,7 +335,62 @@ class Translator
// new since 1.2.6
//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
virtual QCString trRTFansicp() = 0;
+
+ /*! Character sets
+ * <pre>
+ * 0 — ANSI
+ * 1 — Default
+ * 2 — Symbol
+ * 3 — Invalid
+ * 77 — Mac
+ * 128 — Shift Jis
+ * 129 — Hangul
+ * 130 — Johab
+ * 134 — GB2312
+ * 136 — Big5
+ * 161 — Greek
+ * 162 — Turkish
+ * 163 — Vietnamese
+ * 177 — Hebrew
+ * 178 — Arabic
+ * 179 — Arabic Traditional
+ * 180 — Arabic user
+ * 181 — Hebrew user
+ * 186 — Baltic
+ * 204 — Russian
+ * 222 — Thai
+ * 238 — Eastern European
+ * 254 — PC 437
+ * 255 — OEM
+ * </pre>
+ */
virtual QCString trRTFCharSet() = 0;
virtual QCString trRTFGeneralIndex() = 0;
@@ -527,6 +582,18 @@ class Translator
virtual QCString trMethodDocumentation() = 0;
virtual QCString trDesignOverview() = 0;
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trInterfaces() = 0;
+ virtual QCString trServices() = 0;
+ virtual QCString trConstantGroups() = 0;
+ virtual QCString trConstantGroupReference(const char *namespaceName) = 0;
+ virtual QCString trServiceReference(const char *sName) = 0;
+ virtual QCString trSingletonReference(const char *sName) = 0;
+ virtual QCString trServiceGeneratedFromFiles(bool single) = 0;
+ virtual QCString trSingletonGeneratedFromFiles(bool single) = 0;
};
#endif
diff --git a/src/translator_adapter.h b/src/translator_adapter.h
index adfcdf8..ad89b4b 100644
--- a/src/translator_adapter.h
+++ b/src/translator_adapter.h
@@ -2,12 +2,13 @@
#define TRANSLATOR_ADAPTER_H
#include "version.h"
+#include "translator.h"
/** Base of the translator adapter tree.
*
* This abstract class provides access to the english
* translations, to be used as a substitute for not implemented
- * local translations.
+ * local translations.
*/
class TranslatorAdapterBase : public Translator
{
@@ -21,26 +22,57 @@ class TranslatorAdapterBase : public Translator
inline QCString createUpdateNeededMessage(const QCString & languageName,
const QCString & versionString)
{
- return QCString("Warning: The selected output language \"")
- + languageName
+ return QCString("The selected output language \"")
+ + languageName
+ "\" has not been updated\nsince "
+ versionString
+ ". As a result some sentences may appear in English.\n\n";
}
-
+
public:
/*! This method is used to generate a warning message to signal
* the user that the translation of his/her language of choice
* needs updating. It must be implemented by the translator
* adapter class (pure virtual).
- *
+ *
* \sa createUpdateNeededMessage()
*/
virtual QCString updateNeededMessage() = 0;
};
-class TranslatorAdapter_1_8_2 : public TranslatorAdapterBase
+class TranslatorAdapter_1_8_4 : public TranslatorAdapterBase
+{
+ public:
+ virtual QCString updateNeededMessage()
+ { return createUpdateNeededMessage(idLanguage(),"release 1.8.4"); }
+
+ virtual QCString trInterfaces()
+ { return english.trInterfaces(); }
+
+ virtual QCString trServices()
+ { return english.trServices(); }
+
+ virtual QCString trConstantGroups()
+ { return english.trConstantGroups(); }
+
+ virtual QCString trConstantGroupReference(const char *namespaceName)
+ { return english.trConstantGroupReference(namespaceName); }
+
+ virtual QCString trServiceReference(const char *sName)
+ { return english.trServiceReference(sName); }
+
+ virtual QCString trSingletonReference(const char *sName)
+ { return english.trSingletonReference(sName); }
+
+ virtual QCString trServiceGeneratedFromFiles(bool single)
+ { return english.trServiceGeneratedFromFiles(single); }
+
+ virtual QCString trSingletonGeneratedFromFiles(bool single)
+ { return english.trSingletonGeneratedFromFiles(single); }
+};
+
+class TranslatorAdapter_1_8_2 : public TranslatorAdapter_1_8_4
{
public:
virtual QCString updateNeededMessage()
@@ -69,8 +101,8 @@ class TranslatorAdapter_1_8_2 : public TranslatorAdapterBase
};
-/** Adapter class for languages that only contain translations upto
- * version 1.8.0.
+/** Adapter class for languages that only contain translations up to
+ * version 1.8.0.
*/
class TranslatorAdapter_1_8_0 : public TranslatorAdapter_1_8_2
{
@@ -101,7 +133,7 @@ class TranslatorAdapter_1_8_0 : public TranslatorAdapter_1_8_2
};
-/** Adapter class for languages that only contain translations upto
+/** Adapter class for languages that only contain translations up to
* version 1.7.5.
*/
class TranslatorAdapter_1_7_5 : public TranslatorAdapter_1_8_0
@@ -120,7 +152,7 @@ class TranslatorAdapter_1_7_5 : public TranslatorAdapter_1_8_0
{ return english.trDirDepGraph(name); }
};
-/** Adapter class for languages that only contain translations upto
+/** Adapter class for languages that only contain translations up to
* version 1.6.3.
*/
class TranslatorAdapter_1_6_3 : public TranslatorAdapter_1_7_5
@@ -141,7 +173,7 @@ class TranslatorAdapter_1_6_3 : public TranslatorAdapter_1_7_5
{ return english.trDateTime(year,month,day,dayOfWeek,hour,minutes,seconds,includeTime); }
};
-/** Adapter class for languages that only contain translations upto
+/** Adapter class for languages that only contain translations up to
* version 1.6.0.
*/
class TranslatorAdapter_1_6_0 : public TranslatorAdapter_1_6_3
@@ -166,7 +198,7 @@ class TranslatorAdapter_1_6_0 : public TranslatorAdapter_1_6_3
{ return english.trNoMatches(); }
};
-/** Adapter class for languages that only contain translations upto
+/** Adapter class for languages that only contain translations up to
* version 1.5.4
*/
class TranslatorAdapter_1_5_4 : public TranslatorAdapter_1_6_0
@@ -245,7 +277,7 @@ class TranslatorAdapter_1_5_4 : public TranslatorAdapter_1_6_0
{ return english.trTypeConstraints(); }
};
-/** Adapter class for languages that only contain translations upto
+/** Adapter class for languages that only contain translations up to
* version 1.4.6
*/
class TranslatorAdapter_1_4_6 : public TranslatorAdapter_1_5_4
@@ -264,18 +296,5 @@ class TranslatorAdapter_1_4_6 : public TranslatorAdapter_1_5_4
}
};
-/** Adapter class for languages that only contain translations upto
- * version 1.4.1
- */
-class TranslatorAdapter_1_4_1 : public TranslatorAdapter_1_4_6
-{
- public:
- virtual QCString updateNeededMessage()
- { return createUpdateNeededMessage(idLanguage(),"release 1.4.1"); }
-
- virtual QCString trOverloadText()
- { return english.trOverloadText(); }
-};
-
#endif
diff --git a/src/translator_am.h b/src/translator_am.h
index e1b88f1..d8ab0fd 100644
--- a/src/translator_am.h
+++ b/src/translator_am.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -572,36 +572,38 @@ class TranslatorArmenian : public TranslatorAdapter_1_8_0
ClassDef::CompoundType compType,
bool isTemplate)
{
- QCString result=(QCString)clName;
- if (isTemplate)
- {
- switch(compType)
- {
- case ClassDef::Class: result+=" Ô´Õ¡Õ½Õ«"; break;
- case ClassDef::Struct: result+=" Ô¿Õ¡Õ¼Õ¸Ö‚ÖÕ¾Õ¡Õ®Ö„Õ«"; break;
- case ClassDef::Union: result+=" Õ„Õ«Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶"; break;
- case ClassDef::Interface: result+=" Ô»Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ«"; break;
- case ClassDef::Protocol: result+=" Ô±Ö€Õ±Õ¡Õ¶Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶"; break;
- case ClassDef::Category: result+=" Ô´Õ¡Õ½Õ¡Õ¯Õ¡Ö€Õ£Õ´Õ¡Õ¶"; break;
- case ClassDef::Exception: result+=" Ô²Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¡Õ¶"; break;
- }
- result+=" ÕÖ‡Õ¡Õ¶Õ´Õ¸Ö‚Õ·Õ¶Õ¥Ö€";
- }
- else
- {
- switch(compType)
- {
- case ClassDef::Class: result+=" Ô´Õ¡Õ½"; break;
- case ClassDef::Struct: result+=" Ô¿Õ¡Õ¼Õ¸Ö‚ÖÕ¾Õ¡Õ®Ö„"; break;
- case ClassDef::Union: result+=" Õ„Õ«Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´"; break;
- case ClassDef::Interface: result+=" Ô»Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½"; break;
- case ClassDef::Protocol: result+=" Ô±Ö€Õ±Õ¡Õ¶Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"; break;
- case ClassDef::Category: result+=" Ô´Õ¡Õ½Õ¡Õ¯Õ¡Ö€Õ£Õ¸Ö‚Õ´"; break;
- case ClassDef::Exception: result+=" Ô²Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"; break;
- }
- }
- return result;
- }
+ QCString result=(QCString)clName;
+ if (isTemplate)
+ {
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Ô´Õ¡Õ½Õ«"; break;
+ case ClassDef::Struct: result+=" Ô¿Õ¡Õ¼Õ¸Ö‚ÖÕ¾Õ¡Õ®Ö„Õ«"; break;
+ case ClassDef::Union: result+=" Õ„Õ«Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶"; break;
+ case ClassDef::Interface: result+=" Ô»Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ«"; break;
+ case ClassDef::Protocol: result+=" Ô±Ö€Õ±Õ¡Õ¶Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶"; break;
+ case ClassDef::Category: result+=" Ô´Õ¡Õ½Õ¡Õ¯Õ¡Ö€Õ£Õ´Õ¡Õ¶"; break;
+ case ClassDef::Exception: result+=" Ô²Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¡Õ¶"; break;
+ default: break;
+ }
+ result+=" ÕÖ‡Õ¡Õ¶Õ´Õ¸Ö‚Õ·Õ¶Õ¥Ö€";
+ }
+ else
+ {
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Ô´Õ¡Õ½"; break;
+ case ClassDef::Struct: result+=" Ô¿Õ¡Õ¼Õ¸Ö‚ÖÕ¾Õ¡Õ®Ö„"; break;
+ case ClassDef::Union: result+=" Õ„Õ«Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´"; break;
+ case ClassDef::Interface: result+=" Ô»Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½"; break;
+ case ClassDef::Protocol: result+=" Ô±Ö€Õ±Õ¡Õ¶Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"; break;
+ case ClassDef::Category: result+=" Ô´Õ¡Õ½Õ¡Õ¯Õ¡Ö€Õ£Õ¸Ö‚Õ´"; break;
+ case ClassDef::Exception: result+=" Ô²Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"; break;
+ default: break;
+ }
+ }
+ return result;
+ }
/*! used as the title of the HTML page of a file */
virtual QCString trFileReference(const char *fileName)
@@ -755,6 +757,7 @@ class TranslatorArmenian : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="Õ¡Ö€Õ±Õ¡Õ¶Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶"; break;
case ClassDef::Category: result+="Õ¤Õ¡Õ½Õ¡Õ¯Õ¡Ö€Õ£Õ´Õ¡Õ¶"; break;
case ClassDef::Exception: result+="Õ¢Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¡Õ¶"; break;
+ default: break;
}
result+=" ÖƒÕ¡Õ½Õ¿Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ Ö†Õ¡ÕµÕ¬";
if (single) result+="Õ«Ö."; else result+="Õ¥Ö€Õ«Ö.";
@@ -1623,30 +1626,32 @@ class TranslatorArmenian : public TranslatorAdapter_1_8_0
QCString result=(QCString)clName;
if (!isTemplate)
{
- switch(compType)
- {
- case ClassDef::Class: result+=" Õ„Õ¸Õ¤Õ¸Ö‚Õ¬"; break;
- case ClassDef::Struct: result+=" ÕÕ«Õº"; break;
- case ClassDef::Union: result+=" Õ„Õ«Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´"; break;
- case ClassDef::Interface: result+=" Ô»Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½"; break;
- case ClassDef::Protocol: result+=" Ô±Ö€Õ±Õ¡Õ¶Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"; break;
- case ClassDef::Category: result+=" Ô´Õ¡Õ½Õ¡Õ¯Õ¡Ö€Õ£Õ¸Ö‚Õ´"; break;
- case ClassDef::Exception: result+=" Ô²Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"; break;
- }
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Õ„Õ¸Õ¤Õ¸Ö‚Õ¬"; break;
+ case ClassDef::Struct: result+=" ÕÕ«Õº"; break;
+ case ClassDef::Union: result+=" Õ„Õ«Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´"; break;
+ case ClassDef::Interface: result+=" Ô»Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½"; break;
+ case ClassDef::Protocol: result+=" Ô±Ö€Õ±Õ¡Õ¶Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"; break;
+ case ClassDef::Category: result+=" Ô´Õ¡Õ½Õ¡Õ¯Õ¡Ö€Õ£Õ¸Ö‚Õ´"; break;
+ case ClassDef::Exception: result+=" Ô²Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶"; break;
+ default: break;
+ }
}
else
{
- switch(compType)
- {
- case ClassDef::Class: result+=" Õ„Õ¸Õ¤Õ¸Ö‚Õ¬Õ«"; break;
- case ClassDef::Struct: result+=" ÕÕ«ÕºÕ«"; break;
- case ClassDef::Union: result+=" Õ„Õ«Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶"; break;
- case ClassDef::Interface: result+=" Ô»Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ«"; break;
- case ClassDef::Protocol: result+=" Ô±Ö€Õ±Õ¡Õ¶Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶"; break;
- case ClassDef::Category: result+=" Ô´Õ¡Õ½Õ¡Õ¯Õ¡Ö€Õ£Õ´Õ¡Õ¶"; break;
- case ClassDef::Exception: result+=" Ô²Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¡Õ¶"; break;
- }
- result+=" ÕÖ‡Õ¡Õ¶Õ´Õ¸Ö‚Õ·";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Õ„Õ¸Õ¤Õ¸Ö‚Õ¬Õ«"; break;
+ case ClassDef::Struct: result+=" ÕÕ«ÕºÕ«"; break;
+ case ClassDef::Union: result+=" Õ„Õ«Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶"; break;
+ case ClassDef::Interface: result+=" Ô»Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ«"; break;
+ case ClassDef::Protocol: result+=" Ô±Ö€Õ±Õ¡Õ¶Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶"; break;
+ case ClassDef::Category: result+=" Ô´Õ¡Õ½Õ¡Õ¯Õ¡Ö€Õ£Õ´Õ¡Õ¶"; break;
+ case ClassDef::Exception: result+=" Ô²Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¡Õ¶"; break;
+ default: break;
+ }
+ result+=" ÕÖ‡Õ¡Õ¶Õ´Õ¸Ö‚Õ·";
}
return result;
}
@@ -1710,6 +1715,7 @@ class TranslatorArmenian : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="Õ¡Ö€Õ±Õ¡Õ¶Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶"; break;
case ClassDef::Category: result+="Õ¤Õ¡Õ½Õ¡Õ¯Õ¡Ö€Õ£Õ´Õ¡Õ¶"; break;
case ClassDef::Exception: result+="Õ¢Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¡Õ¶"; break;
+ default: break;
}
result+=" ÖƒÕ¡Õ½Õ¿Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡Õ¡Õ¬ Ö†Õ¡ÕµÕ¬";
if (single) result+="Õ«Ö."; else result+="Õ¥Ö€Õ«Ö.";
diff --git a/src/translator_ar.h b/src/translator_ar.h
index 6738537..89be422 100644
--- a/src/translator_ar.h
+++ b/src/translator_ar.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -71,89 +71,89 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! return the language charset. This will be used for the HTML output */
virtual QCString idLanguageCharset()
{
- return "cp1256";
+ return "utf-8";
}
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
virtual QCString trRelatedFunctions()
- { return "ÏæÇá ÐÇÊ ÕáÉ"; }
+ { return "دوال ذات صلة"; }
/*! subscript for the related functions. */
virtual QCString trRelatedSubscript()
- { return "(áÇÍÙ Ãä åÐå ÇáÏæÇá áíÓÊ ÃÚÖÇÁ)"; }
+ { return "(لاحظ أن هذه الدوال ليست أعضاء)"; }
/*! header that is put before the detailed description of files, classes and namespaces. */
virtual QCString trDetailedDescription()
- { return "æÕÝ ÊÝÕíáí"; }
+ { return "وص٠تÙصيلي"; }
/*! header that is put before the list of typedefs. */
virtual QCString trMemberTypedefDocumentation()
- { return "ÊæËíÞ ÊÚÑíÝÇÊ ÇáäæÚ ÇáÃÚÖÇÁ"; }
+ { return "توثيق تعريÙات النوع الأعضاء"; }
/*! header that is put before the list of enumerations. */
virtual QCString trMemberEnumerationDocumentation()
- { return "ÊæËíÞ ÇáÚÏÏíÇÊ ÇáÃÚÖÇÁ"; }
+ { return "توثيق العدديات الأعضاء"; }
/*! header that is put before the list of member functions. */
virtual QCString trMemberFunctionDocumentation()
- { return "ÊæËíÞ ÇáÏæÇá ÇáÃÚÖÇÁ"; }
+ { return "توثيق الدوال الأعضاء"; }
/*! header that is put before the list of member attributes. */
virtual QCString trMemberDataDocumentation()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "ÊæËíÞ ÇáÍÞá";
+ return "توثيق الحقل";
}
else
{
- return "ÊæËíÞ ÇáÈíÇä ÇáÚÖæ";
+ return "توثيق البيان العضو";
}
}
/*! this is the text of a link put after brief descriptions. */
virtual QCString trMore()
- { return "ÇáãÒíÏ ..."; }
+ { return "المزيد ..."; }
/*! put in the class documentation */
virtual QCString trListOfAllMembers()
- { return "ÇÚÑÖ ßá ÇáÃÚÖÇÁ"; }
+ { return "اعرض كل الأعضاء"; }
/*! used as the title of the "list of all members" page of a class */
virtual QCString trMemberList()
- { return "ÞÇÆãÉ ÇáÃÚÖÇÁ"; }
+ { return "قائمة الأعضاء"; }
/*! this is the first part of a sentence that is followed by a class name */
virtual QCString trThisIsTheListOfAllMembers()
- { return "åÐå ÝÇÆãÉ Èßá ÇáÃÚÖÇÁ Ýí "; }
+ { return "هذه Ùائمة بكل الأعضاء ÙÙŠ "; }
/*! this is the remainder of the sentence after the class name */
virtual QCString trIncludingInheritedMembers()
- { return ", ãÊÖãäÉ ßá ÇáÃÚÖÇÁ ÇáãæÑæËÉ"; }
+ { return ", متضمنة كل الأعضاء الموروثة"; }
/*! this is put at the author sections at the bottom of man pages.
* parameter s is name of the project name.
*/
virtual QCString trGeneratedAutomatically(const char *s)
- { QCString result="Êã ÊßæíäåÇ ÂáíÇ ÈæÇÓØÉ Doxygen";
- if (s) result+=(QCString)" áÜ "+s;
- result+=" ãä ãáÝÇÊ ÇáãÕÏÑ.";
+ { QCString result="تم تكوينها آليا بواسطة Doxygen";
+ if (s) result+=(QCString)" لـ "+s;
+ result+=" من ملÙات المصدر.";
return result;
}
/*! put after an enum name in the list of all members */
virtual QCString trEnumName()
- { return "ÇáÅÓã ÇáÚÏÏí"; }
+ { return "الإسم العددي"; }
/*! put after an enum value in the list of all members */
virtual QCString trEnumValue()
- { return "ÇáÞíãÉ ÇáÚÏÏíÉ"; }
+ { return "القيمة العددية"; }
/*! put after an undocumented member in the list of all members */
virtual QCString trDefinedIn()
- { return "ãÚÑÝ Ýí"; }
+ { return "معر٠ÙÙŠ"; }
// quick reference sections
@@ -161,43 +161,43 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
* compounds or files (see the \\group command).
*/
virtual QCString trModules()
- { return "ãßæäÇÊ"; }
+ { return "مكونات"; }
/*! This is put above each page as a link to the class hierarchy */
virtual QCString trClassHierarchy()
- { return "ÇáÔßá ÇáåÑãí ááÝÆÉ"; }
+ { return "الشكل الهرمي للÙئة"; }
/*! This is put above each page as a link to the list of annotated classes */
virtual QCString trCompoundList()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "åíÇßá ÇáÈíÇäÇÊ";
+ return "هياكل البيانات";
}
else
{
- return "ÞÇÆãÉ ÇáÝÆÇÊ";
+ return "قائمة الÙئات";
}
}
/*! This is put above each page as a link to the list of documented files */
virtual QCString trFileList()
- { return "ÞÇÆãÉ ÇáãáÝÇÊ"; }
+ { return "قائمة الملÙات"; }
/*! This is put above each page as a link to the list of all verbatim headers */
virtual QCString trHeaderFiles()
- { return "ÇáãáÝÇÊ ÇáÑÃÓíÉ"; }
+ { return "الملÙات الرأسية"; }
/*! This is put above each page as a link to all members of compounds. */
virtual QCString trCompoundMembers()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "ÍÞæá ÇáÈíÇäÇÊ";
+ return "حقول البيانات";
}
else
{
- return "ÃÚÖÇÁ ÇáÝÆÉ";
+ return "أعضاء الÙئة";
}
}
@@ -206,38 +206,38 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "ÇáÚæÇã";
+ return "العوام";
}
else
{
- return "ÃÚÖÇÁ ÇáãáÝ";
+ return "أعضاء الملÙ";
}
}
/*! This is put above each page as a link to all related pages. */
virtual QCString trRelatedPages()
- { return "ÕÝÍÇÊ ÐÇÊ ÕáÉ"; }
+ { return "صÙحات ذات صلة"; }
/*! This is put above each page as a link to all examples. */
virtual QCString trExamples()
- { return "̋臃"; }
+ { return "أمثلة"; }
/*! This is put above each page as a link to the search engine. */
virtual QCString trSearch()
- { return "ÈÍË"; }
+ { return "بحث"; }
/*! This is an introduction to the class hierarchy. */
virtual QCString trClassHierarchyDescription()
- { return "ÞÇÆãÉ ÇáÊæÇÑË åÐå Êã ÊÑÊíÈåÇ ÃÈÌÏíÇ ÈÕæÑÉ ÊÞÑíÈíÉ ¡ "
- "æáßä áíÓ ÈÕæÑÉ ÊÇãÉ:";
+ { return "قائمة التوارث هذه تم ترتيبها أبجديا بصورة تقريبية ، "
+ "ولكن ليس بصورة تامة:";
}
/*! This is an introduction to the list with all files. */
virtual QCString trFileListDescription(bool extractAll)
{
- QCString result="åÐå ÞÇÆãÉ Èßá ÇáãáÝÇÊ";
- if (!extractAll) result+="ÇáãæËÞÉ ";
- result+="ãÚ æÕÝ ãÎÊÕÑ :";
+ QCString result="هذه قائمة بكل الملÙات";
+ if (!extractAll) result+="الموثقة ";
+ result+="مع وص٠مختصر :";
return result;
}
@@ -247,53 +247,53 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "åÐå åí åíÇßá ÇáÈíÇäÇÊ ãÚ æÕÝ ãÎÊÕÑ:";
+ return "هذه هي هياكل البيانات مع وص٠مختصر:";
}
else
{
- return "åÐå åí ÇáÝÆÇÊ ¡ ÇáÈäÇÁÇÊ ¡"
- "ÇáÅÊÍÇÏÇÊ æÇáæÇÌåÇÊ ãÚ æÕÝ ãÎÊÕÑ:";
+ return "هذه هي الÙئات ØŒ البناءات ØŒ"
+ "الإتحادات والواجهات مع وص٠مختصر:";
}
}
/*! This is an introduction to the page with all class members. */
virtual QCString trCompoundMembersDescription(bool extractAll)
{
- QCString result="åÐå ÞÇÆãÉ Èßá ";
+ QCString result="هذه قائمة بكل ";
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- result+="ÍÞæá ÇáÈäÇÁÇÊ æÇáÅÊÍÇÏÇÊ";
+ result+="حقول البناءات والإتحادات";
}
else
{
- result+="ÃÚÖÇÁ ÇáÝÆÉ";
+ result+="أعضاء الÙئة";
}
if (!extractAll)
{
- result+=" ÇáãæËÞÉ ";
+ result+=" الموثقة ";
}
- result+=" ãÚ æÕáÇÊ Åáì ";
+ result+=" مع وصلات إلى ";
if (!extractAll)
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- result+="ÊæËíÞ ÇáÈäÇÁ/ÇáÅÊÍÇÏ áßá ÍÞá:";
+ result+="توثيق البناء/الإتحاد لكل حقل:";
}
else
{
- result+="ÊæËíÞ ÇáÝÆÉ áßá ÚÖæ:";
+ result+="توثيق الÙئة لكل عضو:";
}
}
else
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- result+="ÇáÈäÇÁÇÊ/ÇáÅÊÍÇÏÇÊ ÇáÊí íäÊãæä ÅáíåÇ:";
+ result+="البناءات/الإتحادات التي ينتمون إليها:";
}
else
{
- result+="ÇáÝÆÇÊ ÇáÊí íäÊãæä ÅáíåÇ:";
+ result+="الÙئات التي ينتمون إليها:";
}
}
return result;
@@ -327,40 +327,40 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! This is an introduction to the page with the list of all examples */
virtual QCString trExamplesDescription()
- { return "åÐå ÞÇÆãÉ Èßá ÇáÃãËáÉ:"; }
+ { return "هذه قائمة بكل الأمثلة:"; }
/*! This is an introduction to the page with the list of related pages */
virtual QCString trRelatedPagesDescription()
- { return "åÐå ÞÇÆãÉ Èßá ÕÝÍÇÊ ÇáÊæËíÞ ÐÇÊ ÇáÕáÉ:"; }
+ { return "هذه قائمة بكل صÙحات التوثيق ذات الصلة:"; }
/*! This is an introduction to the page with the list of class/file groups */
virtual QCString trModulesDescription()
- { return "åÐå ÞÇÆãÉ Èßá ÇáãßæäÇÊ:"; }
+ { return "هذه قائمة بكل المكونات:"; }
/*! This sentences is used in the annotated class/file lists if no brief
* description is given.
*/
virtual QCString trNoDescriptionAvailable()
- { return "áÇ íæÌÏ æÕÝ ãÊÇÍ"; }
+ { return "لا يوجد وص٠متاح"; }
// index titles (the project name is prepended for these)
/*! This is used in HTML as the title of index.html. */
virtual QCString trDocumentation()
- { return "ÇáÊæËíÞ"; }
+ { return "التوثيق"; }
/*! This is used in LaTeX as the title of the chapter with the
* index of all groups.
*/
virtual QCString trModuleIndex()
- { return "ÝåÑÓ ÇáãßæäÇÊ"; }
+ { return "Ùهرس المكونات"; }
/*! This is used in LaTeX as the title of the chapter with the
* class hierarchy.
*/
virtual QCString trHierarchicalIndex()
- { return "ÇáÝåÑÓ ÇáåÑãí"; }
+ { return "الÙهرس الهرمي"; }
/*! This is used in LaTeX as the title of the chapter with the
* annotated compound index.
@@ -369,11 +369,11 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "ÝåÑÓ åíßá ÇáÈíÇäÇÊ";
+ return "Ùهرس هيكل البيانات";
}
else
{
- return "ÝåÑÓ ÇáÝÆÉ";
+ return "Ùهرس الÙئة";
}
}
@@ -381,13 +381,13 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
* list of all files.
*/
virtual QCString trFileIndex()
- { return "ÝåÑÓ ÇáãáÝÇÊ"; }
+ { return "Ùهرس الملÙات"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all groups.
*/
virtual QCString trModuleDocumentation()
- { return "ÊæËíÞ Çáãßæä"; }
+ { return "توثيق المكون"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all classes, structs and unions.
@@ -396,11 +396,11 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "ÝåÑÓ åíßá ÇáÈíÇäÇÊ";
+ return "Ùهرس هيكل البيانات";
}
else
{
- return "ÝåÑÓ ÇáÝÆÉ";
+ return "Ùهرس الÙئة";
}
}
@@ -408,29 +408,29 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
* the documentation of all files.
*/
virtual QCString trFileDocumentation()
- { return "ÊæËíÞ ÇáãáÝÇÊ"; }
+ { return "توثيق الملÙات"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all examples.
*/
virtual QCString trExampleDocumentation()
- { return "ÊæËíÞ ÇáÃãËáÉ"; }
+ { return "توثيق الأمثلة"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all related pages.
*/
virtual QCString trPageDocumentation()
- { return "ÊæËíÞ ÇáÕÝÍÇÊ"; }
+ { return "توثيق الصÙحات"; }
/*! This is used in LaTeX as the title of the document */
virtual QCString trReferenceManual()
- { return "ÇáßÊíÈ ÇáãÑÌÚí"; }
+ { return "الكتيب المرجعي"; }
/*! This is used in the documentation of a file as a header before the
* list of defines
*/
virtual QCString trDefines()
- { return "ÇáÊÚÑíÝÇÊ"; }
+ { return "التعريÙات"; }
/*! This is used in the documentation of a file as a header before the
* list of function prototypes
@@ -448,19 +448,19 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
* list of enumerations
*/
virtual QCString trEnumerations()
- { return "ÇáÚÏÏíÇÊ"; }
+ { return "العدديات"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) functions
*/
virtual QCString trFunctions()
- { return "ÇáÏæÇá"; }
+ { return "الدوال"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
virtual QCString trVariables()
- { return "ÇáãÊÛíÑÇÊ"; }
+ { return "المتغيرات"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) variables
@@ -502,13 +502,13 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
* of documentation blocks for functions
*/
virtual QCString trFunctionDocumentation()
- { return "ÊæËíÞ ÇáÏÇáÉ"; }
+ { return "توثيق الدالة"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for variables
*/
virtual QCString trVariableDocumentation()
- { return "ÊæËíÞ ÇáãÊÛíÑ"; }
+ { return "توثيق المتغير"; }
/*! This is used in the documentation of a file/namespace/group before
* the list of links to documented compounds
@@ -517,11 +517,11 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "åíÇßá ÇáÈíÇäÇÊ";
+ return "هياكل البيانات";
}
else
{
- return "ÇáÝÆÇÊ";
+ return "الÙئات";
}
}
@@ -539,7 +539,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trWrittenBy()
{
- return "ßÊÈ ÈæÇÓØÉ";
+ return "كتب بواسطة";
}
/*! this text is put before a class diagram */
@@ -550,7 +550,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! this text is generated when the \\internal command is used. */
virtual QCString trForInternalUseOnly()
- { return "ááÇÓÊÎÏÇã ÇáÏÇÎáí ÝÞØ."; }
+ { return "للاستخدام الداخلي Ùقط."; }
/*! this text is generated when the \\reimp command is used. */
virtual QCString trReimplementedForInternalReasons()
@@ -558,7 +558,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! this text is generated when the \\warning command is used. */
virtual QCString trWarning()
- { return "ÊäÈíå"; }
+ { return "تنبيه"; }
/*! this text is generated when the \\bug command is used. */
virtual QCString trBugsAndLimitations()
@@ -566,11 +566,11 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! this text is generated when the \\version command is used. */
virtual QCString trVersion()
- { return "ÅÕÏÇÑÉ"; }
+ { return "إصدارة"; }
/*! this text is generated when the \\date command is used. */
virtual QCString trDate()
- { return "ÊÇÑíÎ"; }
+ { return "تاريخ"; }
/*! this text is generated when the \\return command is used. */
virtual QCString trReturns()
@@ -578,7 +578,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! this text is generated when the \\sa command is used. */
virtual QCString trSeeAlso()
- { return "ÇäÙÑ ÃíÖÇ"; }
+ { return "انظر أيضا"; }
/*! this text is generated when the \\param command is used. */
virtual QCString trParameters()
@@ -586,11 +586,11 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! this text is generated when the \\exception command is used. */
virtual QCString trExceptions()
- { return "ÇÓÊËäÇÁÇÊ"; }
+ { return "استثناءات"; }
/*! this text is used in the title page of a LaTeX document. */
virtual QCString trGeneratedBy()
- { return "ÇäÊÌÊ ÈæÇÓØÉ"; }
+ { return "انتجت بواسطة"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990307
@@ -598,7 +598,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! used as the title of page containing all the index of all namespaces. */
virtual QCString trNamespaceList()
- { return "ÞÇÆãÉ ãÌÇáÇÊ ÇáÃÓãÇÁ"; }
+ { return "قائمة مجالات الأسماء"; }
/*! used as an introduction to the namespace list */
virtual QCString trNamespaceListDescription(bool extractAll)
@@ -644,6 +644,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
case ClassDef::Protocol: result+=" Protocol"; break;
case ClassDef::Category: result+=" Category"; break;
case ClassDef::Exception: result+=" Exception"; break;
+ default: break;
}
if (isTemplate) result+=" Template";
result+=" Reference";
@@ -764,13 +765,13 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
* index of all namespaces.
*/
virtual QCString trNamespaceIndex()
- { return "ÝåÑÓ ãÌÇáÇÊ ÇáÃÓãÇÁ"; }
+ { return "Ùهرس مجالات الأسماء"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all namespaces.
*/
virtual QCString trNamespaceDocumentation()
- { return "ÊæËíÞ ãÌÇáÇÊ ÇáÃÓãÇÁ"; }
+ { return "توثيق مجالات الأسماء"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990522
@@ -780,7 +781,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
* namespaces in a file.
*/
virtual QCString trNamespaces()
- { return "ãÌÇáÇÊ ÇáÃÓãÇÁ"; }
+ { return "مجالات الأسماء"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990728
@@ -793,19 +794,20 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
bool single)
{ // here s is one of " Class", " Struct" or " Union"
// single is true implies a single file
- QCString result=(QCString)"ÊæËíÞ ";
+ QCString result=(QCString)"توثيق ";
switch(compType)
{
- case ClassDef::Class: result+="åÐå ÇáÝÆÉ"; break;
- case ClassDef::Struct: result+="åÐÇ ÇáÈäÇÁ"; break;
- case ClassDef::Union: result+="åÐÇ ÇáÅÊÍÇÏ"; break;
- case ClassDef::Interface: result+="åÐå ÇáæÇÌåÉ"; break;
- case ClassDef::Protocol: result+="åÐÇ ÇáÈÑæÊæßæá"; break;
- case ClassDef::Category: result+="åÐÇ ÇáÊÕäíÝ"; break;
- case ClassDef::Exception: result+="åÐÇ ÇáÅÓÊËäÇÁ"; break;
+ case ClassDef::Class: result+="هذه الÙئة"; break;
+ case ClassDef::Struct: result+="هذا البناء"; break;
+ case ClassDef::Union: result+="هذا الإتحاد"; break;
+ case ClassDef::Interface: result+="هذه الواجهة"; break;
+ case ClassDef::Protocol: result+="هذا البروتوكول"; break;
+ case ClassDef::Category: result+="هذا التصنيÙ"; break;
+ case ClassDef::Exception: result+="هذا الإستثناء"; break;
+ default: break;
}
- result+=" Êã Êßæíäå ãä ";
- if (single) result+="åÐÇ ÇáãáÝ:"; else result+="åÐå ÇáãáÝÇÊ:";
+ result+=" تم تكوينه من ";
+ if (single) result+="هذا الملÙ:"; else result+="هذه الملÙات:";
return result;
}
@@ -813,7 +815,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
* list.
*/
virtual QCString trAlphabeticalList()
- { return "ÞÇÆãÉ ÃÈÌÏíÉ"; }
+ { return "قائمة أبجدية"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990901
@@ -821,18 +823,18 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! This is used as the heading text for the retval command. */
virtual QCString trReturnValues()
- { return "Þíã ÇáÚæÏÉ"; }
+ { return "قيم العودة"; }
/*! This is in the (quick) index as a link to the main page (index.html)
*/
virtual QCString trMainPage()
- { return "ÇáÕÝÍÉ ÇáÑÆíÓíÉ"; }
+ { return "الصÙحة الرئيسية"; }
/*! This is used in references to page that are put in the LaTeX
* documentation. It should be an abbreviation of the word page.
*/
virtual QCString trPageAbbreviation()
- { return "Õ."; }
+ { return "ص."; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-991003
@@ -840,7 +842,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
virtual QCString trSources()
{
- return "ãÕÇÏÑ";
+ return "مصادر";
}
virtual QCString trDefinedAtLineInSourceFile()
{
@@ -867,68 +869,68 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! this text is put before a collaboration diagram */
virtual QCString trCollaborationDiagram(const char *clName)
{
- return (QCString)"ÑÓã ÇáÊÚÇæä áÜ "+clName+":";
+ return (QCString)"رسم التعاون لـ "+clName+":";
}
/*! this text is put before an include dependency graph */
virtual QCString trInclDepGraph(const char *fName)
{
- return (QCString)"ÑÓã ÇÚÊãÇÏíÉ ÇáÊÖãíä áÜ "+fName+":";
+ return (QCString)"رسم اعتمادية التضمين لـ "+fName+":";
}
/*! header that is put before the list of constructor/destructors. */
virtual QCString trConstructorDocumentation()
{
- return "ÊæËíÞ ÏæÇá ÇáÈäÇÁ æÇáåÏã";
+ return "توثيق دوال البناء والهدم";
}
/*! Used in the file documentation to point to the corresponding sources. */
virtual QCString trGotoSourceCode()
{
- return "ÇÐåÈ Åáì ÇáßæÏ ÇáÎÇÕ ÈåÐÇ ÇáãáÝ.";
+ return "اذهب إلى الكود الخاص بهذا الملÙ.";
}
/*! Used in the file sources to point to the corresponding documentation. */
virtual QCString trGotoDocumentation()
{
- return "ÇÐåÈ Åáì ÊæËíÞ åÐÇ ÇáãáÝ.";
+ return "اذهب إلى توثيق هذا الملÙ.";
}
/*! Text for the \\pre command */
virtual QCString trPrecondition()
{
- return "ÔÑØ ÓÇÈÞ";
+ return "شرط سابق";
}
/*! Text for the \\post command */
virtual QCString trPostcondition()
{
- return "ÔÑØ áÇÍÞ";
+ return "شرط لاحق";
}
/*! Text for the \\invariant command */
virtual QCString trInvariant()
{
- return "ËÇÈÊ";
+ return "ثابت";
}
/*! Text shown before a multi-line variable/enum initialization */
virtual QCString trInitialValue()
{
- return "ÞíãÉ ãÈÏÆíÉ:";
+ return "قيمة مبدئية:";
}
/*! Text used the source code in the file index */
virtual QCString trCode()
{
- return "ßæÏ";
+ return "كود";
}
virtual QCString trGraphicalHierarchy()
{
- return "ÇáÔßá ÇáÑÓæãí ááÝÆÇÊ";
+ return "الشكل الرسومي للÙئات";
}
virtual QCString trGotoGraphicalHierarchy()
{
- return "ÇÐåÈ Åáì ÇáÔßá ÇáåÑãí ÇáÑÓæãí ááÝÆÇÊ";
+ return "اذهب إلى الشكل الهرمي الرسومي للÙئات";
}
virtual QCString trGotoTextualHierarchy()
{
- return "ÇÐåÈ Åáì ÇáÔßá ÇáåÑãí ÇáäÕí ááÝÆÇÊ";
+ return "اذهب إلى الشكل الهرمي النصي للÙئات";
}
virtual QCString trPageIndex()
{
- return "ÝåÑÓ ÇáÕÝÍÇÊ";
+ return "Ùهرس الصÙحات";
}
//////////////////////////////////////////////////////////////////////////
@@ -937,50 +939,50 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
virtual QCString trNote()
{
- return "ãáÇÍÙÇÊ";
+ return "ملاحظات";
}
virtual QCString trPublicTypes()
{
- return "ÃäæÇÚ ÚÇãÉ";
+ return "أنواع عامة";
}
virtual QCString trPublicAttribs()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "ÍÞæá ÈíÇäÇÊ";
+ return "حقول بيانات";
}
else
{
- return "ÕÝÇÊ ÚÇãÉ";
+ return "صÙات عامة";
}
}
virtual QCString trStaticPublicAttribs()
{
- return "ÕÝÇÊ ÓÇßäÉ ÚÇãÉ";
+ return "صÙات ساكنة عامة";
}
virtual QCString trProtectedTypes()
{
- return "ÃäæÇÚ ãÍãíÉ";
+ return "أنواع محمية";
}
virtual QCString trProtectedAttribs()
{
- return "ÕÝÇÊ ãÍãíÉ";
+ return "صÙات محمية";
}
virtual QCString trStaticProtectedAttribs()
{
- return "ÕÝÇÊ ÓÇßäÉ ãÍãíÉ";
+ return "صÙات ساكنة محمية";
}
virtual QCString trPrivateTypes()
{
- return "ÃäæÇÚ ÎÇÕÉ";
+ return "أنواع خاصة";
}
virtual QCString trPrivateAttribs()
{
- return "ÕÝÇÊ ÎÇÕÉ";
+ return "صÙات خاصة";
}
virtual QCString trStaticPrivateAttribs()
{
- return "ÕÝÇÊ ÓÇßäÉ ÎÇÕÉ";
+ return "صÙات ساكنة خاصة";
}
//////////////////////////////////////////////////////////////////////////
@@ -990,12 +992,12 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! Used as a marker that is put before a \\todo item */
virtual QCString trTodo()
{
- return "ãåÇã";
+ return "مهام";
}
/*! Used as the header of the todo list */
virtual QCString trTodoList()
{
- return "ÞÇÆãÉ ÇáãåÇã";
+ return "قائمة المهام";
}
//////////////////////////////////////////////////////////////////////////
@@ -1004,24 +1006,24 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
virtual QCString trReferencedBy()
{
- return "ÐßÑ ÈæÇÓØÉ";
+ return "ذكر بواسطة";
}
virtual QCString trRemarks()
{
- return "ÊÚáíÞÇÊ";
+ return "تعليقات";
}
virtual QCString trAttention()
{
- return "ÇäÊÈå";
+ return "انتبه";
}
virtual QCString trInclByDepGraph()
{
- return "åÐÇ ÇáÑÓã íæÖÍ ÇáãáÝÇÊ ÇáÊí ÖãäÊ åÐÇ ÇáãáÝ"
- "ÈÕæÑÉ ãÈÇÔÑÉ Ãæ ÛíÑ ãÈÇÔÑÉ:";
+ return "هذا الرسم يوضح الملÙات التي ضمنت هذا الملÙ"
+ "بصورة مباشرة أو غير مباشرة:";
}
virtual QCString trSince()
{
- return "ãäÐ";
+ return "منذ";
}
//////////////////////////////////////////////////////////////////////////
@@ -1111,12 +1113,12 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! Used as a marker that is put before a test item */
virtual QCString trTest()
{
- return "ÇÎÊÈÇÑ";
+ return "اختبار";
}
/*! Used as the header of the test list */
virtual QCString trTestList()
{
- return "ÞÇÆãÉ ÇáÅÎÊÈÇÑÇÊ";
+ return "قائمة الإختبارات";
}
//////////////////////////////////////////////////////////////////////////
@@ -1136,12 +1138,12 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! Used as a section header for IDL properties */
virtual QCString trProperties()
{
- return "ÎÕÇÆÕ";
+ return "خصائص";
}
/*! Used as a section header for IDL property documentation */
virtual QCString trPropertyDocumentation()
{
- return "ÊæËíÞ ÇáÎÇÕíÉ";
+ return "توثيق الخاصية";
}
//////////////////////////////////////////////////////////////////////////
@@ -1151,49 +1153,49 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! Used for Java interfaces in the summary section of Java packages */
virtual QCString trInterfaces()
{
- return "æÇÌåÇÊ";
+ return "واجهات";
}
/*! Used for Java classes in the summary section of Java packages */
virtual QCString trClasses()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "åíÇßá ÇáÈíÇäÇÊ";
+ return "هياكل البيانات";
}
else
{
- return "ÝÆÇÊ";
+ return "Ùئات";
}
}
/*! Used as the title of a Java package */
virtual QCString trPackage(const char *name)
{
- return (QCString)"ÍÒãÉ "+name;
+ return (QCString)"حزمة "+name;
}
/*! Title of the package index page */
virtual QCString trPackageList()
{
- return "ÞÇÆãÉ ÇáÍÒã";
+ return "قائمة الحزم";
}
/*! The description of the package index page */
virtual QCString trPackageListDescription()
{
- return "åÐå åí ÇáÍÒã ãÚ æÕÝ ãÎÊÕÑ áßá ãäåÇ )Åä æÌÏ( :";
+ return "هذه هي الحزم مع وص٠مختصر لكل منها )إن وجد( :";
}
/*! The link name in the Quick links header for each page */
virtual QCString trPackages()
{
- return "ÍÒã";
+ return "حزم";
}
/*! Used as a chapter title for Latex & RTF output */
virtual QCString trPackageDocumentation()
{
- return "ÊæËíÞ ÇáÍÒã";
+ return "توثيق الحزم";
}
/*! Text shown before a multi-line define */
virtual QCString trDefineValue()
{
- return "ÇáÞíãÉ:";
+ return "القيمة:";
}
//////////////////////////////////////////////////////////////////////////
@@ -1203,12 +1205,12 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! Used as a marker that is put before a \\bug item */
virtual QCString trBug()
{
- return "ËÛÑÉ";
+ return "ثغرة";
}
/*! Used as the header of the bug list */
virtual QCString trBugList()
{
- return "ÞÇÆãÉ ÇáËÛÑÇÊ";
+ return "قائمة الثغرات";
}
//////////////////////////////////////////////////////////////////////////
@@ -1251,13 +1253,13 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trRTFCharSet()
{
- return "0";
+ return "178";
}
/*! Used as header RTF general index */
virtual QCString trRTFGeneralIndex()
{
- return "ÝåÑÓ";
+ return "Ùهرس";
}
/*! This is used for translation of the word that will possibly
@@ -1266,8 +1268,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trClass(bool /*first_capital*/, bool singular)
{
- QCString result("ÝÆÉ");
- if (!singular) result="ÝÆÇÊ";
+ QCString result("Ùئة");
+ if (!singular) result="Ùئات";
return result;
}
@@ -1277,8 +1279,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trFile(bool /*first_capital*/, bool singular)
{
- QCString result("ãáÝ");
- if (!singular) result="ãáÝÇÊ";
+ QCString result("ملÙ");
+ if (!singular) result="ملÙات";
return result;
}
@@ -1288,8 +1290,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trNamespace(bool /*first_capital*/, bool singular)
{
- QCString result("ãÌÇá ÃÓãÇÁ");
- if (!singular) result="ãÌÇáÇÊ ÃÓãÇÁ";
+ QCString result("مجال أسماء");
+ if (!singular) result="مجالات أسماء";
return result;
}
@@ -1299,8 +1301,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trGroup(bool /*first_capital*/, bool singular)
{
- QCString result("ãÌãæÚÉ");
- if (!singular) result="ãÌãæÚÇÊ";
+ QCString result("مجموعة");
+ if (!singular) result="مجموعات";
return result;
}
@@ -1310,8 +1312,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trPage(bool /*first_capital*/, bool singular)
{
- QCString result("ÕÝÍÉ");
- if (!singular) result="ÕÝÍÇÊ";
+ QCString result("صÙحة");
+ if (!singular) result="صÙحات";
return result;
}
@@ -1321,8 +1323,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trMember(bool /*first_capital*/, bool singular)
{
- QCString result("ÚÖæ");
- if (!singular) result="ÃÚÖÇÁ";
+ QCString result("عضو");
+ if (!singular) result="أعضاء";
return result;
}
@@ -1332,8 +1334,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trField(bool /*first_capital*/, bool singular)
{
- QCString result("ÍÞá");
- if (!singular) result="ÍÞæá";
+ QCString result("حقل");
+ if (!singular) result="حقول";
return result;
}
@@ -1343,8 +1345,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trGlobal(bool /*first_capital*/, bool singular)
{
- QCString result("ÚÇã");
- if (!singular) result="򾂋";
+ QCString result("عام");
+ if (!singular) result="عوام";
return result;
}
@@ -1356,8 +1358,8 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
* for the author section in man pages. */
virtual QCString trAuthor(bool /*first_capital*/, bool singular)
{
- QCString result("ÇáãÄáÝ");
- if (!singular) result="ÇáãÄáÝæä";
+ QCString result("المؤلÙ");
+ if (!singular) result="المؤلÙون";
return result;
}
@@ -1369,7 +1371,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trReferences()
{
- return "ãÑÌÚíÇÊ";
+ return "مرجعيات";
}
//////////////////////////////////////////////////////////////////////////
@@ -1401,7 +1403,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trRTFTableOfContents()
{
- return "ÌÏæá ÇáãÍÊæíÇÊ";
+ return "جدول المحتويات";
}
//////////////////////////////////////////////////////////////////////////
@@ -1425,12 +1427,12 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trEvents()
{
- return "ÇáÃÍÏÇË";
+ return "الأحداث";
}
/*! Header used for the documentation section of a class' events. */
virtual QCString trEventDocumentation()
{
- return "ÊæËíÞ ÇáÃÍÏÇË";
+ return "توثيق الأحداث";
}
//////////////////////////////////////////////////////////////////////////
@@ -1441,35 +1443,35 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trPackageTypes()
{
- return "ÃäæÇÚ ÇáÍÒãÉ";
+ return "أنواع الحزمة";
}
/*! Used as a heading for a list of Java class functions with package
* scope.
*/
virtual QCString trPackageMembers()
{
- return "ÏæÇá ÇáÍÒãÉ";
+ return "دوال الحزمة";
}
/*! Used as a heading for a list of static Java class functions with
* package scope.
*/
virtual QCString trStaticPackageMembers()
{
- return "ÏæÇá ÓÇßäÉ ááÍÒãÉ";
+ return "دوال ساكنة للحزمة";
}
/*! Used as a heading for a list of Java class variables with package
* scope.
*/
virtual QCString trPackageAttribs()
{
- return "ÎÕÇÆÕ ÇáÍÒãÉ";
+ return "خصائص الحزمة";
}
/*! Used as a heading for a list of static Java class variables with
* package scope.
*/
virtual QCString trStaticPackageAttribs()
{
- return "ÎÕÇÆÕ ÓÇßäÉ ááÍÒãÉ";
+ return "خصائص ساكنة للحزمة";
}
//////////////////////////////////////////////////////////////////////////
@@ -1481,12 +1483,12 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trAll()
{
- return "Çáßá";
+ return "الكل";
}
/*! Put in front of the call graph for a function. */
virtual QCString trCallGraph()
{
- return "åÐÇ åæ ÑÓã ÇáÇÓÊÏÚÇÁ áåÐå ÇáÏÇáÉ:";
+ return "هذا هو رسم الاستدعاء لهذه الدالة:";
}
//////////////////////////////////////////////////////////////////////////
@@ -1499,14 +1501,14 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trSearchForIndex()
{
- return "ÈÍË Úä";
+ return "بحث عن";
}
/*! This string is used as the title for the page listing the search
* results.
*/
virtual QCString trSearchResultsTitle()
{
- return "äÊÇÆÌ ÇáÈÍË";
+ return "نتائج البحث";
}
/*! This string is put just before listing the search results. The
* text can be different depending on the number of documents found.
@@ -1520,16 +1522,16 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
{
if (numDocuments==0)
{
- return "ÚÝæÇ ¡ áÇ íæÌÏ ÊæËíÞ ãáÇÆã áãÇ ÈÍËÊ Úäå.";
+ return "عÙوا ØŒ لا يوجد توثيق ملائم لما بحثت عنه.";
}
else if (numDocuments==1)
{
- return "æËíÞÉ ãäÇÓÈÉ áãÇ ÈÍËÊ Úäå. <b>1</b> Êã ÇáÚËæÑ Úáì.";
+ return "وثيقة مناسبة لما بحثت عنه. <b>1</b> تم العثور على.";
}
else
{
- return "æËíÞÉ ãØÇÈÞÉ áãÇ ÈÍËÊ Úäå <b>$num</b> Êã ÅíÌÇÏ ."
- "æÊã ÊÑÊíÈåã ÈÍíË íßæä ÇáÃÞÑÈ áäÊíÌÉ ÇáÈÍË ÃæáÇ.";
+ return "وثيقة مطابقة لما بحثت عنه <b>$num</b> تم إيجاد ."
+ "وتم ترتيبهم بحيث يكون الأقرب لنتيجة البحث أولا.";
}
}
/*! This string is put before the list of matched words, for each search
@@ -1537,7 +1539,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trSearchMatches()
{
- return "íÊØÇÈÞ ãÚ:";
+ return "يتطابق مع:";
}
//////////////////////////////////////////////////////////////////////////
@@ -1548,7 +1550,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trSourceFile(QCString& filename)
{
- return " ãáÝ ÇáãÕÏÑ" + filename ;
+ return " مل٠المصدر" + filename ;
}
//////////////////////////////////////////////////////////////////////////
@@ -1559,33 +1561,33 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
* hierarchy.
*/
virtual QCString trDirIndex()
- { return "Ôßá åÑãí ááÃÏáÉ"; }
+ { return "شكل هرمي للأدلة"; }
/*! This is used as the name of the chapter containing the documentation
* of the directories.
*/
virtual QCString trDirDocumentation()
- { return "ÊæËíÞ ÇáÃÏáÉ"; }
+ { return "توثيق الأدلة"; }
/*! This is used as the title of the directory index and also in the
* Quick links of an HTML page, to link to the directory hierarchy.
*/
virtual QCString trDirectories()
- { return "ÇáÃÏáÉ"; }
+ { return "الأدلة"; }
/*! This returns a sentences that introduces the directory hierarchy.
* and the fact that it is sorted alphabetically per level
*/
virtual QCString trDirDescription()
- { return "åÐÇ ÇáÔßá ÇáåÑãí ááÃÏáÉ Êã ÊÑÊíÈå ÃÈÌÏíÇ ÈÕæÑÉ ÊÞÑíÈíÉ¡ "
- "æáíÓ ÊÑÊíÈÇ ÃÈÌÏíÇ ßÇãáÇ:";
+ { return "هذا الشكل الهرمي للأدلة تم ترتيبه أبجديا بصورة تقريبية، "
+ "وليس ترتيبا أبجديا كاملا:";
}
/*! This returns the title of a directory page. The name of the
* directory is passed via \a dirName.
*/
virtual QCString trDirReference(const char *dirName)
- { QCString result=" ãÑÌÚ ÇáÏáíá"; result+=dirName; return result; }
+ { QCString result=" مرجع الدليل"; result+=dirName; return result; }
/*! This returns the word directory with or without starting capital
* (\a first_capital) and in sigular or plural form (\a singular).
@@ -1606,9 +1608,9 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
*/
virtual QCString trOverloadText()
{
- return "åÐå ÏÇáÉ ÚÖæ ÒÇÆÏÉ ÇáÊÍãíá ¡"
- "æÌÏ ÃäåÇ ãáÇÆãÉ. ÅäåÇ ÊÎÊáÝ Úä ÇáÏÇáÉ ÃÚáÇå"
- "ÝÞØ Ýí äæÚíÉ Çá argument(s) ÇáÊí ÊÞÈáåÇ.";
+ return "هذه دالة عضو زائدة التحميل ،"
+ "وجد أنها ملائمة. إنها تختل٠عن الدالة أعلاه"
+ "Ùقط ÙÙŠ نوعية ال argument(s) التي تقبلها.";
}
};
diff --git a/src/translator_br.h b/src/translator_br.h
index 7a0fb76..e67ad9f 100644
--- a/src/translator_br.h
+++ b/src/translator_br.h
@@ -1,5 +1,5 @@
/******************************************************************************
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -609,6 +609,7 @@ class TranslatorBrazilian : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+=" Protocolo "; break;
case ClassDef::Category: result+=" Categoria "; break;
case ClassDef::Exception: result+=" Exceção "; break;
+ default: break;
}
result+=(QCString)clName;
return result;
@@ -767,6 +768,7 @@ class TranslatorBrazilian : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="protocolo "; break;
case ClassDef::Category: result+="categoria "; break;
case ClassDef::Exception: result+="exceção "; break;
+ default: break;
}
result+=" foi gerada a partir ";
if (single) result+="do seguinte arquivo:"; else result+="dos seguintes arquivos:";
@@ -1671,6 +1673,7 @@ class TranslatorBrazilian : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="do Protocolo "; break;
case ClassDef::Category: result+="da Categoria "; break;
case ClassDef::Exception: result+="da Exceção "; break;
+ default: break;
}
result += clName;
@@ -1738,6 +1741,7 @@ class TranslatorBrazilian : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="esto protocolo "; break;
case ClassDef::Category: result+="esta categoria "; break;
case ClassDef::Exception: result+="esta exceção "; break;
+ default: break;
}
result+=" foi gerada a partir do";
diff --git a/src/translator_ca.h b/src/translator_ca.h
index da76896..f888dc1 100644
--- a/src/translator_ca.h
+++ b/src/translator_ca.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -621,6 +621,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="l Protocol "; break;
case ClassDef::Category: result+=" la Categoria "; break;
case ClassDef::Exception: result+=" l'Excepció "; break;
+ default: break;
}
if (isTemplate) result+="Template ";
result+=(QCString)clName;
@@ -780,6 +781,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+=" protocol"; break;
case ClassDef::Category: result+="a categoria"; break;
case ClassDef::Exception: result+="a excepció"; break;
+ default: break;
}
result+=" es va generar a partir del";
if (!single) result+="s";
@@ -1674,6 +1676,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="l Protocol "; break;
case ClassDef::Category: result+=" la Categoria "; break;
case ClassDef::Exception: result+=" l'Excepció "; break;
+ default: break;
}
if (isTemplate) result+="Template ";
result+=(QCString)clName;
@@ -1745,6 +1748,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+=" protocol"; break;
case ClassDef::Category: result+="a categoria"; break;
case ClassDef::Exception: result+="a excepció"; break;
+ default: break;
}
result+=" es va generar a partir del";
if (!single) result+="s";
diff --git a/src/translator_cn.h b/src/translator_cn.h
index 197cfe4..ba6e078 100644
--- a/src/translator_cn.h
+++ b/src/translator_cn.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -19,7 +19,7 @@
#define TRANSLATOR_CN_H
/*!
- If you want insert a space whenever Chinese meets English charactors, set
+ If you want insert a space whenever Chinese meets English characters, set
CN_SPC to " ", else null.
*/
#define CN_SPC " "
@@ -30,7 +30,7 @@ class TranslatorChinese : public TranslatorAdapter_1_8_2
/*! Used for identification of the language. The identification
* should not be translated. It should be replaced by the name
* of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It sould be equal to
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
* the identification used in the language.cpp.
*/
@@ -475,6 +475,7 @@ class TranslatorChinese : public TranslatorAdapter_1_8_2
case ClassDef::Protocol: result+="åè®®"; break;
case ClassDef::Category: result+="分类"; break;
case ClassDef::Exception: result+="异常"; break;
+ default: break;
}
result+=CN_SPC"å‚考";
return result;
@@ -643,6 +644,7 @@ class TranslatorChinese : public TranslatorAdapter_1_8_2
case ClassDef::Protocol: result+="åè®®"; break;
case ClassDef::Category: result+="分类"; break;
case ClassDef::Exception: result+="异常"; break;
+ default: break;
}
result+="的文档由以下文件生æˆ:";
return result;
@@ -1609,6 +1611,7 @@ class TranslatorChinese : public TranslatorAdapter_1_8_2
case ClassDef::Protocol: result+=CN_SPC"åè®®"; break;
case ClassDef::Category: result+=CN_SPC"目录"; break;
case ClassDef::Exception: result+=CN_SPC"异常"; break;
+ default: break;
}
if (isTemplate) result+="模æ¿"CN_SPC;
result+="å‚考手册";
@@ -1683,6 +1686,7 @@ class TranslatorChinese : public TranslatorAdapter_1_8_2
case ClassDef::Protocol: result+=CN_SPC"åè®®"; break;
case ClassDef::Category: result+=CN_SPC"目录"; break;
case ClassDef::Exception: result+=CN_SPC"异常"; break;
+ default: break;
}
result+=CN_SPC"的文档由以下文件生æˆ:";
return result;
diff --git a/src/translator_cz.h b/src/translator_cz.h
index c317cae..31d645f 100644
--- a/src/translator_cz.h
+++ b/src/translator_cz.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -84,7 +84,7 @@
// something else. It is difficult to find the general translation
// for all kinds in the Czech language.
-class TranslatorCzech : public Translator
+class TranslatorCzech : public TranslatorAdapter_1_8_2
{
public:
// --- Language control methods -------------------
@@ -657,6 +657,7 @@ class TranslatorCzech : public Translator
case ClassDef::Protocol: result += "protokolu "; break;
case ClassDef::Category: result += "kategorie "; break;
case ClassDef::Exception: result += "výjimky "; break;
+ default: break;
}
result += clName;
return result;
@@ -829,6 +830,7 @@ class TranslatorCzech : public Translator
case ClassDef::Protocol: result+="tento protokol "; break;
case ClassDef::Category: result+="tuto kategorii "; break;
case ClassDef::Exception: result+="tuto výjimku"; break;
+ default: break;
}
result+=" byla generována z ";
if (single) result+="následujícího souboru:";
@@ -1719,6 +1721,7 @@ class TranslatorCzech : public Translator
case ClassDef::Protocol: result += "protokolu "; break;
case ClassDef::Category: result += "kategorie "; break;
case ClassDef::Exception: result += "výjimky "; break;
+ default: break;
}
result += clName;
return result;
@@ -1786,6 +1789,7 @@ class TranslatorCzech : public Translator
case ClassDef::Protocol: result+="k tomuto protokolu"; break;
case ClassDef::Category: result+="k této kategorii"; break;
case ClassDef::Exception: result+="k této výjimce"; break;
+ default: break;
}
result+=" byla vygenerována z ";
if (single) result+="následujícího souboru:";
diff --git a/src/translator_de.h b/src/translator_de.h
index 47fec53..ed9bf29 100644
--- a/src/translator_de.h
+++ b/src/translator_de.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -133,7 +133,7 @@
#ifndef TRANSLATOR_DE_H
#define TRANSLATOR_DE_H
-class TranslatorGerman : public Translator
+class TranslatorGerman : public TranslatorAdapter_1_8_2
{
public:
@@ -684,6 +684,7 @@ class TranslatorGerman : public Translator
case ClassDef::Protocol: result+="Protokoll"; break;
case ClassDef::Category: result+="Kategorie"; break;
case ClassDef::Exception: result+="Ausnahmen"; break;
+ default: break;
}
result+="referenz";
return result;
@@ -851,6 +852,7 @@ class TranslatorGerman : public Translator
case ClassDef::Protocol: result+="s Protokoll"; break;
case ClassDef::Category: result+=" Kategorie"; break;
case ClassDef::Exception: result+=" Ausnahme"; break;
+ default: break;
}
result+=" wurde erzeugt aufgrund der Datei";
if (single) result+=":"; else result+="en:";
@@ -1776,6 +1778,7 @@ class TranslatorGerman : public Translator
case ClassDef::Protocol: result+="Protokoll"; break;
case ClassDef::Category: result+="Kategorie"; break;
case ClassDef::Exception: result+="Ausnahmen"; break;
+ default: break;
}
if (isTemplate) result+="-Template";
result+="-Referenz";
@@ -1844,6 +1847,7 @@ class TranslatorGerman : public Translator
case ClassDef::Protocol: result+="dieses Protokoll"; break;
case ClassDef::Category: result+="diese Kategorie"; break;
case ClassDef::Exception: result+="diese Ausnahme"; break;
+ default: break;
}
if (single)
result+=" wurde aus der folgenden Datei erzeugt:";
diff --git a/src/translator_dk.h b/src/translator_dk.h
index bf02402..6d17df5 100644
--- a/src/translator_dk.h
+++ b/src/translator_dk.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -632,6 +632,7 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+=" Protokol-"; break;
case ClassDef::Category: result+=" Kategori-"; break; // " Category-"
case ClassDef::Exception: result+=" Undtagelse-"; break; // " Exception"
+ default: break;
}
if (isTemplate) result+="skabelon-"; // "template-"
result+="reference";
@@ -789,6 +790,7 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="protokol"; break; // "protocol"
case ClassDef::Category: result+="kategori"; break; // "category"
case ClassDef::Exception: result+="undtagelse"; break; // "exception"
+ default: break;
}
result+=" blev genereret ud fra fil";
if (single) result+="en:"; else result+="erne:";
@@ -1604,6 +1606,7 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+=" Protocol"; break; // " Protocol"
case ClassDef::Category: result+=" Kategori"; break; // " Category"
case ClassDef::Exception: result+=" Undtagelse"; break; // " Exception"
+ default: break;
}
if (isTemplate) result+=" Template";
result+=" Reference";
@@ -1673,6 +1676,7 @@ class TranslatorDanish : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="protokol"; break; // "protocol"
case ClassDef::Category: result+="kategori"; break; // "category"
case ClassDef::Exception: result+="undtagelse"; break; // "exception"
+ default: break;
}
result+=" var lavet udfra følgende file"; // " was generated from the following file"
if (single) result+=":"; else result+="r:"; // ":" / "s:"
diff --git a/src/translator_en.h b/src/translator_en.h
index bc51760..1ab9921 100644
--- a/src/translator_en.h
+++ b/src/translator_en.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -621,6 +621,7 @@ class TranslatorEnglish : public Translator
case ClassDef::Protocol: result+=" Protocol"; break;
case ClassDef::Category: result+=" Category"; break;
case ClassDef::Exception: result+=" Exception"; break;
+ default: break;
}
if (isTemplate) result+=" Template";
result+=" Reference";
@@ -779,6 +780,7 @@ class TranslatorEnglish : public Translator
case ClassDef::Protocol: result+="protocol"; break;
case ClassDef::Category: result+="category"; break;
case ClassDef::Exception: result+="exception"; break;
+ default: break;
}
result+=" was generated from the following file";
if (single) result+=":"; else result+="s:";
@@ -1679,6 +1681,7 @@ class TranslatorEnglish : public Translator
case ClassDef::Protocol: result+=" Protocol"; break;
case ClassDef::Category: result+=" Category"; break;
case ClassDef::Exception: result+=" Exception"; break;
+ default: break;
}
if (isTemplate) result+=" Template";
result+=" Reference";
@@ -1747,6 +1750,7 @@ class TranslatorEnglish : public Translator
case ClassDef::Protocol: result+="protocol"; break;
case ClassDef::Category: result+="category"; break;
case ClassDef::Exception: result+="exception"; break;
+ default: break;
}
result+=" was generated from the following file";
if (single) result+=":"; else result+="s:";
@@ -1988,6 +1992,62 @@ class TranslatorEnglish : public Translator
}
//////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+ /** old style UNO IDL services: implemented interfaces */
+ virtual QCString trInterfaces()
+ { return "Exported Interfaces"; }
+
+ /** old style UNO IDL services: inherited services */
+ virtual QCString trServices()
+ { return "Included Services"; }
+
+ /** UNO IDL constant groups */
+ virtual QCString trConstantGroups()
+ { return "Constant Groups"; }
+
+ /** UNO IDL constant groups */
+ virtual QCString trConstantGroupReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Constant Group Reference";
+ return result;
+ }
+ /** UNO IDL service page title */
+ virtual QCString trServiceReference(const char *sName)
+ {
+ QCString result=(QCString)sName;
+ result+=" Service Reference";
+ return result;
+ }
+ /** UNO IDL singleton page title */
+ virtual QCString trSingletonReference(const char *sName)
+ {
+ QCString result=(QCString)sName;
+ result+=" Singleton Reference";
+ return result;
+ }
+ /** UNO IDL service page */
+ virtual QCString trServiceGeneratedFromFiles(bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"The documentation for this service "
+ "was generated from the following file";
+ if (single) result+=":"; else result+="s:";
+ return result;
+ }
+ /** UNO IDL singleton page */
+ virtual QCString trSingletonGeneratedFromFiles(bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"The documentation for this singleton "
+ "was generated from the following file";
+ if (single) result+=":"; else result+="s:";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
};
diff --git a/src/translator_eo.h b/src/translator_eo.h
index b4a077c..9c08d4c 100644
--- a/src/translator_eo.h
+++ b/src/translator_eo.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -42,7 +42,7 @@
Translator class (by the local maintainer) when the localized
translator is made up-to-date again.
*/
-class TranslatorEsperanto : public Translator
+class TranslatorEsperanto : public TranslatorAdapter_1_8_2
{
public:
@@ -623,6 +623,7 @@ class TranslatorEsperanto : public Translator
case ClassDef::Protocol: result+="protokolo "; break;
case ClassDef::Category: result+="kategorio "; break;
case ClassDef::Exception: result+="escepto "; break;
+ default: break;
}
result+=(QCString)clName;
return result;
@@ -780,6 +781,7 @@ class TranslatorEsperanto : public Translator
case ClassDef::Protocol: result+="protokolo"; break;
case ClassDef::Category: result+="kategorio"; break;
case ClassDef::Exception: result+="escepto"; break;
+ default: break;
}
result+=" generitas el la ";
if (single) result+="sekva dosiero:";
@@ -1679,6 +1681,7 @@ class TranslatorEsperanto : public Translator
case ClassDef::Protocol: result+="protokolo "; break;
case ClassDef::Category: result+="kategorio "; break;
case ClassDef::Exception: result+="escepto "; break;
+ default: break;
}
result+=(QCString)clName;
return result;
@@ -1745,6 +1748,7 @@ class TranslatorEsperanto : public Translator
case ClassDef::Protocol: result+="protokolo"; break;
case ClassDef::Category: result+="kategorio"; break;
case ClassDef::Exception: result+="escepto"; break;
+ default: break;
}
result+=" kreiÄis el la ";
if (single) result+="sekva dosiero:"; else result+="sekvaj dosieroj:";
diff --git a/src/translator_es.h b/src/translator_es.h
index bdddeba..9d3ba1d 100644
--- a/src/translator_es.h
+++ b/src/translator_es.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -33,7 +33,7 @@
* Updated to 1.8.2 by Bartomeu Creus Navarro (01-julio-2012)
*/
-class TranslatorSpanish : public Translator
+class TranslatorSpanish : public TranslatorAdapter_1_8_2
{
public:
@@ -613,6 +613,7 @@ class TranslatorSpanish : public Translator
case ClassDef::Protocol: result+="l Protocolo "; break;
case ClassDef::Category: result+=" la Categoria "; break;
case ClassDef::Exception: result+=" la Excepción "; break;
+ default: break;
}
result+=(QCString)clName;
return result;
@@ -780,6 +781,7 @@ class TranslatorSpanish : public Translator
case ClassDef::Protocol: result+="e protocolo"; break;
case ClassDef::Category: result+="a categoría"; break;
case ClassDef::Exception: result+="a excepción"; break;
+ default: break;
}
result+=" fue generada a partir de";
if (single) result+="l siguiente fichero:";
@@ -1737,6 +1739,7 @@ class TranslatorSpanish : public Translator
case ClassDef::Protocol: result+="l protocolo"; break;
case ClassDef::Category: result+=" la categoría"; break;
case ClassDef::Exception: result+=" la excepción"; break;
+ default: break;
}
result+=(QCString)clName;
return result;
@@ -1805,6 +1808,7 @@ class TranslatorSpanish : public Translator
case ClassDef::Protocol: result+="e protocolo"; break;
case ClassDef::Category: result+="a categoría"; break;
case ClassDef::Exception: result+="a excepción"; break;
+ default: break;
}
result+=" fue generada de";
if (single) result+="l siguiente fichero:";
diff --git a/src/translator_fa.h b/src/translator_fa.h
index e74e123..d3c38a6 100644
--- a/src/translator_fa.h
+++ b/src/translator_fa.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -623,6 +623,7 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result=" Protocol"; break;
case ClassDef::Category: result=" Category"; break;
case ClassDef::Exception: result=" استثناء"; break;
+ default: break;
}
if (isTemplate) result+=" قالب";
result=QCString(clName) + " مرجع" +result ;
@@ -779,6 +780,7 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+="protocol"; break;
case ClassDef::Category: result+="category"; break;
case ClassDef::Exception: result+="exception"; break;
+ default: break;
}
result+=" از روی پرونده ";
if (single) result+=""; else result+="های ";
@@ -1212,7 +1214,7 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5
*/
virtual QCString trRTFCharSet()
{
- return "0";
+ return "178";
}
/*! Used as header RTF general index */
@@ -1651,6 +1653,7 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+=" Protocol"; break;
case ClassDef::Category: result+=" Category"; break;
case ClassDef::Exception: result+=" Exception"; break;
+ default: break;
}
if (isTemplate) result+=" Template";
result+=" Reference";
@@ -1708,6 +1711,7 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+="protocol"; break;
case ClassDef::Category: result+="category"; break;
case ClassDef::Exception: result+="exception"; break;
+ default: break;
}
result+=" was generated from the following file";
if (single) result+=":"; else result+="s:";
diff --git a/src/translator_fi.h b/src/translator_fi.h
index fdf4b94..3a9a890 100644
--- a/src/translator_fi.h
+++ b/src/translator_fi.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -95,7 +95,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_6_0
*/
/*virtual QCString updateNeededMessage()
{
- return "Warning: The Finnish translator is really obsolete.\n"
+ return "The Finnish translator is really obsolete.\n"
"It was not updated since version 1.0.0. As a result,\n"
"some sentences may appear in English.\n\n";
}*/
@@ -686,6 +686,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=" protokolla"; break; // " Protocol"
case ClassDef::Category: result+=" kategoria"; break; // " Category"
case ClassDef::Exception: result+=" poikkeus"; break; // " Exception"
+ default: break;
}
if (isTemplate) result+="malli"; // " Template"
result+="referenssi"; // " Reference"
@@ -845,6 +846,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="protokollalle"; break; // "protocol"
case ClassDef::Category: result+="kategorialle"; break; // "category"
case ClassDef::Exception: result+="poikkeukselle"; break; // "exception"
+ default: break;
}
if (single) result+=" luotiin seuraavasta tiedostosta:"; // " was generated from the following file"
else result+=" luotiin seuraavista tiedostoista:"; // ":" or "s:"
@@ -1799,6 +1801,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=" protokolla"; break; // " Protocol"
case ClassDef::Category: result+=" kategoria"; break; // " Category"
case ClassDef::Exception: result+=" poikkeus"; break; // " Exception"
+ default: break;
}
if (isTemplate) result+="malli"; // " Template"
result+="referenssi"; // " Reference"
@@ -1866,6 +1869,7 @@ class TranslatorFinnish : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="protokollalle"; break; // "protocol"
case ClassDef::Category: result+="kategorialle"; break; // "category"
case ClassDef::Exception: result+="poikkeukselle"; break; // "exception"
+ default: break;
}
result+=" luotiin "; // " was generated from the following file"
if (single) result+="seuraavasta tiedostosta:"; else result+="seuraavista tiedostoista:"; // ":" / "s:"
diff --git a/src/translator_fr.h b/src/translator_fr.h
index 05bd4d8..8befead 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -679,6 +679,7 @@ class TranslatorFrench : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="le protocol "; break;
case ClassDef::Category: result+="la catégorie "; break;
case ClassDef::Exception: result+="l'exception "; break;
+ default: break;
}
result+=(QCString)clName;
return result;
@@ -838,6 +839,7 @@ class TranslatorFrench : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="ce protocol"; female = false; break;
case ClassDef::Category: result+="cette catégorie"; break;
case ClassDef::Exception: result+="cette exception"; break;
+ default: break;
}
if (female) result+= " a été générée à partir ";
else result+=" a été généré à partir ";
@@ -1739,6 +1741,7 @@ class TranslatorFrench : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="du protocole "; break;
case ClassDef::Category: result+="de la catégorie "; break;
case ClassDef::Exception: result+="de l'exception "; break;
+ default: break;
}
result+=(QCString)clName;
return result;
@@ -1806,6 +1809,7 @@ class TranslatorFrench : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="ce protocole"; break;
case ClassDef::Category: result+="cette catégorie"; break;
case ClassDef::Exception: result+="cette exception"; break;
+ default: break;
}
result+=" a été générée à partir ";
if (single) result+="du fichier suivant :"; else result+="des fichiers suivants :";
diff --git a/src/translator_gr.h b/src/translator_gr.h
index 95072a3..636da39 100644
--- a/src/translator_gr.h
+++ b/src/translator_gr.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -19,14 +19,14 @@
* 15 Dec 2001 : Translation to greek by
* Harry Kalogirou <no email>
*
- * 01 Jan 2009 : Greek maintainance by
+ * 01 Jan 2009 : Greek maintenance by
* Paul Gessos <gessos.paul@yahoo.gr>
*/
#ifndef TRANSLATOR_GR_H
#define TRANSLATOR_GR_H
-class TranslatorGreek : public Translator
+class TranslatorGreek : public TranslatorAdapter_1_8_2
{
public:
@@ -593,8 +593,9 @@ class TranslatorGreek : public Translator
case ClassDef::Protocol: result+=" ΠÏωτοκόλλου "; break;
case ClassDef::Category: result+=" ΚατηγοÏίας "; break;
case ClassDef::Exception: result+=" ΕξαίÏεσης "; break;
+ default: break;
}
- result+=clName;
+ result+=clName;
return result;
}
@@ -751,6 +752,7 @@ class TranslatorGreek : public Translator
case ClassDef::Protocol: result+="αυτό το Ï€Ïωτόκολλο"; break;
case ClassDef::Category: result+="αυτή την κατηγοÏία"; break;
case ClassDef::Exception: result+="αυτή την εξαίÏεση"; break;
+ default: break;
}
result+=" δημιουÏγήθηκε απο Ï„";
if (single) result+="ο ακόλουθο αÏχείο:"; else result+="α ακόλουθα αÏχεία:";
@@ -1183,11 +1185,10 @@ class TranslatorGreek : public Translator
/*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
*/
virtual QCString trRTFCharSet()
{
- return "0";
+ return "161";
}
/*! Used as header RTF general index */
@@ -1651,6 +1652,7 @@ class TranslatorGreek : public Translator
case ClassDef::Protocol: result+=" ΠÏωτόκολλο"; break;
case ClassDef::Category: result+=" ΚατηγοÏία"; break;
case ClassDef::Exception: result+=" ΕξαίÏεση"; break;
+ default: break;
}
if (isTemplate) result+=" ΠÏότυπο";
result+=" Δήλωση";
@@ -1718,6 +1720,7 @@ class TranslatorGreek : public Translator
case ClassDef::Protocol: result+="αυτό το Ï€Ïωτόκολλο"; break;
case ClassDef::Category: result+="αυτή την κατηγοÏία"; break;
case ClassDef::Exception: result+="αυτή την εξαίÏεση"; break;
+ default: break;
}
result+=" δημιουÏγήθηκε από ";
if (single) result+="το παÏακάτω αÏχείο:"; else result+="τα παÏακάτω αÏχεία:";
diff --git a/src/translator_hr.h b/src/translator_hr.h
index 6c22919..bb124dd 100644
--- a/src/translator_hr.h
+++ b/src/translator_hr.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -18,7 +18,7 @@
// Updates:
// --------
// 2000/08/20
-// - Better handling of ISO-8859-2/ WIN 1250 stuff based on (actualy stolen from :-)) Czech translations
+// - Better handling of ISO-8859-2/ WIN 1250 stuff based on (actually stolen from :-)) Czech translations
// implemented by Petr Prikryl (prikrylp@skil.cz).
// As opposed to Czech translation this one assumes that Doxygen strings are written in Linux ( it's true,
// I don't have QT pro licence ) , and uses ISOToWin function when built in WIN32
@@ -367,9 +367,9 @@ class TranslatorCroatian : public TranslatorAdapter_1_8_2
case ClassDef::Protocol: result+=" protokola "; break;
case ClassDef::Category: result+=" kategorije "; break;
case ClassDef::Exception: result+=" iznimke (exception) "; break;
+ default: break;
}
- result += clName;
-
+ result += clName;
return result;
}
QCString trFileReference(const char *fileName)
@@ -517,6 +517,7 @@ class TranslatorCroatian : public TranslatorAdapter_1_8_2
case ClassDef::Protocol: result+="protokola"; break;
case ClassDef::Category: result+="kategorije"; break;
case ClassDef::Exception: result+="iznimke (exception)"; break;
+ default: break;
}
result+=" je napravljena iz " + trFile(FALSE, single) + ": ";
return result;
@@ -1359,13 +1360,14 @@ class TranslatorCroatian : public TranslatorAdapter_1_8_2
QCString result=(QCString)clName;
switch(compType)
{
- case ClassDef::Class: result+=" Modul"; break;
- case ClassDef::Struct: result+=" Tip"; break;
- case ClassDef::Union: result+=" Unija"; break;
- case ClassDef::Interface: result+=" SuÄelje"; break;
- case ClassDef::Protocol: result+=" Protokol"; break;
- case ClassDef::Category: result+=" Kategorija"; break;
- case ClassDef::Exception: result+=" Iznimka"; break;
+ case ClassDef::Class: result+=" Modul"; break;
+ case ClassDef::Struct: result+=" Tip"; break;
+ case ClassDef::Union: result+=" Unija"; break;
+ case ClassDef::Interface: result+=" SuÄelje"; break;
+ case ClassDef::Protocol: result+=" Protokol"; break;
+ case ClassDef::Category: result+=" Kategorija"; break;
+ case ClassDef::Exception: result+=" Iznimka"; break;
+ default: break;
}
if (isTemplate) result+=" Predložak";
result+=" Referenca";
@@ -1426,13 +1428,14 @@ class TranslatorCroatian : public TranslatorAdapter_1_8_2
QCString result=(QCString)"Dokumentacija ovog ";
switch(compType)
{
- case ClassDef::Class: result+="modula"; break;
- case ClassDef::Struct: result+="tipa"; break;
- case ClassDef::Union: result+="unije"; break;
- case ClassDef::Interface: result+="suÄelja"; break;
- case ClassDef::Protocol: result+="protokola"; break;
- case ClassDef::Category: result+="kategorije"; break;
- case ClassDef::Exception: result+="iznimke"; break;
+ case ClassDef::Class: result+="modula"; break;
+ case ClassDef::Struct: result+="tipa"; break;
+ case ClassDef::Union: result+="unije"; break;
+ case ClassDef::Interface: result+="suÄelja"; break;
+ case ClassDef::Protocol: result+="protokola"; break;
+ case ClassDef::Category: result+="kategorije"; break;
+ case ClassDef::Exception: result+="iznimke"; break;
+ default: break;
}
result+=" je napravljena iz :";
return result;
diff --git a/src/translator_hu.h b/src/translator_hu.h
index 3bed223..58cb0d5 100644
--- a/src/translator_hu.h
+++ b/src/translator_hu.h
@@ -1,8 +1,6 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -604,6 +602,7 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6
case ClassDef::Protocol: result+=" protocol"; break; // translate me!
case ClassDef::Category: result+=" category"; break; // translate me!
case ClassDef::Exception: result+=" kivétel"; break;
+ default: break;
}
if (isTemplate) result+="sablon-";
result+="referencia";
@@ -763,6 +762,7 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6
case ClassDef::Protocol: result+="protocol"; break; // translate me!
case ClassDef::Category: result+="category"; break; // translate me!
case ClassDef::Exception: result+="a kivételrõl"; break;
+ default: break;
}
result+=" a következõ fájl";
if (!single) result+="ok";
diff --git a/src/translator_id.h b/src/translator_id.h
index cf9a475..18e561a 100644
--- a/src/translator_id.h
+++ b/src/translator_id.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -603,6 +603,7 @@ class TranslatorIndonesian : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+=" Protokol "; break;
case ClassDef::Category: result+=" Kategori "; break;
case ClassDef::Exception: result+=" Eksepsi "; break;
+ default: break;
}
if (isTemplate) result+=" Template ";
result+=(QCString)clName;
@@ -762,6 +763,7 @@ class TranslatorIndonesian : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="protokol"; break;
case ClassDef::Category: result+="kategori"; break;
case ClassDef::Exception: result+="eksepsi"; break;
+ default: break;
}
result+=" ini dibangkitkan dari file";
result+=single ? "" : "-file";
@@ -1658,6 +1660,7 @@ class TranslatorIndonesian : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="Protokol "; break;
case ClassDef::Category: result+="Kategori "; break;
case ClassDef::Exception: result+="Eksepsi "; break;
+ default: break;
}
result+=(QCString)clName;
return result;
@@ -1724,6 +1727,7 @@ class TranslatorIndonesian : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="protocol"; break;
case ClassDef::Category: result+="category"; break;
case ClassDef::Exception: result+="exception"; break;
+ default: break;
}
result+=" ini dibangkitkan dari file";
if (!single) result+="-file ";
diff --git a/src/translator_it.h b/src/translator_it.h
index 701c7ec..db8bd81 100644
--- a/src/translator_it.h
+++ b/src/translator_it.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -51,7 +51,7 @@
* 2001/05: adopted new translation mechanism (trough adapters),
* translated new items used since version 1.2.5 and 1.2.6,
* revised those function returning strings in OPTIMIZE_OTPUT_FOR_C case,
- * corrections regarding the plurals of some english terms mantained in the translation,
+ * corrections regarding the plurals of some english terms maintained in the translation,
* changed some terms to better suit the sense
* 2001/02: translated new items used since version 1.2.4
* 2000/11: modified slightly the translation in trLegendDocs() function,
@@ -633,6 +633,7 @@ class TranslatorItalian : public TranslatorAdapter_1_8_2
case ClassDef::Protocol: result+="il protocollo "; break;
case ClassDef::Category: result+="la categoria "; break;
case ClassDef::Exception: result+="l'eccezione "; break;
+ default: break;
}
result+=(QCString)clName;
return result;
@@ -794,6 +795,7 @@ class TranslatorItalian : public TranslatorAdapter_1_8_2
case ClassDef::Protocol: result+="o protocollo"; break;
case ClassDef::Category: result+="a categoria"; break;
case ClassDef::Exception: result+="a eccezione"; break;
+ default: break;
}
result+=" è stata generata a partire ";
if (single) result+="dal seguente file:";
@@ -1657,6 +1659,7 @@ class TranslatorItalian : public TranslatorAdapter_1_8_2
case ClassDef::Protocol: result+=" il protocollo"; break;
case ClassDef::Category: result+=" la categoria"; break;
case ClassDef::Exception: result+=" l'eccezione"; break;
+ default: break;
}
result+=(QCString)clName;
return result;
@@ -1725,6 +1728,7 @@ class TranslatorItalian : public TranslatorAdapter_1_8_2
case ClassDef::Protocol: result+="o protocollo"; break;
case ClassDef::Category: result+="a categoria"; break;
case ClassDef::Exception: result+="a eccezione"; break;
+ default: break;
}
result+=" è stata generata a partire ";
if (single) result+="dal seguente file:"; else result+="dai seguenti file:";
diff --git a/src/translator_je.h b/src/translator_je.h
index 09bb066..c6bfdcb 100644
--- a/src/translator_je.h
+++ b/src/translator_je.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_jp.h b/src/translator_jp.h
index 8278abe..418d6bb 100644
--- a/src/translator_jp.h
+++ b/src/translator_jp.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -601,6 +601,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=decode("¥×¥í¥È¥³¥ë "); break;
case ClassDef::Category: result+=decode("¥«¥Æ¥´¥ê "); break;
case ClassDef::Exception: result+=decode("Îã³° "); break;
+ default: break;
}
if (isTemplate) result+=decode("¥Æ¥ó¥×¥ì¡¼¥È ");
result+=(QCString)clName;
@@ -759,6 +760,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=decode("¥×¥í¥È¥³¥ë"); break;
case ClassDef::Category: result+=decode("¥«¥Æ¥´¥ê"); break;
case ClassDef::Exception: result+=decode("Îã³°"); break;
+ default: break;
}
result+=decode("¤ÎÀâÌÀ¤Ï¼¡¤Î¥Õ¥¡¥¤¥ë¤«¤éÀ¸À®¤µ¤ì¤Þ¤·¤¿:");
return result;
@@ -1660,6 +1662,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=decode("¥×¥í¥È¥³¥ë "); break;
case ClassDef::Category: result+=decode("¥«¥Æ¥´¥ê "); break;
case ClassDef::Exception: result+=decode("Îã³° "); break;
+ default: break;
}
if (isTemplate) result += decode("¥Æ¥ó¥×¥ì¡¼¥È ");
result+=(QCString)clName;
@@ -1720,6 +1723,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=decode("¥×¥í¥È¥³¥ë"); break;
case ClassDef::Category: result+=decode("¥«¥Æ¥´¥ê"); break;
case ClassDef::Exception: result+=decode("Îã³°"); break;
+ default: break;
}
result+=decode(decode("¤ÎÀâÌÀ¤Ï¼¡¤Î¥Õ¥¡¥¤¥ë¤«¤éÀ¸À®¤µ¤ì¤Þ¤·¤¿:"));
return result;
diff --git a/src/translator_ke.h b/src/translator_ke.h
index 4874a5c..f089d38 100644
--- a/src/translator_ke.h
+++ b/src/translator_ke.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_kr.h b/src/translator_kr.h
index 3158405..a1ae9ea 100644
--- a/src/translator_kr.h
+++ b/src/translator_kr.h
@@ -1,8 +1,6 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -643,6 +641,7 @@ class TranslatorKorean : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+=" ÇÁ·ÎÅäÄÝ"; break;
case ClassDef::Category: result+=" Ä«Å×°í¸®"; break;
case ClassDef::Exception: result+=" ¿¹¿Ü"; break;
+ default: break;
}
if (isTemplate) result+=" ÅÛÇø´";
result+=" ÂüÁ¶";
@@ -802,6 +801,7 @@ class TranslatorKorean : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+="ÇÁ·ÎÅäÄÝ"; break;
case ClassDef::Category: result+="Ä«Å×°í¸®"; break;
case ClassDef::Exception: result+="¿¹¿Ü"; break;
+ default: break;
}
result+="¿¡ ´ëÇÑ ¹®¼­È­ ÆäÀÌÁö´Â ´ÙÀ½ÀÇ ÆÄÀÏ";
if (!single) result+="µé";
@@ -1693,6 +1693,7 @@ class TranslatorKorean : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+=" ÇÁ·ÎÅäÄÝ"; break;
case ClassDef::Category: result+=" Ä«Å×°í¸®"; break;
case ClassDef::Exception: result+=" ¿¹¿Ü"; break;
+ default: break;
}
if (isTemplate) result+=" ÅÛÇø´";
result+=" ÂüÁ¶";
@@ -1763,6 +1764,7 @@ class TranslatorKorean : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+="ÇÁ·ÎÅäÄÝ"; break;
case ClassDef::Category: result+="Ä«Å×°í¸®"; break;
case ClassDef::Exception: result+="¿¹¿Ü"; break;
+ default: break;
}
result+="ÀÇ ¹®¼­È­ ÆäÀÌÁö:";
return result;
@@ -1936,6 +1938,125 @@ class TranslatorKorean : public TranslatorAdapter_1_7_5
{ return "Ãß°¡·Î »ó¼ÓµÈ ¸â¹öµé"; }
//////////////////////////////////////////////////////////////////////////
+// new since 1.8.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a tooltip for the toggle button that appears in the
+ * navigation tree in the HTML output when GENERATE_TREEVIEW is
+ * enabled. This tooltip explains the meaning of the button.
+ */
+ virtual QCString trPanelSynchronisationTooltip(bool enable)
+ {
+ QCString opt = enable ? "È°¼ºÈ­" : "ºñÈ°¼ºÈ­";
+ return "ÆгΠµ¿±âÈ­¸¦ "+opt+"Çϱâ À§ÇØ Å¬¸¯ÇϽʽÿÀ";
+ }
+
+ /*! Used in a method of an Objective-C class that is declared in a
+ * a category. Note that the @1 marker is required and is replaced
+ * by a link.
+ */
+ virtual QCString trProvidedByCategory()
+ {
+ return "Ä«Å×°í¸® @1¿¡ ÀÇÇØ Á¦°øµÊ.";
+ }
+
+ /*! Used in a method of an Objective-C category that extends a class.
+ * Note that the @1 marker is required and is replaced by a link to
+ * the class method.
+ */
+ virtual QCString trExtendsClass()
+ {
+ return "Ŭ·¡½º @1 È®Àå.";
+ }
+
+ /*! Used as the header of a list of class methods in Objective-C.
+ * These are similar to static public member functions in C++.
+ */
+ virtual QCString trClassMethods()
+ {
+ return "Ŭ·¡½º ¸Þ¼Òµåµé";
+ }
+
+ /*! Used as the header of a list of instance methods in Objective-C.
+ * These are similar to public member functions in C++.
+ */
+ virtual QCString trInstanceMethods()
+ {
+ return "ÀνºÅϽº ¸Þ¼Òµåµé";
+ }
+
+ /*! Used as the header of the member functions of an Objective-C class.
+ */
+ virtual QCString trMethodDocumentation()
+ {
+ return "¸Þ¼Òµå ¹®¼­È­";
+ }
+
+ /*! Used as the title of the design overview picture created for the
+ * VHDL output.
+ */
+ virtual QCString trDesignOverview()
+ {
+ return "µðÀÚÀÎ °³¿ä";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+ /** old style UNO IDL services: implemented interfaces */
+ virtual QCString trInterfaces()
+ { return "ÀͽºÆ÷Æ®µÈ ÀÎÅÍÆäÀ̽ºµé"; }
+
+ /** old style UNO IDL services: inherited services */
+ virtual QCString trServices()
+ { return "Æ÷ÇÔµÈ ¼­ºñ½ºµé"; }
+
+ /** UNO IDL constant groups */
+ virtual QCString trConstantGroups()
+ { return "»ó¼ö ±×·ìµé"; }
+
+ /** UNO IDL constant groups */
+ virtual QCString trConstantGroupReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" »ó¼ö ±×·ì ·¹ÆÛ·±½º";
+ return result;
+ }
+ /** UNO IDL service page title */
+ virtual QCString trServiceReference(const char *sName)
+ {
+ QCString result=(QCString)sName;
+ result+=" ¼­ºñ½º ·¹ÆÛ·±½º";
+ return result;
+ }
+ /** UNO IDL singleton page title */
+ virtual QCString trSingletonReference(const char *sName)
+ {
+ QCString result=(QCString)sName;
+ result+=" ½Ì±ÛÅæ ·¹ÆÛ·±½º";
+ return result;
+ }
+ /** UNO IDL service page */
+ virtual QCString trServiceGeneratedFromFiles(bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"ÀÌ ¼­ºñ½º¿¡ ´ëÇÑ ¹®¼­È­´Â ´ÙÀ½ÀÇ ÆÄÀÏ";
+ if (!single) result+="µé";
+ result+="·ÎºÎÅÍ »ý¼ºµÇ¾ú½À´Ï´Ù.:";
+ return result;
+ }
+ /** UNO IDL singleton page */
+ virtual QCString trSingletonGeneratedFromFiles(bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"ÀÌ ½Ì±ÛÅæ¿¡ ´ëÇÑ ¹®¼­È­´Â ´ÙÀ½ÀÇ ÆÄÀÏ";
+ if (!single) result+="µé";
+ result+="·ÎºÎÅÍ »ý¼ºµÇ¾ú½À´Ï´Ù.:";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
};
diff --git a/src/translator_lt.h b/src/translator_lt.h
index 6dd1832..414ea8f 100644
--- a/src/translator_lt.h
+++ b/src/translator_lt.h
@@ -1,8 +1,6 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -613,6 +611,7 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6
case ClassDef::Protocol: result+=" Protokolas"; break;
case ClassDef::Category: result+=" Kategorija"; break;
case ClassDef::Exception: result+=" Iðimtis"; break;
+ default: break;
}
if (isTemplate) result+=" Ðablonas";
return result;
@@ -771,6 +770,7 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6
case ClassDef::Protocol: result+="ðiam protocolui"; break;
case ClassDef::Category: result+="ðiai kategorijai"; break;
case ClassDef::Exception: result+="ðiai iðimèiai"; break;
+ default: break;
}
result+=" sugeneruota ið ";
if (single) result+="ðio failo:"; else result+="ðiø failø:";
@@ -1196,7 +1196,7 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6
*/
virtual QCString trRTFansicp()
{
- return "1252";
+ return "1257";
}
@@ -1205,7 +1205,7 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6
*/
virtual QCString trRTFCharSet()
{
- return "0";
+ return "186";
}
/*! Used as header RTF general index */
diff --git a/src/translator_lv.h b/src/translator_lv.h
new file mode 100644
index 0000000..60b82f8
--- /dev/null
+++ b/src/translator_lv.h
@@ -0,0 +1,2002 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef TRANSLATOR_LV_H
+#define TRANSLATOR_LV_H
+
+/*!
+ When defining a translator class for the new language, follow
+ the description in the documentation. One of the steps says
+ that you should copy the translator_en.h (this) file to your
+ translator_xx.h new file. Your new language should use the
+ Translator class as the base class. This means that you need to
+ implement exactly the same (pure virtual) methods as the
+ TranslatorEnglish does. Because of this, it is a good idea to
+ start with the copy of TranslatorEnglish and replace the strings
+ one by one.
+
+ It is not necessary to include "translator.h" or
+ "translator_adapter.h" here. The files are included in the
+ language.cpp correctly. Not including any of the mentioned
+ files frees the maintainer from thinking about whether the
+ first, the second, or both files should be included or not, and
+ why. This holds namely for localized translators because their
+ base class is changed occasionaly to adapter classes when the
+ Translator class changes the interface, or back to the
+ Translator class (by the local maintainer) when the localized
+ translator is made up-to-date again.
+*/
+
+/* Translation from English to Latvian by Lauris Bukðis-Haberkorns
+ * (lauris@nix.lv)
+ * -------------------------------------------
+ * Project start : 24.Sept.2012
+ * Last Doxygen version covered : 1.8.2
+ */
+
+class TranslatorLatvian : public Translator
+{
+ public:
+
+ // --- Language control methods -------------------
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
+ * of the language in English using lower-case characters only
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * the identification used in language.cpp.
+ */
+ virtual QCString idLanguage()
+ { return "latvian"; }
+
+ /*! Used to get the LaTeX command(s) for the language support.
+ * This method should return string with commands that switch
+ * LaTeX to the desired language. For example
+ * <pre>"\\usepackage[german]{babel}\n"
+ * </pre>
+ * or
+ * <pre>"\\usepackage{polski}\n"
+ * "\\usepackage[latin2]{inputenc}\n"
+ * "\\usepackage[T1]{fontenc}\n"
+ * </pre>
+ */
+ virtual QCString latexLanguageSupportCommand()
+ {
+ return "\\usepackage[LV]{fontenc}\n"
+ "\\usepackage[latvian]{babel}\n";
+ }
+
+ /*! return the language charset. This will be used
+ when transcoding the translatable strings in this file to UTF-8 */
+ virtual QCString idLanguageCharset()
+ {
+ return "iso-8859-13";
+ }
+
+ // --- Language translation methods -------------------
+
+ /*! used in the compound documentation before a list of related functions. */
+ virtual QCString trRelatedFunctions()
+ { return "Saistîtâs funkcijas"; }
+
+ /*! subscript for the related functions. */
+ virtual QCString trRelatedSubscript()
+ { return "(Ðîs nav elementu funkcijas.)"; }
+
+ /*! header that is put before the detailed description of files, classes and namespaces. */
+ virtual QCString trDetailedDescription()
+ { return "Detalizçts apraksts"; }
+
+ /*! header that is put before the list of typedefs. */
+ virtual QCString trMemberTypedefDocumentation()
+ { return "Elementa Typedef dokumentâcija"; }
+
+ /*! header that is put before the list of enumerations. */
+ virtual QCString trMemberEnumerationDocumentation()
+ { return "Elementa uzskaitîjumliterâïa dokumentâcija"; }
+
+ /*! header that is put before the list of member functions. */
+ virtual QCString trMemberFunctionDocumentation()
+ { return "Elementa funkcijas dokumentâcija"; }
+
+ /*! header that is put before the list of member attributes. */
+ virtual QCString trMemberDataDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Lauka dokumentâcija";
+ }
+ else
+ {
+ return "Elementa datu dokumentâcija";
+ }
+ }
+
+ /*! this is the text of a link put after brief descriptions. */
+ virtual QCString trMore()
+ { return "vairâk..."; }
+
+ /*! put in the class documentation */
+ virtual QCString trListOfAllMembers()
+ { return "Visu elementu saraksts"; }
+
+ /*! used as the title of the "list of all members" page of a class */
+ virtual QCString trMemberList()
+ { return "Elementu saraksts"; }
+
+ /*! this is the first part of a sentence that is followed by a class name */
+ virtual QCString trThisIsTheListOfAllMembers()
+ { return "Ðis ir pilns elementu saraksts klasei "; }
+
+ /*! this is the remainder of the sentence after the class name */
+ virtual QCString trIncludingInheritedMembers()
+ { return ", ieskaitot mantotos elementus."; }
+
+ /*! this is put at the author sections at the bottom of man pages.
+ * parameter s is name of the project name.
+ */
+ virtual QCString trGeneratedAutomatically(const char *s)
+ { QCString result="Automâtiski ìenerçts izmantojot Doxygen";
+ if (s) result+=(QCString)" priekð "+s;
+ result+=" no pirmkoda.";
+ return result;
+ }
+
+ /*! put after an enum name in the list of all members */
+ virtual QCString trEnumName()
+ { return "uzskaitîjuma nosaukums"; }
+
+ /*! put after an enum value in the list of all members */
+ virtual QCString trEnumValue()
+ { return "uzskaitîjuma vçrtîba"; }
+
+ /*! put after an undocumented member in the list of all members */
+ virtual QCString trDefinedIn()
+ { return "definçts"; }
+
+ // quick reference sections
+
+ /*! This is put above each page as a link to the list of all groups of
+ * compounds or files (see the \\group command).
+ */
+ virtual QCString trModules()
+ { return "Moduïi"; }
+
+ /*! This is put above each page as a link to the class hierarchy */
+ virtual QCString trClassHierarchy()
+ { return "Klaðu hierarhija"; }
+
+ /*! This is put above each page as a link to the list of annotated classes */
+ virtual QCString trCompoundList()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datu struktûras";
+ }
+ else
+ {
+ return "Klaðu saraksts";
+ }
+ }
+
+ /*! This is put above each page as a link to the list of documented files */
+ virtual QCString trFileList()
+ { return "Failu saraksts"; }
+
+ /*! This is put above each page as a link to all members of compounds. */
+ virtual QCString trCompoundMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datu lauki";
+ }
+ else
+ {
+ return "Klases elementi";
+ }
+ }
+
+ /*! This is put above each page as a link to all members of files. */
+ virtual QCString trFileMembers()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Globâlie";
+ }
+ else
+ {
+ return "Faila elementi";
+ }
+ }
+
+ /*! This is put above each page as a link to all related pages. */
+ virtual QCString trRelatedPages()
+ { return "Saistîtâs lapas"; }
+
+ /*! This is put above each page as a link to all examples. */
+ virtual QCString trExamples()
+ { return "Piemçri"; }
+
+ /*! This is put above each page as a link to the search engine. */
+ virtual QCString trSearch()
+ { return "Meklçt"; }
+
+ /*! This is an introduction to the class hierarchy. */
+ virtual QCString trClassHierarchyDescription()
+ { return "Ðis mantojamîbas saraksts ir sakârtots aptuveni, "
+ "bet ne pilnîbâ, alfabçta secîbâ:";
+ }
+
+ /*! This is an introduction to the list with all files. */
+ virtual QCString trFileListDescription(bool extractAll)
+ {
+ QCString result="Ðeit ir visu ";
+ if (!extractAll) result+="dokumentçto ";
+ result+="failu saraksts ar îsu aprakstu:";
+ return result;
+ }
+
+ /*! This is an introduction to the annotated compound list. */
+ virtual QCString trCompoundListDescription()
+ {
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Ðeit ir visas datu struktûras ar îsu aprakstu:";
+ }
+ else
+ {
+ return "Ðeit ir visas klases, struktûras, "
+ "apvienojumi un interfeisi ar îsu aprakstu:";
+ }
+ }
+
+ /*! This is an introduction to the page with all class members. */
+ virtual QCString trCompoundMembersDescription(bool extractAll)
+ {
+ QCString result="Ðeit ir visu ";
+ if (!extractAll)
+ {
+ result+="dokumentçto ";
+ }
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struktûru un apvienojumu lauku";
+ }
+ else
+ {
+ result+="klases elementu";
+ }
+ result+=" saraksts ar saitçm uz ";
+ if (!extractAll)
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struktûru/apvienojumu dokumentâciju katram laukam:";
+ }
+ else
+ {
+ result+="klases dokumentâciju katram elementam:";
+ }
+ }
+ else
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="struktûrâm/apvienojumiem, kam tie pieder:";
+ }
+ else
+ {
+ result+="klasçm, kam tie pieder:";
+ }
+ }
+ return result;
+ }
+
+ /*! This is an introduction to the page with all file members. */
+ virtual QCString trFileMembersDescription(bool extractAll)
+ {
+ QCString result="Ðeit ir visu ";
+ if (!extractAll) result+="dokumentçto ";
+
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ result+="funkciju, mainîgo, definîciju, uzskaitîjumliterâïu un typedefs";
+ }
+ else
+ {
+ result+="faila elementu";
+ }
+ result+=" saraksts ar saitçm uz ";
+ if (extractAll)
+ result+="failiem, kam tie pieder:";
+ else
+ result+="dokumentâciju:";
+ return result;
+ }
+
+ /*! This is an introduction to the page with the list of all examples */
+ virtual QCString trExamplesDescription()
+ { return "Ðeit ir visu piemçru saraksts:"; }
+
+ /*! This is an introduction to the page with the list of related pages */
+ virtual QCString trRelatedPagesDescription()
+ { return "Here is a list of all related documentation pages:"; }
+
+ /*! This is an introduction to the page with the list of class/file groups */
+ virtual QCString trModulesDescription()
+ { return "Ðeit ir visu moduïu saraksts:"; }
+
+ // index titles (the project name is prepended for these)
+
+ /*! This is used in HTML as the title of index.html. */
+ virtual QCString trDocumentation()
+ { return "Dokumentâcija"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all groups.
+ */
+ virtual QCString trModuleIndex()
+ { return "Moduïu indekss"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * class hierarchy.
+ */
+ virtual QCString trHierarchicalIndex()
+ { return "Hierarhijas indekss"; }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index.
+ */
+ virtual QCString trCompoundIndex()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datu struktûru indess";
+ }
+ else
+ {
+ return "Klaðu indekss";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * list of all files.
+ */
+ virtual QCString trFileIndex()
+ { return "Failu indekss"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all groups.
+ */
+ virtual QCString trModuleDocumentation()
+ { return "Moduïa dokumentâcija"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all classes, structs and unions.
+ */
+ virtual QCString trClassDocumentation()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datu struktûras dokomentâcija";
+ }
+ else
+ {
+ return "Klases dokumentâcija";
+ }
+ }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all files.
+ */
+ virtual QCString trFileDocumentation()
+ { return "Faila dokumentâcija"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all examples.
+ */
+ virtual QCString trExampleDocumentation()
+ { return "Piemçri"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all related pages.
+ */
+ virtual QCString trPageDocumentation()
+ { return "Lapas dokumentâcija"; }
+
+ /*! This is used in LaTeX as the title of the document */
+ virtual QCString trReferenceManual()
+ { return "Rokasgrâmata"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of defines
+ */
+ virtual QCString trDefines()
+ { return "Makro"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of function prototypes
+ */
+ virtual QCString trFuncProtos()
+ { return "Funkciju prototipi"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of typedefs
+ */
+ virtual QCString trTypedefs()
+ { return "Typedefs"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of enumerations
+ */
+ virtual QCString trEnumerations()
+ { return "Uzskaitîjumi"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) functions
+ */
+ virtual QCString trFunctions()
+ { return "Funkcijas"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trVariables()
+ { return "Mainîgie"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) variables
+ */
+ virtual QCString trEnumerationValues()
+ { return "Uzskaitîjumliterâïi"; }
+
+ /*! This is used in the documentation of a file before the list of
+ * documentation blocks for defines
+ */
+ virtual QCString trDefineDocumentation()
+ { return "Makro definîcijas dokumentâcija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for function prototypes
+ */
+ virtual QCString trFunctionPrototypeDocumentation()
+ { return "Funkcijas prototipu dokumentâcija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for typedefs
+ */
+ virtual QCString trTypedefDocumentation()
+ { return "Typedef dokumentâcija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration types
+ */
+ virtual QCString trEnumerationTypeDocumentation()
+ { return "Uzskaitîjumliterâïa tipa dokumentâcija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for functions
+ */
+ virtual QCString trFunctionDocumentation()
+ { return "Funkcijas dokumentâcija"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for variables
+ */
+ virtual QCString trVariableDocumentation()
+ { return "Mainîgo dokumentâcija"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds
+ */
+ virtual QCString trCompounds()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datu struktûras";
+ }
+ else
+ {
+ return "Klases";
+ }
+ }
+
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
+ */
+ virtual QCString trGeneratedAt(const char *date,const char *projName)
+ {
+ QCString result=(QCString)"Ìenerçts "+date;
+ if (projName) result+=(QCString)" projektam "+projName;
+ result+=(QCString)" ar";
+ return result;
+ }
+ /*! This is part of the sentence used in the standard footer of each page.
+ */
+ virtual QCString trWrittenBy()
+ {
+ return "uzrakstîjis";
+ }
+
+ /*! this text is put before a class diagram */
+ virtual QCString trClassDiagram(const char *clName)
+ {
+ return (QCString)"Mantojamîbas diagramma klasei "+clName+":";
+ }
+
+ /*! this text is generated when the \\internal command is used. */
+ virtual QCString trForInternalUseOnly()
+ { return "Tikai iekðçjai lietoðanai."; }
+
+ /*! this text is generated when the \\warning command is used. */
+ virtual QCString trWarning()
+ { return "Brîdinâjums"; }
+
+ /*! this text is generated when the \\version command is used. */
+ virtual QCString trVersion()
+ { return "Versija"; }
+
+ /*! this text is generated when the \\date command is used. */
+ virtual QCString trDate()
+ { return "Datums"; }
+
+ /*! this text is generated when the \\return command is used. */
+ virtual QCString trReturns()
+ { return "Atgrieþ"; }
+
+ /*! this text is generated when the \\sa command is used. */
+ virtual QCString trSeeAlso()
+ { return "Skatîties arî"; }
+
+ /*! this text is generated when the \\param command is used. */
+ virtual QCString trParameters()
+ { return "Parametri"; }
+
+ /*! this text is generated when the \\exception command is used. */
+ virtual QCString trExceptions()
+ { return "Izòçmumi"; }
+
+ /*! this text is used in the title page of a LaTeX document. */
+ virtual QCString trGeneratedBy()
+ { return "Ìenerçts ar"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of page containing all the index of all namespaces. */
+ virtual QCString trNamespaceList()
+ { return "Nosaukumvietu saraksts"; }
+
+ /*! used as an introduction to the namespace list */
+ virtual QCString trNamespaceListDescription(bool extractAll)
+ {
+ QCString result="Ðeit ir visas ";
+ if (!extractAll) result+="dokumentçtâs ";
+ result+="nosaukumvietas ar îsu aprakstu:";
+ return result;
+ }
+
+ /*! used in the class documentation as a header before the list of all
+ * friends of a class
+ */
+ virtual QCString trFriends()
+ { return "Draugi"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in the class documentation as a header before the list of all
+ * related classes
+ */
+ virtual QCString trRelatedFunctionDocumentation()
+ { return "Draugu un saistîto funkciju dokumentâcija"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used as the title of the HTML page of a class/struct/union */
+ virtual QCString trCompoundReference(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" klases"; break;
+ case ClassDef::Struct: result+=" struktûras"; break;
+ case ClassDef::Union: result+=" apvienojuma"; break;
+ case ClassDef::Interface: result+=" interfeisa"; break;
+ case ClassDef::Protocol: result+=" protokola"; break;
+ case ClassDef::Category: result+=" kategorijas"; break;
+ case ClassDef::Exception: result+=" izòçmuma"; break;
+ }
+ if (isTemplate) result+=" veidnes";
+ result+=" apraksts";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a file */
+ virtual QCString trFileReference(const char *fileName)
+ {
+ QCString result=fileName;
+ result+=" faila apraksts";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a namespace */
+ virtual QCString trNamespaceReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" nosaukumvietas apraksts";
+ return result;
+ }
+
+ virtual QCString trPublicMembers()
+ { return "Publiskâs elementa funkcijas"; }
+ virtual QCString trPublicSlots()
+ { return "Publiskâs spraugas"; }
+ virtual QCString trSignals()
+ { return "Signâli"; }
+ virtual QCString trStaticPublicMembers()
+ { return "Statiskâs publiskâs elementa funkcijas"; }
+ virtual QCString trProtectedMembers()
+ { return "Aizsargâtâs elementa funkcijas"; }
+ virtual QCString trProtectedSlots()
+ { return "Aizsargâtâs spraugas"; }
+ virtual QCString trStaticProtectedMembers()
+ { return "Statiskâs aizsargâtâs elementa funkcijas"; }
+ virtual QCString trPrivateMembers()
+ { return "Privâtâs elementa funkcijas"; }
+ virtual QCString trPrivateSlots()
+ { return "Privâtâs spraugas"; }
+ virtual QCString trStaticPrivateMembers()
+ { return "Statiskâs privâtâs elementa funkcijas"; }
+
+ /*! this function is used to produce a comma-separated list of items.
+ * use generateMarker(i) to indicate where item i should be put.
+ */
+ virtual QCString trWriteList(int numEntries)
+ {
+ QCString result;
+ int i;
+ // the inherits list contain `numEntries' classes
+ for (i=0;i<numEntries;i++)
+ {
+ // use generateMarker to generate placeholders for the class links!
+ result+=generateMarker(i); // generate marker for entry i in the list
+ // (order is left to right)
+
+ if (i!=numEntries-1) // not the last entry, so we need a separator
+ {
+ if (i<numEntries-2) // not the fore last entry
+ result+=", ";
+ else // the fore last entry
+ result+=", un ";
+ }
+ }
+ return result;
+ }
+
+ /*! used in class documentation to produce a list of base classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritsList(int numEntries)
+ {
+ return "Manto no "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in class documentation to produce a list of super classes,
+ * if class diagrams are disabled.
+ */
+ virtual QCString trInheritedByList(int numEntries)
+ {
+ return "Tiek mantots "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are hidden by this one.
+ */
+ virtual QCString trReimplementedFromList(int numEntries)
+ {
+ return "Pârimplementçts no "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all member that overwrite the implementation of this member.
+ */
+ virtual QCString trReimplementedInList(int numEntries)
+ {
+ return "Pârimplementçts "+trWriteList(numEntries)+".";
+ }
+
+ /*! This is put above each page as a link to all members of namespaces. */
+ virtual QCString trNamespaceMembers()
+ { return "Nosaukumvietas elementi"; }
+
+ /*! This is an introduction to the page with all namespace members */
+ virtual QCString trNamespaceMemberDescription(bool extractAll)
+ {
+ QCString result="Ðeit ir visi ";
+ if (!extractAll) result+="dokumentçtie ";
+ result+="nosaukumvietas elementi ar saitçm uz ";
+ if (extractAll)
+ result+="nosaukumvieta dokumentâciju katram elementam:";
+ else
+ result+="nosaukumvietu, kam tie pieder:";
+ return result;
+ }
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all namespaces.
+ */
+ virtual QCString trNamespaceIndex()
+ { return "Nosaukumvietu indekss"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all namespaces.
+ */
+ virtual QCString trNamespaceDocumentation()
+ { return "Nosaukumvietas dokumentâcija"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in the documentation before the list of all
+ * namespaces in a file.
+ */
+ virtual QCString trNamespaces()
+ { return "Nosaukumvietas"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is put at the bottom of a class documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+ bool single)
+ { // single is true implies a single file
+ QCString result=(QCString)"Ðî";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="s klases"; break;
+ case ClassDef::Struct: result+="s struktûras"; break;
+ case ClassDef::Union: result+=" apvienojuma"; break;
+ case ClassDef::Interface: result+=" interfeisa"; break;
+ case ClassDef::Protocol: result+=" protokola"; break;
+ case ClassDef::Category: result+="s kategorijas"; break;
+ case ClassDef::Exception: result+=" izòçmuma"; break;
+ }
+ result+=" dokumentâcijas tika ìenerçta no ðâda fail";
+ if (single) result+="a:"; else result+="iem:";
+ return result;
+ }
+
+ /*! This is in the (quick) index as a link to the alphabetical compound
+ * list.
+ */
+ virtual QCString trAlphabeticalList()
+ { return "Alfabçtiskais saraksts"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the heading text for the retval command. */
+ virtual QCString trReturnValues()
+ { return "Atgrieþamâs vçrtîbas"; }
+
+ /*! This is in the (quick) index as a link to the main page (index.html)
+ */
+ virtual QCString trMainPage()
+ { return "Sâkumlapa"; }
+
+ /*! This is used in references to page that are put in the LaTeX
+ * documentation. It should be an abbreviation of the word page.
+ */
+ virtual QCString trPageAbbreviation()
+ { return "lpp."; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991003
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDefinedAtLineInSourceFile()
+ {
+ return "Definçts lînijâ @0 failâ @1.";
+ }
+ virtual QCString trDefinedInSourceFile()
+ {
+ return "Definçts failâ @0.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trDeprecated()
+ {
+ return "Novecojusi";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! this text is put before a collaboration diagram */
+ virtual QCString trCollaborationDiagram(const char *clName)
+ {
+ return (QCString)"Sadarbîbas diagramma klasei "+clName+":";
+ }
+ /*! this text is put before an include dependency graph */
+ virtual QCString trInclDepGraph(const char *fName)
+ {
+ return (QCString)"Include dependency graph for "+fName+":";
+ }
+ /*! header that is put before the list of constructor/destructors. */
+ virtual QCString trConstructorDocumentation()
+ {
+ return "Konstruktora un destruktora dokumentâcija";
+ }
+ /*! Used in the file documentation to point to the corresponding sources. */
+ virtual QCString trGotoSourceCode()
+ {
+ return "Iet uz ðî faila pirmkodu.";
+ }
+ /*! Used in the file sources to point to the corresponding documentation. */
+ virtual QCString trGotoDocumentation()
+ {
+ return "Ietu uz ðî faila dokumentâciju.";
+ }
+ /*! Text for the \\pre command */
+ virtual QCString trPrecondition()
+ {
+ return "Pirmsnosacîjums";
+ }
+ /*! Text for the \\post command */
+ virtual QCString trPostcondition()
+ {
+ return "Pçcnosacîjums";
+ }
+ /*! Text for the \\invariant command */
+ virtual QCString trInvariant()
+ {
+ return "Invariants";
+ }
+ /*! Text shown before a multi-line variable/enum initialization */
+ virtual QCString trInitialValue()
+ {
+ return "Sâkotnçjâ vçrtîba:";
+ }
+ /*! Text used the source code in the file index */
+ virtual QCString trCode()
+ {
+ return "pirmkods";
+ }
+ virtual QCString trGraphicalHierarchy()
+ {
+ return "Grafiska klases hierarhija";
+ }
+ virtual QCString trGotoGraphicalHierarchy()
+ {
+ return "Iet uz grafisku klases hierarhiju";
+ }
+ virtual QCString trGotoTextualHierarchy()
+ {
+ return "Iet uz tekstuâlu klases hierarhiju";
+ }
+ virtual QCString trPageIndex()
+ {
+ return "Lapas indekss";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trNote()
+ {
+ return "Piezîme";
+ }
+ virtual QCString trPublicTypes()
+ {
+ return "Publiskie tipi";
+ }
+ virtual QCString trPublicAttribs()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datu lauki";
+ }
+ else
+ {
+ return "Publiskie atribûti";
+ }
+ }
+ virtual QCString trStaticPublicAttribs()
+ {
+ return "Statiskie publiskie atribûti";
+ }
+ virtual QCString trProtectedTypes()
+ {
+ return "Aizsargâtie tipi";
+ }
+ virtual QCString trProtectedAttribs()
+ {
+ return "Aizsargâtie atribûti";
+ }
+ virtual QCString trStaticProtectedAttribs()
+ {
+ return "Statiskie aizsargâtie atribûti";
+ }
+ virtual QCString trPrivateTypes()
+ {
+ return "Privâtie tipi";
+ }
+ virtual QCString trPrivateAttribs()
+ {
+ return "Privâtie atribûti";
+ }
+ virtual QCString trStaticPrivateAttribs()
+ {
+ return "Statiskie privâtie atribûti";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\todo item */
+ virtual QCString trTodo()
+ {
+ return "Jâizdara";
+ }
+ /*! Used as the header of the todo list */
+ virtual QCString trTodoList()
+ {
+ return "Darâmo darbu saraksts";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+ virtual QCString trReferencedBy()
+ {
+ return "Atsauces no";
+ }
+ virtual QCString trRemarks()
+ {
+ return "Piebildes";
+ }
+ virtual QCString trAttention()
+ {
+ return "Uzmanîbu";
+ }
+ virtual QCString trInclByDepGraph()
+ {
+ return "Ðis grafs râda kuri faili tieði vai "
+ "netieði iekïauj ðo failu:";
+ }
+ virtual QCString trSince()
+ {
+ return "Kopð";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! title of the graph legend page */
+ virtual QCString trLegendTitle()
+ {
+ return "Grafika leìenda";
+ }
+ /*! page explaining how the dot graph's should be interpreted
+ * The %A in the text below are to prevent link to classes called "A".
+ */
+ virtual QCString trLegendDocs()
+ {
+ return
+ "This page explains how to interpret the graphs that are generated "
+ "by doxygen.<p>\n"
+ "Consider the following example:\n"
+ "\\code\n"
+ "/*! Invisible class because of truncation */\n"
+ "class Invisible { };\n\n"
+ "/*! Truncated class, inheritance relation is hidden */\n"
+ "class Truncated : public Invisible { };\n\n"
+ "/* Class not documented with doxygen comments */\n"
+ "class Undocumented { };\n\n"
+ "/*! Class that is inherited using public inheritance */\n"
+ "class PublicBase : public Truncated { };\n\n"
+ "/*! A template class */\n"
+ "template<class T> class Templ { };\n\n"
+ "/*! Class that is inherited using protected inheritance */\n"
+ "class ProtectedBase { };\n\n"
+ "/*! Class that is inherited using private inheritance */\n"
+ "class PrivateBase { };\n\n"
+ "/*! Class that is used by the Inherited class */\n"
+ "class Used { };\n\n"
+ "/*! Super class that inherits a number of other classes */\n"
+ "class Inherited : public PublicBase,\n"
+ " protected ProtectedBase,\n"
+ " private PrivateBase,\n"
+ " public Undocumented,\n"
+ " public Templ<int>\n"
+ "{\n"
+ " private:\n"
+ " Used *m_usedClass;\n"
+ "};\n"
+ "\\endcode\n"
+ "This will result in the following graph:"
+ "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center></p>\n"
+ "<p>\n"
+ "The boxes in the above graph have the following meaning:\n"
+ "</p>\n"
+ "<ul>\n"
+ "<li>%A filled gray box represents the struct or class for which the "
+ "graph is generated.</li>\n"
+ "<li>%A box with a black border denotes a documented struct or class.</li>\n"
+ "<li>%A box with a grey border denotes an undocumented struct or class.</li>\n"
+ "<li>%A box with a red border denotes a documented struct or class for"
+ "which not all inheritance/containment relations are shown. %A graph is "
+ "truncated if it does not fit within the specified boundaries.</li>\n"
+ "</ul>\n"
+ "<p>\n"
+ "The arrows have the following meaning:\n"
+ "</p>\n"
+ "<ul>\n"
+ "<li>%A dark blue arrow is used to visualize a public inheritance "
+ "relation between two classes.</li>\n"
+ "<li>%A dark green arrow is used for protected inheritance.</li>\n"
+ "<li>%A dark red arrow is used for private inheritance.</li>\n"
+ "<li>%A purple dashed arrow is used if a class is contained or used "
+ "by another class. The arrow is labeled with the variable(s) "
+ "through which the pointed class or struct is accessible.</li>\n"
+ "<li>%A yellow dashed arrow denotes a relation between a template instance and "
+ "the template class it was instantiated from. The arrow is labeled with "
+ "the template parameters of the instance.</li>\n"
+ "</ul>\n";
+ }
+ /*! text for the link to the legend page */
+ virtual QCString trLegend()
+ {
+ return "leìenda";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a test item */
+ virtual QCString trTest()
+ {
+ return "Testi";
+ }
+ /*! Used as the header of the test list */
+ virtual QCString trTestList()
+ {
+ return "Testu saraksts";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for KDE-2 IDL methods */
+ virtual QCString trDCOPMethods()
+ {
+ return "DCOP elementu funkcijas";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a section header for IDL properties */
+ virtual QCString trProperties()
+ {
+ return "Rekvizîti";
+ }
+ /*! Used as a section header for IDL property documentation */
+ virtual QCString trPropertyDocumentation()
+ {
+ return "Rekvizîtu dokumentâcija";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used for Java classes in the summary section of Java packages */
+ virtual QCString trClasses()
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+ {
+ return "Datu struktûras";
+ }
+ else
+ {
+ return "Klases";
+ }
+ }
+ /*! Used as the title of a Java package */
+ virtual QCString trPackage(const char *name)
+ {
+ return (QCString)"Pakotne "+name;
+ }
+ /*! Title of the package index page */
+ virtual QCString trPackageList()
+ {
+ return "Pakotòu saraksts";
+ }
+ /*! The description of the package index page */
+ virtual QCString trPackageListDescription()
+ {
+ return "Here are the packages with brief descriptions (if available):";
+ }
+ /*! The link name in the Quick links header for each page */
+ virtual QCString trPackages()
+ {
+ return "Pakotnes";
+ }
+ /*! Text shown before a multi-line define */
+ virtual QCString trDefineValue()
+ {
+ return "Vçrtîba:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a marker that is put before a \\bug item */
+ virtual QCString trBug()
+ {
+ return "Kïûda";
+ }
+ /*! Used as the header of the bug list */
+ virtual QCString trBugList()
+ {
+ return "Kïûdu saraksts";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
+ * <pre>
+ * Codepage number:
+ * Charset Name Charset Value(hex) Codepage number
+ * ------------------------------------------------------
+ * DEFAULT_CHARSET 1 (x01)
+ * SYMBOL_CHARSET 2 (x02)
+ * OEM_CHARSET 255 (xFF)
+ * ANSI_CHARSET 0 (x00) 1252
+ * RUSSIAN_CHARSET 204 (xCC) 1251
+ * EE_CHARSET 238 (xEE) 1250
+ * GREEK_CHARSET 161 (xA1) 1253
+ * TURKISH_CHARSET 162 (xA2) 1254
+ * BALTIC_CHARSET 186 (xBA) 1257
+ * HEBREW_CHARSET 177 (xB1) 1255
+ * ARABIC _CHARSET 178 (xB2) 1256
+ * SHIFTJIS_CHARSET 128 (x80) 932
+ * HANGEUL_CHARSET 129 (x81) 949
+ * GB2313_CHARSET 134 (x86) 936
+ * CHINESEBIG5_CHARSET 136 (x88) 950
+ * </pre>
+ *
+ */
+ virtual QCString trRTFansicp()
+ {
+ return "1257";
+ }
+
+
+ /*! Used as ansicpg for RTF fcharset
+ * \see trRTFansicp() for a table of possible values.
+ */
+ virtual QCString trRTFCharSet()
+ {
+ return "186";
+ }
+
+ /*! Used as header RTF general index */
+ virtual QCString trRTFGeneralIndex()
+ {
+ return "Indekss";
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trClass(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Klase" : "klase"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trFile(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Fail" : "fail"));
+ if (singular) result+="s"; else result+="i";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trNamespace(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Nosaukumvieta" : "nosaukumvieta"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGroup(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Grupa" : "grupa"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trPage(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Lapa" : "lapa"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trMember(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Element" : "element"));
+ if (singular) result+="s"; else result+="i";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trGlobal(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Globâl" : "globâl"));
+ if (singular) result+="ais"; else result+="ie";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is generated when the \\author command is used and
+ * for the author section in man pages. */
+ virtual QCString trAuthor(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Autor" : "autor"));
+ if (singular) result+="s"; else result+="i";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is put before the list of members referenced by a member
+ */
+ virtual QCString trReferences()
+ {
+ return "Atsauces";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in member documentation blocks to produce a list of
+ * members that are implemented by this one.
+ */
+ virtual QCString trImplementedFromList(int numEntries)
+ {
+ return "Îsteno "+trWriteList(numEntries)+".";
+ }
+
+ /*! used in member documentation blocks to produce a list of
+ * all members that implement this abstract member.
+ */
+ virtual QCString trImplementedInList(int numEntries)
+ {
+ return "Îstenots "+trWriteList(numEntries)+".";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+ /*! used in RTF documentation as a heading for the Table
+ * of Contents.
+ */
+ virtual QCString trRTFTableOfContents()
+ {
+ return "Satura râdîtâjs";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
+ */
+ virtual QCString trDeprecatedList()
+ {
+ return "Novecojuðo saraksts";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a header for declaration section of the events found in
+ * a C# program
+ */
+ virtual QCString trEvents()
+ {
+ return "Notikumi";
+ }
+ /*! Header used for the documentation section of a class' events. */
+ virtual QCString trEventDocumentation()
+ {
+ return "Notikumu dokumentâcija";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a heading for a list of Java class types with package scope.
+ */
+ virtual QCString trPackageTypes()
+ {
+ return "Pakas tipi";
+ }
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
+ */
+ virtual QCString trPackageMembers()
+ {
+ return "Pakas funkcijas";
+ }
+ /*! Used as a heading for a list of static Java class functions with
+ * package scope.
+ */
+ virtual QCString trStaticPackageMembers()
+ {
+ return "Statiskâs pakas funkcijas";
+ }
+ /*! Used as a heading for a list of Java class variables with package
+ * scope.
+ */
+ virtual QCString trPackageAttribs()
+ {
+ return "Pakas atribûti";
+ }
+ /*! Used as a heading for a list of static Java class variables with
+ * package scope.
+ */
+ virtual QCString trStaticPackageAttribs()
+ {
+ return "Statiskie pakas atribûti";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used in the quick index of a class/file/namespace member list page
+ * to link to the unfiltered list of all members.
+ */
+ virtual QCString trAll()
+ {
+ return "Visi";
+ }
+ /*! Put in front of the call graph for a function. */
+ virtual QCString trCallGraph()
+ {
+ return "Ðeit ir visu funkciju izsaugumu grafs:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
+ */
+ virtual QCString trSearchForIndex()
+ {
+ return "Meklçt";
+ }
+ /*! This string is used as the title for the page listing the search
+ * results.
+ */
+ virtual QCString trSearchResultsTitle()
+ {
+ return "Meklçðanas rezultâti";
+ }
+ /*! This string is put just before listing the search results. The
+ * text can be different depending on the number of documents found.
+ * Inside the text you can put the special marker $num to insert
+ * the number representing the actual number of search results.
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * value 2 represents 2 or more matches. HTML markup is allowed inside
+ * the returned string.
+ */
+ virtual QCString trSearchResults(int numDocuments)
+ {
+ if (numDocuments==0)
+ {
+ return "Netika atrasts neviens dokuments.";
+ }
+ else if (numDocuments==1)
+ {
+ return "Atrasts <b>1</b> dokuments.";
+ }
+ else
+ {
+ return "Atrasti <b>$num</b> Dokumenti. "
+ "Sâkumâ attçlo tos, kas atbilst visprecîzâk.";
+ }
+ }
+ /*! This string is put before the list of matched words, for each search
+ * result. What follows is the list of words that matched the query.
+ */
+ virtual QCString trSearchMatches()
+ {
+ return "Atbilst meklçtajam:";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used in HTML as the title of page with source code for file filename
+ */
+ virtual QCString trSourceFile(QCString& filename)
+ {
+ return filename + " pirmkoda fails";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.9
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used as the name of the chapter containing the directory
+ * hierarchy.
+ */
+ virtual QCString trDirIndex()
+ { return "Direktoriju struktûra"; }
+
+ /*! This is used as the name of the chapter containing the documentation
+ * of the directories.
+ */
+ virtual QCString trDirDocumentation()
+ { return "Direktorijas dokumentâcija"; }
+
+ /*! This is used as the title of the directory index and also in the
+ * Quick links of an HTML page, to link to the directory hierarchy.
+ */
+ virtual QCString trDirectories()
+ { return "Direktorijas"; }
+
+ /*! This returns a sentences that introduces the directory hierarchy.
+ * and the fact that it is sorted alphabetically per level
+ */
+ virtual QCString trDirDescription()
+ { return "Ðî direktoriju hierarhija ir aptuveni, "
+ "bet ne pilnîbâ, alfabçta secîbâ:";
+ }
+
+ /*! This returns the title of a directory page. The name of the
+ * directory is passed via \a dirName.
+ */
+ virtual QCString trDirReference(const char *dirName)
+ { QCString result="Direktorijas "; result+=dirName; result+=" atsauce"; return result; }
+
+ /*! This returns the word directory with or without starting capital
+ * (\a first_capital) and in sigular or plural form (\a singular).
+ */
+ virtual QCString trDir(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Direktorija" : "direktorija"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Ðî ir elementa pârslogota funkcija, kas "
+ "parâdîta tikai informâtîvo nolûkos. Tâ atðíiras no iepriekðapraksîtâs "
+ "funkcijas tikai ar parametriem, ko tâ saòem.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Ðeit ir ðîs funkcijas izsaukuma grafs:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Uzskaitîjumliterâïa dokumentâcija"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Elementa funckijas/apakðrutînas dokumentâcija"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "Datu tipu saraksts"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "Datu lauki"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Ðeit ir visu datu tipu saraksts ar îsu aprakstu:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="Ðeit ir visu ";
+ if (!extractAll)
+ {
+ result+="dokumentçto ";
+ }
+ result+="datu tipu saraksts";
+ result+=" ar saitçm uz ";
+ if (!extractAll)
+ {
+ result+="datu struktûras dokumentâciju katram elementam:";
+ }
+ else
+ {
+ result+="datu tipiem, kam tie pieder:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "Datu tipu indekss"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Datu tipa dokumentâcija"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Funkcijas/Apakðrutînas"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Funkcijas/Apakðrutînas dokumentâcija"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Datu tipi"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "Moduïu saraksts"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="Ðeit ir visu ";
+ if (!extractAll) result+="dokumentçto ";
+ result+="moduïu saraksts ar îsu aprakstu:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" moduïa"; break;
+ case ClassDef::Struct: result+=" tipa"; break;
+ case ClassDef::Union: result+=" apvienojuma"; break;
+ case ClassDef::Interface: result+=" interfeisa"; break;
+ case ClassDef::Protocol: result+=" protokola"; break;
+ case ClassDef::Category: result+=" kategorijas"; break;
+ case ClassDef::Exception: result+=" izòçmuma"; break;
+ }
+ if (isTemplate) result+=" sagataves";
+ result+=" atsauce";
+ return result;
+ }
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" moduïu atsauce";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Moduïa elementi"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="Ðeit ir visu ";
+ if (!extractAll) result+="dokumentçto ";
+ result+="moduïa elementu saraksts ar saitçm uz ";
+ if (extractAll)
+ {
+ result+="moduïa dokumentâciju katram elementam:";
+ }
+ else
+ {
+ result+="moduïiem, kuriem tie pieder:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Moduïu indekss"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Modu" : "modu"));
+ if (singular) result+="lis"; else result+="ïi";
+ return result;
+ }
+
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"Dokumentâcija ð";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="im modulim"; break;
+ case ClassDef::Struct: result+="im tipam"; break;
+ case ClassDef::Union: result+="im apvienojumam"; break;
+ case ClassDef::Interface: result+="im interfeisam"; break;
+ case ClassDef::Protocol: result+="im protokolam"; break;
+ case ClassDef::Category: result+="ai kategorijai"; break;
+ case ClassDef::Exception: result+="im izòçmumam"; break;
+ }
+ result+=" tika ìenerçta no fail";
+ if (single) result+="a:"; else result+="iem:";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Tip" : "tip"));
+ if (singular) result+="s"; else result+="i";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Apakðprogramma" : "apakðprogramma"));
+ if (!singular) result+="s";
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "Tipa ierobeþojumi";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString(name)+" relâcija";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Tiek veikta ielâde...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Global Namespace";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Meklç...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Nav atbilstîbu";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Direktoriju atkarîbu grafs priekð "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"File in "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Includes file in "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Pirm","Otr","Tr","Cet","Piekt","Sest","Sv" };
+ static const char *months[] = { "Jan","Feb","Mar","Apr","Mai","Jûn","Jûl","Aug","Sept","Okt","Nov","Dec" };
+ QCString sdate;
+ sdate.sprintf("%s %s %d %d",days[dayOfWeek-1],months[month-1],day,year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.7.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Header for the page with bibliographic citations */
+ virtual QCString trCiteReferences()
+ { return "Bibliogrâfiskâs atsauces"; }
+
+ /*! Text for copyright paragraph */
+ virtual QCString trCopyright()
+ { return "Autortiesîbas"; }
+
+ /*! Header for the graph showing the directory dependencies */
+ virtual QCString trDirDepGraph(const char *name)
+ { return QCString("Atkarîbu grafs direktorijai ")+name+":"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Detail level selector shown for hierarchical indices */
+ virtual QCString trDetailLevel()
+ { return "detalizâcijas lîmenis"; }
+
+ /*! Section header for list of template parameters */
+ virtual QCString trTemplateParameters()
+ { return "Sagataves parametri"; }
+
+ /*! Used in dot graph when UML_LOOK is enabled and there are many fields */
+ virtual QCString trAndMore(const QCString &number)
+ { return "un vçl "+number+"..."; }
+
+ /*! Used file list for a Java enum */
+ virtual QCString trEnumGeneratedFromFiles(bool single)
+ { QCString result = "Dokumentâcija ðim uzskaitîjumliterâlim tika ìenerçta no sekojoð";
+ if (single) result+="a"; else result += "iem";
+ result+=" fail";
+ if (single) result+="a"; else result += "iem";
+ result+=":";
+ return result;
+ }
+
+ /*! Header of a Java enum page (Java enums are represented as classes). */
+ virtual QCString trEnumReference(const char *name)
+ { return QCString(name)+" uzskaitîjumliterâïa atsauce"; }
+
+ /*! Used for a section containing inherited members */
+ virtual QCString trInheritedFrom(const char *members,const char *what)
+ { return QCString(members)+" manto no "+what; }
+
+ /*! Header of the sections with inherited members specific for the
+ * base class(es)
+ */
+ virtual QCString trAdditionalInheritedMembers()
+ { return "Papildus mantotie elementi"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a tooltip for the toggle button that appears in the
+ * navigation tree in the HTML output when GENERATE_TREEVIEW is
+ * enabled. This tooltip explains the meaning of the button.
+ */
+ virtual QCString trPanelSynchronisationTooltip(bool enable)
+ {
+ QCString opt = enable ? "iespçjotu" : "atspçjotu";
+ return "uzklikðíinât, lai "+opt+" paneïu sinhronizâciju";
+ }
+
+ /*! Used in a method of an Objective-C class that is declared in a
+ * a category. Note that the @1 marker is required and is replaced
+ * by a link.
+ */
+ virtual QCString trProvidedByCategory()
+ {
+ return "Nodroðina kategorija @1.";
+ }
+
+ /*! Used in a method of an Objective-C category that extends a class.
+ * Note that the @1 marker is required and is replaced by a link to
+ * the class method.
+ */
+ virtual QCString trExtendsClass()
+ {
+ return "Paplaðina klasi @1.";
+ }
+
+ /*! Used as the header of a list of class methods in Objective-C.
+ * These are similar to static public member functions in C++.
+ */
+ virtual QCString trClassMethods()
+ {
+ return "Klases metodes";
+ }
+
+ /*! Used as the header of a list of instance methods in Objective-C.
+ * These are similar to public member functions in C++.
+ */
+ virtual QCString trInstanceMethods()
+ {
+ return "Instances metodes";
+ }
+
+ /*! Used as the header of the member functions of an Objective-C class.
+ */
+ virtual QCString trMethodDocumentation()
+ {
+ return "Metoþu dokumentâcija";
+ }
+
+ /*! Used as the title of the design overview picture created for the
+ * VHDL output.
+ */
+ virtual QCString trDesignOverview()
+ {
+ return "Dizaina pârskats";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+
+};
+
+#endif
diff --git a/src/translator_mk.h b/src/translator_mk.h
index b5d8dcb..e190241 100644
--- a/src/translator_mk.h
+++ b/src/translator_mk.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -607,6 +607,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=" Протокол"; break;
case ClassDef::Category: result+=" Категорија"; break;
case ClassDef::Exception: result+=" ИÑклучок"; break;
+ default: break;
}
if (isTemplate) result+=" Образец";
result+=" Повикување";
@@ -766,6 +767,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="овој протокол"; break;
case ClassDef::Category: result+="оваа категорија"; break;
case ClassDef::Exception: result+="овој иÑклучок"; break;
+ default: break;
}
result+=" беше Ñоздадена од ";
if (single) result+="Ñледнава датотека:"; else result+="Ñледниве датотеки:";
@@ -1190,7 +1192,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
*/
virtual QCString trRTFansicp()
{
- return "1252";
+ return "1251";
}
@@ -1199,7 +1201,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
*/
virtual QCString trRTFCharSet()
{
- return "238";
+ return "204";
}
/*! Used as header RTF general index */
@@ -1660,6 +1662,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=" Протокол"; break;
case ClassDef::Category: result+=" Категорија"; break;
case ClassDef::Exception: result+=" ИÑклучок"; break;
+ default: break;
}
if (isTemplate) result+=" Образец";
return result;
@@ -1726,6 +1729,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="овој протокол"; break;
case ClassDef::Category: result+="оваа категорија"; break;
case ClassDef::Exception: result+="овој иÑклучок"; break;
+ default: break;
}
result+=" беше Ñоздадена од ";
if (single) result+="Ñледнава датотека:"; else result+="Ñледниве датотеки:";
diff --git a/src/translator_nl.h b/src/translator_nl.h
index db724db..41d77fb 100644
--- a/src/translator_nl.h
+++ b/src/translator_nl.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -18,7 +18,7 @@
#ifndef TRANSLATOR_NL_H
#define TRANSLATOR_NL_H
-class TranslatorDutch : public Translator
+class TranslatorDutch : public TranslatorAdapter_1_8_2
{
public:
QCString idLanguage()
@@ -268,6 +268,7 @@ class TranslatorDutch : public Translator
case ClassDef::Protocol: result+=" Protocol"; break;
case ClassDef::Category: result+=" Category"; break;
case ClassDef::Exception: result+=" Exception"; break;
+ default: break;
}
result+=" Referentie";
return result;
@@ -416,6 +417,7 @@ class TranslatorDutch : public Translator
case ClassDef::Protocol: result+="dit protocol"; break;
case ClassDef::Category: result+="deze categorie"; break;
case ClassDef::Exception: result+="deze exceptie"; break;
+ default: break;
}
result+=" is gegenereerd op grond van ";
if (single) result+="het"; else result+="de";
@@ -1277,6 +1279,7 @@ class TranslatorDutch : public Translator
case ClassDef::Protocol: result+=" Protocol"; break;
case ClassDef::Category: result+=" Category"; break;
case ClassDef::Exception: result+=" Exception"; break;
+ default: break;
}
if (isTemplate) result+=" Template";
result+=" Referentie";
@@ -1340,6 +1343,7 @@ class TranslatorDutch : public Translator
case ClassDef::Protocol: result+="dit protocol"; break;
case ClassDef::Category: result+="deze category"; break;
case ClassDef::Exception: result+="deze exception"; break;
+ default: break;
}
result+=" is gegenereerd op grond van ";
if (single) result+="het"; else result+="de";
diff --git a/src/translator_no.h b/src/translator_no.h
index cffaa09..5430538 100644
--- a/src/translator_no.h
+++ b/src/translator_no.h
@@ -1,8 +1,6 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -652,6 +650,7 @@ class TranslatorNorwegian : public TranslatorAdapter_1_4_6
case ClassDef::Exception: result+=" Unntak"; break;
case ClassDef::Protocol: result+=" Protocol"; break;
case ClassDef::Category: result+=" Category"; break;
+ default: break;
}
if (isTemplate) result+=" Mal";
result+=" Referanse";
@@ -811,6 +810,7 @@ class TranslatorNorwegian : public TranslatorAdapter_1_4_6
case ClassDef::Exception: result+="dette unntak"; break;
case ClassDef::Protocol: result+="denne protocol"; break;
case ClassDef::Category: result+="denne category"; break;
+ default: break;
}
result+=" ble generert fra følgende fil";
if (single) result+=":"; else result+="er:";
diff --git a/src/translator_pl.h b/src/translator_pl.h
index a6e25c2..b1e90ce 100644
--- a/src/translator_pl.h
+++ b/src/translator_pl.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -615,6 +615,7 @@ class TranslatorPolish : public TranslatorAdapter_1_8_2
case ClassDef::Protocol: result+=" protokołu "; break;
case ClassDef::Category: result+=" kategorii "; break;
case ClassDef::Exception: result+=" wyjÄ…tku "; break;
+ default: break;
}
result+=(QCString)clName;
return result;
@@ -774,6 +775,7 @@ class TranslatorPolish : public TranslatorAdapter_1_8_2
case ClassDef::Protocol: result+="go protokołu"; break;
case ClassDef::Category: result+="j kategorii"; break;
case ClassDef::Exception: result+="go wyjÄ…tku"; break;
+ default: break;
}
result+=" została wygenerowana z plik";
if (single) result+="u:"; else result+="ów:";
@@ -1669,6 +1671,7 @@ class TranslatorPolish : public TranslatorAdapter_1_8_2
case ClassDef::Protocol: result+=" protokołu "; break;
case ClassDef::Category: result+=" kategorii "; break;
case ClassDef::Exception: result+=" wyjÄ…tku "; break;
+ default: break;
}
result+=(QCString)clName;
return result;
@@ -1735,6 +1738,7 @@ class TranslatorPolish : public TranslatorAdapter_1_8_2
case ClassDef::Protocol: result+="go protokołu"; break;
case ClassDef::Category: result+="j kategorii"; break;
case ClassDef::Exception: result+="go wyjÄ…tku"; break;
+ default: break;
}
result+=" została wygenerowana z plik";
if (single) result+="u:"; else result+="ów:";
diff --git a/src/translator_pt.h b/src/translator_pt.h
index e7510d9..5130fcf 100644
--- a/src/translator_pt.h
+++ b/src/translator_pt.h
@@ -1,5 +1,5 @@
/******************************************************************************
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -616,6 +616,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="ao protocolo "; break;
case ClassDef::Category: result+="à categoria "; break;
case ClassDef::Exception: result+="à excepção "; break;
+ default: break;
}
if (isTemplate) result+="Template ";
result+=(QCString)clName;
@@ -778,6 +779,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="este protocolo"; break;
case ClassDef::Category: result+="esta categoria"; break;
case ClassDef::Exception: result+="esta excepção"; break;
+ default: break;
}
result+=" foi gerada a partir ";
if (single) result+=" do seguinte ficheiro:";
@@ -1673,6 +1675,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="do Protocolo "; break;
case ClassDef::Category: result+="da Categoria "; break;
case ClassDef::Exception: result+="da Exceção "; break;
+ default: break;
}
result += clName;
@@ -1740,6 +1743,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="esto protocolo "; break;
case ClassDef::Category: result+="esta categoria "; break;
case ClassDef::Exception: result+="esta exceção "; break;
+ default: break;
}
result+=" foi gerada a partir do";
diff --git a/src/translator_ro.h b/src/translator_ro.h
index 42f0224..70da281 100644
--- a/src/translator_ro.h
+++ b/src/translator_ro.h
@@ -1,12 +1,12 @@
/******************************************************************************
*
- *
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ *
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -20,12 +20,13 @@
*
* -------------------------------------------
* Project start : 20.09.2000
- * Last Doxygen version covered : 1.5.8
- * Last revision : 15.01.2009
+ * Last Doxygen version covered : 1.8.4
+ * Last revision : 17.05.2013
* -------------------------------------------
*
* Revision history
* ----------------
+ * 17.05.2013 - Updated translation to cover Doxygen 1.8.4 (Ionuț Dumitrașcu)
* 15.01.2009 - Updated Romanian translation to Doxygen 1.5.8 and modified strings to UTF-8, as well as some other changes (Ionuţ Dumitraşcu)
* 28.07.2008 - Updated version - covering Doxygen 1.5.6 - and some minor changes (Ionuţ Dumitraşcu)
*
@@ -41,23 +42,23 @@
#define TRANSLATOR_RO_H
-class TranslatorRomanian : public TranslatorAdapter_1_6_0
+class TranslatorRomanian : public Translator
{
public:
// --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
+
+ /*! Used for identification of the language. The identification
+ * should not be translated. It should be replaced by the name
* of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
+ * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
* the identification used in language.cpp.
*/
virtual QCString idLanguage()
{ return "romanian"; }
- /*! Used to get the LaTeX command(s) for the language support.
+ /*! Used to get the LaTeX command(s) for the language support.
* This method should return string with commands that switch
- * LaTeX to the desired language. For example
+ * LaTeX to the desired language. For example
* <pre>"\\usepackage[german]{babel}\n"
* </pre>
* or
@@ -65,7 +66,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
* "\\usepackage[latin2]{inputenc}\n"
* "\\usepackage[T1]{fontenc}\n"
* </pre>
- *
+ *
* The English LaTeX does not use such commands. Because of this
* the empty string is returned in this implementation.
*/
@@ -97,31 +98,31 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
/*! header that is put before the list of typedefs. */
virtual QCString trMemberTypedefDocumentation()
{ return "Documentaţia Definiţiilor de Tipuri (typedef) Membre"; }
-
+
/*! header that is put before the list of enumerations. */
virtual QCString trMemberEnumerationDocumentation()
{ return "Documentaţia Enumerărilor Membre"; }
-
+
/*! header that is put before the list of member functions. */
virtual QCString trMemberFunctionDocumentation()
{ return "Documentaţia Funcţiilor Membre"; }
-
+
/*! header that is put before the list of member attributes. */
virtual QCString trMemberDataDocumentation()
- {
+ {
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "Documentaţia Câmpurilor";
+ return "Documentaţia Câmpurilor";
}
else
{
- return "Documentaţia Datelor Membre";
+ return "Documentaţia Datelor Membre";
}
}
/*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
+ virtual QCString trMore()
{ return "Mai mult..."; }
/*! put in the class documentation */
@@ -139,65 +140,65 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
/*! this is the remainder of the sentence after the class name */
virtual QCString trIncludingInheritedMembers()
{ return ", inclusiv a tuturor membrilor moşteniţi."; }
-
+
/*! this is put at the author sections at the bottom of man pages.
* parameter s is name of the project name.
*/
virtual QCString trGeneratedAutomatically(const char *s)
{ QCString result="Generat automat de Doxygen";
if (s) result+=(QCString)" pentru "+s;
- result+=" din codul sursă.";
+ result+=" din codul sursă.";
return result;
}
/*! put after an enum name in the list of all members */
virtual QCString trEnumName()
{ return "nume enumerare"; }
-
+
/*! put after an enum value in the list of all members */
virtual QCString trEnumValue()
{ return "valoare enumerare"; }
-
+
/*! put after an undocumented member in the list of all members */
virtual QCString trDefinedIn()
{ return "definit în"; }
// quick reference sections
- /*! This is put above each page as a link to the list of all groups of
+ /*! This is put above each page as a link to the list of all groups of
* compounds or files (see the \\group command).
*/
virtual QCString trModules()
{ return "Module"; }
-
+
/*! This is put above each page as a link to the class hierarchy */
virtual QCString trClassHierarchy()
{ return "Ierarhia Claselor"; }
-
+
/*! This is put above each page as a link to the list of annotated classes */
virtual QCString trCompoundList()
- {
+ {
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
return "Structuri de Date";
}
else
{
- return "Lista Claselor";
+ return "Lista Claselor";
}
}
-
+
/*! This is put above each page as a link to the list of documented files */
virtual QCString trFileList()
{ return "Lista fiÅŸierelor"; }
/*! This is put above each page as a link to all members of compounds. */
virtual QCString trCompoundMembers()
- {
+ {
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "Câmpurile de Date";
+ return "Câmpurile de Date";
}
else
{
@@ -208,10 +209,10 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
/*! This is put above each page as a link to all members of files. */
virtual QCString trFileMembers()
- {
+ {
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "Globale";
+ return "Globale";
}
else
{
@@ -250,15 +251,15 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
/*! This is an introduction to the annotated compound list. */
virtual QCString trCompoundListDescription()
- {
+ {
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "Lista structurilor de date, cu scurte descrieri:";
+ return "Lista structurilor de date, cu scurte descrieri:";
}
else
{
return "Lista claselor, structurilor, uniunilor şi interfeţelor"
- ", cu scurte descrieri:";
+ ", cu scurte descrieri:";
}
}
@@ -267,7 +268,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
virtual QCString trCompoundMembersDescription(bool extractAll)
{
QCString result="Lista tuturor ";
-
+
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
result+="câmpurilor ";
@@ -281,7 +282,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
result+="din toate clasele ";
}
result+=", cu legături către ";
- if (!extractAll)
+ if (!extractAll)
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
@@ -292,7 +293,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
result+="documentaţia clasei pentru fiecare membru în parte:";
}
}
- else
+ else
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
@@ -303,7 +304,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
result+="clasele de care aparţin:";
}
}
-
+
return result;
}
@@ -323,9 +324,9 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
result+="din toate fiÅŸierele";
}
result+=", cu legături către ";
- if (extractAll)
+ if (extractAll)
result+="fişierele de care aparţin:";
- else
+ else
result+="documentaţia aferentă:";
return result;
@@ -343,37 +344,37 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
virtual QCString trModulesDescription()
{ return "Lista tuturor modulelor:"; }
- // index titles (the project name is prepended for these)
+ // index titles (the project name is prepended for these)
/*! This is used in HTML as the title of index.html. */
virtual QCString trDocumentation()
{ return "Documentaţie"; }
- /*! This is used in LaTeX as the title of the chapter with the
+ /*! This is used in LaTeX as the title of the chapter with the
* index of all groups.
*/
virtual QCString trModuleIndex()
{ return "Indexul Modulelor"; }
- /*! This is used in LaTeX as the title of the chapter with the
+ /*! This is used in LaTeX as the title of the chapter with the
* class hierarchy.
*/
virtual QCString trHierarchicalIndex()
{ return "Index Ierarhic"; }
- /*! This is used in LaTeX as the title of the chapter with the
+ /*! This is used in LaTeX as the title of the chapter with the
* annotated compound index.
*/
virtual QCString trCompoundIndex()
- {
+ {
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
+ {
return "Indexul Structurilor de Date";
}
else
{
- return "Indexul Claselor";
+ return "Indexul Claselor";
}
}
@@ -381,7 +382,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
/*! This is used in LaTeX as the title of the chapter with the
* list of all files.
*/
- virtual QCString trFileIndex()
+ virtual QCString trFileIndex()
{ return "Indexul FiÅŸierelor"; }
/*! This is used in LaTeX as the title of the chapter containing
@@ -394,14 +395,14 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
* the documentation of all classes, structs and unions.
*/
virtual QCString trClassDocumentation()
- {
+ {
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "Documentaţia Structurilor de Date";
+ return "Documentaţia Structurilor de Date";
}
else
{
- return "Documentaţia Claselor";
+ return "Documentaţia Claselor";
}
}
@@ -427,106 +428,106 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
/*! This is used in LaTeX as the title of the document */
virtual QCString trReferenceManual()
{ return "Manual de utilizare"; }
-
- /*! This is used in the documentation of a file as a header before the
+
+ /*! This is used in the documentation of a file as a header before the
* list of defines
*/
virtual QCString trDefines()
{ return "Definiţii"; }
- /*! This is used in the documentation of a file as a header before the
+ /*! This is used in the documentation of a file as a header before the
* list of function prototypes
*/
virtual QCString trFuncProtos()
{ return "Prototipuri de funcţii"; }
- /*! This is used in the documentation of a file as a header before the
+ /*! This is used in the documentation of a file as a header before the
* list of typedefs
*/
virtual QCString trTypedefs()
{ return "Definiţii de tipuri"; }
- /*! This is used in the documentation of a file as a header before the
+ /*! This is used in the documentation of a file as a header before the
* list of enumerations
*/
virtual QCString trEnumerations()
{ return "Enumerări"; }
- /*! This is used in the documentation of a file as a header before the
+ /*! This is used in the documentation of a file as a header before the
* list of (global) functions
*/
virtual QCString trFunctions()
{ return "Funcţii"; }
- /*! This is used in the documentation of a file as a header before the
+ /*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
virtual QCString trVariables()
{ return "Variabile"; }
- /*! This is used in the documentation of a file as a header before the
+ /*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
virtual QCString trEnumerationValues()
{ return "Valori de enumerări"; }
-
+
/*! This is used in the documentation of a file before the list of
* documentation blocks for defines
*/
virtual QCString trDefineDocumentation()
{ return "Documentaţia definiţiilor"; }
- /*! This is used in the documentation of a file/namespace before the list
+ /*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for function prototypes
*/
virtual QCString trFunctionPrototypeDocumentation()
{ return "Documentaţia prototipurilor de funcţii"; }
- /*! This is used in the documentation of a file/namespace before the list
+ /*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for typedefs
*/
virtual QCString trTypedefDocumentation()
{ return "Documentaţia definiţiilor de tipuri"; }
- /*! This is used in the documentation of a file/namespace before the list
+ /*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration types
*/
virtual QCString trEnumerationTypeDocumentation()
{ return "Documentaţia enumerărilor"; }
- /*! This is used in the documentation of a file/namespace before the list
+ /*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for functions
*/
virtual QCString trFunctionDocumentation()
{ return "Documentaţia funcţiilor"; }
- /*! This is used in the documentation of a file/namespace before the list
+ /*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for variables
*/
virtual QCString trVariableDocumentation()
{ return "Documentaţia variabilelor"; }
- /*! This is used in the documentation of a file/namespace/group before
+ /*! This is used in the documentation of a file/namespace/group before
* the list of links to documented compounds
*/
virtual QCString trCompounds()
- {
+ {
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "Structuri de Date";
+ return "Structuri de Date";
}
else
{
- return "Membri";
+ return "Membri";
}
}
- /*! This is used in the standard footer of each page and indicates when
- * the page was generated
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
*/
virtual QCString trGeneratedAt(const char *date,const char *projName)
- {
+ {
QCString result=(QCString)"Generat "+date;
if (projName) result+=(QCString)" pentru "+projName;
result+=(QCString)" de către";
@@ -544,7 +545,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
{
return (QCString)"Diagrama de relaţii pentru "+clName;
}
-
+
/*! this text is generated when the \\internal command is used. */
virtual QCString trForInternalUseOnly()
{ return "Doar pentru uz intern."; }
@@ -576,13 +577,13 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
/*! this text is generated when the \\exception command is used. */
virtual QCString trExceptions()
{ return "Excepţii"; }
-
+
/*! this text is used in the title page of a LaTeX document. */
virtual QCString trGeneratedBy()
{ return "Generat de"; }
// new since 0.49-990307
-
+
/*! used as the title of page containing all the index of all namespaces. */
virtual QCString trNamespaceList()
{ return "Lista de Namespace-uri"; }
@@ -602,17 +603,17 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
*/
virtual QCString trFriends()
{ return "Prieteni"; }
-
+
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990405
//////////////////////////////////////////////////////////////////////////
-
+
/*! used in the class documentation as a header before the list of all
- * related classes
+ * related classes
*/
virtual QCString trRelatedFunctionDocumentation()
{ return "Documentaţia funcţiilor prietene sau înrudite"; }
-
+
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990425
//////////////////////////////////////////////////////////////////////////
@@ -632,10 +633,11 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="protocolul "; break;
case ClassDef::Category: result+="categoria "; break;
case ClassDef::Exception: result+="excepţia "; break;
+ default: break;
}
- if (isTemplate) result+=" (Template) ";
- result+=(QCString)clName;
-
+ if (isTemplate) result+=" (Template) ";
+ result+=(QCString)clName;
+
return result;
}
@@ -654,7 +656,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
result+=namespaceName;
return result;
}
-
+
/* these are for the member sections of a class, struct or union */
virtual QCString trPublicMembers()
{ return "Metode Publice"; }
@@ -676,7 +678,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
{ return "Conectori (slots) Privaţi"; }
virtual QCString trStaticPrivateMembers()
{ return "Metode Statice Private"; }
-
+
/*! this function is used to produce a comma-separated list of items.
* use generateMarker(i) to indicate where item i should be put.
*/
@@ -685,23 +687,23 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
QCString result;
int i;
// the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
+ for (i=0;i<numEntries;i++)
{
// use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
+ result+=generateMarker(i); // generate marker for entry i in the list
// (order is left to right)
-
+
if (i!=numEntries-1) // not the last entry, so we need a separator
{
- if (i<numEntries-2) // not the fore last entry
+ if (i<numEntries-2) // not the fore last entry
result+=", ";
else // the fore last entry
result+=" ÅŸi ";
}
}
- return result;
+ return result;
}
-
+
/*! used in class documentation to produce a list of base classes,
* if class diagrams are disabled.
*/
@@ -718,7 +720,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
return "MoÅŸtenit de "+trWriteList(numEntries)+".";
}
- /*! used in member documentation blocks to produce a list of
+ /*! used in member documentation blocks to produce a list of
* members that are hidden by this one.
*/
virtual QCString trReimplementedFromList(int numEntries)
@@ -740,18 +742,18 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
/*! This is an introduction to the page with all namespace members */
virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
+ {
QCString result="Lista tuturor membrilor ";
if (!extractAll) result+="documentaţi ";
result+="din toate namespace-urile, cu legături către ";
-
- if (extractAll)
+
+ if (extractAll)
result+="documentaţia namespace-ului pentru fiecare membru în parte:";
- else
+ else
result+="namespace-urile de care aparţin:";
return result;
}
- /*! This is used in LaTeX as the title of the chapter with the
+ /*! This is used in LaTeX as the title of the chapter with the
* index of all namespaces.
*/
virtual QCString trNamespaceIndex()
@@ -794,6 +796,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="protocol"; break;
case ClassDef::Category: result+="categorie"; break;
case ClassDef::Exception: result+="excepţie"; break;
+ default: break;
}
result+=" a fost generată din fişier";
if (single) result+="ul:"; else result+="ele:";
@@ -819,7 +822,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
virtual QCString trMainPage()
{ return "Pagina principală"; }
- /*! This is used in references to page that are put in the LaTeX
+ /*! This is used in references to page that are put in the LaTeX
* documentation. It should be an abbreviation of the word page.
*/
virtual QCString trPageAbbreviation()
@@ -864,7 +867,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
/*! header that is put before the list of constructor/destructors. */
virtual QCString trConstructorDocumentation()
{
- return "Documentaţia pentru Constructori şi Destructori";
+ return "Documentaţia pentru Constructori şi Destructori";
}
/*! Used in the file documentation to point to the corresponding sources. */
virtual QCString trGotoSourceCode()
@@ -921,7 +924,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
//////////////////////////////////////////////////////////////////////////
// new since 1.1.0
//////////////////////////////////////////////////////////////////////////
-
+
virtual QCString trNote()
{
return "Notă";
@@ -940,7 +943,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
{
return "Atribute Publice";
}
-
+
}
virtual QCString trStaticPublicAttribs()
{
@@ -1011,7 +1014,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
{
return "Din";
}
-
+
//////////////////////////////////////////////////////////////////////////
// new since 1.1.5
//////////////////////////////////////////////////////////////////////////
@@ -1024,7 +1027,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
/*! page explaining how the dot graph's should be interpreted */
virtual QCString trLegendDocs()
{
- return
+ return
"Această pagină arată modul în care trebuie să interpretaţi "
"grafurile generate de doxygen.<p>\n"
"Consideraţi următorul exemplu:\n"
@@ -1086,11 +1089,11 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
{
return "legenda";
}
-
+
//////////////////////////////////////////////////////////////////////////
// new since 1.2.0
//////////////////////////////////////////////////////////////////////////
-
+
/*! Used as a marker that is put before a test item */
virtual QCString trTest()
{
@@ -1168,11 +1171,11 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
{
return "Valoare:";
}
-
+
//////////////////////////////////////////////////////////////////////////
// new since 1.2.5
//////////////////////////////////////////////////////////////////////////
-
+
/*! Used as a marker that is put before a \\bug item */
virtual QCString trBug()
{
@@ -1188,9 +1191,9 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
// new since 1.2.6
//////////////////////////////////////////////////////////////////////////
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
+ /*! Used as ansicpg for RTF file
+ *
+ * The following table shows the correlation of Charset name, Charset Value and
* <pre>
* Codepage number:
* Charset Name Charset Value(hex) Codepage number
@@ -1211,15 +1214,15 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
* GB2313_CHARSET 134 (x86) 936
* CHINESEBIG5_CHARSET 136 (x88) 950
* </pre>
- *
+ *
*/
virtual QCString trRTFansicp()
{
return "1250"; //EASTEUROPE_CHARSET
}
-
- /*! Used as ansicpg for RTF fcharset
+
+ /*! Used as ansicpg for RTF fcharset
* \see trRTFansicp() for a table of possible values.
*/
virtual QCString trRTFCharSet()
@@ -1232,82 +1235,82 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
{
return "Index";
}
-
+
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trClass(bool first_capital, bool singular)
- {
+ {
QCString result((first_capital ? "Clas" : "clas"));
result+= singular ? "a":"ele";
- return result;
+ return result;
}
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trFile(bool first_capital, bool singular)
- {
+ {
QCString result((first_capital ? "FiÅŸier" : "fiÅŸier"));
result+= singular ? "ul":"ele";
- return result;
+ return result;
}
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trNamespace(bool first_capital, bool singular)
- {
+ {
QCString result((first_capital ? "Namespace" : "namespace"));
result+= singular ? "-ul":"-urile";
- return result;
+ return result;
}
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trGroup(bool first_capital, bool singular)
- {
+ {
QCString result((first_capital ? "Grupu" : "grupu"));
result+= singular ? "l":"rile";
- return result;
+ return result;
}
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trPage(bool first_capital, bool singular)
- {
+ {
QCString result((first_capital ? "Pagin" : "pagin"));
result+= singular ? "a":"ile";
- return result;
+ return result;
}
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trMember(bool first_capital, bool singular)
- {
+ {
QCString result((first_capital ? "Membr" : "membr"));
result+= singular ? "ul":"ii";
- return result;
+ return result;
}
-
+
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trGlobal(bool first_capital, bool singular)
- {
+ {
QCString result((first_capital ? "Global" : "global"));
if (!singular) result+="e";
- return result;
+ return result;
}
//////////////////////////////////////////////////////////////////////////
@@ -1317,10 +1320,10 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
/*! This text is generated when the \\author command is used and
* for the author section in man pages. */
virtual QCString trAuthor(bool first_capital, bool singular)
- {
+ {
QCString result((first_capital ? "Autor" : "autor"));
result+= singular ? "ul":"ii";
- return result;
+ return result;
}
//////////////////////////////////////////////////////////////////////////
@@ -1338,7 +1341,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
// new since 1.2.13
//////////////////////////////////////////////////////////////////////////
- /*! used in member documentation blocks to produce a list of
+ /*! used in member documentation blocks to produce a list of
* members that are implemented by this one.
*/
virtual QCString trImplementedFromList(int numEntries)
@@ -1370,8 +1373,8 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
// new since 1.2.17
//////////////////////////////////////////////////////////////////////////
- /*! Used as the header of the list of item that have been
- * flagged deprecated
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
*/
virtual QCString trDeprecatedList()
{
@@ -1382,7 +1385,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
// new since 1.2.18
//////////////////////////////////////////////////////////////////////////
- /*! Used as a header for declaration section of the events found in
+ /*! Used as a header for declaration section of the events found in
* a C# program
*/
virtual QCString trEvents()
@@ -1402,35 +1405,35 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
/*! Used as a heading for a list of Java class types with package scope.
*/
virtual QCString trPackageTypes()
- {
+ {
return "Tipuri în pachet";
}
- /*! Used as a heading for a list of Java class functions with package
- * scope.
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
*/
virtual QCString trPackageMembers()
- {
+ {
return "Funcţii în pachet";
}
- /*! Used as a heading for a list of static Java class functions with
+ /*! Used as a heading for a list of static Java class functions with
* package scope.
*/
virtual QCString trStaticPackageMembers()
- {
+ {
return "Funcţii statice în pachet";
}
- /*! Used as a heading for a list of Java class variables with package
+ /*! Used as a heading for a list of Java class variables with package
* scope.
*/
virtual QCString trPackageAttribs()
- {
+ {
return "Atribute în pachet";
}
- /*! Used as a heading for a list of static Java class variables with
+ /*! Used as a heading for a list of static Java class variables with
* package scope.
*/
virtual QCString trStaticPackageAttribs()
- {
+ {
return "Atribute statice în pachet";
}
@@ -1438,7 +1441,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
// new since 1.3.1
//////////////////////////////////////////////////////////////////////////
- /*! Used in the quick index of a class/file/namespace member list page
+ /*! Used in the quick index of a class/file/namespace member list page
* to link to the unfiltered list of all members.
*/
virtual QCString trAll()
@@ -1455,9 +1458,9 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
// new since 1.3.3
//////////////////////////////////////////////////////////////////////////
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
*/
virtual QCString trSearchForIndex()
{
@@ -1474,7 +1477,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
* text can be different depending on the number of documents found.
* Inside the text you can put the special marker $num to insert
* the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
* value 2 represents 2 or more matches. HTML markup is allowed inside
* the returned string.
*/
@@ -1488,13 +1491,13 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
{
return "Am găsit <b>1</b> document corespunzând cererii.";
}
- else
+ else
{
return "Am găsit <b>$num</b> documente corespunzând cererii. "
"Lista documentelor găsite, sortate după relevanţă.";
}
}
- /*! This string is put before the list of matched words, for each search
+ /*! This string is put before the list of matched words, for each search
* result. What follows is the list of words that matched the query.
*/
virtual QCString trSearchMatches()
@@ -1547,9 +1550,9 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
* directory is passed via \a dirName.
*/
virtual QCString trDirReference(const char *dirName)
- {
- QCString result="Director-referinţă "; result+=dirName;
- return result;
+ {
+ QCString result="Director-referinţă "; result+=dirName;
+ return result;
}
/*! This returns the word directory with or without starting capital
@@ -1586,7 +1589,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
return "Graful de apeluri pentru această funcţie:";
}
- /*! This is used in the documentation of a file/namespace before the list
+ /*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration values
*/
virtual QCString trEnumerationValueDocumentation()
@@ -1595,12 +1598,12 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
//////////////////////////////////////////////////////////////////////////
// new since 1.5.4 (mainly for Fortran)
//////////////////////////////////////////////////////////////////////////
-
+
/*! header that is put before the list of member subprograms (Fortran). */
virtual QCString trMemberFunctionDocumentationFortran()
{ return "Documentaţia Funcţiei Membre/Subrutinei"; }
- /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
virtual QCString trCompoundListFortran()
{ return "Lista Tipurilor de Date"; }
@@ -1621,18 +1624,18 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
result+="documentate ";
}
result+=" cu legături către ";
- if (!extractAll)
+ if (!extractAll)
{
result+="documentaţia structurii de date pentru fiecare membru";
}
- else
+ else
{
result+="tipurile de date de care aparţin:";
}
return result;
}
- /*! This is used in LaTeX as the title of the chapter with the
+ /*! This is used in LaTeX as the title of the chapter with the
* annotated compound index (Fortran).
*/
virtual QCString trCompoundIndexFortran()
@@ -1644,24 +1647,24 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
virtual QCString trTypeDocumentation()
{ return "Documentaţia Tipurilor de Date"; }
- /*! This is used in the documentation of a file as a header before the
+ /*! This is used in the documentation of a file as a header before the
* list of (global) subprograms (Fortran).
*/
virtual QCString trSubprograms()
{ return "Funcţii/Subrutine"; }
- /*! This is used in the documentation of a file/namespace before the list
+ /*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for subprograms (Fortran)
*/
virtual QCString trSubprogramDocumentation()
{ return "Documentaţia Funcţiilor/Subrutinelor"; }
- /*! This is used in the documentation of a file/namespace/group before
+ /*! This is used in the documentation of a file/namespace/group before
* the list of links to documented compounds (Fortran)
*/
virtual QCString trDataTypes()
{ return "Tipuri de Date"; }
-
+
/*! used as the title of page containing all the index of all modules (Fortran). */
virtual QCString trModulesList()
{ return "Lista Modulelor"; }
@@ -1690,6 +1693,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="Protocolul "; break;
case ClassDef::Category: result+="Categoria "; break;
case ClassDef::Exception: result+="Excepţia "; break;
+ default: break;
}
if (isTemplate) result+="(Template) ";
result+=(QCString)clName;
@@ -1702,44 +1706,44 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
result += namespaceName;
return result;
}
-
+
/*! This is put above each page as a link to all members of modules. (Fortran) */
virtual QCString trModulesMembers()
{ return "Membrii Modulului"; }
/*! This is an introduction to the page with all modules members (Fortran) */
virtual QCString trModulesMemberDescription(bool extractAll)
- {
+ {
QCString result="Lista tuturor membrilor ";
if (!extractAll) result+="documentaţi ai ";
result+="modulului cu legături către ";
- if (extractAll)
+ if (extractAll)
{
result+="documentaţia modulului pentru fiecare membru:";
}
- else
+ else
{
result+="modulele de care aparţin:";
}
return result;
}
- /*! This is used in LaTeX as the title of the chapter with the
+ /*! This is used in LaTeX as the title of the chapter with the
* index of all modules (Fortran).
*/
virtual QCString trModulesIndex()
{ return "Indexul Modulelor"; }
-
+
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trModule(bool first_capital, bool singular)
- {
+ {
QCString result((first_capital ? "Modul" : "modul"));
if (singular) result+="ul";
else result += "ele";
- return result;
+ return result;
}
/*! This is put at the bottom of a module documentation page and is
* followed by a list of files that were used to generate the page.
@@ -1758,32 +1762,33 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="protocolului"; break;
case ClassDef::Category: result+="categoriei"; break;
case ClassDef::Exception: result+="excepţiei"; break;
+ default: break;
}
result+=" a fost generată din următo";
if (single) result+="rul fiÅŸier:"; else result+="arele fiÅŸiere:";
return result;
}
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trType(bool first_capital, bool singular)
- {
+ {
QCString result((first_capital ? "Tip" : "tip"));
if (singular) result+="ul";
else result += "urile";
- return result;
+ return result;
}
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trSubprogram(bool first_capital, bool singular)
- {
+ {
QCString result((first_capital ? "Subprogram" : "subprogram"));
if (singular) result+="ul";
- else result += "urile";
- return result;
+ else result += "ele";
+ return result;
}
/*! C# Type Constraint list */
@@ -1791,7 +1796,279 @@ class TranslatorRomanian : public TranslatorAdapter_1_6_0
{
return "Constrângerile de Tip";
}
-
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return QCString(name)+" Relație";
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "Se încarcă...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Namespace Global";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Căutare...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Niciun rezultat";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Grafic de dependență a directoarelor pentru "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Fișierul din "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Include fișierul din "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Luni","Marți","Miercuri","Joi","Vineri","Sâmbătă","Duminică" };
+ static const char *months[] = { "Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Noi","Dec" };
+ QCString sdate;
+ sdate.sprintf("%s %s %d %d",days[dayOfWeek-1],months[month-1],day,year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.7.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Header for the page with bibliographic citations */
+ virtual QCString trCiteReferences()
+ { return "Referințe Bibliografice"; }
+
+ /*! Text for copyright paragraph */
+ virtual QCString trCopyright()
+ { return "Copyright"; }
+
+ /*! Header for the graph showing the directory dependencies */
+ virtual QCString trDirDepGraph(const char *name)
+ { return QCString("Grafic de dependență a directoarelor pentru ")+name+":"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Detail level selector shown for hierarchical indices */
+ virtual QCString trDetailLevel()
+ { return "nivel de detaliu"; }
+
+ /*! Section header for list of template parameters */
+ virtual QCString trTemplateParameters()
+ { return "Parametri Template"; }
+
+ /*! Used in dot graph when UML_LOOK is enabled and there are many fields */
+ virtual QCString trAndMore(const QCString &number)
+ { return "și încă " + number; }
+
+ /*! Used file list for a Java enum */
+ virtual QCString trEnumGeneratedFromFiles(bool single)
+ { QCString result = "Documentația pentru acest enum a fost generată din ";
+ if (single)
+ result += "următorul fișier:";
+ else
+ result += "următoarele fișiere:";
+ return result;
+ }
+
+ /*! Header of a Java enum page (Java enums are represented as classes). */
+ virtual QCString trEnumReference(const char *name)
+ { return QCString(name)+" Referință Enum"; }
+
+ /*! Used for a section containing inherited members */
+ virtual QCString trInheritedFrom(const char *members,const char *what)
+ { return QCString(members)+" moștenit(e) din "+what; }
+
+ /*! Header of the sections with inherited members specific for the
+ * base class(es)
+ */
+ virtual QCString trAdditionalInheritedMembers()
+ { return "Membri Moșteniți Adiționali"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a tooltip for the toggle button that appears in the
+ * navigation tree in the HTML output when GENERATE_TREEVIEW is
+ * enabled. This tooltip explains the meaning of the button.
+ */
+ virtual QCString trPanelSynchronisationTooltip(bool enable)
+ {
+ QCString opt = enable ? "activa" : "dezactiva";
+ return "apasă 'click' pentru a "+opt+" sincronizarea panourilor";
+ }
+
+ /*! Used in a method of an Objective-C class that is declared in a
+ * a category. Note that the @1 marker is required and is replaced
+ * by a link.
+ */
+ virtual QCString trProvidedByCategory()
+ {
+ return "Furnizat de categoria @1.";
+ }
+
+ /*! Used in a method of an Objective-C category that extends a class.
+ * Note that the @1 marker is required and is replaced by a link to
+ * the class method.
+ */
+ virtual QCString trExtendsClass()
+ {
+ return "Extinde clasa @1.";
+ }
+
+ /*! Used as the header of a list of class methods in Objective-C.
+ * These are similar to static public member functions in C++.
+ */
+ virtual QCString trClassMethods()
+ {
+ return "Metodele Clasei";
+ }
+
+ /*! Used as the header of a list of instance methods in Objective-C.
+ * These are similar to public member functions in C++.
+ */
+ virtual QCString trInstanceMethods()
+ {
+ return "Metodele Instanței";
+ }
+
+ /*! Used as the header of the member functions of an Objective-C class.
+ */
+ virtual QCString trMethodDocumentation()
+ {
+ return "Documentația Metodelor";
+ }
+
+ /*! Used as the title of the design overview picture created for the
+ * VHDL output.
+ */
+ virtual QCString trDesignOverview()
+ {
+ return "Vedere de Ansamblu a Designului";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+ /** old style UNO IDL services: implemented interfaces */
+ virtual QCString trInterfaces()
+ { return "Interfețe exportate"; }
+
+ /** old style UNO IDL services: inherited services */
+ virtual QCString trServices()
+ { return "Servicii Incluse"; }
+
+ /** UNO IDL constant groups */
+ virtual QCString trConstantGroups()
+ { return "Grupuri Constante"; }
+
+ /** UNO IDL constant groups */
+ virtual QCString trConstantGroupReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Referință Grup Constant";
+ return result;
+ }
+ /** UNO IDL service page title */
+ virtual QCString trServiceReference(const char *sName)
+ {
+ QCString result=(QCString)sName;
+ result+=" Referință Serviciu";
+ return result;
+ }
+ /** UNO IDL singleton page title */
+ virtual QCString trSingletonReference(const char *sName)
+ {
+ QCString result=(QCString)sName;
+ result+=" Referință Singleton";
+ return result;
+ }
+ /** UNO IDL service page */
+ virtual QCString trServiceGeneratedFromFiles(bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"Documentația pentru acest serviciu "
+ "a fost generată din ";
+ if (single)
+ result += "următorul fișier:";
+ else
+ result += "următoarele fișiere:";
+ return result;
+ }
+ /** UNO IDL singleton page */
+ virtual QCString trSingletonGeneratedFromFiles(bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"Documentația pentru acest singleton "
+ "a fost generată din ";
+ if (single)
+ result += "următorul fișier:";
+ else
+ result += "următoarele fișiere:";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+
};
#endif
diff --git a/src/translator_ru.h b/src/translator_ru.h
index e7f7d95..5c8295a 100644
--- a/src/translator_ru.h
+++ b/src/translator_ru.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -581,6 +581,7 @@ class TranslatorRussian : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+="протокола"; break;
case ClassDef::Category: result+="категории"; break;
case ClassDef::Exception: result+="иÑключениÑ"; break;
+ default: break;
}
}
else
@@ -594,6 +595,7 @@ class TranslatorRussian : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+="Протокол"; break;
case ClassDef::Category: result+="КатегориÑ"; break;
case ClassDef::Exception: result+="ИÑключение"; break;
+ default: break;
}
}
result+=" ";
@@ -765,6 +767,8 @@ class TranslatorRussian : public TranslatorAdapter_1_7_5
case ClassDef::Exception: result+="иÑключени";
if (single) result+="Ñ"; else result+="й";
break;
+ default:
+ break;
}
result+=" находÑÑ‚ÑÑ Ð² файл";
if (single) result+="е:"; else result+="ах:";
@@ -1644,6 +1648,7 @@ class TranslatorRussian : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+=" Протокол"; break;
case ClassDef::Category: result+=" КатегориÑ"; break;
case ClassDef::Exception: result+=" ИÑключение"; break;
+ default: break;
}
}
else
@@ -1658,6 +1663,7 @@ class TranslatorRussian : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+="протокола"; break;
case ClassDef::Category: result+="категории"; break;
case ClassDef::Exception: result+="иÑключениÑ"; break;
+ default: break;
}
}
return result;
@@ -1722,6 +1728,7 @@ class TranslatorRussian : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+="протоколу"; break;
case ClassDef::Category: result+="кетегории"; break;
case ClassDef::Exception: result+="иÑключению"; break;
+ default: break;
}
result+=" Ñгенерирована на оÑнове Ñледующ";
if (single) result+="его файла:"; else result+="их файлов:";
diff --git a/src/translator_sc.h b/src/translator_sc.h
index 2ea2091..edf5ba2 100644
--- a/src/translator_sc.h
+++ b/src/translator_sc.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -611,30 +611,35 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0
bool isTemplate)
{
QCString result=(QCString)clName;
- if (isTemplate) {
- result+=" Шаблон";
- switch(compType)
- {
- case ClassDef::Class: result+="Ñка клаÑа"; break;
- case ClassDef::Struct: result+="Ñка Ñтруктура"; break;
- case ClassDef::Union: result+="Ñка унија"; break;
- case ClassDef::Interface: result+="Ñки интерфејÑ"; break;
- case ClassDef::Protocol: result+="Ñки протокол"; break;
- case ClassDef::Category: result+="Ñка категорија"; break;
- case ClassDef::Exception: result+="Ñки изузетак"; break;
- }
- } else {
- result+=" Референца";
- switch(compType)
- {
- case ClassDef::Class: result+=" клаÑе"; break;
- case ClassDef::Struct: result+=" Ñтруктуре"; break;
- case ClassDef::Union: result+=" уније"; break;
- case ClassDef::Interface: result+=" интерфејÑа"; break;
- case ClassDef::Protocol: result+=" протокола"; break;
- case ClassDef::Category: result+=" категорије"; break;
- case ClassDef::Exception: result+=" изузетка"; break;
- }
+ if (isTemplate)
+ {
+ result+=" Шаблон";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="Ñка клаÑа"; break;
+ case ClassDef::Struct: result+="Ñка Ñтруктура"; break;
+ case ClassDef::Union: result+="Ñка унија"; break;
+ case ClassDef::Interface: result+="Ñки интерфејÑ"; break;
+ case ClassDef::Protocol: result+="Ñки протокол"; break;
+ case ClassDef::Category: result+="Ñка категорија"; break;
+ case ClassDef::Exception: result+="Ñки изузетак"; break;
+ default: break;
+ }
+ }
+ else
+ {
+ result+=" Референца";
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" клаÑе"; break;
+ case ClassDef::Struct: result+=" Ñтруктуре"; break;
+ case ClassDef::Union: result+=" уније"; break;
+ case ClassDef::Interface: result+=" интерфејÑа"; break;
+ case ClassDef::Protocol: result+=" протокола"; break;
+ case ClassDef::Category: result+=" категорије"; break;
+ case ClassDef::Exception: result+=" изузетка"; break;
+ default: break;
+ }
}
return result;
}
@@ -792,6 +797,7 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="овај протокол"; break;
case ClassDef::Category: result+="ову категорију"; break;
case ClassDef::Exception: result+="овај изузетак"; break;
+ default: break;
}
result+=" је произведена из";
if (single) result+="Ñледеће датотеке:"; else result+="Ñледећих датотека:";
@@ -1217,7 +1223,7 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0
*/
virtual QCString trRTFansicp()
{
- return "1252";
+ return "1251";
}
@@ -1226,7 +1232,7 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0
*/
virtual QCString trRTFCharSet()
{
- return "0";
+ return "204";
}
/*! Used as header RTF general index */
@@ -1703,6 +1709,7 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=" протокола"; break;
case ClassDef::Category: result+=" категорије"; break;
case ClassDef::Exception: result+=" изузетка"; break;
+ default: break;
}
return result;
}
@@ -1768,6 +1775,7 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="овај протокол"; break;
case ClassDef::Category: result+="ову категорију"; break;
case ClassDef::Exception: result+="овај изузетак"; break;
+ default: break;
}
result+=" је направљен из Ñледећ";
if (single) result+="е датотеке:"; else result+="их датотека:";
diff --git a/src/translator_si.h b/src/translator_si.h
index 8be0cd4..7295e44 100644
--- a/src/translator_si.h
+++ b/src/translator_si.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -281,8 +281,9 @@ class TranslatorSlovene : public TranslatorAdapter_1_4_6
case ClassDef::Protocol: result+=" protocol "; break; // translate me!
case ClassDef::Category: result+=" category "; break; // translate me!
case ClassDef::Exception: result+=" IDL prekinitev "; break;
+ default: break;
}
- result += (QCString)clName;
+ result += (QCString)clName;
return result;
}
@@ -429,6 +430,7 @@ class TranslatorSlovene : public TranslatorAdapter_1_4_6
case ClassDef::Protocol: result+="protocol"; break; // translate me!
case ClassDef::Category: result+="category"; break; // translate me!
case ClassDef::Exception: result+="prekinitve (exception)"; break;
+ default: break;
}
result+=" je zgrajen na podlagi naslednj";
if (single) result+="e "; else result+="ih";
diff --git a/src/translator_sk.h b/src/translator_sk.h
index df3feea..836d7f2 100644
--- a/src/translator_sk.h
+++ b/src/translator_sk.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -17,6 +17,7 @@
// Updates:
// --------
+// 2013/05/14 - Updates for "new since 1.8.4".
// 2012/08/02 - Updates for "new since 1.8.2".
// 2012/04/18 - Updates for "new since 1.8.0".
// 2011/07/28 - Updates for "new since 1.7.5".
@@ -593,6 +594,7 @@ class TranslatorSlovak : public Translator
case ClassDef::Protocol: result+="protokol "; break;
case ClassDef::Category: result+="kategória "; break;
case ClassDef::Exception: result+="výnimky "; break;
+ default: break;
}
result+=clName;
return result;
@@ -765,6 +767,7 @@ class TranslatorSlovak : public Translator
case ClassDef::Protocol: result+="protokol"; break;
case ClassDef::Category: result+="kategória"; break;
case ClassDef::Exception: result+="túto výnimku"; break;
+ default: break;
}
result+=" bola generovaná z ";
if (single) result+="nasledujúceho súboru:";
@@ -1172,7 +1175,7 @@ class TranslatorSlovak : public Translator
/*! Used as ansicpg for RTF fcharset */
virtual QCString trRTFCharSet()
{
- return "3";
+ return "238";
}
/*! Used as header RTF general index */
@@ -1645,6 +1648,7 @@ class TranslatorSlovak : public Translator
case ClassDef::Protocol: result += "protokolu "; break;
case ClassDef::Category: result += "kategórie "; break;
case ClassDef::Exception: result += "výnimky "; break;
+ default: break;
}
result += clName;
return result;
@@ -1712,6 +1716,7 @@ class TranslatorSlovak : public Translator
case ClassDef::Protocol: result+="k tomuto protokolu"; break;
case ClassDef::Category: result+="k tejto kategórii"; break;
case ClassDef::Exception: result+="k tejto výnimke"; break;
+ default: break;
}
result+=" bola vygenerovaná z ";
if (single) result+="nasledujúceho súboru:";
@@ -1959,6 +1964,62 @@ class TranslatorSlovak : public Translator
}
//////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+ /** old style UNO IDL services: implemented interfaces */
+ virtual QCString trInterfaces()
+ { return "Exportované rozhrania"; }
+
+ /** old style UNO IDL services: inherited services */
+ virtual QCString trServices()
+ { return "ZaÄlenené služby"; }
+
+ /** UNO IDL constant groups */
+ virtual QCString trConstantGroups()
+ { return "Konštantné skupiny"; }
+
+ /** UNO IDL constant groups */
+ virtual QCString trConstantGroupReference(const char *namespaceName)
+ {
+ QCString result="Konštantné skupiny z ";
+ result += namespaceName;
+ return result;
+ }
+ /** UNO IDL service page title */
+ virtual QCString trServiceReference(const char *sName)
+ {
+ QCString result="Popis služby ";
+ result += sName;
+ return result;
+ }
+ /** UNO IDL singleton page title */
+ virtual QCString trSingletonReference(const char *sName)
+ {
+ QCString result="Popis singletonu ";
+ result += sName;
+ return result;
+ }
+ /** UNO IDL service page */
+ virtual QCString trServiceGeneratedFromFiles(bool single)
+ {
+ // single is true implies a single file
+ QCString result="Dokumentácia k tejto službe bola vygenerovaná ";
+ if (single) result+="z nasledujúceho súboru:";
+ else result+="z nasledujúcich súborov:";
+ return result;
+ }
+ /** UNO IDL singleton page */
+ virtual QCString trSingletonGeneratedFromFiles(bool single)
+ {
+ // single is true implies a single file
+ QCString result="Dokumentácia k tomuto singletonu bola vygenerovaná ";
+ if (single) result+="z nasledujúceho súboru:";
+ else result+="z nasledujúcich súborov:";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
};
#endif // TRANSLATOR_SK_H
diff --git a/src/translator_sr.h b/src/translator_sr.h
index b12f87c..7311eac 100644
--- a/src/translator_sr.h
+++ b/src/translator_sr.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -623,6 +623,7 @@ private:
case ClassDef::Protocol: result+="protokola "; break;
case ClassDef::Category: result+="kategorije "; break;
case ClassDef::Exception: result+="izuzetka "; break;
+ default: break;
}
if (isTemplate) result += "Å¡ablona ";
result += clName;
@@ -782,6 +783,7 @@ private:
case ClassDef::Protocol: result+="ovog protokola"; break;
case ClassDef::Category: result+="ove kategorije"; break;
case ClassDef::Exception: result+="ovog izuzetka"; break;
+ default: break;
}
result+=" je napravljena na osnovu ";
if (single) result+="datoteke "; else result+="sledećih datoteka:";
@@ -1680,6 +1682,7 @@ private:
case ClassDef::Protocol: result+=" Protokol"; break;
case ClassDef::Category: result+=" Kategorija"; break;
case ClassDef::Exception: result+=" Izuzetak"; break;
+ default: break;
}
result+=" - sažet pregled";
if (isTemplate) result+=" Å¡ablona";
@@ -1747,6 +1750,7 @@ private:
case ClassDef::Protocol: result+="protokol"; break;
case ClassDef::Category: result+="kategoriju"; break;
case ClassDef::Exception: result+="izuzetak"; break;
+ default: break;
}
result+=" napravljena je automatski od sledeć";
if (single) result+="e datoteke:"; else result+="ih datoteka:";
diff --git a/src/translator_sv.h b/src/translator_sv.h
index d6eeff7..b6bb3d7 100644
--- a/src/translator_sv.h
+++ b/src/translator_sv.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -509,6 +509,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=" protocol"; break; // translate me!
case ClassDef::Category: result+=" category"; break; // translate me!
case ClassDef::Exception: result+=" undantag"; break;
+ default: break;
}
if (isTemplate) result+="template";
result+="referens";
@@ -650,6 +651,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="protocol"; break; // translate me!
case ClassDef::Category: result+="category"; break; // translate me!
case ClassDef::Exception: result+="detta undantag "; break;
+ default: break;
}
result+="var genererad från följande fil";
if (single) result+=":"; else result+="er:";
@@ -1548,6 +1550,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=" Protokoll"; break;
case ClassDef::Category: result+=" Kategori"; break;
case ClassDef::Exception: result+=" Undantag"; break;
+ default: break;
}
if (isTemplate) result+=" Mall";
result+=" Referens";
@@ -1613,6 +1616,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="protokoll"; break;
case ClassDef::Category: result+="kategori"; break;
case ClassDef::Exception: result+="undantag"; break;
+ default: break;
}
result+=" genererades från följade fil";
if (single) result+=":"; else result+="er:";
diff --git a/src/translator_tr.h b/src/translator_tr.h
index 4370400..9c66c55 100644
--- a/src/translator_tr.h
+++ b/src/translator_tr.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -620,6 +620,7 @@ class TranslatorTurkish : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+=" Protokol"; break;
case ClassDef::Category: result+=" Kategori"; break;
case ClassDef::Exception: result+=" Ä°stisna"; break;
+ default: break;
}
if (isTemplate) result+=" Åžablon";
result+=" Referans";
@@ -779,6 +780,7 @@ class TranslatorTurkish : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+="protokol"; break;
case ClassDef::Category: result+="kategori"; break;
case ClassDef::Exception: result+="istisna"; break;
+ default: break;
}
result+=" için dokümantasyon aşağıdaki dosya";
if (single) result+=""; else result+="lar";
@@ -1676,6 +1678,7 @@ class TranslatorTurkish : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+=" Protokol"; break;
case ClassDef::Category: result+=" Kategori"; break;
case ClassDef::Exception: result+=" Ä°stisna"; break;
+ default: break;
}
if (isTemplate) result+=" Åžablon";
result+=" Referans";
@@ -1743,6 +1746,7 @@ class TranslatorTurkish : public TranslatorAdapter_1_7_5
case ClassDef::Protocol: result+="protokol"; break;
case ClassDef::Category: result+="kategori"; break;
case ClassDef::Exception: result+="istisna"; break;
+ default: break;
}
result+=" için dokümantasyon aşağıdaki dosya";
if (single) result+=":"; else result+="lar";
diff --git a/src/translator_tw.h b/src/translator_tw.h
index 002c8a0..29f2cd3 100644
--- a/src/translator_tw.h
+++ b/src/translator_tw.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -627,6 +627,7 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+=" å”定"; break;
case ClassDef::Category: result+=" 分類"; break;
case ClassDef::Exception: result+=" 例外"; break;
+ default: break;
}
if (isTemplate) result+=" 樣版";
result+=" åƒè€ƒæ–‡ä»¶";
@@ -786,6 +787,7 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="å”定(protocol)"; break;
case ClassDef::Category: result+="分類(category)"; break;
case ClassDef::Exception: result+="例外(exception)"; break;
+ default: break;
}
result+=" 文件是由下列檔案中產生";
if (single) result+=":"; else result+=":";
@@ -1659,6 +1661,7 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="å”è­°"; break;
case ClassDef::Category: result+="分類"; break;
case ClassDef::Exception: result+="例外"; break;
+ default: break;
}
if (isTemplate) result+=" Template";
result+="åƒè€ƒæ–‡ä»¶";
@@ -1725,6 +1728,7 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_8_0
case ClassDef::Protocol: result+="å”è­°"; break;
case ClassDef::Category: result+="分類"; break;
case ClassDef::Exception: result+="例外"; break;
+ default: break;
}
result+="文件由下列檔案產生";
return result;
diff --git a/src/translator_ua.h b/src/translator_ua.h
index 022100d..2a80e22 100644
--- a/src/translator_ua.h
+++ b/src/translator_ua.h
@@ -1,12 +1,10 @@
/******************************************************************************
*
- *
- *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -15,26 +13,14 @@
*
* The translation into Ukrainian was provided by
* Olexij Tkatchenko (olexij.tkatchenko@parcs.de)
+ * Petro Yermolenko (python@i.ua)
*/
#ifndef TRANSLATOR_UA_H
#define TRANSLATOR_UA_H
-class TranslatorUkrainian : public TranslatorAdapter_1_4_1
+class TranslatorUkrainian : public TranslatorAdapter_1_8_2
{
- private:
- /*! The Decode() inline assumes the source written in the
- Koi8-U encoding (maintainer dependent).
- */
- inline QCString decode(const QCString & sInput)
- {
-//#ifdef _WIN32
-// return Koi8RToWindows1251(sInput);
-//#else
- return sInput;
-//#endif
- }
-
public:
/*! Used for identification of the language. */
virtual QCString idLanguage()
@@ -43,155 +29,143 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
/* Used to get the command(s) for the language support. */
virtual QCString latexLanguageSupportCommand()
{
-//#ifdef _WIN32
-// return "\\usepackage[cp1251]{inputenc}\n\\usepackage[ukrainian]{babel}\n";
-//#else
- return "\\usepackage[T2A]{fontenc}\n\\usepackage[ukrainian]{babel}\n";
-//#endif
+ return "\\usepackage[T2A]{fontenc}\n\\usepackage[ukrainian]{babel}\n";
}
/*! return the language charset. This will be used for the HTML output */
virtual QCString idLanguageCharset()
{
-//#ifdef _WIN32
-// return "Windows-1251";
-//#else
- return "koi8-u";
-//#endif
+ return "utf-8";
}
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
virtual QCString trRelatedFunctions()
- { return decode("óÐÏÒ¦ÄÎÅΦ ÆÕËæ§"); }
+ { return "Споріднені фукції"; }
/*! subscript for the related functions. */
virtual QCString trRelatedSubscript()
- { return decode("(ÎÅ ÍÅÔÏÄÉ ËÏÍÐÏÎÅÎÔ)"); }
+ { return "(не методи компонент)"; }
/*! header that is put before the detailed description of files, classes and namespaces. */
virtual QCString trDetailedDescription()
- { return decode("äÅÔÁÌØÎÉÊ ÏÐÉÓ"); }
+ { return "Детальний опиÑ"; }
/*! header that is put before the list of typedefs. */
virtual QCString trMemberTypedefDocumentation()
- { return decode("ïÐÉÓ ÔÉÐ¦× ËÏÒÉÓÔÕ×ÁÞÁ"); }
+ { return "ÐžÐ¿Ð¸Ñ Ñ‚Ð¸Ð¿Ñ–Ð² кориÑтувача"; }
/*! header that is put before the list of enumerations. */
virtual QCString trMemberEnumerationDocumentation()
- { return decode("ïÐÉÓ ÐÅÒÅÌ¦Ë¦× ËÏÒÉÓÔÕ×ÁÞÁ"); }
+ { return "ÐžÐ¿Ð¸Ñ Ð¿ÐµÑ€ÐµÐ»Ñ–ÐºÑ–Ð² кориÑтувача"; }
/*! header that is put before the list of member functions. */
virtual QCString trMemberFunctionDocumentation()
- { return decode("ïÐÉÓ ÍÅÔÏÄ¦× ËÏÍÐÏÎÅÎÔ"); }
+ { return "ÐžÐ¿Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñ–Ð² компонент"; }
/*! header that is put before the list of member attributes. */
virtual QCString trMemberDataDocumentation()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return decode( "ðÏÌÑ" );
+ return "ПолÑ" ;
}
else
{
- return decode( "ëÏÍÐÏÎÅÎÔΦ ÄÁΦ" );
+ return "Компонентні дані" ;
}
}
/*! this is the text of a link put after brief descriptions. */
virtual QCString trMore()
- { return decode("äÅÔÁÌØΦÛÅ..."); }
+ { return "Детальніше..."; }
/*! put in the class documentation */
/* Dosn't use when optimization for C is on. */
virtual QCString trListOfAllMembers()
{
- return decode( "óÐÉÓÏË ×Ó¦È ÅÌÅÍÅÎÔ¦×" );
+ return "СпиÑок вÑÑ–Ñ… елементів" ;
}
/*! used as the title of the "list of all members" page of a class */
/* Dosn't use when optimization for C is on. */
virtual QCString trMemberList()
{
- return decode( "CÐÉÓÏË ÅÌÅÍÅÎÔ¦×" );
+ return "CпиÑок елементів" ;
}
/*! this is the first part of a sentence that is followed by a class name */
/* Dosn't use when optimization for C is on. */
virtual QCString trThisIsTheListOfAllMembers()
- { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÅÌÅÍÅÎÔ¦×"); }
+ { return "Повний ÑпиÑок елементів"; }
/*! this is the remainder of the sentence after the class name */
/* Dosn't use when optimization for C is on. */
virtual QCString trIncludingInheritedMembers()
- { return decode(", ×ËÌÀÞÁÀÞÉ ×Ó¦ ÕÓÐÁÄËÏ×ÁΦ ÅÌÅÍÅÎÔÉ"); }
+ { return ", включаючи вÑÑ– уÑпадковані елементи"; }
/*! this is put at the author sections at the bottom of man pages.
* parameter s is name of the project name.
*/
virtual QCString trGeneratedAutomatically(const char *s)
- { QCString result=decode("á×ÔÏÍÁÔÉÞÎÏ ÓÔ×ÏÒÅÎÏ ÚÁ ÄÏÐÏÍÏÇÏÀ Doxygen");
- if (s) result+=decode(" ÄÌÑ ")+s;
- result+=decode(" Ú ÔÅËÓÔÕ ÐÒÏÇÒÁÍÉ.");
+ { QCString result="Ðвтоматично Ñтворено за допомогою Doxygen";
+ if (s) result+=QCString(" Ð´Ð»Ñ ")+s;
+ result+=" з текÑту програми.";
return result;
}
/*! put after an enum name in the list of all members */
virtual QCString trEnumName()
- { return decode("ðÅÒÅ̦Ë"); }
+ { return "Перелік"; }
/*! put after an enum value in the list of all members */
virtual QCString trEnumValue()
- { return decode("åÌÅÍÅÎÔ ÐÅÒÅ̦ËÕ"); }
+ { return "Елемент переліку"; }
/*! put after an undocumented member in the list of all members */
virtual QCString trDefinedIn()
- { return decode("×ÉÚÎÁÞÅÎÏ × "); }
+ { return "визначено в "; }
// quick reference sections
- /*! This is put above each page as a link to the list of all groups of
+ /*! This is put above each page as a link to the list of all groups of
* compounds or files (see the \\group command).
*/
virtual QCString trModules()
- { return decode("ðÒÏÇÒÁÍΦ ÍÏÄÕ̦"); }
+ { return "Програмні модулі"; }
/*! This is put above each page as a link to the class hierarchy */
virtual QCString trClassHierarchy()
- { return decode("¶¤ÒÁÒÈ¦Ñ ËÌÁÓ¦×"); }
+ { return "Ð†Ñ”Ñ€Ð°Ñ€Ñ…Ñ–Ñ ÐºÐ»Ð°Ñів"; }
/*! This is put above each page as a link to the list of annotated classes */
virtual QCString trCompoundList()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" );
+ return "Структури даних" ;
}
else
{
- return decode( "ëÌÁÓÉ" );
+ return "КлаÑи" ;
}
}
/*! This is put above each page as a link to the list of documented files */
virtual QCString trFileList()
- { return decode("æÁÊÌÉ"); }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return decode("úÁÇÏÌÏ×ÏÞΦ ÆÁÊÌÉ"); }
+ { return "Файли"; }
/*! This is put above each page as a link to all members of compounds. */
virtual QCString trCompoundMembers()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return decode( "ðÏÌÑ ÓÔÒÕËÔÕÒ" );
+ return "ÐŸÐ¾Ð»Ñ Ñтруктур" ;
}
else
{
- return decode( "åÌÅÍÅÎÔÉ ËÌÁÓ¦×" );
+ return "Елементи клаÑів" ;
}
}
@@ -199,34 +173,34 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
/*??*/
virtual QCString trFileMembers()
{
- return decode( "åÌÅÍÅÎÔÉ ÆÁÊÌÕ" );
+ return "Елементи файлу" ;
}
/*! This is put above each page as a link to all related pages. */
virtual QCString trRelatedPages()
- /* ?? ÷ÁÒÉÁÎÔ ÐÅÒÅ×ÏÄÁ "óÍ. ÔÁËÖÅ: " ÂÏÌÅÅ ÕÄÁÞÎÙÊ, ÎÏ ÎÅ × ÚÁÇÏÌÏ×ËÅ,
- ËÁË × ÄÁÎÎÏÍ ÓÌÕÞÁÅ. */
- { return decode("äÏÄÁÔËÏ×Á ¦ÎÆÏÒÍÁæÑ"); }
+ /* ?? Вариант перевода "См. также: " более удачный, но не в заголовке,
+ как в данном Ñлучае. */
+ { return "Додаткова інформаціÑ"; }
/*! This is put above each page as a link to all examples. */
virtual QCString trExamples()
- { return decode("ðÒÉËÌÁÄÉ"); }
+ { return "Приклади"; }
/*! This is put above each page as a link to the search engine. */
virtual QCString trSearch()
- { return decode("ðÏÛÕË"); }
+ { return "Пошук"; }
/*! This is an introduction to the class hierarchy. */
virtual QCString trClassHierarchyDescription()
- { return decode("óÐÉÓÏË ÕÓÐÁÄËÕ×ÁÎØ ×ÐÏÒÑÄËÏ×ÁÎÏ ÎÁÂÌÉÖÅÎÏ ÄÏ ÁÌÆÁצÔÕ"); }
+ { return "СпиÑок уÑпадкувань впорÑдковано наближено до алфавіту"; }
/*! This is an introduction to the list with all files. */
virtual QCString trFileListDescription(bool extractAll)
{
- QCString result="ðÏ×ÎÉÊ ÓÐÉÓÏË ";
- if (!extractAll) result+="ÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ";
- result+="ÆÁÊ̦×.";
- return decode(result);
+ QCString result="Повний ÑпиÑок ";
+ if (!extractAll) result+="документованих ";
+ result+="файлів.";
+ return result;
}
/*! This is an introduction to the annotated compound list. */
@@ -234,117 +208,106 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ Ú ËÏÒÏÔËÉÍ ÏÐÉÓÏÍ." );
+ return "Структури даних з коротким опиÑом." ;
}
else
{
- return decode( "ëÌÁÓÉ, ÓÔÒÕËÔÕÒÉ, ÏÂ'¤ÄÎÁÎÎÑ ÔÁ ¦ÎÔÅÒÆÅÊÓÉ Ú ËÏÒÏÔËÉÍ ÏÐÉÓÏÍ." );
+ return "КлаÑи, Ñтруктури, об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ‚Ð° інтерфейÑи з коротким опиÑом." ;
}
}
/*! This is an introduction to the page with all class members. */
virtual QCString trCompoundMembersDescription(bool extractAll)
{
- QCString result="óÐÉÓÏË ×Ó¦È ";
- if(!extractAll) result+="ÄÏËÕÍÅÎÔÏÁÎÉÈ ";
+ QCString result="СпиÑок вÑÑ–Ñ… ";
+ if(!extractAll) result+="документоаних ";
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- result+="ÅÌÅÍÅÎÔ¦× ÓÔÒÕËÔÕÒ ÄÁÎÉÈ Ú ÐÏÓÉÌÁÎÎÑÍ ÎÁ ";
+ result+="елементів Ñтруктур даних з поÑиланнÑм на ";
else
- result+="ÅÌÅÍÅÎÔ¦× ËÌÁÓ¦× ÄÁÎÉÈ Ú ÐÏÓÉÌÁÎÎÑÍ ÎÁ ";
+ result+="елементів клаÑів даних з поÑиланнÑм на ";
if(extractAll)
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- result+="ÄÏËÕÍÅÎÔÁæÀ ÐÏ ÓÔÒÕËÔÕÒ¦/ÏÂ'¤ÄÎÁÎÎÀ ËÏÖÎÏÇÏ ÅÌÅÍÅÎÔÕ.";
+ result+="документацію по Ñтруктурі/об'єднанню кожного елементу.";
else
- result+="ÄÏËÕÍÅÎÔÁæÀ ÐÏ ËÌÁÓÕ ËÏÖÎÏÇÏ ÅÌÅÍÅÎÔÕ.";
+ result+="документацію по клаÑу кожного елементу.";
}
else
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- result += "צÄÐÏצÄΦ ÓÔÒÕËÔÕÒÉ";
+ result += "відповідні Ñтруктури";
else
- result += "צÄÐÏצÄΦ ËÌÁÓÉ";
- result+=", ÄÏ ÑËÉÈ ×ÏÎÉ ÎÁÌÅÖÁÔØ.";
+ result += "відповідні клаÑи";
+ result+=", до Ñких вони належать.";
}
- return decode( result );
+ return result ;
}
/*! This is an introduction to the page with all file members. */
virtual QCString trFileMembersDescription(bool extractAll)
{
- QCString result="óÐÉÓÏË ×Ó¦È ";
- if (!extractAll) result+="ÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ";
+ QCString result="СпиÑок вÑÑ–Ñ… ";
+ if (!extractAll) result+="документованих ";
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- result+="ÆÕÎËæÊ, ÚͦÎÎÉÈ, ÍÁËÒÏÏÚÎÁÞÅÎØ, "
- "ÐÅÒÅÌ¦Ë¦× ¦ ÏÚÎÁÞÅÎØ ÔÉЦ×";
+ result+="функцій, змінних, макровизначень, "
+ "переліків і визначень типів";
}
else
{
- result+="ÅÌÅÍÅÎÔ¦× ÆÁÊÌ¦× ";
+ result+="елементів файлів ";
}
- result+=" Ú ÐÏÓÉÌÁÎÑÍ ÎÁ ";
+ result+=" з поÑиланÑм на ";
if (extractAll)
- result+="ÆÁÊÌÉ, ÄÏ ÑËÉÈ ×ÏÎÉ ÎÁÌÅÖÁÔØ.";
+ result+="файли, до Ñких вони належать.";
else
- result+="ÄÏËÕÍÅÎÔÁæÀ.";
- return decode( result );
+ result+="документацію.";
+ return result ;
}
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÚÁÇÏÌÏ×ÏÞÎÉÈ ÆÁÊ̦×."); }
-
/*! This is an introduction to the page with the list of all examples */
virtual QCString trExamplesDescription()
- { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÐÒÉËÌÁĦ×."); }
+ { return "Повний ÑпиÑок прикладів."; }
/*! This is an introduction to the page with the list of related pages */
virtual QCString trRelatedPagesDescription()
- { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÄÏÄÁÔËÏ×ÉÈ ÏÐÉÓ¦×."); }
+ { return "Повний ÑпиÑок додаткових опиÑів."; }
/*! This is an introduction to the page with the list of class/file groups */
virtual QCString trModulesDescription()
- { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÍÏÄÕ̦×."); }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return decode("ïÐÉÓ ×¦ÄÓÕÔΦÊ"); }
-
- // index titles (the project name is prepended for these)
+ { return "Повний ÑпиÑок модулів."; }
+ // index titles (the project name is prepended for these)
/*! This is used in HTML as the title of index.html. */
virtual QCString trDocumentation()
- { return decode("äÏËÕÍÅÎÔÁæÑ"); }
+ { return "ДокументаціÑ"; }
- /*! This is used in LaTeX as the title of the chapter with the
+ /*! This is used in LaTeX as the title of the chapter with the
* index of all groups.
*/
virtual QCString trModuleIndex()
- { return decode("áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ÍÏÄÕ̦×"); }
+ { return "Ðлфавітний покажчик модулів"; }
- /*! This is used in LaTeX as the title of the chapter with the
+ /*! This is used in LaTeX as the title of the chapter with the
* class hierarchy.
*/
virtual QCString trHierarchicalIndex()
- { return decode("¶¤ÒÁÒȦÞÎÉÊ ÐÏËÁÖÞÉË ËÌÁÓ¦×"); }
+ { return "Ієрархічний покажчик клаÑів"; }
- /*! This is used in LaTeX as the title of the chapter with the
+ /*! This is used in LaTeX as the title of the chapter with the
* annotated compound index.
*/
virtual QCString trCompoundIndex()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return decode( "áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ÓÔÒÕËÔÕÒ ÄÁÎÉÈ" );
+ return "Ðлфавітний покажчик Ñтруктур даних" ;
}
else
{
- return decode( "áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ËÌÁÓ¦×" );
+ return "Ðлфавітний покажчик клаÑів" ;
}
}
@@ -352,13 +315,13 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
* list of all files.
*/
virtual QCString trFileIndex()
- { return decode( "ðÏËÁÖÞÉË ÆÁÊÌ×" ); }
+ { return "Покажчик файлв" ; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all groups.
*/
virtual QCString trModuleDocumentation()
- { return decode("ðÒÏÇÒÁÍΦ íÏÄÕ̦"); }
+ { return "Програмні Модулі"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all classes, structs and unions.
@@ -367,11 +330,11 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" );
+ return "Структури даних" ;
}
else
{
- return decode( "ëÌÁÓÉ" );
+ return "КлаÑи" ;
}
}
@@ -379,230 +342,214 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
* the documentation of all files.
*/
virtual QCString trFileDocumentation()
- { return decode("æÁÊÌÉ"); }
+ { return "Файли"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all examples.
*/
virtual QCString trExampleDocumentation()
- { return decode("ðÒÉËÌÁÄÉ"); }
+ { return "Приклади"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all related pages.
*/
virtual QCString trPageDocumentation()
- { return decode("äÏËÕÍÅÎÔÁÃ¦Ñ ÐÏ ÔÅͦ"); }
+ { return "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ð¿Ð¾ темі"; }
/*! This is used in LaTeX as the title of the document */
virtual QCString trReferenceManual()
- { return decode("äÏצÄËÏ×ÉÊ ÐÏÓ¦ÂÎÉË"); }
+ { return "Довідковий поÑібник"; }
- /*! This is used in the documentation of a file as a header before the
+ /*! This is used in the documentation of a file as a header before the
* list of defines
*/
virtual QCString trDefines()
- { return decode("íÁËÒÏÏÚÎÁÞÅÎÎÑ"); }
+ { return "МакровизначеннÑ"; }
- /*! This is used in the documentation of a file as a header before the
+ /*! This is used in the documentation of a file as a header before the
* list of function prototypes
*/
virtual QCString trFuncProtos()
- { return decode("ðÒÏÔÏÔÉÐÉ ÆÕËæÊ"); }
+ { return "Прототипи фукцій"; }
- /*! This is used in the documentation of a file as a header before the
+ /*! This is used in the documentation of a file as a header before the
* list of typedefs
*/
virtual QCString trTypedefs()
- { return decode("ïÚÎÁÞÅÎÎÑ ÔÉЦ×"); }
+ { return "Ð’Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð²"; }
- /*! This is used in the documentation of a file as a header before the
+ /*! This is used in the documentation of a file as a header before the
* list of enumerations
*/
virtual QCString trEnumerations()
- { return decode("ðÅÒÅ̦ËÉ"); }
+ { return "Переліки"; }
- /*! This is used in the documentation of a file as a header before the
+ /*! This is used in the documentation of a file as a header before the
* list of (global) functions
*/
virtual QCString trFunctions()
- { return decode("æÕÎËæ§"); }
+ { return "Функції"; }
- /*! This is used in the documentation of a file as a header before the
+ /*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
virtual QCString trVariables()
- { return decode("úͦÎΦ"); }
+ { return "Змінні"; }
- /*! This is used in the documentation of a file as a header before the
+ /*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
virtual QCString trEnumerationValues()
- { return decode("åÌÅÍÅÎÔÉ ÐÅÒÅ̦˦×"); }
+ { return "Елементи переліків"; }
/*! This is used in the documentation of a file before the list of
* documentation blocks for defines
*/
virtual QCString trDefineDocumentation()
- { return decode("ïÐÉÓ ÍÁËÒÏÏÚÎÁÞÅÎØ"); }
+ { return "ÐžÐ¿Ð¸Ñ Ð¼Ð°ÐºÑ€Ð¾Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ"; }
- /*! This is used in the documentation of a file/namespace before the list
+ /*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for function prototypes
*/
virtual QCString trFunctionPrototypeDocumentation()
- { return decode("ïÐÉÓ ÐÒÏÔÏÔÉÐ¦× ÆÕÎËæÊ"); }
+ { return "ÐžÐ¿Ð¸Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾Ñ‚Ð¸Ð¿Ñ–Ð² функцій"; }
- /*! This is used in the documentation of a file/namespace before the list
+ /*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for typedefs
*/
virtual QCString trTypedefDocumentation()
- { return decode("ïÐÉÓ ÏÚÎÁÞÅÎØ ÔÉЦ×"); }
+ { return "ÐžÐ¿Ð¸Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ типів"; }
- /*! This is used in the documentation of a file/namespace before the list
+ /*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration types
*/
virtual QCString trEnumerationTypeDocumentation()
- { return decode("ïÐÉÓ ÐÅÒÅ̦˦×"); }
+ { return "ÐžÐ¿Ð¸Ñ Ð¿ÐµÑ€ÐµÐ»Ñ–ÐºÑ–Ð²"; }
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return decode("ïÐÉÓ ÅÌÅÍÅÎÔ¦× ÐÅÒÅ̦ËÕ"); }
-
- /*! This is used in the documentation of a file/namespace before the list
+ /*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for functions
*/
virtual QCString trFunctionDocumentation()
- { return decode("ïÐÉÓ ÆÕÎËæÊ"); }
+ { return "ÐžÐ¿Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹"; }
- /*! This is used in the documentation of a file/namespace before the list
+ /*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for variables
*/
virtual QCString trVariableDocumentation()
- { return decode("ïÐÉÓ ÚͦÎÎÉÈ"); }
+ { return "ÐžÐ¿Ð¸Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¸Ñ…"; }
- /*! This is used in the documentation of a file/namespace/group before
+ /*! This is used in the documentation of a file/namespace/group before
* the list of links to documented compounds
*/
virtual QCString trCompounds()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" );
+ return "Структури даних" ;
}
else
- {
- return decode( "ëÌÁÓÉ" );
+ {
+ return "КлаÑи" ;
}
}
- /*! This is used in the documentation of a group before the list of
+ /*! This is used in the documentation of a group before the list of
* links to documented files
*/
- /*! This is used in the standard footer of each page and indicates when
- * the page was generated
+ /*! This is used in the standard footer of each page and indicates when
+ * the page was generated
*/
virtual QCString trGeneratedAt(const char *date,const char *projName)
- {
- QCString result=decode("äÏËÕÍÅÎÔÁÃ¦Ñ ");
- if (projName) result+=decode("ÄÏ ")+projName;
- result+=decode(" ÓÔ×ÏÒÅÎÁ ")+date;
- result+=decode(" ÓÉÓÔÅÍÏÀ");
+ {
+ QCString result="Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ ";
+ if (projName) result+=QCString("до ")+projName;
+ result+=QCString(" Ñтворена ")+date;
+ result+=" ÑиÑтемою";
return result;
}
/*! This is part of the sentence used in the standard footer of each page.
*/
virtual QCString trWrittenBy()
{
- return decode("á×ÔÏÒ:");
+ return "Ðвтор:";
}
/*! this text is put before a class diagram */
virtual QCString trClassDiagram(const char *clName)
{
- return decode("óÈÅÍÁ ÕÓÐÁÄËÕ×ÁÎØ ÄÌÑ ")+clName;
+ return QCString("Схема уÑпадкувань Ð´Ð»Ñ ")+clName;
}
/*! this text is generated when the \\internal command is used. */
virtual QCString trForInternalUseOnly()
- { return decode("ô¦ÌØËÉ ÄÌÑ ×ÎÕÔÒ¦ÛÎØÏÇÏ ËÏÒÉÓÔÕ×ÁÎÎÑ"); }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- /*??*/
- { return decode("úͦÎÅÎÏ Ú ×ÎÕÔÒ¦ÛÎ¦È ÐÒÉÞÉÎ. úͦÎÉ ÎÅ ÔÏÒËÁÀÔØÓÑ API.");
- }
+ { return "Тільки Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ кориÑтуваннÑ"; }
/*! this text is generated when the \\warning command is used. */
virtual QCString trWarning()
- { return decode("úÁÓÔÅÒÅÖÅÎÎÑ"); }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return decode("ðÏÍÉÌËÉ ÔÁ ÏÂÍÅÖÅÎÎÑ ÚÁÓÔÏÓÕ×ÁÎÎÑ"); }
+ { return "ЗаÑтереженнÑ"; }
/*! this text is generated when the \\version command is used. */
virtual QCString trVersion()
- { return decode("÷ÅÒÓ¦Ñ"); }
+ { return "ВерÑÑ–Ñ"; }
/*! this text is generated when the \\date command is used. */
virtual QCString trDate()
- { return decode("äÁÔÁ"); }
+ { return "Дата"; }
/*! this text is generated when the \\return command is used. */
virtual QCString trReturns()
- { return decode("ðÏ×ÅÒÔÁ¤"); }
+ { return "Повертає"; }
/*! this text is generated when the \\sa command is used. */
virtual QCString trSeeAlso()
- { return decode("äÉ×. ÔÁËÏÖ"); }
+ { return "Див. також"; }
/*! this text is generated when the \\param command is used. */
virtual QCString trParameters()
- { return decode("áÒÇÕÍÅÎÔÉ"); }
+ { return "Ðргументи"; }
/*! this text is generated when the \\exception command is used. */
virtual QCString trExceptions()
- { return decode("ïÂÒÏÂËÁ ×ÉÎÑÔËÏ×ÉÈ ÓÉÔÕÁæÊ"); }
+ { return "Обробка винÑткових Ñитуацій"; }
/*! this text is used in the title page of a LaTeX document. */
virtual QCString trGeneratedBy()
- { return decode("óÔ×ÏÒÅÎÏ ÓÉÓÔÅÍÏÀ"); }
-
+ { return "Створено ÑиÑтемою"; }
+
//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
+// new since 0.49-990307
//////////////////////////////////////////////////////////////////////////
-
+
/*! used as the title of page containing all the index of all namespaces. */
virtual QCString trNamespaceList()
- { return decode("ðÒÏÓÔ¦Ò ¦ÍÅÎ"); }
+ { return "ПроÑÑ‚Ñ–Ñ€ імен"; }
/*! used as an introduction to the namespace list */
virtual QCString trNamespaceListDescription(bool extractAll)
{
- QCString result="ðÏ×ÎÉÊ ÐÅÒÅÌ¦Ë ";
- if (!extractAll) result+="ÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ";
- result+="ÐÒÏÓÔÏÒ¦× ¦ÍÅÎ.";
- return decode(result);
+ QCString result="Повний ÑпиÑок ";
+ if (!extractAll) result+="документованих ";
+ result+="проÑторів імен.";
+ return result;
}
/*! used in the class documentation as a header before the list of all
* friends of a class
*/
virtual QCString trFriends()
- { return decode("äÒÕÖΦ ËÌÁÓÉ"); }
+ { return "Дружні клаÑи"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990405
//////////////////////////////////////////////////////////////////////////
-
+
/*! used in the class documentation as a header before the list of all
- * related classes
+ * related classes
*/
virtual QCString trRelatedFunctionDocumentation()
- { return decode("äÏËÕÍÅÎÔÁÃÉÑ ÄÏ ÄÒÕÖÎ¦È ËÌÁÓ¦× ÔÁ צÄÐÏצÄÎÉÈ ÆÕÎËæÊ"); }
-
+ { return "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð´Ð¾ дружніх клаÑів та відповідних функцій"; }
+
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990425
//////////////////////////////////////////////////////////////////////////
@@ -613,70 +560,72 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
bool isTemplate)
{
QCString result;
- if (isTemplate)
+ if (isTemplate)
{
- result="ûÁÂÌÏÎ ";
+ result="Шаблон ";
switch(compType)
{
- case ClassDef::Class: result+="ËÌÁÓÕ"; break;
- case ClassDef::Struct: result+="ÓÔÒÕËÔÕÒÉ"; break;
- case ClassDef::Union: result+="ÏÂ'¤ÄÎÁÎÎÑ"; break;
- case ClassDef::Interface: result+="¦ÎÔÅÒÆÅÊÓÕ"; break;
- case ClassDef::Protocol: result+="ÐÒÏÔÏËÏÌÕ"; break;
- case ClassDef::Category: result+="ËÁÔÅÇÏÒ¦§"; break;
- case ClassDef::Exception: result+="÷ÉÎÑÔÏË"; break;
+ case ClassDef::Class: result+="клаÑу"; break;
+ case ClassDef::Struct: result+="Ñтруктури"; break;
+ case ClassDef::Union: result+="об'єднаннÑ"; break;
+ case ClassDef::Interface: result+="інтерфейÑу"; break;
+ case ClassDef::Protocol: result+="протоколу"; break;
+ case ClassDef::Category: result+="категорії"; break;
+ case ClassDef::Exception: result+="ВинÑток"; break;
+ default: break;
}
}
else
{
switch(compType)
{
- case ClassDef::Class: result+="ëÌÁÓ"; break;
- case ClassDef::Struct: result+="óÔÒÕËÔÕÒÁ"; break;
- case ClassDef::Union: result+="ïÂ'¤ÄÎÁÎÎÑ"; break;
- case ClassDef::Interface: result+="¶ÎÔÅÒÆÅÊÓ"; break;
- case ClassDef::Protocol: result+="ðÒÏÔÏËÏÌ"; break;
- case ClassDef::Category: result+="ëÁÔÅÇÏÒ¦Ñ"; break;
- case ClassDef::Exception: result+="÷ÉÎÑÔÏË"; break;
+ case ClassDef::Class: result+="КлаÑ"; break;
+ case ClassDef::Struct: result+="Структура"; break;
+ case ClassDef::Union: result+="Об'єднаннÑ"; break;
+ case ClassDef::Interface: result+="ІнтерфейÑ"; break;
+ case ClassDef::Protocol: result+="Протокол"; break;
+ case ClassDef::Category: result+="КатегоріÑ"; break;
+ case ClassDef::Exception: result+="ВинÑток"; break;
+ default: break;
}
}
result+=" ";
- return decode(result)+clName;
+ return result+clName;
}
/*! used as the title of the HTML page of a file */
virtual QCString trFileReference(const char *fileName)
{
- return decode("æÁÊÌ ")+fileName;
+ return QCString("Файл ")+fileName;
}
/*! used as the title of the HTML page of a namespace */
virtual QCString trNamespaceReference(const char *namespaceName)
{
- return decode("ðÒÏÓÔ¦Ò ¦ÍÅÎ ")+namespaceName;
+ return QCString("ПроÑÑ‚Ñ–Ñ€ імен ")+namespaceName;
}
-
+
virtual QCString trPublicMembers()
- { return decode("úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÅÌÅÍÅÎÔÉ"); }
+ { return "ЗагальнодоÑтупні елементи"; }
virtual QCString trPublicSlots()
- { return decode("úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÓÌÏÔÉ"); }
+ { return "ЗагальнодоÑтупні Ñлоти"; }
virtual QCString trSignals()
- { return decode("óÉÇÎÁÌÉ"); }
+ { return "Сигнали"; }
virtual QCString trStaticPublicMembers()
- { return decode("úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÓÔÁÔÉÞΦ ÅÌÅÍÅÎÔÉ"); }
+ { return "ЗагальнодоÑтупні Ñтатичні елементи"; }
virtual QCString trProtectedMembers()
- { return decode("úÁÈÉÝÅΦ ÅÌÅÍÅÎÔÉ"); }
+ { return "Захищені елементи"; }
virtual QCString trProtectedSlots()
- { return decode("úÁÈÉÝÅΦ ÓÌÏÔÉ"); }
+ { return "Захищені Ñлоти"; }
virtual QCString trStaticProtectedMembers()
- { return decode("úÁÈÉÝÅΦ ÓÔÁÔÉÞΦ ÅÌÅÍÅÎÔÉ"); }
+ { return "Захищені Ñтатичні елементи"; }
virtual QCString trPrivateMembers()
- { return decode("ðÒÉ×ÁÔΦ ÅÌÅÍÅÎÔÉ"); }
+ { return "Приватні елементи"; }
virtual QCString trPrivateSlots()
- { return decode("ðÒÉ×ÁÔΦ ÓÌÏÔÉ"); }
+ { return "Приватні Ñлоти"; }
virtual QCString trStaticPrivateMembers()
- { return decode("ðÒÉ×ÁÔΦ ÓÔÁÔÉÞΦ ÅÌÅÍÅÎÔÉ"); }
-
+ { return "Приватні Ñтатичні елементи"; }
+
/*! this function is used to produce a comma-separated list of items.
* use generateMarker(i) to indicate where item i should be put.
*/
@@ -685,29 +634,29 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
QCString result;
int i;
// the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
+ for (i=0;i<numEntries;i++)
{
// use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
+ result+=generateMarker(i); // generate marker for entry i in the list
// (order is left to right)
-
+
if (i!=numEntries-1) // not the last entry, so we need a separator
{
- if (i<numEntries-2) // not the fore last entry
+ if (i<numEntries-2) // not the fore last entry
result+=", ";
else // the fore last entry
- result+=decode( " ¦ " );
+ result+= " Ñ– " ;
}
}
- return result;
+ return result;
}
-
+
/*! used in class documentation to produce a list of base classes,
* if class diagrams are disabled.
*/
virtual QCString trInheritsList(int numEntries)
{
- return decode("õÓÐÁÄËÏ×Õ¤ ËÌÁÓ ")+trWriteList(numEntries)+".";
+ return "УÑпадковує ÐºÐ»Ð°Ñ "+trWriteList(numEntries)+".";
}
/*! used in class documentation to produce a list of super classes,
@@ -715,15 +664,15 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
*/
virtual QCString trInheritedByList(int numEntries)
{
- return decode("õÓÐÁÄËÏ×ÁÎÏ ËÌÁÓÁÍÉ ")+trWriteList(numEntries)+".";
+ return "УÑпадковано клаÑами "+trWriteList(numEntries)+".";
}
- /*! used in member documentation blocks to produce a list of
+ /*! used in member documentation blocks to produce a list of
* members that are hidden by this one.
*/
virtual QCString trReimplementedFromList(int numEntries)
{
- return decode("ðÅÒÅÏÚÎÁÞÅÎÎÑ Ú ")+trWriteList(numEntries)+".";
+ return "ÐŸÐµÑ€ÐµÐ¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð· "+trWriteList(numEntries)+".";
}
/*! used in member documentation blocks to produce a list of
@@ -731,37 +680,37 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
*/
virtual QCString trReimplementedInList(int numEntries)
{
- return decode("ðÅÒÅÏÚÎÁÞÁ¤ÔØÓÑ × ")+trWriteList(numEntries)+".";
+ return "ПереозначаєтьÑÑ Ð² "+trWriteList(numEntries)+".";
}
/*! This is put above each page as a link to all members of namespaces. */
virtual QCString trNamespaceMembers()
- { return decode("åÌÅÍÅÎÔÉ ÐÒÏÓÔÏÒÕ ¦ÍÅÎ"); }
+ { return "Елементи проÑтору імен"; }
/*! This is an introduction to the page with all namespace members */
virtual QCString trNamespaceMemberDescription(bool extractAll)
{
- QCString result="ðÏ×ÎÉÊ ÐÅÒÅÌ¦Ë ";
- if (!extractAll) result+="ÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ";
- result+="ÅÌÅÍÅÔ¦× ÐÒÏÓÔÏÒÕ ¦ÍÅÎ Ú ÐÏÓÉÌÁÎÎÑÍ ";
- if (extractAll)
- result+="ÎÁ ÄÏËÕÍÅÎÔÁæÀ ÄÌÑ ËÏÖÎÏÇÏ ÅÌÅÍÅÎÔÕ:";
- else
- result+="ÎÁ ÐÒÏÓÔ¦Ò ¦ÍÅÎ ÄÏ ÑËÏÇÏ ×ÏÎÉ ÎÁÌÅÖÁÔØ:";
- return decode(result);
+ QCString result="Повний ÑпиÑок ";
+ if (!extractAll) result+="документованих ";
+ result+="елеметів проÑтору імен з поÑиланнÑм ";
+ if (extractAll)
+ result+="на документацію Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ елементу:";
+ else
+ result+="на проÑÑ‚Ñ–Ñ€ імен до Ñкого вони належать:";
+ return result;
}
- /*! This is used in LaTeX as the title of the chapter with the
+ /*! This is used in LaTeX as the title of the chapter with the
* index of all namespaces.
*/
virtual QCString trNamespaceIndex()
- { return decode("áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ÐÒÏÓÔÏÒÕ ¦ÍÅÎ"); }
+ { return "Ðлфавітний покажчик проÑтору імен"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all namespaces.
*/
virtual QCString trNamespaceDocumentation()
- { return decode("ïÐÉÓ ÐÒÏÓÔÏÒÕ ¦ÍÅÎ"); }
+ { return "ÐžÐ¿Ð¸Ñ Ð¿Ñ€Ð¾Ñтору імен"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990522
@@ -771,7 +720,7 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
* namespaces in a file.
*/
virtual QCString trNamespaces()
- { return decode( "ðÒÏÓÔÏÒÉ ¦ÍÅÎ" ); }
+ { return "ПроÑтори імен" ; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990728
@@ -784,41 +733,43 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
bool single)
{ // here s is one of " Class", " Struct" or " Union"
// single is true implies a single file
- QCString result=(QCString)"äÏËÕÍÅÎÔÁÃ¦Ñ ";
+ QCString result=(QCString)"Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ ";
switch(compType)
{
case ClassDef::Class:
- if (single) result+="ÃØÏÇÏ ËÌÁÓÕ"; else result+="ÃÉÈ ËÌÁÓ¦×";
+ if (single) result+="цього клаÑу"; else result+="цих клаÑів";
break;
case ClassDef::Struct:
- if (single) result+="椧 ÓÔÒÕËÔÕÒÉ"; else result+="ÃÉÈ ÓÔÒÕËÔÕÒ";
+ if (single) result+="цієї Ñтруктури"; else result+="цих Ñтруктур";
break;
case ClassDef::Union:
- if (single) result+="ÃØÏÇÏ ÏÂ'¤ÄÎÁÎÎÑ"; else result+="ÃÉÈ ÏÂ'¤ÄÎÁÎØ";
+ if (single) result+="цього об'єднаннÑ"; else result+="цих об'єднань";
break;
case ClassDef::Interface:
- if (single) result+="ÃØÏÇÏ ¦ÎÔÅÒÆÅÊÓÕ"; else result+="ÃÉÈ ¦ÎÔÅÒÆÅÊÓ¦×";
+ if (single) result+="цього інтерфейÑу"; else result+="цих інтерфейÑів";
+ break;
+ case ClassDef::Protocol:
+ if (single) result+="цього протоколу"; else result+="цих протоколів";
break;
- case ClassDef::Protocol:
- if (single) result+="ÃØÏÇÏ ÐÒÏÔÏËÏÌÕ"; else result+="ÃÉÈ ÐÒÏÔÏËÏ̦×";
- break;
case ClassDef::Category:
- if (single) result+="椧 ËÁÔÅÇÏÒ¦§"; else result+="ÃÉÈ ËÁÔÅÇÏÒ¦Ê";
- break;
+ if (single) result+="цієї категорії"; else result+="цих категорій";
+ break;
case ClassDef::Exception:
- if (single) result+="ÃØÏÇÏ ×ÉÎÑÔËÕ"; else result+="ÃÉÈ ×ÉÎÑÔ˦×";
+ if (single) result+="цього винÑтку"; else result+="цих винÑтків";
+ break;
+ default:
break;
}
- result+=" ÂÕÌÁ ÓÔ×ÏÒÅÎÁ Ú ÆÁÊÌ";
- if (single) result+="Õ:"; else result+="¦×:";
- return decode(result);
+ result+=" була Ñтворена з файл";
+ if (single) result+="у:"; else result+="ів:";
+ return result;
}
/*! This is in the (quick) index as a link to the alphabetical compound
* list.
*/
virtual QCString trAlphabeticalList()
- { return decode("áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË"); }
+ { return "Ðлфавітний покажчик"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990901
@@ -826,34 +777,30 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
/*! This is used as the heading text for the retval command. */
virtual QCString trReturnValues()
- { return decode("úÎÁÞÅÎÎÑ, ÝÏ ÐÏ×ÅÒÔÁÀÔØÓÑ"); }
+ { return "ЗначеннÑ, що повертаютьÑÑ"; }
/*! This is in the (quick) index as a link to the main page (index.html)
*/
virtual QCString trMainPage()
- { return decode("ôÉÔÕÌØÎÁ ÓÔÏÒ¦ÎËÁ"); }
+ { return "Титульна Ñторінка"; }
- /*! This is used in references to page that are put in the LaTeX
+ /*! This is used in references to page that are put in the LaTeX
* documentation. It should be an abbreviation of the word page.
*/
virtual QCString trPageAbbreviation()
- { return decode("ÓÔÏÒ."); }
+ { return "Ñтор."; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-991106
//////////////////////////////////////////////////////////////////////////
- virtual QCString trSources()
- {
- return decode("÷ÉȦÄΦ ÔÅËÓÔÉ.");
- }
virtual QCString trDefinedAtLineInSourceFile()
{
- return decode("äÉ×. ÏÚÎÁÞÅÎÎÑ × ÆÁÊ̦ @1, ÒÑÄÏË @0");
+ return "Див. Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² файлі @1, Ñ€Ñдок @0";
}
virtual QCString trDefinedInSourceFile()
{
- return decode("äÉ×. ÏÚÎÁÞÅÎÎÑ × ÆÁÊ̦ @0");
+ return "Див. Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² файлі @0";
}
//////////////////////////////////////////////////////////////////////////
@@ -862,7 +809,7 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
virtual QCString trDeprecated()
{
- return decode("îÅ ÒÅËÏÍÅÎÄÏ×ÁÎÏ");
+ return "Ðе рекомендовано";
}
//////////////////////////////////////////////////////////////////////////
@@ -872,120 +819,120 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
/*! this text is put before a collaboration diagram */
virtual QCString trCollaborationDiagram(const char *clName)
{
- return (QCString)decode("ä¦ÁÇÒÁÍÁ Ú×'ÑÚË¦× ËÌÁÓÕ ")+clName+":";
+ return (QCString)"Діаграма зв'Ñзків клаÑу "+clName+":";
}
/*! this text is put before an include dependency graph */
virtual QCString trInclDepGraph(const char *fName)
{
- return decode("ä¦ÁÇÒÁÍÁ ×ËÌÀÞÅÎÉÈ ÚÁÇÏÌÏ×ÏÞÎÉÈ ÆÁÊÌ¦× ÄÌÑ ")+fName+":";
+ return QCString("Діаграма включених заголовочних файлів Ð´Ð»Ñ ")+fName+":";
}
/*! header that is put before the list of constructor/destructors. */
virtual QCString trConstructorDocumentation()
{
- return decode("ëÏÎÓÔÒÕËÔÏÒ(É)");
+ return "КонÑтруктор(и)";
}
/*! Used in the file documentation to point to the corresponding sources. */
virtual QCString trGotoSourceCode()
{
- return decode("äÉ×. ×ÉȦÄΦ ÔÅËÓÔÉ.");
+ return "Див. вихідні текÑти.";
}
/*! Used in the file sources to point to the corresponding documentation. */
virtual QCString trGotoDocumentation()
{
- return decode("äÉ×. ÄÏËÕÍÅÎÔÁæÀ.");
+ return "Див. документацію.";
}
/*! Text for the \\pre command */
virtual QCString trPrecondition()
{
- return decode("ðÅÒÅÄÕÍÏ×É");
+ return "Передумови";
}
/*! Text for the \\post command */
virtual QCString trPostcondition()
{
- return decode("ð¦ÓÌÑÕÍÏ×É");
+ return "ПіÑлÑумови";
}
/*! Text for the \\invariant command */
virtual QCString trInvariant()
{
- return decode("¶Î×ÁÒ¦ÁÎÔ");
+ return "Інваріант";
}
/*! Text shown before a multi-line variable/enum initialization */
virtual QCString trInitialValue()
{
- return decode("ðÏÞÁÔËÏצ ÚÎÁÞÅÎÎÑ");
+ return "Початкові значеннÑ";
}
/*! Text used the source code in the file index */
virtual QCString trCode()
{
- return decode("÷ÉȦÄΦ ÔÅËÓÔÉ");
+ return "Вихідні текÑти";
}
virtual QCString trGraphicalHierarchy()
{
- return decode("çÒÁƦÞÎÁ ¦¤ÒÁÒÈ¦Ñ ËÌÁÓ¦×");
+ return "Графічна Ñ–Ñ”Ñ€Ð°Ñ€Ñ…Ñ–Ñ ÐºÐ»Ð°Ñів";
}
virtual QCString trGotoGraphicalHierarchy()
{
- return decode("ÄÉ×. ÇÒÁƦÞÎÕ ¦¤ÒÁÒȦÀ");
+ return "див. графічну ієрархію";
}
virtual QCString trGotoTextualHierarchy()
{
- return decode("ÄÉ×. ÔÅËÓÔÏ×Õ ¦¤ÒÁÒȦÀ");
+ return "див. текÑтову ієрархію";
}
virtual QCString trPageIndex()
{
- return decode("áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ÔÅÍÁÔÉÞÎÉÈ ÏÐÉÓ¦×");
+ return "Ðлфавітний покажчик тематичних опиÑів";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.1.0
//////////////////////////////////////////////////////////////////////////
-
+
virtual QCString trNote()
{
- return decode("îÏÔÁÔËÉ");
+ return "Ðотатки";
}
virtual QCString trPublicTypes()
{
- return decode("úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÔÉÐÉ");
+ return "ЗагальнодоÑтупні типи";
}
virtual QCString trPublicAttribs()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return decode( "ðÏÌÑ ÄÁÎÉÈ" );
+ return "ÐŸÐ¾Ð»Ñ Ð´Ð°Ð½Ð¸Ñ…" ;
}
else
{
- return decode( "úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÁÔÒÉÂÕÔÉ" );
+ return "ЗагальнодоÑтупні атрибути" ;
}
}
virtual QCString trStaticPublicAttribs()
{
- return decode("óÔÁÔÉÞΦ ÚÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÄÁÎΦ");
+ return "Статичні загальнодоÑтупні данні";
}
virtual QCString trProtectedTypes()
{
- return decode("úÁÈÉÝÅΦ ÔÉÐÉ");
+ return "Захищені типи";
}
virtual QCString trProtectedAttribs()
{
- return decode("úÁÈÉÝÅΦ ÄÁΦ");
+ return "Захищені дані";
}
virtual QCString trStaticProtectedAttribs()
{
- return decode("óÔÁÔÉÞΦ ÚÁÈÉÝÅΦ ÄÁΦ");
+ return "Статичні захищені дані";
}
virtual QCString trPrivateTypes()
{
- return decode("ðÒÉ×ÁÔΦ ÔÉÐÉ");
+ return "Приватні типи";
}
virtual QCString trPrivateAttribs()
{
- return decode("ðÒÉ×ÁÔΦ ÄÁΦ");
+ return "Приватні дані";
}
virtual QCString trStaticPrivateAttribs()
{
- return decode("ðÒÉ×ÁÔΦ ÓÔÁÔÉÞΦ ÄÁΦ");
+ return "Приватні Ñтатичні дані";
}
@@ -997,13 +944,13 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
virtual QCString trTodo()
/*??*/
{
- return decode("îÅÏÂȦÄÎÏ ÚÒÏÂÉÔÉ");
+ return "Ðеобхідно зробити";
}
/*! Used as the header of the todo list */
virtual QCString trTodoList()
/*??*/
{
- return decode("ðÅÒÅÌ¦Ë ÚÁ×ÄÁÎØ");
+ return "СпиÑок завдань";
}
//////////////////////////////////////////////////////////////////////////
@@ -1012,26 +959,26 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
virtual QCString trReferencedBy()
{
- return decode("÷ÖÉ×Á¤ÔØÓÑ ×");
+ return "ВживаєтьÑÑ Ð²";
}
virtual QCString trRemarks()
{
- return decode("ðÒÉÍ.");
+ return "Прим.";
}
virtual QCString trAttention()
{
- return decode("õ×ÁÇÁ");
+ return "Увага";
}
virtual QCString trInclByDepGraph()
{
- return decode("çÒÁÆ ÆÁÊ̦×, Ñ˦ ×ËÌÀÞÁÀÔØ ÃÅÊ ÆÁÊÌ:");
+ return "Граф файлів, Ñкі включають цей файл:";
}
virtual QCString trSince()
/*??*/
{
- return decode("ðÏÞÉÎÁÀÞÉ Ú");
+ return "Починаючи з";
}
-
+
//////////////////////////////////////////////////////////////////////////
// new since 1.1.5
//////////////////////////////////////////////////////////////////////////
@@ -1039,32 +986,32 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
/*! title of the graph legend page */
virtual QCString trLegendTitle()
{
- return decode("ìÅÇÅÎÄÁ");
+ return "Легенда";
}
/*! page explaining how the dot graph's should be interpreted */
virtual QCString trLegendDocs()
{
- return decode(
- "ðÏÚÎÁÞÅÎÎÑ, ÝÏ ×ÉËÏÒÉÓÔÏ×ÕÀÔØÓÑ Õ ÇÒÁÆÁÈ.<p>\n"
- "òÏÚÇÌÑÎÅÍÏ ÎÁÓÔÕÐÎÉÊ ÐÒÉËÌÁÄ:\n"
+ return
+ "ПозначеннÑ, що викориÑтовуютьÑÑ Ñƒ графах.<p>\n"
+ "РозглÑнемо наÑтупний приклад:\n"
"\\code\n"
- "/*! îÅ×ÉÄÉÍÉÊ ËÌÁÓ ÞÅÒÅÚ ÚÒ¦ÚÁÎÎÑ */\n"
+ "/*! Ðевидимий ÐºÐ»Ð°Ñ Ñ‡ÐµÑ€ÐµÐ· Ð·Ñ€Ñ–Ð·Ð°Ð½Ð½Ñ */\n"
"class Invisible { };\n\n"
- "/*! ïÂÍÅÖÅÎÉÊ ËÌÁÓ, צÄÎÏÛÅÎÎÑ ÕÓÐÁÄËÕ×ÁÎÎÑ ÐÒÉÈÏ×ÁÎÅ */\n"
+ "/*! Обмежений клаÑ, Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ ÑƒÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ñ…Ð¾Ð²Ð°Ð½Ðµ */\n"
"class Truncated : public Invisible { };\n\n"
- "/* îÅÄÏËÕÍÅÎÔÏ×ÁÎÉÊ ËÌÁÓ */\n"
+ "/* Ðедокументований ÐºÐ»Ð°Ñ */\n"
"class Undocumented { };\n\n"
- "/*! úÁÇÁÌØÎÏÄÏÓÔÕÐÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n"
+ "/*! ЗагальнодоÑтупне уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ */\n"
"class PublicBase : public Truncated { };\n\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
- "/*! úÁÈÉÝÅÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n"
+ "/*! Захищене уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ */\n"
"class ProtectedBase { };\n\n"
- "/*! ðÒÉ×ÁÔÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n"
+ "/*! Приватне уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ */\n"
"class PrivateBase { };\n\n"
- "/*! ëÌÁÓ, ÝÏ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ ËÌÁÓÏÍ Inherited */\n"
+ "/*! КлаÑ, що викориÑтовуєтьÑÑ ÐºÐ»Ð°Ñом Inherited */\n"
"class Used { };\n\n"
- "/*! ëÌÁÓ, ÝÏ ÕÓÐÁÄËÏ×Õ¤ ¦ÎÛ¦ ËÌÁÓÉ */\n"
+ "/*! КлаÑ, що уÑпадковує інші клаÑи */\n"
"class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n"
" private PrivateBase,\n"
@@ -1075,51 +1022,50 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
" Used *m_usedClass;\n"
"};\n"
"\\endcode\n"
- "ñËÝÏ \\c MAX_DOT_GRAPH_HEIGHT × ËÏÎƦÇÕÒÁæÊÎÏÍÕ ÆÁÊ̦ "
- "ÕÓÔÁÎÏ×ÌÅÎÅ ÎÁ 200, ÏÔÒÉÍÁ¤ÍÏ ÎÁÓÔÕÐÎÉÊ ÇÒÁÆ:"
+ "Таким чином, отримуємо наÑтупний граф:"
"<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
"<p>\n"
- "ðÒÑÍÏËÕÔÎÉËÉ × ÃØÏÍÕ ÇÒÁƦ ÍÁÀÔØ ÎÁÓÔÕÐÎÉÊ ÚͦÓÔ:\n"
+ "ПрÑмокутники в цьому графі мають наÑтупний зміÑÑ‚:\n"
"<ul>\n"
- "<li>úÁÐÏ×ÎÅÎÉÊ ÞÏÒÎÉÊ ÐÒÑÍÏËÕÔÎÉË ×¦ÄÏÂÒÁÖÁ¤ ÓÔÒÕËÔÕÒÕ ÁÂÏ ËÌÁÓ, "
- "ÄÌÑ ÑËÏÇÏ ÓÔ×ÏÒÅÎÏ ÇÒÁÆ.\n"
- "<li>ðÒÑÍÏËÕÔÎÉË Ú ÞÏÒÎÏÀ ÍÅÖÅÀ צÄÏÂÒÁÖÁ¤ ÄÏËÕÍÅÎÔÏ×ÁÎÕ ÓÔÒÕËÔÕÒÕ ÁÂÏ ËÌÁÓ.\n"
- "<li>ðÒÑÍÏËÕÔÎÉË Ú Ó¦ÒÏÀ ÍÅÖÅÀ צÄÏÂÒÁÖÁ¤ ÎÅÄÏËÕÍÅÎÔÏ×ÁÎÕ ÓÔÒÕËÔÕÒÕ ÁÂÏ ËÌÁÓ.\n"
- "<li>ðÒÑÍÏËÕÔÎÉË Ú ÞÅÒ×ÏÎÏÀ ÍÅÖÅÀ צÄÏÂÒÁÖÁ¤ ÄÏËÕÍÅÎÔÏ×ÁÎÕ ÓÔÒÕËÔÕÒÕ ÁÂÏ ËÌÁÓ, ÄÌÑ ÑËÉÈ\n"
- " ÎÅ ×Ó¦ ÓЦ×צÄÎÏÛÅÎÎÑ ÕÓÐÁÄËÕ×ÁÎÎÑ/ÚͦÓÔÕ ÐÏËÁÚÁΦ. çÒÁÆ ÚÒ¦ÚÁÎÉê, "
- "ÑËÝÏ ×¦Î ÎÅ ×ͦÝÁ¤ÔØÓÑ Õ ×ËÁÚÁΦ ÍÅÖ¦."
+ "<li>Заповнений чорний прÑмокутник відображає Ñтруктуру або клаÑ, "
+ "Ð´Ð»Ñ Ñкого Ñтворено граф.\n"
+ "<li>ПрÑмокутник з чорною межею відображає документовану Ñтруктуру або клаÑ.\n"
+ "<li>ПрÑмокутник з Ñірою межею відображає недокументовану Ñтруктуру або клаÑ.\n"
+ "<li>ПрÑмокутник з червоною межею відображає документовану Ñтруктуру або клаÑ, Ð´Ð»Ñ Ñких\n"
+ " не вÑÑ– ÑÐ¿Ñ–Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ ÑƒÑпадкуваннÑ/зміÑту показані. Граф зрізаниЙ, "
+ "Ñкщо він не вміщаєтьÑÑ Ñƒ вказані межі."
"</ul>\n"
- "óÔÒ¦ÌËÉ ÍÁÀÔØ ÎÁÓÔÕÐÎÉÊ ÚͦÓÔ:\n"
+ "Стрілки мають наÑтупний зміÑÑ‚:\n"
"<ul>\n"
- "<li>ôÅÍÎÏÓÉÎÑ ÓÔÒ¦ÌËÁ צÄÏÂÒÁÖÁ¤ צÄÎÏÛÅÎÎÑ ÚÁÇÁÌØÎÏÄÏÓÔÕÐÎÏÇÏ ÕÓÐÁÄËÕ×ÁÎÎÑ "
- "Í¦Ö Ä×ÏÍÁ ËÌÁÓÁÍÉ.\n"
- "<li>ôÅÍÎÏÚÅÌÅÎÁ ÓÔÒ¦ÌËÁ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ ÐÒÉ ÚÁÈÉÝÅÎÏÍÕ ÕÓÐÁÄËÕ×ÁÎΦ.\n"
- "<li>ôÅÍÎÏÞÅÒ×ÏÎÁ ÓÔÒ¦ÌËÁ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ ÐÒÉ ÐÒÉ×ÁÔÎÏÍÕ ÕÓÐÁÄËÕ×ÁÎΦ.\n"
- "<li>ðÕÒÐÕÒÎÁ ÓÔÒ¦ÌËÁ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ, ÑËÝÏ ËÌÁÓ Í¦ÓÔÉÔØÓÑ ×"
- "¦ÎÛÏÍÕ ËÌÁÓ¦ ÁÂÏ ÎÉÍ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ."
- "óÔÒ¦ÌËÁ ÅÔÉËÅÔÕ¤ÔØÓÑ ÚͦÎÎÏÀ, "
- "ÞÅÒÅÚ ÑËÕ ×¦ÄÂÕ×Á¤ÔØÓÑ ÄÏÓÔÕÐ ÄÏ ×ËÁÚÁÎϧ ÓÔÒÕËÔÕÒÉ ÁÂÏ ËÌÁÓÕ. \n"
- "</ul>\n");
+ "<li>ТемноÑÐ¸Ð½Ñ Ñтрілка відображає Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð·Ð°Ð³Ð°Ð»ÑŒÐ½Ð¾Ð´Ð¾Ñтупного уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ "
+ "між двома клаÑами.\n"
+ "<li>Темнозелена Ñтрілка викориÑтовуєтьÑÑ Ð¿Ñ€Ð¸ захищеному уÑпадкуванні.\n"
+ "<li>Темночервона Ñтрілка викориÑтовуєтьÑÑ Ð¿Ñ€Ð¸ приватному уÑпадкуванні.\n"
+ "<li>Пурпурна Ñтрілка викориÑтовуєтьÑÑ, Ñкщо ÐºÐ»Ð°Ñ Ð¼Ñ–ÑтитьÑÑ Ð²"
+ "іншому клаÑÑ– або ним викориÑтовуєтьÑÑ."
+ "Стрілка етикетуєтьÑÑ Ð·Ð¼Ñ–Ð½Ð½Ð¾ÑŽ, "
+ "через Ñку відбуваєтьÑÑ Ð´Ð¾Ñтуп до вказаної Ñтруктури або клаÑу. \n"
+ "</ul>\n";
}
/*! text for the link to the legend page */
virtual QCString trLegend()
{
- return decode("ÄÉ×. ÌÅÇÅÎÄÕ");
+ return "див. легенду";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.0
//////////////////////////////////////////////////////////////////////////
-
+
/*! Used as a marker that is put before a test item */
virtual QCString trTest()
{
- return decode("ôÅÓÔ");
+ return "ТеÑÑ‚";
}
/*! Used as the header of the test list */
virtual QCString trTestList()
{
- return decode("ðÅÒÅÌ¦Ë ÔÅÓÔ¦×");
+ return "СпиÑок теÑтів";
}
//////////////////////////////////////////////////////////////////////////
@@ -1129,7 +1075,7 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
/*! Used as a section header for KDE-2 IDL methods */
virtual QCString trDCOPMethods()
{
- return decode("DCOP íÅÔÏÄÉ");
+ return "DCOP Методи";
}
//////////////////////////////////////////////////////////////////////////
@@ -1139,79 +1085,69 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
/*! Used as a section header for IDL properties */
virtual QCString trProperties()
{
- return decode("÷ÌÁÓÔÉ×ÏÓÔ¦");
+ return "ВлаÑтивоÑÑ‚Ñ–";
}
/*! Used as a section header for IDL property documentation */
virtual QCString trPropertyDocumentation()
{
- return decode("ðÏ×ÎÉÊ ÐÅÒÅÌ¦Ë ×ÌÁÓÔÉ×ÏÓÔÅÊ");
+ return "Повний ÑпиÑок влаÑтивоÑтей";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.4
//////////////////////////////////////////////////////////////////////////
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return decode("¶ÎÔÅÒÆÅÊÓÉ");
- }
/*! Used for Java classes in the summary section of Java packages */
virtual QCString trClasses()
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" );
+ return "Структури даних" ;
}
else
{
- return decode( "ëÌÁÓÉ" );
+ return "КлаÑи" ;
}
}
/*! Used as the title of a Java package */
virtual QCString trPackage(const char *name)
{
- return decode("ðÁËÅÔ ")+name;
+ return QCString("Пакет ")+name;
}
/*! Title of the package index page */
virtual QCString trPackageList()
{
- return decode("ðÏ×ÎÉÊ ÐÅÒÅÌ¦Ë ÐÁËÅÔ¦×");
+ return "Повний ÑпиÑок пакетів";
}
/*! The description of the package index page */
virtual QCString trPackageListDescription()
{
- return decode("ðÏ×ÎÉÊ ÐÅÒÅÌ¦Ë ÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ÐÁËÅÔ¦×.");
+ return "Повний ÑпиÑок документованих пакетів.";
}
/*! The link name in the Quick links header for each page */
virtual QCString trPackages()
{
- return decode("ðÁËÅÔÉ");
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return decode("ïÐÉÓ ÐÁËÅÔ¦×");
+ return "Пакети";
}
/*! Text shown before a multi-line define */
virtual QCString trDefineValue()
{
- return decode("íÁËÒÏÏÚÎÁÞÅÎÎÑ:");
+ return "МакровизначеннÑ:";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.5
//////////////////////////////////////////////////////////////////////////
-
+
/*! Used as a marker that is put before a \\bug item */
virtual QCString trBug()
{
- return decode("äÅÆÅËÔ");
+ return "Дефект";
}
/*! Used as the header of the bug list */
virtual QCString trBugList()
{
- return decode("ðÅÒÅÌ¦Ë ÄÅÆÅËÔ¦×");
+ return "СпиÑок дефектів";
}
//////////////////////////////////////////////////////////////////////////
@@ -1230,103 +1166,92 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
/*! Used as header RTF general index */
virtual QCString trRTFGeneralIndex()
{
- return decode("ðÒÅÄÍÅÔÎÉÊ ÐÏËÁÖÞÉË");
+ return "Предметний покажчик";
}
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trClass(bool first_capital, bool singular)
- {
+ {
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- QCString result((first_capital ? "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" : "ÓÔÒÕËÔÕÒÉ ÄÁÎÉÈ"));
- return decode(result);
+ QCString result((first_capital ? "Структури даних" : "Ñтруктури даних"));
+ return result;
}
else
{
- QCString result((first_capital ? "ëÌÁÓ" : "ËÌÁÓ"));
- if(!singular) result+="É";
- return decode(result);
+ QCString result((first_capital ? "КлаÑ" : "клаÑ"));
+ if(!singular) result+="и";
+ return result;
}
}
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trFile(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "æÁÊÌ" : "ÆÁÊÌ"));
- if (!singular) result+="É";
- return decode(result);
+ {
+ QCString result((first_capital ? "Файл" : "файл"));
+ if (!singular) result+="и";
+ return result;
}
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "ðÒÏÓÔ" : "ÐÒÏÓÔ"));
- result+=(singular?"¦Ò ¦ÍÅÎ":"ÏÒÉ ¦ÍÅÎ");
- return decode(result);
+ {
+ QCString result((first_capital ? "ПроÑÑ‚" : "проÑÑ‚"));
+ result+=(singular?"ір імен":"ори імен");
+ return result;
}
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "çÒÕÐ" : "ÇÒÕÐ"));
- result+=(singular ? "Á" : "É");
- return decode(result);
+ {
+ QCString result((first_capital ? "Груп" : "груп"));
+ result+=(singular ? "а" : "и");
+ return result;
}
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trPage(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "óÔÏÒ¦ÎË" : "ÓÔÏÒ¦ÎË"));
- result+=(singular ? "Á" : "É");
- return decode(result);
+ {
+ QCString result((first_capital ? "Сторінк" : "Ñторінк"));
+ result+=(singular ? "а" : "и");
+ return result;
}
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trMember(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "åÌÅÍÅÎÔ" : "ÅÌÅÍÅÎÔ"));
- if (!singular) result+="É";
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "ðÏÌ" : "ÐÏÌ"));
- result+=(singular ? "Å" : "Ñ");
- return decode(result);
+ {
+ QCString result((first_capital ? "Елемент" : "елемент"));
+ if (!singular) result+="и";
+ return result;
}
/*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
+ * be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trGlobal(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "çÌÏÂÁÌØÎ" : "ÇÌÏÂÁÌØÎ"));
- result+=(singular ? "ÉÊ" : "¦");
- return decode(result);
+ {
+ QCString result((first_capital ? "Глобальн" : "глобальн"));
+ result+=(singular ? "ий" : "і");
+ return result;
}
//////////////////////////////////////////////////////////////////////////
@@ -1336,10 +1261,10 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
/*! This text is generated when the \\author command is used and
* for the author section in man pages. */
virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "á×ÔÏÒ" : "Á×ÔÏÒ"));
- if (!singular) result+="É";
- return decode(result);
+ {
+ QCString result((first_capital ? "Ðвтор" : "автор"));
+ if (!singular) result+="и";
+ return result;
}
//////////////////////////////////////////////////////////////////////////
@@ -1350,19 +1275,19 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
*/
virtual QCString trReferences()
{
- return "÷ÉËÏÒÉÓÔÏ×Õ¤";
+ return "ВикориÑтовує";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.13
//////////////////////////////////////////////////////////////////////////
- /*! used in member documentation blocks to produce a list of
+ /*! used in member documentation blocks to produce a list of
* members that are implemented by this one.
*/
virtual QCString trImplementedFromList(int numEntries)
{
- return "òÅÁ̦ÚÕ¤ " + trWriteList(numEntries) + ".";
+ return "Реалізує " + trWriteList(numEntries) + ".";
}
/*! used in member documentation blocks to produce a list of
@@ -1370,7 +1295,7 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
*/
virtual QCString trImplementedInList(int numEntries)
{
- return "òÅÁ̦ÚÕ¤ × " + trWriteList(numEntries) + ".";
+ return "Реалізує в " + trWriteList(numEntries) + ".";
}
//////////////////////////////////////////////////////////////////////////
@@ -1382,37 +1307,37 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
*/
virtual QCString trRTFTableOfContents()
{
- return "úͦÓÔ";
+ return "ЗміÑÑ‚";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.17
//////////////////////////////////////////////////////////////////////////
- /*! Used as the header of the list of item that have been
- * flagged deprecated
+ /*! Used as the header of the list of item that have been
+ * flagged deprecated
*/
virtual QCString trDeprecatedList()
{
- return "úÁÓÔÁҦ̦ ÅÌÅÍÅÎÔÉ";
+ return "ЗаÑтарілі елементи";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.18
//////////////////////////////////////////////////////////////////////////
- /*! Used as a header for declaration section of the events found in
+ /*! Used as a header for declaration section of the events found in
* a C# program
*/
virtual QCString trEvents()
{
- return "ðÏĦ§";
+ return "Події";
}
/*! Header used for the documentation section of a class' events. */
virtual QCString trEventDocumentation()
{
- return "äÏËÕÍÅÎÔÁÃ¦Ñ ÐÏĦÊ";
+ return "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ð¿Ð¾Ð´Ñ–Ð¹";
}
//////////////////////////////////////////////////////////////////////////
@@ -1422,83 +1347,83 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
/*! Used as a heading for a list of Java class types with package scope.
*/
virtual QCString trPackageTypes()
- {
- return "ôÉÐÉ ÐÁËÅÔ¦×";
+ {
+ return "Типи пакетів";
}
- /*! Used as a heading for a list of Java class functions with package
- * scope.
+ /*! Used as a heading for a list of Java class functions with package
+ * scope.
*/
virtual QCString trPackageMembers()
- {
- return "æÕÎËæ§ ÐÁËÅÔ¦×";
+ {
+ return "Функції пакетів";
}
- /*! Used as a heading for a list of static Java class functions with
+ /*! Used as a heading for a list of static Java class functions with
* package scope.
*/
virtual QCString trStaticPackageMembers()
- {
- return "óÔÁÔÉÞΦ ÆÕÎËæÀ ÐÁËÅÔ¦×";
+ {
+ return "Статичні функцію пакетів";
}
-
- /*! Used as a heading for a list of Java class variables with package
+
+ /*! Used as a heading for a list of Java class variables with package
* scope.
*/
virtual QCString trPackageAttribs()
{
- return "áÔÒÉÂÕÔÉ ÐÁËÅÔ¦×";
+ return "Ðтрибути пакетів";
}
-
- /*! Used as a heading for a list of static Java class variables with
+
+ /*! Used as a heading for a list of static Java class variables with
* package scope.
*/
virtual QCString trStaticPackageAttribs()
{
- return "óÔÁÔÉÞΦ ÁÔÒÉÂÕÔÉ ÐÁËÅÔ¦×";
+ return "Статичні атрибути пакетів";
}
-
+
//////////////////////////////////////////////////////////////////////////
// new since 1.3.1
//////////////////////////////////////////////////////////////////////////
- /*! Used in the quick index of a class/file/namespace member list page
+ /*! Used in the quick index of a class/file/namespace member list page
* to link to the unfiltered list of all members.
*/
virtual QCString trAll()
{
- return "÷Ó¦";
+ return "Ð’ÑÑ–";
}
/*! Put in front of the call graph for a function. */
virtual QCString trCallGraph()
{
- return "çÒÁÆ ×Ó¦È ×ÉËÌÉË¦× Ã¦¤§ ÆÕÎËæ§:";
+ return "Граф вÑÑ–Ñ… викликів цієї функції:";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.3.3
//////////////////////////////////////////////////////////////////////////
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
+ /*! When the search engine is enabled this text is put in the header
+ * of each page before the field where one can enter the text to search
+ * for.
*/
virtual QCString trSearchForIndex()
{
- return "ûÕËÁÔÉ";
+ return "Шукати";
}
/*! This string is used as the title for the page listing the search
* results.
*/
virtual QCString trSearchResultsTitle()
{
- return "òÅÚÕÌØÔÁÔÉ ÐÏÛÕËÕ";
+ return "Результати пошуку";
}
/*! This string is put just before listing the search results. The
* text can be different depending on the number of documents found.
* Inside the text you can put the special marker $num to insert
* the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
+ * The @a numDocuments parameter can be either 0, 1 or 2, where the
* value 2 represents 2 or more matches. HTML markup is allowed inside
* the returned string.
*/
@@ -1506,24 +1431,24 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
{
if (numDocuments==0)
{
- return "îÅ ÚÎÁÊÄÅÎÏ ÄÏËÕÍÅÎÔ¦× ×¦ÄÐÏצÄÎÏ ÄÏ ×ÁÛÏÇÏ ÚÁÐÉÔÕ.";
+ return "Ðе знайдено документів відповідно до вашого запиту.";
}
else if (numDocuments==1)
{
- return "âÕÌÏ ÚÎÁÊÄÅÎÏ <b>1</b> ÄÏËÕÍÅÎÔ ×¦ÄÐÏצÄÎÏ ÄÏ ×ÁÛÏÇÏ ÚÁÐÉÔÕ.";
+ return "Було знайдено <b>1</b> документ відповідно до вашого запиту.";
}
- else
+ else
{
- return "âÕÌÏ ÚÎÁÊÄÅÎÏ <b>$num</b> ÄÏËÕÍÅÎÔ¦× ×¦ÄÐÏצÄÎÏ ÄÏ ×ÁÛÏÇÏ ÚÁÐÉÔÕ. "
- "îÁÊËÒÁݦ צÄÐÏצÄÎÏÓÔ¦ ÐÏËÁÚÁÎÏ ÓÐÏÞÁÔËÕ.";
+ return "Було знайдено <b>$num</b> документів відповідно до вашого запиту. "
+ "Ðайкращі відповідноÑÑ‚Ñ– показано Ñпочатку.";
}
}
- /*! This string is put before the list of matched words, for each search
+ /*! This string is put before the list of matched words, for each search
* result. What follows is the list of words that matched the query.
*/
virtual QCString trSearchMatches()
{
- return "÷¦ÄÐÏצÄΦÓÔØ:";
+ return "ВідповідніÑÑ‚ÑŒ:";
}
//////////////////////////////////////////////////////////////////////////
@@ -1534,7 +1459,7 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
*/
virtual QCString trSourceFile(QCString& filename)
{
- return "ôÅËÓÔ ÐÒÏÇÒÁÍÉ "+filename;
+ return "ТекÑÑ‚ програми "+filename;
}
//////////////////////////////////////////////////////////////////////////
@@ -1545,43 +1470,500 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
* hierarchy.
*/
virtual QCString trDirIndex()
- { return "äÅÒÅ×Ï ËÁÔÁÌÏǦ×"; }
+ { return "Дерево каталогів"; }
/*! This is used as the name of the chapter containing the documentation
* of the directories.
*/
virtual QCString trDirDocumentation()
- { return "äÏËÕÍÅÎÔÁÃ¦Ñ ËÁÔÁÌÏǦ×"; }
+ { return "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñ–Ð²"; }
/*! This is used as the title of the directory index and also in the
* Quick links of a HTML page, to link to the directory hierarchy.
*/
virtual QCString trDirectories()
- { return "ëÁÔÁÌÏÇÉ"; }
+ { return "Каталоги"; }
- /*! This returns a sentences that introduces the directory hierarchy.
+ /*! This returns a sentences that introduces the directory hierarchy.
* and the fact that it is sorted alphabetically per level
*/
virtual QCString trDirDescription()
- { return "äÅÒÅ×Ï ËÁÔÁÌÏÇ¦× ×ÐÏÒÑÄËÏ×ÁÎÏ ÎÁÂÌÉÖÅÎÏ "
- "ÄÏ ÁÌÆÁצÔÕ:";
+ { return "Дерево каталогів впорÑдковано наближено "
+ "до алфавіту:";
}
/*! This returns the title of a directory page. The name of the
* directory is passed via \a dirName.
*/
virtual QCString trDirReference(const char *dirName)
- { QCString result="äÏצÄÎÉË ËÁÔÁÌÏÇÕ "; result+=dirName; return result; }
+ { QCString result="Довідник каталогу "; result+=dirName; return result; }
/*! This returns the word directory with or without starting capital
* (\a first_capital) and in sigular or plural form (\a singular).
*/
virtual QCString trDir(bool, bool singular)
- {
- QCString result("ëÁÔÁÌÏÇ");
- if (!singular) result+="É";
- return result;
+ {
+ QCString result("Каталог");
+ if (!singular) result+="и";
+ return result;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.1
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This text is added to the documentation when the \\overload command
+ * is used for a overloaded function.
+ */
+ virtual QCString trOverloadText()
+ {
+ return "Це перезавантажуваний метод, "
+ "ввкдкний Ð´Ð»Ñ Ð·Ñ€ÑƒÑ‡Ð½Ð¾ÑÑ‚Ñ–. Він відрізнÑєтьÑÑ Ð²Ñ–Ð´ "
+ "опиÑаної вище функції лише ÑпиÑком аргуметнів.";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.4.6
+//////////////////////////////////////////////////////////////////////////
+
+ /*! This is used to introduce a caller (or called-by) graph */
+ virtual QCString trCallerGraph()
+ {
+ return "Граф викликів Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— функції:";
+ }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for enumeration values
+ */
+ virtual QCString trEnumerationValueDocumentation()
+ { return "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ð¿ÐµÑ€ÐµÐ»Ñ–ÐºÑƒ"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! header that is put before the list of member subprograms (Fortran). */
+ virtual QCString trMemberFunctionDocumentationFortran()
+ { return "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—/підпрограми"; }
+
+ /*! This is put above each page as a link to the list of annotated data types (Fortran). */
+ virtual QCString trCompoundListFortran()
+ { return "СпиÑок типів даних"; }
+
+ /*! This is put above each page as a link to all members of compounds (Fortran). */
+ virtual QCString trCompoundMembersFortran()
+ { return "ÐŸÐ¾Ð»Ñ Ð´Ð°Ð½Ð¸Ñ…"; }
+
+ /*! This is an introduction to the annotated compound list (Fortran). */
+ virtual QCString trCompoundListDescriptionFortran()
+ { return "Типи даних з коротким опиÑом:"; }
+
+ /*! This is an introduction to the page with all data types (Fortran). */
+ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+ {
+ QCString result="СпиÑок уÑÑ–Ñ… ";
+ if (!extractAll)
+ {
+ result+="задокументованих ";
+ }
+ result+="елементів типів даних";
+ result+=" з поÑиланнÑми на ";
+ if (!extractAll)
+ {
+ result+="документацію Ñтруктури даних кожного елемента";
+ }
+ else
+ {
+ result+="типи даних, до Ñких вони належать:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * annotated compound index (Fortran).
+ */
+ virtual QCString trCompoundIndexFortran()
+ { return "СпиÑок типів даних"; }
+
+ /*! This is used in LaTeX as the title of the chapter containing
+ * the documentation of all data types (Fortran).
+ */
+ virtual QCString trTypeDocumentation()
+ { return "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ñ‚Ð¸Ð¿Ñ–Ð² даних"; }
+
+ /*! This is used in the documentation of a file as a header before the
+ * list of (global) subprograms (Fortran).
+ */
+ virtual QCString trSubprograms()
+ { return "Функції/підпрограми"; }
+
+ /*! This is used in the documentation of a file/namespace before the list
+ * of documentation blocks for subprograms (Fortran)
+ */
+ virtual QCString trSubprogramDocumentation()
+ { return "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹/підпрограм"; }
+
+ /*! This is used in the documentation of a file/namespace/group before
+ * the list of links to documented compounds (Fortran)
+ */
+ virtual QCString trDataTypes()
+ { return "Типи даних"; }
+
+ /*! used as the title of page containing all the index of all modules (Fortran). */
+ virtual QCString trModulesList()
+ { return "СпиÑок модулів"; }
+
+ /*! used as an introduction to the modules list (Fortran) */
+ virtual QCString trModulesListDescription(bool extractAll)
+ {
+ QCString result="СпиÑок уÑÑ–Ñ… ";
+ if (!extractAll) result+="задокументованих ";
+ result+="модулів з коротким опиÑом:";
+ return result;
+ }
+
+ /*! used as the title of the HTML page of a module/type (Fortran) */
+ virtual QCString trCompoundReferenceFortran(const char *clName,
+ ClassDef::CompoundType compType,
+ bool isTemplate)
+ {
+ QCString result=(QCString)clName;
+ if (isTemplate)
+ {
+ switch(compType)
+ {
+ case ClassDef::Class: result+=" Модуль"; break;
+ case ClassDef::Struct: result+=" Тип"; break;
+ case ClassDef::Union: result+=" Об'єднаннÑ"; break;
+ case ClassDef::Interface: result+=" ІнтерфейÑ"; break;
+ case ClassDef::Protocol: result+=" Протокол"; break;
+ case ClassDef::Category: result+=" КатегоріÑ"; break;
+ case ClassDef::Exception: result+=" ВинÑток"; break;
+ default: break;
+ }
+ }
+ else
+ {
+ if (isTemplate) result+=" Шаблон ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="модулÑ"; break;
+ case ClassDef::Struct: result+="типу"; break;
+ case ClassDef::Union: result+="об'єднаннÑ"; break;
+ case ClassDef::Interface: result+="інтерфейÑу"; break;
+ case ClassDef::Protocol: result+="протоколу"; break;
+ case ClassDef::Category: result+="категорії"; break;
+ case ClassDef::Exception: result+="винÑтка"; break;
+ default: break;
+ }
+ }
+ return result;
}
+ /*! used as the title of the HTML page of a module (Fortran) */
+ virtual QCString trModuleReference(const char *namespaceName)
+ {
+ QCString result=namespaceName;
+ result+=" Модуль";
+ return result;
+ }
+
+ /*! This is put above each page as a link to all members of modules. (Fortran) */
+ virtual QCString trModulesMembers()
+ { return "Елементи модулÑ"; }
+
+ /*! This is an introduction to the page with all modules members (Fortran) */
+ virtual QCString trModulesMemberDescription(bool extractAll)
+ {
+ QCString result="СпиÑок уÑÑ–Ñ… ";
+ if (!extractAll) result+="задокументованих ";
+ result+="елементів модулів з поÑиланнÑми на ";
+ if (extractAll)
+ {
+ result+="документацію Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ елемента:";
+ }
+ else
+ {
+ result+="модулі, до Ñких вони належать:";
+ }
+ return result;
+ }
+
+ /*! This is used in LaTeX as the title of the chapter with the
+ * index of all modules (Fortran).
+ */
+ virtual QCString trModulesIndex()
+ { return "Ðлфавітний покажчик модулів"; }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trModule(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Модул" : "модул"));
+ result+=(singular? "ь": "і");
+ return result;
+ }
+
+ /*! This is put at the bottom of a module documentation page and is
+ * followed by a list of files that were used to generate the page.
+ */
+ virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+ bool single)
+ {
+ // single is true implies a single file
+ QCString result=(QCString)"Документацію Ð´Ð»Ñ ";
+ switch(compType)
+ {
+ case ClassDef::Class: result+="цього модулÑ"; break;
+ case ClassDef::Struct: result+="цього типу"; break;
+ case ClassDef::Union: result+="цього об'єднаннÑ"; break;
+ case ClassDef::Interface: result+="цього інтерфейÑу"; break;
+ case ClassDef::Protocol: result+="цього протоколу"; break;
+ case ClassDef::Category: result+="цієї категорії"; break;
+ case ClassDef::Exception: result+="цього винÑтку"; break;
+ default: break;
+ }
+ result+=" було згенеровано з ";
+ if (single) result+="наÑтупного файлу:"; else result+="наÑтупних файлів:";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trType(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Тип" : "тип"));
+ if (!singular) result+="и";
+ return result;
+ }
+
+ /*! This is used for translation of the word that will possibly
+ * be followed by a single name or by a list of names
+ * of the category.
+ */
+ virtual QCString trSubprogram(bool first_capital, bool singular)
+ {
+ QCString result((first_capital ? "Підпрограм" : "підпрограм"));
+ result+= (singular? "а": "и");
+ return result;
+ }
+
+ /*! C# Type Constraint list */
+ virtual QCString trTypeConstraints()
+ {
+ return "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! directory relation for \a name */
+ virtual QCString trDirRelation(const char *name)
+ {
+ return "Зв'Ñзок з "+QCString(name);
+ }
+
+ /*! Loading message shown when loading search results */
+ virtual QCString trLoading()
+ {
+ return "ЗавантаженнÑ...";
+ }
+
+ /*! Label used for search results in the global namespace */
+ virtual QCString trGlobalNamespace()
+ {
+ return "Глобальний проÑÑ‚Ñ–Ñ€ імен";
+ }
+
+ /*! Message shown while searching */
+ virtual QCString trSearching()
+ {
+ return "Пошук...";
+ }
+
+ /*! Text shown when no search results are found */
+ virtual QCString trNoMatches()
+ {
+ return "Ðічого не знайдено";
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Граф залежноÑтей каталогу Ð´Ð»Ñ "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Файл у "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Включає файли в "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Понеділок","Вівторок","Середа","Четвер","П'ÑтницÑ","Субота","ÐеділÑ" };
+ static const char *months[] = { "ÑічнÑ","лютого","березнÑ","квітнÑ","травнÑ","червнÑ","липнÑ","ÑерпнÑ","вереÑнÑ","жотнÑ","лиÑтопада","груднÑ" };
+ QCString sdate;
+ sdate.sprintf("%s, %d %s %d",days[dayOfWeek-1],day,months[month-1],year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.7.5
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Header for the page with bibliographic citations */
+ virtual QCString trCiteReferences()
+ { return "Бібліографічні поÑиланнÑ"; }
+
+ /*! Text for copyright paragraph */
+ virtual QCString trCopyright()
+ { return "Копірайт"; }
+
+ /*! Header for the graph showing the directory dependencies */
+ virtual QCString trDirDepGraph(const char *name)
+ { return QCString("Граф залежноÑтей каталогу Ð´Ð»Ñ ")+name+":"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.0
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Detail level selector shown for hierarchical indices */
+ virtual QCString trDetailLevel()
+ { return "рівень елемента"; }
+
+ /*! Section header for list of template parameters */
+ virtual QCString trTemplateParameters()
+ { return "Параметри шаблона"; }
+
+ /*! Used in dot graph when UML_LOOK is enabled and there are many fields */
+ virtual QCString trAndMore(const QCString &number)
+ { return "і ще "+number+"..."; }
+
+ /*! Used file list for a Java enum */
+ virtual QCString trEnumGeneratedFromFiles(bool single)
+ { QCString result = "Документацію Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ переліку булозгенеровано з ";
+ result += (single? "наÑтупного файла": "наÑтупних файлів");
+ result+=":";
+ return result;
+ }
+
+ /*! Header of a Java enum page (Java enums are represented as classes). */
+ virtual QCString trEnumReference(const char *name)
+ { return QCString(name)+" Перелік"; }
+
+ /*! Used for a section containing inherited members */
+ virtual QCString trInheritedFrom(const char *members,const char *what)
+ { return QCString(members)+" уÑпадковано з "+what; }
+
+ /*! Header of the sections with inherited members specific for the
+ * base class(es)
+ */
+ virtual QCString trAdditionalInheritedMembers()
+ { return "Додаткові уÑпадковані елементи"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.2
+//////////////////////////////////////////////////////////////////////////
+
+ /*! Used as a tooltip for the toggle button that appears in the
+ * navigation tree in the HTML output when GENERATE_TREEVIEW is
+ * enabled. This tooltip explains the meaning of the button.
+ */
+ virtual QCString trPanelSynchronisationTooltip(bool enable)
+ {
+ QCString opt = enable ? "дозволити" : "заборонити";
+ return "клацніть мишкою, щоб "+opt+" Ñинхронізацію панелі";
+ }
+
+ /*! Used in a method of an Objective-C class that is declared in a
+ * a category. Note that the @1 marker is required and is replaced
+ * by a link.
+ */
+ virtual QCString trProvidedByCategory()
+ {
+ return "Забезпечено категорією @1.";
+ }
+
+ /*! Used in a method of an Objective-C category that extends a class.
+ * Note that the @1 marker is required and is replaced by a link to
+ * the class method.
+ */
+ virtual QCString trExtendsClass()
+ {
+ return "Розширює ÐºÐ»Ð°Ñ @1.";
+ }
+
+ /*! Used as the header of a list of class methods in Objective-C.
+ * These are similar to static public member functions in C++.
+ */
+ virtual QCString trClassMethods()
+ {
+ return "Методи клаÑу";
+ }
+
+ /*! Used as the header of a list of instance methods in Objective-C.
+ * These are similar to public member functions in C++.
+ */
+ virtual QCString trInstanceMethods()
+ {
+ return "Методи об'єкта";
+ }
+
+ /*! Used as the header of the member functions of an Objective-C class.
+ */
+ virtual QCString trMethodDocumentation()
+ {
+ return "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð°";
+ }
+
+ /*! Used as the title of the design overview picture created for the
+ * VHDL output.
+ */
+ virtual QCString trDesignOverview()
+ {
+ return "ОглÑд дизайну проекту";
+ }
+
+//////////////////////////////////////////////////////////////////////////
};
diff --git a/src/translator_vi.h b/src/translator_vi.h
index d7984a9..36fb48a 100644
--- a/src/translator_vi.h
+++ b/src/translator_vi.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -627,6 +627,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=" Protocol"; break;
case ClassDef::Category: result+=" Category"; break;
case ClassDef::Exception: result+=" Exception"; break;
+ default: break;
}
if (isTemplate) result+=" Template";
result+=" Tham chiếu";
@@ -786,6 +787,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="protocol"; break;
case ClassDef::Category: result+="category"; break;
case ClassDef::Exception: result+="exception"; break;
+ default: break;
}
result+=" được biên soạn từ các file sau đây";
if (single) result+=":"; else result+=":";
@@ -1210,7 +1212,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
*/
virtual QCString trRTFansicp()
{
- return "1252";
+ return "1258";
}
@@ -1219,7 +1221,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
*/
virtual QCString trRTFCharSet()
{
- return "0";
+ return "163";
}
/*! Used as header RTF general index */
@@ -1683,6 +1685,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=" Protocol"; break;
case ClassDef::Category: result+=" Category"; break;
case ClassDef::Exception: result+=" Exception"; break;
+ default: break;
}
if (isTemplate) result+=" Template";
result+=" Tham chiếu";
@@ -1750,6 +1753,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="protocol"; break;
case ClassDef::Category: result+="category"; break;
case ClassDef::Exception: result+="exception"; break;
+ default: break;
}
result+=" được biên soạn từ các file sau đây";
if (single) result+=":"; else result+="s:";
diff --git a/src/translator_za.h b/src/translator_za.h
index b3084c6..eb278d6 100644
--- a/src/translator_za.h
+++ b/src/translator_za.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -606,6 +606,7 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=" Protocol"; break;
case ClassDef::Category: result+=" Kategorie"; break;
case ClassDef::Exception: result+=" Exception"; break;
+ default: break;
}
if (isTemplate) result+=" Template";
result+=" Verwysing";
@@ -765,6 +766,7 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="protokol"; break;
case ClassDef::Category: result+="kategorie"; break;
case ClassDef::Exception: result+="eksepsie"; break;
+ default: break;
}
result+=" is gegenereer vanaf die volgende le&euml;r";
if (single) result+=":"; else result+="s:";
@@ -1663,6 +1665,7 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+=" Protokol"; break;
case ClassDef::Category: result+=" Kategorie"; break;
case ClassDef::Exception: result+=" Eksepsie"; break;
+ default: break;
}
if (isTemplate) result+=" Template";
result+=" Bron";
@@ -1730,6 +1733,7 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_6_0
case ClassDef::Protocol: result+="protokcol"; break;
case ClassDef::Category: result+="kategorie"; break;
case ClassDef::Exception: result+="eksepsie"; break;
+ default: break;
}
result+=" is gegenereer vanaf die foldende leer";
if (single) result+=":"; else result+="s:";
diff --git a/src/translatordecoder.h b/src/translatordecoder.h
index 7261ee9..6537774 100644
--- a/src/translatordecoder.h
+++ b/src/translatordecoder.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -789,6 +789,28 @@ class TranslatorDecoder : public Translator
{ return toUtf8(m_translator->trDesignOverview()); }
//////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+ QCString trInterfaces()
+ { return toUtf8(m_translator->trInterfaces()); }
+ QCString trServices()
+ { return toUtf8(m_translator->trServices()); }
+ QCString trConstantGroups()
+ { return toUtf8(m_translator->trConstantGroups()); }
+ QCString trConstantGroupReference(const char *namespaceName)
+ { return toUtf8(m_translator->trConstantGroupReference(fromUtf8(namespaceName))); }
+ QCString trServiceReference(const char *sName)
+ { return toUtf8(m_translator->trServiceReference(fromUtf8(sName))); }
+ QCString trSingletonReference(const char *sName)
+ { return toUtf8(m_translator->trSingletonReference(fromUtf8(sName))); }
+ QCString trServiceGeneratedFromFiles(bool single)
+ { return toUtf8(m_translator->trServiceGeneratedFromFiles(single)); }
+ QCString trSingletonGeneratedFromFiles(bool single)
+ { return toUtf8(m_translator->trSingletonGeneratedFromFiles(single)); }
+
+
+//////////////////////////////////////////////////////////////////////////
private:
Translator *m_translator;
void *m_toUtf8;
diff --git a/src/types.h b/src/types.h
index 9bc5827..0c269be 100644
--- a/src/types.h
+++ b/src/types.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -22,11 +22,22 @@
* @brief This file contains a number of basic enums and types.
*/
+/** Protection level of members */
enum Protection { Public, Protected, Private, Package } ;
+
+/** Virtualness of a member. */
enum Specifier { Normal, Virtual, Pure } ;
+
+/** Kind of method */
enum MethodTypes { Method, Signal, Slot, DCOP, Property, Event };
+
+/** Type of member relation */
enum RelatesType { Simple, Duplicate, MemberOf };
+
+/** Kind of member relationship */
enum Relationship { Member, Related, Foreign };
+
+/** Language as given by extension */
enum SrcLangExt
{
SrcLangExt_Unknown = 0x00000,
@@ -46,8 +57,10 @@ enum SrcLangExt
SrcLangExt_Markdown = 0x10000
};
+/** Grouping info */
struct Grouping
{
+ /** Grouping priority */
enum GroupPri_t
{
GROUPING_LOWEST,
@@ -169,7 +182,14 @@ enum MemberListType
MemberListType_redefinedBy = 67,
MemberListType_enumFields = 68,
- MemberListType_memberGroup = 69
+ MemberListType_memberGroup = 69,
+
+ // this one is for the summary section on the class page
+ MemberListType_interfaces = 70,
+ // this one is for the detailed section on the class page
+ MemberListType_interfaceMembers = 71 + MemberListType_detailedLists,
+ MemberListType_services = 72,
+ MemberListType_serviceMembers = 73 + MemberListType_detailedLists,
};
enum MemberType
@@ -185,7 +205,9 @@ enum MemberType
MemberType_Friend,
MemberType_DCOP,
MemberType_Property,
- MemberType_Event
+ MemberType_Event,
+ MemberType_Interface,
+ MemberType_Service,
};
#endif
diff --git a/src/util.cpp b/src/util.cpp
index 0d48f96..0d70d43 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -278,7 +278,7 @@ static QCString stripFromPath(const QCString &path,QStrList &l)
{
QCString prefix = s;
if (prefix.length() > length &&
- stricmp(path.left(prefix.length()),prefix)==0) // case insensitive compare
+ qstricmp(path.left(prefix.length()),prefix)==0) // case insensitive compare
{
length = prefix.length();
potential = path.right(path.length()-prefix.length());
@@ -498,7 +498,7 @@ NamespaceDef *getResolvedNamespace(const char *name)
}
if (count==10)
{
- err("warning: possible recursive namespace alias detected for %s!\n",name);
+ warn_uncond("possible recursive namespace alias detected for %s!\n",name);
}
return Doxygen::namespaceSDict->find(subst->data());
}
@@ -1567,6 +1567,7 @@ ClassDef *getResolvedClass(Definition *scope,
QCString *pResolvedType
)
{
+ static bool optimizeOutputVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
g_resolvedTypedefs.clear();
if (scope==0 ||
(scope->definitionType()!=Definition::TypeClass &&
@@ -1583,7 +1584,15 @@ ClassDef *getResolvedClass(Definition *scope,
// n,
// mayBeUnlinkable
// );
- ClassDef *result = getResolvedClassRec(scope,fileScope,n,pTypeDef,pTemplSpec,pResolvedType);
+ ClassDef *result;
+ if (optimizeOutputVhdl)
+ {
+ result = getClass(n);
+ }
+ else
+ {
+ result = getResolvedClassRec(scope,fileScope,n,pTypeDef,pTemplSpec,pResolvedType);
+ }
if (!mayBeUnlinkable && result && !result->isLinkable())
{
if (!mayBeHidden || !result->isHidden())
@@ -1815,6 +1824,49 @@ nextChar:
return growBuf.get();
}
+/**
+ * Returns the position in the string where a function parameter list
+ * begins, or -1 if one is not found.
+ */
+int findParameterList(const QString &name)
+{
+ int pos=-1;
+ int templateDepth=0;
+ do
+ {
+ if (templateDepth > 0)
+ {
+ int nextOpenPos=name.findRev('>', pos);
+ int nextClosePos=name.findRev('<', pos);
+ if (nextOpenPos!=-1 && nextOpenPos>nextClosePos)
+ {
+ ++templateDepth;
+ pos=nextOpenPos-1;
+ }
+ else
+ {
+ --templateDepth;
+ pos=nextClosePos-1;
+ }
+ }
+ else
+ {
+ int lastAnglePos=name.findRev('>', pos);
+ int bracePos=name.findRev('(', pos);
+ if (lastAnglePos!=-1 && lastAnglePos>bracePos)
+ {
+ ++templateDepth;
+ pos=lastAnglePos-1;
+ }
+ else
+ {
+ return bracePos;
+ }
+ }
+ } while (pos!=-1);
+ return -1;
+}
+
bool rightScopeMatch(const QCString &scope, const QCString &name)
{
return (name==scope || // equal
@@ -2287,7 +2339,7 @@ QCString transcodeCharacterStringToUTF8(const QCString &input)
void *cd = portable_iconv_open(outputEncoding,inputEncoding);
if (cd==(void *)(-1))
{
- err("error: unsupported character conversion: '%s'->'%s'\n",
+ err("unsupported character conversion: '%s'->'%s'\n",
inputEncoding.data(),outputEncoding);
error=TRUE;
}
@@ -2306,7 +2358,7 @@ QCString transcodeCharacterStringToUTF8(const QCString &input)
}
else
{
- err("error: failed to translate characters from %s to %s: check INPUT_ENCODING\ninput=[%s]\n",
+ err("failed to translate characters from %s to %s: check INPUT_ENCODING\ninput=[%s]\n",
inputEncoding.data(),outputEncoding,input.data());
error=TRUE;
}
@@ -2351,7 +2403,7 @@ QCString fileToString(const char *name,bool filter,bool isSourceCode)
QFileInfo fi(name);
if (!fi.exists() || !fi.isFile())
{
- err("error: file `%s' not found\n",name);
+ err("file `%s' not found\n",name);
return "";
}
QCString filterName = getFileFilter(name,isSourceCode);
@@ -2385,7 +2437,7 @@ QCString fileToString(const char *name,bool filter,bool isSourceCode)
FILE *f=portable_popen(cmd,"r");
if (!f)
{
- err("error: could not execute filter %s\n",filterName.data());
+ err("could not execute filter %s\n",filterName.data());
return "";
}
const int bSize=4096;
@@ -2409,7 +2461,7 @@ QCString fileToString(const char *name,bool filter,bool isSourceCode)
}
if (!fileOpened)
{
- err("error: cannot open file `%s' for reading\n",name);
+ err("cannot open file `%s' for reading\n",name);
}
return "";
}
@@ -2449,8 +2501,8 @@ int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level)
if (cd==bcd) return level;
if (level==256)
{
- err("error: Internal inconsistency: found class %s seem to have a recursive "
- "inheritance relation! Please send a bug report to dimitri@stack.nl\n",cd->name().data());
+ warn_uncond("class %s seem to have a recursive "
+ "inheritance relation!\n",cd->name().data());
return -1;
}
int m=maxInheritanceDepth;
@@ -2481,7 +2533,7 @@ Protection classInheritedProtectionLevel(ClassDef *cd,ClassDef *bcd,Protection p
}
if (level==256)
{
- err("error: Internal inconsistency: found class %s seem to have a recursive "
+ err("Internal inconsistency: found class %s seem to have a recursive "
"inheritance relation! Please send a bug report to dimitri@stack.nl\n",cd->name().data());
}
else if (cd->baseClasses())
@@ -2889,11 +2941,11 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA,
stripIrrelevantConstVolatile(dstAType);
// strip typename keyword
- if (strncmp(srcAType,"typename ",9)==0)
+ if (qstrncmp(srcAType,"typename ",9)==0)
{
srcAType = srcAType.right(srcAType.length()-9);
}
- if (strncmp(dstAType,"typename ",9)==0)
+ if (qstrncmp(dstAType,"typename ",9)==0)
{
dstAType = dstAType.right(dstAType.length()-9);
}
@@ -3802,13 +3854,13 @@ static void findMembersWithSpecificName(MemberName *mn,
{
bool match=TRUE;
ArgumentList *argList=0;
- if (args && !md->isDefine() && strcmp(args,"()")!=0)
+ if (args && !md->isDefine() && qstrcmp(args,"()")!=0)
{
argList=new ArgumentList;
- LockingPtr<ArgumentList> mdAl = md->argumentList();
+ ArgumentList *mdAl = md->argumentList();
stringToArgumentList(args,argList);
match=matchArguments2(
- md->getOuterScope(),fd,mdAl.pointer(),
+ md->getOuterScope(),fd,mdAl,
Doxygen::globalScope,fd,argList,
checkCV);
delete argList; argList=0;
@@ -3937,9 +3989,9 @@ bool getDefs(const QCString &scName,
{
//if (mmd->isLinkable())
//{
- LockingPtr<ArgumentList> mmdAl = mmd->argumentList();
+ ArgumentList *mmdAl = mmd->argumentList();
bool match=args==0 ||
- matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl.pointer(),
+ matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl,
fcd,fcd->getFileDef(),argList,
checkCV
);
@@ -3964,7 +4016,7 @@ bool getDefs(const QCString &scName,
{
delete argList; argList=0;
}
- if (mdist==maxInheritanceDepth && args && strcmp(args,"()")==0)
+ if (mdist==maxInheritanceDepth && args && qstrcmp(args,"()")==0)
// no exact match found, but if args="()" an arbitrary member will do
{
//printf(" >Searching for arbitrary member\n");
@@ -4022,7 +4074,7 @@ bool getDefs(const QCString &scName,
MemberListIterator mmli(*mn);
MemberDef *mmd, *fuzzy_mmd = 0;
ArgumentList *argList = 0;
- bool hasEmptyArgs = args && strcmp(args, "()") == 0;
+ bool hasEmptyArgs = args && qstrcmp(args, "()") == 0;
if (args)
stringToArgumentList(args, argList = new ArgumentList);
@@ -4037,8 +4089,8 @@ bool getDefs(const QCString &scName,
QCString className = mmd->getClassDef()->name();
- LockingPtr<ArgumentList> mmdAl = mmd->argumentList();
- if (matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl.pointer(),
+ ArgumentList *mmdAl = mmd->argumentList();
+ if (matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmdAl,
Doxygen::globalScope,mmd->getFileDef(),argList,
checkCV
)
@@ -4098,13 +4150,13 @@ bool getDefs(const QCString &scName,
{ // namespace is found
bool match=TRUE;
ArgumentList *argList=0;
- if (args && strcmp(args,"()")!=0)
+ if (args && qstrcmp(args,"()")!=0)
{
argList=new ArgumentList;
- LockingPtr<ArgumentList> mmdAl = mmd->argumentList();
+ ArgumentList *mmdAl = mmd->argumentList();
stringToArgumentList(args,argList);
match=matchArguments2(
- mmd->getOuterScope(),mmd->getFileDef(),mmdAl.pointer(),
+ mmd->getOuterScope(),mmd->getFileDef(),mmdAl,
fnd,mmd->getFileDef(),argList,
checkCV);
}
@@ -4120,7 +4172,7 @@ bool getDefs(const QCString &scName,
}
}
}
- if (!found && args && !strcmp(args,"()"))
+ if (!found && args && !qstrcmp(args,"()"))
// no exact match found, but if args="()" an arbitrary
// member will do
{
@@ -4171,7 +4223,7 @@ bool getDefs(const QCString &scName,
findMembersWithSpecificName(mn,args,FALSE,currentFile,checkCV,forceTagFile,members);
}
//printf("found %d members\n",members.count());
- if (members.count()!=1 && args && !strcmp(args,"()"))
+ if (members.count()!=1 && args && !qstrcmp(args,"()"))
{
// no exact match found, but if args="()" an arbitrary
// member will do
@@ -4295,12 +4347,20 @@ bool resolveRef(/* in */ const char *scName,
bool checkScope
)
{
+ //printf("resolveRef(scope=%s,name=%s,inSeeBlock=%d)\n",scName,name,inSeeBlock);
QCString tsName = name;
//bool memberScopeFirst = tsName.find('#')!=-1;
QCString fullName = substitute(tsName,"#","::");
- fullName = removeRedundantWhiteSpace(substitute(fullName,".","::"));
+ if (fullName.find("anonymous_namespace{")==-1 && fullName.find('<')==-1)
+ {
+ fullName = removeRedundantWhiteSpace(substitute(fullName,".","::"));
+ }
+ else
+ {
+ fullName = removeRedundantWhiteSpace(fullName);
+ }
- int bracePos=fullName.findRev('('); // reverse is needed for operator()(...)
+ int bracePos=findParameterList(fullName);
int endNamePos=bracePos!=-1 ? bracePos : fullName.length();
int scopePos=fullName.findRev("::",endNamePos);
bool explicitScope = fullName.left(2)=="::" && // ::scope or #scope
@@ -4457,7 +4517,7 @@ QCString linkToText(SrcLangExt lang,const char *link,bool isFileName)
// replace # by ::
result=substitute(result,"#","::");
// replace . by ::
- if (!isFileName) result=substitute(result,".","::");
+ if (!isFileName && result.find('<')==-1) result=substitute(result,".","::");
// strip leading :: prefix if present
if (result.at(0)==':' && result.at(1)==':')
{
@@ -4559,6 +4619,7 @@ bool resolveLink(/* in */ const char *scName,
ClassDef *cd;
DirDef *dir;
NamespaceDef *nd;
+ SectionInfo *si=0;
bool ambig;
if (linkRef.isEmpty()) // no reference name!
{
@@ -4569,7 +4630,6 @@ bool resolveLink(/* in */ const char *scName,
GroupDef *gd = pd->getGroupDef();
if (gd)
{
- SectionInfo *si=0;
if (!pd->name().isEmpty()) si=Doxygen::sectionDict->find(pd->name());
*resContext=gd;
if (si) resAnchor = si->label;
@@ -4580,6 +4640,12 @@ bool resolveLink(/* in */ const char *scName,
}
return TRUE;
}
+ else if ((si=Doxygen::sectionDict->find(linkRef)))
+ {
+ *resContext=si->definition;
+ resAnchor = si->label;
+ return TRUE;
+ }
else if ((pd=Doxygen::exampleSDict->find(linkRef))) // link to an example
{
*resContext=pd;
@@ -5440,7 +5506,7 @@ QCString convertToJSString(const char *s)
}
}
growBuf.addChar(0);
- return growBuf.get();
+ return convertCharEntitiesToUTF8(growBuf.get());
}
@@ -5587,25 +5653,32 @@ QCString convertCharEntitiesToUTF8(const QCString &s)
init=FALSE;
}
- if (s==0) return result;
+ if (s.length()==0) return result;
+ static GrowBuf growBuf;
+ growBuf.clear();
int p,i=0,l;
while ((p=entityPat.match(s,i,&l))!=-1)
{
- if (p>i) result+=s.mid(i,p-i);
+ if (p>i)
+ {
+ growBuf.addStr(s.mid(i,p-i));
+ }
QCString entity = s.mid(p+1,l-2);
char *code = entityMap.find(entity);
if (code)
{
- result+=code;
+ growBuf.addStr(code);
}
else
{
- result+=s.mid(p,l);
+ growBuf.addStr(s.mid(p,l));
}
i=p+l;
}
- result+=s.mid(i,s.length()-i);
- return result;
+ growBuf.addStr(s.mid(i,s.length()-i));
+ growBuf.addChar(0);
+ //printf("convertCharEntitiesToUTF8(%s)->%s\n",s.data(),growBuf.get());
+ return growBuf.get();
}
/*! Returns the standard string that is generated when the \\overload
@@ -5633,7 +5706,7 @@ void addMembersToMemberGroup(MemberList *ml,
{
if (md->isEnumerate()) // insert enum value of this enum into groups
{
- LockingPtr<MemberList> fmdl=md->enumFieldList();
+ MemberList *fmdl=md->enumFieldList();
if (fmdl!=0)
{
MemberDef *fmd=fmdl->first();
@@ -6152,9 +6225,12 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle,
if (tagInfo)
{
pd->setReference(tagInfo->tagName);
+ pd->setFileName(tagInfo->fileName);
+ }
+ else
+ {
+ pd->setFileName(convertNameToFile(pd->name(),FALSE,TRUE));
}
-
- pd->setFileName(convertNameToFile(pd->name(),FALSE,TRUE));
//printf("Appending page `%s'\n",baseName.data());
Doxygen::pageSDict->append(baseName,pd);
@@ -6195,7 +6271,7 @@ void addRefItem(const QList<ListItemInfo> *sli,
const char *prefix, const char *name,const char *title,const char *args)
{
//printf("addRefItem(sli=%p,key=%s,prefix=%s,name=%s,title=%s,args=%s)\n",sli,key,prefix,name,title,args);
- if (sli)
+ if (sli && key && key[0]!='@') // check for @ to skip anonymous stuff (see bug427012)
{
QListIterator<ListItemInfo> slii(*sli);
ListItemInfo *lii;
@@ -6230,8 +6306,8 @@ void addRefItem(const QList<ListItemInfo> *sli,
void addGroupListToTitle(OutputList &ol,Definition *d)
{
- LockingPtr<GroupList> groups = d->partOfGroups();
- if (groups!=0) // write list of group to which this definition belongs
+ GroupList *groups = d->partOfGroups();
+ if (groups) // write list of group to which this definition belongs
{
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
@@ -6408,6 +6484,11 @@ QCString stripPath(const char *s)
{
result=result.mid(i+1);
}
+ i=result.findRev('\\');
+ if (i!=-1)
+ {
+ result=result.mid(i+1);
+ }
return result;
}
@@ -6712,6 +6793,24 @@ bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n)
return FALSE;
}
+const char *writeUtf8Char(FTextStream &t,const char *s)
+{
+ char c=*s++;
+ t << c;
+ if (c<0) // multibyte character
+ {
+ t << *s++;
+ if (((uchar)c&0xE0)==0xE0)
+ {
+ t << *s++; // 111x.xxxx: >=3 byte character
+ }
+ if (((uchar)c&0xF0)==0xF0)
+ {
+ t << *s++; // 1111.xxxx: 4 byte character
+ }
+ }
+ return s;
+}
int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos)
{
@@ -7065,7 +7164,7 @@ void writeTypeConstraints(OutputList &ol,Definition *d,ArgumentList *al)
linkifyText(TextGeneratorOLImpl(ol),d,0,0,a->type);
ol.endConstraintType();
ol.startConstraintDocs();
- ol.parseDoc(d->docFile(),d->docLine(),d,0,a->docs,TRUE,FALSE);
+ ol.generateDoc(d->docFile(),d->docLine(),d,0,a->docs,TRUE,FALSE);
ol.endConstraintDocs();
}
ol.endConstraintList();
@@ -7108,7 +7207,7 @@ static int transcodeCharacterBuffer(const char *fileName,BufStr &srcBuf,int size
void *cd = portable_iconv_open(outputEncoding,inputEncoding);
if (cd==(void *)(-1))
{
- err("error: unsupported character conversion: '%s'->'%s': %s\n"
+ err("unsupported character conversion: '%s'->'%s': %s\n"
"Check the INPUT_ENCODING setting in the config file!\n",
inputEncoding,outputEncoding,strerror(errno));
exit(1);
@@ -7129,7 +7228,7 @@ static int transcodeCharacterBuffer(const char *fileName,BufStr &srcBuf,int size
}
else
{
- err("%s: error: failed to translate characters from %s to %s: check INPUT_ENCODING\n",
+ err("%s: failed to translate characters from %s to %s: check INPUT_ENCODING\n",
fileName,inputEncoding,outputEncoding);
exit(1);
}
@@ -7153,7 +7252,7 @@ bool readInputFile(const char *fileName,BufStr &inBuf)
QFile f(fileName);
if (!f.open(IO_ReadOnly))
{
- err("error: could not open file %s\n",fileName);
+ err("could not open file %s\n",fileName);
return FALSE;
}
size=fi.size();
@@ -7161,7 +7260,7 @@ bool readInputFile(const char *fileName,BufStr &inBuf)
inBuf.skip(size);
if (f.readBlock(inBuf.data()/*+oldPos*/,size)!=size)
{
- err("error: problems while reading file %s\n",fileName);
+ err("problems while reading file %s\n",fileName);
return FALSE;
}
}
@@ -7172,7 +7271,7 @@ bool readInputFile(const char *fileName,BufStr &inBuf)
FILE *f=portable_popen(cmd,"r");
if (!f)
{
- err("error: could not execute filter %s\n",filterName.data());
+ err("could not execute filter %s\n",filterName.data());
return FALSE;
}
const int bufSize=1024;
@@ -7438,13 +7537,13 @@ bool copyFile(const QCString &src,const QCString &dest)
}
else
{
- err("error: could not write to file %s\n",dest.data());
+ err("could not write to file %s\n",dest.data());
return FALSE;
}
}
else
{
- err("error: could not open user specified file %s\n",src.data());
+ err("could not open user specified file %s\n",src.data());
return FALSE;
}
return TRUE;
@@ -7638,3 +7737,46 @@ bool fileVisibleInIndex(FileDef *fd,bool &genSourceFile)
);
}
+void addDocCrossReference(MemberDef *src,MemberDef *dst)
+{
+ static bool referencedByRelation = Config_getBool("REFERENCED_BY_RELATION");
+ static bool referencesRelation = Config_getBool("REFERENCES_RELATION");
+ static bool callerGraph = Config_getBool("CALLER_GRAPH");
+ static bool callGraph = Config_getBool("CALL_GRAPH");
+
+ //printf("--> addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
+ if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
+ if ((referencedByRelation || callerGraph || dst->hasCallerGraph()) &&
+ src->showInCallGraph()
+ )
+ {
+ dst->addSourceReferencedBy(src);
+ MemberDef *mdDef = dst->memberDefinition();
+ if (mdDef)
+ {
+ mdDef->addSourceReferencedBy(src);
+ }
+ MemberDef *mdDecl = dst->memberDeclaration();
+ if (mdDecl)
+ {
+ mdDecl->addSourceReferencedBy(src);
+ }
+ }
+ if ((referencesRelation || callGraph || src->hasCallGraph()) &&
+ src->showInCallGraph()
+ )
+ {
+ src->addSourceReferences(dst);
+ MemberDef *mdDef = src->memberDefinition();
+ if (mdDef)
+ {
+ mdDef->addSourceReferences(dst);
+ }
+ MemberDef *mdDecl = src->memberDeclaration();
+ if (mdDecl)
+ {
+ mdDecl->addSourceReferences(dst);
+ }
+ }
+}
+
diff --git a/src/util.h b/src/util.h
index c324723..e19e829 100644
--- a/src/util.h
+++ b/src/util.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -380,6 +380,7 @@ bool patternMatch(const QFileInfo &fi,const QStrList *patList);
QCString externalLinkTarget();
QCString externalRef(const QCString &relPath,const QCString &ref,bool href);
int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos);
+const char *writeUtf8Char(FTextStream &t,const char *s);
/** Data associated with a HSV colored image. */
struct ColoredImgDataItem
@@ -407,5 +408,7 @@ QCString stripIndentation(const QCString &s);
bool fileVisibleInIndex(FileDef *fd,bool &genSourceFile);
+void addDocCrossReference(MemberDef *src,MemberDef *dst);
+
#endif
diff --git a/src/version.h b/src/version.h
index 4752520..9d523c1 100644
--- a/src/version.h
+++ b/src/version.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/vhdlcode.l b/src/vhdlcode.l
index b3d24d1..8e20419 100644
--- a/src/vhdlcode.l
+++ b/src/vhdlcode.l
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -412,7 +412,7 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol,
static void setParameterList(MemberDef *md)
{
g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
- LockingPtr<ArgumentList> al = md->argumentList();
+ ArgumentList *al = md->argumentList();
if (al==0) return;
Argument *a = al->first();
while (a)
@@ -450,7 +450,6 @@ static void generateFuncLink(CodeOutputInterface &ol,MemberDef* mdef)
addToSearchIndex(memberName);
return;
}
- ol.linkableSymbol(g_yyLineNr,memberName,0,g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
codifyLines(memberName.data());
addToSearchIndex(memberName);
} // generateFuncLink
@@ -493,7 +492,6 @@ static void generateMemLink(CodeOutputInterface &ol,QCString &clName,QCString& m
return;
}
// nothing found, just write out the word
- ol.linkableSymbol(g_yyLineNr,memberName,0,g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
codifyLines(memberName.data());
addToSearchIndex(memberName);
}// generateMemLink
@@ -521,10 +519,6 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
//{
// temp=VhdlDocGen::getClassName(cd);
//}
- ol.linkableSymbol(g_yyLineNr,temp,cd,
- g_currentMemberDef ?
- g_currentMemberDef :
- g_currentDefinition);
writeMultiLineCodeLink(ol,cd->getReference(),
cd->getOutputFileBase(),
cd->anchor(),
@@ -545,7 +539,6 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName
}
// nothing found, just write out the word
- ol.linkableSymbol(g_yyLineNr,clName,0,g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
codifyLines(clName);
addToSearchIndex(clName);
}// generateClasss or global link
@@ -1515,7 +1508,7 @@ void parseVhdlCode(CodeOutputInterface &od,const char *className,const QCString
if (memberDef)
{
ClassDef *dd=memberDef->getClassDef();
- if (dd) g_CurrClass=dd->className();
+ if (dd) g_CurrClass=dd->name();
startLine--;
}
resetVhdlCodeParserState();
@@ -1573,7 +1566,7 @@ void parseVhdlCode(CodeOutputInterface &od,const char *className,const QCString
{
setParameterList(memberDef);
}
- int iLine=countLines();
+ /*int iLine=*/countLines();
vhdlcodeYYrestart( vhdlcodeYYin );
BEGIN( Bases );
vhdlcodeYYlex();
@@ -1588,7 +1581,7 @@ void parseVhdlCode(CodeOutputInterface &od,const char *className,const QCString
delete g_sourceFileDef;
g_sourceFileDef=0;
}
- assert(g_yyLineNr==iLine);
+
return;
}
diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp
index 0a0141f..8545c90 100644
--- a/src/vhdldocgen.cpp
+++ b/src/vhdldocgen.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -27,6 +27,11 @@
#include <qcstring.h>
#include <qfileinfo.h>
#include <qstringlist.h>
+
+#ifdef DEBUGFLOW
+#include <qmap.h>
+#endif
+
/* --------------------------------------------------------------- */
// local includes
@@ -95,12 +100,11 @@ const MemberDef* VhdlDocGen::getFlowMember()
//--------------------------------------------------------------------------------------------------
static void codify(FTextStream &t,const char *str)
{
-
if (str)
{
const char *p=str;
char c;
- while (*p)
+ while (*p)
{
c=*p++;
switch(c)
@@ -122,6 +126,38 @@ static void codify(FTextStream &t,const char *str)
}
}
+static void writeLink(const MemberDef* mdef,OutputList &ol)
+{
+ ol.writeObjectLink(mdef->getReference(),
+ mdef->getOutputFileBase(),
+ mdef->anchor(),
+ mdef->name());
+}
+
+static void startFonts(const QCString& q, const char *keyword,OutputList& ol)
+{
+ ol.startFontClass(keyword);
+ ol.docify(q.data());
+ ol.endFontClass();
+}
+
+static QCString splitString(QCString& str,char c)
+{
+ QCString n=str;
+ int i=str.find(c);
+ if (i>0)
+ {
+ n=str.left(i);
+ str=str.remove(0,i+1);
+ }
+ return n;
+}
+
+static int compareString(const QCString& s1,const QCString& s2)
+{
+ return qstricmp(s1.stripWhiteSpace(),s2.stripWhiteSpace());
+}
+
static void createSVG()
{
QCString ov =Config_getString("HTML_OUTPUT");
@@ -330,7 +366,7 @@ static void writeColumn(FTextStream &t,MemberDef *md,bool start)
QCString toolTip;
static QRegExp reg("[%]");
- bool bidir=(md!=0 &&( stricmp(md->typeString(),"inout")==0));
+ bool bidir=(md!=0 &&( qstricmp(md->typeString(),"inout")==0));
if (md)
{
@@ -766,7 +802,7 @@ MemberDef* VhdlDocGen::findMemberDef(ClassDef* cd,const QCString& key,MemberList
for (fmni.toFirst();(md=fmni.current());++fmni)
{
- if (stricmp(key.data(),md->name().data())==0)
+ if (qstricmp(key,md->name())==0)
{
return md;
}
@@ -838,13 +874,13 @@ MemberDef* VhdlDocGen::findFunction(const QList<Argument> &ql,
for (fmni.toFirst();(mdef=fmni.current());++fmni)
{
QCString mname=mdef->name();
- if ((VhdlDocGen::isProcedure(mdef) || VhdlDocGen::isVhdlFunction(mdef)) && (VhdlDocGen::compareString(funcname,mname)==0))
+ if ((VhdlDocGen::isProcedure(mdef) || VhdlDocGen::isVhdlFunction(mdef)) && (compareString(funcname,mname)==0))
{
- LockingPtr<ArgumentList> alp = mdef->argumentList();
+ ArgumentList *alp = mdef->argumentList();
// ArgumentList* arg2=mdef->getArgumentList();
if (alp==0) break;
- ArgumentListIterator ali(*alp.pointer());
+ ArgumentListIterator ali(*alp);
ArgumentListIterator ali1(ql);
if (ali.count() != ali1.count()) break;
@@ -855,18 +891,18 @@ MemberDef* VhdlDocGen::findFunction(const QList<Argument> &ql,
for (;(arg=ali.current());++ali)
{
arg1=ali1.current(); ++ali1;
- equ+=abs(VhdlDocGen::compareString(arg->type,arg1->type));
+ equ+=abs(compareString(arg->type,arg1->type));
QCString s1=arg->type;
QCString s2=arg1->type;
VhdlDocGen::deleteAllChars(s1,' ');
VhdlDocGen::deleteAllChars(s2,' ');
- equ+=abs(VhdlDocGen::compareString(s1,s2));
+ equ+=abs(compareString(s1,s2));
s1=arg->attrib;
s2=arg1->attrib;
VhdlDocGen::deleteAllChars(s1,' ');
VhdlDocGen::deleteAllChars(s2,' ');
- equ+=abs(VhdlDocGen::compareString(s1,s2));
+ equ+=abs(compareString(s1,s2));
// printf("\n 1. type [%s] name [%s] attrib [%s]",arg->type,arg->name,arg->attrib);
// printf("\n 2. type [%s] name [%s] attrib [%s]",arg1->type,arg1->name,arg1->attrib);
} // for
@@ -1003,9 +1039,9 @@ void VhdlDocGen::findAllArchitectures(QList<QCString>& qll,const ClassDef *cd)
{
QStringList ql=QStringList::split("-",jj,FALSE);
QCString temp=ql[1].utf8();
- if (stricmp(cd->className().data(),temp.data())==0)
+ if (qstricmp(cd->className(),temp)==0)
{
- QCString *cl=new QCString(jj.data());
+ QCString *cl=new QCString(jj);
qll.insert(0,cl);
}
}
@@ -1057,14 +1093,6 @@ void VhdlDocGen::writeVhdlLink(const ClassDef* ccd ,OutputList& ol,QCString& typ
ol.lineBreak();
}
-bool VhdlDocGen::compareString(const QCString& s1,const QCString& s2)
-{
- QCString str1=s1.stripWhiteSpace();
- QCString str2=s2.stripWhiteSpace();
-
- return stricmp(str1.data(),str2.data());
-}
-
/*!
* strips the "--" prefixes of vhdl comments
@@ -1078,7 +1106,7 @@ void VhdlDocGen::prepareComment(QCString& qcs)
{
index=qcs.find(s,0,TRUE);
if (index<0) break;
- qcs=qcs.remove(index,strlen(s));
+ qcs=qcs.remove(index,qstrlen(s));
}
qcs=qcs.stripWhiteSpace();
}
@@ -1176,7 +1204,7 @@ QCString VhdlDocGen::getProtectionName(int prot)
return "";
}
-QCString VhdlDocGen::trTypeString(int type)
+QCString VhdlDocGen::trTypeString(uint64 type)
{
switch(type)
{
@@ -1295,16 +1323,16 @@ void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberD
find=find.left(j);
buf[0]=temp[j];
ss=VhdlDocGen::findKeyWord(find);
- bool k=VhdlDocGen::isNumber(find); // is this a number
+ bool k=isNumber(find); // is this a number
if (k)
{
ol.docify(" ");
- VhdlDocGen::startFonts(find,"vhdldigit",ol);
+ startFonts(find,"vhdldigit",ol);
ol.docify(" ");
}
else if (j != 0 && ss)
{
- VhdlDocGen::startFonts(find,ss->data(),ol);
+ startFonts(find,ss->data(),ol);
}
else
{
@@ -1313,7 +1341,7 @@ void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberD
VhdlDocGen::writeStringLink(mdef,find,ol);
}
}
- VhdlDocGen::startFonts(&buf[0],"vhdlchar",ol);
+ startFonts(&buf[0],"vhdlchar",ol);
QCString st=temp.remove(0,j+1);
find=st;
@@ -1323,7 +1351,7 @@ void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberD
if (ii>1)
{
QCString com=find.left(ii+1);
- VhdlDocGen::startFonts(com,"keyword",ol);
+ startFonts(com,"keyword",ol);
temp=find.remove(0,ii+1);
}
}
@@ -1336,7 +1364,7 @@ void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberD
}//if
else
{
- VhdlDocGen::startFonts(find,"vhdlchar",ol);
+ startFonts(find,"vhdlchar",ol);
}
ol.endBold();
}// writeFormatString
@@ -1344,7 +1372,6 @@ void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberD
/*!
* returns TRUE if this string is a number
*/
-
bool VhdlDocGen::isNumber(const QCString& s)
{
static QRegExp regg("[0-9][0-9eEfFbBcCdDaA_.#-+?xXzZ]*");
@@ -1357,12 +1384,6 @@ bool VhdlDocGen::isNumber(const QCString& s)
}// isNumber
-void VhdlDocGen::startFonts(const QCString& q, const char *keyword,OutputList& ol)
-{
- ol.startFontClass(keyword);
- ol.docify(q.data());
- ol.endFontClass();
-}
/*!
* inserts white spaces for better readings
@@ -1452,16 +1473,18 @@ void VhdlDocGen::writeProcedureProto(OutputList& ol,const ArgumentList* al,const
arg->defval+=" ";
if (str)
{
- VhdlDocGen::startFonts(arg->defval,str->data(),ol);
+ startFonts(arg->defval,str->data(),ol);
}
else
{
- VhdlDocGen::startFonts(arg->defval,"vhdlchar",ol); // write type (variable,constant etc.)
+ startFonts(arg->defval,"vhdlchar",ol); // write type (variable,constant etc.)
}
- VhdlDocGen::startFonts(nn,"vhdlchar",ol); // write name
- if (stricmp(arg->attrib.data(),arg->type.data()) != 0)
- VhdlDocGen::startFonts(arg->attrib.lower(),"stringliteral",ol); // write in|out
+ startFonts(nn,"vhdlchar",ol); // write name
+ if (qstricmp(arg->attrib,arg->type) != 0)
+ {
+ startFonts(arg->attrib.lower(),"stringliteral",ol); // write in|out
+ }
ol.docify(" ");
VhdlDocGen::formatString(arg->type,ol,mdef);
sem=TRUE;
@@ -1517,23 +1540,23 @@ void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList* al,const
if (str)
VhdlDocGen::formatString(att,ol,mdef);
else
- VhdlDocGen::startFonts(att,"vhdlchar",ol);
+ startFonts(att,"vhdlchar",ol);
}
QCString nn=arg->name;
nn+=": ";
QCString ss=arg->type.stripWhiteSpace(); //.lower();
QCString w=ss.stripWhiteSpace();//.upper();
- VhdlDocGen::startFonts(nn,"vhdlchar",ol);
- VhdlDocGen::startFonts("in ","stringliteral",ol);
+ startFonts(nn,"vhdlchar",ol);
+ startFonts("in ","stringliteral",ol);
QCString *str=VhdlDocGen::findKeyWord(ss);
if (str)
VhdlDocGen::formatString(w,ol,mdef);
else
- VhdlDocGen::startFonts(w,"vhdlchar",ol);
+ startFonts(w,"vhdlchar",ol);
if (arg->attrib)
- VhdlDocGen::startFonts(arg->attrib,"vhdlchar",ol);
+ startFonts(arg->attrib,"vhdlchar",ol);
sem=TRUE;
@@ -1577,7 +1600,7 @@ void VhdlDocGen::writeProcessProto(OutputList& ol,const ArgumentList* al,const M
ol.docify(" , ");
}
QCString nn=arg->name;
- // VhdlDocGen::startFonts(nn,"vhdlchar",ol);
+ // startFonts(nn,"vhdlchar",ol);
VhdlDocGen::writeFormatString(nn,ol,mdef);
sem=TRUE;
}
@@ -1761,27 +1784,27 @@ static void setGlobalType(MemberList *ml)
{
QCString l=mdd->typeString();
- if (strcmp(mdd->argsString(),"package")==0)
+ if (qstrcmp(mdd->argsString(),"package")==0)
{
mdd->setMemberSpecifiers(VhdlDocGen::INSTANTIATION);
}
- else if (strcmp(mdd->argsString(),"configuration")==0)
+ else if (qstrcmp(mdd->argsString(),"configuration")==0)
{
mdd->setMemberSpecifiers(VhdlDocGen::CONFIG);
}
- else if (strcmp(mdd->typeString(),"library")==0)
+ else if (qstrcmp(mdd->typeString(),"library")==0)
{
mdd->setMemberSpecifiers(VhdlDocGen::LIBRARY);
}
- else if (strcmp(mdd->typeString(),"use")==0)
+ else if (qstrcmp(mdd->typeString(),"use")==0)
{
mdd->setMemberSpecifiers(VhdlDocGen::USE);
}
- else if (stricmp(mdd->typeString(),"misc")==0)
+ else if (qstricmp(mdd->typeString(),"misc")==0)
{
mdd->setMemberSpecifiers(VhdlDocGen::MISCELLANEOUS);
}
- else if (stricmp(mdd->typeString(),"ucf_const")==0)
+ else if (qstricmp(mdd->typeString(),"ucf_const")==0)
{
mdd->setMemberSpecifiers(VhdlDocGen::UCF_CONST);
}
@@ -1821,7 +1844,7 @@ bool VhdlDocGen::writeVHDLTypeDocumentation(const MemberDef* mdef, const Definit
ol.docify(" ");
}
ol.docify(mdef->name());
- hasParams = VhdlDocGen::writeFuncProcDocu(mdef,ol, mdef->argumentList().pointer());
+ hasParams = VhdlDocGen::writeFuncProcDocu(mdef,ol, mdef->argumentList());
}
@@ -1880,7 +1903,6 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
bool /*inGroup*/)
{
static QRegExp reg("[%]");
- LockingPtr<MemberDef> lock(mdef,mdef);
Definition *d=0;
@@ -1939,9 +1961,9 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
Doxygen::tagFile << " <anchor>" << convertToXML(mdef->anchor()) << "</anchor>" << endl;
if (VhdlDocGen::isVhdlFunction(mdef))
- Doxygen::tagFile << " <arglist>" << convertToXML(VhdlDocGen::convertArgumentListToString(mdef->argumentList().pointer(),TRUE)) << "</arglist>" << endl;
+ Doxygen::tagFile << " <arglist>" << convertToXML(VhdlDocGen::convertArgumentListToString(mdef->argumentList(),TRUE)) << "</arglist>" << endl;
else if (VhdlDocGen::isProcedure(mdef))
- Doxygen::tagFile << " <arglist>" << convertToXML(VhdlDocGen::convertArgumentListToString(mdef->argumentList().pointer(),FALSE)) << "</arglist>" << endl;
+ Doxygen::tagFile << " <arglist>" << convertToXML(VhdlDocGen::convertArgumentListToString(mdef->argumentList(),FALSE)) << "</arglist>" << endl;
else
Doxygen::tagFile << " <arglist>" << convertToXML(mdef->argsString()) << "</arglist>" << endl;
@@ -1971,6 +1993,10 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
// start a new member declaration
bool isAnonymous = annoClassDef; // || m_impl->annMemb || m_impl->annEnumType;
///printf("startMemberItem for %s\n",name().data());
+ int mm=mdef->getMemberSpecifiers();
+ if (mm==VhdlDocGen::MISCELLANEOUS)
+ isAnonymous=TRUE;
+
ol.startMemberItem( mdef->anchor(), isAnonymous ); //? 1 : m_impl->tArgList ? 3 : 0);
// If there is no detailed description we need to write the anchor here.
@@ -1996,19 +2022,18 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
ltype=ltype.replace(reg," ");
QCString largs(mdef->argsString());
largs=largs.replace(reg," ");
- int mm=mdef->getMemberSpecifiers();
mdef->setType(ltype.data());
mdef->setArgsString(largs.data());
//ClassDef * plo=mdef->getClassDef();
ClassDef *kl=0;
- LockingPtr<ArgumentList> alp = mdef->argumentList();
+ ArgumentList *alp = mdef->argumentList();
QCString nn;
//VhdlDocGen::adjustRecordMember(mdef);
if (gd) gd=0;
- switch(mm)
+ switch (mm)
{
case VhdlDocGen::MISCELLANEOUS:
- VhdlDocGen::writeCodeFragment(mdef,ol);
+ VhdlDocGen::writeSource(mdef,ol,nn);
break;
case VhdlDocGen::PROCEDURE:
case VhdlDocGen::FUNCTION:
@@ -2020,10 +2045,10 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
writeLink(mdef,ol);
if (alp!=0 && mm==VhdlDocGen::FUNCTION)
- VhdlDocGen::writeFunctionProto(ol,alp.pointer(),mdef);
+ VhdlDocGen::writeFunctionProto(ol,alp,mdef);
if (alp!=0 && mm==VhdlDocGen::PROCEDURE)
- VhdlDocGen::writeProcedureProto(ol,alp.pointer(),mdef);
+ VhdlDocGen::writeProcedureProto(ol,alp,mdef);
break;
case VhdlDocGen::USE:
@@ -2086,7 +2111,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
case VhdlDocGen::PROCESS:
writeLink(mdef,ol);
ol.insertMemberAlign();
- VhdlDocGen::writeProcessProto(ol,alp.pointer(),mdef);
+ VhdlDocGen::writeProcessProto(ol,alp,mdef);
break;
case VhdlDocGen::PACKAGE:
case VhdlDocGen::ENTITY:
@@ -2182,17 +2207,13 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
bRec=largs.stripPrefix("record") ;
bUnit=largs.stripPrefix("units") ;
ol.startBold();
- if (bRec)
- ol.docify("record: ");
- if (bUnit)
- ol.docify("units: ");
+ if (bRec) ol.docify("record: ");
+ if (bUnit) ol.docify("units: ");
writeLink(mdef,ol);
ol.insertMemberAlign();
- if (!bRec)
- VhdlDocGen::formatString(ltype,ol,mdef);
+ if (!bRec) VhdlDocGen::formatString(ltype,ol,mdef);
if (bUnit) ol.lineBreak();
- if (bRec || bUnit)
- writeRecorUnit(largs,ol,mdef);
+ if (bRec || bUnit) writeRecorUnit(largs,ol,mdef);
ol.endBold();
break;
@@ -2222,7 +2243,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
if (!mdef->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC") /* && !annMemb */)
{
ol.startMemberDescription(mdef->anchor());
- ol.parseDoc(mdef->briefFile(),mdef->briefLine(),
+ ol.generateDoc(mdef->briefFile(),mdef->briefLine(),
mdef->getOuterScope()?mdef->getOuterScope():d,
mdef,mdef->briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
if (detailsVisible)
@@ -2251,14 +2272,6 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
}// end writeVhdlDeclaration
-void VhdlDocGen::writeLink(const MemberDef* mdef,OutputList &ol)
-{
- ol.writeObjectLink(mdef->getReference(),
- mdef->getOutputFileBase(),
- mdef->anchor(),
- mdef->name());
-}
-
void VhdlDocGen::writePlainVHDLDeclarations(
MemberList* mlist,OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,int specifier)
@@ -2266,8 +2279,6 @@ void VhdlDocGen::writePlainVHDLDeclarations(
SDict<QCString> pack(1009);
- ol.pushGeneratorState();
-
bool first=TRUE;
MemberDef *md;
MemberListIterator mli(*mlist);
@@ -2293,7 +2304,7 @@ void VhdlDocGen::writePlainVHDLDeclarations(
pack.clear();
}//plainDeclaration
-bool VhdlDocGen::membersHaveSpecificType(MemberList *ml,int type)
+static bool membersHaveSpecificType(MemberList *ml,uint64 type)
{
if (ml==0) return FALSE;
MemberDef *mdd=0;
@@ -2338,7 +2349,7 @@ void VhdlDocGen::writeVHDLDeclarations(MemberList* ml,OutputList &ol,
if (subtitle && subtitle[0]!=0)
{
ol.startMemberSubtitle();
- ol.parseDoc("[generated]",-1,0,0,subtitle,FALSE,FALSE,0,TRUE,FALSE);
+ ol.generateDoc("[generated]",-1,0,0,subtitle,FALSE,FALSE,0,TRUE,FALSE);
ol.endMemberSubtitle();
} //printf("memberGroupList=%p\n",memberGroupList);
@@ -2364,7 +2375,7 @@ void VhdlDocGen::writeVHDLDeclarations(MemberList* ml,OutputList &ol,
{
//printf("Member group has docs!\n");
ol.startMemberGroupDocs();
- ol.parseDoc("[generated]",-1,0,0,mg->documentation()+"\n",FALSE,FALSE);
+ ol.generateDoc("[generated]",-1,0,0,mg->documentation()+"\n",FALSE,FALSE);
ol.endMemberGroupDocs();
}
ol.startMemberGroup();
@@ -2381,7 +2392,6 @@ void VhdlDocGen::writeVHDLDeclarations(MemberList* ml,OutputList &ol,
bool VhdlDocGen::writeClassType( ClassDef *& cd,
OutputList &ol ,QCString & cname)
{
-
int id=cd->protection();
QCString qcs = VhdlDocGen::trTypeString(id+2);
cname=VhdlDocGen::getClassName(cd);
@@ -2393,7 +2403,7 @@ bool VhdlDocGen::writeClassType( ClassDef *& cd,
return FALSE;
}// writeClassLink
-QCString VhdlDocGen::trVhdlType(int type,bool sing)
+QCString VhdlDocGen::trVhdlType(uint64 type,bool sing)
{
switch(type)
{
@@ -2537,53 +2547,56 @@ void VhdlDocGen::writeStringLink(const MemberDef *mdef,QCString mem, OutputList&
}
}
}
- VhdlDocGen::startFonts(mem,"vhdlchar",ol);
+ startFonts(mem,"vhdlchar",ol);
}// found component
-void VhdlDocGen::writeCodeFragment( MemberDef *mdef,OutputList& ol)
+
+
+void VhdlDocGen::writeSource(MemberDef *mdef,OutputList& ol,QCString & cname)
{
+ ParserInterface *pIntf = Doxygen::parserManager->getParser(".vhd");
+ pIntf->resetCodeParserState();
+
QCString codeFragment=mdef->documentation();
- QStringList qsl=QStringList::split("\n",codeFragment);
- writeLink(mdef,ol);
- ol.docify(" ");
- ol.insertMemberAlign();
- int len= qsl.count();
- for(int j=0;j<len;j++)
+
+ if (cname.isEmpty())
{
- QCString q=qsl[j].utf8();
- VhdlDocGen::writeFormatString(q,ol,mdef);
- ol.lineBreak();
- if (j==2) // only the first three lines are shown
+ writeLink(mdef,ol);
+ int fi=0;
+ int j=0;
+ do
{
- q = "...";
- VhdlDocGen::writeFormatString(q,ol,mdef);
- break;
+ fi=codeFragment.find("\n",++fi);
+ } while(fi>=0 && j++ <3);
+
+ // show only the first four lines
+ if (j==4)
+ {
+ codeFragment=codeFragment.left(fi);
+ codeFragment.append("\n .... ");
}
}
-}
-
-void VhdlDocGen::writeSource(MemberDef *mdef,OutputList& ol,QCString & cname)
-{
- QCString codeFragment=mdef->documentation();
- int start=mdef->getStartBodyLine();
- QStringList qsl=QStringList::split("\n",codeFragment);
+
+ codeFragment.prepend("\n");
+ ol.pushGeneratorState();
ol.startCodeFragment();
- int len = qsl.count();
- QCString lineNumber;
- int j;
- for (j=0;j<len;j++)
- {
- lineNumber.sprintf("%05d",start++);
- lineNumber+=" ";
- ol.startBold();
- ol.docify(lineNumber.data());
- ol.endBold();
- ol.insertMemberAlign();
- QCString q=qsl[j].utf8();
- VhdlDocGen::writeFormatString(q,ol,mdef);
- ol.lineBreak();
- }
+ pIntf->parseCode(ol, // codeOutIntf
+ 0, // scope
+ codeFragment, // input
+ FALSE, // isExample
+ 0, // exampleName
+ mdef->getFileDef(), // fileDef
+ mdef->getStartBodyLine(), // startLine
+ mdef->getEndBodyLine(), // endLine
+ TRUE, // inlineFragment
+ mdef, // memberDef
+ TRUE // show line numbers
+ );
+
ol.endCodeFragment();
+ ol.popGeneratorState();
+
+ if (cname.isEmpty()) return;
mdef->writeSourceDef(ol,cname);
mdef->writeSourceRefs(ol,cname);
@@ -2591,6 +2604,7 @@ void VhdlDocGen::writeSource(MemberDef *mdef,OutputList& ol,QCString & cname)
}
+
QCString VhdlDocGen::convertFileNameToClassName(QCString name)
{
@@ -2620,7 +2634,7 @@ void VhdlDocGen::parseUCF(const char* input, Entry* entity,QCString fileName,b
QCString comment("#!");
QCString brief;
- while(!ucFile.isEmpty())
+ while (!ucFile.isEmpty())
{
int i=ucFile.find("\n");
if (i<0) break;
@@ -2642,7 +2656,9 @@ void VhdlDocGen::parseUCF(const char* input, Entry* entity,QCString fileName,b
{
int i=temp.find("-name");
if (i>0)
+ {
temp=temp.remove(0,i+5);
+ }
temp.stripPrefix("set_location_assignment");
@@ -2673,7 +2689,7 @@ static void initUCF(Entry* root,const char* type,QCString & qcs,int line,QCStr
QRegExp sp("\\s");
QRegExp reg("[\\s=]");
QCString n;
- // bool bo=(stricmp(type,qcs.data())==0);
+ // bool bo=(qstricmp(type,qcs.data())==0);
VhdlDocGen::deleteAllChars(qcs,';');
qcs=qcs.stripWhiteSpace();
@@ -2730,7 +2746,7 @@ static void writeUCFLink(const MemberDef* mdef,OutputList &ol)
{
QCString largs(mdef->argsString());
- QCString n= VhdlDocGen::splitString(largs, '#');
+ QCString n= splitString(largs, '#');
// VhdlDocGen::adjustRecordMember(mdef);
bool equ=(n.length()==largs.length());
@@ -2742,25 +2758,17 @@ static void writeUCFLink(const MemberDef* mdef,OutputList &ol)
}
if (mdef->name().contains("dummy")==0)
- VhdlDocGen::writeLink(mdef,ol);
+ {
+ writeLink(mdef,ol);
+ }
if (equ)
+ {
ol.insertMemberAlign();
+ }
ol.docify(" ");
VhdlDocGen::formatString(largs,ol,mdef);
}
-QCString VhdlDocGen::splitString(QCString& str, char c)
-{
- QCString n=str;
- int i=str.find(c);
- if (i>0)
- {
- n=str.left(i);
- str=str.remove(0,i+1);
- }
- return n;
-}
-
bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne)
{
FileName *fn=Doxygen::inputNameList->first();
@@ -2773,10 +2781,10 @@ bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne)
if (Config_getBool("HAVE_DOT") && Config_getEnum("DOT_IMAGE_FORMAT")=="svg")
{
- QCString ov = theTranslator->trDesignOverview();
- QCString ofile("vhdl_design_overview");
- LayoutNavEntry *oo=new LayoutNavEntry( lne,LayoutNavEntry::MainPage,TRUE,ofile,ov,"");
- kk->addChild(oo);
+ QCString ov = theTranslator->trDesignOverview();
+ QCString ofile("vhdl_design_overview");
+ LayoutNavEntry *oo=new LayoutNavEntry( lne,LayoutNavEntry::MainPage,TRUE,ofile,ov,"");
+ kk->addChild(oo);
}
while (fn)
@@ -2819,7 +2827,9 @@ QCString VhdlDocGen::parseForConfig(QCString & entity,QCString & arch)
arch= ql[2].utf8();
ql=QStringList::split(exp,arch,FALSE);
if (ql.count()>1) // expression
+ {
arch="";
+ }
}
return label; // label
}
@@ -2835,16 +2845,22 @@ QCString VhdlDocGen::parseForBinding(QCString & entity,QCString & arch)
QStringList ql=QStringList::split(exp,entity,FALSE);
if (ql.contains("open"))
+ {
return "open";
+ }
label=ql[0].utf8();
entity = ql[1].utf8();
if ((index=entity.findRev("."))>=0)
+ {
entity.remove(0,index+1);
+ }
if (ql.count()==3)
+ {
arch=ql[2].utf8();
+ }
return label;
}
@@ -2858,8 +2874,10 @@ QCString VhdlDocGen::parseForBinding(QCString & entity,QCString & arch)
ClassDef *cd;
for (;(cd=cli.current());++cli)
{
- if(stricmp(className,cd->name().data())==0)
- return cd;
+ if (qstricmp(className,cd->name().data())==0)
+ {
+ return cd;
+ }
}
return 0;
}
@@ -2878,27 +2896,27 @@ void assignBinding(VhdlConfNode * conf)
{
QList<Entry> instList= getVhdlInstList();
QListIterator<Entry> eli(instList);
- Entry *cur;
- ClassDef *archClass,*entClass;
+ Entry *cur=0;
+ ClassDef *archClass=0,*entClass=0;
QCString archName,entityName;
QCString arcBind,entBind;
-
+
bool others,all;
entBind=conf->binding;
QCString conf2=VhdlDocGen::parseForBinding(entBind,arcBind);
-
- if(stricmp(conf2.data(),"configuration")==0)
+
+ if (qstricmp(conf2,"configuration")==0)
{
QList<VhdlConfNode> confList = getVhdlConfiguration();
VhdlConfNode* vconf;
- bool found=false;
+ // bool found=false;
for (uint iter=0;iter<confList.count(); iter++)
{
vconf= (VhdlConfNode *)confList.at(iter);
QCString n=VhdlDocGen::getIndexWord(vconf->confVhdl.data(),0);
if (n==entBind)
{
- found=true;
+ // found=true;
entBind=VhdlDocGen::getIndexWord(vconf->confVhdl.data(),1);
QCString a=VhdlDocGen::getIndexWord(conf->compSpec.data(),0);
QCString e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),1);
@@ -2908,24 +2926,31 @@ void assignBinding(VhdlConfNode * conf)
break;
}
}
- if (!found)
- err("error: %s%s",conf->binding.data()," could not be found");
- //return;
- }// if
- else{ // find entity work.entname(arch?)
- QCString a=VhdlDocGen::getIndexWord(conf->compSpec.data(),0);
- QCString e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),1);
- a=e+"::"+a;
- archClass= VhdlDocGen::findVhdlClass(a.data());//Doxygen::classSDict->find(a.data());
+ }
+ else // conf2!=configuration
+ {
+ QCString a,c,e;
+ if (conf->isInlineConf)
+ {
+ c=conf->confVhdl;
+ e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),0);
+ }
+ else
+ {
+ a=VhdlDocGen::getIndexWord(conf->compSpec.data(),0);
+ e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),1);
+ c=e+"::"+a;
+ }
+ archClass= VhdlDocGen::findVhdlClass(c.data());//Doxygen::classSDict->find(a.data());
entClass= VhdlDocGen::findVhdlClass(e.data()); //Doxygen::classSDict->find(e.data());
}
-
+
QCString label=conf->compSpec.lower();
//label.prepend("|");
if (!archClass)
{
- err("\n error:architecture %s not found ! ",conf->confVhdl.data());
+ // err("architecture %s not found ! ",conf->confVhdl.data());
return;
}
@@ -2933,57 +2958,60 @@ void assignBinding(VhdlConfNode * conf)
QCString allOt=VhdlDocGen::getIndexWord(conf->arch.data(),0);
all=allOt.lower()=="all" ;
others= allOt.lower()=="others";
-
- for (;(cur=eli.current());++eli){
-
+
+ for (;(cur=eli.current());++eli)
+ {
if (cur->exception.lower()==label || conf->isInlineConf)
{
QCString sign,archy;
if (all || others)
+ {
archy=VhdlDocGen::getIndexWord(conf->arch.data(),1);
- else
+ }
+ else
+ {
archy=conf->arch;
-
-
- QCString inst1=VhdlDocGen::getIndexWord(archy.data(),0).lower();
- QCString comp=VhdlDocGen::getIndexWord(archy.data(),1).lower();
+ }
- QStringList ql=QStringList::split(",",inst1);
+ QCString inst1=VhdlDocGen::getIndexWord(archy.data(),0).lower();
+ QCString comp=VhdlDocGen::getIndexWord(archy.data(),1).lower();
- for(uint j=0;j<ql.count();j++)
- {
- QCString archy1,sign1;
- if(all || others)
- {
- archy1=VhdlDocGen::getIndexWord(conf->arch.data(),1);
- sign1=cur->type;
- }
- else
- {
- archy1=comp+":"+ql[j].utf8();
- sign1=cur->type+":"+cur->name;
- }
-
- if (archy1==sign1.lower() && !cur->stat)
+ QStringList ql=QStringList::split(",",inst1);
+
+ for (uint j=0;j<ql.count();j++)
{
- // fprintf(stderr," \n label [%s] [%s] [%s]",cur->exception.data(),cur->type.data(),cur->name.data());
- ClassDef *ent= VhdlDocGen::findVhdlClass(entBind.data());//Doxygen::classSDict->find(entBind.data());
-
- if (entClass==0 || ent==0)
- continue;
-
- addInstance(ent,archClass,entClass,cur);
- cur->stat=TRUE;
- break;
- }
- }// for
- }
- }//for
+ QCString archy1,sign1;
+ if (all || others)
+ {
+ archy1=VhdlDocGen::getIndexWord(conf->arch.data(),1);
+ sign1=cur->type;
+ }
+ else
+ {
+ archy1=comp+":"+ql[j].utf8();
+ sign1=cur->type+":"+cur->name;
+ }
-}//assignBinding
+ if (archy1==sign1.lower() && !cur->stat)
+ {
+ // fprintf(stderr," \n label [%s] [%s] [%s]",cur->exception.data(),cur->type.data(),cur->name.data());
+ ClassDef *ent= VhdlDocGen::findVhdlClass(entBind.data());//Doxygen::classSDict->find(entBind.data());
+ if (entClass==0 || ent==0)
+ {
+ continue;
+ }
+ addInstance(ent,archClass,entClass,cur);
+ cur->stat=TRUE;
+ break;
+ }
+ }// for
+ }
+ }//for each element in instList
+
+}//assignBinding
/*
@@ -2997,7 +3025,7 @@ void assignBinding(VhdlConfNode * conf)
// ........
// end architecture
- */
+*/
void VhdlDocGen::computeVhdlComponentRelations()
{
@@ -3008,7 +3036,9 @@ void VhdlDocGen::computeVhdlComponentRelations()
{
VhdlConfNode* conf= (VhdlConfNode *)confList.at(iter);
if (!(conf->isInlineConf || conf->isLeaf))
+ {
continue;
+ }
assignBinding(conf);
}
@@ -3019,7 +3049,9 @@ void VhdlDocGen::computeVhdlComponentRelations()
for (eli.toFirst();(cur=eli.current());++eli)
{
if (cur->stat ) // was bind
+ {
continue;
+ }
if (cur->includeName=="entity" || cur->includeName=="component" )
{
@@ -3031,17 +3063,18 @@ void VhdlDocGen::computeVhdlComponentRelations()
entity=cur->type;
}
-
-
ClassDef *classEntity= VhdlDocGen::findVhdlClass(entity.data());//Doxygen::classSDict->find(entity);
inst=VhdlDocGen::getIndexWord(cur->args.data(),0);
ClassDef *cd=Doxygen::classSDict->find(inst);
ClassDef *ar=Doxygen::classSDict->find(cur->args);
- if (cd==0) continue;
+ if (cd==0)
+ {
+ continue;
+ }
- if (classEntity==0)
- err("error: %s:%d:Entity:%s%s",cur->fileName.data(),cur->startLine,entity.data()," could not be found");
+ // if (classEntity==0)
+ // err("%s:%d:Entity:%s%s",cur->fileName.data(),cur->startLine,entity.data()," could not be found");
addInstance(classEntity,ar,cd,cur);
}
@@ -3050,23 +3083,23 @@ void VhdlDocGen::computeVhdlComponentRelations()
static void addInstance(ClassDef* classEntity, ClassDef* ar,
ClassDef *cd , Entry *cur,ClassDef* /*archBind*/)
+{
+
+ QCString bName,n1;
+ if (ar==0) return;
+
+ if (classEntity==0)
{
-
- QCString bName,n1;
- if (ar==0) return;
+ //add component inst
+ n1=cur->type;
+ goto ferr;
+ }
- if(classEntity==0)
- {
- //add component inst
- n1=cur->type;
- goto ferr;
- }
-
if (classEntity==cd) return;
- bName=classEntity->name();
- // fprintf(stderr,"\naddInstance %s to %s %s %s\n", classEntity->name().data(),cd->name().data(),ar->name().data(),cur->name);
- n1=classEntity->name().data();
+ bName=classEntity->name();
+ // fprintf(stderr,"\naddInstance %s to %s %s %s\n", classEntity->name().data(),cd->name().data(),ar->name().data(),cur->name);
+ n1=classEntity->name().data();
if (!cd->isBaseClass(classEntity, true, 0))
{
@@ -3086,7 +3119,7 @@ static void addInstance(ClassDef* classEntity, ClassDef* ar,
ferr:
QCString uu=cur->name;
MemberDef *md=new MemberDef(
- ar->getDefFileName(), cur->startLine,
+ ar->getDefFileName(), cur->startLine,cur->startColumn,
n1,uu,uu, 0,
Public, Normal, cur->stat,Member,
MemberType_Variable,
@@ -3111,17 +3144,20 @@ ferr:
md->setDocumentation(cur->doc.data(),cur->docFile.data(),cur->docLine);
FileDef *fd=ar->getFileDef();
md->setBodyDef(fd);
+
+
+ QCString info="Info: Elaborating entity "+n1;
+ fd=ar->getFileDef();
+ info+=" for hierarchy ";
+ QRegExp epr("[|]");
+ QCString label=cur->type+":"+cur->write+":"+cur->name;
+ label.replace(epr,":");
+ info+=label;
+ fprintf(stderr,"\n[%s:%d:%s]\n",fd->fileName().data(),cur->startLine,info.data());
+
- QCString info="Info: Elaborating entity "+n1;
- fd=ar->getFileDef();
- info+=" for hierarchy ";
- QRegExp epr("[|]");
- QCString label=cur->type+":"+cur->write+":"+cur->name;
- label.replace(epr,":");
- info+=label;
- fprintf(stderr,"\n[%s:%d:%s]\n",fd->fileName().data(),cur->startLine,info.data());
- ar->insertMember(md);
-
+ ar->insertMember(md);
+
}
@@ -3141,8 +3177,7 @@ void VhdlDocGen::writeRecorUnit(QCString & largs,OutputList& ol ,const MemberDe
void VhdlDocGen::writeRecUnitDocu(
const MemberDef *md,
OutputList& ol,
- QCString largs
- )
+ QCString largs)
{
QStringList ql=QStringList::split("#",largs,FALSE);
@@ -3167,27 +3202,7 @@ void VhdlDocGen::writeRecUnitDocu(
}
}//#
-void VhdlDocGen::writeCodeFragment(OutputList& ol,int start, QCString & codeFragment,const MemberDef* mdef)
-{
- QStringList qsl=QStringList::split("\n",codeFragment);
- ol.startCodeFragment();
- int len = qsl.count();
- QCString lineNumber;
- int j;
- for (j=0;j<len;j++)
- {
- lineNumber.sprintf("%05d",start++);
- lineNumber+=" ";
- ol.startBold();
- ol.docify(lineNumber.data());
- ol.endBold();
- ol.insertMemberAlign();
- QCString q=qsl[j].utf8();
- VhdlDocGen::writeFormatString(q,ol,mdef);
- ol.docify("\n");
- }
- ol.endCodeFragment();
-}
+
bool VhdlDocGen::isSubClass(ClassDef* cd,ClassDef *scd, bool followInstances,int level)
{
@@ -3273,6 +3288,8 @@ static MemberDef* findMemFlow(const MemberDef* mdef)
void VhdlDocGen::createFlowChart(const MemberDef *mdef)
{
+ if (mdef==0) return;
+
QCString codeFragment;
MemberDef* mm=0;
if((mm=findMemFlow(mdef))!=0)
@@ -3282,7 +3299,9 @@ void VhdlDocGen::createFlowChart(const MemberDef *mdef)
return;
}
else
+ {
mdList.append(mdef);
+ }
//fprintf(stderr,"\n create flow mem %s %p\n",mdef->name().data(),mdef);
@@ -3295,8 +3314,10 @@ void VhdlDocGen::createFlowChart(const MemberDef *mdef)
VHDLLanguageScanner *pIntf =(VHDLLanguageScanner*) Doxygen::parserManager->getParser(".vhd");
VhdlDocGen::setFlowMember(mdef);
Entry root;
- pIntf->parseInput("",codeFragment.data(),&root);
-
+ QStrList filesInSameTu;
+ pIntf->startTranslationUnit("");
+ pIntf->parseInput("",codeFragment.data(),&root,FALSE,filesInSameTu);
+ pIntf->finishTranslationUnit();
}
bool VhdlDocGen::isConstraint(const MemberDef *mdef)
@@ -3358,47 +3379,184 @@ bool VhdlDocGen::isMisc(const MemberDef *mdef)
//############################## Flowcharts #################################################
+#define STARTL (FlowChart::WHILE_NO | FlowChart::IF_NO | \
+ FlowChart::FOR_NO | FlowChart::CASE_NO | \
+ FlowChart::LOOP_NO | WHEN_NO)
+#define DECLN (FlowChart::WHEN_NO | \
+ FlowChart::ELSIF_NO | FlowChart::IF_NO | \
+ FlowChart::FOR_NO | FlowChart::WHILE_NO | \
+ FlowChart::CASE_NO | FlowChart::LOOP_NO )
+#define STARTFIN (FlowChart::START_NO | FlowChart::END_NO)
+#define LOOP (FlowChart::FOR_NO | FlowChart::WHILE_NO | \
+ FlowChart::LOOP_NO )
+#define ENDCL (FlowChart::END_CASE | FlowChart::END_LOOP)
+#define EEND (FlowChart::ENDIF_NO | FlowChart::ELSE_NO )
+#define IFF (FlowChart::ELSIF_NO | FlowChart::IF_NO)
+#define EXITNEXT (FlowChart::EXIT_NO | FlowChart::NEXT_NO )
+#define EMPTY (EEND | FlowChart::ELSIF_NO)
+#define EE (FlowChart::ELSE_NO | FlowChart::ELSIF_NO)
+#define EMPTNODE (ENDCL | EEND | FlowChart::ELSIF_NO)
+#define FLOWLEN (flowList.count()-1)
+
+static int ifcounter=0;
+static int nodeCounter=0;
+
+static struct
+{
+ // link colors
+ const char *textNodeLink;
+ const char *yesNodeLink;
+ const char *noNodeLink;
+
+ // node colors
+ const char* comment;
+ const char* decisionNode;
+ const char* varNode;
+ const char *startEndNode;
+ const char* textNode;
+} flowCol =
+{ "green", // textNodeLink
+ "red", // yesNodeLink
+ "black", // noNodeLink
+ "khaki", // comment
+ "0.7 0.3 1.0", // decisionNode
+ "lightyellow", // varNode
+ "white", // startEndNode
+ "lightcyan" // textNode
+};
+
+QList<FlowChart> FlowChart::flowList;
+
+#ifdef DEBUGFLOW
+static QMap<QCString,int> keyMap;
+#endif
+
+void alignText(QCString & q)
+{
+ if (q.length()<=80) return;
+
+ if (q.length()>200)
+ {
+ q.resize(200);
+ }
+
+ q.append(" ...");
+
+ QRegExp reg("[\\s|]");
+ QCString str(q.data());
+ QCString temp;
+
+ while (str.length()>80)
+ {
+ int j=str.findRev(reg,80);
+ if (j<=0)
+ {
+ temp+=str;
+ q=temp;
+ return;
+ }
+ else
+ {
+ QCString qcs=str.left(j);
+ temp+=qcs+"\\";
+ temp+="n";
+ str.remove(0,j);
+ }
+ }//while
+
+ q=temp+str;
+// #endif
+}
+
+void FlowChart::printNode(const FlowChart* flo)
+{
+ if (flo==0) return;
+ QCString ui="-";
+ QCString q,t;
+ QRegExp ep("[\t\n\r]");
+
+ ui.fill('-',255);
+
+ if (flo->type & STARTL)
+ {
+ if (flo->stamp>0)
+ {
+ q=ui.left(2*flo->stamp);
+ }
+ else
+ {
+ q=" ";
+ }
+ QCString nn=flo->exp.stripWhiteSpace();
+ printf("\nYES: %s%s[%d,%d]",q.data(),nn.data(),flo->stamp,flo->id);
+ }
+ else
+ {
+ if (flo->type & COMMENT_NO)
+ {
+ t=flo->label;
+ }
+ else
+ {
+ t=flo->text;
+ }
+ t=t.replace(ep,"");
+ if (t.isEmpty())
+ {
+ t=" ";
+ }
+ if (flo->stamp>0)
+ {
+ q=ui.left(2*flo->stamp);
+ }
+ else
+ {
+ q=" ";
+ }
+ if (flo->type & EMPTNODE)
+ {
+ printf("\n NO: %s%s[%d,%d]",q.data(),FlowChart::getNodeType(flo->type),flo->stamp,flo->id);
+ }
+ else if (flo->type & COMMENT_NO)
+ {
+ printf("\n NO: %s%s[%d,%d]",t.data(),FlowChart::getNodeType(flo->type),flo->stamp,flo->id);
+ }
+ else
+ {
+ printf("\n NO: %s%s[%d,%d]",q.data(),t.data(),flo->stamp,flo->id);
+ }
+ }
+}
-#define STARTL (FlowNode::WHILE_NO | FlowNode::IF_NO | \
- FlowNode::FOR_NO | FlowNode::CASE_NO | \
- FlowNode::LOOP_NO )
-#define DECLN (FlowNode::NEXT_WHEN_NO | FlowNode::WHEN_NO | \
- FlowNode::ELSIF_NO | FlowNode::IF_NO | \
- FlowNode::FOR_NO | FlowNode::WHILE_NO | \
- FlowNode::CASE_NO | FlowNode::LOOP_NO )
-#define STARTFIN (FlowNode::START_NO | FlowNode::END_NO)
-#define LOOP (FlowNode::FOR_NO | FlowNode::WHILE_NO | \
- FlowNode::LOOP_NO )
-#define ENDCL (FlowNode::END_CASE | FlowNode::END_LOOP)
-#define EEND (FlowNode::ENDIF_NO | FlowNode::ELSE_NO)
-#define IFF (FlowNode::ELSIF_NO | FlowNode::IF_NO)
-#define EWHEN (FlowNode::NEXT_WHEN_NO)
-#define EMPTY (EEND | FlowNode::ELSIF_NO)
-
-int FlowNode::ifcounter=0;
-int FlowNode::nodeCounter=0;
-int FlowNode::imageCounter=0;
-int FlowNode::caseCounter=0;
-QList<FlowNode> FlowNode::flowList;
-
-void FlowNode::colTextNodes()
+void FlowChart::printFlowTree()
+{
+ uint size=flowList.count();
+ for (uint j=0;j<size;j++)
+ {
+ printNode(flowList.at(j));
+ }
+}
+
+void FlowChart::colTextNodes()
{
QCString text;
- FlowNode *flno;
+ FlowChart *flno;
bool found=FALSE;
for (uint j=0;j<flowList.count();j++)
{
- FlowNode *flo=flowList.at(j);
- if (flo->type==TEXT_NO)
+ FlowChart *flo=flowList.at(j);
+ if (flo->type&TEXT_NO)
{
text+=flo->text+'\n';
if (!found)
+ {
flno=flo;
+ }
if (found)
{
flno->text+=flo->text;
flowList.remove(flo);
- if (j>0)j=j-1;
+ if (j>0) j=j-1;
}
found=TRUE;
}
@@ -3410,14 +3568,14 @@ void FlowNode::colTextNodes()
// if..elseif without text
for (uint j=0;j<flowList.count()-1;j++)
{
- FlowNode *flo=flowList.at(j);
+ FlowChart *flo=flowList.at(j);
int kind=flo->type;
- if ( kind & IFF || flo->type==ELSE_NO)
+ if ( (kind & IFF) || (flo->type & ELSE_NO))
{
- FlowNode *ftemp=flowList.at(j+1);
+ FlowChart *ftemp=flowList.at(j+1);
if (ftemp->type & EMPTY)
{
- FlowNode *fNew = new FlowNode(TEXT_NO,"empty ",0);
+ FlowChart *fNew = new FlowChart(TEXT_NO,"empty ",0);
fNew->stamp=flo->stamp;
flowList.insert(j+1,fNew);
}
@@ -3426,14 +3584,14 @@ void FlowNode::colTextNodes()
}// colTextNode
-QCString FlowNode::getNodeName(int n)
+QCString FlowChart::getNodeName(int n)
{
QCString node;
node.setNum(n);
return node.prepend("node");
}
-void FlowNode::delFlowList()
+void FlowChart::delFlowList()
{
ifcounter=0;
nodeCounter=0;
@@ -3441,14 +3599,126 @@ void FlowNode::delFlowList()
for (uint j=0;j <size ;j++)
{
- FlowNode *fll=flowList.at(j);
+ FlowChart *fll=flowList.at(j);
delete fll;
}
flowList.clear();
}
+void FlowChart::alignCommentNode(FTextStream &t,QCString com)
+{
+ uint max=0;
+ QCString s;
+ QStringList ql=QStringList::split("\n",com);
+ for (uint j=0;j<ql.count();j++)
+ {
+ s=(QCString)ql[j].utf8();
+ if (max<s.length()) max=s.length();
+ }
+
+ s=ql.last().utf8();
+ int diff=max-s.length();
+
+ QCString n(1);
+ if (diff>0)
+ {
+ n.fill(' ',2*diff);
+ n.append(".");
+ s+=n;
+ ql.remove(ql.last());
+ ql.append(s);
+ }
+
+ for (uint j=0;j<ql.count();j++)
+ {
+ s=(QCString)ql[j].utf8();
+ if (j<ql.count()-1)
+ {
+ s+="\n";
+ }
+ FlowChart::codify(t,s.data());
+ }
+}
+
-void FlowNode::codify(FTextStream &t,const char *str)
+void FlowChart::buildCommentNodes(FTextStream & t)
+{
+ uint size=flowList.count();
+ bool begin=false;
+
+ for (uint j=0;j < size-1 ;j++)
+ {
+ FlowChart *fll=flowList.at(j);
+ if (fll->type & COMMENT_NO)
+ {
+ FlowChart* to=flowList.at(j+1);
+ if (to->type & COMMENT_NO)
+ {
+ fll->label+="\n";
+ QCString temp=fll->label+to->label;
+ to->label=temp;
+ flowList.remove(j);
+ size--;
+ if (j>0) j--;
+ }
+ }
+ }// for
+
+ for (uint j=0;j <flowList.count() ;j++)
+ {
+ FlowChart *fll=flowList.at(j);
+
+ if (fll->type & BEGIN_NO)
+ {
+ begin = true;
+ continue;
+ }
+
+ if (fll->type & COMMENT_NO)
+ {
+ FlowChart* to;
+ if (!begin)
+ {
+ // comment between function/process .. begin is linked to start node
+ to=flowList.at(0);
+ }
+ else
+ {
+ if (j>0 && flowList.at(j-1)->line==fll->line)
+ to=flowList.at(j-1);
+ else
+ to=flowList.at(j+1);
+ }
+ t << getNodeName(fll->id);
+ t << "[shape=none, label=<\n";
+ t << "<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"2\" >\n ";
+ t << "<TR><TD BGCOLOR=\"";
+ t << flowCol.comment;
+ t << "\" > ";
+
+ FlowChart::alignCommentNode(t,fll->label);
+ t << " </TD></TR></TABLE>>];";
+ writeEdge(t,fll->id,to->id,2);
+ }
+ }// for
+
+ // delete comment nodes;
+ size=flowList.count();
+ for (uint j=0;j < size;j++)
+ {
+ FlowChart *fll=flowList.at(j);
+ if (fll->type & (COMMENT_NO | BEGIN_NO))
+ {
+ flowList.remove(j);
+ delete fll;
+ fll=0;
+ size--;
+ if (j>0) j--;
+ }
+ }// for;
+}
+
+void FlowChart::codify(FTextStream &t,const char *str)
{
if (str)
{
@@ -3471,31 +3741,38 @@ void FlowNode::codify(FTextStream &t,const char *str)
}
}//codify
-FlowNode::~FlowNode()
+FlowChart::~FlowChart()
{
}
-FlowNode::FlowNode(int typ,const char * t,const char* ex,const char* label)
+FlowChart::FlowChart(int typ,const char * t,const char* ex,const char* lab)
{
+ stamp=ifcounter;
+
if (typ & STARTL)
{
ifcounter++;
}
- stamp=FlowNode::ifcounter;
text=t;
exp=ex;
type=typ;
- this->label=label;
+ label=lab;
+ if (typ & (ELSE_NO | ELSIF_NO))
+ {
+ stamp--;
+ }
- if (typ==START_NO || typ==END_NO || typ==VARIABLE_NO)
- stamp=-1;
+ if (typ & (START_NO | END_NO | VARIABLE_NO))
+ {
+ stamp=0;
+ }
- id=++nodeCounter;
+ id=nodeCounter++;
}
-void FlowNode::addFlowNode(int type,const char* text,const char* exp, const char *label)
+void FlowChart::addFlowChart(int type,const char* text,const char* exp, const char *label)
{
static QRegExp reg("[;]");
static QRegExp reg1("[\"]");
@@ -3512,122 +3789,89 @@ void FlowNode::addFlowNode(int type,const char* text,const char* exp, const char
}
if (exp)
+ {
expression=expression.replace(reg1,"\\\"");
+ }
+
+ FlowChart *fl=new FlowChart(type,typeString.data(),expression.data(),label);
+
+ fl->line=getVhdlCont()->yyLineNr;
- FlowNode *fl=new FlowNode(type,typeString.data(),expression.data(),label);
- if (type==START_NO)
+ if (type & (START_NO | VARIABLE_NO))
+ {
flowList.prepend(fl);
- else if (type==VARIABLE_NO)
- flowList.insert(1,fl);
+ }
else
+ {
flowList.append(fl);
+ }
}
-void FlowNode::moveToPrevLevel()
+void FlowChart::moveToPrevLevel()
{
if (!VhdlDocGen::getFlowMember()) return;
ifcounter--;
}
-void FlowNode::setLabel(const char* t)
+QCString FlowChart::convertNameToFileName()
{
- FlowNode *fll=flowList.last();
- fll->label=t;
- assert(fll->type & LOOP);
-
-}
-
-void FlowNode::printFlowList()
-{
- uint size=FlowNode::flowList.count();
- for (uint j=0;j<size;j++)
- {
- FlowNode *fll=flowList.at(j);
- QCString ty=getNodeType(fll->type);
-
- printf("============================================");
- if (!fll->text.isEmpty())
- {
- printf("\n (%d) NODE:type %s text %s stamp:%d\n",fll->id,ty.data(),fll->text.data(),fll->stamp);
- }
- else
- {
- printf("\n (%d) NODE:type %s exp %s stamp:%d [%s]\n",fll->id,ty.data(),fll->exp.data(),fll->stamp,fll->label.data());
- }
-
- printf("============================================");
- }// for
-}
-
-
-QCString FlowNode::convertNameToFileName()
-{
- static QRegExp exp ("[#&*+-/<=>|$?^]");
+ static QRegExp exp ("[^][a-z_A-Z0-9]");
QCString temp,qcs;
const MemberDef* md=VhdlDocGen::getFlowMember();
- temp.sprintf("%p",md);
- qcs=md->name();
+ temp.sprintf("%p",md);
+ qcs=md->name();
-//long pp=(long)&temp;
-
- // string literal
- VhdlDocGen::deleteAllChars(qcs,'"');
-
- // functions like "<=", ">"
- int u=qcs.find(exp,0);
-
- if (u>=0)
+ if (qcs.find(exp,0)>=0)
{
qcs.prepend("Z");
qcs=qcs.replace(exp,"_");
}
- // temp=temp.setNum(1);
return qcs+temp;
}
-const char* FlowNode::getNodeType(int c)
+const char* FlowChart::getNodeType(int c)
{
switch(c)
{
- case FlowNode::IF_NO: return "if ";
- case FlowNode::ELSIF_NO: return "elsif ";
- case FlowNode::ELSE_NO: return "else ";
- case FlowNode::CASE_NO: return "case ";
- case FlowNode::WHEN_NO: return "when ";
- case FlowNode::EXIT_NO: return "exit ";
- case FlowNode::END_NO: return "end ";
- case FlowNode::TEXT_NO: return "text ";
- case FlowNode::START_NO: return "start ";
- case FlowNode::ENDIF_NO: return "endif ";
- case FlowNode::FOR_NO: return "for ";
- case FlowNode::WHILE_NO: return "while ";
- case FlowNode::END_LOOP: return "end_loop ";
- case FlowNode::END_CASE: return "end_case ";
- case FlowNode::VARIABLE_NO: return "variable_decl ";
- case FlowNode::RETURN_NO: return "return ";
- case FlowNode::LOOP_NO: return "infinte loop ";
- case FlowNode::NEXT_NO: return "next ";
- case FlowNode::EXIT_WHEN_NO: return "exit_when ";
- case FlowNode::NEXT_WHEN_NO: return "next_when ";
- case FlowNode::EMPTY_NO: return "empty ";
+ case IF_NO: return "if ";
+ case ELSIF_NO: return "elsif ";
+ case ELSE_NO: return "else ";
+ case CASE_NO: return "case ";
+ case WHEN_NO: return "when ";
+ case EXIT_NO: return "exit ";
+ case END_NO: return "end ";
+ case TEXT_NO: return "text ";
+ case START_NO: return "start ";
+ case ENDIF_NO: return "endif ";
+ case FOR_NO: return "for ";
+ case WHILE_NO: return "while ";
+ case END_LOOP: return "end_loop ";
+ case END_CASE: return "end_case ";
+ case VARIABLE_NO: return "variable_decl ";
+ case RETURN_NO: return "return ";
+ case LOOP_NO: return "infinte loop ";
+ case NEXT_NO: return "next ";
+ case COMMENT_NO: return "comment ";
+ case EMPTY_NO: return "empty ";
+ case BEGIN_NO: return "<begin> ";
default: return "--failure--";
}
}
-void FlowNode::createSVG()
+void FlowChart::createSVG()
{
QCString qcs("/");
QCString ov = Config_getString("HTML_OUTPUT");
- FlowNode::imageCounter++;
- qcs+=FlowNode::convertNameToFileName()+".svg";
+ qcs+=FlowChart::convertNameToFileName()+".svg";
//const MemberDef *m=VhdlDocGen::getFlowMember();
- //fprintf(stderr,"\n creating flowchart : %s %s in file %s \n",VhdlDocGen::trTypeString(m->getMemberSpecifiers()),m->name().data(),m->getFileDef()->name().data());
+ //if (m)
+ // fprintf(stderr,"\n creating flowchart : %s %s in file %s \n",VhdlDocGen::trTypeString(m->getMemberSpecifiers()),m->name().data(),m->getFileDef()->name().data());
QCString dir=" -o "+ov+qcs;
ov+="/flow_design.dot";
@@ -3640,8 +3884,7 @@ void FlowNode::createSVG()
}
}
-
-void FlowNode::startDot(FTextStream &t)
+void FlowChart::startDot(FTextStream &t)
{
t << " digraph G { \n";
t << "rankdir=TB \n";
@@ -3649,12 +3892,12 @@ void FlowNode::startDot(FTextStream &t)
t << "stylesheet=\"doxygen.css\"\n";
}
-void FlowNode::endDot(FTextStream &t)
+void FlowChart::endDot(FTextStream &t)
{
t << " } \n";
}
-void FlowNode::writeFlowNode()
+void FlowChart::writeFlowChart()
{
// assert(VhdlDocGen::flowMember);
@@ -3665,29 +3908,35 @@ void FlowNode::writeFlowNode()
if (!f.open(IO_WriteOnly))
{
- err("Error: Cannot open file %s for writing\n",fileName.data());
+ err("Cannot open file %s for writing\n",fileName.data());
return;
}
colTextNodes();
- // printFlowList( );
- FlowNode::startDot(t);
+
+#ifdef DEBUGFLOW
+ printFlowTree();
+#endif
+
+ startDot(t);
+ buildCommentNodes(t);
+
uint size=flowList.count();
for (uint j=0;j <size ;j++)
{
- FlowNode *fll=flowList.at(j);
+ FlowChart *fll=flowList.at(j);
writeShape(t,fll);
}
writeFlowLinks(t);
- FlowNode::endDot(t);
+ FlowChart::endDot(t);
delFlowList();
f.close();
- FlowNode::createSVG();
-}// writeFlowNode
+ FlowChart::createSVG();
+}// writeFlowChart
-void FlowNode::writeShape(FTextStream &t,const FlowNode* fl)
+void FlowChart::writeShape(FTextStream &t,const FlowChart* fl)
{
if (fl->type & EEND) return;
QCString var;
@@ -3706,10 +3955,40 @@ void FlowNode::writeShape(FTextStream &t,const FlowNode* fl)
t<<getNodeName(fl->id).data();
QCString q=getNodeType(fl->type);
+
+#ifdef DEBUGFLOW
+ QCString qq(getNodeName(fl->id).data());
+ keyMap.insert(qq,fl->id);
+#endif
+
bool dec=(fl->type & DECLN);
+ bool exit=(fl->type & EXITNEXT);
+ if (exit && !fl->exp.isEmpty())
+ {
+ dec=TRUE;
+ }
if (dec)
{
- t << " [shape=diamond,style=filled,color=\".7 .3 1.0\",label=\" "+fl->exp+var+"\"]\n";
+ QCString exp=fl->exp;
+ alignText(exp);
+
+ t << " [shape=diamond,style=filled,color=\"";
+ t << flowCol.decisionNode;
+ t << "\",label=\" ";
+ QCString kl;
+ if (exit) kl=fl->text+" ";
+
+ if (fl->label)
+ {
+ kl+=fl->label+":"+exp+var;
+ }
+ else
+ {
+ kl+=exp+var;
+ }
+
+ FlowChart::alignCommentNode(t,kl);
+ t << "\"]\n";
}
else if (fl->type & ENDCL)
{
@@ -3718,22 +3997,27 @@ void FlowNode::writeShape(FTextStream &t,const FlowNode* fl)
}
else if (fl->type & STARTFIN)
{
- static QRegExp reg1("[\"]");
QCString val=fl->text;
- val=val.replace(reg1,"\\\"");
t << "[shape=box , style=rounded label=<\n";
t << "<TABLE BORDER=\"0\" CELLBORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"0\" >\n ";
- t << "<TR><TD BGCOLOR=\"white\" > ";
- FlowNode::codify(t,val.data());
+ t << "<TR><TD BGCOLOR=\"";
+ t<< flowCol.startEndNode;
+ t<< "\"> ";
+ FlowChart::alignCommentNode(t,val);
t << " </TD></TR></TABLE>>];";
}
else
{
if (fl->text.isEmpty()) return;
- bool var=(fl->type & FlowNode::VARIABLE_NO) ;
+ bool var=(fl->type & FlowChart::VARIABLE_NO);
QCString repl("<BR ALIGN=\"LEFT\"/>");
QCString q=fl->text;
+ if (exit)
+ {
+ q+=" "+fl->label;
+ }
+
int z=q.findRev("\n");
if (z==(int)q.length()-1)
@@ -3744,371 +4028,365 @@ void FlowNode::writeShape(FTextStream &t,const FlowNode* fl)
t << "<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"2\" >\n ";
if (var)
{
- t << "<TR><TD BGCOLOR=\"lightyellow\" > ";
+ t << "<TR><TD BGCOLOR=\"" << flowCol.varNode << "\" > ";
}
else
{
- t << "<TR><TD BGCOLOR=\"lightcyan\" > ";
+ t << "<TR><TD BGCOLOR=\"" << flowCol.textNode << "\" > ";
}
- FlowNode::codify(t,q.data());
+ FlowChart::alignCommentNode(t,q);
t << " </TD></TR></TABLE>>];";
}
}
-void FlowNode::writeEdge(FTextStream &t,const FlowNode* fl_from,const FlowNode* fl_to,int i)
+void FlowChart::writeEdge(FTextStream &t,const FlowChart* fl_from,const FlowChart* fl_to,int i)
{
- checkNode(fl_to);
- writeEdge(t,fl_from->id,fl_to->id,i);
+ bool b=fl_from->type & STARTL;
+ bool c=fl_to->type & STARTL;
+
+#ifdef DEBUGFLOW
+ QCString s1(getNodeName(fl_from->id).data());
+ QCString s2(getNodeName(fl_to->id).data());
+ QMap<QCString, int>::Iterator it = keyMap.find(s1);
+ QMap<QCString, int>::Iterator it1 = keyMap.find(s2);
+ // checks if the link is connected to a valid node
+ assert(it.key());
+ assert(it1.key());
+#endif
+
+ writeEdge(t,fl_from->id,fl_to->id,i,b,c);
}
-void FlowNode::writeEdge(FTextStream &t,int fl_from,int fl_to,int i)
+void FlowChart::writeEdge(FTextStream &t,int fl_from,int fl_to,int i,bool bFrom,bool bTo)
{
QCString label,col;
if (i==0)
{
- col="red";
+ col=flowCol.yesNodeLink;
label="yes";
}
else if (i==1)
{
- col="black";
+ col=flowCol.noNodeLink;
label="no";
}
else
{
- col="green";
+ col=flowCol.textNodeLink;
label="";
}
- t<<"edge [color=\""+col+"\",label=\""+label+"\"]\n";
- t<<getNodeName(fl_from).data();
- t<<"->";
- t<<getNodeName(fl_to).data();
- t<<"\n";
+ t << "edge [color=\""+col+"\",label=\""+label+"\"]\n";
+ t << getNodeName(fl_from).data();
+ if (bFrom) t << ":s";
+ t << "->";
+ t << getNodeName(fl_to).data();
+ if (bTo) t << ":n";
+ t << "\n";
}
-
-void FlowNode::checkNode(const FlowNode* /*flo*/)
+void FlowChart::alignFuncProc( QCString & q,const ArgumentList* al,bool isFunc)
{
- // assert(!(flo->type & IDLE));
-}
+ if (al==0) return;
-void FlowNode::checkNode(int /*z*/)
-{
- // FlowNode *flo=flowList.at(z);
- //assert(!(flo->type & IDLE));
-}
+ ArgumentListIterator ali(*al);
+ int index=ali.count();
+ if (index==0) return;
-int FlowNode::getNextNode(int index)
-{
- for (uint j=index+1;j<flowList.count();j++)
+ int len=q.length()+VhdlDocGen::getFlowMember()->name().length();
+ QCString prev,temp;
+ prev.fill(' ',len+1);
+
+ Argument *arg;
+ q+="\n";
+ for (;(arg=ali.current());++ali)
{
- FlowNode *flo=flowList.at(j);
- int kind=flo->type;
- if (kind & FlowNode::ENDIF_NO)
- {
- continue;
- }
+ QCString attl=arg->defval+" ";
+ attl+=arg->name+" ";
- if (kind==ELSE_NO || kind==ELSIF_NO)
+ if (!isFunc)
{
- j=findNode(j,flo->stamp,FlowNode::ENDIF_NO);
+ attl+=arg->attrib+" ";
}
else
{
- return j;
+ attl+=" in ";
}
- }
+ attl+=arg->type;
+ if (--index) attl+=",\n"; else attl+="\n";
+
+ attl.prepend(prev.data());
+ temp+=attl;
+ }
- return flowList.count()-1;
+ q+=temp;
}
-int FlowNode::findNode(int index,int type)
+int FlowChart::findNextLoop(int index,int stamp)
{
for (uint j=index+1;j<flowList.count();j++)
{
- FlowNode *flo=flowList.at(j);
- if (flo->type==type)
+ FlowChart *flo=flowList.at(j);
+ if (flo->stamp==stamp)
+ {
+ continue;
+ }
+ if (flo->type&END_LOOP)
{
return j;
}
}
return flowList.count()-1;
-}// findNode
+}
+
+int FlowChart::findPrevLoop(int index,int stamp,bool endif)
+{
+ for (uint j=index;j>0;j--)
+ {
+ FlowChart *flo=flowList.at(j);
+ if (flo->type & LOOP)
+ {
+ if (flo->stamp==stamp && endif)
+ {
+ return j;
+ }
+ else
+ {
+ if (flo->stamp<stamp)
+ {
+ return j;
+ }
+ }
+ }
+ }
+ return flowList.count()-1;
+}
+int FlowChart::findLabel(int index,QCString &label)
+{
+ for (uint j=index;j>0;j--)
+ {
+ FlowChart *flo=flowList.at(j);
+ if ((flo->type & LOOP) && !flo->label.isEmpty() && qstricmp(flo->label,label)==0)
+ {
+ return j;
+ }
+ }
+ err("could not find label: ",label.data());
+ return 0;
+}
-int FlowNode::findNode(int index,int stamp,int type)
+int FlowChart::findNode(int index,int stamp,int type)
{
for (uint j=index+1;j<flowList.count();j++)
{
- FlowNode *flo=flowList.at(j);
+ FlowChart *flo=flowList.at(j);
if (flo->type==type && flo->stamp==stamp)
{
return j;
}
}
- return flowList.count()-1;
+ return 0;
}// findNode
-int FlowNode::getNoLink(const FlowNode* fl,uint index)
+int FlowChart::getNextNode(int index,int stamp)
{
-
for (uint j=index+1;j<flowList.count();j++)
{
- FlowNode *flo=FlowNode::flowList.at(j);
- if (flo->type==IF_NO && flo->stamp==fl->stamp)
+ FlowChart *flo=flowList.at(j);
+ int kind=flo->type;
+ int s=flo->stamp;
+ if (s>stamp)
{
- return j;
+ continue;
}
-
- if (flo->type==ELSE_NO && flo->stamp==fl->stamp)
+ if (kind & ENDIF_NO)
{
- return j+1;
+ if (s<stamp && stamp>0)
+ {
+ stamp--;
+ continue;
+ }
}
-
- if (flo->type==ELSIF_NO && flo->stamp==fl->stamp)
+ if (kind & (ELSE_NO | ELSIF_NO))
{
- return j;
+ if (s<stamp && stamp>0)
+ {
+ stamp--;
+ }
+ j=findNode(j,stamp,ENDIF_NO);
+ continue;
}
-
- if ((flo->type & ENDIF_NO) && flo->stamp==fl->stamp)
+ if (kind & WHEN_NO)
{
- return getNextNode(j);
+ if (s<stamp && stamp>0)
+ {
+ stamp--;
+ }
+ return findNode(j,stamp-1,END_CASE);
}
-
+ return j;
}
- return flowList.count()-1;// end process
+ return FLOWLEN;
}
-int FlowNode::getTextLink(const FlowNode* /*fl*/,uint index)
+int FlowChart::getNextIfLink(const FlowChart* fl,uint index)
{
- assert(FlowNode::flowList.count()>index);
+ int stamp=fl->stamp;
+ uint start = index+1;
+ int endifNode = findNode(start,stamp,ENDIF_NO);
+ int elseifNode = findNode(start,stamp,ELSIF_NO);
+ int elseNode = findNode(start,stamp,ELSE_NO);
- uint i=index+1;
+ assert(endifNode>-1);
- FlowNode *flo=flowList.at(i);
- if (flo->type==IF_NO)
+ if (elseifNode>0 && elseifNode<endifNode)
{
- return i;
+ return elseifNode;
}
- if (FlowNode::caseCounter)
- {
- return FlowNode::findNode(index,END_CASE);
- }
- else
+ if (elseNode>0 && elseNode<endifNode)
{
- i = FlowNode::getNextNode(index);
+ return elseNode+1;
}
- if (i>0) return i;
-
- return flowList.count()-1;// end process
+ stamp=flowList.at(endifNode)->stamp;
+ return getNextNode(endifNode,stamp);
}
-int FlowNode::findNextLoop(int index,int stamp)
+void FlowChart::writeFlowLinks(FTextStream &t)
{
- for (uint j=index+1;j<FlowNode::flowList.count();j++)
- {
- FlowNode *flo=FlowNode::flowList.at(j);
- if (flo->type==END_LOOP && flo->stamp==stamp)
- {
- return j;
- }
- }
- return flowList.count()-1;
-}
-
-int FlowNode::findPrevLoop(int index,int stamp)
-{
- for (uint j=index;j>0;j--)
- {
- FlowNode *flo=flowList.at(j);
- if (flo->type & LOOP)
- {
- if ( flo->stamp==stamp)
- {
- return j;
- }
- }
- }
- err("end loop without loop");
- assert(FALSE);
- return flowList.count()-1;
-}
-
-
-int FlowNode::findLabel(int index,QCString & label)
-{
- for (uint j=index;j>0;j--)
- {
- FlowNode *flo=flowList.at(j);
- if ((flo->type & LOOP) && !flo->label.isEmpty() && stricmp(flo->label.data(),label.data())==0)
- {
- return findNode(j,flo->stamp,END_LOOP);
- }
- }
- return 0;
-}
-
-
-void FlowNode::writeFlowLinks(FTextStream &t)
-{
-
uint size=flowList.count();
if (size<2) return;
- // start link
+ // write start link
writeEdge(t,flowList.at(0),flowList.at(1),2);
for (uint j=0;j<size;j++)
{
- FlowNode *fll=flowList.at(j);
+ FlowChart *fll=flowList.at(j);
int kind=fll->type;
- if (kind==ELSE_NO || kind==ENDIF_NO)
+ int stamp=fll->stamp;
+ if (kind & EEND)
{
continue;
}
- if (kind==IF_NO)
+ if (kind & IFF)
{
writeEdge(t,fll,flowList.at(j+1),0);
- int z=getNoLink(fll,j);
+ int z=getNextIfLink(fll,j);
+ // assert(z>-1);
writeEdge(t,fll,flowList.at(z),1);
}
-
- if (kind==ELSIF_NO)
+ else if (kind & LOOP_NO)
{
- writeEdge(t,fll,flowList.at(j+1),0);
- int z=getNoLink(fll,j);
- writeEdge(t,fll,flowList.at(z),1);
+ writeEdge(t,fll,flowList.at(j+1),2);
+ continue;
}
-
- if ((kind & LOOP) && kind!=LOOP_NO)
+ else if (kind & (CASE_NO | FOR_NO | WHILE_NO))
{
- writeEdge(t,fll,flowList.at(j+1),0);
- int z=findNode(j,fll->stamp,END_LOOP);
- z = getNextNode(z);
- writeEdge(t,fll,flowList.at(z),1);
- }
+ if (kind & CASE_NO)
+ {
+ writeEdge(t,fll,flowList.at(j+1),2);
+ continue;
+ }
+ else
+ {
+ writeEdge(t,fll,flowList.at(j+1),0);
+ }
- if (kind==LOOP_NO)
- {
- writeEdge(t,fll,flowList.at(j+1),0);
- }
+ kind=END_LOOP;
+ int z=findNode(j+1,fll->stamp,kind);
+ z=getNextNode(z,flowList.at(z)->stamp);
- if (kind==TEXT_NO || kind==VARIABLE_NO)
+ // assert(z>-1);
+ writeEdge(t,fll,flowList.at(z),1);
+ continue;
+ }
+ else if (kind & (TEXT_NO | VARIABLE_NO))
{
- int z=getTextLink(fll,j);
+ int z=getNextNode(j,stamp);
writeEdge(t,fll,flowList.at(z),2);
}
-
- if (kind==WHEN_NO)
- {
- writeEdge(t,fll,flowList.at(j+1),0);
- int z=flowList.count()-1;
- int u=findNode(j,fll->stamp,WHEN_NO);
- if (u<z)
- writeEdge(t,fll,FlowNode::flowList.at(u),1);
- else {
- z=findNode(j,fll->stamp,END_CASE);
- writeEdge(t,fll,FlowNode::flowList.at(z),1);
- }
- }
-
- if (kind==CASE_NO)
+ else if (kind & WHEN_NO)
{
- writeEdge(t,fll,flowList.at(j+1),2);
- caseCounter++;
- }
+ // default value
+ if (qstricmp(fll->text.simplifyWhiteSpace().data(),"others")==0)
+ {
+ writeEdge(t,fll,flowList.at(j+1),2);
+ continue;
+ }
- if (kind==RETURN_NO)
- {
- writeEdge(t,fll,FlowNode::flowList.at(size-1),2);
- }
+
+ writeEdge(t,fll,flowList.at(j+1),0);
+ int u=findNode(j,stamp,WHEN_NO);
+ int v=findNode(j,stamp-1,END_CASE);
- if (kind==EXIT_NO)
- {
- int z;
- if (!fll->label.isEmpty())
+ if (u>0 && u<v)
{
- z=findLabel(j,fll->label);
- z=getNextNode(z);
- //assert(z!=0);
+ writeEdge(t,fll,flowList.at(u),1);
}
else
{
- z =findNextLoop(j,fll->stamp);
- z=getNextNode(z);
+ writeEdge(t,fll,flowList.at(v),1);
}
- writeEdge(t,fll,flowList.at(z),2);
}
-
- if (kind==END_CASE)
+ else if (kind & END_CASE)
{
- int z=FlowNode::getNextNode(j);
+ int z=FlowChart::getNextNode(j,fll->stamp);
writeEdge(t,fll,flowList.at(z),2);
- caseCounter--;
}
-
- if (kind==END_LOOP)
+ else if (kind & END_LOOP)
{
- int z=findPrevLoop(j,fll->stamp);
+ int z=findPrevLoop(j,fll->stamp,true);
writeEdge(t,fll,flowList.at(z),2);
}
-
- if (kind & EWHEN)
+ else if (kind & RETURN_NO)
{
- writeEdge(t,fll,flowList.at(j+1),0);
- int z=getNextNode(j+1);
- writeEdge(t,fll,flowList.at(z),1);
+ writeEdge(t,fll,FlowChart::flowList.at(size-1),2);
}
-
- if (kind & NEXT_NO)
+ else if (kind & (EXIT_NO | NEXT_NO))
{
- int z=findNode(j,fll->stamp,END_LOOP);
- writeEdge(t,fll,flowList.at(z),1);
+ int z;
+ bool b = kind==NEXT_NO;
+ if (fll->exp)
+ {
+ writeEdge(t,fll,flowList.at(j+1),1);
+ }
+ if (!fll->label.isEmpty())
+ {
+ z=findLabel(j,fll->label);
+ if (b)
+ {
+ writeEdge(t,fll,flowList.at(z),0);
+ }
+ else
+ {
+ z=findNode(z,flowList.at(z)->stamp,END_LOOP);
+ z=getNextNode(z,flowList.at(z)->stamp);
+ writeEdge(t,fll,flowList.at(z),0);
+ }
+ continue;
+ }
+ else
+ {
+ if (b)
+ {
+ z=findPrevLoop(j,fll->stamp);
+ writeEdge(t,fll,flowList.at(z),0);
+ continue;
+ }
+ else
+ {
+ z =findNextLoop(j,fll->stamp-1);
+ }
+ z=getNextNode(z,flowList.at(z)->stamp);
+ }
+ writeEdge(t,fll,flowList.at(z),0);
}
} //for
} //writeFlowLinks
-void FlowNode::alignFuncProc( QCString & q,const ArgumentList* al,bool isFunc)
-{
- if (al==0) return;
-
- ArgumentListIterator ali(*al);
- int index=ali.count();
- if (index==0) return;
-
- int len=q.length()+VhdlDocGen::getFlowMember()->name().length();
- QCString prev,temp;
- prev.fill(' ',len+1);
-
- Argument *arg;
- q+="\n";
- for (;(arg=ali.current());++ali)
- {
- QCString attl=arg->defval+" ";
- attl+=arg->name+" ";
-
- if (!isFunc)
- {
- attl+=arg->attrib+" ";
- }
- else
- {
- attl+=" in ";
- }
-
- attl+=arg->type;
-
- if (--index) attl+=",\n"; else attl+="\n";
-
- attl.prepend(prev.data());
- temp+=attl;
- }
- q+=temp;
-}
-
diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h
index b26cd63..7c78373 100644
--- a/src/vhdldocgen.h
+++ b/src/vhdldocgen.h
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -25,6 +25,7 @@
#include <qcstring.h>
#include "layout.h"
#include "arguments.h"
+#include "entry.h"
class Entry;
class ClassDef;
@@ -116,8 +117,6 @@ class VhdlDocGen
static MemberDef* findFunction(const QList<Argument> &ql,
const QCString& name,
const QCString& package, bool type);
- static bool compareString(const QCString& s1,
- const QCString& s2);
static QCString getClassTitle(const ClassDef*);
static void writeInlineClassLink(const ClassDef*,
OutputList &ol);
@@ -153,8 +152,8 @@ class VhdlDocGen
//-----------------------------------------------------
// translatable items
- static QCString trTypeString(int type);
- static QCString trVhdlType(int type,bool sing=true);
+ static QCString trTypeString(uint64 type);
+ static QCString trVhdlType(uint64 type,bool sing=true);
// trClassHierarchy.
static QCString trDesignUnitHierarchy();
@@ -205,33 +204,22 @@ class VhdlDocGen
const char *title,const char *subtitle,bool showEnumValues,int type);
static bool writeClassType(ClassDef *&,OutputList &ol ,QCString & cname);
-
static QCString convertArgumentListToString(const ArgumentList* al,bool f);
static QCString getProcessNumber();
static QCString getRecordNumber();
static QCString getClassName(const ClassDef*);
- // obsolete
- // static void adjustRecordMember(MemberDef *mdef);
-
- static void writeLink(const MemberDef* mdef,OutputList &ol);
- static void adjustMemberName(QCString& nn);
- static bool membersHaveSpecificType(MemberList *ml,int type);
- static void startFonts(const QCString& q, const char *keyword,OutputList& ol);
static bool isNumber(const QCString& s);
static QCString getProtectionName(int prot);
- static QCString splitString(QCString & str, char c);
+
static void parseUCF(const char* input,Entry* entity,QCString f,bool vendor);
-
static bool findConstraintFile( LayoutNavEntry *lne);
static ClassDef* findArchitecture(const ClassDef *cd);
static ClassDef* findArchitecture(QCString identifier, QCString entity_name);
- static void writeCodeFragment( MemberDef *mdef,OutputList& ol);
- static void writeCodeFragment (OutputList& ol,int start, QCString & codeFragment,const MemberDef* mdef);
-
+
static void writeSource(MemberDef *mdef,OutputList& ol,QCString & cname);
static void writeAlphbeticalClass(OutputList& ol,const ClassDef* cd,const QCString &);
@@ -250,6 +238,16 @@ class VhdlDocGen
static void setFlowMember( const MemberDef *flowMember);
static const MemberDef *getFlowMember();
+ static bool isVhdlClass (const Entry *cu)
+ {
+ return cu->spec==VhdlDocGen::ENTITY ||
+ cu->spec==VhdlDocGen::PACKAGE ||
+ cu->spec==VhdlDocGen::ARCHITECTURE ||
+ cu->spec==VhdlDocGen::PACKAGE_BODY;
+ }
+
+
+
private:
static void findAllArchitectures(QList<QCString>& ql,const ClassDef *cd);
static bool compareArgList(ArgumentList*,ArgumentList*);
@@ -259,11 +257,17 @@ class VhdlDocGen
static void writeRecorUnit(QCString & largs,OutputList& ol ,const MemberDef *mdef);
};
+//-------------------------------------------------------------------------------------------------------------------
+//-------------- VHDL Flowcharts -------------------------------------------------------------------------------
+//-------------------------------------------------------------------------------------------------------------------
-class FlowNode
+
+//#define DEBUGFLOW
+
+class FlowChart
{
public:
- enum nodeType {
+ enum nodeTypes {
IF_NO = 1<<1,
ELSIF_NO = 1<<2,
ELSE_NO = 1<<3,
@@ -282,9 +286,9 @@ class FlowNode
RETURN_NO = 1<<16,
LOOP_NO = 1<<17,
NEXT_NO = 1<<18,
- EXIT_WHEN_NO = 1<<19,
- NEXT_WHEN_NO = 1<<20,
- EMPTY_NO = 1<<21
+ EMPTY_NO = 1<<19,
+ COMMENT_NO = 1<<20,
+ BEGIN_NO = 1<<21
};
//---------- create svg -------------------------------------------------------------
@@ -292,53 +296,48 @@ class FlowNode
static void startDot(FTextStream &t);
static void endDot(FTextStream &t);
static void codify(FTextStream &t,const char *str);
- static void writeShape(FTextStream &t,const FlowNode* fl);
- static void writeEdge(FTextStream &t,int fl_from,int fl_to,int i);
- static void writeEdge(FTextStream &t,const FlowNode* fl_from,const FlowNode* fl_to,int i);
- //static void writeEndNode(FTextStream &t,const FlowNode* fl);
+ static void writeShape(FTextStream &t,const FlowChart* fl);
+ static void writeEdge(FTextStream &t,int fl_from,int fl_to,int i,bool bFrom=FALSE,bool bTo=FALSE);
+ static void writeEdge(FTextStream &t,const FlowChart* fl_from,const FlowChart* fl_to,int i);
static void writeFlowLinks(FTextStream &t);
- //static void writeStartNode(FTextStream &t,const FlowNode* fl);
- static void checkNode(int);
- static void checkNode(const FlowNode*);
static QCString getNodeName(int n);
static void colTextNodes();
- static int getTextLink(const FlowNode* fl,uint index);
- static int getNoLink(const FlowNode*,uint);
- static int getNextNode(int);
+ static int getNextTextLink(const FlowChart* fl,uint index);
+ static int getNextIfLink(const FlowChart*,uint);
+ static int getNextNode(int,int);
static int findNode(int index,int stamp,int type);
static int findNode(int index,int type);
static int findNextLoop(int j,int stamp);
- static int findPrevLoop(int j,int stamp);
+ static int findPrevLoop(int j,int stamp,bool endif=FALSE);
static int findLabel(int j,QCString &);
static void delFlowList();
static const char* getNodeType(int c);
- static void addFlowNode(int type,const char* text,const char* exp,const char * label=NULL);
+ static void addFlowChart(int type,const char* text,const char* exp,const char * label=NULL);
static void moveToPrevLevel();
- static void printFlowList();
- static void setLabel(const char* text);
static int getTimeStamp();
- static void printNodeList();
- static void writeFlowNode();
+ static void writeFlowChart();
static void alignFuncProc(QCString & q,const ArgumentList* al,bool isFunc);
static QCString convertNameToFileName();
+ static void printNode(const FlowChart* n);
+ static void printFlowTree();
+ static void buildCommentNodes(FTextStream &t);
+ static void alignCommentNode(FTextStream &t,QCString com);
- static QList<FlowNode> flowList;
- static int ifcounter;
- static int nodeCounter;
- static int imageCounter;
- static int caseCounter;
+ static QList<FlowChart> flowList;
- FlowNode(int typ,const char* t,const char* ex,const char* label=NULL);
- ~FlowNode();
+ FlowChart(int typ,const char* t,const char* ex,const char* label=0);
+ ~FlowChart();
private:
int id;
int stamp;
int type;
+ int line;
+
QCString label;
QCString text;
QCString exp;
diff --git a/src/vhdlparser.y b/src/vhdlparser.y
index a525666..3d3cc64 100644
--- a/src/vhdlparser.y
+++ b/src/vhdlparser.y
@@ -1,3 +1,17 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
/*********************************************************************************************
* The original was a VHDL parser description to be used with GMD Compiler
@@ -39,6 +53,7 @@
#include <stdio.h>
#include <qcstring.h>
#include <qstringlist.h>
+#include "config.h"
#ifndef YYSTYPE
typedef int YYSTYPE;
@@ -50,6 +65,9 @@ struct YYMM
QCString qstr;
};
+
+
+
// define struct instead of union
#define YYSTYPE YYMM
@@ -62,13 +80,20 @@ struct YYMM
#include "entry.h"
#include "arguments.h"
#include "memberdef.h"
+#include "vhdldocgen.h"
//-----------------------------variables ---------------------------------------------------------------------------
-//static MyParserVhdl* myconv=0;
+
+
+
+
static VhdlContainer s_str;
static QList<Entry>instFiles;
+static QList<Entry>libUse;
+
+
static int yyLineNr;
static Entry* lastCompound;
static Entry* currentCompound;
@@ -100,7 +125,7 @@ int vhdlScanYYlex ();
void vhdlScanYYerror (char const *);
static void addVhdlType(const QCString &name,int startLine,
- int section,int spec,
+ int section,uint64 spec,
const char* args,const char* type,
Protection prot=Public);
static void addCompInst(char *n, char* instName,char* comp,int line);
@@ -118,10 +143,10 @@ static bool isFuncProcProced();
static void initEntry(Entry *e);
static void addProto(const char *s1,const char *s2,const char *s3,
const char *s4,const char *s5,const char *s6);
-static void createFunction(const QCString &impure,int spec,
+static void createFunction(const QCString &impure,uint64 spec,
const QCString &fname);
-static void createFlow(QCString s);
+static void createFlow();
void newVhdlEntry()
{
@@ -142,6 +167,7 @@ void initVhdlParser()
current_root=s_str.root;
current=new Entry();
initEntry(current);
+ libUse.clear();
}
QList<Entry> & getVhdlInstList()
@@ -149,6 +175,10 @@ QList<Entry> & getVhdlInstList()
return instFiles;
}
+QList<Entry> & getLibUse()
+{
+ return libUse;
+}
%}
@@ -367,12 +397,13 @@ t_ToolDir
%%
-start: design_file
- | procs_stat
- | subprog_body
-
+start: design_file
+
design_file : design_unit_list
+ /* parse function/process/procedure for vhdlflow */
+ | procs_stat
+ | subprog_body
design_unit_list: design_unit
| design_unit_list design_unit
@@ -400,7 +431,7 @@ physical_literal_1 : /* empty */ { $$=""; }
physical_literal_no_default : t_AbstractLit t_Identifier { $$=$1+" "+$2; }
idf_list : t_Identifier { $$=$1; }
- | idf_list t_Comma t_Identifier { $$=$1+","+$3}
+ | idf_list t_Comma t_Identifier { $$=$1+","+$3; }
;
/*------------------------------------------
@@ -427,9 +458,9 @@ context_item : lib_clause
lib_clause : t_LIBRARY idf_list t_Semicolon
{
- if ( parse_sec == 0)
+ if ( parse_sec==0 && Config_getBool("SHOW_INCLUDE_FILES") )
{
- addVhdlType($2,getParsedLine(t_LIBRARY),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,$2.data(),"_library_");
+ addVhdlType($2,getParsedLine(t_LIBRARY),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,$2.data(),"_library_");
}
$$="library "+$2;
}
@@ -439,9 +470,9 @@ use_clause : t_USE sel_list t_Semicolon
QStringList ql1=QStringList::split(",",$2,FALSE);
for (uint j=0;j<ql1.count();j++)
{
- QStringList ql=QStringList::split(".",ql1[j],FALSE);
- QCString it=ql[1].utf8();
- if ( parse_sec == 0 )
+ //QStringList ql=QStringList::split(".",ql1[j],FALSE);
+ QCString it=ql1[j].utf8();
+ if ( parse_sec==0 && Config_getBool("SHOW_INCLUDE_FILES") )
{
addVhdlType(it,getParsedLine(t_USE),Entry::VARIABLE_SEC,VhdlDocGen::USE,it.data(),"_use_");
}
@@ -487,13 +518,13 @@ entity_decl_2 : /* empty */ { $$=""; }
| t_PORT { currP=VhdlDocGen::PORT; } interf_list t_Semicolon { currP=0; }
;
entity_decl_1 : /* empty */ { $$=""; }
- | t_GENERIC { currP=VhdlDocGen::GENERIC;parse_sec=GEN_SEC} interf_list t_Semicolon{ currP=0;parse_sec=0; }
+ | t_GENERIC { currP=VhdlDocGen::GENERIC;parse_sec=GEN_SEC; } interf_list t_Semicolon{ currP=0;parse_sec=0; }
| t_GENERIC error t_Semicolon{ currP=0; }
;
-arch_body : arch_start arch_body_1 t_BEGIN concurrent_stats t_END arch_body_2 t_Semicolon
-arch_body : arch_start error t_END arch_body_2 t_Semicolon
+arch_body : arch_start arch_body_1 t_BEGIN concurrent_stats t_END arch_body_2 t_Semicolon {lastCompound=0;}
+arch_body : arch_start error t_END arch_body_2 t_Semicolon {lastCompound=0;}
arch_start : t_ARCHITECTURE t_Identifier t_OF t_Identifier t_IS
{
@@ -572,8 +603,8 @@ package_decl_22: gen_interface_list
package_decl_22: gen_interface_list gen_assoc_list
package_decl_22: gen_interface_list gen_assoc_list t_Semicolon
-package_body : pack_body_start error t_END package_body_2 t_Semicolon
-package_body : pack_body_start package_body_1 t_END package_body_2 t_Semicolon
+package_body : pack_body_start error t_END package_body_2 t_Semicolon {lastCompound=0;}
+package_body : pack_body_start package_body_1 t_END package_body_2 t_Semicolon {lastCompound=0;}
pack_body_start : t_PACKAGE t_BODY t_Identifier t_IS
{
$$=$3;
@@ -601,24 +632,24 @@ common_decltve_item_1: package_body
common_decltve_item_1: subprogram_instantiation_decl
-common_decltve_item: type_decl{$$=$1;}
-common_decltve_item: subtype_decl{$$=$1;}
-common_decltve_item: constant_decl{ $$=$1;}
-common_decltve_item: file_decl{$$=$1;}
-common_decltve_item: alias_decl{$$=$1;}
-common_decltve_item: subprog_decl{$$=$1;}
-common_decltve_item: use_clause {$$=$1;}
+common_decltve_item: type_decl{ $$=$1; }
+common_decltve_item: subtype_decl{ $$=$1; }
+common_decltve_item: constant_decl{ $$=$1; }
+common_decltve_item: file_decl{ $$=$1; }
+common_decltve_item: alias_decl{ $$=$1; }
+common_decltve_item: subprog_decl{ $$=$1; }
+common_decltve_item: use_clause { $$=$1; }
-entity_decltve_item: common_decltve_item {$$=$1;}
-entity_decltve_item: subprog_body {$$=$1;}
-entity_decltve_item: attribute_decl {$$=$1;}
-entity_decltve_item: attribute_spec {$$=$1;}
-entity_decltve_item: disconnection_spec {$$=$1;}
-entity_decltve_item: signal_decl {$$=$1;}
-entity_decltve_item: variable_decl {$$=$1;}
-entity_decltve_item: group_template_declaration {$$=$1;}
-entity_decltve_item: group_declaration {$$=$1;}
-entity_decltve_item: common_decltve_item_1 {$$="";}
+entity_decltve_item: common_decltve_item { $$=$1; }
+entity_decltve_item: subprog_body { $$=$1; }
+entity_decltve_item: attribute_decl { $$=$1; }
+entity_decltve_item: attribute_spec { $$=$1; }
+entity_decltve_item: disconnection_spec { $$=$1; }
+entity_decltve_item: signal_decl { $$=$1; }
+entity_decltve_item: variable_decl { $$=$1; }
+entity_decltve_item: group_template_declaration { $$=$1; }
+entity_decltve_item: group_declaration { $$=$1; }
+entity_decltve_item: common_decltve_item_1 { $$=""; }
block_decltve_item: common_decltve_item
@@ -632,8 +663,8 @@ block_decltve_item: signal_decl
block_decltve_item: variable_decl
block_decltve_item: group_template_declaration
block_decltve_item: group_declaration
-block_decltve_item: common_decltve_item_1 {$$="";}
-block_decltve_item: tool_directive {$$="";}
+block_decltve_item: common_decltve_item_1 { $$=""; }
+block_decltve_item: tool_directive { $$=""; }
block_declarative_part: block_decltve_item
| block_declarative_part block_decltve_item
@@ -661,16 +692,16 @@ package_body_decltve_item: attribute_decl
package_body_decltve_item: attribute_spec
package_body_decltve_item: common_decltve_item_1
-subprog_decltve_item: common_decltve_item {$$=$1;}
-subprog_decltve_item: subprog_body {$$="";}
-subprog_decltve_item: attribute_decl {$$=$1;}
-subprog_decltve_item: attribute_spec {$$=$1;}
-subprog_decltve_item: variable_decl {$$=$1;}
+subprog_decltve_item: common_decltve_item { $$=$1; }
+subprog_decltve_item: subprog_body { $$=""; }
+subprog_decltve_item: attribute_decl { $$=$1; }
+subprog_decltve_item: attribute_spec { $$=$1; }
+subprog_decltve_item: variable_decl { $$=$1; }
subprog_decltve_item: group_template_declaration
-subprog_decltve_item: group_declaration {$$="";}
-subprog_decltve_item: common_decltve_item_1 {$$="";}
+subprog_decltve_item: group_declaration { $$=""; }
+subprog_decltve_item: common_decltve_item_1 { $$=""; }
-procs_decltve_item: subprog_decltve_item {$$=$1;}
+procs_decltve_item: subprog_decltve_item { $$=$1; }
config_decltve_item: attribute_spec { $$=$1; }
config_decltve_item: use_clause { $$=$1; }
@@ -712,7 +743,6 @@ subprog_spec : t_FUNCTION designator
subprog_spec_2 t_RETURN mark
{
tempEntry=current;
- current->bodyLine=getParsedLine(t_FUNCTION);
current->type=$6;
newEntry();
@@ -736,11 +766,19 @@ subprog_spec_2: subprog_spec_22
subprog_spec_1: subprog_spec_2
-subprog_body: subprog_spec t_IS subprog_body_1 t_BEGIN seq_stats t_END subprog_body_2 t_Semicolon
+subprog_body: subprog_spec t_IS subprog_body_1
{
- tempEntry->endBodyLine=s_str.yyLineNr;
- createFlow($3);
- currP=0;
+ if ($3.data())
+ {
+ FlowChart::addFlowChart(FlowChart::VARIABLE_NO,$3,0);
+ }
+ FlowChart::addFlowChart(FlowChart::BEGIN_NO,"BEGIN",0);
+ }
+ t_BEGIN seq_stats t_END subprog_body_2 t_Semicolon
+ {
+ tempEntry->endBodyLine=s_str.yyLineNr;
+ createFlow();
+ currP=0;
}
subprog_body: subprog_spec t_IS error t_END subprog_body_2 t_Semicolon
{
@@ -754,11 +792,11 @@ subprog_body_2: t_PROCEDURE t_Identifier
subprog_body_2: t_FUNCTION t_Identifier
subprog_body_2: t_FUNCTION t_STRING
-subprog_body_1: /* empty */ {$$="";}
+subprog_body_1: /* empty */ { $$=""; }
//subprog_body_1 : subprogram_instantiation_decl
-subprog_body_1: subprog_body_1 subprog_body_3 {$$=$1+$2; }
+subprog_body_1: subprog_body_1 subprog_body_3 { $$=$1+$2; }
-subprog_body_3: subprog_decltve_item { $$=$1; }
+subprog_body_3: subprog_decltve_item { $$=$1; }
/*--------------------------------------------------
-- Interface Lists and Associaton Lists
@@ -881,19 +919,19 @@ shift_op: t_SLL { $$="sll"; }
| t_ROR { $$="ror"; }
| t_ROL { $$="rol"; }
;
-and_relation: relation shift_op relation {$$= $1+$2+$3; }
-and_relation: relation t_AND relation {$$= $1+" and "+$3; }
-and_relation: relation t_XOR relation {$$= $1+" xor "+$3; }
-and_relation: relation t_OR relation {$$= $1+" or "+$3; }
-and_relation: relation t_NOR relation {$$= $1+" nor "+$3; }
-and_relation: relation t_XNOR relation {$$= $1+"xnor"+$3; }
-and_relation: relation t_NAND relation {$$= $1+"nand"+$3; }
-and_relation: and_relation t_NAND relation {$$= $1+"nand"+$3; }
-and_relation: and_relation t_NOR relation{$$= $1+"nor"+$3; }
-and_relation: and_relation t_XNOR relation {$$= $1+"nand"+$3; }
-and_relation: and_relation t_AND relation {$$= $1+" and "+$3; }
-and_relation: and_relation t_OR relation {$$= $1+" or "+$3; }
-and_relation: and_relation t_XOR relation {$$= $1+" xor "+$3; }
+and_relation: relation shift_op relation { $$= $1+$2+$3; }
+and_relation: relation t_AND relation { $$= $1+" and "+$3; }
+and_relation: relation t_XOR relation { $$= $1+" xor "+$3; }
+and_relation: relation t_OR relation { $$= $1+" or "+$3; }
+and_relation: relation t_NOR relation { $$= $1+" nor "+$3; }
+and_relation: relation t_XNOR relation { $$= $1+"xnor"+$3; }
+and_relation: relation t_NAND relation { $$= $1+"nand"+$3; }
+and_relation: and_relation t_NAND relation { $$= $1+"nand"+$3; }
+and_relation: and_relation t_NOR relation{ $$= $1+"nor"+$3; }
+and_relation: and_relation t_XNOR relation { $$= $1+"nand"+$3; }
+and_relation: and_relation t_AND relation { $$= $1+" and "+$3; }
+and_relation: and_relation t_OR relation { $$= $1+" or "+$3; }
+and_relation: and_relation t_XOR relation { $$= $1+" xor "+$3; }
/* ;relation : unary_operator primary */
@@ -908,25 +946,25 @@ relation: t_Minus primary t_DoubleStar primary { $$=$2+" ** "+$4; }
/* relation : relation binary_operator primary */
-relation: relation t_MOD relation { $$=$1+" mod "+$3; }
-relation: relation t_REM relation { $$=$1+" rem "+$3; }
-relation: relation t_Ampersand relation { $$=$1+" & "+$3; }
-relation: relation t_Star relation { $$=$1+" * "+$3; }
-relation: relation t_Plus relation { $$=$1+" + "+$3; }
-relation: relation t_Minus relation { $$=$1+" - "+$3; }
-relation: relation t_LESym relation { $$=$1+" <= "+$3; }
-relation: relation t_GESym relation { $$=$1+" >= "+$3; }
-relation: relation t_LTSym relation { $$=$1+" < "+$3; }
-relation: relation t_GTSym relation { $$=$1+" > "+$3; }
-relation: relation t_EQSym relation { $$=$1+" == "+$3; }
-relation: relation t_NESym relation { $$=$1+" != "+$3; }
-relation: relation t_Slash relation { $$=$1+" /"+$3; }
-relation: relation t_QNEQU relation { $$=$1+" ?/="+$3; }
-relation: relation t_QEQU relation { $$=$1+" ?="+$3; }
-relation: relation t_QL relation { $$=$1+" ?<"+$3; }
-relation: relation t_QG relation { $$=$1+" ?>"+$3; }
-relation: relation t_QLT relation { $$=$1+" ?<="+$3; }
-relation: relation t_QGT relation { $$=$1+" ?>="+$3; }
+relation: relation t_MOD relation { $$=$1+" mod "+$3; }
+relation: relation t_REM relation { $$=$1+" rem "+$3; }
+relation: relation t_Ampersand relation { $$=$1+" & "+$3; }
+relation: relation t_Star relation { $$=$1+" * "+$3; }
+relation: relation t_Plus relation { $$=$1+" + "+$3; }
+relation: relation t_Minus relation { $$=$1+" - "+$3; }
+relation: relation t_LESym relation { $$=$1+" <= "+$3; }
+relation: relation t_GESym relation { $$=$1+" >= "+$3; }
+relation: relation t_LTSym relation { $$=$1+" < "+$3; }
+relation: relation t_GTSym relation { $$=$1+" > "+$3; }
+relation: relation t_EQSym relation { $$=$1+" = "+$3; }
+relation: relation t_NESym relation { $$=$1+" != "+$3; }
+relation: relation t_Slash relation { $$=$1+" / "+$3; }
+relation: relation t_QNEQU relation { $$=$1+" ?/= "+$3; }
+relation: relation t_QEQU relation { $$=$1+" ?= "+$3; }
+relation: relation t_QL relation { $$=$1+" ?< "+$3; }
+relation: relation t_QG relation { $$=$1+" ?> "+$3; }
+relation: relation t_QLT relation { $$=$1+" ?<= "+$3; }
+relation: relation t_QGT relation { $$=$1+" ?>= "+$3; }
simple_exp: t_Minus term { $$ = "-"+$2; }
| t_Plus term { $$ = "+"+$2; }
@@ -1072,7 +1110,7 @@ physical_type_definition_2: secondary_unit_decl { $$=$1+"#"; }
base_unit_decl: t_Identifier t_Semicolon { $$=$1; }
-secondary_unit_decl: t_Identifier t_EQSym physical_literal t_Semicolon { $$=$1+"="+$3 }
+secondary_unit_decl: t_Identifier t_EQSym physical_literal t_Semicolon { $$=$1+"="+$3; }
unconstrained_array_definition: t_ARRAY t_LeftParen
index_subtype_definition unconstrained_array_definition_1 t_RightParen t_OF
@@ -1084,8 +1122,8 @@ unconstrained_array_definition: t_ARRAY t_LeftParen
}
unconstrained_array_definition_1: { $$=""; }
-unconstrained_array_definition_1: unconstrained_array_definition_1 unconstrained_array_definition_2 { $$=$1+" "+$2 }
-unconstrained_array_definition_2: t_Comma index_subtype_definition { $$=", "+$2 }
+unconstrained_array_definition_1: unconstrained_array_definition_1 unconstrained_array_definition_2 { $$=$1+" "+$2; }
+unconstrained_array_definition_2: t_Comma index_subtype_definition { $$=", "+$2; }
index_subtype_definition: mark t_RANGE t_Box { $$=$1+" range<> "; }
@@ -1247,14 +1285,14 @@ file_decl_1: /* empty */ { $$=""; }
file_decl_1: mode { $$=$1; }
disconnection_spec: t_DISCONNECT signal_list t_Colon mark t_AFTER expr t_Semicolon
- { $$="disconnect "+$2+":"+$4+" after "+$6;}
+ { $$="disconnect "+$2+":"+$4+" after "+$6; }
-signal_list: name signal_list_1 { $$=$1+$2;}
-signal_list: t_OTHERS { $$="others";}
-signal_list: t_ALL { $$="all";}
-signal_list_1: /* empty */ { $$="";}
-signal_list_1: signal_list_1 signal_list_2 { $$=$1+$2;}
-signal_list_2: t_Comma name {$$=" , "+$2;}
+signal_list: name signal_list_1 { $$=$1+$2; }
+signal_list: t_OTHERS { $$="others"; }
+signal_list: t_ALL { $$="all"; }
+signal_list_1: /* empty */ { $$=""; }
+signal_list_1: signal_list_1 signal_list_2 { $$=$1+$2; }
+signal_list_2: t_Comma name { $$=" , "+$2; }
/*--------------------------------------------------
-- Attribute Declarations and Specifications
@@ -1273,7 +1311,7 @@ attribute_spec: t_ATTRIBUTE t_Identifier t_OF entity_spec t_IS expr t_Semicolon
$$="attribute "+att+";";
}
-entity_spec : entity_name_list signature t_Colon entity_class { $$=$1+$2+":"+$4;}
+entity_spec : entity_name_list signature t_Colon entity_class { $$=$1+$2+":"+$4; }
entity_name_list: designator entity_name_list_1 { $$=$1+" "+$2; }
entity_name_list: t_OTHERS { $$="others"; }
@@ -1309,8 +1347,8 @@ entity_class: t_PROPERTY { $$="property"; }
if_generation_scheme: if_scheme { $$=$1; }
-if_scheme: t_IF expr t_GENERATE generate_statement_body if_scheme_1 if_scheme_2 {$$="";}
-if_scheme: t_IF lable expr t_GENERATE generate_statement_body if_scheme_1 if_scheme_2 {$$="";}
+if_scheme: t_IF expr t_GENERATE generate_statement_body if_scheme_1 if_scheme_2 { $$=""; }
+if_scheme: t_IF lable expr t_GENERATE generate_statement_body if_scheme_1 if_scheme_2 { $$=""; }
if_scheme_2: /* empty */ { $$=""; }
if_scheme_2: t_ELSE t_GENERATE generate_statement_body { $$="else generate "+$3; }
@@ -1320,79 +1358,81 @@ if_scheme_1: if_scheme_1 if_scheme_3 { $$=$1+$2; }
if_scheme_3: t_ELSIF expr t_GENERATE generate_statement_body { $$="elsif "+$2+" generate "+$4; }
if_scheme_3: t_ELSIF lable expr t_GENERATE generate_statement_body { $$="elsif "+$2+$3+" generate "+$5; }
-generation_scheme: for_scheme {$$=$1;}
+generation_scheme: for_scheme { $$=$1; }
-iteration_scheme: for_scheme {$$=$1;}
-iteration_scheme: while_scheme {$$=$1;}
+iteration_scheme: for_scheme { $$=$1; }
+iteration_scheme: while_scheme { $$=$1; }
for_scheme: t_FOR t_Identifier t_IN discrete_range
{
- if(!lab.isEmpty())
- $$=lab+" :for "+$2+" in "+$4;
- else
- $$=" for "+$2+" in "+$4;
- FlowNode::addFlowNode(FlowNode::FOR_NO,0,$$,lab.data());
- lab.resize(0);
+ if (!lab.isEmpty())
+ {
+ $$=lab+" :for "+$2+" in "+$4;
+ }
+ else
+ {
+ $$=" for "+$2+" in "+$4;
+ }
+ FlowChart::addFlowChart(FlowChart::FOR_NO,0,$$,lab.data());
+ lab.resize(0);
}
for_scheme: t_FOR lable t_Identifier t_IN discrete_range
- {
- $$=lab+" for "+$2+$3+" in "+$5;
- FlowNode::addFlowNode(FlowNode::FOR_NO,0,$$,lab.data());
- lab="";
- }
+ {
+ $$=lab+" for "+$2+$3+" in "+$5;
+ FlowChart::addFlowChart(FlowChart::FOR_NO,0,$$,lab.data());
+ lab="";
+ }
while_scheme: t_WHILE expr {
- $$=" while "+$2;
- FlowNode::addFlowNode(FlowNode::WHILE_NO,0,$$,lab.data());
- lab="";
- }
+ $$=" while "+$2;
+ FlowChart::addFlowChart(FlowChart::WHILE_NO,0,$$,lab.data());
+ lab="";
+ }
/*--------------------------------------------------
-- Concurrent Statements
----------------------------------------------------*/
-concurrent_stats: concurrent_stats_1 {$$=$1;}
-concurrent_stats_1: /* empty */ {$$="";}
-concurrent_stats_1: concurrent_stats_1 concurrent_stats_2 {$$=$1+$2;}
-concurrent_stats_2: concurrent_stat {$$=$1;}
-
-concurrent_stat : block_stat {$$=$1;}
- | concurrent_assertion_stat {$$=$1;}
- | concurrent_procedure_call {$$=$1;}
- | concurrent_signal_assign_stat {$$=$1;}
- | comp_inst_stat
- {
- QCString li=$1;
- $$=$1;
-
- }
- | generate_stat {$$=$1;}
+concurrent_stats: concurrent_stats_1 { $$=$1; }
+concurrent_stats_1: /* empty */ { $$=""; }
+concurrent_stats_1: concurrent_stats_1 concurrent_stats_2 { $$=$1+$2; }
+concurrent_stats_2: concurrent_stat { $$=$1; }
+
+concurrent_stat : block_stat { $$=$1; }
+ | concurrent_assertion_stat { $$=$1; }
+ | concurrent_procedure_call { $$=$1; }
+ | concurrent_signal_assign_stat { $$=$1; }
+ | comp_inst_stat {
+ QCString li=$1;
+ $$=$1;
+ }
+ | generate_stat { $$=$1; }
| procs_stat
-block_stat: t_Identifier t_Colon t_BLOCK {pushLabel(genLabels,$1); }block_stat_0 block_stat_1 block_stat_2
+block_stat: t_Identifier t_Colon t_BLOCK { pushLabel(genLabels,$1); } block_stat_0 block_stat_1 block_stat_2
block_stat_3 block_stat_4 t_BEGIN concurrent_stats t_END t_BLOCK block_stat_5
t_Semicolon
{
$$=$1+":block"; //+$4+$5+$6+$7+$8+"begin "+$10+" block "+$13;
genLabels=popLabel(genLabels);
}
-block_stat_5: /* empty */ {$$="";}
-block_stat_5: t_Identifier {$$=$1;}
-block_stat_4: /* empty */ {$$=""; }
-block_stat_4: block_stat_4 block_stat_6 {$$=$1+$2;}
-block_stat_6: block_decltve_item {$$=$1;}
-block_stat_3: /* empty */ {$$="";}
-block_stat_3: t_PORT interf_list t_Semicolon block_stat_7 {$$="port "+$2+";"+$4; }
-//block_sta_7: /* empty */ {$$="";}
-block_stat_7: t_PORT t_MAP association_list t_Semicolon {$$="port map "+$3; }
-block_stat_2: /* empty */ {$$="";}
-block_stat_2: t_GENERIC interf_list t_Semicolon block_stat_8 {$$="generic "+$2+";"+$4; }
-block_stat_8: /* empty */ {$$="";}
-block_stat_8: t_GENERIC t_MAP association_list t_Semicolon {$$="generic map "+$3; }
-block_stat_1: /* empty */ {$$="";}
-block_stat_1: t_LeftParen expr t_RightParen block_stat_0 {$$="("+$2+")"+$4; }
-block_stat_0: /* empty */ {$$=""; }
-block_stat_0: t_IS {$$=" is ";}
+block_stat_5: /* empty */ { $$=""; }
+block_stat_5: t_Identifier { $$=$1; }
+block_stat_4: /* empty */ { $$=""; }
+block_stat_4: block_stat_4 block_stat_6 { $$=$1+$2; }
+block_stat_6: block_decltve_item { $$=$1; }
+block_stat_3: /* empty */ { $$=""; }
+block_stat_3: t_PORT interf_list t_Semicolon block_stat_7 { $$="port "+$2+";"+$4; }
+//block_sta_7: /* empty */ { $$=""; }
+block_stat_7: t_PORT t_MAP association_list t_Semicolon { $$="port map "+$3; }
+block_stat_2: /* empty */ { $$=""; }
+block_stat_2: t_GENERIC interf_list t_Semicolon block_stat_8 { $$="generic "+$2+";"+$4; }
+block_stat_8: /* empty */ { $$=""; }
+block_stat_8: t_GENERIC t_MAP association_list t_Semicolon { $$="generic map "+$3; }
+block_stat_1: /* empty */ { $$=""; }
+block_stat_1: t_LeftParen expr t_RightParen block_stat_0 { $$="("+$2+")"+$4; }
+block_stat_0: /* empty */ { $$=""; }
+block_stat_0: t_IS { $$=" is "; }
dot_name: t_Identifier { $$=$1; }
| dot_name t_Dot t_Identifier { $$=$1+"."+$3; }
@@ -1407,93 +1447,93 @@ vcomp_stat: t_CONFIGURATION { $$="configurátion";yyLineNr=s_str.iLine; }
vcomp_stat: t_ENTITY { $$="entity";yyLineNr=s_str.iLine; }
vcomp_stat: t_COMPONENT { $$="component";yyLineNr=s_str.iLine; }
-comp_inst_stat: t_Identifier t_Colon name { yyLineNr=s_str.iLine; } t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon
- {
- addCompInst($1.lower().data(),$3.lower().data(),0,yyLineNr);$$="";
+comp_inst_stat: t_Identifier t_Colon name { yyLineNr=s_str.iLine; } t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon
+ {
+ addCompInst($1.lower().data(),$3.lower().data(),0,yyLineNr);$$="";
+ }
+comp_inst_stat: t_Identifier t_Colon name { yyLineNr=s_str.iLine; } t_PORT t_MAP association_list t_Semicolon
+ {
+ addCompInst($1.lower().data(),$3.lower().data(),0,yyLineNr);$$="222";
}
-comp_inst_stat: t_Identifier t_Colon name { yyLineNr=s_str.iLine; } t_PORT t_MAP association_list t_Semicolon
- {
- addCompInst($1.lower().data(),$3.lower().data(),0,yyLineNr);$$="222";
- }
-comp_inst_stat: t_Identifier t_Colon vcomp_stat mark_comp t_PORT t_MAP association_list t_Semicolon
- {
- addCompInst($1.lower().data(),$4.lower().data(),$3.data(),yyLineNr);$$="";
- }
-comp_inst_stat: t_Identifier t_Colon vcomp_stat mark_comp t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon
- {
- addCompInst($1.lower().data(),$4.lower().data(),$3.lower().data(),yyLineNr);$$="";
- }
-comp_inst_stat_1: /* empty {$$="";} */
-comp_inst_stat_1: t_PORT t_MAP association_list // {$$="port map"+$3;}
+comp_inst_stat: t_Identifier t_Colon vcomp_stat mark_comp t_PORT t_MAP association_list t_Semicolon
+ {
+ addCompInst($1.lower().data(),$4.lower().data(),$3.data(),yyLineNr);$$="";
+ }
+comp_inst_stat: t_Identifier t_Colon vcomp_stat mark_comp t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon
+ {
+ addCompInst($1.lower().data(),$4.lower().data(),$3.lower().data(),yyLineNr);$$="";
+ }
+comp_inst_stat_1: /* empty { $$=""; } */
+comp_inst_stat_1: t_PORT t_MAP association_list // { $$="port map"+$3; }
-concurrent_assertion_stat: t_Identifier t_Colon assertion_stat {$$=$1+":"+$3;}
-concurrent_assertion_stat: assertion_stat {$$=$1; }
+concurrent_assertion_stat: t_Identifier t_Colon assertion_stat { $$=$1+":"+$3; }
+concurrent_assertion_stat: assertion_stat { $$=$1; }
-concurrent_assertion_stat: t_Identifier t_Colon t_POSTPONED assertion_stat {$$=$1+":"+"postponed "+$4; }
-concurrent_assertion_stat: t_POSTPONED assertion_stat {$$="postponed "+$2; }
+concurrent_assertion_stat: t_Identifier t_Colon t_POSTPONED assertion_stat { $$=$1+":"+"postponed "+$4; }
+concurrent_assertion_stat: t_POSTPONED assertion_stat { $$="postponed "+$2; }
-concurrent_procedure_call: t_Identifier t_Colon procedure_call_stat {$$=$1+":"+$3; }
-concurrent_procedure_call: procedure_call_stat {$$=$1;}
+concurrent_procedure_call: t_Identifier t_Colon procedure_call_stat { $$=$1+":"+$3; }
+concurrent_procedure_call: procedure_call_stat { $$=$1; }
-concurrent_procedure_call: t_Identifier t_Colon t_POSTPONED procedure_call_stat {$$=$1+":"+"postponed "+$4; }
-concurrent_procedure_call: t_POSTPONED procedure_call_stat {$$="postponed "+$2; }
+concurrent_procedure_call: t_Identifier t_Colon t_POSTPONED procedure_call_stat { $$=$1+":"+"postponed "+$4; }
+concurrent_procedure_call: t_POSTPONED procedure_call_stat { $$="postponed "+$2; }
-concurrent_signal_assign_stat: t_Identifier t_Colon condal_signal_assign {$$=$1+":"+$3; }
-concurrent_signal_assign_stat: condal_signal_assign {$$=$1;}
+concurrent_signal_assign_stat: t_Identifier t_Colon condal_signal_assign { $$=$1+":"+$3; }
+concurrent_signal_assign_stat: condal_signal_assign { $$=$1; }
-concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED condal_signal_assign {$$=$1+":"+"postponed "+$4; }
-concurrent_signal_assign_stat: t_POSTPONED condal_signal_assign {$$="postponed "+$2; }
+concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED condal_signal_assign { $$=$1+":"+"postponed "+$4; }
+concurrent_signal_assign_stat: t_POSTPONED condal_signal_assign { $$="postponed "+$2; }
-concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED sel_signal_assign {$$=$1+":"+"postponed "+$4; }
-concurrent_signal_assign_stat: t_POSTPONED sel_signal_assign {$$="postponed "+$2; }
+concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED sel_signal_assign { $$=$1+":"+"postponed "+$4; }
+concurrent_signal_assign_stat: t_POSTPONED sel_signal_assign { $$="postponed "+$2; }
-concurrent_signal_assign_stat: t_Identifier t_Colon sel_signal_assign {$$=$1+":"+$3; }
-concurrent_signal_assign_stat: sel_signal_assign {$$=$1; }
+concurrent_signal_assign_stat: t_Identifier t_Colon sel_signal_assign { $$=$1+":"+$3; }
+concurrent_signal_assign_stat: sel_signal_assign { $$=$1; }
-condal_signal_assign: target t_LESym opts condal_wavefrms t_Semicolon {$$=$1+"<="+$3+$4; }
+condal_signal_assign: target t_LESym opts condal_wavefrms t_Semicolon { $$=$1+"<="+$3+$4; }
-condal_wavefrms: wavefrm {$$=$1;}
-condal_wavefrms: wavefrm t_WHEN expr {$$=$1+" when "+$3;}
-condal_wavefrms: wavefrm t_WHEN expr t_ELSE condal_wavefrms {$$=$1+" when "+$3+"else"+$5;}
+condal_wavefrms: wavefrm { $$=$1; }
+condal_wavefrms: wavefrm t_WHEN expr { $$=$1+" when "+$3; }
+condal_wavefrms: wavefrm t_WHEN expr t_ELSE condal_wavefrms { $$=$1+" when "+$3+"else"+$5; }
-wavefrm: wavefrm_element wavefrm_1 {$$=$1+$2;}
-wavefrm: t_UNAFFECTED {$$="unaffected";}
-wavefrm_1: /* empty */ {$$="";}
-wavefrm_1: wavefrm_1 wavefrm_2 {$$=$1+$2;}
-wavefrm_2: t_Comma wavefrm_element {$$=","+$2;}
+wavefrm: wavefrm_element wavefrm_1 { $$=$1+$2; }
+wavefrm: t_UNAFFECTED { $$="unaffected"; }
+wavefrm_1: /* empty */ { $$=""; }
+wavefrm_1: wavefrm_1 wavefrm_2 { $$=$1+$2; }
+wavefrm_2: t_Comma wavefrm_element { $$=","+$2; }
-wavefrm_element: expr wavefrm_element_1 {$$=$1+$2;}
-wavefrm_element_1: /* empty */ {$$="";}
-wavefrm_element_1: t_AFTER expr {$$="after "+$2;}
-wavefrm_element_1: t_NULL wavefrm_element_2 {$$=" null "+$2;}
-wavefrm_element_1: t_NULL {$$=" null ";}
-wavefrm_element_2: t_AFTER expr {$$="after "+$2;}
+wavefrm_element: expr wavefrm_element_1 { $$=$1+$2; }
+wavefrm_element_1: /* empty */ { $$=""; }
+wavefrm_element_1: t_AFTER expr { $$="after "+$2; }
+wavefrm_element_1: t_NULL wavefrm_element_2 { $$=" null "+$2; }
+wavefrm_element_1: t_NULL { $$=" null "; }
+wavefrm_element_2: t_AFTER expr { $$="after "+$2; }
-target: name {$$=$1;}
-target: aggregate {$$=$1;}
+target: name { $$=$1; }
+target: aggregate { $$=$1; }
-opts: opts_1 opts_2 {$$=$1+$2;}
+opts: opts_1 opts_2 { $$=$1+$2; }
-opts_2: /* empty */ {$$="";}
-opts_2: t_TRANSPORT {$$="transport ";}
-opts_2: t_REJECT expr t_INERTIAL {$$="transport"+$2+" intertial ";}
-opts_2: t_INERTIAL {$$=" intertial ";}
+opts_2: /* empty */ { $$=""; }
+opts_2: t_TRANSPORT { $$="transport "; }
+opts_2: t_REJECT expr t_INERTIAL { $$="transport"+$2+" intertial "; }
+opts_2: t_INERTIAL { $$=" intertial "; }
-opts_1: /* empty */ {$$="";}
-opts_1: t_GUARDED {$$=" guarded ";}
+opts_1: /* empty */ { $$=""; }
+opts_1: t_GUARDED { $$=" guarded "; }
sel_signal_assign: t_WITH expr t_SELECT target t_LESym opts sel_wavefrms t_Semicolon
- {$$="with "+$2+" select "+$4+"<="+$6+$7;}
+ { $$="with "+$2+" select "+$4+"<="+$6+$7; }
-sel_wavefrms: sel_wavefrms_1 wavefrm t_WHEN choices {$$=$1+$2;}
-sel_wavefrms_1: /* empty */ {$$="";}
-sel_wavefrms_1: sel_wavefrms_1 sel_wavefrms_2 {$$=$1+$2;}
-sel_wavefrms_2: wavefrm t_WHEN choices t_Comma {$$=$1+" when "+$3;}
+sel_wavefrms: sel_wavefrms_1 wavefrm t_WHEN choices { $$=$1+$2; }
+sel_wavefrms_1: /* empty */ { $$=""; }
+sel_wavefrms_1: sel_wavefrms_1 sel_wavefrms_2 { $$=$1+$2; }
+sel_wavefrms_2: wavefrm t_WHEN choices t_Comma { $$=$1+" when "+$3; }
-gen_stat1: /* empty */ {$$="";}
- | block_declarative_part t_BEGIN {$$=$1+" begin ";}
- | t_BEGIN {$$="begin ";}
+gen_stat1: /* empty */ { $$=""; }
+ | block_declarative_part t_BEGIN { $$=$1+" begin "; }
+ | t_BEGIN { $$="begin "; }
// problem with double end
// end;
@@ -1512,7 +1552,7 @@ opstat: t_END generate_stat_1 t_Semicolon {genLabels=popLabel(genLabel
generate_stat: t_Identifier t_Colon
{ pushLabel(genLabels,$1); }
- if_generation_scheme opstat // t_END generate_stat_1 t_Semicolon { genLabels=popLabel(genLabels);}
+ if_generation_scheme opstat // t_END generate_stat_1 t_Semicolon { genLabels=popLabel(genLabels); }
generate_stat: t_Identifier t_Colon case_scheme
generate_stat_1: t_GENERATE { $$=""; }
@@ -1545,14 +1585,21 @@ procs_stat1: procs_stat1_5
current->startLine=s_str.yyLineNr;
current->bodyLine=s_str.yyLineNr;
}
- t_PROCESS procs_stat1_1 procs_stat1_2 t_BEGIN seq_stats t_END
+ t_PROCESS procs_stat1_1 procs_stat1_2
+ {
+ if ($5.data())
+ FlowChart::addFlowChart(FlowChart::VARIABLE_NO,$5.data(),0);
+ FlowChart::addFlowChart(FlowChart::BEGIN_NO,"BEGIN",0);
+ }
+ t_BEGIN seq_stats t_END
+
procs_stat1_3 t_Semicolon
{
$5.stripPrefix($4.data());
tempEntry=current;
currP=0;
createFunction(currName,VhdlDocGen::PROCESS,$4.data());
- createFlow($5);
+ createFlow();
currName="";
}
procs_stat1: error t_END procs_stat1_3 t_Semicolon { currP=0; }
@@ -1566,8 +1613,8 @@ procs_stat1_5: t_POSTPONED { $$="postponed"; }
procs_stat1_6: /* empty */ { $$=""; }
procs_stat1_6: t_Identifier { $$=$1; }
-procs_stat1_2: /* empty */ {$$="";}
-procs_stat1_2: t_IS {$$="";}
+procs_stat1_2: /* empty */ { $$=""; }
+procs_stat1_2: t_IS { $$=""; }
procs_stat1_2: procs_stat1_2 procs_stat1_4 { $$+=$2; }
procs_stat1_4: procs_decltve_item { $$=$1; }
procs_stat1_1: /* empty */ { $$=""; }
@@ -1583,202 +1630,188 @@ sensitivity_list_2: t_Comma name { $$=","+$2; }
-- Sequential Statements
----------------------------------------------------*/
-seq_stats: seq_stats_1 {$$=$1;}
-seq_stats_1: /* empty */ {$$="";}
-seq_stats_1: seq_stats_1 seq_stats_2 {$$=$1+$2;}
-seq_stats_2: seq_stat {$$=$1;}
-
-seq_stat: assertion_stat {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-seq_stat: lable assertion_stat {$$=$1+$2; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-seq_stat: case_stat {$$=$1;}
-seq_stat: exit_stat {
- $$=$1;
- }
-seq_stat: if_stat {$$="";}
-seq_stat: loop_stat {$$=$1;}
-seq_stat: next_stat {
- $$=$1;
- }
-seq_stat: null_stat {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-seq_stat: procedure_call_stat {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-seq_stat: return_stat {$$=$1; FlowNode::addFlowNode(FlowNode::RETURN_NO,$$.data(),0);}
-seq_stat: lable signal_assign_stat {$$=$1+$2;}
-seq_stat: signal_assign_stat
- {
- $$=$1;
- FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);
- }
-seq_stat: variable_assign_stat { $$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-seq_stat: wait_stat {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-seq_stat: lable wait_stat {$$=$1+$2; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-seq_stat: report_statement {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);}
-
-report_statement: loop_stat_1 t_REPORT expr assertion_stat_2 t_Semicolon {$$=$1+"report "+$3+$4+";"; }
-
-assertion_stat: t_ASSERT expr assertion_stat_1 assertion_stat_2 t_Semicolon {$$="assert "+$2+$3+$4+";";}
-assertion_stat_2: /* empty */ {$$="";}
-assertion_stat_2 : t_SEVERITY expr {$$=" serverity "+$2;}
-assertion_stat_1 : /* empty */ {$$="";}
-assertion_stat_1 : t_REPORT expr {$$=" report "+$2;}
-
-choice_stat : /* empty */ {$$="";}
-choice_stat : t_Q {$$="?";}
-
-choice_stat_1: /* empty */ {$$="";}
-choice_stat_1 : t_Q {$$="?";}
-choice_stat_1 : t_Identifier {$$=$1;}
+seq_stats: seq_stats_1 { $$=$1; }
+seq_stats_1: /* empty */ { $$=""; }
+seq_stats_1: seq_stats_1 seq_stats_2 { $$=$1+$2; }
+seq_stats_2: seq_stat { $$=$1; }
+seq_stat: assertion_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: lable assertion_stat { $$=$1+$2; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: case_stat { $$=$1; }
+seq_stat: exit_stat { $$=$1; }
+seq_stat: if_stat { $$=""; }
+seq_stat: loop_stat { $$=$1; }
+seq_stat: next_stat { $$=$1; }
+seq_stat: null_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: procedure_call_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: return_stat { $$=$1; FlowChart::addFlowChart(FlowChart::RETURN_NO,$$.data(),0); }
+seq_stat: lable signal_assign_stat { $$=$1+$2; }
+seq_stat: signal_assign_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: variable_assign_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: wait_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: lable wait_stat { $$=$1+$2; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+seq_stat: report_statement { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); }
+
+report_statement: loop_stat_1 t_REPORT expr assertion_stat_2 t_Semicolon { $$=$1+"report "+$3+$4+";"; }
+
+assertion_stat: t_ASSERT expr assertion_stat_1 assertion_stat_2 t_Semicolon { $$="assert "+$2+$3+$4+";"; }
+assertion_stat_2: /* empty */ { $$=""; }
+assertion_stat_2 : t_SEVERITY expr { $$=" serverity "+$2; }
+assertion_stat_1 : /* empty */ { $$=""; }
+assertion_stat_1 : t_REPORT expr { $$=" report "+$2; }
+
+choice_stat : /* empty */ { $$=""; }
+choice_stat : t_Q { $$="?"; }
+
+choice_stat_1: /* empty */ { $$=""; }
+choice_stat_1 : t_Q { $$="?"; }
+choice_stat_1 : t_Identifier { $$=$1; }
case_stat : t_CASE choice_stat expr
{
QCString ca="case "+$2+$3;
- FlowNode::addFlowNode(FlowNode::CASE_NO,0,ca);
+ FlowChart::addFlowChart(FlowChart::CASE_NO,0,ca);
}
- t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon
- {
- FlowNode::addFlowNode(FlowNode::END_CASE,"end case",0);
- FlowNode::moveToPrevLevel();
- }
+ t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon
+ {
+ FlowChart::moveToPrevLevel();
+ FlowChart::addFlowChart(FlowChart::END_CASE,"end case",0);
+ }
case_stat : lable t_CASE choice_stat expr
{
- QCString ca="case "+$3+$4;
- FlowNode::addFlowNode(FlowNode::CASE_NO,0,ca);
+ QCString ca="case "+$3+$4;
+ FlowChart::addFlowChart(FlowChart::CASE_NO,0,ca);
}
- t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon
- {
- FlowNode::addFlowNode(FlowNode::END_CASE,0,0);
- FlowNode::moveToPrevLevel();
- }
+ t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon
+ {
+ FlowChart::moveToPrevLevel();
+
+ FlowChart::addFlowChart(FlowChart::END_CASE,0,0);
+ }
-case_stat : t_CASE error t_END t_CASE choice_stat_1 t_Semicolon {$$="";}
-case_stat_1 : /* empty */ {$$="";}
-case_stat_1 : case_stat_1 case_stat_2 {$$=$1+$2;}
-case_stat_2 : case_stat_alternative {$$=$1;}
+case_stat : t_CASE error t_END t_CASE choice_stat_1 t_Semicolon { $$=""; }
+case_stat_1 : /* empty */ { $$=""; }
+case_stat_1 : case_stat_1 case_stat_2 { $$=$1+$2; }
+case_stat_2 : case_stat_alternative { $$=$1; }
case_stat_alternative : t_WHEN choices t_Arrow
- {
- QCString t="when ";
- t+=$2+"=> ";
- FlowNode::addFlowNode(FlowNode::WHEN_NO,0,t);
+ {
+ QCString t="when ";
+ t+=$2+"=> ";
+ FlowChart::addFlowChart(FlowChart::WHEN_NO,$2.data(),t);
}
-seq_stats {$$="";}
-
+ seq_stats { $$=""; FlowChart::moveToPrevLevel(); }
-
-if_stat : t_IF expr t_THEN
+if_stat: t_IF expr t_THEN
{
- $2.prepend("if ");
- FlowNode::addFlowNode(FlowNode::IF_NO,0,$2);
+ $2.prepend("if ");
+ FlowChart::addFlowChart(FlowChart::IF_NO,0,$2);
}
seq_stats
if_stat_1 if_stat_2 t_END t_IF t_Semicolon
{
- FlowNode::addFlowNode(FlowNode::ENDIF_NO,0,0);
- FlowNode::moveToPrevLevel();
+ FlowChart::moveToPrevLevel();
+ FlowChart::addFlowChart(FlowChart::ENDIF_NO,0,0);
}
-if_stat_2 : /* empty */ {$$=""; }
+if_stat_2 : /* empty */ { $$=""; }
if_stat_2 : t_ELSE
- {
- FlowNode::addFlowNode(FlowNode::ELSE_NO,0,0);
- } seq_stats {$$=""; }
+ {
+ FlowChart::addFlowChart(FlowChart::ELSE_NO,0,0);
+ }
+ seq_stats { $$=""; }
+
+
-if_stat_1 : /* empty */ {$$=""; }
-if_stat_1 : if_stat_1 if_stat_3 {$$=$1+$2; }
+if_stat_1 : /* empty */ { $$=""; }
+if_stat_1 : if_stat_1 if_stat_3 { $$=$1+$2; }
if_stat_3 : t_ELSIF expr t_THEN
{
- $2.prepend("elsif ");
- FlowNode::addFlowNode(FlowNode::ELSIF_NO,0,$2.data());
- } seq_stats {$$="";}
+ $2.prepend("elsif ");
+ FlowChart::addFlowChart(FlowChart::ELSIF_NO,0,$2.data());
+ } seq_stats { $$=""; }
loop_stat: loop_stat_1 loop_stat_2 t_LOOP seq_stats t_END t_LOOP loop_stat_3 t_Semicolon
- {
-
- $$=$1+$2+" loop "+$4+" end loop" +$7;
- QCString endLoop="end loop" + $7;
- FlowNode::addFlowNode(FlowNode::END_LOOP,endLoop.data(),0);
- FlowNode::moveToPrevLevel();
- }
+ {
+ $$=$1+$2+" loop "+$4+" end loop" +$7;
+ QCString endLoop="end loop" + $7;
+ FlowChart::moveToPrevLevel();
+ FlowChart::addFlowChart(FlowChart::END_LOOP,endLoop.data(),0);
+ }
-loop_stat_3: /* empty */ {$$=""; }
-loop_stat_3: t_Identifier {$$=$1; }
-loop_stat_2: /* empty */ {
- $$="";
- FlowNode::addFlowNode(FlowNode::LOOP_NO,0,"infinite loop");
- }
+loop_stat_3: /* empty */ { $$=""; }
+loop_stat_3: t_Identifier { $$=$1; }
+loop_stat_2: /* empty */ { $$="";
+ FlowChart::addFlowChart(FlowChart::LOOP_NO,0,"infinite loop");
+ }
loop_stat_2: iteration_scheme
-loop_stat_1: /* empty */ {$$=""; }
-loop_stat_1: t_Identifier t_Colon {$$=$1+":";lab=$1;}
+loop_stat_1: /* empty */ { $$=""; }
+loop_stat_1: t_Identifier t_Colon { $$=$1+":";lab=$1; }
exit_stat : loop_stat_1 t_EXIT exit_stat_1 exit_stat_2 t_Semicolon
{
- $$=$1+"exit "+$3+";";
- if($4.data())
- FlowNode::addFlowNode(FlowNode::EXIT_WHEN_NO,0,$4.data(),0);
-
- FlowNode::addFlowNode(FlowNode::EXIT_NO,$$.data(),0,$3.data());
- }
-exit_stat_2 : /* empty */ {$$="";}
-exit_stat_2 : t_WHEN expr {$$="when "+$2;}
-exit_stat_1 : /* empty */ {$$="";}
-exit_stat_1 : t_Identifier {$$=$1;lab=$$;}
+ FlowChart::addFlowChart(FlowChart::EXIT_NO,"exit",$4.data(),$3.data());
+ lab.resize(0);
+ }
+exit_stat_2 : /* empty */ { $$=""; }
+exit_stat_2 : t_WHEN expr { $$="when "+$2; }
+exit_stat_1 : /* empty */ { $$=""; }
+exit_stat_1 : t_Identifier { $$=$1;lab=$$; }
next_stat: loop_stat_1 t_NEXT next_stat_1 next_stat_2 t_Semicolon
- {
- $$=$1+"next "+$3+";" ;
- if($4.data())
- FlowNode::addFlowNode(FlowNode::EXIT_WHEN_NO,0,$4.data(),0);
- FlowNode::addFlowNode(FlowNode::NEXT_NO,$$.data(),0,$3.data());
- }
+ {
+ FlowChart::addFlowChart(FlowChart::NEXT_NO,"next ",$4.data(),$3.data());
+ lab.resize(0);
+ }
-next_stat_2: /* empty */ {$$=""; }
-next_stat_2: t_WHEN expr {$$="when "+$2; }
-next_stat_1: /* empty */ {$$=""; }
-next_stat_1: t_Identifier {$$=$1;lab=$$; }
+next_stat_2: /* empty */ { $$=""; }
+next_stat_2: t_WHEN expr { $$="when "+$2; }
+next_stat_1: /* empty */ { $$=""; }
+next_stat_1: t_Identifier { $$=$1;lab=$$; }
-null_stat: t_NULL t_Semicolon {$$="null"; $$+=";";}
+null_stat: t_NULL t_Semicolon { $$="null"; $$+=";"; }
procedure_call_stat: name t_Semicolon
{
- $$=$1+";";
+ $$=$1+";";
}
-return_stat: t_RETURN return_stat_1 t_Semicolon {$$="return "+$2+";" ;}
-return_stat_1: /* empty */ {$$=""; }
-return_stat_1: expr {$$=$1; }
+return_stat: t_RETURN return_stat_1 t_Semicolon { $$="return "+$2+";" ; }
+return_stat_1: /* empty */ { $$=""; }
+return_stat_1: expr { $$=$1; }
-signal_assign_stat: target t_LESym wavefrm t_Semicolon {$$=$1+" <="+$3+";" ;}
- | target t_LESym delay_mechanism wavefrm t_Semicolon {$$=$1+ "<= "+$3+$4 +";";}
- | target t_LESym t_FORCE inout_stat expr t_Semicolon {$$=$1+ "<= "+ " force "+$4+";" ;}
- | target t_LESym t_RELEASE inout_stat t_Semicolon {$$=$1+ "<= "+" release "+$4 +";";}
- | selected_signal_assignment {$$=$1; }
- | conditional_signal_assignment {$$=$1; }
+signal_assign_stat: target t_LESym wavefrm t_Semicolon { $$=$1+" <="+$3+";" ; }
+ | target t_LESym delay_mechanism wavefrm t_Semicolon { $$=$1+ "<= "+$3+$4 +";"; }
+ | target t_LESym t_FORCE inout_stat expr t_Semicolon { $$=$1+ "<= "+ " force "+$4+";" ; }
+ | target t_LESym t_RELEASE inout_stat t_Semicolon { $$=$1+ "<= "+" release "+$4 +";"; }
+ | selected_signal_assignment { $$=$1; }
+ | conditional_signal_assignment { $$=$1; }
;
-variable_assign_stat: variable_assign_stat_1 t_Semicolon {$$=$1+";"; }
- | conditional_variable_assignment {$$=$1; }
- | lable selected_variable_assignment {$$=$1; }
- | selected_variable_assignment {$$=$1; }
+variable_assign_stat: variable_assign_stat_1 t_Semicolon { $$=$1+";"; }
+ | conditional_variable_assignment { $$=$1; }
+ | lable selected_variable_assignment { $$=$1; }
+ | selected_variable_assignment { $$=$1; }
lable: t_Identifier t_Colon { $$=$1+":"; }
-variable_assign_stat_1: target t_VarAsgn expr {$$=$1+":="+$3; }
-variable_assign_stat_1: lable target t_VarAsgn expr {$$=$1+$2+":="+$4; }
+variable_assign_stat_1: target t_VarAsgn expr { $$=$1+":="+$3; }
+variable_assign_stat_1: lable target t_VarAsgn expr { $$=$1+$2+":="+$4; }
wait_stat: t_WAIT wait_stat_1 wait_stat_2 wait_stat_3 t_Semicolon
{
$$="wait "+$2+$3+$4+";";
}
-wait_stat_3: /* empty */ {$$=""; }
-wait_stat_3: t_FOR expr {$$="for "+$2; }
-wait_stat_2: /* empty */ {$$=""; }
-wait_stat_2: t_UNTIL expr {$$=" until "+$2; }
-wait_stat_1: /* empty */ {$$=""; }
-wait_stat_1: t_ON sensitivity_list {$$=" on "+$2; }
+wait_stat_3: /* empty */ { $$=""; }
+wait_stat_3: t_FOR expr { $$="for "+$2; }
+wait_stat_2: /* empty */ { $$=""; }
+wait_stat_2: t_UNTIL expr { $$=" until "+$2; }
+wait_stat_1: /* empty */ { $$=""; }
+wait_stat_1: t_ON sensitivity_list { $$=" on "+$2; }
/*--------------------------------------------------
@@ -1787,7 +1820,7 @@ wait_stat_1: t_ON sensitivity_list {$$=" on "+$2; }
comp_end_dec : t_END { lastEntity=0; lastCompound=0; genLabels.resize(0); }
| t_END t_COMPONENT entity_decl_5
| t_END t_ARCHITECTURE entity_decl_5 { lastCompound=0; genLabels.resize(0); }
- | t_END t_ENTITY entity_decl_5 { lastEntity=0; genLabels.resize(0); }
+ | t_END t_ENTITY entity_decl_5 { lastEntity=0;lastCompound=0; genLabels.resize(0); }
| t_END t_Identifier { lastEntity=0; lastCompound=0; genLabels.resize(0); }
iss :/*empty*/ { currP=VhdlDocGen::COMPONENT; }
@@ -1803,7 +1836,7 @@ comp_decl_2: t_PORT interf_list t_Semicolon { $$=$2; }
comp_decl_1: /* empty */ { $$=""; }
comp_decl_1: t_GENERIC interf_list t_Semicolon { $$=$2; }
-block_config: t_FOR block_spec block_config_1 block_config_2 { levelCounter--;} t_END t_FOR t_Semicolon
+block_config: t_FOR block_spec block_config_1 block_config_2 { levelCounter--; } t_END t_FOR t_Semicolon
{
}
@@ -1879,11 +1912,11 @@ inst_list: t_OTHERS { $$="others"; }
binding_indic : entity_aspect binding_indic_1 binding_indic_2 { $$=$1; }
-binding_indic_2: {$$="";}
-binding_indic_2: t_PORT t_MAP association_list {$$="port map "+$3;}
+binding_indic_2: { $$=""; }
+binding_indic_2: t_PORT t_MAP association_list { $$="port map "+$3; }
-binding_indic_1: {$$="";}
-binding_indic_1: t_GENERIC t_MAP association_list {$$="generic map "+$3;}
+binding_indic_1: { $$=""; }
+binding_indic_1: t_GENERIC t_MAP association_list { $$="generic map "+$3; }
entity_aspect: t_ENTITY name { $$="entity "+$2; }
@@ -1915,7 +1948,7 @@ group_template_declaration : t_GROUP t_Identifier t_IS t_LeftParen entity_cl
group_template_declaration: t_GROUP t_Identifier t_IS t_LeftParen error t_Semicolon t_RightParen{ $$=""; }
-entity_class_entry : entity_class tbox {$$=$1+$2;}
+entity_class_entry : entity_class tbox { $$=$1+$2; }
tbox : /* empty */ { $$=""; }
tbox : t_Box { $$="<>"; }
@@ -2063,8 +2096,8 @@ when_stats: when_stats_1
ttend: t_END t_Semicolon
ttend: t_END t_Identifier t_Semicolon
-conditional_signal_assignment: conditional_waveform_assignment {$$="";}
-conditional_signal_assignment: conditional_force_assignment {$$="";}
+conditional_signal_assignment: conditional_waveform_assignment { $$=""; }
+conditional_signal_assignment: conditional_force_assignment { $$=""; }
conditional_waveform_assignment: target t_LESym wavefrm_element t_WHEN expr else_wave_list t_Semicolon
conditional_waveform_assignment: target t_LESym delay_mechanism wavefrm_element t_WHEN expr else_wave_list t_Semicolon
@@ -2078,8 +2111,8 @@ else_wave_list: t_ELSE expr
conditional_force_assignment: target t_LESym t_FORCE inout_stat expr t_WHEN expr else_stat t_Semicolon
conditional_force_assignment: target t_LESym t_FORCE inout_stat expr t_WHEN expr t_Semicolon
-selected_signal_assignment : selected_waveform_assignment {$$="";}
-selected_signal_assignment : selected_force_assignment {$$="";}
+selected_signal_assignment : selected_waveform_assignment { $$=""; }
+selected_signal_assignment : selected_force_assignment { $$=""; }
selected_waveform_assignment: t_WITH expr t_SELECT choice_stat
target t_LESym delay_stat sel_wave_list
@@ -2095,13 +2128,13 @@ sel_wave_list_1: wavefrm_element t_WHEN choices t_Semicolon
selected_force_assignment: t_WITH expr t_SELECT choice_stat target t_LESym t_FORCE
inout_stat sel_var_list
-inout_stat: /* empty */ {$$="";}
-inout_stat: t_IN {$$=" in ";}
-inout_stat: t_OUT {$$="out";}
+inout_stat: /* empty */ { $$=""; }
+inout_stat: t_IN { $$=" in "; }
+inout_stat: t_OUT { $$="out"; }
-delay_mechanism : t_TRANSPORT { $$=" transport ";}
- | t_REJECT expr t_INERTIAL { $$=" reject "+$2+"inertial ";}
- | t_INERTIAL { $$=" inertial ";}
+delay_mechanism : t_TRANSPORT { $$=" transport "; }
+ | t_REJECT expr t_INERTIAL { $$=" reject "+$2+"inertial "; }
+ | t_INERTIAL { $$=" inertial "; }
conditional_variable_assignment : variable_assign_stat_1 t_WHEN expr else_stat t_Semicolon
conditional_variable_assignment : variable_assign_stat_1 t_WHEN expr t_Semicolon
@@ -2110,7 +2143,7 @@ else_stat: t_ELSE expr t_WHEN expr
else_stat: else_stat t_ELSE expr t_WHEN expr
else_stat: t_ELSE expr
-selected_variable_assignment: t_WITH expr t_SELECT choice_stat select_name t_VarAsgn sel_var_list {$$="";}
+selected_variable_assignment: t_WITH expr t_SELECT choice_stat select_name t_VarAsgn sel_var_list { $$=""; }
sel_var_list: expr t_WHEN choices t_Comma sel_var_list
sel_var_list: sel_var_list_1
@@ -2232,8 +2265,8 @@ extern YYSTYPE vhdlScanYYlval;
void vhdlScanYYerror(const char* /*str*/)
{
- // fprintf(stderr,"\n<---error at line %d : [ %s] in file : %s ---->",s_str.yyLineNr,s_str.qstr.data(),s_str.fileName);
- // exit(0);
+ // fprintf(stderr,"\n<---error at line %d : [ %s] in file : %s ---->",s_str.yyLineNr,s_str.qstr.data(),s_str.fileName);
+ // exit(0);
}
void vhdlParse()
@@ -2311,7 +2344,7 @@ static QCString popLabel(QCString & q)
static void addConfigureNode(const char* a,const char*b, bool,bool isLeaf,bool inlineConf)
{
- VhdlConfNode* co;
+ VhdlConfNode* co=0;
QCString ent,arch,lab;
QCString l=genLabels;
ent=a;
@@ -2328,7 +2361,9 @@ static void addConfigureNode(const char* a,const char*b, bool,bool isLeaf,bool i
{
VhdlConfNode* vc=configL.last();
level=vc->level;
- if (level<levelCounter)
+ if (levelCounter==0)
+ pushLabel(forL,ent);
+ else if (level<levelCounter)
{
if (!isLeaf)
{
@@ -2426,10 +2461,10 @@ static void addProto(const char *s1,const char *s2,const char *s3,
}
}
-static void createFunction(const QCString &impure,int spec,
+static void createFunction(const QCString &impure,uint64 spec,
const QCString &fname)
{
- int it=0;
+
current->spec=spec;
current->section=Entry::FUNCTION_SEC;
@@ -2448,17 +2483,15 @@ static void createFunction(const QCString &impure,int spec,
{
current->name=impure;
current->exception="";
- it=t_PROCEDURE;
}
else
{
current->name=fname;
- it=t_FUNCTION;
}
if (spec==VhdlDocGen::PROCESS)
{
- it=t_PROCESS;
+
current->args=fname;
current->name=impure;
VhdlDocGen::deleteAllChars(current->args,' ');
@@ -2475,20 +2508,18 @@ static void createFunction(const QCString &impure,int spec,
return;
}
- current->startLine=getParsedLine(it);
- current->bodyLine=getParsedLine(it);
+ current->startLine=s_str.iLine;
+ current->bodyLine=s_str.iLine;
+
}
-static void addVhdlType(const QCString &name,int startLine,int section,int spec,
- const char* args,const char* type,Protection prot)
+static void addVhdlType(const QCString &name,int startLine,int section,
+ uint64 spec,const char* args,const char* type,Protection prot)
{
static QRegExp reg("[\\s]");
- if (isFuncProcProced() || VhdlDocGen::getFlowMember())
- {
- return;
- }
-
+ if (isFuncProcProced() || VhdlDocGen::getFlowMember()) return;
+
if (parse_sec==GEN_SEC)
{
spec= VhdlDocGen::GENERIC;
@@ -2500,10 +2531,7 @@ static void addVhdlType(const QCString &name,int startLine,int section,int spec,
for (uint u=0;u<ql.count();u++)
{
current->name=ql[u].utf8();
- // if (section==Entry::VARIABLE_SEC && !(spec == VhdlDocGen::USE || spec == VhdlDocGen::LIBRARY) )
- // {
- // current->name.prepend(VhdlDocGen::getRecordNumber());
- // }
+
current->startLine=startLine;
current->bodyLine=startLine;
@@ -2518,17 +2546,20 @@ static void addVhdlType(const QCString &name,int startLine,int section,int spec,
current->type=type;
current->type.replace(reg,"%"); // insert dummy chars because white spaces are removed
current->protection=prot;
+
+ if (!lastCompound && (section==Entry::VARIABLE_SEC) && (spec == VhdlDocGen::USE || spec == VhdlDocGen::LIBRARY) )
+ {
+ libUse.append(new Entry(*current));
+ current->reset();
+ }
newEntry();
}
}
static void newEntry()
{
- if (current->spec==VhdlDocGen::ENTITY ||
- current->spec==VhdlDocGen::PACKAGE ||
- current->spec==VhdlDocGen::ARCHITECTURE ||
- current->spec==VhdlDocGen::PACKAGE_BODY
- )
+
+ if (VhdlDocGen::isVhdlClass(current))
{
current_root->addSubEntry(current);
}
@@ -2554,7 +2585,7 @@ static void newEntry()
initEntry(current);
}
-void createFlow(QCString val)
+void createFlow()
{
if (!VhdlDocGen::getFlowMember())
{
@@ -2565,13 +2596,13 @@ void createFlow(QCString val)
if (currP==VhdlDocGen::FUNCTION)
{
q=":function( ";
- FlowNode::alignFuncProc(q,tempEntry->argList,true);
+ FlowChart::alignFuncProc(q,tempEntry->argList,true);
q+=")";
}
else if (currP==VhdlDocGen::PROCEDURE)
{
q=":procedure (";
- FlowNode::alignFuncProc(q,tempEntry->argList,false);
+ FlowChart::alignFuncProc(q,tempEntry->argList,false);
q+=")";
}
else
@@ -2582,12 +2613,7 @@ void createFlow(QCString val)
q.prepend(VhdlDocGen::getFlowMember()->name().data());
- FlowNode::addFlowNode(FlowNode::START_NO,q,0);
-
- if (!val.isEmpty())
- {
- FlowNode::addFlowNode(FlowNode::VARIABLE_NO,val,0);
- }
+ FlowChart::addFlowChart(FlowChart::START_NO,q,0);
if (currP==VhdlDocGen::FUNCTION)
{
@@ -2602,9 +2628,9 @@ void createFlow(QCString val)
ret="end process ";
}
- FlowNode::addFlowNode(FlowNode::END_NO,ret,0);
- // FlowNode::printFlowList();
- FlowNode::writeFlowNode();
+ FlowChart::addFlowChart(FlowChart::END_NO,ret,0);
+ // FlowChart::printFlowList();
+ FlowChart::writeFlowChart();
currP=0;
}
diff --git a/src/vhdlscanner.h b/src/vhdlscanner.h
index c1192cf..12c2d13 100644
--- a/src/vhdlscanner.h
+++ b/src/vhdlscanner.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -28,7 +28,7 @@
#include <unistd.h>
#include <qfile.h>
#include <qdict.h>
-
+#include "vhdldocgen.h"
#include "entry.h"
class Entry;
@@ -48,9 +48,13 @@ class VHDLLanguageScanner : public ParserInterface
{
public:
virtual ~VHDLLanguageScanner() {}
+ void startTranslationUnit(const char *) {}
+ void finishTranslationUnit() {}
void parseInput(const char * fileName,
const char *fileBuf,
- Entry *root);
+ Entry *root,
+ bool sameTranslationUnit,
+ QStrList &filesInSameTranslationUnit);
bool needsPreprocessing(const QCString &extension);
void parseCode(CodeOutputInterface &codeOutIntf,
const char *scopeName,
@@ -129,8 +133,13 @@ void vhdlParse();
// return the list of component instantiations e.g. foo: component bar
QList<Entry> & getVhdlInstList();
-// returns the list of found configurations
+// returns configuration list
QList<VhdlConfNode>& getVhdlConfiguration();
+// returns library/used list
+QList<Entry> & getLibUse();
+
void isVhdlDocPending();
+
+
#endif
diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l
index 898713e..934a985 100644
--- a/src/vhdlscanner.l
+++ b/src/vhdlscanner.l
@@ -96,7 +96,7 @@ static QMap<QCString, int> keyMap;
static QList<Entry> lineEntry;
static bool checkMultiComment(QCString& qcs,int line);
static void handleCommentBlock(const QCString &doc,bool brief);
-static void mapLibPackage(const Entry* ce);
+static void mapLibPackage(Entry* ce);
static QList<Entry>* getEntryAtLine(const Entry* ce,int line);
static bool addLibUseClause(const QCString &type);
static Entry* oldEntry;
@@ -532,11 +532,18 @@ BR [ \t\n\r]
{
REJECT;
}
+ else if (qcs.stripPrefix("--#"))
+ {
+ if (VhdlDocGen::getFlowMember())
+ {
+ FlowChart::addFlowChart(FlowChart::COMMENT_NO,0,0,qcs.data());
+ }
+ }
}
. { /* unknown characters */ }
-<*>{BR}*"--!"[^{}\n][^\n]*\n/{B}*"--!" { // multi line comment
+<*>{BR}*"--!"[^{}\n]*[^\n]*\n/{B}*"--!" { // multi line comment
if (iDocLine==-1) iDocLine=yyLineNr;
QCString qc(vhdlScanYYtext);
int len=qc.contains('\n')+yyLineNr-1;
@@ -733,7 +740,11 @@ void VHDLLanguageScanner::parsePrototype(const char *text)
// return token;
//}
-void VHDLLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
+void VHDLLanguageScanner::parseInput(const char *fileName,
+ const char *fileBuf,
+ Entry *root,
+ bool /*sameTranslationUnit*/,
+ QStrList & /*filesInSameTranslationUnit*/)
{
yyFileName=QCString(fileName);
@@ -812,73 +823,43 @@ void VHDLLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf,
* .....
* and so on..
*/
-static void mapLibPackage(const Entry* ce)
+static void mapLibPackage( Entry* root)
{
- Entry *lastComp=0;
- while (TRUE)
+ QList<Entry> epp=getLibUse();
+ EntryListIterator eli(epp);
+ Entry *rt;
+ for (;(rt=eli.current());++eli)
{
- bool found = FALSE;
- Entry *rt=0;
- //const QList<Entry> *epp=ce->children();
- EntryListIterator eli(*ce->children());
- EntryListIterator eli1=eli;
- for (;(rt=eli.current()),eli1=eli;++eli)
+ if (addLibUseClause(rt->name))
{
- if (rt->spec==VhdlDocGen::LIBRARY || rt->spec==VhdlDocGen::USE)
- // top level library or use statement
+ Entry *current;
+ EntryListIterator eLib(*root->children());
+ bool bFound=FALSE;
+ for (eLib.toFirst();(current=eLib.current());++eLib)
{
- Entry *temp=0;
- if(!addLibUseClause(rt->name))
- {
- rt->spec=-1;
- rt->section=0;
- // continue;
- }
-
- for (;(temp=eli1.current());++eli1) // find next entity
- {
- if (temp->spec==VhdlDocGen::ENTITY ||
- temp->spec==VhdlDocGen::PACKAGE ||
- temp->spec==VhdlDocGen::ARCHITECTURE ||
- temp->spec==VhdlDocGen::PACKAGE_BODY)
+ if (VhdlDocGen::isVhdlClass(current))
+ if (current->startLine > rt->startLine)
{
- Entry *ee=new Entry(*rt); //append a copy to entries sublist
- temp->addSubEntry(ee);
- found=TRUE;
- rt->spec=-1; //nullify entry
- rt->section=0;
- lastComp=temp;
- break;
+ bFound=TRUE;
+ current->addSubEntry(rt);
+ break;
}
- }//for
- if (lastComp && rt->spec!=-1)
- {
- Entry *ee=new Entry(*rt); //append a copy to entries sublist
- lastComp->addSubEntry(ee);
- found=TRUE;
- rt->spec=-1; //nullify entry
- rt->section=0;
- }
- }//if
- }//for
- if (!found) // nothing left to do
- {
- return;
- }
- }//while
+ }//for
+ if (!bFound)
+ {
+ root->addSubEntry(rt);
+ }
+ } //if
+ }// for
+
+ epp.clear();
}//MapLib
static bool addLibUseClause(const QCString &type)
{
- static bool show=Config_getBool("SHOW_INCLUDE_FILES");
static bool showIEEESTD=Config_getBool("FORCE_LOCAL_INCLUDES");
- if (!show) // all libraries and included packages will not be shown
- {
- return FALSE;
- }
-
- if (!showIEEESTD) // all standard packages and libraries will not be shown
+ if (showIEEESTD) // all standard packages and libraries will not be shown
{
if (type.lower().stripPrefix("ieee")) return FALSE;
if (type.lower().stripPrefix("std")) return FALSE;
@@ -983,7 +964,9 @@ int getParsedLine(int object)
void isVhdlDocPending()
{
if (!str_doc.pending)
+ {
return;
+ }
str_doc.pending=FALSE;
oldEntry=0; // prevents endless recursion
iDocLine=str_doc.iDocLine;
diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp
index 05da2a0..5bae376 100644
--- a/src/xmldocvisitor.cpp
+++ b/src/xmldocvisitor.cpp
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -173,7 +173,7 @@ void XmlDocVisitor::visit(DocSymbol *s)
case DocSymbol::LeftFloor: m_t << "<lfloor>"; break;
case DocSymbol::RightFloor: m_t << "<rfloor>"; break;
default:
- err("error: unknown symbol found\n");
+ err("unknown symbol found\n");
}
}
@@ -283,6 +283,11 @@ void XmlDocVisitor::visit(DocVerbatim *s)
case DocVerbatim::XmlOnly:
m_t << s->text();
break;
+ case DocVerbatim::DocbookOnly:
+ m_t << "<docbookonly>";
+ filter(s->text());
+ m_t << "</docbookonly>";
+ break;
case DocVerbatim::Dot:
m_t << "<dot>";
filter(s->text());
@@ -835,7 +840,10 @@ void XmlDocVisitor::visitPost(DocLink *)
void XmlDocVisitor::visitPre(DocRef *ref)
{
if (m_hide) return;
- if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor());
+ if (!ref->file().isEmpty())
+ {
+ startLink(ref->ref(),ref->file(),ref->isSubPage() ? QCString() : ref->anchor());
+ }
if (!ref->hasLinkText()) filter(ref->targetTitle());
}
@@ -1056,6 +1064,7 @@ void XmlDocVisitor::filter(const char *str)
void XmlDocVisitor::startLink(const QCString &ref,const QCString &file,const QCString &anchor)
{
+ //printf("XmlDocVisitor: file=%s anchor=%s\n",file.data(),anchor.data());
m_t << "<ref refid=\"" << file;
if (!anchor.isEmpty()) m_t << "_1" << anchor;
m_t << "\" kindref=\"";
diff --git a/src/xmldocvisitor.h b/src/xmldocvisitor.h
index 77242a1..42290cc 100644
--- a/src/xmldocvisitor.h
+++ b/src/xmldocvisitor.h
@@ -3,7 +3,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
index 07ea086..b1bfc9c 100644
--- a/src/xmlgen.cpp
+++ b/src/xmlgen.cpp
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
@@ -81,6 +81,8 @@ class XmlSectionMapper : public QIntDict<char>
insert(MemberListType_dcopMethods,"dcop-func");
insert(MemberListType_properties,"property");
insert(MemberListType_events,"event");
+ insert(MemberListType_interfaces,"interfaces");
+ insert(MemberListType_services,"services");
insert(MemberListType_pubStaticMethods,"public-static-func");
insert(MemberListType_pubStaticAttribs,"public-static-attrib");
insert(MemberListType_proTypes,"protected-type");
@@ -140,7 +142,7 @@ inline void writeXMLCodeString(FTextStream &t,const char *s, int &col)
case '&': t << "&amp;"; col++; break;
case '\'': t << "&apos;"; col++; break;
case '"': t << "&quot;"; col++; break;
- default: t << c; col++; break;
+ default: s=writeUtf8Char(t,s-1); col++; break;
}
}
}
@@ -221,59 +223,6 @@ class TextGeneratorXMLImpl : public TextGeneratorIntf
FTextStream &m_t;
};
-/** Helper class representing a stack of objects stored by value */
-template<class T> class ValStack
-{
- public:
- ValStack() : m_values(10), m_sp(0), m_size(10) {}
- virtual ~ValStack() {}
- ValStack(const ValStack<T> &s)
- {
- m_values=s.m_values.copy();
- m_sp=s.m_sp;
- m_size=s.m_size;
- }
- ValStack &operator=(const ValStack<T> &s)
- {
- m_values=s.m_values.copy();
- m_sp=s.m_sp;
- m_size=s.m_size;
- return *this;
- }
- void push(T v)
- {
- m_sp++;
- if (m_sp>=m_size)
- {
- m_size+=10;
- m_values.resize(m_size);
- }
- m_values[m_sp]=v;
- }
- T pop()
- {
- ASSERT(m_sp!=0);
- return m_values[m_sp--];
- }
- T& top()
- {
- ASSERT(m_sp!=0);
- return m_values[m_sp];
- }
- bool isEmpty()
- {
- return m_sp==0;
- }
- uint count() const
- {
- return m_sp;
- }
-
- private:
- QArray<T> m_values;
- int m_sp;
- int m_size;
-};
/** Generator for producing XML formatted source code. */
class XMLCodeGenerator : public CodeOutputInterface
@@ -306,7 +255,7 @@ class XMLCodeGenerator : public CodeOutputInterface
m_normalHLNeedStartTag=FALSE;
}
writeXMLLink(m_t,ref,file,anchor,name,tooltip);
- col+=strlen(name);
+ col+=qstrlen(name);
}
void startCodeLine(bool)
{
@@ -401,9 +350,6 @@ class XMLCodeGenerator : public CodeOutputInterface
if (extRef) m_external=extRef;
}
}
- void linkableSymbol(int, const char *,Definition *,Definition *)
- {
- }
void setCurrentDoc(Definition *,const char *,bool)
{
}
@@ -471,10 +417,10 @@ static void writeTemplateArgumentList(ArgumentList *al,
static void writeMemberTemplateLists(MemberDef *md,FTextStream &t)
{
- LockingPtr<ArgumentList> templMd = md->templateArguments();
- if (templMd!=0) // function template prefix
+ ArgumentList *templMd = md->templateArguments();
+ if (templMd) // function template prefix
{
- writeTemplateArgumentList(templMd.pointer(),t,md->getClassDef(),md->getFileDef(),8);
+ writeTemplateArgumentList(templMd,t,md->getClassDef(),md->getFileDef(),8);
}
}
@@ -493,7 +439,7 @@ static void writeXMLDocBlock(FTextStream &t,
QCString stext = text.stripWhiteSpace();
if (stext.isEmpty()) return;
// convert the documentation string into an abstract syntax tree
- DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text+"\n",FALSE,FALSE);
+ DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text,FALSE,FALSE);
// create a code generator
XMLCodeGenerator *xmlCodeGen = new XMLCodeGenerator(t);
// create a parse tree visitor for XML
@@ -614,17 +560,19 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
switch (md->memberType())
{
case MemberType_Define: memType="define"; break;
- case MemberType_EnumValue: ASSERT(0); break;
- case MemberType_Property: memType="property"; break;
- case MemberType_Event: memType="event"; break;
+ case MemberType_Function: memType="function"; isFunc=TRUE; break;
case MemberType_Variable: memType="variable"; break;
case MemberType_Typedef: memType="typedef"; break;
case MemberType_Enumeration: memType="enum"; break;
- case MemberType_Function: memType="function"; isFunc=TRUE; break;
+ case MemberType_EnumValue: ASSERT(0); break;
case MemberType_Signal: memType="signal"; isFunc=TRUE; break;
+ case MemberType_Slot: memType="slot"; isFunc=TRUE; break;
case MemberType_Friend: memType="friend"; isFunc=TRUE; break;
case MemberType_DCOP: memType="dcop"; isFunc=TRUE; break;
- case MemberType_Slot: memType="slot"; isFunc=TRUE; break;
+ case MemberType_Property: memType="property"; break;
+ case MemberType_Event: memType="event"; break;
+ case MemberType_Interface: memType="interface"; break;
+ case MemberType_Service: memType="service"; break;
}
ti << " <member refid=\"" << memberOutputFileBase(md)
@@ -666,7 +614,7 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
if (isFunc)
{
- LockingPtr<ArgumentList> al = md->argumentList();
+ ArgumentList *al = md->argumentList();
t << " const=\"";
if (al!=0 && al->constSpecifier) t << "yes"; else t << "no";
t << "\"";
@@ -729,7 +677,47 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
{
t << " initonly=\"yes\"";
}
-
+
+ if (md->isAttribute())
+ {
+ t << " attribute=\"yes\"";
+ }
+ if (md->isUNOProperty())
+ {
+ t << " property=\"yes\"";
+ }
+ if (md->isReadonly())
+ {
+ t << " readonly=\"yes\"";
+ }
+ if (md->isBound())
+ {
+ t << " bound=\"yes\"";
+ }
+ if (md->isRemovable())
+ {
+ t << " removable=\"yes\"";
+ }
+ if (md->isConstrained())
+ {
+ t << " constrained=\"yes\"";
+ }
+ if (md->isTransient())
+ {
+ t << " transient=\"yes\"";
+ }
+ if (md->isMaybeVoid())
+ {
+ t << " maybevoid=\"yes\"";
+ }
+ if (md->isMaybeDefault())
+ {
+ t << " maybedefault=\"yes\"";
+ }
+ if (md->isMaybeAmbiguous())
+ {
+ t << " maybeambiguous=\"yes\"";
+ }
}
else if (md->memberType() == MemberType_Property)
{
@@ -817,8 +805,8 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
<< memberOutputFileBase(rmd) << "_1" << rmd->anchor() << "\">"
<< convertToXML(rmd->name()) << "</reimplements>" << endl;
}
- LockingPtr<MemberList> rbml = md->reimplementedBy();
- if (rbml!=0)
+ MemberList *rbml = md->reimplementedBy();
+ if (rbml)
{
MemberListIterator mli(*rbml);
for (mli.toFirst();(rmd=mli.current());++mli)
@@ -831,9 +819,9 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
if (isFunc) //function
{
- LockingPtr<ArgumentList> declAl = md->declArgumentList();
- LockingPtr<ArgumentList> defAl = md->argumentList();
- if (declAl!=0 && declAl->count()>0)
+ ArgumentList *declAl = md->declArgumentList();
+ ArgumentList *defAl = md->argumentList();
+ if (declAl && declAl->count()>0)
{
ArgumentListIterator declAli(*declAl);
ArgumentListIterator defAli(*defAl);
@@ -926,8 +914,8 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
if (md->memberType()==MemberType_Enumeration) // enum
{
- LockingPtr<MemberList> enumFields = md->enumFieldList();
- if (enumFields!=0)
+ MemberList *enumFields = md->enumFieldList();
+ if (enumFields)
{
MemberListIterator emli(*enumFields);
MemberDef *emd;
@@ -979,7 +967,8 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
{
t << " <location file=\""
<< md->getDefFileName() << "\" line=\""
- << md->getDefLine() << "\"";
+ << md->getDefLine() << "\"" << " column=\""
+ << md->getDefColumn() << "\"" ;
if (md->getStartBodyLine()!=-1)
{
FileDef *bodyDef = md->getBodyDef();
@@ -994,8 +983,8 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
}
//printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
- LockingPtr<MemberSDict> mdict = md->getReferencesMembers();
- if (mdict!=0)
+ MemberSDict *mdict = md->getReferencesMembers();
+ if (mdict)
{
MemberSDict::Iterator mdi(*mdict);
MemberDef *rmd;
@@ -1005,7 +994,7 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De
}
}
mdict = md->getReferencedByMembers();
- if (mdict!=0)
+ if (mdict)
{
MemberSDict::Iterator mdi(*mdict);
MemberDef *rmd;
@@ -1434,7 +1423,8 @@ static void generateXMLForClass(ClassDef *cd,FTextStream &ti)
}
t << " <location file=\""
<< cd->getDefFileName() << "\" line=\""
- << cd->getDefLine() << "\"";
+ << cd->getDefLine() << "\"" << " column=\""
+ << cd->getDefColumn() << "\"" ;
if (cd->getStartBodyLine()!=-1)
{
FileDef *bodyDef = cd->getBodyDef();
@@ -1526,9 +1516,10 @@ static void generateXMLForNamespace(NamespaceDef *nd,FTextStream &ti)
t << " <detaileddescription>" << endl;
writeXMLDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation());
t << " </detaileddescription>" << endl;
- t << " <location file=\""
- << nd->getDefFileName() << "\" line=\""
- << nd->getDefLine() << "\"/>" << endl;
+ t << " <location file=\""
+ << nd->getDefFileName() << "\" line=\""
+ << nd->getDefLine() << "\"" << " column=\""
+ << nd->getDefColumn() << "\"/>" << endl ;
t << " </compounddef>" << endl;
t << "</doxygen>" << endl;
@@ -1842,10 +1833,26 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
t << " <compoundname>" << convertToXML(pd->name())
<< "</compoundname>" << endl;
- SectionInfo *si = Doxygen::sectionDict->find(pd->name());
- if (si)
+ if (pd==Doxygen::mainPage) // main page is special
{
- t << " <title>" << convertToXML(si->title) << "</title>" << endl;
+ QCString title;
+ if (!pd->title().isEmpty() && pd->title().lower()!="notitle")
+ {
+ title = filterTitle(Doxygen::mainPage->title());
+ }
+ else
+ {
+ title = Config_getString("PROJECT_NAME");
+ }
+ t << " <title>" << convertToXML(title) << "</title>" << endl;
+ }
+ else
+ {
+ SectionInfo *si = Doxygen::sectionDict->find(pd->name());
+ if (si)
+ {
+ t << " <title>" << convertToXML(si->title) << "</title>" << endl;
+ }
}
writeInnerPages(pd->getSubPages(),t);
t << " <detaileddescription>" << endl;
@@ -1869,7 +1876,6 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
void generateXML()
{
-
// + classes
// + namespaces
// + files
@@ -1878,42 +1884,6 @@ void generateXML()
// - examples
QCString outputDirectory = Config_getString("XML_OUTPUT");
- if (outputDirectory.isEmpty())
- {
- outputDirectory=QDir::currentDirPath().utf8();
- }
- else
- {
- QDir dir(outputDirectory);
- if (!dir.exists())
- {
- dir.setPath(QDir::currentDirPath());
- if (!dir.mkdir(outputDirectory))
- {
- err("error: tag XML_OUTPUT: Output directory `%s' does not "
- "exist and cannot be created\n",outputDirectory.data());
- exit(1);
- }
- else if (!Config_getBool("QUIET"))
- {
- err("notice: Output directory `%s' does not exist. "
- "I have created it for you.\n", outputDirectory.data());
- }
- dir.cd(outputDirectory);
- }
- outputDirectory=dir.absPath().utf8();
- }
-
- QDir dir(outputDirectory);
- if (!dir.exists())
- {
- dir.setPath(QDir::currentDirPath());
- if (!dir.mkdir(outputDirectory))
- {
- err("Cannot create directory %s\n",outputDirectory.data());
- return;
- }
- }
QDir xmlDir(outputDirectory);
createSubDirs(xmlDir);
QCString fileName=outputDirectory+"/index.xsd";
@@ -1923,7 +1893,7 @@ void generateXML()
err("Cannot open file %s for writing!\n",fileName.data());
return;
}
- f.writeBlock(index_xsd,strlen(index_xsd));
+ f.writeBlock(index_xsd,qstrlen(index_xsd));
f.close();
fileName=outputDirectory+"/compound.xsd";
@@ -1933,7 +1903,7 @@ void generateXML()
err("Cannot open file %s for writing!\n",fileName.data());
return;
}
- f.writeBlock(compound_xsd,strlen(compound_xsd));
+ f.writeBlock(compound_xsd,qstrlen(compound_xsd));
f.close();
fileName=outputDirectory+"/index.xml";
diff --git a/src/xmlgen.h b/src/xmlgen.h
index 9193956..b89b10f 100644
--- a/src/xmlgen.h
+++ b/src/xmlgen.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby