From 8626ab32d671ffcdc75dffce04dd05a671cfb42c Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Fri, 8 Aug 2003 12:54:22 +0000 Subject: Release-1.3.3-20030808 --- INSTALL | 4 +- Makefile.in | 4 +- Makefile.win_make.in | 3 +- Makefile.win_nmake.in | 3 +- README | 4 +- VERSION | 2 +- configure | 2 +- doc/faq.doc | 2 +- doc/language.doc | 269 +--------- doc/starting.doc | 2 +- packages/rpm/doxygen.spec | 3 +- src/Makefile.in | 10 +- src/classdef.cpp | 6 +- src/classlist.cpp | 4 +- src/compound.xsd | 1 + src/compound_xsd.h | 1 + src/config.h | 22 +- src/config.l | 245 ++++----- src/docparser.cpp | 172 ++++++- src/docparser.h | 24 +- src/doxygen.cpp | 325 ++++++------ src/doxygen.h | 2 + src/doxysearch.cpp | 1080 --------------------------------------- src/doxysearch.pro.in | 20 - src/doxytag.l | 116 ++--- src/doxytag.pro.in | 5 +- src/entry.h | 6 +- src/filedef.cpp | 221 +++++++- src/filedef.h | 47 ++ src/ftvhelp.cpp | 121 ++--- src/ftvhelp.h | 41 +- src/groupdef.cpp | 14 +- src/htmldocvisitor.cpp | 43 +- src/htmlgen.cpp | 398 ++++++++++++--- src/htmlgen.h | 11 +- src/index.cpp | 504 +++++++++--------- src/index.h | 67 ++- src/language.cpp | 6 +- src/latexdocvisitor.cpp | 47 +- src/latexgen.cpp | 4 +- src/latexgen.h | 10 +- src/libdoxygen.pro.in | 3 +- src/libdoxygen.t | 3 + src/mandocvisitor.cpp | 1 + src/mangen.cpp | 3 +- src/mangen.h | 10 +- src/memberdef.cpp | 20 +- src/memberlist.cpp | 7 +- src/namespacedef.cpp | 6 +- src/outputgen.h | 9 +- src/outputlist.cpp | 11 +- src/outputlist.h | 24 +- src/packagedef.cpp | 126 ----- src/packagedef.h | 68 --- src/perlmodgen.cpp | 21 +- src/pre.l | 8 +- src/rtfdocvisitor.cpp | 11 +- src/rtfgen.cpp | 3 +- src/rtfgen.h | 10 +- src/scanner.l | 6 +- src/search.php | 303 +++++++++++ src/search_php.h | 303 +++++++++++ src/searchindex.cpp | 257 ++++++++++ src/searchindex.h | 50 +- src/suffixtree.cpp | 358 ------------- src/suffixtree.h | 89 ---- src/translator.h | 9 + src/translator_adapter.h | 20 +- src/translator_br.h | 2 +- src/translator_cz.h | 2 +- src/translator_en.h | 57 ++- src/translator_fr.h | 2 +- src/translator_it.h | 2 +- src/translator_kr.h | 56 ++ src/translator_nl.h | 59 ++- src/translator_pt.h | 2 +- src/translator_se.h | 1022 +++++++++++++++++++++++++++++++----- src/translator_sr.h | 2 +- src/translator_tw.h | 2 +- src/util.cpp | 64 ++- src/util.h | 2 +- src/xmldocvisitor.cpp | 7 +- src/xmlgen.cpp | 32 +- tmake/lib/macosx-c++/tmake.conf | 6 +- wintools/Doxysearch.dsp | 97 ---- wintools/Doxysearch.dsw | 33 -- 86 files changed, 3735 insertions(+), 3324 deletions(-) delete mode 100644 src/doxysearch.cpp delete mode 100644 src/doxysearch.pro.in delete mode 100644 src/packagedef.cpp delete mode 100644 src/packagedef.h create mode 100644 src/search.php create mode 100644 src/search_php.h delete mode 100644 src/suffixtree.cpp delete mode 100644 src/suffixtree.h delete mode 100644 wintools/Doxysearch.dsp delete mode 100644 wintools/Doxysearch.dsw diff --git a/INSTALL b/INSTALL index cbe7ad8..11e0f3d 100644 --- a/INSTALL +++ b/INSTALL @@ -1,7 +1,7 @@ -DOXYGEN Version 1.3.3 +DOXYGEN Version 1.3.3-20030808 Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (25 July 2003) +Dimitri van Heesch (08 August 2003) diff --git a/Makefile.in b/Makefile.in index 27a404d..7c388f5 100644 --- a/Makefile.in +++ b/Makefile.in @@ -28,11 +28,10 @@ distclean: clean -rm -f objects/*.o -rm -f src/Makefile.doxygen src/Makefile.libdoxygen -rm -f src/Makefile.doxytag src/Makefile.libdoxycfg - -rm -f src/Makefile.doxysearch qtools/Makefile.qtools -rm -f libpng/Makefile.libpng -rm -f Makefile qtools/Makefile src/Makefile examples/Makefile doc/Makefile -rm -f .makeconfig .tmakeconfig - -rm -f src/doxygen.pro src/libdoxygen.pro src/doxytag.pro src/doxysearch.pro qtools/qtools.pro src/libdoxycfg.pro libpng/libpng.pro + -rm -f src/doxygen.pro src/libdoxygen.pro src/doxytag.pro qtools/qtools.pro src/libdoxycfg.pro libpng/libpng.pro -rm -f src/version.cpp -rm -r addon/doxywizard/Makefile -rm -f addon/doxywizard/Makefile.doxywizard @@ -46,7 +45,6 @@ install: doxywizard_install $(INSTTOOL) -d $(INSTALL)/bin $(INSTTOOL) -m 755 bin/doxygen $(INSTALL)/bin $(INSTTOOL) -m 755 bin/doxytag $(INSTALL)/bin - $(INSTTOOL) -m 755 bin/doxysearch $(INSTALL)/bin install_docs: install $(INSTTOOL) -d $(DOCDIR) diff --git a/Makefile.win_make.in b/Makefile.win_make.in index 81348d4..17c93a9 100644 --- a/Makefile.win_make.in +++ b/Makefile.win_make.in @@ -14,10 +14,9 @@ distclean: clean -del src\Makefile.libdoxygen \ src\Makefile.doxygen \ src\Makefile.doxytag \ - src\Makefile.doxysearch \ src\Makefile.libdoxycfg -del Makefile src\Makefile examples\Makefile doc\Makefile - -del src\libdoxygen.pro src\doxygen.pro src\doxytag.pro src\doxysearch.pro src\libdoxycfg.pro + -del src\libdoxygen.pro src\doxygen.pro src\doxytag.pro src\libdoxycfg.pro -del src\version.cpp docs: diff --git a/Makefile.win_nmake.in b/Makefile.win_nmake.in index 9c035f8..4a2ff78 100644 --- a/Makefile.win_nmake.in +++ b/Makefile.win_nmake.in @@ -26,10 +26,9 @@ distclean: clean -del src\Makefile.libdoxygen \ src\Makefile.doxygen \ src\Makefile.doxytag \ - src\Makefile.doxysearch \ src\Makefile.libdoxycfg -del Makefile src\Makefile examples\Makefile doc\Makefile - -del src\libdoxygen.pro src\doxygen.pro src\doxytag.pro src\doxysearch.pro src\libdoxycfg.pro + -del src\libdoxygen.pro src\doxygen.pro src\doxytag.pro src\libdoxycfg.pro -del src\version.cpp docs: FORCE diff --git a/README b/README index ac7a18c..e7ad550 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -DOXYGEN Version 1.3.3 +DOXYGEN Version 1.3.3_20030808 Please read INSTALL for compilation instructions. @@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. Enjoy, -Dimitri van Heesch (dimitri@stack.nl) (25 July 2003) +Dimitri van Heesch (dimitri@stack.nl) (08 August 2003) diff --git a/VERSION b/VERSION index 31e5c84..d8d942b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.3 +1.3.3-20030808 diff --git a/configure b/configure index d14a648..687066a 100755 --- a/configure +++ b/configure @@ -460,7 +460,7 @@ EOF echo " Created $DST from $SRC..." done -f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in src/doxytag.pro.in src/doxysearch.pro.in addon/doxywizard/doxywizard.pro.in addon/doxmlparser/src/doxmlparser.pro.in addon/doxmlparser/test/xmlparse.pro.in addon/doxmlparser/examples/metrics/metrics.pro.in libpng/libpng.pro.in" +f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in src/doxytag.pro.in addon/doxywizard/doxywizard.pro.in addon/doxmlparser/src/doxmlparser.pro.in addon/doxmlparser/test/xmlparse.pro.in addon/doxmlparser/examples/metrics/metrics.pro.in libpng/libpng.pro.in" for i in $f_inprofiles ; do SRC=$i diff --git a/doc/faq.doc b/doc/faq.doc index d9f3f6d..7bfa112 100644 --- a/doc/faq.doc +++ b/doc/faq.doc @@ -136,7 +136,7 @@ Unfortunately this only works if both compressed HTML files are in the same directory. As a result you must rename the generated \c index.chm files for all projects -into something unique and put all \c .chm files in one directory. +into something unique and put all .chm files in one directory. Suppose you have a project \e a referring to a project \e b using tag file \c b.tag, then you could rename the \c index.chm for project \e a into diff --git a/doc/language.doc b/doc/language.doc index d3c9db1..97f481a 100644 --- a/doc/language.doc +++ b/doc/language.doc @@ -1,8 +1,6 @@ /****************************************************************************** - * Warning: this file was generated from the language.tpl template - * and the maintainers.txt files by the translator.pl script. - * - * Do not edit this file. Edit the above mentioned files! + * This is the template for generating language.doc. + * Edit manually this file, not the language.doc! * * * Copyright (C) 1997-2002 by Dimitri van Heesch. @@ -25,7 +23,7 @@ Doxygen has built-in support for multiple languages. This means that the text fragments that doxygen generates can be produced in languages other than English (the default) at configuration time. -Currently (version 1.3.2-20030717), 28 languages +Currently (version unknown), 28 languages are supported (sorted alphabetically): Brazilian Portuguese, Catalan, Chinese, Chinese Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, @@ -39,261 +37,7 @@ It is sorted by language alphabetically. The Status column was generated from sources and shows approximately the last version when the translator was updated. -\htmlonly - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Language Maintainer Contact address - (remove the NOSPAM.) Status
Brazilian PortugueseFabio "FJTC" Jun Takada Chinochino@NOSPAM.icmc.sc.usp.brup-to-date
CatalanAlbert Moraamora@NOSPAM.iua.upf.es1.2.17
ChineseWei Liu
Wang Weihan
liuwei@NOSPAM.asiainfo.com
wangweihan@NOSPAM.capinfo.com.cn
1.2.13
Chinese TraditionalDaniel YC Lin
Gary Lee
daniel@NOSPAM.twpda.com
garylee@NOSPAM.ecosine.com.tw
up-to-date
CroatianBoris Braloboris.bralo@NOSPAM.zg.tel.hr1.3.1
CzechPetr Přikrylprikrylp@NOSPAM.skil.czup-to-date
DanishErik Søe Sørensenerik@NOSPAM.mail.nustrange
DutchDimitri van Heeschdimitri@NOSPAM.stack.nlup-to-date
EnglishDimitri van Heeschdimitri@NOSPAM.stack.nlup-to-date
FinnishOlli KorhonenOlli.Korhonen@NOSPAM.ccc.fiobsolete
FrenchXavier Outhierxouthier@NOSPAM.yahoo.frup-to-date
GermanJens Seideljensseidel@NOSPAM.users.sf.net1.3.1
GreekHarry Kalogirouharkal@NOSPAM.rainbow.cs.unipi.gr1.2.11
HungarianFöldvári Györgyfoldvari@NOSPAM.diatronltd.com1.2.1
ItalianAlessandro Falappa
Ahmed Aldo Faisal
alessandro@NOSPAM.falappa.net
aaf23@NOSPAM.cam.ac.uk
up-to-date
JapaneseRyunosuke Satoh
Kenji Nagamatsu
sun594@NOSPAM.hotmail.com
naga@NOSPAM.joyful.club.ne.jp
obsolete
KoreanRichard Kimryk@NOSPAM.dspwiz.comstrange
NorwegianLars Erik Jordetlej@NOSPAM.circuitry.no1.2.2
PolishPiotr Kaminski
Grzegorz Kowal
Piotr.Kaminski@NOSPAM.ctm.gdynia.pl
g_kowal@NOSPAM.poczta.onet.pl
strange
PortugueseRui Godinho Lopesruiglopes@NOSPAM.yahoo.comup-to-date
RomanianAlexandru Iosupaiosup@NOSPAM.yahoo.com1.2.16
RussianAlexandr Chelpanovcav@NOSPAM.cryptopro.rustrange
SerbianDejan Milosavljevicdmilos@NOSPAM.email.comup-to-date
SlovakStanislav Kudláčskudlac@NOSPAM.pobox.sk1.2.18
SloveneMatjaz Ostroversnikmatjaz.ostroversnik@NOSPAM.zrs-tk.si1.2.16
SpanishFrancisco Oltra Thennetfoltra@NOSPAM.puc.cl1.2.7
SwedishXeT Erixonxet@NOSPAM.hem.passagen.seobsolete
UkrainianOlexij Tkatchenkoolexij.tkatchenko@NOSPAM.gmx.de1.2.11
-
-\endhtmlonly -\latexonly -\begin{tabular}{|l|l|l|l|} - \hline - {\bf Language} & {\bf Maintainer} & {\bf Contact address} & {\bf Status} \\ - \hline - \hline - Brazilian Portuguese & Fabio "FJTC" Jun Takada Chino & {\tt chino@icmc.sc.usp.br} & up-to-date \\ - \hline - Catalan & Albert Mora & {\tt amora@iua.upf.es} & 1.2.17 \\ - \hline - Chinese & Wei Liu & {\tt liuwei@asiainfo.com} & 1.2.13 \\ - & Wang Weihan & {\tt wangweihan@capinfo.com.cn} & \\ - \hline - Chinese Traditional & Daniel YC Lin & {\tt daniel@twpda.com} & up-to-date \\ - & Gary Lee & {\tt garylee@ecosine.com.tw} & \\ - \hline - Croatian & Boris Bralo & {\tt boris.bralo@zg.tel.hr} & 1.3.1 \\ - \hline - Czech & Petr P\v{r}ikryl & {\tt prikrylp@skil.cz} & up-to-date \\ - \hline - Danish & Erik S\o{}e S\o{}rensen & {\tt erik@mail.nu} & strange \\ - \hline - Dutch & Dimitri van Heesch & {\tt dimitri@stack.nl} & up-to-date \\ - \hline - English & Dimitri van Heesch & {\tt dimitri@stack.nl} & up-to-date \\ - \hline - Finnish & Olli Korhonen & {\tt Olli.Korhonen@ccc.fi} & obsolete \\ - \hline - French & Xavier Outhier & {\tt xouthier@yahoo.fr} & up-to-date \\ - \hline - German & Jens Seidel & {\tt jensseidel@users.sf.net} & 1.3.1 \\ - \hline - Greek & Harry Kalogirou & {\tt harkal@rainbow.cs.unipi.gr} & 1.2.11 \\ - \hline - Hungarian & F\"{o}ldv\'{a}ri Gy\"{o}rgy & {\tt foldvari@diatronltd.com} & 1.2.1 \\ - \hline - Italian & Alessandro Falappa & {\tt alessandro@falappa.net} & up-to-date \\ - & Ahmed Aldo Faisal & {\tt aaf23@cam.ac.uk} & \\ - \hline - Japanese & Ryunosuke Satoh & {\tt sun594@hotmail.com} & obsolete \\ - & Kenji Nagamatsu & {\tt naga@joyful.club.ne.jp} & \\ - \hline - Korean & Richard Kim & {\tt ryk@dspwiz.com} & strange \\ - \hline - Norwegian & Lars Erik Jordet & {\tt lej@circuitry.no} & 1.2.2 \\ - \hline - Polish & Piotr Kaminski & {\tt Piotr.Kaminski@ctm.gdynia.pl} & strange \\ - & Grzegorz Kowal & {\tt g\_kowal@poczta.onet.pl} & \\ - \hline - Portuguese & Rui Godinho Lopes & {\tt ruiglopes@yahoo.com} & up-to-date \\ - \hline - Romanian & Alexandru Iosup & {\tt aiosup@yahoo.com} & 1.2.16 \\ - \hline - Russian & Alexandr Chelpanov & {\tt cav@cryptopro.ru} & strange \\ - \hline - Serbian & Dejan Milosavljevic & {\tt dmilos@email.com} & up-to-date \\ - \hline - Slovak & Stanislav Kudl\'{a}\v{c} & {\tt skudlac@pobox.sk} & 1.2.18 \\ - \hline - Slovene & Matjaz Ostroversnik & {\tt matjaz.ostroversnik@zrs-tk.si} & 1.2.16 \\ - \hline - Spanish & Francisco Oltra Thennet & {\tt foltra@puc.cl} & 1.2.7 \\ - \hline - Swedish & XeT Erixon & {\tt xet@hem.passagen.se} & obsolete \\ - \hline - Ukrainian & Olexij Tkatchenko & {\tt olexij.tkatchenko@gmx.de} & 1.2.11 \\ - \hline -\end{tabular} -\endlatexonly - +$information_table Most people on the list have indicated that they were also busy doing other things, so if you want to help to speed things up please @@ -514,10 +258,9 @@ script was developed (located in \c doxygen/doc directory). It extracts the important information about obsolete and new methods from the source files for each of the languages. The information is stored in the translator report ASCII file -(doxygen/doc/translator_report.txt). \htmlonly If you compiled this documentation +($translator_report_file_name). \htmlonly If you compiled this documentation from sources and if you have also doxygen sources available the -link - doxygen/doc/translator_report.txt should be valid.\endhtmlonly +link $translator_report_link should be valid.\endhtmlonly Looking at the base class of the language translator, the script guesses also the status of the translator -- see the last column of diff --git a/doc/starting.doc b/doc/starting.doc index 0d05378..e2335e3 100644 --- a/doc/starting.doc +++ b/doc/starting.doc @@ -29,7 +29,7 @@ information. The executable \c doxysearch is only needed if you want to use the search engine. See section \ref doxysearch_usage for more detailed usage information. -Optionally, the executable \c doxywizard is a GUI front-end for editing +Optionally, the executable \c doxywizard is a graphical front-end for editing the configuration files that are used by doxygen. The following figure shows the relation between the tools and the flow diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec index 21bbd3f..034ba89 100644 --- a/packages/rpm/doxygen.spec +++ b/packages/rpm/doxygen.spec @@ -1,6 +1,6 @@ Summary: A documentation system for C/C++. Name: doxygen -Version: 1.3.3 +Version: 1.3.3_20030808 Release: 1 Epoch: 1 Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz @@ -56,7 +56,6 @@ rm -rf ${RPM_BUILD_ROOT} %defattr(-,root,root) %doc LANGUAGE.HOWTO README examples html %{_bindir}/doxygen -%{_bindir}/doxysearch %{_bindir}/doxytag %files doxywizard diff --git a/src/Makefile.in b/src/Makefile.in index 226d891..1d57871 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -14,12 +14,11 @@ # input used in their production; they are not affected by this license. # -all: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile.doxytag Makefile.doxysearch Makefile +all: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile.doxytag Makefile $(MAKE) -f Makefile.libdoxycfg PERL=$(PERL) $@ $(MAKE) -f Makefile.libdoxygen PERL=$(PERL) $@ $(MAKE) -f Makefile.doxygen PERL=$(PERL) $@ $(MAKE) -f Makefile.doxytag PERL=$(PERL) $@ - $(MAKE) -f Makefile.doxysearch PERL=$(PERL) $@ Makefile.libdoxygen: libdoxygen.pro libdoxygen.t $(ENV) $(PERL) $(TMAKE) libdoxygen.pro >Makefile.libdoxygen @@ -33,22 +32,17 @@ Makefile.doxygen: doxygen.pro Makefile.doxytag: doxytag.pro doxytag.t $(ENV) $(PERL) $(TMAKE) doxytag.pro >Makefile.doxytag -Makefile.doxysearch: doxysearch.pro - $(ENV) $(PERL) $(TMAKE) doxysearch.pro >Makefile.doxysearch - 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) doxytag.pro >Makefile.doxytag - $(ENV) $(PERL) $(TMAKE) doxysearch.pro >Makefile.doxysearch -clean: Makefile.libdoxygen Makefile.doxygen Makefile.doxytag Makefile.doxysearch +clean: Makefile.libdoxygen Makefile.doxygen Makefile.doxytag $(MAKE) -f Makefile.libdoxygen clean $(MAKE) -f Makefile.libdoxycfg clean $(MAKE) -f Makefile.doxygen clean $(MAKE) -f Makefile.doxytag clean - $(MAKE) -f Makefile.doxysearch clean distclean: clean -$(RM) scanner.cpp code.cpp config.cpp pre.cpp ce_lex.cpp \ diff --git a/src/classdef.cpp b/src/classdef.cpp index d6f5352..e20e9d6 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -791,7 +791,7 @@ void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType // repeat brief description if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) { - ol.parseDoc(briefFile(),briefLine(),name(),0,briefDescription(),FALSE); + ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE); } if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") && !documentation().isEmpty()) @@ -811,7 +811,7 @@ void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType ol.disableAllBut(OutputGenerator::RTF); ol.newParagraph(); ol.popGeneratorState(); - ol.parseDoc(docFile(),docLine(),name(),0,documentation()+"\n",FALSE); + ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE); } // write examples if (exampleFlag) @@ -860,7 +860,7 @@ void ClassDef::writeDocumentation(OutputList &ol) { if (!Config_getBool("DETAILS_AT_TOP")) { - ol.parseDoc(briefFile(),briefLine(),name(),0,briefDescription(),FALSE); + ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); ol.writeString(" \n"); ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); diff --git a/src/classlist.cpp b/src/classlist.cpp index c370196..60ac20c 100644 --- a/src/classlist.cpp +++ b/src/classlist.cpp @@ -117,8 +117,8 @@ void ClassSDict::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *f if (!cd->briefDescription().isEmpty()) { ol.startMemberDescription(); - ol.parseDoc(cd->briefFile(),cd->briefLine(),cd->name(),0, - cd->briefDescription(),FALSE); + ol.parseDoc(cd->briefFile(),cd->briefLine(),cd,0, + cd->briefDescription(),FALSE,FALSE); if ((!cd->briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) || !cd->documentation().isEmpty()) { diff --git a/src/compound.xsd b/src/compound.xsd index 9fb394a..5844f07 100644 --- a/src/compound.xsd +++ b/src/compound.xsd @@ -323,6 +323,7 @@ + diff --git a/src/compound_xsd.h b/src/compound_xsd.h index ca866bb..d84816b 100644 --- a/src/compound_xsd.h +++ b/src/compound_xsd.h @@ -323,6 +323,7 @@ " \n" " \n" " \n" +" \n" " \n" " \n" " \n" diff --git a/src/config.h b/src/config.h index 5869add..5bd4209 100644 --- a/src/config.h +++ b/src/config.h @@ -25,7 +25,8 @@ class ConfigOption O_Enum, //getString(__FILE__,__LINE__,val) #define Config_getInt(val) Config::instance()->getInt(__FILE__,__LINE__,val) @@ -479,6 +492,13 @@ class Config m_dict->insert(name,result); return result; } + /*! Adds an option that has become obsolete. */ + ConfigOption *addObsolete(const char *name) + { + ConfigObsolete *option = new ConfigObsolete(ConfigOption::O_Obsolete); + m_dict->insert(name,option); + return option; + } /*! @} */ /*! Writes a template configuration file to \a f. If \a shortIndex diff --git a/src/config.l b/src/config.l index 87b98a0..a22e4de 100644 --- a/src/config.l +++ b/src/config.l @@ -469,6 +469,12 @@ static void readIncludeFile(const char *incName) s->resize(0); BEGIN(GetString); break; + case ConfigOption::O_Obsolete: + 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; } } } @@ -502,6 +508,12 @@ static void readIncludeFile(const char *incName) 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" + "To avoid this warning please update your configuration " + "file using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data()); + BEGIN(SkipInvalid); + break; } } } @@ -1077,6 +1089,9 @@ void Config::check() filePatternList.append("*.idl"); filePatternList.append("*.odl"); filePatternList.append("*.cs"); + filePatternList.append("*.php"); + filePatternList.append("*.php3"); + filePatternList.append("*.inc"); } // add default pattern if needed @@ -1094,102 +1109,102 @@ void Config::check() //} // more checks needed if and only if the search engine is enabled. - if (Config_getBool("SEARCHENGINE")) +// if (Config_getBool("SEARCHENGINE")) +// { +// // check cgi name +// QCString &cgiName = Config_getString("CGI_NAME"); +// if (cgiName.isEmpty()) +// { +// config_err("Error: tag CGI_NAME: no cgi script name after the CGI_NAME tag.\n"); +// exit(1); +// } +// // check cgi URL +// QCString &cgiURL = Config_getString("CGI_URL"); +// if (cgiURL.isEmpty()) +// { +// config_err("Error: tag CGI_URL: no URL to cgi directory specified.\n"); +// exit(1); +// } +// else if (cgiURL.left(7)!="http://" && +// cgiURL.left(8)!="https://" && +// cgiURL.left(4)!="cgi:" +// ) +// { +// config_err("Error: tag CGI_URL: URL to cgi directory is invalid (must " +// "start with http:// or https://).\n"); +// exit(1); +// } +// // check documentation URL +// QCString &docURL = Config_getString("DOC_URL"); +// if (docURL.isEmpty()) +// { +// docURL = Config_getString("OUTPUT_DIRECTORY").copy().prepend("file://").append("html"); +// } +// else if (docURL.left(7)!="http://" && +// docURL.left(8)!="https://" && +// docURL.left(7)!="file://" +// ) +// { +// config_err("Error: tag DOC_URL: URL to documentation is invalid or " +// "not absolute.\n"); +// exit(1); +// } +// // check absolute documentation path +// QCString &docAbsPath = Config_getString("DOC_ABSPATH"); +// if (docAbsPath.isEmpty()) +// { +// docAbsPath = Config_getString("OUTPUT_DIRECTORY")+"/html"; +// } +// else if (docAbsPath[0]!='/' && docAbsPath[1]!=':') +// { +// config_err("Error: tag DOC_ABSPATH: path is not absolute!\n"); +// exit(1); +// } +// // check path to doxysearch +// QCString &binAbsPath = Config_getString("BIN_ABSPATH"); +// if (binAbsPath.isEmpty()) +// { +// config_err("Error: tag BIN_ABSPATH: no absolute path to doxysearch " +// "specified.\n"); +// exit(1); +// } +// else if (binAbsPath[0]!='/' && binAbsPath[1]!=':') +// { +// config_err("Error: tag BIN_ABSPATH: path is not absolute!\n"); +// exit(1); +// } +// +// } + // check perl path + bool found=FALSE; + QCString &perlPath = Config_getString("PERL_PATH"); + if (perlPath.isEmpty()) { - // check cgi name - QCString &cgiName = Config_getString("CGI_NAME"); - if (cgiName.isEmpty()) - { - config_err("Error: tag CGI_NAME: no cgi script name after the CGI_NAME tag.\n"); - exit(1); - } - // check cgi URL - QCString &cgiURL = Config_getString("CGI_URL"); - if (cgiURL.isEmpty()) - { - config_err("Error: tag CGI_URL: no URL to cgi directory specified.\n"); - exit(1); - } - else if (cgiURL.left(7)!="http://" && - cgiURL.left(8)!="https://" && - cgiURL.left(4)!="cgi:" - ) - { - config_err("Error: tag CGI_URL: URL to cgi directory is invalid (must " - "start with http:// or https://).\n"); - exit(1); - } - // check documentation URL - QCString &docURL = Config_getString("DOC_URL"); - if (docURL.isEmpty()) - { - docURL = Config_getString("OUTPUT_DIRECTORY").copy().prepend("file://").append("html"); - } - else if (docURL.left(7)!="http://" && - docURL.left(8)!="https://" && - docURL.left(7)!="file://" - ) - { - config_err("Error: tag DOC_URL: URL to documentation is invalid or " - "not absolute.\n"); - exit(1); - } - // check absolute documentation path - QCString &docAbsPath = Config_getString("DOC_ABSPATH"); - if (docAbsPath.isEmpty()) - { - docAbsPath = Config_getString("OUTPUT_DIRECTORY")+"/html"; - } - else if (docAbsPath[0]!='/' && docAbsPath[1]!=':') - { - config_err("Error: tag DOC_ABSPATH: path is not absolute!\n"); - exit(1); - } - // check path to doxysearch - QCString &binAbsPath = Config_getString("BIN_ABSPATH"); - if (binAbsPath.isEmpty()) - { - config_err("Error: tag BIN_ABSPATH: no absolute path to doxysearch " - "specified.\n"); - exit(1); - } - else if (binAbsPath[0]!='/' && binAbsPath[1]!=':') + QFileInfo fi; + fi.setFile("/usr/bin/perl"); + if (fi.exists()) { - config_err("Error: tag BIN_ABSPATH: path is not absolute!\n"); - exit(1); + perlPath="/usr/bin/perl"; + found=TRUE; } - - // check perl path - bool found=FALSE; - QCString &perlPath = Config_getString("PERL_PATH"); - if (perlPath.isEmpty()) + else { - QFileInfo fi; - fi.setFile("/usr/bin/perl"); - if (fi.exists()) + fi.setFile("/usr/local/bin/perl"); + if (fi.exists()) { - perlPath="/usr/bin/perl"; - found=TRUE; - } - else - { - fi.setFile("/usr/local/bin/perl"); - if (fi.exists()) - { - perlPath="/usr/local/bin/perl"; - found=TRUE; - } + perlPath="/usr/local/bin/perl"; + found=TRUE; } } - if (!found) + } + if (!found) + { + QFileInfo fi(perlPath); + if (!fi.exists()) { - QFileInfo fi(perlPath); - if (!fi.exists()) - { - config_warn("Warning: tag PERL_PATH: perl interpreter not found at default or" - "user specified (%s) location\n", - perlPath.data()); - } + config_warn("Warning: tag PERL_PATH: perl interpreter not found at default or" + "user specified (%s) location\n", + perlPath.data()); } } @@ -1742,7 +1757,7 @@ void Config::create() "and *.h) to filter out the source-files in the directories. If left \n" "blank the following patterns are tested: \n" "*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp \n" - "*.h++ *.idl *.odl *.cs\n" + "*.h++ *.idl *.odl *.cs *.php *.php3 *.inc\n" ); cb = addBool( "RECURSIVE", @@ -2611,52 +2626,12 @@ void Config::create() "used. If set to NO the values of all tags below this one will be ignored. \n", FALSE ); - cs = addString( - "CGI_NAME", - "The CGI_NAME tag should be the name of the CGI script that \n" - "starts the search engine (doxysearch) with the correct parameters. \n" - "A script with this name will be generated by doxygen. \n" - ); - cs->setDefaultValue("search.cgi"); - cs->addDependency("SEARCHENGINE"); - cs = addString( - "CGI_URL", - "The CGI_URL tag should be the absolute URL to the directory where the \n" - "cgi binaries are located. See the documentation of your http daemon for \n" - "details. \n" - ); - cs->addDependency("SEARCHENGINE"); - cs = addString( - "DOC_URL", - "The DOC_URL tag should be the absolute URL to the directory where the \n" - "documentation is located. If left blank the absolute path to the \n" - "documentation, with file:// prepended to it, will be used. \n" - ); - cs->addDependency("SEARCHENGINE"); - cs = addString( - "DOC_ABSPATH", - "The DOC_ABSPATH tag should be the absolute path to the directory where the \n" - "documentation is located. If left blank the directory on the local machine \n" - "will be used. \n" - ); - cs->setWidgetType(ConfigString::Dir); - cs->addDependency("SEARCHENGINE"); - cs = addString( - "BIN_ABSPATH", - "The BIN_ABSPATH tag must point to the directory where the doxysearch binary \n" - "is installed. \n" - ); - cs->setDefaultValue("/usr/local/bin/"); - cs->setWidgetType(ConfigString::Dir); - cs->addDependency("SEARCHENGINE"); - cl = addList( - "EXT_DOC_PATHS", - "The EXT_DOC_PATHS tag can be used to specify one or more paths to \n" - "documentation generated for other projects. This allows doxysearch to search \n" - "the documentation for these projects as well. \n" - ); - cl->setWidgetType(ConfigList::Dir); - cl->addDependency("SEARCHENGINE"); + addObsolete("CGI_NAME"); + addObsolete("CGI_URL"); + addObsolete("DOC_URL"); + addObsolete("DOC_ABSPATH"); + addObsolete("BIN_ABSPATH"); + addObsolete("EXT_DOC_PATHS"); // The IMAGE_PATTERNS tag is now officially obsolete. } diff --git a/src/docparser.cpp b/src/docparser.cpp index 1b584b3..4cbb0a7 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -38,6 +38,8 @@ #include "printdocvisitor.h" #include "message.h" #include "section.h" +#include "searchindex.h" +#include "language.h" #define DBG(x) do {} while(0) //#define DBG(x) printf x @@ -66,6 +68,8 @@ static bool g_isExample; static QCString g_exampleName; static SectionDict *g_sectionDict; +static QCString g_searchUrl; + // include file state static QString g_includeFileText; static uint g_includeFileOffset; @@ -691,7 +695,7 @@ static void handleLinkedWord(DocNode *parent,QList &children) { Definition *compound=0; MemberDef *member=0; - QString name = linkToText(g_token->name); + QString name = linkToText(g_token->name,TRUE); if (resolveRef(g_context,g_token->name,g_inSeeBlock,&compound,&member)) { if (member) // member link @@ -1088,6 +1092,11 @@ DocSymbol::SymType DocSymbol::decodeSymbol(const QString &symName,char *letter) *letter=symName.at(1); return DocSymbol::Ring; } + else if (l==8 && symName.right(6)=="slash;") + { + *letter=symName.at(1); + return DocSymbol::Slash; + } return DocSymbol::Unknown; } @@ -1103,7 +1112,7 @@ static int internalValidatingParseDoc(DocNode *parent,QList &children, doctokenizerYYinit(doc,g_fileName); // first parse any number of paragraphs - bool isFirst=FALSE; + bool isFirst=TRUE; DocPara *lastPar=0; do { @@ -1151,6 +1160,33 @@ static void readTextFileByName(const QString &file,QString &text) //--------------------------------------------------------------------------- +DocWord::DocWord(DocNode *parent,const QString &word) : + m_parent(parent), m_word(word) +{ + //printf("new word %s url=%s\n",word.data(),g_searchUrl.data()); + if (!g_searchUrl.isEmpty()) + { + Doxygen::searchIndex->addWord(word.lower()); + } +} + +//--------------------------------------------------------------------------- + +DocLinkedWord::DocLinkedWord(DocNode *parent,const QString &word, + const QString &ref,const QString &file, + const QString &anchor) : + m_parent(parent), m_word(word), m_ref(ref), + m_file(file), m_anchor(anchor) +{ + //printf("new word %s url=%s\n",word.data(),g_searchUrl.data()); + if (!g_searchUrl.isEmpty()) + { + Doxygen::searchIndex->addWord(word.lower()); + } +} + +//--------------------------------------------------------------------------- + DocAnchor::DocAnchor(DocNode *parent,const QString &id,bool newAnchor) : m_parent(parent) { @@ -1636,7 +1672,6 @@ DocRef::DocRef(DocNode *parent,const QString &target) : m_parent(parent), m_refToSection(FALSE), m_refToAnchor(FALSE) { Definition *compound = 0; - //PageInfo *pageInfo = 0; QCString anchor; ASSERT(!target.isEmpty()); SectionInfo *sec = Doxygen::sectionDict[target]; @@ -1653,14 +1688,11 @@ DocRef::DocRef(DocNode *parent,const QString &target) : } else if (resolveLink(g_context,target,TRUE,&compound,/*&pageInfo,*/anchor)) { - m_text = linkToText(target); + bool isFile = compound ? + (compound->definitionType()==Definition::TypeFile ? TRUE : FALSE) : + FALSE; + m_text = linkToText(target,isFile); m_anchor = anchor; - //if (pageInfo) // ref to page - //{ - // m_file = pageInfo->getOutputFileBase(); - // m_ref = pageInfo->getReference(); - //} - //else if (compound) // ref to compound { if (anchor.isEmpty() && /* compound link */ @@ -1681,6 +1713,7 @@ DocRef::DocRef(DocNode *parent,const QString &target) : } else // oops, bogus target { + m_text = linkToText(target,FALSE); warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unable to resolve reference to `%s' for \\ref command", target.data()); } @@ -2150,7 +2183,7 @@ int DocInternal::parse(int level) DBG(("DocInternal::parse() start\n")); // first parse any number of paragraphs - bool isFirst=FALSE; + bool isFirst=TRUE; DocPara *lastPar=0; do { @@ -2347,7 +2380,7 @@ int DocHtmlCell::parse() DBG(("DocHtmlCell::parse() start\n")); // parse one or more paragraphs - bool isFirst=FALSE; + bool isFirst=TRUE; DocPara *par=0; do { @@ -2680,7 +2713,7 @@ int DocHtmlDescData::parse() g_nodeStack.push(this); DBG(("DocHtmlDescData::parse() start\n")); - bool isFirst=FALSE; + bool isFirst=TRUE; DocPara *par=0; do { @@ -2778,7 +2811,7 @@ int DocHtmlListItem::parse() g_nodeStack.push(this); // parse one or more paragraphs - bool isFirst=FALSE; + bool isFirst=TRUE; DocPara *par=0; do { @@ -4444,7 +4477,7 @@ int DocSection::parse() } // first parse any number of paragraphs - bool isFirst=FALSE; + bool isFirst=TRUE; DocPara *lastPar=0; do { @@ -4634,7 +4667,7 @@ void DocRoot::parse() int retval=0; // first parse any number of paragraphs - bool isFirst=FALSE; + bool isFirst=TRUE; DocPara *lastPar=0; do { @@ -4703,16 +4736,103 @@ void DocRoot::parse() //-------------------------------------------------------------------------- DocNode *validatingParseDoc(const char *fileName,int startLine, - const char *context,MemberDef *md, - const char *input,bool isExample, - const char *exampleName) + Definition *ctx,MemberDef *md, + const char *input,bool indexWords, + bool isExample, const char *exampleName) { + //printf("validatingParseDoc(%s,%s)\n",ctx?ctx->name().data():"", + // md?md->name().data():""); //printf("========== validating %s at line %d\n",fileName,startLine); //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",input); g_token = new TokenInfo; - g_context = context; + if (ctx && + (ctx->definitionType()==Definition::TypeClass || + ctx->definitionType()==Definition::TypeNamespace + ) + ) + { + g_context = ctx->name(); + } + else + { + g_context = ""; + } + + if (indexWords && md && Config_getBool("SEARCHENGINE")) + { + g_searchUrl=md->getOutputFileBase()+ + Config_getString("HTML_FILE_EXTENSION")+"#"+md->anchor(); + Doxygen::searchIndex->setCurrentDoc( + theTranslator->trMember(TRUE,TRUE)+" "+md->qualifiedName(), + g_searchUrl); + } + else if (indexWords && ctx && Config_getBool("SEARCHENGINE")) + { + g_searchUrl=ctx->getOutputFileBase()+ + Config_getString("HTML_FILE_EXTENSION"); + QCString name = ctx->qualifiedName(); + if (Config_getBool("OPTIMIZE_OUTPUT_JAVA")) + { + name = substitute(name,"::","."); + } + switch (ctx->definitionType()) + { + case Definition::TypePage: + { + PageDef *pd = (PageDef *)ctx; + if (!pd->title().isEmpty()) + { + name = theTranslator->trPage(TRUE,TRUE)+" "+pd->title(); + } + else + { + name = theTranslator->trPage(TRUE,TRUE)+" "+pd->name(); + } + } + break; + case Definition::TypeClass: + { + ClassDef *cd = (ClassDef *)ctx; + name.prepend(cd->compoundTypeString()+" "); + } + break; + case Definition::TypeNamespace: + { + if (Config_getBool("OPTIMIZE_OUTPUT_JAVA")) + { + name = theTranslator->trPackage(name); + } + else + { + name.prepend(theTranslator->trNamespace(TRUE,TRUE)+" "); + } + } + break; + case Definition::TypeGroup: + { + GroupDef *gd = (GroupDef *)ctx; + if (gd->groupTitle()) + { + name = theTranslator->trGroup(TRUE,TRUE)+" "+gd->groupTitle(); + } + else + { + name.prepend(theTranslator->trGroup(TRUE,TRUE)+" "); + } + } + break; + default: + break; + } + Doxygen::searchIndex->setCurrentDoc(name,g_searchUrl); + } + else + { + g_searchUrl=""; + } + g_fileName = fileName; g_memberDef = md; g_nodeStack.clear(); @@ -4779,6 +4899,7 @@ DocNode *validatingParseText(const char *input) g_hasParamCommand = FALSE; g_paramsFound.setAutoDelete(FALSE); g_paramsFound.clear(); + g_searchUrl=""; doctokenizerYYlineno=1; doctokenizerYYinit(input,g_fileName); @@ -4808,3 +4929,14 @@ void docFindSections(const char *input, doctokenizerYYFindSections(input,d,mg,fileName); } +void initDocParser() +{ + if (Config_getBool("SEARCHENGINE")) + { + Doxygen::searchIndex = new SearchIndex; + } + else + { + Doxygen::searchIndex = 0; + } +} diff --git a/src/docparser.h b/src/docparser.h index 1554037..6b79220 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -36,24 +36,28 @@ class SectionDict; //--------------------------------------------------------------------------- +/*! Initialize the documentation parser */ +void initDocParser(); + /*! Main entry point for the documentation parser. * @param fileName File in which the documentation block is found (or the * name of the example file in case isExample is TRUE). * @param startLine Line at which the documentation block is found. - * @param context Class or namespace in which of the item to which this - * block belongs. + * @param context Class or namespace to which this block belongs. * @param md Member definition to which the documentation belongs. * Can be 0. * @param input String representation of the documentation block. + * @param indexWords Indicates whether or not words should be put in the + * search index. * @param isExample TRUE if the documentation belongs to an example. * @param exampleName Base name of the example file (0 if isExample is FALSE). * @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, - const char *context, MemberDef *md, - const char *input,bool isExample, - const char *exampleName=0); + Definition *context, MemberDef *md, + const char *input,bool indexWords, + bool isExample,const char *exampleName=0); /*! Main entry point for parsing simple text fragments. These * fragments are limited to words, whitespace and symbols. @@ -176,8 +180,7 @@ template class CompAccept class DocWord : public DocNode { public: - DocWord(DocNode *parent,const QString &word) : - m_parent(parent), m_word(word) {} + DocWord(DocNode *parent,const QString &word); QString word() const { return m_word; } Kind kind() const { return Kind_Word; } DocNode *parent() const { return m_parent; } @@ -195,9 +198,7 @@ class DocLinkedWord : public DocNode public: DocLinkedWord(DocNode *parent,const QString &word, const QString &ref,const QString &file, - const QString &anchor) : - m_parent(parent), m_word(word), m_ref(ref), - m_file(file), m_anchor(anchor) {} + const QString &anchor); QString word() const { return m_word; } Kind kind() const { return Kind_Word; } DocNode *parent() const { return m_parent; } @@ -312,7 +313,7 @@ class DocSymbol : public DocNode public: enum SymType { Unknown=0, BSlash,At,Less,Greater,Amp,Dollar,Hash,Percent, Copy, Tm, Reg, Apos, Quot, Uml, Acute, Grave, Circ, Tilde, Szlig, - Cedil, Ring, Nbsp + Cedil, Ring, Nbsp, Slash }; DocSymbol(DocNode *parent,SymType s,char letter='\0') : m_parent(parent), m_symbol(s), m_letter(letter) {} @@ -923,6 +924,7 @@ class DocPara : public CompAccept, public DocNode void markLast(bool v=TRUE) { m_isLast=v; } bool isFirst() const { return m_isFirst; } bool isLast() const { return m_isLast; } + const QList &children() const { return m_children; } int handleCommand(const QString &cmdName); int handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tagHtmlAttribs); diff --git a/src/doxygen.cpp b/src/doxygen.cpp index addf597..fbfe2e2 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -42,6 +42,7 @@ #include "pre.h" #include "tagreader.h" #include "dot.h" +#include "docparser.h" #include "outputlist.h" #include "declinfo.h" @@ -62,6 +63,7 @@ #include "bufstr.h" #include "commentcnv.h" #include "cmdmapper.h" +#include "searchindex.h" #if defined(_MSC_VER) || defined(__BORLANDC__) #define popen _popen @@ -113,6 +115,7 @@ QDict *Doxygen::xrefLists = new QDict; // dictionary of cross- bool Doxygen::parseSourcesNeeded = FALSE; double Doxygen::sysElapsedTime = 0.0; QTime Doxygen::runningTime; +SearchIndex * Doxygen::searchIndex=0; static StringList inputFiles; static StringDict excludeNameDict(1009); // sections @@ -893,6 +896,9 @@ static void resolveClassNestingRelations() Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,cd->name()); if (d==0) { + //Definition *d = buildScopeFromQualifiedName(cd->name(),cd->name().contains("::")); + //d->addInnerCompound(nd); + //nd->setOuterScope(d); warn(cd->getDefFileName(),cd->getDefLine(), "Warning: Internal inconsistency: scope for class %s not " "found!\n",cd->name().data() @@ -1497,12 +1503,13 @@ static MemberDef *addVariableToFile( { Debug::print(Debug::Variables,0, " global variable:\n" - " type=`%s' scope=`%s' name=`%s' args=`%s' prot=`%d\n", + " type=`%s' scope=`%s' name=`%s' args=`%s' prot=`%d mtype=%d\n", root->type.data(), scope.data(), name.data(), root->args.data(), - root->protection + root->protection, + mtype ); bool ambig; @@ -2200,7 +2207,8 @@ static void buildFunctionList(Entry *root) ) ) { - addMethodToClass(root,cd,rname,/*scope,*/isFriend); + Debug::print(Debug::Functions,0,"--> member of class %s!\n",rname.data(),cd->name().data()); + addMethodToClass(root,cd,rname,isFriend); } else if (root->parent && !(root->parent->section & Entry::COMPOUND_MASK) && @@ -2220,7 +2228,7 @@ static void buildFunctionList(Entry *root) //MemberDef *fmd; if ((mn=Doxygen::functionNameSDict[rname])) { - //printf("--> function %s already found!\n",rname.data()); + Debug::print(Debug::Functions,0,"--> function %s already found!\n",rname.data()); MemberNameIterator mni(*mn); MemberDef *md; for (mni.toFirst();((md=mni.current()) && !found);++mni) @@ -2294,7 +2302,7 @@ static void buildFunctionList(Entry *root) } else if (!md->documentation().isEmpty() && !root->doc.isEmpty()) { - warn(root->docFile,root->docLine,"Warning: ignoring the detailed description found here, since another one was found at line %d of file %s!",md->docLine(),md->docFile().data()); + warn(root->docFile,root->docLine,"Warning: member %s: ignoring the detailed description found here, since another one was found at line %d of file %s!",md->name().data(),md->docLine(),md->docFile().data()); } if (md->briefDescription().isEmpty() && !root->brief.isEmpty()) @@ -2303,7 +2311,7 @@ static void buildFunctionList(Entry *root) } else if (!md->briefDescription().isEmpty() && !root->brief.isEmpty()) { - warn(root->briefFile,root->briefLine,"Warning: ignoring the brief description found here, since another one was found at line %d of file %s!",md->briefLine(),md->briefFile().data()); + warn(root->briefFile,root->briefLine,"Warning: member %s: ignoring the brief description found here, since another one was found at line %d of file %s!",md->name().data(),md->briefLine(),md->briefFile().data()); } md->addSectionsToDefinition(root->anchors); @@ -2635,26 +2643,26 @@ static void transferFunctionDocumentation() //printf("transfering docs mdef->mdec (%s->%s)\n",mdef->argsString(),mdec->argsString()); mdec->setDocumentation(mdef->documentation(),mdef->docFile(),mdef->docLine()); mdec->setDocsForDefinition(mdef->isDocsForDefinition()); - ArgumentList *mdefAl = new ArgumentList; - stringToArgumentList(mdef->argsString(),mdefAl); if (mdef->argumentList()) { + ArgumentList *mdefAl = new ArgumentList; + stringToArgumentList(mdef->argsString(),mdefAl); transferArgumentDocumentation(mdef->argumentList(),mdefAl); + mdec->setArgumentList(mdefAl); } - mdec->setArgumentList(mdefAl); } else if (!mdec->documentation().isEmpty()) { //printf("transfering docs mdec->mdef (%s->%s)\n",mdec->argsString(),mdef->argsString()); mdef->setDocumentation(mdec->documentation(),mdec->docFile(),mdec->docLine()); mdef->setDocsForDefinition(mdec->isDocsForDefinition()); - ArgumentList *mdecAl = new ArgumentList; - stringToArgumentList(mdec->argsString(),mdecAl); if (mdec->argumentList()) { + ArgumentList *mdecAl = new ArgumentList; + stringToArgumentList(mdec->argsString(),mdecAl); transferArgumentDocumentation(mdec->argumentList(),mdecAl); + mdef->setDeclArgumentList(mdecAl); } - mdef->setDeclArgumentList(mdecAl); } if (mdec->getStartBodyLine()!=-1 && mdef->getStartBodyLine()==-1) { @@ -6250,20 +6258,12 @@ static void generatePageDocs() outputList->endSection(si->label,si->type); } outputList->startTextBlock(); - QCString scName; - if (pd->getOuterScope() && - (pd->getOuterScope()->definitionType()==Definition::TypeClass || - pd->getOuterScope()->definitionType()==Definition::TypeNamespace - ) - ) - { - scName=pd->getOuterScope()->name(); - } outputList->parseDoc(pd->docFile(), pd->docLine(), - scName,0, + pd->getOuterScope(),0, pd->documentation(), - FALSE + TRUE, // index words + FALSE // not an example /*,pd->sectionDict*/); outputList->endTextBlock(); endFile(*outputList); @@ -6352,10 +6352,11 @@ static void generateExampleDocs() endTitle(*outputList,n,0); outputList->parseDoc(pd->docFile(), // file pd->docLine(), // startLine - pd->getOuterScope()?pd->getOuterScope()->name().data():0, // context + pd->getOuterScope(), // context 0, // memberDef pd->documentation()+"\n\\include "+pd->name(), // docs - TRUE, // is example + TRUE, // index words + TRUE, // is example pd->name() ); endFile(*outputList); @@ -6458,116 +6459,116 @@ static QCString fixSlashes(QCString &s) //---------------------------------------------------------------------------- // generate files for the search engine -static void generateSearchIndex() -{ - if (Config_getBool("SEARCHENGINE") && Config_getBool("GENERATE_HTML")) - { - // create search index - QCString fileName; - writeSearchButton(Config_getString("HTML_OUTPUT")); - -#if !defined(_WIN32) - // create cgi script - fileName = Config_getString("HTML_OUTPUT")+"/"+Config_getString("CGI_NAME"); - QFile f(fileName); - if (f.open(IO_WriteOnly)) - { - QTextStream t(&f); - t << "#!/bin/sh" << endl - << "DOXYSEARCH=" << Config_getString("BIN_ABSPATH") << "/doxysearch" << endl - << "DOXYPATH=\"" << Config_getString("DOC_ABSPATH") << " "; - - QStrList &extDocPaths=Config_getList("EXT_DOC_PATHS"); - char *s= extDocPaths.first(); - while (s) - { - t << s << " "; - s=extDocPaths.next(); - } - - t << "\"" << endl - << "if [ -f $DOXYSEARCH ]" << endl - << "then" << endl - << " $DOXYSEARCH $DOXYPATH" << endl - << "else" << endl - << " echo \"Content-Type: text/html\"" << endl - << " echo \"\"" << endl - << " echo \"

Error: $DOXYSEARCH not found. Check cgi script!

\"" << endl - << "fi" << endl; - - f.close(); - struct stat stat_struct; - stat(fileName,&stat_struct); - chmod(fileName,stat_struct.st_mode|S_IXUSR|S_IXGRP|S_IXOTH); - } - else - { - err("Error: Cannot open file %s for writing\n",fileName.data()); - } -#else /* Windows platform */ - // create cgi program - fileName = Config_getString("CGI_NAME").copy(); - if (fileName.right(4)==".cgi") - fileName=fileName.left(fileName.length()-4); - fileName+=".c"; - fileName.prepend(Config_getString("HTML_OUTPUT")+"/"); - QFile f(fileName); - if (f.open(IO_WriteOnly)) - { - QTextStream t(&f); - t << "#include " << endl; - t << "#include " << endl; - t << "#include " << endl; - t << endl; - t << "const char *DOXYSEARCH = \"" << - fixSlashes(Config_getString("BIN_ABSPATH")) << "\\\\doxysearch.exe\";" << endl; - t << "const char *DOXYPATH = \"" << - fixSlashes(Config_getString("DOC_ABSPATH")) << "\";" << endl; - t << endl; - t << "int main(void)" << endl; - t << "{" << endl; - t << " char buf[1024];" << endl; - t << " sprintf(buf,\"%s %s\",DOXYSEARCH,DOXYPATH);" << endl; - t << " if (system(buf))" << endl; - t << " {" << endl; - t << " printf(\"Content-Type: text/html\\n\\n\");" << endl; - t << " printf(\"

Error: failed to execute %s

\\n\",DOXYSEARCH);" << endl; - t << " exit(1);" << endl; - t << " }" << endl; - t << " return 0;" << endl; - t << "}" << endl; - f.close(); - } - else - { - err("Error: Cannot open file %s for writing\n",fileName.data()); - } -#endif /* !defined(_WIN32) */ - - // create config file - fileName = Config_getString("HTML_OUTPUT")+"/search.cfg"; - f.setName(fileName); - if (f.open(IO_WriteOnly)) - { - QTextStream t(&f); - t << Config_getString("DOC_URL") << "/" << endl - << Config_getString("CGI_URL") << "/" << Config_getString("CGI_NAME") << endl; - f.close(); - } - else - { - err("Error: Cannot open file %s for writing\n",fileName.data()); - } - //outputList->generateExternalIndex(); - outputList->pushGeneratorState(); - outputList->disableAllBut(OutputGenerator::Html); - startFile(*outputList,"header"+Doxygen::htmlFileExtension,0,"Search Engine",TRUE); - outputList->endPlainFile(); - outputList->startPlainFile("footer"+Doxygen::htmlFileExtension); - endFile(*outputList,TRUE); - outputList->popGeneratorState(); - } -} +//static void generateSearchIndex() +//{ +// if (Config_getBool("SEARCHENGINE") && Config_getBool("GENERATE_HTML")) +// { +// // create search index +// QCString fileName; +// writeSearchButton(Config_getString("HTML_OUTPUT")); +// +//#if !defined(_WIN32) +// // create cgi script +// fileName = Config_getString("HTML_OUTPUT")+"/"+Config_getString("CGI_NAME"); +// QFile f(fileName); +// if (f.open(IO_WriteOnly)) +// { +// QTextStream t(&f); +// t << "#!/bin/sh" << endl +// << "DOXYSEARCH=" << Config_getString("BIN_ABSPATH") << "/doxysearch" << endl +// << "DOXYPATH=\"" << Config_getString("DOC_ABSPATH") << " "; +// +// QStrList &extDocPaths=Config_getList("EXT_DOC_PATHS"); +// char *s= extDocPaths.first(); +// while (s) +// { +// t << s << " "; +// s=extDocPaths.next(); +// } +// +// t << "\"" << endl +// << "if [ -f $DOXYSEARCH ]" << endl +// << "then" << endl +// << " $DOXYSEARCH $DOXYPATH" << endl +// << "else" << endl +// << " echo \"Content-Type: text/html\"" << endl +// << " echo \"\"" << endl +// << " echo \"

Error: $DOXYSEARCH not found. Check cgi script!

\"" << endl +// << "fi" << endl; +// +// f.close(); +// struct stat stat_struct; +// stat(fileName,&stat_struct); +// chmod(fileName,stat_struct.st_mode|S_IXUSR|S_IXGRP|S_IXOTH); +// } +// else +// { +// err("Error: Cannot open file %s for writing\n",fileName.data()); +// } +//#else /* Windows platform */ +// // create cgi program +// fileName = Config_getString("CGI_NAME").copy(); +// if (fileName.right(4)==".cgi") +// fileName=fileName.left(fileName.length()-4); +// fileName+=".c"; +// fileName.prepend(Config_getString("HTML_OUTPUT")+"/"); +// QFile f(fileName); +// if (f.open(IO_WriteOnly)) +// { +// QTextStream t(&f); +// t << "#include " << endl; +// t << "#include " << endl; +// t << "#include " << endl; +// t << endl; +// t << "const char *DOXYSEARCH = \"" << +// fixSlashes(Config_getString("BIN_ABSPATH")) << "\\\\doxysearch.exe\";" << endl; +// t << "const char *DOXYPATH = \"" << +// fixSlashes(Config_getString("DOC_ABSPATH")) << "\";" << endl; +// t << endl; +// t << "int main(void)" << endl; +// t << "{" << endl; +// t << " char buf[1024];" << endl; +// t << " sprintf(buf,\"%s %s\",DOXYSEARCH,DOXYPATH);" << endl; +// t << " if (system(buf))" << endl; +// t << " {" << endl; +// t << " printf(\"Content-Type: text/html\\n\\n\");" << endl; +// t << " printf(\"

Error: failed to execute %s

\\n\",DOXYSEARCH);" << endl; +// t << " exit(1);" << endl; +// t << " }" << endl; +// t << " return 0;" << endl; +// t << "}" << endl; +// f.close(); +// } +// else +// { +// err("Error: Cannot open file %s for writing\n",fileName.data()); +// } +//#endif /* !defined(_WIN32) */ +// +// // create config file +// fileName = Config_getString("HTML_OUTPUT")+"/search.cfg"; +// f.setName(fileName); +// if (f.open(IO_WriteOnly)) +// { +// QTextStream t(&f); +// t << Config_getString("DOC_URL") << "/" << endl +// << Config_getString("CGI_URL") << "/" << Config_getString("CGI_NAME") << endl; +// f.close(); +// } +// else +// { +// err("Error: Cannot open file %s for writing\n",fileName.data()); +// } +// //outputList->generateExternalIndex(); +// outputList->pushGeneratorState(); +// outputList->disableAllBut(OutputGenerator::Html); +// startFile(*outputList,"header"+Doxygen::htmlFileExtension,0,"Search Engine",TRUE); +// outputList->endPlainFile(); +// outputList->startPlainFile("footer"+Doxygen::htmlFileExtension); +// endFile(*outputList,TRUE); +// outputList->popGeneratorState(); +// } +//} //---------------------------------------------------------------------------- @@ -7534,14 +7535,14 @@ void parseInput() Doxygen::imageNameDict = new FileNameDict(257); Doxygen::dotFileNameDict = new FileNameDict(257); - if (!Config_getString("DOC_URL").isEmpty()) - { - Doxygen::tagDestinationDict.insert("_doc",new QCString(Config_getString("DOC_URL"))); - } - if (!Config_getString("CGI_URL").isEmpty()) - { - Doxygen::tagDestinationDict.insert("_cgi",new QCString(Config_getString("CGI_URL")+"/"+Config_getString("CGI_NAME"))); - } + //if (!Config_getString("DOC_URL").isEmpty()) + //{ + // Doxygen::tagDestinationDict.insert("_doc",new QCString(Config_getString("DOC_URL"))); + //} + //if (!Config_getString("CGI_URL").isEmpty()) + //{ + // Doxygen::tagDestinationDict.insert("_cgi",new QCString(Config_getString("CGI_URL")+"/"+Config_getString("CGI_NAME"))); + //} /************************************************************************** * Initialize some global constants @@ -8025,6 +8026,32 @@ void generateOutput() * Initialize output generators * **************************************************************************/ + initDocParser(); + + //{ + // QCString fileName = Config_getString("HTML_OUTPUT")+"/filetree.html"; + // QFile f(fileName); + // if (f.open(IO_WriteOnly)) + // { + // QTextStream t(&f); + // t << "\n"; + // t << " \n"; + // t << " \n"; + // t << " \n"; + // t << " \n"; + // generateFileTree(t); + // t << " \n"; + // t << "\n"; + // } + //} outputList = new OutputList(TRUE); if (Config_getBool("GENERATE_HTML")) @@ -8144,8 +8171,8 @@ void generateOutput() writeGraphInfo(*outputList); } - msg("Generating search index...\n"); - generateSearchIndex(); + //msg("Generating search index...\n"); + //generateSearchIndex(); msg("Generating style sheet...\n"); //printf("writing style info\n"); @@ -8237,7 +8264,12 @@ void generateOutput() } QDir::setCurrent(oldDir); } - cleanUpDoxygen(); + if (Config_getBool("SEARCHENGINE")) + { + msg("Generating search index\n"); + HtmlGenerator::writeSearchPage(); + Doxygen::searchIndex->write(Config_getString("HTML_OUTPUT")+"/search.idx"); + } if (Debug::isFlagSet(Debug::Time)) { msg("Total elapsed time: %.3f seconds\n(of which %.3f seconds waiting for external tools to finish)\n", @@ -8245,5 +8277,6 @@ void generateOutput() Doxygen::sysElapsedTime ); } + cleanUpDoxygen(); } diff --git a/src/doxygen.h b/src/doxygen.h index a24a4b6..9cca76d 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -39,6 +39,7 @@ class PageSList; class PageSDict; class PageDef; +class SearchIndex; typedef QList StringList; typedef QDict FileDict; @@ -97,6 +98,7 @@ class Doxygen static bool parseSourcesNeeded; static double sysElapsedTime; static QTime runningTime; + static SearchIndex *searchIndex; }; void initDoxygen(); diff --git a/src/doxysearch.cpp b/src/doxysearch.cpp deleted file mode 100644 index ebdf223..0000000 --- a/src/doxysearch.cpp +++ /dev/null @@ -1,1080 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2003 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. - * - */ - -// includes - -#ifdef _WIN32 -#include // for AllocConsole -#endif - - -#include -#include -#include -#include -#include -#include -#ifdef PROFILING -#include -#include -#endif - -// defines - -#ifndef bool -#define bool int -#endif - -#define MAXSTRLEN 1024 -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - -#define NORMAL 1 // OR search results -#define INCLUDE 2 // AND search results -#define EXCLUDE 3 // AND NOT search results - -#define TERMMASK (1<<31) -#define OFFSETMASK (~TERMMASK) - -// structs - -//---------------------------------------------------------------------------- - -struct FileInfo -{ - FileInfo() { name[0]='\0'; f=0; url=0; } - ~FileInfo() { if (f) fclose(f); - delete[] url; - } - FILE *f; - char name[MAXSTRLEN]; - int index; - int refOffset; - char *url; - FileInfo *next; -}; - -//---------------------------------------------------------------------------- - -struct FileList -{ - FileList() { first=0; last=0; index=0; } - ~FileList() { FileInfo *fi=first; - while (fi) { FileInfo *ofi=fi; fi=fi->next; delete ofi; } - } - FileInfo *add() - { - FileInfo *nf=new FileInfo; - nf->next=0; - nf->index=index++; - if (last) { last->next=nf; last=nf; } else { first=nf; last=nf; } - return nf; - } - FileInfo *first; - FileInfo *last; - int index; -}; - -//---------------------------------------------------------------------------- - -struct WordInfo -{ - WordInfo() { word=0; } - ~WordInfo() { delete[] word; } - char *word; - int freq; - WordInfo *next; -}; - -//---------------------------------------------------------------------------- - -struct WordList -{ - WordList() { first=0; last=0; } - ~WordList() { WordInfo *wi=first; - while (wi) { WordInfo *owi=wi; wi=wi->next; delete owi; } - } - void add(const char *word,int freq) - { - WordInfo *nw=new WordInfo; - nw->word = new char[strlen(word)+1]; - strcpy(nw->word,word); - nw->freq=freq; - nw->next=0; - if (last) { last->next=nw; last=nw; } else { first=nw; last=nw; } - } - WordInfo *first; - WordInfo *last; -}; - -//---------------------------------------------------------------------------- - -struct SearchDoc -{ - FileInfo *fileInfo; - int index; - int freq; - double rank; - SearchDoc *next; -}; - -//---------------------------------------------------------------------------- - -struct SearchResults -{ - SearchResults() { totalFreq=0; docList=0; last=0; } - ~SearchResults() { SearchDoc *d=docList; - while (d) { SearchDoc *od=d; d=d->next; delete od; } - } - void add(FileInfo *fi,int index,int freq) - { - SearchDoc *nd=new SearchDoc; - nd->fileInfo=fi; - nd->index=index; - nd->freq=freq; - nd->next=0; - if (last) { last->next=nd; last=nd; } else { docList=nd; last=nd; } - } - SearchDoc *docList; - SearchDoc *last; - int totalFreq; -}; - -//---------------------------------------------------------------------------- - -// global vars - -static WordList wordList; -static FileList fileList; -static char cgiBin[MAXSTRLEN]; -static char queryInput[MAXSTRLEN]; -static char encQueryInput[MAXSTRLEN]; -static char firstDocUrl[MAXSTRLEN]; -static bool nameOnly; -static bool wordOnly; -static bool helpOnly; -static int page; -static char *headerBuf=0; -static char *footerBuf=0; - -//---------------------------------------------------------------------------- - -// functions - -void printHeader() -{ - if (headerBuf) - { - printf("Content-Type: text/html\r\n\r\n%s",headerBuf); - } - else - { - printf("Content-Type: text/html\r\n\r\n"); - printf("Search the documentation\n" - "\n"); - } -} - -//---------------------------------------------------------------------------- - -void printFooter() -{ - if (footerBuf) - { - printf("%s",footerBuf); - } - else - { - printf("\n"); - } -} - -//---------------------------------------------------------------------------- - -void message(const char *fmt,...) -{ - printHeader(); - printf("

"); - va_list args; - va_start(args, fmt); - vfprintf(stdout, fmt, args); - va_end(args); - printf("

"); - printFooter(); -} - -//---------------------------------------------------------------------------- - -void printSearchPage(bool open=FALSE) -{ - printf("
\n" - "
\n" - "\n" - "\n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n", - cgiBin, - (wordOnly?"":"selected"),(wordOnly?"selected":""), - (nameOnly?"":"selected"),(nameOnly?"selected":""), - cgiBin,queryInput,firstDocUrl); - if (!open) - { - printf("
" - " Search for\n" - " \n" - " in function and class\n" - " \n" - " \n" - " Help\n" - "
\n" - " \n" - "
\n
\n"); - } -} - -//---------------------------------------------------------------------------- - -int readInt(FILE *f) -{ - unsigned char c_24 = fgetc(f); - unsigned char c_16 = fgetc(f); - unsigned char c_08 = fgetc(f); - unsigned char c_00 = fgetc(f); - return ((unsigned int)c_24<<24)+ - ((unsigned int)c_16<<16)+ - ((unsigned int)c_08<<8)+ - c_00; - //return (fgetc(f)<<24)+(fgetc(f)<<16)+(fgetc(f)<<8)+fgetc(f); -} - -//---------------------------------------------------------------------------- - -int readEncodedNumber(FILE *f) -{ - int n=0,b,s=0; - do { b=fgetc(f); n|=(b&0x7f)<f,entry,MAXSTRLEN); - while (entry[0]!='\0') - { - //printf("Found entry `%s'\n",entry); - int i=0, w=word[0], e=entry[0]; - while (w!=0 && e!=0 && w==e) { i++; w=word[i]; e=entry[i]; } - if (w==0 && e!=0) // word is a substring of entry - { - if (wordOnly) return FALSE; // no full word match - //printf("Word found as substring of `%s%s'\n",&word[-index],&entry[i]); - int offset=readInt(fi->f); // <= follow for extensions - if (!(offset&TERMMASK)) // extra info available - { - int tfreq=readEncodedNumber(fi->f); - sr->totalFreq+=tfreq; - //printf("Total frequency %d\n",tfreq); - int s=-1,k; - while ((k=readEncodedNumber(fi->f))!=0) - { - bool inName = (k&2)==2; - s+=(k>>3); - int freq=readEncodedNumber(fi->f); - //printf("Doc index %d frequency %d\n",s,freq); - if (!nameOnly || inName) - //addResult(fi,sr,s,freq); - sr->add(fi,s,freq); - } - } - return TRUE; - } - else if (e==0) // entry is a substring of word - { - if (w==0) // word is equal to entry => exact match found - { - int offset=readInt(fi->f); // <= follow for extensions - if (!(offset&TERMMASK)) // extra info available - { - //printf("Match found\n"); - int tfreq=readEncodedNumber(fi->f); - sr->totalFreq+=tfreq; - //printf("Total frequency %d\n",tfreq); - int s=-1,k; - while ((k=readEncodedNumber(fi->f))!=0) - { - bool fullWord = (k&1)==1; - bool inName = (k&2)==2; - bool wordInName = (k&4)==4; - s+=(k>>3); - int freq=readEncodedNumber(fi->f); - if (nameOnly && wordOnly) - { - if (wordInName) sr->add(fi,s,freq); - } - else if (!nameOnly && wordOnly) - { - if (fullWord) sr->add(fi,s,freq); - } - else if (nameOnly && !wordOnly) - { - if (inName) sr->add(fi,s,freq); - } - else // !nameOnly && !wordOnly - { - sr->add(fi,s,freq); - } - } - } - return TRUE; - } - else // follow branch to next entry - { - int offset=readInt(fi->f); - if ((offset&OFFSETMASK)==0) // no next entry (leaf node) - { - return FALSE; - } - else // follow branch - { - fseek(fi->f,offset&OFFSETMASK,SEEK_SET); - //printf("Recursive call; jump to %lx\n",ftell(f)); - return searchRecursive(sr,fi,&word[i]); - } - } - } - else // skip rest of the entry - { - int offset=readInt(fi->f); - if (!(offset&TERMMASK)) while (readEncodedNumber(fi->f)!=0); - } - readString(fi->f,entry,MAXSTRLEN); - } - //printf("Sorry no match found\n"); - return FALSE; -} - -//---------------------------------------------------------------------------- - - -void searchIndex(const char *word,SearchResults *results) -{ - FileInfo *fi=fileList.first; - while (fi) - { - fi->f = fopen(fi->name, "rb"); - fseek(fi->f,8,SEEK_SET); - searchRecursive(results,fi,word); - fclose(fi->f); - fi->f=0; - fi=fi->next; - } - - SearchDoc *ds = results->docList; - while (ds) - { - ds->rank = ds->freq/(double)results->totalFreq; - ds = ds->next; - } - - wordList.add(word,results->totalFreq); -} - -//---------------------------------------------------------------------------- - -extern "C" int sortResults(const void *a1,const void *a2) -{ - SearchDoc **d1=(SearchDoc **)a1; - SearchDoc **d2=(SearchDoc **)a2; - if ((*d1)->rank > (*d2)->rank) - return -1; - else if ((*d1)->rank == (*d2)->rank) - return 0; - else - return 1; -} - -//---------------------------------------------------------------------------- - -void generateResults(SearchResults *sr) -{ - // compute the maximum rank - SearchDoc *ds = sr->docList; - double maxRank = 0.00000001; - int resultCount=0; - if (ds) - { - while (ds) - { - if (ds->rank>maxRank) maxRank = ds->rank; - ds = ds->next; - } - - // scale ranks, so the highest is 1 and count the number of links - double oneOverMaxRank = 1.0/maxRank; - ds = sr->docList; - while (ds) - { - ds->rank *= oneOverMaxRank; - resultCount++; - ds = ds->next; - } - } - SearchDoc **docPtrArray=0; - if (resultCount>0) - { - docPtrArray=(SearchDoc **)calloc(resultCount,sizeof(SearchDoc *)); - int offset=0; - ds = sr->docList; - while (ds) - { - docPtrArray[offset++]=ds; - ds = ds->next; - } - qsort(docPtrArray,resultCount,sizeof(SearchDoc *),sortResults); - } - - // start generating output - printHeader(); - printSearchPage(TRUE); - - printf(" \n" - " " - "

Search results

\n" - " \n" - " \n"); - if (resultCount==0) // nothing found - { - printf(" \n" - " Sorry, no documents matching your query.\n" - " \n" - " \n"); - } - else // something found - { - printf(" \n" - " " - "Found %d document%s matching your query. ", - resultCount,resultCount==1?"":"s"); - - if (resultCount>1) - printf("Showing best matches first.\n"); - - printf("

\n"); - printf(" \n" - " \n"); - - const int lpp=20; - int numPages = (resultCount+lpp-1)/lpp; - - // clip page - if (page<0) page=0; - if (page>=numPages) page=numPages-1; - int skipEntries = page * lpp; - int pageEntries = lpp; - - printf(" " - "
Page %d / %d" - "
\n",page+1,numPages); - printf(" \n" - " \n" - " \n"); - int i; - for (i=0 ; i < resultCount && pageEntries > 0; i++) - { - if (skipEntries == 0) - { - SearchDoc *d=docPtrArray[i]; - if (d->fileInfo->f == 0) - { - d->fileInfo->f = fopen(d->fileInfo->name, "rb"); - } - FILE *f=d->fileInfo->f; - fseek(f,d->fileInfo->refOffset+d->index*4,SEEK_SET); - int offset=readInt(f); - fseek(f,offset,SEEK_SET); - char linkName[MAXSTRLEN]; - char htmlName[MAXSTRLEN]; - readString(f,linkName,MAXSTRLEN); - readString(f,htmlName,MAXSTRLEN); - int rank=(int)(d->rank*100+0.5); - if (rank==0) rank++; - printf(" \n", - rank*2+55, 255-rank*2, rank, - d->fileInfo->url, htmlName, linkName); - pageEntries--; - if (d->fileInfo->f != 0) - { - fclose(d->fileInfo->f); - d->fileInfo->f = 0; - } - } - else - { - skipEntries--; - } - } - printf("
%d" - "%s
\n" - " \n" - " \n" - "
 "); - - if (page>0) - { - printf("" - "prev ", - cgiBin, page-1, - wordOnly?"word":"doc", - nameOnly?"name":"string", - encQueryInput); - } - int startPage = page-5 < 0 ? 0 : page-5; - int endPage = page+6 > numPages ? numPages : page+5; - if (endPage-startPage>1) - { - for (i=startPage;i" - "%d ", - cgiBin, i, - wordOnly?"word":"doc", - nameOnly?"name":"string", - encQueryInput, i+1); - } - else - { - printf("%d ",i+1); - } - } - } - if (page" - "next", - cgiBin, page+1, - wordOnly?"word":"doc", - nameOnly?"name":"string", - encQueryInput); - } - printf("  
\n" - " \n" - "

\n" - " Occurrence count: "); - WordInfo *wi=wordList.first; - while (wi) - { - printf("%s ",wi->word); - if (wi->freq>0) printf("(%d)",wi->freq); else printf("(ignored)"); - wi=wi->next; - if (wi) - { - if (wi->next) printf(", "); else printf(" and "); - } - } - printf("\n" - " \n" - " \n"); - } - printf("\n\n\n"); - printFooter(); - free(docPtrArray); -} - -//---------------------------------------------------------------------------- - -void generateHelpPage() -{ - printHeader(); - printf("

Doxysearch help page

\n" - "Basic search instructions\n" - "
    \n" - "Just type in one or more words or fragments of words and press the " - "search button. Doxysearch will return a list of functions and class names, " - "whose documentation or name matches one or more of the words. " - "Documents containing more matches will appear earlier in the list. " - "\n" - "
\n" - "Search modes\n" - "
    \n" - "Doxysearch has four search modes. From least restrictive to most " - "restrictive they are:\n" - "

      \n" - "

    • Search for strings in the documentation:\n" - " The words you type will be searched in the documentation as substrings." - " Typing the word "the" for example, will find " - " documents containing the words "the", " - " "there", and "feather".

      \n" - "

    • Search for words in the documentation:\n" - " The words you type will be searched in the documentation as words." - " Typing the word "the" for example, will look " - " for documents containing the word "the" and not for" - " documents containing the word "there".

      \n" - "

    • Search for strings in the function and class names:\n" - " The words you type will be searched in the function and class names " - " as substrings. Typing the word "set" for example, will " - " result in a list of links to the documentation of all functions and classes " - " that contain the word "set" in the name, such as the function " - " setCursor.

      \n" - "

    • Search for words in the function and class names:\n" - " The words you type will be matched against the function and class names." - " The result will be a list of links to the documentation of all function " - " and class names that are equal to one of the words.\n" - "
    \n" - "
\n" - "Requiring/Excluding words\n" - "
    \n" - " Often you will know a word that will be guaranteed to appear in a document " - " for which you are searching. If this is the case, require that the word appears " - " in all of the results by attaching a "+" to the beginning of " - " the word. You can quickly reject results by adding a word that appears only " - " in unwanted documents with a "-" before it." - "
\n" - ); - - printFooter(); -} - -//---------------------------------------------------------------------------- - -void mergeSearchResults(SearchResults *totalResults, - SearchResults *sr,int mode) -{ - SearchDoc *otd = 0, - *td = totalResults->docList, - *d = sr->docList; - totalResults->totalFreq += sr->totalFreq; - if (!d) return; // nothing to add - while (td && d) - { - int otdih = otd ? otd->fileInfo->index : -1, - otdil = otd ? otd->index : -1, - tdih = td->fileInfo->index, - tdil = td->index, - dih = d->fileInfo->index, - dil = d->index; - if (tdih==dih && tdil==dil) // combine results - { - if (mode != EXCLUDE) - { - td->rank += d->rank; - td->rank *= 2; // put extra emphasis on multiple word matches - td->freq += d->freq; - d = d->next; - otd = td; td = td->next; - } - else // mode == EXCLUDE => remove entry from results - { - SearchDoc *tmp=td; - td=td->next; - if (otd) otd->next=td; else totalResults->docList = td; - delete tmp; - } - } - else if ((otdihdih || (tdih==dih && tdil>dil))) // insert - { - if (mode == NORMAL) - { - SearchDoc *nd = new SearchDoc(*d); - if (otd) otd->next = nd; else totalResults->docList = nd; - nd->next = td; - td = nd; - } - d = d->next; - } - else if (tdihnext; - if (otd) otd->next=td; else totalResults->docList = td; - delete tmp; - } - else // mode == EXCLUDE or mode == NORMAL - { - otd = td; td = td->next; - } - } - } - if (td==0 && d && mode==NORMAL) // append rest of sr to totalResults - { - while (d) - { - SearchDoc *nd = new SearchDoc(*d); - if (otd) otd->next = nd; else totalResults->docList = nd; - nd->next = 0; - d = d->next; - otd = nd; - } - } - if (td && d==0 && mode==INCLUDE) // delete the rest of the results - { - while (td) - { - SearchDoc *tmp=td; - td=td->next; - if (otd) otd->next = td; else totalResults->docList = td; - delete tmp; - } - } -} - -//---------------------------------------------------------------------------- - -int asciiToHex(char c) -{ - char l=tolower(c); - if (l>='0' && l<='9') - return l-'0'; - else if (l>='a' && l<='f') - return l+10-'a'; - else // invalid hex char - return 0; -} - -//---------------------------------------------------------------------------- - -void fileToBuf(const char *name, char **buf) -{ - FILE *f; - struct stat file_stats; - if ((f=fopen(name,"rb"))==NULL) return; - if (stat(name,&file_stats)==-1) - { - message("Error: could not fstat file %s\n",name); - exit(1); - } - unsigned int len=file_stats.st_size; - if ((*buf=(char *)malloc(len+1))==NULL) - { - message("Error: out of memory\n"); - exit(1); - } - if (fread(*buf,1,len,f)!=len) - { - message("Error: could not read file %s\n",name); - exit(1); - } - (*buf)[len]='\0'; - fclose(f); -} - -//---------------------------------------------------------------------------- - -void getConfig(const char *s) -{ - int l; - char configFile[MAXSTRLEN]; - strcpy(configFile,s); -#if defined(_WIN32) - strcat(configFile,"\\search.cfg"); -#else - strcat(configFile,"/search.cfg"); -#endif - - FILE *f; - if ((f=fopen(configFile,"r"))==NULL) - { - message("Error: could not open config file %s\n",configFile); - exit(1); - } - - // get the URL to the documentation - fgets(firstDocUrl,MAXSTRLEN,f); - l=strlen(firstDocUrl)-1; - if (firstDocUrl[l]=='\n') firstDocUrl[l]='\0'; - l=strlen(firstDocUrl); - if (firstDocUrl[l]=='/') firstDocUrl[l]='\0'; - - // get the URL to the cgi script - fgets(cgiBin,MAXSTRLEN,f); - l=strlen(cgiBin)-1; - if (cgiBin[l]=='\n') cgiBin[l]='\0'; - - fclose(f); - - char headerFile[MAXSTRLEN]; - strcpy(headerFile,s); -#if defined(_WIN32) - strcat(headerFile,"\\header.html"); -#else - strcat(headerFile,"/header.html"); -#endif - fileToBuf(headerFile,&headerBuf); - - char footerFile[MAXSTRLEN]; - strcpy(footerFile,s); -#if defined(_WIN32) - strcat(footerFile,"\\footer.html"); -#else - strcat(footerFile,"/footer.html"); -#endif - fileToBuf(footerFile,&footerBuf); - -} - -//---------------------------------------------------------------------------- -// copy and convert string to lower case - -void strlowercpy(char *d,const char *s) -{ - while (*s!='\0') *d++=tolower(*s++); *d='\0'; -} - -//---------------------------------------------------------------------------- - -int main(int argc,char **argv) -{ -#ifdef _WIN32 - AllocConsole(); -#endif - -#ifdef PROFILING - struct timeval tv_start,tv_end; - gettimeofday(&tv_start,0); -#endif - char *argString=getenv("QUERY_STRING"); - if (argc==1) - { - message("Error: invalid number of arguments. " - "Usage: %s doc_path [doc_path ...]",argv[0]); - exit(1); - } - // read the configuration file for this instance of the search engine - getConfig(argv[1]); - - if (!argString) - { - printHeader(); - printSearchPage(); - printFooter(); - exit(1); - } - - SearchResults tsr; - - // parse cgi arguments - char *arg=strtok(argString,"&"); - char *query = 0; - char *what = 0; - char *which = 0; - char *help = 0; - page = 0; - while (arg) - { - int namelen=strcspn(arg,"="); - if (!strncmp(arg,"query", namelen)) query = &arg[namelen+1]; - else if (!strncmp(arg,"what", namelen)) what = &arg[namelen+1]; - else if (!strncmp(arg,"which", namelen)) which = &arg[namelen+1]; - else if (!strncmp(arg,"help", namelen)) help = &arg[namelen+1]; - else if (!strncmp(arg,"page", namelen)) page = atoi(&arg[namelen+1]); - arg=strtok(0,"&"); - } - - wordOnly=which ? strcmp(which,"word")==0 : FALSE; - nameOnly=what ? strcmp(what, "name")==0 : FALSE; - helpOnly=help ? strcmp(help, "on" )==0 : FALSE; - - // store encoded query string - if (query) strcpy(encQueryInput,query); else encQueryInput[0]='\0'; - - // convert query string to original input - char *s=query,*d=queryInput; - if (s) - { - while (*s!='\0') - { - char c=*s++; - if (c=='+') - *d++=' '; - else if (c=='%') - { - *d=asciiToHex(*s++)*16; - *d+=asciiToHex(*s++); - d++; - } - else - *d++=c; - } - } - *d='\0'; - - if (helpOnly) - { - generateHelpPage(); - exit(1); - } - - // read search index files - int argIndex=0; - for (argIndex=1;argIndexname,indexFile); - if ((fi->f=fopen(indexFile,"rb"))==NULL) - { - message("Error: could not open index file %s\n",indexFile); - exit(1); - } - if ((g=fopen(configFile,"r"))==NULL) - { - message("Error: could not open config file %s\n",configFile); - exit(1); - } - - // get URL to the documentation - char tmp[MAXSTRLEN]; - fgets(tmp,MAXSTRLEN,g); - if (tmp[strlen(tmp)-1]=='\n') tmp[strlen(tmp)-1]='\0'; - if (tmp[strlen(tmp)-1]=='/') tmp[strlen(tmp)-1]='\0'; - fi->url = new char[strlen(tmp)+1]; - strcpy(fi->url,tmp); - fclose(g); - - // read & check the format of the search index file - fseek(fi->f,0,SEEK_SET); - char header[5]; - if (fread(header,1,4,fi->f)!=4) - { - message("Error: Couldn't read header of the index file %s\n",indexFile); - exit(1); - } - header[4]='\0'; - if (strcmp(header,"DOXI")) - { - message("Error: Index file %s has an unknown format\n",indexFile); - exit(1); - } - // read and store the offset to the link index - fi->refOffset=readInt(fi->f); - fclose(fi->f); - fi->f = 0; - } - - char *word; - char wordString[MAXSTRLEN]; - - // search for included words - strlowercpy(wordString,queryInput); - word=strtok(wordString," "); - bool first=TRUE; - while (word) - { - if (word[0]=='+') // + character => include - { - SearchResults sr; - searchIndex(&word[1],&sr); - if (first) - mergeSearchResults(&tsr,&sr,NORMAL); - else - mergeSearchResults(&tsr,&sr,INCLUDE); - first=FALSE; - } - word=strtok(0," "); - } - - // search for normal words - strlowercpy(wordString,queryInput); - word=strtok(wordString," "); - while (word) - { - if (word[0]!='-' && word[0]!='+') // normal word - { - SearchResults sr; - searchIndex(word,&sr); - mergeSearchResults(&tsr,&sr,NORMAL); - } - word=strtok(0," "); - } - - // search for excluded words - strlowercpy(wordString,queryInput); - word=strtok(wordString," "); - while (word) - { - if (word[0]=='-') // - character => exclude - { - SearchResults sr; - searchIndex(&word[1],&sr); - mergeSearchResults(&tsr,&sr,EXCLUDE); - } - word=strtok(0," "); - } - - // write results to HTML page - generateResults(&tsr); - - free(headerBuf); - free(footerBuf); - -#ifdef PROFILING - gettimeofday(&tv_end,0); - printf("processing time %3.3f msec\n", - ((tv_end.tv_sec-tv_start.tv_sec)*1000000+ - tv_end.tv_usec-tv_start.tv_usec)/1000.0 - ); -#endif - return 0; -} diff --git a/src/doxysearch.pro.in b/src/doxysearch.pro.in deleted file mode 100644 index 07865cd..0000000 --- a/src/doxysearch.pro.in +++ /dev/null @@ -1,20 +0,0 @@ -# -# -# -# Copyright (C) 1997-2003 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. - -TEMPLATE = app.t -CONFIG = console warn_on $extraopts -SOURCES = doxysearch.cpp -TARGET = ../bin/doxysearch -OBJECTS_DIR = ../objects -win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti diff --git a/src/doxytag.l b/src/doxytag.l index d5a3edc..91dfac5 100644 --- a/src/doxytag.l +++ b/src/doxytag.l @@ -32,8 +32,8 @@ #include #include "version.h" -#include "suffixtree.h" -#include "searchindex.h" +//#include "suffixtree.h" +//#include "searchindex.h" #include "logos.h" static QCString convertToXML(const char *s) @@ -95,7 +95,7 @@ static QCString docBaseLink; static QCString docAnchor; static QCString docRefName; static bool nameBug; -static SearchIndex searchIndex; +//static SearchIndex searchIndex; #define YY_NEVER_INTERACTIVE 1 @@ -162,14 +162,14 @@ static void addReference() { //printf("addReference() key: %s ref:%s\n", // docRefName.data(),(docBaseLink+"#"+docAnchor).data()); - if (genIndex && !docRefName.isEmpty() && !docBaseLink.isEmpty()) - { - if (docAnchor.isEmpty()) - searchIndex.addReference(docRefName,docBaseLink); - else - searchIndex.addReference(docRefName,docBaseLink+"#"+docAnchor); - searchIndex.addWord(docRefName,docRefName,TRUE); - } + //if (genIndex && !docRefName.isEmpty() && !docBaseLink.isEmpty()) + //{ + // if (docAnchor.isEmpty()) + // searchIndex.addReference(docRefName,docBaseLink); + // else + // searchIndex.addReference(docRefName,docBaseLink+"#"+docAnchor); + // searchIndex.addWord(docRefName,docRefName,TRUE); + //} } QCString unhtmlify(const char *str) @@ -247,10 +247,10 @@ QCString unhtmlify(const char *str) //printf("tag: %s#%s ref: %s word: `%s'\n", // docBaseLink.data(),docAnchor.data(), // docRefName.data(),yytext); - if (genIndex && !docRefName.isEmpty() && yyleng>2) - searchIndex.addWord(docRefName, - yytext,FALSE - ); + //if (genIndex && !docRefName.isEmpty() && yyleng>2) + // searchIndex.addWord(docRefName, + // yytext,FALSE + // ); } "" { BEGIN( Start ); @@ -458,8 +458,8 @@ void parseFile(QFileInfo &fi) QCString input(fi.size()+1); docBaseLink=fi.fileName(); docRefName=fi.fileName().copy(); - searchIndex.addReference(docRefName,docBaseLink); - searchIndex.addWord(docRefName,docRefName,TRUE); + //searchIndex.addReference(docRefName,docBaseLink); + //searchIndex.addWord(docRefName,docRefName,TRUE); f.readBlock(input.data(),fi.size()); input.at(fi.size())='\0'; parse(input); @@ -584,46 +584,48 @@ int main(int argc,char **argv) } if (genIndex) { - //printf("Writing search index\n"); - if (!searchIndex.saveIndex(indexName)) - { - fprintf(stderr,"Error: Could not write search index\n"); - } - QFileInfo fi(indexName); - if (fi.exists()) - { - QCString dir=convertToQCString(fi.dir().absPath()); - fi.setFile(dir+"/search.png"); - if (!fi.exists()) writeSearchButton(dir); - fi.setFile(dir+"/doxygen.png"); - if (!fi.exists()) writeLogo(dir); - fi.setFile(dir+"/search.cgi"); - if (!fi.exists()) - { - QFile f; - f.setName(dir+"/search.cgi"); - if (f.open(IO_WriteOnly)) - { - QTextStream t(&f); - t << "#!/bin/sh" << endl - << "DOXYSEARCH=" << endl - << "DOXYPATH=" << endl - << "if [ -f $DOXYSEARCH ]" << endl - << "then" << endl - << " $DOXYSEARCH $DOXYPATH" << endl - << "else" << endl - << " echo \"Content-Type: text/html\"" << endl - << " echo \"\"" << endl - << " echo \"

Error: $DOXYSEARCH not found. Check cgi script!\"" << endl - << "fi" << endl; - f.close(); - } - else - { - fprintf(stderr,"Error: could not open file %s for writing\n",(dir+"/search.cgi").data()); - } - } - } + fprintf(stderr,"Error: doxytag cannot be used to generate a search index anymore.\n" + "This functionality has been integrated into doxygen.\n"); +// printf("Writing search index\n"); +// if (!searchIndex.saveIndex(indexName)) +// { +// fprintf(stderr,"Error: Could not write search index\n"); +// } +// QFileInfo fi(indexName); +// if (fi.exists()) +// { +// QCString dir=convertToQCString(fi.dir().absPath()); +// fi.setFile(dir+"/search.png"); +// if (!fi.exists()) writeSearchButton(dir); +// fi.setFile(dir+"/doxygen.png"); +// if (!fi.exists()) writeLogo(dir); +// fi.setFile(dir+"/search.cgi"); +// if (!fi.exists()) +// { +// QFile f; +// f.setName(dir+"/search.cgi"); +// if (f.open(IO_WriteOnly)) +// { +// QTextStream t(&f); +// t << "#!/bin/sh" << endl +// << "DOXYSEARCH=" << endl +// << "DOXYPATH=" << endl +// << "if [ -f $DOXYSEARCH ]" << endl +// << "then" << endl +// << " $DOXYSEARCH $DOXYPATH" << endl +// << "else" << endl +// << " echo \"Content-Type: text/html\"" << endl +// << " echo \"\"" << endl +// << " echo \"

Error: $DOXYSEARCH not found. Check cgi script!\"" << endl +// << "fi" << endl; +// f.close(); +// } +// else +// { +// fprintf(stderr,"Error: could not open file %s for writing\n",(dir+"/search.cgi").data()); +// } +// } +// } } if (genTag) { diff --git a/src/doxytag.pro.in b/src/doxytag.pro.in index 6900938..820c094 100644 --- a/src/doxytag.pro.in +++ b/src/doxytag.pro.in @@ -16,9 +16,8 @@ TEMPLATE = doxytag.t CONFIG = console warn_on $extraopts -HEADERS = suffixtree.h searchindex.h logos.h version.h -SOURCES = doxytag.cpp suffixtree.cpp searchindex.cpp \ - logos.cpp version.cpp +HEADERS = logos.h version.h +SOURCES = doxytag.cpp logos.cpp version.cpp unix:LIBS += -L../lib -lqtools win32:INCLUDEPATH += . win32-mingw:LIBS += -L../lib -lqtools diff --git a/src/entry.h b/src/entry.h index 594a3c8..ef50658 100644 --- a/src/entry.h +++ b/src/entry.h @@ -135,9 +135,9 @@ struct Grouping { GROUPING_LOWEST, GROUPING_AUTO_WEAK = - GROUPING_LOWEST, //!< membership in group was defined via \@weakgroup \@{ \@} - GROUPING_AUTO_ADD, //!< membership in group was defined via \@add[to]group \@{ \@} - GROUPING_AUTO_DEF, //!< membership in group was defined via \@defgroup \@{ \@} + GROUPING_LOWEST, //!< membership in group was defined via \@weakgroup + GROUPING_AUTO_ADD, //!< membership in group was defined via \@add[to]group + GROUPING_AUTO_DEF, //!< membership in group was defined via \@defgroup GROUPING_AUTO_HIGHEST = GROUPING_AUTO_DEF, GROUPING_INGROUP, //!< membership in group was defined by \@ingroup GROUPING_HIGHEST = GROUPING_INGROUP diff --git a/src/filedef.cpp b/src/filedef.cpp index 0e9104e..0278688 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -30,6 +30,7 @@ #include "message.h" #include "code.h" #include "docparser.h" +#include "ftvhelp.h" //#include "xml.h" class DevNullCodeDocInterface : public BaseCodeDocInterface @@ -159,7 +160,7 @@ void FileDef::writeDetailedDocumentation(OutputList &ol) ol.endGroupHeader(); if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) { - ol.parseDoc(briefFile(),briefLine(),0,0,briefDescription(),FALSE); + ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE); } if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") && !documentation().isEmpty()) @@ -176,7 +177,7 @@ void FileDef::writeDetailedDocumentation(OutputList &ol) { //if (doc.at(dl-1)!='.' && doc.at(dl-1)!='!' && doc.at(dl-1)!='?') // doc+='.'; - ol.parseDoc(docFile(),docLine(),0,0,documentation()+"\n",FALSE); + ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE); } //printf("Writing source ref for file %s\n",name().data()); if (Config_getBool("SOURCE_BROWSER")) @@ -237,7 +238,7 @@ void FileDef::writeDocumentation(OutputList &ol) } else if (briefDescription()) { - ol.parseDoc(briefFile(),briefLine(),0,0,briefDescription(),FALSE); + ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); ol.writeString(" \n"); ol.disableAllBut(OutputGenerator::Html); ol.startTextLink(0,"_details"); @@ -779,3 +780,217 @@ void FileDef::addListReferences() docVarMembers.addListReferences(this); } +//------------------------------------------------------------------- + +static int findMatchingPart(const QCString &path,const QCString dir) +{ + int si1; + int pos1=0,pos2=0; + while ((si1=path.find('/',pos1))!=-1) + { + int si2=dir.find('/',pos2); + //printf(" found slash at pos %d in path %d: %s<->%s\n",si1,si2, + // path.mid(pos1,si1-pos2).data(),dir.mid(pos2).data()); + if (si2==-1 && path.mid(pos1,si1-pos2)==dir.mid(pos2)) // match at end + { + return dir.length(); + } + if (si1!=si2 || path.mid(pos1,si1-pos2)!=dir.mid(pos2,si2-pos2)) // no match in middle + { + return QMAX(pos1-1,0); + } + pos1=si1+1; + pos2=si2+1; + } + return 0; +} + +static Directory *findDirNode(Directory *root,const QCString &name) +{ + QListIterator dli(root->children()); + DirEntry *de; + for (dli.toFirst();(de=dli.current());++dli) + { + if (de->kind()==DirEntry::Dir) + { + Directory *dir = (Directory *)de; + QCString dirName=dir->name(); + int sp=findMatchingPart(name,dirName); + //printf("findMatchingPart(%s,%s)=%d\n",name.data(),dirName.data(),sp); + if (sp>0) // match found + { + if ((uint)sp==dirName.length()) // whole directory matches + { + // recurse into the directory + return findDirNode(dir,name.mid(dirName.length()+1)); + } + else // partial match => we need to split the path into three parts + { + QCString baseName =dirName.left(sp); + QCString oldBranchName=dirName.mid(sp+1); + QCString newBranchName=name.mid(sp+1); + // strip file name from path + int newIndex=newBranchName.findRev('/'); + if (newIndex>0) newBranchName=newBranchName.left(newIndex); + + //printf("Splitting off part in new branch \n" + // "base=%s old=%s new=%s\n", + // baseName.data(), + // oldBranchName.data(), + // newBranchName.data() + // ); + Directory *base = new Directory(root,baseName); + Directory *newBranch = new Directory(base,newBranchName); + dir->reParent(base); + dir->rename(oldBranchName); + base->addChild(dir); + base->addChild(newBranch); + dir->setLast(FALSE); + // remove DirEntry container from list (without deleting it) + root->children().setAutoDelete(FALSE); + root->children().removeRef(dir); + root->children().setAutoDelete(TRUE); + // add new branch to the root + if (!root->children().isEmpty()) + { + root->children().last()->setLast(FALSE); + } + root->addChild(base); + return newBranch; + } + } + } + } + int si=name.findRev('/'); + if (si==-1) // no subdir + { + return root; // put the file under the root node. + } + else // need to create a subdir + { + QCString baseName = name.left(si); + //printf("new subdir %s\n",baseName.data()); + Directory *newBranch = new Directory(root,baseName); + if (!root->children().isEmpty()) + { + root->children().last()->setLast(FALSE); + } + root->addChild(newBranch); + return newBranch; + } +} + +static void mergeFileDef(Directory *root,FileDef *fd) +{ + QCString rootPath = root->name(); + QCString filePath = fd->absFilePath(); + //printf("merging %s\n",filePath.data()); + Directory *dirNode = findDirNode(root,filePath); + if (!dirNode->children().isEmpty()) + { + dirNode->children().last()->setLast(FALSE); + } + DirEntry *e=new DirEntry(dirNode,fd); + dirNode->addChild(e); +} + +static void generateIndent(QTextStream &t,DirEntry *de,int level) +{ + if (de->parent()) + { + generateIndent(t,de->parent(),level+1); + } + // from the root up to node n do... + if (level==0) // item before a dir or document + { + if (de->isLast()) + { + if (de->kind()==DirEntry::Dir) + { + t << ""; + } + else + { + t << ""; + } + } + else + { + if (de->kind()==DirEntry::Dir) + { + t << ""; + } + else + { + t << ""; + } + } + } + else // item at another level + { + if (de->isLast()) + { + t << ""; + } + else + { + t << ""; + } + } +} + + +static void writeDirTreeNode(QTextStream &t,Directory *root,int level) +{ + QCString indent; + indent.fill(' ',level*2); + QListIterator dli(root->children()); + DirEntry *de; + for (dli.toFirst();(de=dli.current());++dli) + { + t << indent << "

"; + generateIndent(t,de,0); + if (de->kind()==DirEntry::Dir) + { + Directory *dir=(Directory *)de; + //printf("%s [dir]: %s (last=%d,dir=%d)\n",indent.data(),dir->name().data(),dir->isLast(),dir->kind()==DirEntry::Dir); + t << ""; + t << dir->name(); + t << "

\n"; + t << indent << "
\n"; + writeDirTreeNode(t,dir,level+1); + t << indent << "
\n"; + } + else + { + //printf("%s [file]: %s (last=%d,dir=%d)\n",indent.data(),de->file()->name().data(),de->isLast(),de->kind()==DirEntry::Dir); + t << ""; + t << de->file()->name(); + t << "

\n"; + } + } +} + +void generateFileTree(QTextStream &t) +{ + FTVHelp::generateTreeViewImages(); + + Directory *root=new Directory(0,""); + root->setLast(TRUE); + FileNameListIterator fnli(Doxygen::inputNameList); + FileName *fn; + for (fnli.toFirst();(fn=fnli.current());++fnli) + { + FileNameIterator fni(*fn); + FileDef *fd; + for (;(fd=fni.current());++fni) + { + mergeFileDef(root,fd); + } + } + t << "
\n"; + writeDirTreeNode(t,root,0); + t << "
\n"; + delete root; +} + diff --git a/src/filedef.h b/src/filedef.h index 13b3b2c..d0e7c02 100644 --- a/src/filedef.h +++ b/src/filedef.h @@ -241,4 +241,51 @@ class OutputNameDict : public QDict ~OutputNameDict() {} }; +class Directory; + +class DirEntry +{ + public: + enum EntryKind { Dir, File }; + DirEntry::DirEntry(DirEntry *parent,FileDef *fd) + : m_parent(parent), m_kind(File), m_fd(fd), m_isLast(FALSE) { } + DirEntry::DirEntry(DirEntry *parent) + : m_parent(parent), m_kind(Dir), m_fd(0), m_isLast(FALSE) { } + virtual ~DirEntry() { } + EntryKind kind() const { return m_kind; } + FileDef *file() const { return m_fd; } + bool isLast() const { return m_isLast; } + void setLast(bool b) { m_isLast=b; } + DirEntry *parent() const { return m_parent; } + + protected: + DirEntry *m_parent; + private: + EntryKind m_kind; + FileDef *m_fd; + int num; + bool m_isLast; +}; + +class Directory : public DirEntry +{ + public: + Directory(Directory *parent,const QCString &name) + : DirEntry(parent), m_name(name) + { m_children.setAutoDelete(TRUE); } + virtual ~Directory() {} + void addChild(DirEntry *d) { m_children.append(d); d->setLast(TRUE); } + QList &children() { return m_children; } + void rename(const QCString &name) { m_name=name; } + void reParent(Directory *parent) { m_parent=parent; } + QCString name() const { return m_name; } + + private: + QCString m_name; + QList m_children; +}; + +void generateFileTree(QTextStream &t); + #endif + diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp index f196253..941808d 100644 --- a/src/ftvhelp.cpp +++ b/src/ftvhelp.cpp @@ -291,65 +291,23 @@ unsigned char ftv2vertline_png[] = { }; -struct ImageInfo -{ - const char *alt; - const char *name; - const unsigned char *data; - unsigned int len; - unsigned short width, height; -} image_info[] = +FTVImageInfo image_info[] = { { " ", "ftv2blank.png",ftv2blank_png,174,16,22 }, -#define FTVIMG_blank 0 - - { "*", "ftv2doc.png",ftv2doc_png,255,24,22 }, -#define FTVIMG_doc 1 - - { "+", "ftv2folderclosed.png",ftv2folderclosed_png,259,24,22 }, -#define FTVIMG_folderclosed 2 - - { "-", "ftv2folderopen.png",ftv2folderopen_png,261,24,22 }, -#define FTVIMG_folderopen 3 - + { "*", "ftv2doc.png",ftv2doc_png,255,24,22 }, + { "+", "ftv2folderclosed.png",ftv2folderclosed_png,259,24,22 }, + { "-", "ftv2folderopen.png",ftv2folderopen_png,261,24,22 }, { "\\", "ftv2lastnode.png",ftv2lastnode_png,233,16,22 }, -#define FTVIMG_lastnode 4 - - { "-", "ftv2link.png",ftv2link_png,358,24,22 }, -#define FTVIMG_link 5 - + { "-", "ftv2link.png",ftv2link_png,358,24,22 }, { "\\", "ftv2mlastnode.png",ftv2mlastnode_png,160,16,22 }, -#define FTVIMG_mlastnode 6 - - { "o", "ftv2mnode.png",ftv2mnode_png,194,16,22 }, -#define FTVIMG_mnode 7 - - { "o", "ftv2node.png",ftv2node_png,235,16,22 }, -#define FTVIMG_node 8 - + { "o", "ftv2mnode.png",ftv2mnode_png,194,16,22 }, + { "o", "ftv2node.png",ftv2node_png,235,16,22 }, { "\\", "ftv2plastnode.png",ftv2plastnode_png,165,16,22 }, -#define FTVIMG_plastnode 9 - - { "o", "ftv2pnode.png",ftv2pnode_png,200,16,22 }, -#define FTVIMG_pnode 10 - - { "|", "ftv2vertline.png",ftv2vertline_png,229,16,22 }, -#define FTVIMG_vertline 11 - + { "o", "ftv2pnode.png",ftv2pnode_png,200,16,22 }, + { "|", "ftv2vertline.png",ftv2vertline_png,229,16,22 }, { 0,0,0,0,0,0 } -#define FTVIMG_UNUSED 12 }; -#define _S(nym) #nym -#define FTV_ICON_FILE(nym) "ftv2" _S(nym) ".png" -#define FTVIMG_INDEX(nym) FTVIMG_ ## nym -#define _INFO(nym) ( image_info[FTVIMG_INDEX(nym)] ) -#define IMG_PREAMBLE(nym) \ - "close(); - //delete m_cf; generateTreeView(); - //generateFolderTreeViewData(); } /*! Increase the level of the contents hierarchy. @@ -496,22 +450,22 @@ void FTVHelp::generateIndent(QTextStream &t, FTVNode *n,int level) { if (n->isDir) { - t << IMG_PREAMBLE(plastnode) << "onclick=\"toggleFolder('folder" << folderId << "', this)\"/>"; + t << ""; } else { - t << IMG_PREAMBLE(lastnode) << "/>"; + t << ""; } } else { if (n->isDir) { - t << IMG_PREAMBLE(pnode) << "onclick=\"toggleFolder('folder" << folderId << "', this)\"/>"; + t << ""; } else { - t << IMG_PREAMBLE(node) << "/>"; + t << ""; } } } @@ -519,11 +473,11 @@ void FTVHelp::generateIndent(QTextStream &t, FTVNode *n,int level) { if (n->isLast) { - t << IMG_PREAMBLE(blank) << "/>"; + t << ""; } else { - t << IMG_PREAMBLE(vertline) << "/>"; + t << ""; } } } @@ -579,7 +533,7 @@ void FTVHelp::generateTree(QTextStream &t, const QList &nl,int level) generateIndent(t,n,0); if (n->isDir) { - t << IMG_PREAMBLE(folderclosed) << "onclick=\"toggleFolder('folder" << folderId << "', this)\"/>"; + t << ""; generateLink(t,n); t << "

\n"; t << spaces << "
\n"; @@ -589,13 +543,38 @@ void FTVHelp::generateTree(QTextStream &t, const QList &nl,int level) } else { - t << IMG_PREAMBLE(doc) << "/>"; + t << ""; generateLink(t,n); t << "

\n"; } } } +void FTVHelp::generateTreeViewImages() +{ + static bool done=FALSE; + if (done) return; + done=TRUE; + + // Generate tree view images + FTVImageInfo *p = image_info; + while (p->name) + { + QCString fileName=Config_getString("HTML_OUTPUT")+"/"+p->name; + QFile f(fileName); + if (f.open(IO_WriteOnly)) + { + f.writeBlock((char *)p->data,p->len); + } + else + { + fprintf(stderr,"Warning: Cannot open file %s for writing\n",fileName.data()); + } + f.close(); + p++; + } +} + void FTVHelp::generateTreeView() { // Generate alternative index.html as a frame @@ -792,21 +771,7 @@ void FTVHelp::generateTreeView() t << " \n"; t << "\n"; } + generateTreeViewImages(); - // Generate tree view images - ImageInfo *p = image_info; - while (p->name) - { - QCString fileName=Config_getString("HTML_OUTPUT")+"/"+p->name; - QFile f(fileName); - if (f.open(IO_WriteOnly)) - f.writeBlock((char *)p->data,p->len); - else - { - fprintf(stderr,"Warning: Cannot open file %s for writing\n",fileName.data()); - } - f.close(); - p++; - } } diff --git a/src/ftvhelp.h b/src/ftvhelp.h index 3bcd7b9..8fdca6a 100644 --- a/src/ftvhelp.h +++ b/src/ftvhelp.h @@ -18,10 +18,41 @@ class QFile; struct FTVNode; -/*! A class that generated the FTV Help specific file. - * This file is used in conjunction with additional FTV web browser code - * that can be obtained from: - * http://www.geocities.com/Paris/LeftBank/2178/ftexample.html +struct FTVImageInfo +{ + const char *alt; + const char *name; + const unsigned char *data; + unsigned int len; + unsigned short width, height; +}; + +extern FTVImageInfo image_info[]; + +#define FTVIMG_blank 0 +#define FTVIMG_doc 1 +#define FTVIMG_folderclosed 2 +#define FTVIMG_folderopen 3 +#define FTVIMG_lastnode 4 +#define FTVIMG_link 5 +#define FTVIMG_mlastnode 6 +#define FTVIMG_mnode 7 +#define FTVIMG_node 8 +#define FTVIMG_plastnode 9 +#define FTVIMG_pnode 10 +#define FTVIMG_vertline 11 + +#define FTV_S(name) #name +#define FTV_ICON_FILE(name) "ftv2" FTV_S(name) ".png" +#define FTVIMG_INDEX(name) FTVIMG_ ## name +#define FTV_INFO(name) ( image_info[FTVIMG_INDEX(name)] ) +#define FTV_IMGATTRIBS(name) \ + "src=\"" FTV_ICON_FILE(name) "\" " \ + "alt=\"" << FTV_INFO(name).alt << "\" " \ + "width=" << FTV_INFO(name).width << " " \ + "height=" << FTV_INFO(name).height << " " + +/*! A class that generates a dynamic tree view side panel. */ class FTVHelp { @@ -38,6 +69,7 @@ class FTVHelp const char *file, const char *anchor, const char *name); + static void generateTreeViewImages(); private: void generateTreeView(); @@ -54,5 +86,6 @@ class FTVHelp int m_indent; }; + #endif /* FTVHELP_H */ diff --git a/src/groupdef.cpp b/src/groupdef.cpp index b6b6401..28e21db 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -389,7 +389,7 @@ void GroupDef::writeDetailedDocumentation(OutputList &ol) // repeat brief description if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) { - ol.parseDoc(briefFile(),briefLine(),name(),0,briefDescription(),FALSE); + ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE); ol.newParagraph(); } } @@ -397,7 +397,7 @@ void GroupDef::writeDetailedDocumentation(OutputList &ol) // write documentation if (!documentation().isEmpty()) { - ol.parseDoc(docFile(),docLine(),name(),0,documentation()+"\n",FALSE); + ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE); } } } @@ -420,7 +420,7 @@ void GroupDef::writeDocumentation(OutputList &ol) } else if (!briefDescription().isEmpty()) { - ol.parseDoc(briefFile(),briefLine(),name(),0,briefDescription(),FALSE); + ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); ol.writeString(" \n"); ol.pushGeneratorState(); ol.disable(OutputGenerator::Latex); @@ -464,7 +464,7 @@ void GroupDef::writeDocumentation(OutputList &ol) if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { ol.startMemberDescription(); - ol.parseDoc(briefFile(),briefLine(),0,0,fd->briefDescription(),FALSE); + ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE); ol.endMemberDescription(); ol.newParagraph(); } @@ -495,7 +495,7 @@ void GroupDef::writeDocumentation(OutputList &ol) if (!nd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { ol.startMemberDescription(); - ol.parseDoc(briefFile(),briefLine(),0,0,nd->briefDescription(),FALSE); + ol.parseDoc(briefFile(),briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE); ol.endMemberDescription(); ol.newParagraph(); } @@ -525,7 +525,7 @@ void GroupDef::writeDocumentation(OutputList &ol) if (!gd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { ol.startMemberDescription(); - ol.parseDoc(briefFile(),briefLine(),0,0,gd->briefDescription(),FALSE); + ol.parseDoc(briefFile(),briefLine(),gd,0,gd->briefDescription(),FALSE,FALSE); ol.endMemberDescription(); ol.newParagraph(); } @@ -585,7 +585,7 @@ void GroupDef::writeDocumentation(OutputList &ol) ol.endSection(si->label,SectionInfo::Subsection); } ol.startTextBlock(); - ol.parseDoc(pd->docFile(),pd->docLine(),0,0,pd->documentation(),FALSE); + ol.parseDoc(pd->docFile(),pd->docLine(),pd,0,pd->documentation(),TRUE,FALSE); ol.endTextBlock(); } } diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 8d75de9..23c7a6d 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -100,6 +100,7 @@ void HtmlDocVisitor::visit(DocSymbol *s) case DocSymbol::Acute: m_t << "&" << s->letter() << "acute;"; break; case DocSymbol::Grave: m_t << "&" << s->letter() << "grave;"; break; case DocSymbol::Circ: m_t << "&" << s->letter() << "circ;"; break; + case DocSymbol::Slash: m_t << "&" << s->letter() << "slash;"; break; case DocSymbol::Tilde: m_t << "&" << s->letter() << "tilde;"; break; case DocSymbol::Szlig: m_t << "ß"; break; case DocSymbol::Cedil: m_t << "&" << s->letter() << "cedil;"; break; @@ -207,7 +208,7 @@ void HtmlDocVisitor::visit(DocVerbatim *s) void HtmlDocVisitor::visit(DocAnchor *anc) { if (m_hide) return; - m_t << "file() << "#"*/ << anc->anchor() << "\"/>"; + m_t << "anchor() << "\">"; } void HtmlDocVisitor::visit(DocInclude *inc) @@ -328,6 +329,20 @@ void HtmlDocVisitor::visitPost(DocAutoListItem *) void HtmlDocVisitor::visitPre(DocPara *) { + if (m_hide) return; + + // TODO: + // Paragraph should be surrounded by

..

, but + // + // A list item (li), description data (dd), or table data (td) should + // only have paragraph markers if there are multiple paragraphs (otherwise + // the output looks ugly). + // + // A list or table should be placed outside the paragraph context, + // so the current paragraph should be ended and restarted. To avoid + // empty paragraphs, it has to be checked if the list or table is the + // first or last child within the paragraph. + } void HtmlDocVisitor::visitPost(DocPara *p) @@ -345,12 +360,10 @@ void HtmlDocVisitor::visitPost(DocPara *p) void HtmlDocVisitor::visitPre(DocRoot *) { - //m_t << "

New parser:

\n"; } void HtmlDocVisitor::visitPost(DocRoot *) { - //m_t << "

Old parser:

\n"; } void HtmlDocVisitor::visitPre(DocSimpleSect *s) @@ -446,10 +459,10 @@ void HtmlDocVisitor::visitPre(DocSection *s) { if (m_hide) return; m_t << "level()+1 << ">"; - m_t << "anchor(); - m_t << "\">" << endl; + m_t << "anchor(); + m_t << "\">" << endl; filter(s->title()); - m_t << "level()+1 << ">\n"; + m_t << "level()+1 << ">\n"; } void HtmlDocVisitor::visitPost(DocSection *) @@ -488,18 +501,6 @@ void HtmlDocVisitor::visitPost(DocHtmlListItem *) m_t << "\n"; } -//void HtmlDocVisitor::visitPre(DocHtmlPre *p) -//{ -// m_t << "attribs()) << ">\n"; -// m_insidePre=TRUE; -//} - -//void HtmlDocVisitor::visitPost(DocHtmlPre *) -//{ -// m_insidePre=FALSE; -// m_t << "\n"; -//} - void HtmlDocVisitor::visitPre(DocHtmlDescList *dl) { if (m_hide) return; @@ -747,14 +748,14 @@ void HtmlDocVisitor::visitPost(DocLink *) void HtmlDocVisitor::visitPre(DocRef *ref) { if (m_hide) return; - startLink(ref->ref(),ref->file(),ref->anchor()); + if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor()); if (!ref->hasLinkText()) filter(ref->targetTitle()); } -void HtmlDocVisitor::visitPost(DocRef *) +void HtmlDocVisitor::visitPost(DocRef *ref) { if (m_hide) return; - endLink(); + if (!ref->file().isEmpty()) endLink(); //m_t << " "; } diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 7e79ca8..0f65f07 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -32,6 +32,8 @@ #include "htmlhelp.h" #include "docparser.h" #include "htmldocvisitor.h" +#include "index.h" +#include "pagedef.h" // #define GROUP_COLOR "#ff8080" @@ -53,20 +55,15 @@ static const char *defaultStyleSheet = " text-align: center;\n" " margin-bottom: 2px\n" "}\n" -"A.qindex { text-decoration: none; font-weight: bold; }\n" +"A.qindex { text-decoration: none; font-weight: bold; color: #0000ee }\n" +"A.qindex:visited { text-decoration: none; font-weight: bold; color: #0000ee }\n" "A.qindex:hover { text-decoration: none; background-color: #ddddff }\n" "A.qindexHL { text-decoration: none; font-weight: bold;\n" " background-color: #6666cc;\n" " color: #ffffff\n" " }\n" -"A.qindexHL:hover { text-decoration: none; background-color: #6666cc }\n" -"A.qindexRef { text-decoration: none; font-weight: bold; }\n" -"A.qindexRef:hover { text-decoration: none; background-color: #ddddff }\n" -"A.qindexRefHL { text-decoration: none; font-weight: bold;\n" -" background-color: #6666cc;\n" -" color: #ffffff\n" -" }\n" -"A.qindexRefHL:hover { text-decoration: none; background-color: #6666cc }\n" +"A.qindexHL:hover { text-decoration: none; background-color: #6666cc; color: #ffffff }\n" +"A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff }\n" "A.el { text-decoration: none; font-weight: bold }\n" "A.elRef { font-weight: bold }\n" "A.code { text-decoration: none; font-weight: normal; color: #4444ee }\n" @@ -198,11 +195,29 @@ static const char *defaultStyleSheet = " background-color: #FAFAFA;\n" " font-family: Geneva, Arial, Helvetica, sans-serif;\n" " font-size: 13px;\n" +"}\n" +".search { color: #0000ee;\n" +" font-weight: bold;\n" +"}\n" +"FORM.search {\n" +" margin-bottom: 0px;\n" +" margin-top: 0px;\n" +"}\n" +"INPUT.search { font-size: 75%;\n" +" color: #000080;\n" +" font-weight: normal;\n" +" background-color: #eeeeff;\n" +"}\n" +"TD.tiny { font-size: 75%;\n" "}\n"; static QCString g_header; static QCString g_footer; +const char search_script[]= +#include "search_php.h" +; + HtmlGenerator::HtmlGenerator() : OutputGenerator() { dir=Config_getString("HTML_OUTPUT"); @@ -234,22 +249,17 @@ void HtmlGenerator::writeStyleSheetFile(QFile &file) t << defaultStyleSheet; } -static void writeDefaultHeaderFile(QTextStream &t, const char *title, - bool external) +static void writeDefaultHeaderFile(QTextStream &t, const char *title) { - t << "\n" - "" /*"\n"*/ + t << "\n" + "" "idLanguageCharset() << "\">\n" ""; t << convertToHtml(title); t << "\n"; t << "= 200 t.setEncoding(QTextStream::Latin1); #endif - writeDefaultHeaderFile(t,"$title",FALSE); + writeDefaultHeaderFile(t,"$title"); } void HtmlGenerator::writeFooterFile(QFile &file) @@ -294,7 +304,7 @@ void HtmlGenerator::writeFooterFile(QFile &file) void HtmlGenerator::startFile(const char *name,const char *, - const char *title,bool external) + const char *title) { //printf("HtmlGenerator::startFile(%s)\n",name); QCString fileName=name; @@ -319,7 +329,7 @@ void HtmlGenerator::startFile(const char *name,const char *, lastFile = fileName; if (g_header.isEmpty()) { - writeDefaultHeaderFile(t,dispTitle,external); + writeDefaultHeaderFile(t,dispTitle); } else { @@ -329,73 +339,59 @@ void HtmlGenerator::startFile(const char *name,const char *, << versionString << " -->" << endl; } -void HtmlGenerator::startQuickIndexItem(const char *s,const char *l) -{ - QCString *dest; - if (s) +//void HtmlGenerator::startQuickIndexItem(const char *s,const char *l) +//{ +// QCString *dest; +// if (s) +// { +// t << ""; +//} +// +//void HtmlGenerator::endQuickIndexItem() +//{ +// t << "   "; +//} + +static void writePageFooter(QTextStream &t,const QCString lastTitle) +{ + if (g_footer.isEmpty()) { - t << "
"; + t << theTranslator->trGeneratedAt( + dateToString(TRUE), + Config_getString("PROJECT_NAME") + ); + t << endl << ""; + t << endl << "\"doxygen\" " << endl << + "" << versionString <<" "; + t << "
\n\n\n"; } else { - t << ""; } -void HtmlGenerator::endQuickIndexItem() +void HtmlGenerator::writeFooter() { - t << "   "; -} - -void HtmlGenerator::writeFooter(int part,bool external) -{ - switch (part) - { - case 0: - if (g_footer.isEmpty()) - t << "
"; - else - t << substituteKeywords(g_footer,convertToHtml(lastTitle)); - break; - case 1: - if (g_footer.isEmpty()) - { - t << endl << ""; - t << endl << "\"doxygen\" " << endl << - "" << versionString <<" "; - } - break; - default: - if (g_footer.isEmpty()) - { - //t << " Dimitri van Heesch,\n © 1997-2003"; - t << "
\n\n\n"; - } - break; - - } + writePageFooter(t,lastTitle); } void HtmlGenerator::endFile() @@ -454,7 +450,7 @@ void HtmlGenerator::writeStyleInfo(int part) void HtmlGenerator::startDoxyAnchor(const char *,const char *, const char *anchor, const char *name) { - t << ""; + t << ""; } void HtmlGenerator::endDoxyAnchor(const char *,const char *) @@ -633,12 +629,12 @@ void HtmlGenerator::startSection(const char *lab,const char *,SectionInfo::Secti case SectionInfo::Paragraph: t << "
"; break; default: ASSERT(0); break; } - t << ""; + t << ""; } void HtmlGenerator::endSection(const char *,SectionInfo::SectionType type) { - t << "" << endl; + t << ""; switch(type) { case SectionInfo::Page: t << "
"; break; @@ -1212,3 +1208,239 @@ void HtmlGenerator::printDoc(DocNode *n) delete visitor; } +static void startQuickIndexItem(QTextStream &t,const char *l, + bool hl,bool compact,bool &first) +{ + if (!first && compact) t << " | "; + first=FALSE; + if (!compact) t << "
  • "; + if (hl && compact) + { + t << ""; +} + +static void endQuickIndexItem(QTextStream &t) +{ + t << ""; +} + +static QCString fixSpaces(const QCString &s) +{ + return substitute(s," "," "); +} + +static void writeDefaultQuickLinks(QTextStream &t,bool compact,HighlightedItem hli) +{ + bool first=TRUE; + if (compact) + { + t << "
    "; + } + else + { + t << "
      "; + } + + if (Config_getBool("SEARCHENGINE")) + { + t << "
      \n"; + } + + if (Config_getBool("GENERATE_TREEVIEW")) + { + startQuickIndexItem(t,"main"+Doxygen::htmlFileExtension, + hli==HLI_Main,compact,first); + } + else + { + startQuickIndexItem(t,"index"+Doxygen::htmlFileExtension, + hli==HLI_Main,compact,first); + } + t << fixSpaces(theTranslator->trMainPage()); + endQuickIndexItem(t); + + if (documentedGroups>0) + { + startQuickIndexItem(t,"modules"+Doxygen::htmlFileExtension, + hli==HLI_Modules,compact,first); + t << fixSpaces(theTranslator->trModules()); + endQuickIndexItem(t); + } + if (documentedNamespaces>0) + { + startQuickIndexItem(t,"namespaces"+Doxygen::htmlFileExtension, + hli==HLI_Namespaces,compact,first); + if (Config_getBool("OPTIMIZE_OUTPUT_JAVA")) + { + t << fixSpaces(theTranslator->trPackages()); + } + else + { + t << theTranslator->trNamespaceList(); + } + endQuickIndexItem(t); + } + if (hierarchyClasses>0) + { + startQuickIndexItem(t,"hierarchy"+Doxygen::htmlFileExtension, + hli==HLI_Hierarchy,compact,first); + t << fixSpaces(theTranslator->trClassHierarchy()); + endQuickIndexItem(t); + } + if (annotatedClasses>0) + { + if (Config_getBool("ALPHABETICAL_INDEX")) + { + startQuickIndexItem(t,"classes"+Doxygen::htmlFileExtension, + hli==HLI_Classes,compact,first); + t << fixSpaces(theTranslator->trAlphabeticalList()); + endQuickIndexItem(t); + } + startQuickIndexItem(t,"annotated"+Doxygen::htmlFileExtension, + hli==HLI_Annotated,compact,first); + t << fixSpaces(theTranslator->trCompoundList()); + endQuickIndexItem(t); + } + if (documentedHtmlFiles>0) + { + startQuickIndexItem(t,"files"+Doxygen::htmlFileExtension, + hli==HLI_Files,compact,first); + t << fixSpaces(theTranslator->trFileList()); + endQuickIndexItem(t); + } + if (documentedNamespaceMembers[NMHL_All]>0) + { + startQuickIndexItem(t,"namespacemembers"+Doxygen::htmlFileExtension, + hli==HLI_NamespaceMembers,compact,first); + t << fixSpaces(theTranslator->trNamespaceMembers()); + endQuickIndexItem(t); + } + if (documentedClassMembers[CMHL_All]>0) + { + startQuickIndexItem(t,"functions"+Doxygen::htmlFileExtension, + hli==HLI_Functions,compact,first); + t << fixSpaces(theTranslator->trCompoundMembers()); + endQuickIndexItem(t); + } + if (documentedFileMembers[FMHL_All]>0) + { + startQuickIndexItem(t,"globals"+Doxygen::htmlFileExtension, + hli==HLI_Globals,compact,first); + t << fixSpaces(theTranslator->trFileMembers()); + endQuickIndexItem(t); + } + if (indexedPages>0) + { + startQuickIndexItem(t,"pages"+Doxygen::htmlFileExtension, + hli==HLI_Pages,compact,first); + t << fixSpaces(theTranslator->trRelatedPages()); + endQuickIndexItem(t); + } + if (Doxygen::exampleSDict->count()>0) + { + startQuickIndexItem(t,"examples"+Doxygen::htmlFileExtension, + hli==HLI_Examples,compact,first); + t << fixSpaces(theTranslator->trExamples()); + endQuickIndexItem(t); + } + if (Config_getBool("SEARCHENGINE")) + { + if (compact) + { + t << " | "; + } + else + { + t << "
    • "; + } + t << "trSearchForIndex()); + if (searchFor.at(0)=='S') searchFor="S"+searchFor.mid(1); + t << "\">" << searchFor << " "; + if (hli!=HLI_Search) + { + t << "" + "
    • "; + } + } + if (hli!=HLI_Search) + { + if (compact) + { + t << "
    \n"; + } + else + { + t << "\n"; + } + } +} + +void HtmlGenerator::writeQuickLinks(bool compact,HighlightedItem hli) +{ + writeDefaultQuickLinks(t,compact,hli); +} + +void HtmlGenerator::writeSearchPage() +{ + if (Config_getBool("SEARCHENGINE") && Config_getBool("GENERATE_HTML")) + { + QCString fileName = Config_getString("HTML_OUTPUT")+"/search.php"; + QFile f(fileName); + if (f.open(IO_WriteOnly)) + { + QTextStream t(&f); + if (g_header.isEmpty()) + { + writeDefaultHeaderFile(t,"Search"); + } + else + { + t << substituteKeywords(g_header,"Search"); + } + t << "" << endl; + writeDefaultQuickLinks(t,TRUE,HLI_Search); + + t << "trSearchResultsTitle() << "\";\n"; + t << "}\n"; + t << "\n"; + t << "function matches_text($num)\n"; + t << "{\n"; + t << " if ($num==0)\n"; + t << " {\n"; + t << " return \"" << theTranslator->trSearchResults(0) << "\";\n"; + t << " }\n"; + t << " else if ($num==1)\n"; + t << " {\n"; + t << " return \"" << theTranslator->trSearchResults(1) << "\";\n"; + t << " }\n"; + t << " else // $num>1\n"; + t << " {\n"; + t << " return \"" << theTranslator->trSearchResults(2) << "\";\n"; + t << " }\n"; + t << "}\n"; + t << "\n"; + t << "function report_matches()\n"; + t << "{\n"; + t << " return \"" << theTranslator->trSearchMatches() << " \";\n"; + t << "}\n"; + t << "\n"; + t << search_script; + t << "\n"; + t << "?>\n"; + writePageFooter(t,"Search"); + } + } +} + diff --git a/src/htmlgen.h b/src/htmlgen.h index 103a193..47169e6 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -43,9 +43,8 @@ class HtmlGenerator : public OutputGenerator void printDoc(DocNode *); - void startFile(const char *name,const char *manName, - const char *title,bool external); - void writeFooter(int,bool); + void startFile(const char *name,const char *manName,const char *title); + void writeFooter(); void endFile(); void clearBuffer(); @@ -164,8 +163,9 @@ class HtmlGenerator : public OutputGenerator void endClassDiagram(ClassDiagram &,const char *,const char *); void startPageRef() {} void endPageRef(const char *,const char *) {} - void startQuickIndexItem(const char *,const char *); - void endQuickIndexItem(); + //void startQuickIndexItem(const char *,const char *); + //void endQuickIndexItem(); + void writeQuickLinks(bool compact,HighlightedItem hli); void writeNonBreakableSpace(int); void startDescTable() @@ -209,6 +209,7 @@ class HtmlGenerator : public OutputGenerator void writeCodeAnchor(const char *anchor) { t << ""; } + static void writeSearchPage(); private: QCString lastTitle; diff --git a/src/index.cpp b/src/index.cpp index c4d463a..e4fe138 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -36,52 +36,15 @@ #include "dot.h" #include "pagedef.h" -enum ClassMemberHighlight -{ - CMHL_All = 0, - CMHL_Functions, - CMHL_Variables, - CMHL_Typedefs, - CMHL_Enums, - CMHL_EnumValues, - CMHL_Related, - CMHL_Properties, - CMHL_Events, - CMHL_Total = CMHL_Events+1 -}; - -enum FileMemberHighlight -{ - FMHL_All = 0, - FMHL_Functions, - FMHL_Variables, - FMHL_Typedefs, - FMHL_Enums, - FMHL_EnumValues, - FMHL_Defines, - FMHL_Total = FMHL_Defines+1 -}; - -enum NamespaceMemberHighlight -{ - NMHL_All = 0, - NMHL_Functions, - NMHL_Variables, - NMHL_Typedefs, - NMHL_Enums, - NMHL_EnumValues, - NMHL_Total = FMHL_EnumValues+1 -}; - -static int annotatedClasses; -static int hierarchyClasses; -static int documentedFiles; -static int documentedGroups; -static int documentedNamespaces; -static int indexedPages; -static int documentedClassMembers[CMHL_Total]; -static int documentedFileMembers[FMHL_Total]; -static int documentedNamespaceMembers[NMHL_Total]; +int annotatedClasses; +int hierarchyClasses; +int documentedFiles; +int documentedGroups; +int documentedNamespaces; +int indexedPages; +int documentedClassMembers[CMHL_Total]; +int documentedFileMembers[FMHL_Total]; +int documentedNamespaceMembers[NMHL_Total]; int documentedHtmlFiles; int documentedPages; @@ -211,46 +174,21 @@ QCString abbreviate(const char *s,const char *name) //---------------------------------------------------------------------------- -static void startQuickIndexItem(OutputList &ol,const char *s,const char *l, +static void startQuickIndexItem(OutputList &ol,const char *l, bool hl,bool compact,bool &first) { if (!first && compact) ol.writeString(" | "); first=FALSE; if (!compact) ol.writeString("
  • "); - QCString *dest; - if (s) // external link + if (hl && compact) { - if (hl && compact) - { - ol.writeString(""); } @@ -260,141 +198,150 @@ static void endQuickIndexItem(OutputList &ol) ol.writeString(""); } + static QCString fixSpaces(const QCString &s) { return substitute(s," "," "); } -void writeQuickLinks(OutputList &ol,bool compact,HighlightedItem hli,bool ext=FALSE) -{ - bool first=TRUE; - ol.pushGeneratorState(); - ol.disableAllBut(OutputGenerator::Html); - QCString extLink; - if (ext) { extLink="_doc"; } - if (compact) - { - ol.writeString("
    "); - } - else - { - ol.startItemList(); - } - - if (Config_getBool("GENERATE_TREEVIEW")) - { - startQuickIndexItem(ol,extLink,"main"+Doxygen::htmlFileExtension, - hli==HLI_Main,compact,first); - } - else - { - startQuickIndexItem(ol,extLink,"index"+Doxygen::htmlFileExtension, - hli==HLI_Main,compact,first); - } - ol.parseText(fixSpaces(theTranslator->trMainPage())); - endQuickIndexItem(ol); - - if (documentedGroups>0) - { - startQuickIndexItem(ol,extLink,"modules"+Doxygen::htmlFileExtension, - hli==HLI_Modules,compact,first); - ol.parseText(fixSpaces(theTranslator->trModules())); - endQuickIndexItem(ol); - } - if (documentedNamespaces>0) - { - startQuickIndexItem(ol,extLink,"namespaces"+Doxygen::htmlFileExtension, - hli==HLI_Namespaces,compact,first); - if (Config_getBool("OPTIMIZE_OUTPUT_JAVA")) - { - ol.parseText(fixSpaces(theTranslator->trPackages())); - } - else - { - ol.parseText(theTranslator->trNamespaceList()); - } - endQuickIndexItem(ol); - } - if (hierarchyClasses>0) - { - startQuickIndexItem(ol,extLink,"hierarchy"+Doxygen::htmlFileExtension, - hli==HLI_Hierarchy,compact,first); - ol.parseText(fixSpaces(theTranslator->trClassHierarchy())); - endQuickIndexItem(ol); - } - if (annotatedClasses>0) - { - if (Config_getBool("ALPHABETICAL_INDEX")) - { - startQuickIndexItem(ol,extLink,"classes"+Doxygen::htmlFileExtension, - hli==HLI_Classes,compact,first); - ol.parseText(fixSpaces(theTranslator->trAlphabeticalList())); - endQuickIndexItem(ol); - } - if (!compact) ol.writeListItem(); - startQuickIndexItem(ol,extLink,"annotated"+Doxygen::htmlFileExtension, - hli==HLI_Annotated,compact,first); - ol.parseText(fixSpaces(theTranslator->trCompoundList())); - endQuickIndexItem(ol); - } - if (documentedHtmlFiles>0) - { - startQuickIndexItem(ol,extLink,"files"+Doxygen::htmlFileExtension, - hli==HLI_Files,compact,first); - ol.parseText(fixSpaces(theTranslator->trFileList())); - endQuickIndexItem(ol); - } - if (documentedNamespaceMembers[NMHL_All]>0) - { - startQuickIndexItem(ol,extLink,"namespacemembers"+Doxygen::htmlFileExtension, - hli==HLI_NamespaceMembers,compact,first); - ol.parseText(fixSpaces(theTranslator->trNamespaceMembers())); - endQuickIndexItem(ol); - } - if (documentedClassMembers[CMHL_All]>0) - { - startQuickIndexItem(ol,extLink,"functions"+Doxygen::htmlFileExtension, - hli==HLI_Functions,compact,first); - ol.parseText(fixSpaces(theTranslator->trCompoundMembers())); - endQuickIndexItem(ol); - } - if (documentedFileMembers[FMHL_All]>0) - { - startQuickIndexItem(ol,extLink,"globals"+Doxygen::htmlFileExtension, - hli==HLI_Globals,compact,first); - ol.parseText(fixSpaces(theTranslator->trFileMembers())); - endQuickIndexItem(ol); - } - if (indexedPages>0) - { - startQuickIndexItem(ol,extLink,"pages"+Doxygen::htmlFileExtension, - hli==HLI_Pages,compact,first); - ol.parseText(fixSpaces(theTranslator->trRelatedPages())); - endQuickIndexItem(ol); - } - if (Doxygen::exampleSDict->count()>0) - { - startQuickIndexItem(ol,extLink,"examples"+Doxygen::htmlFileExtension, - hli==HLI_Examples,compact,first); - ol.parseText(fixSpaces(theTranslator->trExamples())); - endQuickIndexItem(ol); - } - if (Config_getBool("SEARCHENGINE")) - { - startQuickIndexItem(ol,"_cgi","",hli==HLI_Search,compact,first); - ol.parseText(fixSpaces(theTranslator->trSearch())); - endQuickIndexItem(ol); - } - if (compact) - { - ol.writeString("
    \n"); - } - else - { - ol.endItemList(); - } - ol.popGeneratorState(); -} +//void writeQuickLinks(OutputList &ol,bool compact,HighlightedItem hli,bool ext=FALSE) +//{ +// bool first=TRUE; +// ol.pushGeneratorState(); +// ol.disableAllBut(OutputGenerator::Html); +// QCString extLink; +// if (ext) { extLink="_doc"; } +// if (compact) +// { +// ol.writeString("
    "); +// } +// else +// { +// ol.startItemList(); +// } +// +// if (Config_getBool("SEARCHENGINE")) +// { +// ol.writeString("
    \n"); +// } +// +// if (Config_getBool("GENERATE_TREEVIEW")) +// { +// startQuickIndexItem(ol,extLink,"main"+Doxygen::htmlFileExtension, +// hli==HLI_Main,compact,first); +// } +// else +// { +// startQuickIndexItem(ol,extLink,"index"+Doxygen::htmlFileExtension, +// hli==HLI_Main,compact,first); +// } +// ol.parseText(fixSpaces(theTranslator->trMainPage())); +// endQuickIndexItem(ol); +// +// if (documentedGroups>0) +// { +// startQuickIndexItem(ol,extLink,"modules"+Doxygen::htmlFileExtension, +// hli==HLI_Modules,compact,first); +// ol.parseText(fixSpaces(theTranslator->trModules())); +// endQuickIndexItem(ol); +// } +// if (documentedNamespaces>0) +// { +// startQuickIndexItem(ol,extLink,"namespaces"+Doxygen::htmlFileExtension, +// hli==HLI_Namespaces,compact,first); +// if (Config_getBool("OPTIMIZE_OUTPUT_JAVA")) +// { +// ol.parseText(fixSpaces(theTranslator->trPackages())); +// } +// else +// { +// ol.parseText(theTranslator->trNamespaceList()); +// } +// endQuickIndexItem(ol); +// } +// if (hierarchyClasses>0) +// { +// startQuickIndexItem(ol,extLink,"hierarchy"+Doxygen::htmlFileExtension, +// hli==HLI_Hierarchy,compact,first); +// ol.parseText(fixSpaces(theTranslator->trClassHierarchy())); +// endQuickIndexItem(ol); +// } +// if (annotatedClasses>0) +// { +// if (Config_getBool("ALPHABETICAL_INDEX")) +// { +// startQuickIndexItem(ol,extLink,"classes"+Doxygen::htmlFileExtension, +// hli==HLI_Classes,compact,first); +// ol.parseText(fixSpaces(theTranslator->trAlphabeticalList())); +// endQuickIndexItem(ol); +// } +// if (!compact) ol.writeListItem(); +// startQuickIndexItem(ol,extLink,"annotated"+Doxygen::htmlFileExtension, +// hli==HLI_Annotated,compact,first); +// ol.parseText(fixSpaces(theTranslator->trCompoundList())); +// endQuickIndexItem(ol); +// } +// if (documentedHtmlFiles>0) +// { +// startQuickIndexItem(ol,extLink,"files"+Doxygen::htmlFileExtension, +// hli==HLI_Files,compact,first); +// ol.parseText(fixSpaces(theTranslator->trFileList())); +// endQuickIndexItem(ol); +// } +// if (documentedNamespaceMembers[NMHL_All]>0) +// { +// startQuickIndexItem(ol,extLink,"namespacemembers"+Doxygen::htmlFileExtension, +// hli==HLI_NamespaceMembers,compact,first); +// ol.parseText(fixSpaces(theTranslator->trNamespaceMembers())); +// endQuickIndexItem(ol); +// } +// if (documentedClassMembers[CMHL_All]>0) +// { +// startQuickIndexItem(ol,extLink,"functions"+Doxygen::htmlFileExtension, +// hli==HLI_Functions,compact,first); +// ol.parseText(fixSpaces(theTranslator->trCompoundMembers())); +// endQuickIndexItem(ol); +// } +// if (documentedFileMembers[FMHL_All]>0) +// { +// startQuickIndexItem(ol,extLink,"globals"+Doxygen::htmlFileExtension, +// hli==HLI_Globals,compact,first); +// ol.parseText(fixSpaces(theTranslator->trFileMembers())); +// endQuickIndexItem(ol); +// } +// if (indexedPages>0) +// { +// startQuickIndexItem(ol,extLink,"pages"+Doxygen::htmlFileExtension, +// hli==HLI_Pages,compact,first); +// ol.parseText(fixSpaces(theTranslator->trRelatedPages())); +// endQuickIndexItem(ol); +// } +// if (Doxygen::exampleSDict->count()>0) +// { +// startQuickIndexItem(ol,extLink,"examples"+Doxygen::htmlFileExtension, +// hli==HLI_Examples,compact,first); +// ol.parseText(fixSpaces(theTranslator->trExamples())); +// endQuickIndexItem(ol); +// } +// if (Config_getBool("SEARCHENGINE")) +// { +// //startQuickIndexItem(ol,"_cgi","",hli==HLI_Search,compact,first); +// //ol.parseText(fixSpaces(theTranslator->trSearch())); +// //endQuickIndexItem(ol); +// ol.writeString(" | Search for " +// "" +// ""); +// } +// if (compact) +// { +// ol.writeString("
    \n"); +// } +// else +// { +// ol.endItemList(); +// } +// ol.popGeneratorState(); +//} void startTitle(OutputList &ol,const char *fileName) { @@ -410,30 +357,30 @@ void endTitle(OutputList &ol,const char *fileName,const char *name) } void startFile(OutputList &ol,const char *name,const char *manName, - const char *title,bool external,HighlightedItem hli) + const char *title,HighlightedItem hli) { - ol.startFile(name,manName,title,external); - if (!Config_getBool("DISABLE_INDEX")) writeQuickLinks(ol,TRUE,hli,external); + ol.startFile(name,manName,title); + if (!Config_getBool("DISABLE_INDEX")) ol.writeQuickLinks(TRUE,hli); } -void endFile(OutputList &ol,bool external) +void endFile(OutputList &ol,bool) { ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); - ol.writeFooter(0,external); // write the footer - if (Config_getString("HTML_FOOTER").isEmpty()) - { - ol.parseText(theTranslator->trGeneratedAt( - dateToString(TRUE), - Config_getString("PROJECT_NAME") - )); - } - ol.writeFooter(1,external); // write the link to the picture + ol.writeFooter(); // write the footer + //if (Config_getString("HTML_FOOTER").isEmpty()) + //{ + // ol.parseText(theTranslator->trGeneratedAt( + // dateToString(TRUE), + // Config_getString("PROJECT_NAME") + // )); + //} + //ol.writeFooter(1,external); // write the link to the picture //if (Config_getString("HTML_FOOTER").isEmpty()) //{ // parseText(ol,theTranslator->trWrittenBy()); //} - ol.writeFooter(2,external); // end the footer + //ol.writeFooter(2,external); // end the footer ol.popGeneratorState(); ol.endFile(); } @@ -787,7 +734,7 @@ void writeHierarchicalIndex(OutputList &ol) if (hierarchyClasses==0) return; ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); - startFile(ol,"hierarchy",0,"Hierarchical Index",FALSE,HLI_Hierarchy); + startFile(ol,"hierarchy",0,"Hierarchical Index",HLI_Hierarchy); startTitle(ol,0); QCString title = theTranslator->trClassHierarchy(); QCString htmlHelpTitle = title; @@ -917,7 +864,7 @@ void writeFileIndex(OutputList &ol) ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); if (documentedFiles==0) ol.disableAllBut(OutputGenerator::Html); - startFile(ol,"files",0,"File Index",FALSE,HLI_Files); + startFile(ol,"files",0,"File Index",HLI_Files); startTitle(ol,0); QCString title = theTranslator->trFileList(); QCString htmlHelpTitle = title; @@ -1095,9 +1042,10 @@ void writeFileIndex(OutputList &ol) //ol.docify(" ("); ol.parseDoc( fd->briefFile(),fd->briefLine(), - 0,0, + fd,0, abbreviate(fd->briefDescription(),fd->name()), - FALSE + FALSE, // index words + FALSE // isExample ); //ol.docify(")"); } @@ -1152,12 +1100,12 @@ void writeNamespaceIndex(OutputList &ol) QCString title; if (Config_getBool("OPTIMIZE_OUTPUT_JAVA")) { - startFile(ol,"namespaces",0,"Package Index",FALSE,HLI_Namespaces); + startFile(ol,"namespaces",0,"Package Index",HLI_Namespaces); title = theTranslator->trPackageList(); } else { - startFile(ol,"namespaces",0,"Namespace Index",FALSE,HLI_Namespaces); + startFile(ol,"namespaces",0,"Namespace Index",HLI_Namespaces); title = theTranslator->trNamespaceList(); } startTitle(ol,0); @@ -1220,9 +1168,10 @@ void writeNamespaceIndex(OutputList &ol) //ol.docify(" ("); ol.parseDoc( nd->briefFile(),nd->briefLine(), - nd->name(),0, + nd,0, abbreviate(nd->briefDescription(),nd->displayName()), - FALSE + FALSE, // index words + FALSE // isExample ); //ol.docify(")"); } @@ -1297,9 +1246,10 @@ void writeAnnotatedClassList(OutputList &ol) { ol.parseDoc( cd->briefFile(),cd->briefLine(), - cd->name(),0, + cd,0, abbreviate(cd->briefDescription(),cd->name()), - FALSE + FALSE, // indexWords + FALSE // isExample ); } ol.endIndexValue(cd->getOutputFileBase(),hasBrief); @@ -1343,7 +1293,7 @@ void writeAnnotatedClassList(OutputList &ol) // //ol.docify(" ("); // parseDoc(ol, // pd->getDefFileName(),pd->getDefLine(), -// pd->name(),0, +// pd,0, // abbreviate(pd->briefDescription(),pd->name())); // //ol.docify(")"); // } @@ -1542,7 +1492,7 @@ void writeAlphabeticalIndex(OutputList &ol) if (annotatedClasses==0) return; ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); - startFile(ol,"classes"+Doxygen::htmlFileExtension,0,"Alphabetical index",FALSE,HLI_Classes); + startFile(ol,"classes"+Doxygen::htmlFileExtension,0,"Alphabetical index",HLI_Classes); startTitle(ol,0); ol.parseText(Config_getString("PROJECT_NAME")+" "+theTranslator->trCompoundIndex()); endTitle(ol,0,0); @@ -1563,7 +1513,7 @@ void writeAnnotatedIndex(OutputList &ol) ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); - startFile(ol,"annotated",0,"Annotated Index",FALSE,HLI_Annotated); + startFile(ol,"annotated",0,"Annotated Index",HLI_Annotated); startTitle(ol,0); QCString title = theTranslator->trCompoundList(); QCString htmlHelpTitle = title; @@ -1806,7 +1756,7 @@ void writeQuickMemberIndex(OutputList &ol,bool *charUsed) char is[2];is[0]=(char)i;is[1]='\0'; if (charUsed[i]) { - startQuickIndexItem(ol,0,anchor+is,FALSE,TRUE,first); + startQuickIndexItem(ol,anchor+is,FALSE,TRUE,first); ol.writeString(is); endQuickIndexItem(ol); first=FALSE; @@ -1824,7 +1774,7 @@ static void writeMemberIndexFiltered(OutputList &ol, if (documentedClassMembers[hl]==0) return; ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); - startFile(ol,fileName,0,"Compound Member Index",FALSE,HLI_Functions); + startFile(ol,fileName,0,"Compound Member Index",HLI_Functions); QCString title = theTranslator->trCompoundMembers(); QCString htmlHelpTitle = title; QCString ftvHelpTitle = title; @@ -1836,63 +1786,63 @@ static void writeMemberIndexFiltered(OutputList &ol, ol.writeString("
    "); bool first=TRUE; - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "functions"+Doxygen::htmlFileExtension,hl==CMHL_All,TRUE,first); ol.writeString(fixSpaces(theTranslator->trAll())); endQuickIndexItem(ol); if (documentedClassMembers[CMHL_Functions]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "functions_func"+Doxygen::htmlFileExtension,hl==CMHL_Functions,TRUE,first); ol.writeString(fixSpaces(theTranslator->trFunctions())); endQuickIndexItem(ol); } if (documentedClassMembers[CMHL_Variables]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "functions_vars"+Doxygen::htmlFileExtension,hl==CMHL_Variables,TRUE,first); ol.writeString(fixSpaces(theTranslator->trVariables())); endQuickIndexItem(ol); } if (documentedClassMembers[CMHL_Typedefs]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "functions_type"+Doxygen::htmlFileExtension,hl==CMHL_Typedefs,TRUE,first); ol.writeString(fixSpaces(theTranslator->trTypedefs())); endQuickIndexItem(ol); } if (documentedClassMembers[CMHL_Enums]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "functions_enum"+Doxygen::htmlFileExtension,hl==CMHL_Enums,TRUE,first); ol.writeString(fixSpaces(theTranslator->trEnumerations())); endQuickIndexItem(ol); } if (documentedClassMembers[CMHL_EnumValues]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "functions_eval"+Doxygen::htmlFileExtension,hl==CMHL_EnumValues,TRUE,first); ol.writeString(fixSpaces(theTranslator->trEnumerationValues())); endQuickIndexItem(ol); } if (documentedClassMembers[CMHL_Properties]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "functions_prop"+Doxygen::htmlFileExtension,hl==CMHL_Properties,TRUE,first); ol.writeString(fixSpaces(theTranslator->trProperties())); endQuickIndexItem(ol); } if (documentedClassMembers[CMHL_Events]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "functions_evnt"+Doxygen::htmlFileExtension,hl==CMHL_Events,TRUE,first); ol.writeString(fixSpaces(theTranslator->trEvents())); endQuickIndexItem(ol); } if (documentedClassMembers[CMHL_Related]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "functions_rela"+Doxygen::htmlFileExtension,hl==CMHL_Related,TRUE,first); ol.writeString(fixSpaces(theTranslator->trRelatedFunctions())); endQuickIndexItem(ol); @@ -2214,7 +2164,7 @@ static void writeFileMemberIndexFiltered(OutputList &ol, if (documentedFileMembers[hl]==0) return; ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); - startFile(ol,fileName,0,"File Member Index",FALSE,HLI_Globals); + startFile(ol,fileName,0,"File Member Index",HLI_Globals); QCString title = theTranslator->trFileMembers(); QCString htmlHelpTitle = title; QCString ftvHelpTitle = title; @@ -2222,49 +2172,49 @@ static void writeFileMemberIndexFiltered(OutputList &ol, ol.writeString("
    "); bool first=TRUE; - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "globals"+Doxygen::htmlFileExtension,hl==FMHL_All,TRUE,first); ol.writeString(fixSpaces(theTranslator->trAll())); endQuickIndexItem(ol); if (documentedFileMembers[FMHL_Functions]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "globals_func"+Doxygen::htmlFileExtension,hl==FMHL_Functions,TRUE,first); ol.writeString(fixSpaces(theTranslator->trFunctions())); endQuickIndexItem(ol); } if (documentedFileMembers[FMHL_Variables]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "globals_vars"+Doxygen::htmlFileExtension,hl==FMHL_Variables,TRUE,first); ol.writeString(fixSpaces(theTranslator->trVariables())); endQuickIndexItem(ol); } if (documentedFileMembers[FMHL_Typedefs]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "globals_type"+Doxygen::htmlFileExtension,hl==FMHL_Typedefs,TRUE,first); ol.writeString(fixSpaces(theTranslator->trTypedefs())); endQuickIndexItem(ol); } if (documentedFileMembers[FMHL_Enums]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "globals_enum"+Doxygen::htmlFileExtension,hl==FMHL_Enums,TRUE,first); ol.writeString(fixSpaces(theTranslator->trEnumerations())); endQuickIndexItem(ol); } if (documentedFileMembers[FMHL_EnumValues]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "globals_eval"+Doxygen::htmlFileExtension,hl==FMHL_EnumValues,TRUE,first); ol.writeString(fixSpaces(theTranslator->trEnumerationValues())); endQuickIndexItem(ol); } if (documentedFileMembers[FMHL_Defines]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "globals_defs"+Doxygen::htmlFileExtension,hl==FMHL_Defines,TRUE,first); ol.writeString(fixSpaces(theTranslator->trDefines())); endQuickIndexItem(ol); @@ -2322,7 +2272,7 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol, if (documentedNamespaceMembers[hl]==0) return; ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); - startFile(ol,fileName,0,"Namespace Member Index",FALSE,HLI_NamespaceMembers); + startFile(ol,fileName,0,"Namespace Member Index",HLI_NamespaceMembers); QCString title = theTranslator->trNamespaceMembers(); QCString htmlHelpTitle = title; QCString ftvHelpTitle = title; @@ -2334,42 +2284,42 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol, ol.writeString("
    "); bool first=TRUE; - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "namespacemembers"+Doxygen::htmlFileExtension,hl==NMHL_All,TRUE,first); ol.writeString(fixSpaces(theTranslator->trAll())); endQuickIndexItem(ol); if (documentedNamespaceMembers[NMHL_Functions]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "namespacemembers_func"+Doxygen::htmlFileExtension,hl==NMHL_Functions,TRUE,first); ol.writeString(fixSpaces(theTranslator->trFunctions())); endQuickIndexItem(ol); } if (documentedNamespaceMembers[NMHL_Variables]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "namespacemembers_vars"+Doxygen::htmlFileExtension,hl==NMHL_Variables,TRUE,first); ol.writeString(fixSpaces(theTranslator->trVariables())); endQuickIndexItem(ol); } if (documentedNamespaceMembers[NMHL_Typedefs]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "namespacemembers_type"+Doxygen::htmlFileExtension,hl==NMHL_Typedefs,TRUE,first); ol.writeString(fixSpaces(theTranslator->trTypedefs())); endQuickIndexItem(ol); } if (documentedNamespaceMembers[NMHL_Enums]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "namespacemembers_enum"+Doxygen::htmlFileExtension,hl==NMHL_Enums,TRUE,first); ol.writeString(fixSpaces(theTranslator->trEnumerations())); endQuickIndexItem(ol); } if (documentedNamespaceMembers[NMHL_EnumValues]>0) { - startQuickIndexItem(ol,0, + startQuickIndexItem(ol, "namespacemembers_eval"+Doxygen::htmlFileExtension,hl==NMHL_EnumValues,TRUE,first); ol.writeString(fixSpaces(theTranslator->trEnumerationValues())); endQuickIndexItem(ol); @@ -2422,7 +2372,7 @@ void writeExampleIndex(OutputList &ol) if (Doxygen::exampleSDict->count()==0) return; ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); - startFile(ol,"examples",0,"Example Index",FALSE,HLI_Examples); + startFile(ol,"examples",0,"Example Index",HLI_Examples); startTitle(ol,0); QCString title = theTranslator->trExamples(); QCString htmlHelpTitle = title; @@ -2510,7 +2460,7 @@ void writePageIndex(OutputList &ol) if (indexedPages==0) return; ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); - startFile(ol,"pages",0,"Page Index",FALSE,HLI_Pages); + startFile(ol,"pages",0,"Page Index",HLI_Pages); startTitle(ol,0); QCString title = theTranslator->trRelatedPages(); QCString htmlHelpTitle = title; @@ -2611,7 +2561,7 @@ void writeGraphInfo(OutputList &ol) bool oldStripCommentsState = Config_getBool("STRIP_CODE_COMMENTS"); // temporarily disable the stripping of comments for our own code example! Config_getBool("STRIP_CODE_COMMENTS") = FALSE; - ol.parseDoc("graph_legend",1,0,0,theTranslator->trLegendDocs(),FALSE); + ol.parseDoc("graph_legend",1,0,0,theTranslator->trLegendDocs(),FALSE,FALSE); Config_getBool("STRIP_CODE_COMMENTS") = oldStripCommentsState; endFile(ol); ol.popGeneratorState(); @@ -2976,7 +2926,7 @@ void writeGroupList(OutputList &ol) ol.endDescItem(); parseDoc(ol, gd->briefFile(),gd->briefLine(), - 0,0,gd->briefDescription()); + gd,0,gd->briefDescription()); ol.newParagraph(); //} @@ -3011,7 +2961,7 @@ void writeGroupIndex(OutputList &ol) if (documentedGroups==0) return; ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); - startFile(ol,"modules",0,"Module Index",FALSE,HLI_Modules); + startFile(ol,"modules",0,"Module Index",HLI_Modules); startTitle(ol,0); QCString title = theTranslator->trModules(); QCString htmlHelpTitle = title; @@ -3087,7 +3037,7 @@ void writeIndex(OutputList &ol) QCString indexName="index"; if (Config_getBool("GENERATE_TREEVIEW")) indexName="main"; - ol.startFile(indexName,0,title,FALSE); + ol.startFile(indexName,0,title); bool &generateHtml = Config_getBool("GENERATE_HTML") ; bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP"); @@ -3101,13 +3051,13 @@ void writeIndex(OutputList &ol) FTVHelp::getInstance()->addContentsItem(FALSE,0,indexName,0,title); } - if (!Config_getBool("DISABLE_INDEX")) writeQuickLinks(ol,TRUE,HLI_Main); + if (!Config_getBool("DISABLE_INDEX")) ol.writeQuickLinks(TRUE,HLI_Main); ol.startTitleHead(0); if (Doxygen::mainPage && !Doxygen::mainPage->title().isEmpty()) { if (Doxygen::mainPage->title().lower()!="notitle") { - ol.parseDoc(defFileName,defLine,0,0,Doxygen::mainPage->title(),FALSE); + ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Doxygen::mainPage->title(),TRUE,FALSE); } } else @@ -3122,16 +3072,16 @@ void writeIndex(OutputList &ol) if (!Config_getString("PROJECT_NUMBER").isEmpty()) { ol.startProjectNumber(); - ol.parseDoc(defFileName,defLine,0,0,Config_getString("PROJECT_NUMBER"),FALSE); + ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Config_getString("PROJECT_NUMBER"),TRUE,FALSE); ol.endProjectNumber(); } - if (Config_getBool("DISABLE_INDEX") && Doxygen::mainPage==0) writeQuickLinks(ol,FALSE,HLI_Main); + if (Config_getBool("DISABLE_INDEX") && Doxygen::mainPage==0) ol.writeQuickLinks(FALSE,HLI_Main); if (Doxygen::mainPage) { Doxygen::insideMainPage=TRUE; - ol.parseDoc(defFileName,defLine,0,0, - Doxygen::mainPage->documentation(),FALSE + ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0, + Doxygen::mainPage->documentation(),TRUE,FALSE /*,Doxygen::mainPage->sectionDict*/); if (!Config_getString("GENERATE_TAGFILE").isEmpty()) @@ -3162,7 +3112,7 @@ void writeIndex(OutputList &ol) ol.enable(OutputGenerator::Latex); ol.enable(OutputGenerator::RTF); - ol.startFile("refman",0,0,FALSE); + ol.startFile("refman",0,0); ol.startIndexSection(isTitlePageStart); if (!Config_getString("LATEX_HEADER").isEmpty()) { @@ -3173,7 +3123,7 @@ void writeIndex(OutputList &ol) if (!Config_getString("PROJECT_NUMBER").isEmpty()) { ol.startProjectNumber(); - ol.parseDoc(defFileName,defLine,0,0,Config_getString("PROJECT_NUMBER"),FALSE); + ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Config_getString("PROJECT_NUMBER"),FALSE,FALSE); ol.endProjectNumber(); } ol.endIndexSection(isTitlePageStart); @@ -3187,7 +3137,7 @@ void writeIndex(OutputList &ol) ol.startIndexSection(isMainPage); if (!Doxygen::mainPage->title().isEmpty()) { - ol.parseDoc(defFileName,defLine,0,0,Doxygen::mainPage->title(),FALSE); + ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Doxygen::mainPage->title(),FALSE,FALSE); } else { @@ -3281,8 +3231,8 @@ void writeIndex(OutputList &ol) ol.disable(OutputGenerator::Man); startFile(ol,Doxygen::mainPage->name(),0,Doxygen::mainPage->title()); ol.startTextBlock(); - ol.parseDoc(defFileName,defLine,0,0, - Doxygen::mainPage->documentation(),FALSE + ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0, + Doxygen::mainPage->documentation(),FALSE,FALSE /*,Doxygen::mainPage->sectionDict*/); ol.endTextBlock(); endFile(ol); @@ -3293,3 +3243,5 @@ void writeIndex(OutputList &ol) ol.popGeneratorState(); } + + diff --git a/src/index.h b/src/index.h index c4e8f8d..042b641 100644 --- a/src/index.h +++ b/src/index.h @@ -69,22 +69,6 @@ void writePackageIndex(OutputList &ol); void countDataStructures(); -#if 0 -extern int annotatedClasses; -extern int hierarchyClasses; -extern int documentedFunctions; -extern int documentedMembers; -extern int documentedDefines; -extern int documentedFiles; -extern int documentedGroups; -extern int documentedNamespaces; -extern int documentedNamespaceMembers; -extern int documentedIncludeFiles; -extern int indexedPages; -#endif -extern int documentedHtmlFiles; -extern int documentedPages; - enum HighlightedItem { HLI_None=0, @@ -103,10 +87,59 @@ enum HighlightedItem HLI_Search }; +enum ClassMemberHighlight +{ + CMHL_All = 0, + CMHL_Functions, + CMHL_Variables, + CMHL_Typedefs, + CMHL_Enums, + CMHL_EnumValues, + CMHL_Related, + CMHL_Properties, + CMHL_Events, + CMHL_Total = CMHL_Events+1 +}; + +enum FileMemberHighlight +{ + FMHL_All = 0, + FMHL_Functions, + FMHL_Variables, + FMHL_Typedefs, + FMHL_Enums, + FMHL_EnumValues, + FMHL_Defines, + FMHL_Total = FMHL_Defines+1 +}; + +enum NamespaceMemberHighlight +{ + NMHL_All = 0, + NMHL_Functions, + NMHL_Variables, + NMHL_Typedefs, + NMHL_Enums, + NMHL_EnumValues, + NMHL_Total = FMHL_EnumValues+1 +}; + +extern int annotatedClasses; +extern int hierarchyClasses; +extern int documentedFiles; +extern int documentedGroups; +extern int documentedNamespaces; +extern int indexedPages; +extern int documentedClassMembers[CMHL_Total]; +extern int documentedFileMembers[FMHL_Total]; +extern int documentedNamespaceMembers[NMHL_Total]; +extern int documentedHtmlFiles; +extern int documentedPages; + void startTitle(OutputList &ol,const char *fileName); void endTitle(OutputList &ol,const char *fileName,const char *name); void startFile(OutputList &ol,const char *name,const char *manName, - const char *title,bool external=FALSE,HighlightedItem hli=HLI_None); + const char *title,HighlightedItem hli=HLI_None); void endFile(OutputList &ol,bool external=FALSE); #endif diff --git a/src/language.cpp b/src/language.cpp index eb2dcb9..e6e052d 100644 --- a/src/language.cpp +++ b/src/language.cpp @@ -26,7 +26,7 @@ #include "translator_nl.h" #endif #ifdef LANG_SE -//#include "translator_se.h" +#include "translator_se.h" #endif #ifdef LANG_CZ #include "translator_cz.h" @@ -138,9 +138,7 @@ bool setTranslator(const char *langName) #ifdef LANG_SE else if (L_EQUAL("swedish")) { - //theTranslator=new TranslatorSwedish; - theTranslator=new TranslatorEnglish; - err(obsoleteMsg); + theTranslator=new TranslatorSwedish; } #endif #ifdef LANG_CZ diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index bc20db5..459fddb 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -157,6 +157,11 @@ void LatexDocVisitor::visit(DocSymbol *s) else m_t << "\\^{" << s->letter() << "}"; break; + case DocSymbol::Slash: if (tolower(s->letter())=='o') + m_t << "\\" << s->letter(); + else + m_t << s->letter(); + break; case DocSymbol::Tilde: m_t << "\\~{" << s->letter() << "}"; break; case DocSymbol::Szlig: m_t << "\"s"; break; case DocSymbol::Cedil: m_t << "\\c{" << s->letter() << "}"; break; @@ -405,33 +410,33 @@ void LatexDocVisitor::visitPre(DocSimpleSect *s) switch(s->type()) { case DocSimpleSect::See: - m_t << theTranslator->trSeeAlso(); break; + filter(theTranslator->trSeeAlso()); break; case DocSimpleSect::Return: - m_t << theTranslator->trReturns(); break; + filter(theTranslator->trReturns()); break; case DocSimpleSect::Author: - m_t << theTranslator->trAuthor(TRUE,TRUE); break; + filter(theTranslator->trAuthor(TRUE,TRUE)); break; case DocSimpleSect::Authors: - m_t << theTranslator->trAuthor(TRUE,FALSE); break; + filter(theTranslator->trAuthor(TRUE,FALSE)); break; case DocSimpleSect::Version: - m_t << theTranslator->trVersion(); break; + filter(theTranslator->trVersion()); break; case DocSimpleSect::Since: - m_t << theTranslator->trSince(); break; + filter(theTranslator->trSince()); break; case DocSimpleSect::Date: - m_t << theTranslator->trDate(); break; + filter(theTranslator->trDate()); break; case DocSimpleSect::Note: - m_t << theTranslator->trNote(); break; + filter(theTranslator->trNote()); break; case DocSimpleSect::Warning: - m_t << theTranslator->trWarning(); break; + filter(theTranslator->trWarning()); break; case DocSimpleSect::Pre: - m_t << theTranslator->trPrecondition(); break; + filter(theTranslator->trPrecondition()); break; case DocSimpleSect::Post: - m_t << theTranslator->trPostcondition(); break; + filter(theTranslator->trPostcondition()); break; case DocSimpleSect::Invar: - m_t << theTranslator->trInvariant(); break; + filter(theTranslator->trInvariant()); break; case DocSimpleSect::Remark: - m_t << theTranslator->trRemarks(); break; + filter(theTranslator->trRemarks()); break; case DocSimpleSect::Attention: - m_t << theTranslator->trAttention(); break; + filter(theTranslator->trAttention()); break; case DocSimpleSect::User: break; case DocSimpleSect::Rcs: break; case DocSimpleSect::Unknown: break; @@ -636,7 +641,7 @@ void LatexDocVisitor::visitPre(DocInternal *) { if (m_hide) return; m_t << "\\begin{Desc}" << endl - << "\\item[" << theTranslator->trForInternalUseOnly() << "]" << endl; + << "\\item["; filter(theTranslator->trForInternalUseOnly()); m_t << "]" << endl; } void LatexDocVisitor::visitPost(DocInternal *) @@ -806,14 +811,14 @@ void LatexDocVisitor::visitPost(DocLink *lnk) void LatexDocVisitor::visitPre(DocRef *ref) { if (m_hide) return; - startLink(ref->ref(),ref->file(),ref->anchor()); + if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor()); if (!ref->hasLinkText()) filter(ref->targetTitle()); } void LatexDocVisitor::visitPost(DocRef *ref) { if (m_hide) return; - endLink(ref->ref(),ref->file(),ref->anchor()); + if (!ref->file().isEmpty()) endLink(ref->ref(),ref->file(),ref->anchor()); } void LatexDocVisitor::visitPre(DocSecRefItem *) @@ -871,11 +876,11 @@ void LatexDocVisitor::visitPre(DocParamSect *s) switch(s->type()) { case DocParamSect::Param: - m_t << theTranslator->trParameters(); break; + filter(theTranslator->trParameters()); break; case DocParamSect::RetVal: - m_t << theTranslator->trReturnValues(); break; + filter(theTranslator->trReturnValues()); break; case DocParamSect::Exception: - m_t << theTranslator->trExceptions(); break; + filter(theTranslator->trExceptions()); break; default: ASSERT(0); } @@ -991,7 +996,7 @@ void LatexDocVisitor::endLink(const QString &ref,const QString &file,const QStri m_t << "}"; if (ref.isEmpty() && !Config_getBool("PDF_HYPERLINKS")) { - m_t << "{\\rm (" << theTranslator->trPageAbbreviation(); + m_t << "{\\rm ("; filter(theTranslator->trPageAbbreviation()); m_t << "\\,\\pageref{" << file; if (!anchor.isEmpty()) m_t << "_" << anchor; m_t << "})}"; diff --git a/src/latexgen.cpp b/src/latexgen.cpp index a82b854..c931954 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -221,7 +221,7 @@ void LatexGenerator::init() t << endl << "clean:" << endl - << "\trm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out" << endl; + << "\trm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.pdf" << endl; } static void writeDefaultHeaderPart1(QTextStream &t) @@ -435,7 +435,7 @@ void LatexGenerator::writeStyleSheetFile(QFile &f) writeDefaultStyleSheetPart3(t); } -void LatexGenerator::startFile(const char *name,const char *,const char *,bool) +void LatexGenerator::startFile(const char *name,const char *,const char *) { QCString fileName=name; if (fileName.right(4)!=".tex" && fileName.right(4)!=".sty") fileName+=".tex"; diff --git a/src/latexgen.h b/src/latexgen.h index 5570002..f62f9a2 100644 --- a/src/latexgen.h +++ b/src/latexgen.h @@ -44,9 +44,8 @@ class LatexGenerator : public OutputGenerator void printDoc(DocNode *); - void startFile(const char *name,const char *manName, - const char *title, bool external); - void writeFooter(int,bool) {} + void startFile(const char *name,const char *manName,const char *title); + void writeFooter() {} void endFile(); void clearBuffer(); @@ -234,8 +233,9 @@ class LatexGenerator : public OutputGenerator //void endColorFont() {} void startPageRef(); void endPageRef(const char *,const char *); - void startQuickIndexItem(const char *,const char *) {} - void endQuickIndexItem() {} + //void startQuickIndexItem(const char *,const char *) {} + //void endQuickIndexItem() {} + void writeQuickLinks(bool,HighlightedItem) {} //void writeFormula(const char *,const char *); void writeNonBreakableSpace(int); //void startImage(const char *,const char *,bool); diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in index a43ae1a..2944c2a 100644 --- a/src/libdoxygen.pro.in +++ b/src/libdoxygen.pro.in @@ -79,9 +79,9 @@ HEADERS = bufstr.h \ rtfstyle.h \ scanner.h \ searchindex.h \ + search_php.h \ section.h \ sortdict.h \ - suffixtree.h \ tagreader.h \ translator.h \ translator_adapter.h \ @@ -173,7 +173,6 @@ SOURCES = ce_lex.cpp \ rtfstyle.cpp \ scanner.cpp \ searchindex.cpp \ - suffixtree.cpp \ tagreader.cpp \ translator.cpp \ util.cpp \ diff --git a/src/libdoxygen.t b/src/libdoxygen.t index 1008cd9..48f34ee 100644 --- a/src/libdoxygen.t +++ b/src/libdoxygen.t @@ -82,3 +82,6 @@ index_xsd.h: index.xsd compound_xsd.h: compound.xsd cat compound.xsd | sed -e "s/\\\\/\\\\\\\\/g" -e "s/\"/\\\\\"/g" -e "s/^/\"/g" -e "s/$$/\\\\n\"/g" >compound_xsd.h +search_php.h: search.php + cat search.php | sed -e "s/\\\\/\\\\\\\\/g" -e "s/\"/\\\\\"/g" -e "s/^/\"/g" -e "s/$$/\\\\n\"/g" >search_php.h + diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index 2908460..341a50d 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -89,6 +89,7 @@ void ManDocVisitor::visit(DocSymbol *s) case DocSymbol::Acute: m_t << s->letter() << "\\*(`"; break; case DocSymbol::Grave: m_t << s->letter() << "\\*:"; break; case DocSymbol::Circ: m_t << s->letter() << "\\*^"; break; + case DocSymbol::Slash: m_t << s->letter(); break; /* todo: implement this */ case DocSymbol::Tilde: m_t << s->letter() << "\\*~"; break; case DocSymbol::Szlig: m_t << "s\\*:"; break; case DocSymbol::Cedil: m_t << s->letter() << "\\*,"; break; diff --git a/src/mangen.cpp b/src/mangen.cpp index 77cc5ce..673636e 100644 --- a/src/mangen.cpp +++ b/src/mangen.cpp @@ -137,8 +137,7 @@ static QCString buildFileName(const char *name) return fileName; } -void ManGenerator::startFile(const char *,const char *manName, - const char *,bool) +void ManGenerator::startFile(const char *,const char *manName,const char *) { startPlainFile( buildFileName( manName ) ); firstCol=TRUE; diff --git a/src/mangen.h b/src/mangen.h index d628358..94077d6 100644 --- a/src/mangen.h +++ b/src/mangen.h @@ -42,9 +42,8 @@ class ManGenerator : public OutputGenerator void printDoc(DocNode *); static void init(); - void startFile(const char *name,const char *manName, - const char *title,bool external); - void writeFooter(int,bool) {} + void startFile(const char *name,const char *manName,const char *title); + void writeFooter() {} void endFile(); void clearBuffer(); @@ -207,8 +206,9 @@ class ManGenerator : public OutputGenerator //void endColorFont() {} void startPageRef() {} void endPageRef(const char *,const char *) {} - void startQuickIndexItem(const char *,const char *) {} - void endQuickIndexItem() {} + //void startQuickIndexItem(const char *,const char *) {} + //void endQuickIndexItem() {} + void writeQuickLinks(bool,HighlightedItem) {} //void writeFormula(const char *,const char *) {} void writeNonBreakableSpace(int n) { int i; for (i=0;iname); ol.endDescTableTitle(); ol.startDescTableData(); - ol.parseDoc(docFile(),docLine(),scopeName,this,a->docs+"\n",FALSE); + ol.parseDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,a->docs+"\n",TRUE,FALSE); ol.endDescTableData(); } } @@ -1368,12 +1369,12 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, HtmlHelp::getInstance()->addIndexItem(cname,fmd->name(),cfname,fmd->anchor()); } //ol.writeListItem(); - ol.startDescTableTitle(); + ol.startDescTableTitle(); // this enables emphasis! ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name()); first=FALSE; - ol.startEmphasis(); + //ol.startEmphasis(); ol.docify(fmd->name()); - ol.endEmphasis(); + //ol.endEmphasis(); ol.disableAllBut(OutputGenerator::Man); ol.writeString(" "); ol.enableAll(); @@ -1384,7 +1385,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, if (!fmd->briefDescription().isEmpty()) { - ol.parseDoc(fmd->briefFile(),fmd->briefLine(),scopeName,fmd,fmd->briefDescription(),FALSE); + ol.parseDoc(fmd->briefFile(),fmd->briefLine(),getOuterScope()?getOuterScope():container,fmd,fmd->briefDescription(),TRUE,FALSE); //ol.newParagraph(); } if (!fmd->briefDescription().isEmpty() && @@ -1394,7 +1395,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, } if (!fmd->documentation().isEmpty()) { - ol.parseDoc(fmd->docFile(),fmd->docLine(),scopeName,fmd,fmd->documentation()+"\n",FALSE); + ol.parseDoc(fmd->docFile(),fmd->docLine(),getOuterScope()?getOuterScope():container,fmd,fmd->documentation()+"\n",TRUE,FALSE); } ol.endDescTableData(); } @@ -1814,6 +1815,7 @@ void MemberDef::setInitializer(const char *initializer) void MemberDef::addListReference(Definition *d) { visited=TRUE; + if (!isLinkableInProject()) return; QCString memLabel; if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) { diff --git a/src/memberlist.cpp b/src/memberlist.cpp index ef5e884..dfb9842 100644 --- a/src/memberlist.cpp +++ b/src/memberlist.cpp @@ -235,8 +235,9 @@ void MemberList::writePlainDeclarations(OutputList &ol, ol.startMemberDescription(); ol.parseDoc( md->briefFile(),md->briefLine(), - cd?cd->name().data():0,md, + cd,md, md->briefDescription(), + TRUE, FALSE ); if (md->isDetailedSectionLinkable()) @@ -322,7 +323,7 @@ void MemberList::writeDeclarations(OutputList &ol, { //printf("subtitle=`%s'\n",subtitle); ol.startMemberSubtitle(); - ol.parseDoc("",1,0,0,subtitle,FALSE); + ol.parseDoc("",1,0,0,subtitle,FALSE,FALSE); ol.endMemberSubtitle(); } @@ -346,7 +347,7 @@ void MemberList::writeDeclarations(OutputList &ol, { //printf("Member group has docs!\n"); ol.startMemberGroupDocs(); - ol.parseDoc("",1,0,0,mg->documentation()+"\n",FALSE); + ol.parseDoc("",1,0,0,mg->documentation()+"\n",FALSE,FALSE); ol.endMemberGroupDocs(); } ol.startMemberGroup(); diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index 1cb0dca..edd0add 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -221,7 +221,7 @@ void NamespaceDef::writeDetailedDocumentation(OutputList &ol) ol.startTextBlock(); if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) { - ol.parseDoc(briefFile(),briefLine(),name(),0,briefDescription(),FALSE); + ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE); } if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") && !documentation().isEmpty()) @@ -236,7 +236,7 @@ void NamespaceDef::writeDetailedDocumentation(OutputList &ol) } if (!documentation().isEmpty()) { - ol.parseDoc(docFile(),docLine(),name(),0,documentation()+"\n",FALSE); + ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE); ol.newParagraph(); } ol.endTextBlock(); @@ -276,7 +276,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol) } else if (!briefDescription().isEmpty()) { - ol.parseDoc(briefFile(),briefLine(),name(),0,briefDescription(),FALSE); + ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); ol.writeString(" \n"); ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); diff --git a/src/outputgen.h b/src/outputgen.h index 54be83a..8e85837 100644 --- a/src/outputgen.h +++ b/src/outputgen.h @@ -275,8 +275,8 @@ class OutputGenerator : public BaseOutputDocInterface // structural output interface /////////////////////////////////////////////////////////////// virtual void startFile(const char *name,const char *manName, - const char *title,bool ext) = 0; - virtual void writeFooter(int,bool) = 0; + const char *title) = 0; + virtual void writeFooter() = 0; virtual void endFile() = 0; virtual void startIndexSection(IndexSections) = 0; virtual void endIndexSection(IndexSections) = 0; @@ -338,8 +338,9 @@ class OutputGenerator : public BaseOutputDocInterface virtual void startCallGraph() = 0; virtual void endCallGraph(DotCallGraph &g) = 0; virtual void writeGraphicalHierarchy(DotGfxHierarchyTable &g) = 0; - virtual void startQuickIndexItem(const char *s,const char *l) = 0; - virtual void endQuickIndexItem() = 0; + //virtual void startQuickIndexItem(const char *s,const char *l) = 0; + //virtual void endQuickIndexItem() = 0; + virtual void writeQuickLinks(bool compact,HighlightedItem hli) = 0; virtual void startTextBlock(bool) = 0; virtual void endTextBlock() = 0; virtual void lastIndexPage() = 0; diff --git a/src/outputlist.cpp b/src/outputlist.cpp index a00875b..7f3648b 100644 --- a/src/outputlist.cpp +++ b/src/outputlist.cpp @@ -192,9 +192,9 @@ void OutputList::popGeneratorState() } void OutputList::parseDoc(const char *fileName,int startLine, - const char * clName,MemberDef * md, - const QCString &docStr,bool isExample, - const char *exampleName) + Definition *ctx,MemberDef * md, + const QCString &docStr,bool indexWords, + bool isExample,const char *exampleName) { int count=0; if (docStr.isEmpty()) return; @@ -211,12 +211,12 @@ void OutputList::parseDoc(const char *fileName,int startLine, if (docStr.at(docStr.length()-1)=='\n') { root = validatingParseDoc(fileName,startLine, - clName,md,docStr,isExample,exampleName); + ctx,md,docStr,indexWords,isExample,exampleName); } else { root = validatingParseDoc(fileName,startLine, - clName,md,docStr+"\n",isExample,exampleName); + ctx,md,docStr+"\n",indexWords,isExample,exampleName); } og=outputs->first(); @@ -334,6 +334,7 @@ FORALL2(bool a1,bool a2,a1,a2) FORALL4(const char *a1,const char *a2,const char *a3,bool a4,a1,a2,a3,a4) #endif FORALL2(int a1,bool a2,a1,a2) +FORALL2(bool a1,HighlightedItem a2,a1,a2) FORALL2(ParamListTypes a1,const char *a2,a1,a2) FORALL1(IndexSections a1,a1) FORALL2(const char *a1,const char *a2,a1,a2) diff --git a/src/outputlist.h b/src/outputlist.h index 9668c4f..08e0694 100644 --- a/src/outputlist.h +++ b/src/outputlist.h @@ -61,8 +61,8 @@ class OutputList : public OutputDocInterface ////////////////////////////////////////////////// void parseDoc(const char *fileName,int startLine, - const char *clName,MemberDef *md,const QCString &docStr, - bool isExample,const char *exampleName=0); + Definition *ctx,MemberDef *md,const QCString &docStr, + bool indexWords,bool isExample,const char *exampleName=0); void parseText(const QCString &textStr); @@ -76,11 +76,10 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::endProjectNumber); } void writeStyleInfo(int part) { forall(&OutputGenerator::writeStyleInfo,part); } - void startFile(const char *name,const char *manName, - const char *title,bool external) - { forall(&OutputGenerator::startFile,name,manName,title,external); } - void writeFooter(int fase,bool external) - { forall(&OutputGenerator::writeFooter,fase,external); } + void startFile(const char *name,const char *manName,const char *title) + { forall(&OutputGenerator::startFile,name,manName,title); } + void writeFooter() + { forall(&OutputGenerator::writeFooter); } void endFile() { forall(&OutputGenerator::endFile); } void startTitleHead(const char *fileName) @@ -286,10 +285,12 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startPageRef); } void endPageRef(const char *c,const char *a) { forall(&OutputGenerator::endPageRef,c,a); } - void startQuickIndexItem(const char *s,const char *l) - { forall(&OutputGenerator::startQuickIndexItem,s,l); } - void endQuickIndexItem() - { forall(&OutputGenerator::endQuickIndexItem); } + //void startQuickIndexItem(const char *s,const char *l) + //{ forall(&OutputGenerator::startQuickIndexItem,s,l); } + //void endQuickIndexItem() + //{ forall(&OutputGenerator::endQuickIndexItem); } + void writeQuickLinks(bool compact,HighlightedItem hli) + { forall(&OutputGenerator::writeQuickLinks,compact,hli); } void writeNonBreakableSpace(int num) { forall(&OutputGenerator::writeNonBreakableSpace,num); } void startDescTable() @@ -390,6 +391,7 @@ class OutputList : public OutputDocInterface FORALLPROTO4(const char *,const char *,const char *,int); #endif FORALLPROTO2(int,bool); + FORALLPROTO2(bool,HighlightedItem); FORALLPROTO2(ParamListTypes,const char *); FORALLPROTO2(const char *,const char *); FORALLPROTO2(const char *,bool); diff --git a/src/packagedef.cpp b/src/packagedef.cpp deleted file mode 100644 index ecea2f7..0000000 --- a/src/packagedef.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2003 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 -#include "packagedef.h" -#include "qtbc.h" -#include "classdef.h" -#include "classlist.h" -#include "outputlist.h" -#include "util.h" -#include "config.h" -#include "language.h" -#include "doxygen.h" - -PackageDef::PackageDef(const char *df,int dl,const char *na,const char *ref) : - Definition(df,dl,na) -{ - classSDict = new ClassSDict(17); - packageFileName = (QCString)"package_"+na; - setReference(ref); -} - -PackageDef::~PackageDef() -{ - delete classSDict; -} - -void PackageDef::addClass(const ClassDef *cd) -{ - if (Config_getBool("SORT_MEMBER_DOCS")) - classSDict->inSort(cd->name(),cd); - else - classSDict->append(cd->name(),cd); -} - -void PackageDef::writeDocumentation(OutputList &ol) -{ - QCString title = theTranslator->trPackage(name()); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::Man); - startFile(ol,getOutputFileBase(),name(),title); - startTitle(ol,getOutputFileBase()); - ol.docify(title); - endTitle(ol,getOutputFileBase(),title); - - if (!briefDescription().isEmpty()) - { - ol.parseDoc(briefFile(),briefLine(),name(),0,briefDescription(),FALSE); - ol.writeString(" \n"); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::Latex); - ol.disable(OutputGenerator::RTF); - ol.startTextLink(0,"_details"); - ol.parseText(theTranslator->trMore()); - ol.endTextLink(); - ol.popGeneratorState(); - } - - if (!Config_getString("GENERATE_TAGFILE").isEmpty()) - { - Doxygen::tagFile << " " << endl; - } - - ol.startMemberSections(); - ClassDef::CompoundType ct; - ct=ClassDef::Interface; - classSDict->writeDeclaration(ol,&ct,theTranslator->trInterfaces()); - ct=ClassDef::Class; - classSDict->writeDeclaration(ol,&ct,theTranslator->trClasses()); - ol.endMemberSections(); - - if (!Config_getString("GENERATE_TAGFILE").isEmpty()) - { - writeDocAnchorsToTagFile(); - Doxygen::tagFile << " " << endl; - } - - if (!briefDescription().isEmpty() || !documentation().isEmpty()) - { - ol.writeRuler(); - ol.pushGeneratorState(); - ol.disable(OutputGenerator::Latex); - ol.disable(OutputGenerator::RTF); - ol.writeAnchor(0,"_details"); - ol.popGeneratorState(); - ol.startGroupHeader(); - ol.parseText(theTranslator->trDetailedDescription()); - ol.endGroupHeader(); - - // repeat brief description - if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) - { - ol.parseDoc(briefFile(),briefLine(),name(),0,briefDescription(),FALSE); - ol.newParagraph(); - } - - // write documentation - if (!documentation().isEmpty()) - { - ol.parseDoc(docFile(),docLine(),name(),0,documentation()+"\n",FALSE); - } - } - - endFile(ol); - ol.popGeneratorState(); -} - -QCString PackageDef::getOutputFileBase() const -{ - return convertNameToFile(packageFileName); -} - diff --git a/src/packagedef.h b/src/packagedef.h deleted file mode 100644 index 0835f74..0000000 --- a/src/packagedef.h +++ /dev/null @@ -1,68 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2003 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 PACKAGEDEF_H -#define PACKAGEDEF_H - -#include "qtbc.h" -#include -#include -#include "definition.h" -#include "sortdict.h" - -class ClassSDict; -class ClassDef; -class PackageList; -class OutputList; - -class PackageDef : public Definition -{ - public: - PackageDef(const char *fName,int line, const char *name,const char *ref=0); - ~PackageDef(); - DefType definitionType() { return TypePackage; } - QCString getOutputFileBase() const ; - void addClass(const ClassDef *def); - void writeDocumentation(OutputList &ol); - bool isLinkableInProject() const - { - return hasDocumentation() && !isReference(); - } - bool isLinkable() const - { - return isLinkableInProject() || isReference(); - } - - private: - QCString packageFileName; // base name of the generated file - ClassSDict *classSDict; // list of classes in the package -}; - -class PackageSDict : public SDict -{ - public: - PackageSDict(int size) : SDict(size) {} - int compareItems(GCI item1,GCI item2) - { - return stricmp(((PackageDef *)item1)->name(), - ((PackageDef *)item2)->name() - ); - } -}; - -#endif - diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 2574f6b..bd676ad 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -537,6 +537,7 @@ void PerlModDocVisitor::visit(DocSymbol *sy) case DocSymbol::Acute: accent = "acute"; break; case DocSymbol::Grave: accent = "grave"; break; case DocSymbol::Circ: accent = "circ"; break; + case DocSymbol::Slash: accent = "slash"; break; case DocSymbol::Tilde: accent = "tilde"; break; case DocSymbol::Cedil: accent = "cedilla"; break; case DocSymbol::Ring: accent = "ring"; break; @@ -1265,7 +1266,7 @@ static void addPerlModDocBlock(PerlModOutput &output, const char *name, const QCString &fileName, int lineNr, - const QCString &scope, + Definition *scope, MemberDef *md, const QCString &text) { @@ -1395,12 +1396,6 @@ void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *) case MemberDef::Event: memType="event"; break; } - QCString scopeName; - if (md->getClassDef()) - scopeName=md->getClassDef()->name(); - else if (md->getNamespaceDef()) - scopeName=md->getNamespaceDef()->name(); - m_output.openHash() .addFieldQuotedString("kind", memType) .addFieldQuotedString("name", md->name()) @@ -1408,8 +1403,8 @@ void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *) .addFieldQuotedString("protection", getProtectionName(md->protection())) .addFieldBoolean("static", md->isStatic()); - addPerlModDocBlock(m_output,"brief",md->getDefFileName(),md->getDefLine(),scopeName,md,md->briefDescription()); - addPerlModDocBlock(m_output,"detailed",md->getDefFileName(),md->getDefLine(),scopeName,md,md->documentation()); + addPerlModDocBlock(m_output,"brief",md->getDefFileName(),md->getDefLine(),md->getOuterScope(),md,md->briefDescription()); + addPerlModDocBlock(m_output,"detailed",md->getDefFileName(),md->getDefLine(),md->getOuterScope(),md,md->documentation()); if (md->memberType()!=MemberDef::Define && md->memberType()!=MemberDef::Enumeration) m_output.addFieldQuotedString("type", md->typeString()); @@ -1492,9 +1487,9 @@ void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *) if (!emd->initializer().isEmpty()) m_output.addFieldQuotedString("initializer", emd->initializer()); - addPerlModDocBlock(m_output,"brief",emd->getDefFileName(),emd->getDefLine(),scopeName,emd,emd->briefDescription()); + addPerlModDocBlock(m_output,"brief",emd->getDefFileName(),emd->getDefLine(),emd->getOuterScope(),emd,emd->briefDescription()); - addPerlModDocBlock(m_output,"detailed",emd->getDefFileName(),emd->getDefLine(),scopeName,emd,emd->documentation()); + addPerlModDocBlock(m_output,"detailed",emd->getDefFileName(),emd->getDefLine(),emd->getOuterScope(),emd,emd->documentation()); m_output.closeHash(); } @@ -1690,8 +1685,8 @@ void PerlModGenerator::generatePerlModForClass(ClassDef *cd) generatePerlModSection(cd,&cd->friends,"friend_methods"); generatePerlModSection(cd,&cd->related,"related_methods"); - addPerlModDocBlock(m_output,"brief",cd->getDefFileName(),cd->getDefLine(),cd->name(),0,cd->briefDescription()); - addPerlModDocBlock(m_output,"detailed",cd->getDefFileName(),cd->getDefLine(),cd->name(),0,cd->documentation()); + addPerlModDocBlock(m_output,"brief",cd->getDefFileName(),cd->getDefLine(),cd,0,cd->briefDescription()); + addPerlModDocBlock(m_output,"detailed",cd->getDefFileName(),cd->getDefLine(),cd,0,cd->documentation()); #if 0 DotClassGraph inheritanceGraph(cd,DotClassGraph::Inheritance); diff --git a/src/pre.l b/src/pre.l index 0a766cb..d326acc 100644 --- a/src/pre.l +++ b/src/pre.l @@ -1979,10 +1979,11 @@ void preprocessFile(const char *fileName,BufStr &output) g_expandedDict->clear(); // add predefined macros - char *defStr = Config_getList("PREDEFINED").first(); - while (defStr) + char *defStr; + QStrList &predefList = Config_getList("PREDEFINED"); + QStrListIterator sli(predefList); + for (sli.toFirst();(defStr=sli.current());++sli) { - //printf("Predefined: `%s'\n",defStr); QCString ds = defStr; int i_equals=ds.find('='); int i_obrace=ds.find('('); @@ -2068,7 +2069,6 @@ void preprocessFile(const char *fileName,BufStr &output) // def->name.data(),def->definition.data(),def->nargs); } - defStr=Config_getList("PREDEFINED").next(); } QCString &inputFilter = Config_getString("INPUT_FILTER"); diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index 2221d2d..8cbfc4f 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -182,6 +182,13 @@ void RTFDocVisitor::visit(DocSymbol *s) default: m_t << '?'; break; } break; + case DocSymbol::Slash: switch(s->letter()) + { + case 'O' : m_t << '\330'; break; + case 'o' : m_t << '\370'; break; + default: m_t << '?'; break; + } + break; case DocSymbol::Ring: switch(s->letter()) { case 'A' : m_t << '\305'; break; @@ -899,14 +906,14 @@ void RTFDocVisitor::visitPost(DocLink *lnk) void RTFDocVisitor::visitPre(DocRef *ref) { if (m_hide) return; - startLink(ref->ref(),ref->file(),ref->anchor()); + if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor()); if (!ref->hasLinkText()) filter(ref->targetTitle()); } void RTFDocVisitor::visitPost(DocRef *ref) { if (m_hide) return; - endLink(ref->ref()); + if (!ref->file().isEmpty()) endLink(ref->ref()); m_t << " "; } diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index 3c5d7a3..43dc994 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -319,8 +319,7 @@ void RTFGenerator::beginRTFSection() t << rtf_Style["Heading2"]->reference << "\n"; } -void RTFGenerator::startFile(const char *name,const char *, - const char *, bool ) +void RTFGenerator::startFile(const char *name,const char *,const char *) { QCString fileName=name; diff --git a/src/rtfgen.h b/src/rtfgen.h index 099ca31..0e58d7c 100644 --- a/src/rtfgen.h +++ b/src/rtfgen.h @@ -44,9 +44,8 @@ class RTFGenerator : public OutputGenerator void printDoc(DocNode *); - void startFile(const char *name,const char *manName, - const char *title, bool external); - void writeFooter(int,bool) {} + void startFile(const char *name,const char *manName,const char *title); + void writeFooter() {} void endFile(); void clearBuffer(); @@ -203,8 +202,9 @@ class RTFGenerator : public OutputGenerator //void endColorFont() {} void startPageRef(); void endPageRef(const char *,const char *); - void startQuickIndexItem(const char *,const char *) {} - void endQuickIndexItem() {} + //void startQuickIndexItem(const char *,const char *) {} + //void endQuickIndexItem() {} + void writeQuickLinks(bool,HighlightedItem) {} //void writeFormula(const char *,const char *); void writeNonBreakableSpace(int); //void startImage(const char *,const char *,bool); diff --git a/src/scanner.l b/src/scanner.l index 23d1b29..1c33319 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -3210,7 +3210,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] } BEGIN( LineDoc ); } -"extern"{BN}+"\"C"("++")?"\""{BN}*("{")? { +"extern"{BN}*"\"C"("++")?"\""{BN}*("{")? { lineCount(); } "{" { @@ -3852,10 +3852,10 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] BEGIN(AnchorLabel); } ("\\\\"|"@@")("verbatim"|"latexonly"|"htmlonly")/[^a-z_A-Z0-9] { - current->doc+="\\\\verbatim"; + current->doc+=yytext; } ("\\\\"|"@@")("verbatim"|"latexonly"|"htmlonly")/[^a-z_A-Z0-9] { - current->brief+="\\\\verbatim"; + current->brief+=yytext; } {CMD}"verbatim"/[^a-z_A-Z0-9] { lastVerbState=YY_START; diff --git a/src/search.php b/src/search.php new file mode 100644 index 0000000..3900f6b --- /dev/null +++ b/src/search.php @@ -0,0 +1,303 @@ +function readInt($file) +{ + $b1 = ord(fgetc($file)); $b2 = ord(fgetc($file)); + $b3 = ord(fgetc($file)); $b4 = ord(fgetc($file)); + return ($b1<<24)|($b2<<16)|($b3<<8)|$b4; +} + +function readString($file) +{ + $result=""; + while (ord($c=fgetc($file))) $result.=$c; + return $result; +} + +function readHeader($file) +{ + $header =fgetc($file); $header.=fgetc($file); + $header.=fgetc($file); $header.=fgetc($file); + return $header; +} + +function computeIndex($word) +{ + if (strlen($word)<2) return -1; + // high char of the index + $hi = ord($word{0}); + if ($hi==0) return -1; + // low char of the index + $lo = ord($word{1}); + if ($lo==0) return -1; + // return index + return $hi*256+$lo; +} + +function search($file,$word,&$statsList) +{ + $index = computeIndex($word); + if ($index!=-1) // found a valid index + { + fseek($file,$index*4+4); // 4 bytes per entry, skip header + $index = readInt($file); + if ($index) // found words matching first two characters + { + $start=sizeof($statsList); + $count=$start; + fseek($file,$index); + $w = readString($file); + while ($w) + { + $statIdx = readInt($file); + if ($word==substr($w,0,strlen($word))) + { // found word that matches (as substring) + $statsList[$count++]=array( + "word"=>$word, + "match"=>$w, + "index"=>$statIdx, + "full"=>strlen($w)==strlen($word), + "docs"=>array() + ); + } + $w = readString($file); + } + $totalFreq=0; + for ($count=$start;$count$idx,"freq"=>$freq,"rank"=>0.0); + $totalFreq+=$freq; + if ($statInfo["full"]) $totalfreq+=$freq; + } + // read name an url info for the doc + for ($i=0;$i<$numDocs;$i++) + { + fseek($file,$docInfo[$i]["idx"]); + $docInfo[$i]["name"]=readString($file); + $docInfo[$i]["url"]=readString($file); + } + $statInfo["docs"]=$docInfo; + } + for ($count=$start;$count$key, + "name"=>$di["name"], + "rank"=>$rank + ); + } + $docs[$key]["words"][] = array( + "word"=>$wordInfo["word"], + "match"=>$wordInfo["match"], + "freq"=>$di["freq"] + ); + } + } + return $docs; +} + +function normalize_ranking(&$docs) +{ + $maxRank = 0.0000001; + // compute maximal rank + foreach ($docs as $doc) + { + if ($doc["rank"]>$maxRank) + { + $maxRank=$doc["rank"]; + } + } + reset($docs); + // normalize rankings + while (list ($key, $val) = each ($docs)) + { + $docs[$key]["rank"]*=100/$maxRank; + } +} + +function filter_results($docs,&$requiredWords,&$forbiddenWords) +{ + $filteredDocs=array(); + while (list ($key, $val) = each ($docs)) + { + $words = &$docs[$key]["words"]; + $copy=1; // copy entry by default + if (sizeof($requiredWords)>0) + { + foreach ($requiredWords as $reqWord) + { + $found=0; + foreach ($words as $wordInfo) + { + $found = $wordInfo["word"]==$reqWord; + if ($found) break; + } + if (!$found) + { + $copy=0; // document contains none of the required words + break; + } + } + } + if (sizeof($forbiddenWords)>0) + { + foreach ($words as $wordInfo) + { + if (in_array($wordInfo["word"],$forbiddenWords)) + { + $copy=0; // document contains a forbidden word + break; + } + } + } + if ($copy) $filteredDocs[$key]=$docs[$key]; + } + return $filteredDocs; +} + +function compare_rank($a,$b) +{ + return ($a["rank"]>$b["rank"]) ? -1 : 1; +} + +function sort_results($docs,&$sorted) +{ + $sorted = $docs; + usort($sorted,"compare_rank"); + return $sorted; +} + +function report_results(&$docs) +{ + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + $numDocs = sizeof($docs); + if ($numDocs==0) + { + echo " \n"; + echo " \n"; + echo " \n"; + } + else + { + echo " \n"; + echo " \n"; + echo " \n"; + $num=1; + foreach ($docs as $doc) + { + echo " \n"; + echo " "; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + $num++; + } + } + echo "

    ".search_results()."

    ".matches_text(0)."
    ".matches_text($numDocs); + echo "\n"; + echo "
    $num.".$doc["name"]."
    ".report_matches()." "; + foreach ($doc["words"] as $wordInfo) + { + $word = $wordInfo["word"]; + $matchRight = substr($wordInfo["match"],strlen($word)); + echo "$word$matchRight(".$wordInfo["freq"].") "; + } + echo "
    \n"; +} + +function main() +{ + if(strcmp('4.1.0', phpversion()) > 0) + { + die("Error: PHP version 4.1.0 or above required!"); + } + if (!($file=fopen("search.idx","rb"))) + { + die("Error: Search index file could NOT be opened!"); + } + if (readHeader($file)!="DOXS") + { + die("Error: Header of index file is invalid!"); + } + $query=""; + if (array_key_exists("query", $_GET)) + { + $query=$_GET["query"]; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "
    \n"; + $results = array(); + $requiredWords = array(); + $forbiddenWords = array(); + $foundWords = array(); + $word=strtolower(strtok($query," ")); + while ($word) // for each word in the search query + { + if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; } + if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; } + if (!in_array($word,$foundWords)) + { + $foundWords[]=$word; + search($file,$word,$results); + } + $word=strtolower(strtok(" ")); + } + $docs = array(); + combine_results($results,$docs); + // filter out documents with forbidden word or that do not contain + // required words + $filteredDocs = filter_results($docs,$requiredWords,$forbiddenWords); + // normalize rankings so they are in the range [0-100] + normalize_ranking($filteredDocs); + // sort the results based on rank + $sorted = array(); + sort_results($filteredDocs,$sorted); + // report results to the user + report_results($sorted); + fclose($file); +} + +main(); + diff --git a/src/search_php.h b/src/search_php.h new file mode 100644 index 0000000..7cabda2 --- /dev/null +++ b/src/search_php.h @@ -0,0 +1,303 @@ +"function readInt($file)\n" +"{\n" +" $b1 = ord(fgetc($file)); $b2 = ord(fgetc($file));\n" +" $b3 = ord(fgetc($file)); $b4 = ord(fgetc($file));\n" +" return ($b1<<24)|($b2<<16)|($b3<<8)|$b4;\n" +"}\n" +"\n" +"function readString($file)\n" +"{\n" +" $result=\"\";\n" +" while (ord($c=fgetc($file))) $result.=$c;\n" +" return $result;\n" +"}\n" +"\n" +"function readHeader($file)\n" +"{\n" +" $header =fgetc($file); $header.=fgetc($file);\n" +" $header.=fgetc($file); $header.=fgetc($file);\n" +" return $header;\n" +"}\n" +"\n" +"function computeIndex($word)\n" +"{\n" +" if (strlen($word)<2) return -1;\n" +" // high char of the index\n" +" $hi = ord($word{0});\n" +" if ($hi==0) return -1;\n" +" // low char of the index\n" +" $lo = ord($word{1});\n" +" if ($lo==0) return -1;\n" +" // return index\n" +" return $hi*256+$lo;\n" +"}\n" +"\n" +"function search($file,$word,&$statsList)\n" +"{\n" +" $index = computeIndex($word);\n" +" if ($index!=-1) // found a valid index\n" +" {\n" +" fseek($file,$index*4+4); // 4 bytes per entry, skip header\n" +" $index = readInt($file);\n" +" if ($index) // found words matching first two characters\n" +" {\n" +" $start=sizeof($statsList);\n" +" $count=$start;\n" +" fseek($file,$index);\n" +" $w = readString($file);\n" +" while ($w)\n" +" {\n" +" $statIdx = readInt($file);\n" +" if ($word==substr($w,0,strlen($word)))\n" +" { // found word that matches (as substring)\n" +" $statsList[$count++]=array(\n" +" \"word\"=>$word,\n" +" \"match\"=>$w,\n" +" \"index\"=>$statIdx,\n" +" \"full\"=>strlen($w)==strlen($word),\n" +" \"docs\"=>array()\n" +" );\n" +" }\n" +" $w = readString($file);\n" +" }\n" +" $totalFreq=0;\n" +" for ($count=$start;$count$idx,\"freq\"=>$freq,\"rank\"=>0.0);\n" +" $totalFreq+=$freq;\n" +" if ($statInfo[\"full\"]) $totalfreq+=$freq;\n" +" }\n" +" // read name an url info for the doc\n" +" for ($i=0;$i<$numDocs;$i++)\n" +" {\n" +" fseek($file,$docInfo[$i][\"idx\"]);\n" +" $docInfo[$i][\"name\"]=readString($file);\n" +" $docInfo[$i][\"url\"]=readString($file);\n" +" }\n" +" $statInfo[\"docs\"]=$docInfo;\n" +" }\n" +" for ($count=$start;$count$key,\n" +" \"name\"=>$di[\"name\"],\n" +" \"rank\"=>$rank\n" +" );\n" +" }\n" +" $docs[$key][\"words\"][] = array(\n" +" \"word\"=>$wordInfo[\"word\"],\n" +" \"match\"=>$wordInfo[\"match\"],\n" +" \"freq\"=>$di[\"freq\"]\n" +" );\n" +" }\n" +" }\n" +" return $docs;\n" +"}\n" +"\n" +"function normalize_ranking(&$docs)\n" +"{\n" +" $maxRank = 0.0000001;\n" +" // compute maximal rank\n" +" foreach ($docs as $doc) \n" +" {\n" +" if ($doc[\"rank\"]>$maxRank)\n" +" {\n" +" $maxRank=$doc[\"rank\"];\n" +" }\n" +" }\n" +" reset($docs);\n" +" // normalize rankings\n" +" while (list ($key, $val) = each ($docs)) \n" +" {\n" +" $docs[$key][\"rank\"]*=100/$maxRank;\n" +" }\n" +"}\n" +"\n" +"function filter_results($docs,&$requiredWords,&$forbiddenWords)\n" +"{\n" +" $filteredDocs=array();\n" +" while (list ($key, $val) = each ($docs)) \n" +" {\n" +" $words = &$docs[$key][\"words\"];\n" +" $copy=1; // copy entry by default\n" +" if (sizeof($requiredWords)>0)\n" +" {\n" +" foreach ($requiredWords as $reqWord)\n" +" {\n" +" $found=0;\n" +" foreach ($words as $wordInfo)\n" +" { \n" +" $found = $wordInfo[\"word\"]==$reqWord;\n" +" if ($found) break;\n" +" }\n" +" if (!$found) \n" +" {\n" +" $copy=0; // document contains none of the required words\n" +" break;\n" +" }\n" +" }\n" +" }\n" +" if (sizeof($forbiddenWords)>0)\n" +" {\n" +" foreach ($words as $wordInfo)\n" +" {\n" +" if (in_array($wordInfo[\"word\"],$forbiddenWords))\n" +" {\n" +" $copy=0; // document contains a forbidden word\n" +" break;\n" +" }\n" +" }\n" +" }\n" +" if ($copy) $filteredDocs[$key]=$docs[$key];\n" +" }\n" +" return $filteredDocs;\n" +"}\n" +"\n" +"function compare_rank($a,$b)\n" +"{\n" +" return ($a[\"rank\"]>$b[\"rank\"]) ? -1 : 1; \n" +"}\n" +"\n" +"function sort_results($docs,&$sorted)\n" +"{\n" +" $sorted = $docs;\n" +" usort($sorted,\"compare_rank\");\n" +" return $sorted;\n" +"}\n" +"\n" +"function report_results(&$docs)\n" +"{\n" +" echo \"\\n\";\n" +" echo \" \\n\";\n" +" echo \" \\n\";\n" +" echo \" \\n\";\n" +" $numDocs = sizeof($docs);\n" +" if ($numDocs==0)\n" +" {\n" +" echo \" \\n\";\n" +" echo \" \\n\";\n" +" echo \" \\n\";\n" +" }\n" +" else\n" +" {\n" +" echo \" \\n\";\n" +" echo \" \\n\";\n" +" echo \" \\n\";\n" +" $num=1;\n" +" foreach ($docs as $doc)\n" +" {\n" +" echo \" \\n\";\n" +" echo \" \";\n" +" echo \"\\n\";\n" +" echo \" \\n\";\n" +" echo \" \\n\";\n" +" echo \" \\n\";\n" +" $num++;\n" +" }\n" +" }\n" +" echo \"

    \".search_results().\"

    \".matches_text(0).\"
    \".matches_text($numDocs);\n" +" echo \"\\n\";\n" +" echo \"
    $num.\".$doc[\"name\"].\"
    \".report_matches().\" \";\n" +" foreach ($doc[\"words\"] as $wordInfo)\n" +" {\n" +" $word = $wordInfo[\"word\"];\n" +" $matchRight = substr($wordInfo[\"match\"],strlen($word));\n" +" echo \"$word$matchRight(\".$wordInfo[\"freq\"].\") \";\n" +" }\n" +" echo \"
    \\n\";\n" +"}\n" +"\n" +"function main()\n" +"{\n" +" if(strcmp('4.1.0', phpversion()) > 0) \n" +" {\n" +" die(\"Error: PHP version 4.1.0 or above required!\");\n" +" }\n" +" if (!($file=fopen(\"search.idx\",\"rb\"))) \n" +" {\n" +" die(\"Error: Search index file could NOT be opened!\");\n" +" }\n" +" if (readHeader($file)!=\"DOXS\")\n" +" {\n" +" die(\"Error: Header of index file is invalid!\");\n" +" }\n" +" $query=\"\";\n" +" if (array_key_exists(\"query\", $_GET))\n" +" {\n" +" $query=$_GET[\"query\"];\n" +" }\n" +" echo \"\\n\";\n" +" echo \"\\n\";\n" +" echo \"\\n\";\n" +" echo \"
    \\n\";\n" +" $results = array();\n" +" $requiredWords = array();\n" +" $forbiddenWords = array();\n" +" $foundWords = array();\n" +" $word=strtolower(strtok($query,\" \"));\n" +" while ($word) // for each word in the search query\n" +" {\n" +" if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; }\n" +" if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; }\n" +" if (!in_array($word,$foundWords))\n" +" {\n" +" $foundWords[]=$word;\n" +" search($file,$word,$results);\n" +" }\n" +" $word=strtolower(strtok(\" \"));\n" +" }\n" +" $docs = array();\n" +" combine_results($results,$docs);\n" +" // filter out documents with forbidden word or that do not contain\n" +" // required words\n" +" $filteredDocs = filter_results($docs,$requiredWords,$forbiddenWords);\n" +" // normalize rankings so they are in the range [0-100]\n" +" normalize_ranking($filteredDocs);\n" +" // sort the results based on rank\n" +" $sorted = array();\n" +" sort_results($filteredDocs,$sorted);\n" +" // report results to the user\n" +" report_results($sorted);\n" +" fclose($file);\n" +"}\n" +"\n" +"main();\n" +"\n" diff --git a/src/searchindex.cpp b/src/searchindex.cpp index 48047fb..36b416c 100644 --- a/src/searchindex.cpp +++ b/src/searchindex.cpp @@ -17,6 +17,9 @@ #include "qtbc.h" #include "searchindex.h" +#include + +#if 0 #include "suffixtree.h" SearchIndex::SearchIndex() : refDict(10007), nameIndex(10007) @@ -124,3 +127,257 @@ bool SearchIndex::saveIndex(const char *fileName) //suffixTree->dump(); return TRUE; } +#endif + + +// file format: +// 4 byte header +// 256*256*4 byte index +// for each index entry: a zero terminated list of words +// for each word: a 0 terminated string + 4 bytes stats index +// padding bytes to align at 4 byte boundary +// for each word: a counter + for each url containing the word 8 bytes statistics +// for each url: a 0 terminated string + +const int numIndexEntries = 256*256; + +//-------------------------------------------------------------------- + +IndexWord::IndexWord(const char *word) : m_word(word), m_urls(17) +{ + m_urls.setAutoDelete(TRUE); +} + +void IndexWord::addUrlIndex(int idx) +{ + URLInfo *ui = m_urls.find(idx); + if (ui==0) + { + ui=new URLInfo(idx,0); + m_urls.insert(idx,ui); + } + ui->freq++; +} + +//-------------------------------------------------------------------- + +SearchIndex::SearchIndex() : m_words(328829), m_index(numIndexEntries), m_urlIndex(-1) +{ + int i; + m_words.setAutoDelete(TRUE); + m_urls.setAutoDelete(TRUE); + for (i=0;i); +} + +void SearchIndex::setCurrentDoc(const char *name,const char *url) +{ + m_urlIndex++; + m_urls.insert(m_urlIndex,new URL(name,url)); +} + + +static int charsToIndex(const char *word) +{ + if (word==0) return -1; + int c1=word[0]; + if (c1==0) return -1; + int c2=word[1]; + if (c2==0) return -1; + return c1*256+c2; +} + +void SearchIndex::addWord(const char *word) +{ + IndexWord *w = m_words[word]; + if (w==0) + { + int idx=charsToIndex(word); + if (idx==-1) return; + w = new IndexWord(word); + //printf("addWord(%s) at index %d\n",word,idx); + m_index[idx]->append(w); + m_words.insert(word,w); + } + w->addUrlIndex(m_urlIndex); +} + + +static void writeInt(QFile &f,int index) +{ + f.putch(((uint)index)>>24); + f.putch((((uint)index)>>16)&0xff); + f.putch((((uint)index)>>8)&0xff); + f.putch(((uint)index)&0xff); +} + +static void writeString(QFile &f,const char *s) +{ + const char *p = s; + while (*p) f.putch(*p++); + f.putch(0); +} + +void SearchIndex::write(const char *fileName) +{ + int i; + int size=4; // for the header + size+=4*numIndexEntries; // for the index + int wordsOffset = size; + // first pass: compute the size of the wordlist + for (i=0;i *wlist = m_index[i]; + if (!wlist->isEmpty()) + { + QListIterator iwi(*wlist); + IndexWord *iw; + for (iwi.toFirst();(iw=iwi.current());++iwi) + { + int ws = iw->word().length()+1; + size+=ws+4; // word + url info list offset + } + size+=1; // zero list terminator + } + } + + // second pass: compute the offsets in the index + int indexOffsets[numIndexEntries]; + int offset=wordsOffset; + for (i=0;i *wlist = m_index[i]; + if (!wlist->isEmpty()) + { + indexOffsets[i]=offset; + QListIterator iwi(*wlist); + IndexWord *iw; + for (iwi.toFirst();(iw=iwi.current());++iwi) + { + offset+= iw->word().length()+1; + offset+=4; // word + offset to url info array + } + offset+=1; // zero list terminator + } + else + { + indexOffsets[i]=0; + } + } + int padding = size; + size = (size+3)&~3; // round up to 4 byte boundary + padding = size - padding; + + //int statsOffset = size; + QDictIterator wdi(m_words); + //IndexWord *iw; + int *wordStatOffsets = new int[m_words.count()]; + + int count=0; + + // third pass: compute offset to stats info for each word + for (i=0;i *wlist = m_index[i]; + if (!wlist->isEmpty()) + { + QListIterator iwi(*wlist); + IndexWord *iw; + for (iwi.toFirst();(iw=iwi.current());++iwi) + { + //printf("wordStatOffsets[%d]=%d\n",count,size); + wordStatOffsets[count++] = size; + size+=4+iw->urls().count()*8; // count + (url_index,freq) per url + } + } + } + int *urlOffsets = new int[m_urls.count()]; + //int urlsOffset = size; + QIntDictIterator udi(m_urls); + URL *url; + for (udi.toFirst();(url=udi.current());++udi) + { + urlOffsets[udi.currentKey()]=size; + size+=url->name.length()+1+ + url->url.length()+1; + } + //printf("Total size %x bytes (word=%x stats=%x urls=%x)\n",size,wordsOffset,statsOffset,urlsOffset); + QFile f(fileName); + if (f.open(IO_WriteOnly)) + { + // write header + f.putch('D'); f.putch('O'); f.putch('X'); f.putch('S'); + // write index + for (i=0;i *wlist = m_index[i]; + if (!wlist->isEmpty()) + { + QListIterator iwi(*wlist); + IndexWord *iw; + for (iwi.toFirst();(iw=iwi.current());++iwi) + { + writeString(f,iw->word()); + writeInt(f,wordStatOffsets[count++]); + } + f.putch(0); + } + } + // write extra padding bytes + for (i=0;i *wlist = m_index[i]; + if (!wlist->isEmpty()) + { + QListIterator iwi(*wlist); + IndexWord *iw; + for (iwi.toFirst();(iw=iwi.current());++iwi) + { + int numUrls = iw->urls().count(); + writeInt(f,numUrls); + QIntDictIterator uli(iw->urls()); + URLInfo *ui; + for (uli.toFirst();(ui=uli.current());++uli) + { + writeInt(f,urlOffsets[ui->urlIdx]); + writeInt(f,ui->freq); + } + } + } + } + // write urls + QIntDictIterator udi(m_urls); + URL *url; + for (udi.toFirst();(url=udi.current());++udi) + { + writeString(f,url->name); + writeString(f,url->url); + } + } + + //for (wdi.toFirst();(iw=wdi.current());++wdi) + //{ + // printf("Word %s:\n",wdi.currentKey().data()); + // QIntDictIterator udi(iw->urls()); + // URLInfo *ui; + // for (udi.toFirst();(ui=udi.current());++udi) + // { + // printf(" url[%d]=(name=%s,url=%s),freq=%d\n", + // ui->urlIdx, + // m_urls[ui->urlIdx]->name.data(), + // m_urls[ui->urlIdx]->url.data(), + // ui->freq); + // } + //} + + delete urlOffsets; + delete wordStatOffsets; +} + diff --git a/src/searchindex.h b/src/searchindex.h index f5ae41c..f9d9c2f 100644 --- a/src/searchindex.h +++ b/src/searchindex.h @@ -22,9 +22,12 @@ #include #include #include +#include +#include -#include "suffixtree.h" +#if 0 // old version +#include "suffixtree.h" //class IndexTree; class SuffixTree; @@ -70,3 +73,48 @@ class SearchIndex }; #endif + +struct URL +{ + URL(const char *n,const char *u) : name(n), url(u) {} + QCString name; + QCString url; +}; + + +struct URLInfo +{ + URLInfo(int idx,int f) : urlIdx(idx), freq(f) {} + int urlIdx; + int freq; +}; + +class IndexWord +{ + public: + IndexWord(const char *word); + void addUrlIndex(int); + const QIntDict &urls() const { return m_urls; } + QCString word() const { return m_word; } + + private: + QCString m_word; + QIntDict m_urls; +}; + +class SearchIndex +{ + public: + SearchIndex(); + void setCurrentDoc(const char *name,const char *url); + void addWord(const char *word); + void write(const char *file); + private: + QDict m_words; + QVector< QList > m_index; + QIntDict m_urls; + int m_urlIndex; +}; + + +#endif diff --git a/src/suffixtree.cpp b/src/suffixtree.cpp deleted file mode 100644 index 641f502..0000000 --- a/src/suffixtree.cpp +++ /dev/null @@ -1,358 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2003 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 - -#include "qtbc.h" -#include "suffixtree.h" - -#define MAXWORDLEN 1024 - -//---------------------------------------------------------------------------- - -bool writeString(QFile &f,const char *s) -{ - int len=strlen(s)+1; - return (f.writeBlock(s,len)!=len); -} - -bool writeNumber(QFile &f,int num) -{ - return (f.putch((num>>24)&0xff)==-1) || - (f.putch((num>>16)&0xff)==-1) || - (f.putch((num>>8)&0xff)==-1) || - (f.putch(num&0xff)==-1); -} - -static bool writeEncodedNumber(QFile &f,uint number) -{ - bool error=FALSE; - uint n=number; - while (n>=128) - { - int frac=n&0x7f; - error = error || (f.putch(frac|0x80)==-1); - n>>=7; - } - error = error || (f.putch(n)==-1); - return error; -} - -static int encodedNumberSize(uint number) -{ - uint n=number; - int size=1; - while (n>=128) { size++; n>>=7; } - return size; -} - -//---------------------------------------------------------------------------- - -int SuffixNodeList::compareItems(GCI item1,GCI item2) -{ - SuffixNode *n1=(SuffixNode *)item1; - SuffixNode *n2=(SuffixNode *)item2; - return strcmp(n1->label,n2->label); -} - -SuffixNode::SuffixNode(const char *lab) : references(0) -{ - children = new SuffixNodeList; - children->setAutoDelete(TRUE); - label=lab; - totalFreq=0; - branchOffset=0; -} - -SuffixNode::~SuffixNode() -{ - delete children; -} - -void SuffixNode::addReference(int refId,int inName,int fullWord) -{ - totalFreq++; - uint s=references.size(); - if (s>0 && references.at(s-1).id==refId) // word occured in the same document - { - references.at(s-1).freq++; // increase word's frequency - references.at(s-1).flags=((references.at(s-1).flags & INNAME_MASK) - | (inName<first(); - while (sn) - { - const char *lab=sn->label.data(); - char w=word[0],l=lab[0],i=0; - while (w!=0 && l!=0 && w==l) { i++; w=word[i]; l=lab[i]; } - if (w==0 && l==0) // match found - { - sn->addReference(refId,inName,fullWord); - return numNewNodes; - } - if (i>0) // w and l contain a common prefix of length i - { - if (l==0) // w!=0 => follow this branch - { - sn->addReference(refId,inName,FALSE); - numNewNodes+=sn->insert(&word[i],refId,inName,fullWord); - } - else // l!=0 => split branch - { - char leftlab[MAXWORDLEN]; - memcpy(leftlab,lab,i); - leftlab[i]='\0'; - SuffixNode *r = new SuffixNode(leftlab); - numNewNodes++; - SuffixNode *n2 = children->take(); - // copy reference info - r->references = n2->references.copy(); - int j,refSize = r->references.size(); - for (j=0;jreferences[j].fullWord=FALSE; - //r->references[j].wordInName=FALSE; - r->references[j].flags &= ~(FULLWORD_MASK|WORDINNAME_MASK); - } - r->totalFreq = n2->totalFreq; - //printf("root branch `%s'\n",leftlab); - if (w!=0) // two sub branches - { - SuffixNode *n1 = new SuffixNode(&word[i]); - numNewNodes++; - n1->addReference(refId,inName,fullWord); - r->addReference(refId,inName,FALSE); - r->children->append(n1); - //printf("Right branch `%s'\n",&word[i]); - } - else // one sub branch - { - r->addReference(refId,inName,fullWord); - } - //printf("Left branch `%s'\n",&lab[i]); - n2->label=&lab[i]; - r->children->append(n2); - children->append(r); - } - return numNewNodes; - } - sn=children->next(); - } - //printf("new branch `%s'\n",word); - SuffixNode *n=new SuffixNode(word); - numNewNodes++; - n->addReference(refId,inName,fullWord); - children->append(n); - return numNewNodes; -} - -void SuffixNode::dump(int level,const char *prefix) -{ - uint i; - if (references.size()>0) - { - printf("%s (level=%d offset=%d freq=%d) ", - prefix,level,branchOffset,totalFreq); - for (i=0;i%d ",references.at(i).id,references.at(i).freq); - printf("\n"); - } - SuffixNode *sn=children->first(); - while (sn) - { - sn->dump(level+1,prefix+("-"+sn->label)); - sn=children->next(); - } -} - -void SuffixNode::resolveForwardReferences(int &offset) -{ - if (children->count()>0) - { - if (!label.isEmpty()) offset++; // terminator for the previous level - branchOffset=offset; - } - else - branchOffset=0; - SuffixNode *sn=children->first(); - while (sn) - { - offset+=sn->label.length()+5; - uint i,refs=sn->references.size(); - if (refs>0) - { - offset+=encodedNumberSize(sn->totalFreq); - offset+=encodedNumberSize((sn->references[0].id<<3)+ - sn->references[0].flags); - offset+=encodedNumberSize(sn->references[0].freq); - for (i=1;ireferences.at(i).id - sn->references.at(i-1).id)<<3)+ - sn->references.at(i).flags); - offset+=encodedNumberSize(sn->references.at(i).freq); - } - offset+=encodedNumberSize(0); - } - //printf("Lab=%s offset=%d\n",sn->lab.data(),offset); - sn=children->next(); - } - sn=children->first(); - while (sn) - { - //printf("Lab=%s offset=%d\n",sn->lab.data(),offset); - sn->resolveForwardReferences(offset); - sn=children->next(); - } -} - -int SuffixNode::size() -{ - int s=0; - if (!label.isEmpty() && children->count()>0) s++; // for the terminator - SuffixNode *sn=children->first(); - while (sn) - { - uint i,refs=sn->references.size(); - s+=sn->size()+sn->label.length()+5; - if (refs>0) - { - s+=encodedNumberSize(sn->totalFreq); - s+=encodedNumberSize( - (sn->references[0].id<<3)+ - sn->references[0].flags); - s+=encodedNumberSize(sn->references[0].freq); - for (i=1;ireferences.at(i).id - sn->references.at(i-1).id)<<3)+ - sn->references.at(i).flags); - s+=encodedNumberSize(sn->references.at(i).freq); - } - s+=encodedNumberSize(0); - } - sn=children->next(); - } - return s; -} - -bool SuffixNode::write(QFile &f) -{ - bool error=FALSE; - if (children->count()>0 && !label.isEmpty()) error=error || (f.putch(0)==-1); - SuffixNode *sn=children->first(); - while (sn) - { - //offset+=sn->lab.length()+1+2*sizeof(int); - int i,refs=sn->references.size(); - error=error || writeString(f,sn->label); - error=error || writeNumber(f,sn->branchOffset|((refs==0)?0x80000000:0)); - if (refs>0) - { - error=error || writeEncodedNumber(f,sn->totalFreq); - error=error || writeEncodedNumber(f, - (sn->references[0].id<<3)+ - sn->references[0].flags); - error=error || writeEncodedNumber(f,sn->references[0].freq); - for (i=1;ireferences[i].id - sn->references[i-1].id)<<3)+ - sn->references[i].flags); - error=error || writeEncodedNumber(f,sn->references[i].freq); - } - error=error || writeEncodedNumber(f,0); - } - //printf("Lab=%s offset=%d\n",sn->lab.data(),offset); - sn=children->next(); - } - sn=children->first(); - while (sn) - { - error=error || sn->write(f); - sn=children->next(); - } - return error; -} - -//---------------------------------------------------------------------------- - -SuffixTree::SuffixTree() -{ - root=new SuffixNode(""); - nodes=1; -} - -SuffixTree::~SuffixTree() -{ - delete root; -} - -void SuffixTree::insertWord(const char *word,int index,bool inName) -{ - QCString suffix=word; - uint i; - for (i=2;iinsert(suffix.right(i),index,inName?1:0,FALSE); - } - nodes+=root->insert(word,index,inName?1:0,TRUE); -} - -void SuffixTree::dump() -{ - root->dump(0,""); -} - -void SuffixTree::resolveForwardReferences() -{ - int offset=8; - root->resolveForwardReferences(offset); -} - -int SuffixTree::size() -{ - return root->size(); -} - -bool SuffixTree::write(QFile &f) -{ - if (!f.isOpen()) { printf("File not open\n"); return FALSE; } - bool error=FALSE; - error = error || root->write(f); - return !error; -} diff --git a/src/suffixtree.h b/src/suffixtree.h deleted file mode 100644 index 28d2a6c..0000000 --- a/src/suffixtree.h +++ /dev/null @@ -1,89 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2003 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 SUFFIXTREE_H -#define SUFFIXTREE_H - -#include "qtbc.h" -#include -#include -#include - -class SuffixNodeList; -class IndexTree; - -enum WordRefMasks { WORDINNAME_MASK=4, INNAME_MASK=2, FULLWORD_MASK=1 }; -enum WordRefBits { WORDINNAME_BIT=2, INNAME_BIT=1, FULLWORD_BIT=0 }; - -struct WordRef -{ - int id; - short freq; - char flags; -}; - -class SuffixNode -{ - friend class SuffixTree; - friend class IndexNode; - friend class SuffixNodeList; - public: - SuffixNode(const char *); - ~SuffixNode(); - int insert(const char *word,int refId,int inName,int full); - void addReference(int refId,int inName,int fullWord); - void dump(int,const char *); - void resolveForwardReferences(int &offset); - int size(); // return the size of the tree whose root is this node - bool write(QFile &f); - private: - SuffixNodeList *children; - QArray references; - QCString label; - int branchOffset; - int totalFreq; -}; - -class SuffixNodeList : public QList -{ - public: - SuffixNodeList() : QList() {} - ~SuffixNodeList() {} - int compareItems(GCI item1,GCI item2); -}; - -class SuffixTree -{ - friend class SuffixNode; - public: - SuffixTree(); - ~SuffixTree(); - void insertWord(const char *word,int index,bool inName); - void resolveForwardReferences(); - void dump(); - int size(); // return the size of the (flat) tree in bytes - bool write(QFile &f); - int numberOfNodes() { return nodes; } - private: - int nodes; - SuffixNode *root; -}; - -extern bool writeNumber(QFile &f,int); -extern bool writeString(QFile &f,const char *s); - -#endif diff --git a/src/translator.h b/src/translator.h index 4b1679c..5741d51 100644 --- a/src/translator.h +++ b/src/translator.h @@ -407,6 +407,15 @@ class Translator virtual QCString trAll() = 0; virtual QCString trCallGraph() = 0; +////////////////////////////////////////////////////////////////////////// +// new since 1.3.3 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trSearchForIndex() = 0; + virtual QCString trSearchResultsTitle() = 0; + virtual QCString trSearchResults(int numDocuments) = 0; + virtual QCString trSearchMatches() = 0; + }; #endif diff --git a/src/translator_adapter.h b/src/translator_adapter.h index 7aaa3ca..03dafd9 100644 --- a/src/translator_adapter.h +++ b/src/translator_adapter.h @@ -40,12 +40,28 @@ class TranslatorAdapterBase : public Translator }; -class TranslatorAdapter_1_3_1 : public TranslatorAdapterBase +class TranslatorAdapter_1_3_3 : public TranslatorAdapterBase { public: virtual QCString updateNeededMessage() - { return createUpdateNeededMessage(idLanguage(),"release 1.3.1"); } + { return createUpdateNeededMessage(idLanguage(),"release 1.3.3"); } + + virtual QCString trSearchForIndex() + { return english.trSearchForIndex(); } + virtual QCString trSearchResultsTitle() + { return english.trSearchResultsTitle(); } + virtual QCString trSearchResults(int numDocuments) + { return english.trSearchResults(numDocuments); } + virtual QCString trSearchMatches() + { return english.trSearchMatches(); } + +}; +class TranslatorAdapter_1_3_1 : public TranslatorAdapter_1_3_3 +{ + public: + virtual QCString updateNeededMessage() + { return createUpdateNeededMessage(idLanguage(),"release 1.3.1"); } virtual QCString trAll() { return english.trAll(); } virtual QCString trCallGraph() diff --git a/src/translator_br.h b/src/translator_br.h index 2f433b3..8f4e501 100644 --- a/src/translator_br.h +++ b/src/translator_br.h @@ -29,7 +29,7 @@ #ifndef TRANSLATOR_BR_H #define TRANSLATOR_BR_H -class TranslatorBrazilian: public Translator +class TranslatorBrazilian: public TranslatorAdapter_1_3_3 { public: diff --git a/src/translator_cz.h b/src/translator_cz.h index f826808..c2eb801 100644 --- a/src/translator_cz.h +++ b/src/translator_cz.h @@ -157,7 +157,7 @@ // Windows version. The version which does not call the function is // probably slightly faster. -class TranslatorCzech : public Translator +class TranslatorCzech : public TranslatorAdapter_1_3_3 { private: /*! The decode() inline assumes the source written in the diff --git a/src/translator_en.h b/src/translator_en.h index 9342828..b22bd27 100644 --- a/src/translator_en.h +++ b/src/translator_en.h @@ -181,7 +181,7 @@ class TranslatorEnglish : public Translator } else { - return "Compound List"; + return "Class List"; } } @@ -202,7 +202,7 @@ class TranslatorEnglish : public Translator } else { - return "Compound Members"; + return "Class Members"; } } @@ -377,7 +377,7 @@ class TranslatorEnglish : public Translator } else { - return "Compound Index"; + return "Class Index"; } } @@ -525,7 +525,7 @@ class TranslatorEnglish : public Translator } else { - return "Compounds"; + return "Classes"; } } @@ -1489,6 +1489,55 @@ class TranslatorEnglish : public Translator return "Here is the call graph for this function:"; } +////////////////////////////////////////////////////////////////////////// +// new since 1.3.3 +////////////////////////////////////////////////////////////////////////// + + /*! When the search engine is enabled this text is put in the index + * of each page before the search field. + */ + virtual QCString trSearchForIndex() + { + return "Search for"; + } + /*! This string is used as the title for the page listing the search + * results. + */ + virtual QCString trSearchResultsTitle() + { + return "Search Results"; + } + /*! 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 "Sorry, no documents matching your query."; + } + else if (numDocuments==1) + { + return "Found 1 document matching your query."; + } + else + { + return "Found $num documents matching your query. " + "Showing best matches first."; + } + } + /*! 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 "Matches:"; + } }; diff --git a/src/translator_fr.h b/src/translator_fr.h index ce136a0..810f934 100644 --- a/src/translator_fr.h +++ b/src/translator_fr.h @@ -54,7 +54,7 @@ #ifndef TRANSLATOR_FR_H #define TRANSLATOR_FR_H -class TranslatorFrench : public Translator +class TranslatorFrench : public TranslatorAdapter_1_3_3 { public: QCString idLanguage() diff --git a/src/translator_it.h b/src/translator_it.h index cebfd3d..302c0df 100644 --- a/src/translator_it.h +++ b/src/translator_it.h @@ -69,7 +69,7 @@ #ifndef TRANSLATOR_IT_H #define TRANSLATOR_IT_H -class TranslatorItalian : public Translator +class TranslatorItalian : public TranslatorAdapter_1_3_3 { public: diff --git a/src/translator_kr.h b/src/translator_kr.h index 3134893..461b47c 100644 --- a/src/translator_kr.h +++ b/src/translator_kr.h @@ -1389,6 +1389,62 @@ class TranslatorKorean : public TranslatorAdapter_1_3 return "À̺¥Æ® ¹®¼­È­"; } +////////////////////////////////////////////////////////////////////////// +// new since 1.3 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a heading for a list of Java class types with package scope. + */ + virtual QCString trPackageTypes() + { + return "ÆÐÅ°Áö ŸÀÔ"; + } + /*! Used as a heading for a list of Java class functions with package + * scope. + */ + virtual QCString trPackageMembers() + { + return "ÆÐÅ°Áö ÇÔ¼ö"; + } + /*! Used as a heading for a list of static Java class functions with + * package scope. + */ + virtual QCString trStaticPackageMembers() + { + return "Á¤Àû ÆÐÅ°Áö ÇÔ¼ö"; + } + /*! Used as a heading for a list of Java class variables with package + * scope. + */ + virtual QCString trPackageAttribs() + { + return "ÆÐÅ°Áö ¼Ó¼º"; + } + /*! Used as a heading for a list of static Java class variables with + * package scope. + */ + virtual QCString trStaticPackageAttribs() + { + return "Á¤Àû ÆÐÅ°Áö ¼Ó¼º"; + } + +////////////////////////////////////////////////////////////////////////// +// 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 "All"; + } + /*! Put in front of the call graph for a function. */ + virtual QCString trCallGraph() + { + return "ÀÌ ÇÔ¼öÀÇ È£Ãâ»óŸ¦ ³ªÅ¸³½ ±×·¡ÇÁÀÔ´Ï´Ù."; + } + }; #endif diff --git a/src/translator_nl.h b/src/translator_nl.h index 7b18489..04929f0 100644 --- a/src/translator_nl.h +++ b/src/translator_nl.h @@ -88,13 +88,13 @@ class TranslatorDutch : public Translator QCString trClassHierarchy() { return "Klasse Hiërarchie"; } QCString trCompoundList() - { return "Compound Lijst"; } + { return "Klasse Lijst"; } QCString trFileList() { return "File Lijst"; } QCString trHeaderFiles() { return "Header Lijst"; } QCString trCompoundMembers() - { return "Compound Members"; } + { return "Klasse Members"; } QCString trFileMembers() { return "File members"; } QCString trRelatedPages() @@ -154,7 +154,7 @@ class TranslatorDutch : public Translator QCString trHierarchicalIndex() { return "Hiërarchische Index"; } QCString trCompoundIndex() - { return "Compound Index"; } + { return "Klasse Index"; } QCString trFileIndex() { return "File Index"; } QCString trModuleDocumentation() @@ -199,7 +199,7 @@ class TranslatorDutch : public Translator QCString trVariableDocumentation() { return "Documentatie van variabelen"; } QCString trCompounds() - { return "Compounds"; } + { return "Klassen"; } QCString trGeneratedAt(const char *date,const char *projName) { QCString result=(QCString)"Gegenereerd op "+date; @@ -1085,6 +1085,57 @@ class TranslatorDutch : public Translator { return "Hier is de call graaf voor deze functie:"; } + +////////////////////////////////////////////////////////////////////////// +// new since 1.3.3 +////////////////////////////////////////////////////////////////////////// + + /*! When the search engine is enabled this text is put in the index + * of each page before the search field. + */ + virtual QCString trSearchForIndex() + { + return "Zoek naar"; + } + /*! This string is used as the title for the page listing the search + * results. + */ + virtual QCString trSearchResultsTitle() + { + return "Zoek Resultaten"; + } + /*! 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 "Helaas, er zijn geen documenten gevonden die aan de zoekopdracht voldoen."; + } + else if (numDocuments==1) + { + return "Er is 1 document gevonden dat aan de zoekopdracht voldoet."; + } + else + { + return "Er zijn $num documenten gevonden die aan de zoekopdracht voldoen. " + "De beste resultaten worden eerst getoond."; + } + } + /*! 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 "Gevonden:"; + } + }; diff --git a/src/translator_pt.h b/src/translator_pt.h index 2bc323e..79506ac 100644 --- a/src/translator_pt.h +++ b/src/translator_pt.h @@ -40,7 +40,7 @@ #ifndef TRANSLATOR_PT_H #define TRANSLATOR_PT_H -class TranslatorPortuguese : public Translator +class TranslatorPortuguese : public TranslatorAdapter_1_3_3 { public: diff --git a/src/translator_se.h b/src/translator_se.h index c1b5cd2..fdbfd4e 100644 --- a/src/translator_se.h +++ b/src/translator_se.h @@ -20,6 +20,7 @@ Svensk översättning av: Samuel Hägglund Xet Erixon +Mikael Hallin 2003-07-28 ================================================================================== Uppdateringar. 1999/04/29 @@ -57,122 +58,177 @@ Problem! av "namespace", så jag kör med det från och med nu. * "interface" heter numera "gränssnitt" +2003/07/28 +* Jag har updaterat översättningen efter ett par års träda.. +Problem! + Deprecated: nån hygglig svensk översättning??? + + Skicka gärna synpunkter. */ #ifndef TRANSLATOR_SE_H #define TRANSLATOR_SE_H -class TranslatorSwedish : public TranslatorEnglish +class TranslatorSwedish : public TranslatorAdapter_1_3_3 { 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. + + virtual QCString idLanguage() + { return "swedish"; } + + /*! 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 + *
    "\\usepackage[german]{babel}\n"
    +     *  
    + * or + *
    "\\usepackage{polski}\n"
    +     *  "\\usepackage[latin2]{inputenc}\n"
    +     *  "\\usepackage[T1]{fontenc}\n"
    +     *  
    + * + * The English LaTeX does not use such commands. Because of this + * the empty string is returned in this implementation. */ - virtual QCString updateNeededMessage() + virtual QCString latexLanguageSupportCommand() { - return "Warning: The Swedish 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"; + return ""; } - QCString idLanguage() - { return "swedish"; } - QCString latexBabelPackage() - { return "swedish"; } + /*! return the language charset. This will be used for the HTML output */ + virtual QCString idLanguageCharset() + { + return "iso-8859-1"; + } - QCString trRelatedFunctions() + virtual QCString trRelatedFunctions() { return "Besläktade funktioner"; } - QCString trRelatedSubscript() + virtual QCString trRelatedSubscript() { return "(Observera att dessa inte är medlemsfunktioner)"; } - QCString trDetailedDescription() + virtual QCString trDetailedDescription() { return "Detaljerad beskrivning"; } - QCString trMemberTypedefDocumentation() - { return "Dokumentation över typdefinierade medlemmar"; } + virtual QCString trMemberTypedefDocumentation() + { return "Dokumentation av typdefinierade medlemmar"; } - QCString trMemberEnumerationDocumentation() - { return "Dokumentation över egenuppräknande medlemmar"; } + virtual QCString trMemberEnumerationDocumentation() + { return "Dokumentation av egenuppräknande medlemmar"; } - QCString trMemberFunctionDocumentation() - { return "Dokumentation över medlemsfunktioner"; } + virtual QCString trMemberFunctionDocumentation() + { return "Dokumentation av medlemsfunktioner"; } - QCString trMemberDataDocumentation() - { return "Dokumentation över datamedlemmar"; } + virtual QCString trMemberDataDocumentation() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Fält dokumentation"; + } + else + { + return "Dokumentation av datamedlemmar"; + } + } - QCString trMore() + virtual QCString trMore() { return "Mer..."; } - QCString trListOfAllMembers() + virtual QCString trListOfAllMembers() { return "Lista över alla medlemmar."; } - QCString trMemberList() + virtual QCString trMemberList() { return "Medlemslista"; } - QCString trThisIsTheListOfAllMembers() + virtual QCString trThisIsTheListOfAllMembers() { return "Det här är en fullständig lista över medlemmar för "; } - QCString trIncludingInheritedMembers() + virtual QCString trIncludingInheritedMembers() { return " med alla ärvda medlemmar."; } - QCString trGeneratedAutomatically(const char *s) + virtual QCString trGeneratedAutomatically(const char *s) { QCString result="Automatiskt skapad av Doxygen"; if (s) result+=(QCString)" för "+s; result+=" från källkoden."; return result; } - QCString trEnumName() + virtual QCString trEnumName() { return "enum namn"; } - QCString trEnumValue() + virtual QCString trEnumValue() { return "enum värde"; } - QCString trDefinedIn() + virtual QCString trDefinedIn() { return "definierad i"; } - +/* QCString trVerbatimText(const char *f) { return (QCString)"Detta är den ordagranna texten från inkluderingsfilen "+f; } - - QCString trModules() +*/ + virtual QCString trModules() { return "Moduler"; } - QCString trClassHierarchy() + virtual QCString trClassHierarchy() { return "Klasshierarki"; } - QCString trCompoundList() - { return "Sammansatt klasslista"; } + virtual QCString trCompoundList() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Datastrukturer"; + } + else + { + return "Sammansatt klasslista"; + } + } - QCString trFileList() + virtual QCString trFileList() { return "Fillista"; } - QCString trHeaderFiles() + virtual QCString trHeaderFiles() { return "Headerfiler"; } - QCString trCompoundMembers() - { return "Sammansatta klassmedlemmar"; } + virtual QCString trCompoundMembers() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Data fält"; + } + else + { + return "Sammansatta klassmedlemmar"; + } + } - QCString trFileMembers() - { return "Filmedlemmar"; } + virtual QCString trFileMembers() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Globala symboler"; + } + else + { + return "Filmedlemmar"; + } + } - QCString trRelatedPages() + virtual QCString trRelatedPages() { return "Besläktade sidor"; } - QCString trExamples() + virtual QCString trExamples() { return "Exempel"; } - QCString trSearch() + virtual QCString trSearch() { return "Sök"; } - QCString trClassHierarchyDescription() + virtual QCString trClassHierarchyDescription() { return "Denna lista över arv är grovt, men inte helt, " "sorterad i alfabetisk ordning:"; } - QCString trFileListDescription(bool extractAll) + virtual QCString trFileListDescription(bool extractAll) { QCString result="Här följer en lista över alla "; if (!extractAll) result+="dokumenterade "; @@ -180,128 +236,206 @@ class TranslatorSwedish : public TranslatorEnglish return result; } - QCString trCompoundListDescription() - { return "Här följer klasserna, strukterna och " - "unionerna med en kort beskrivning:"; + virtual QCString trCompoundListDescription() + { + + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Här följer datastrukturerna med korta beskrivningar:"; + } + else + { + return "Här följer klasserna, strukterna, unionerna och " + "gränssnitten med korta beskrivningar:"; + } } - QCString trCompoundMembersDescription(bool extractAll) + /*! This is an introduction to the page with all class members. */ + virtual QCString trCompoundMembersDescription(bool extractAll) { - - QCString result="Här följer en lista över alla "; - if (!extractAll) result+="dokumenterade "; - result+="klassmedlemmar med länkar till "; - if (!extractAll) result+="klassdokumentationen för varje medlem:"; - else result+="klasserna som de tillhör:"; + QCString result="Här är en lista över alla "; + if (!extractAll) + { + result+="dokumenterade "; + } + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + result+="struktur- och unions-fält"; + } + else + { + result+="klassmedlemmar"; + } + result+=" med länkar till "; + if (!extractAll) + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + result+="struktur/unions-dokumentationen för varje fält:"; + } + else + { + result+="klassdokumentationen för varje medlem:"; + } + } + else + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + result+=" strukturerna/unionerna de tillhör:"; + } + else + { + result+="klasserna de tillhör:"; + } + } return result; } - QCString trFileMembersDescription(bool extractAll) + virtual QCString trFileMembersDescription(bool extractAll) { QCString result="Här följer en lista över alla "; if (!extractAll) result+="dokumenterade "; - result+="filmedlemmar med länkar till "; - if (extractAll) result+="dokumentationsfilen för varje medlem:"; - else result+="filerna som de tillhör:"; + + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + result+="funktioner, variabler, definitioner, enumerationer " + "och typdefinitioner"; + } + else + { + result+= "filmedlemmar"; + } + result+= " med länkar till "; + if (extractAll) + result+= "filerna som de tillhör:"; + else + result+= "dokumentationen:"; return result; } - QCString trHeaderFilesDescription() + virtual QCString trHeaderFilesDescription() { return "Här följer headerfilerna som API:n består av:"; } - QCString trExamplesDescription() + virtual QCString trExamplesDescription() { return "Här följer en lista med alla exempel:"; } - QCString trRelatedPagesDescription() + virtual QCString trRelatedPagesDescription() { return "Här följer en lista över alla besläktade dokumentationssidor:";} - QCString trModulesDescription() + virtual QCString trModulesDescription() { return "Här följer en lista över alla moduler:"; } - QCString trNoDescriptionAvailable() + virtual QCString trNoDescriptionAvailable() { return "Beskrivning saknas"; } - QCString trDocumentation() + virtual QCString trDocumentation() { return "Dokumentation"; } - QCString trModuleIndex() + virtual QCString trModuleIndex() { return "Modulindex"; } - QCString trHierarchicalIndex() + virtual QCString trHierarchicalIndex() { return "Hierarkiskt Index"; } - QCString trCompoundIndex() - { return "Sammansatt Index"; } + /*! 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 "Index över datastrukturer"; + } else { + return "Index över sammensatta typer"; + } + } - QCString trFileIndex() + virtual QCString trFileIndex() { return "Filindex"; } - QCString trModuleDocumentation() + virtual QCString trModuleDocumentation() { return "Dokumentation över moduler"; } - QCString trClassDocumentation() - { return "Dokumentation över klasser"; } + /*! 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 "Dokumentation över datastrukturer"; + } + else + { + return "Documentation över klasser"; + } + } - QCString trFileDocumentation() + virtual QCString trFileDocumentation() { return "Dokumentation över filer"; } - QCString trExampleDocumentation() + virtual QCString trExampleDocumentation() { return "Dokumentation över exempel"; } - QCString trPageDocumentation() + virtual QCString trPageDocumentation() { return "Dokumentation av sidor"; } - QCString trReferenceManual() + virtual QCString trReferenceManual() { return "Referensmanual"; } - QCString trDefines() + virtual QCString trDefines() { return "Definitioner"; } - QCString trFuncProtos() + virtual QCString trFuncProtos() { return "Funktionsprototyper"; } - QCString trTypedefs() + virtual QCString trTypedefs() { return "Typdefinitioner"; } - QCString trEnumerations() + virtual QCString trEnumerations() { return "Egenuppräknande typer"; } - QCString trFunctions() + virtual QCString trFunctions() { return "Funktioner"; } - - QCString trVariables() + virtual QCString trVariables() { return "Variabler"; } - QCString trEnumerationValues() + virtual QCString trEnumerationValues() { return "Egenuppräknade typers värden"; } - QCString trAuthor() - { return "Författare"; } - - QCString trDefineDocumentation() + virtual QCString trDefineDocumentation() { return "Dokumentation över definitioner"; } - QCString trFunctionPrototypeDocumentation() + virtual QCString trFunctionPrototypeDocumentation() { return "Dokumentation över funktionsprototyper"; } - QCString trTypedefDocumentation() + virtual QCString trTypedefDocumentation() { return "Dokumentation över typdefinitioner"; } - QCString trEnumerationTypeDocumentation() + virtual QCString trEnumerationTypeDocumentation() { return "Dokumentation över egenuppräknande typer"; } - QCString trEnumerationValueDocumentation() + virtual QCString trEnumerationValueDocumentation() { return "Dokumentation över egenuppräknande typers värden"; } - QCString trFunctionDocumentation() + virtual QCString trFunctionDocumentation() { return "Dokumentation över funktioner"; } - QCString trVariableDocumentation() + virtual QCString trVariableDocumentation() { return "Dokumentation över variabler"; } - QCString trCompounds() - { return "Sammansättning"; } - - QCString trFiles() - { return "Filer"; } + /*! 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 "Datastrukturer"; + } + else + { + return "Sammansättning"; + } + } - QCString trGeneratedAt(const char *date,const char *projName) + virtual QCString trGeneratedAt(const char *date,const char *projName) { QCString result=(QCString)"Skapad "+date; if (projName) result+=(QCString)" för "+projName; @@ -309,62 +443,59 @@ class TranslatorSwedish : public TranslatorEnglish return result; } - QCString trWrittenBy() + virtual QCString trWrittenBy() { return "skriven av"; } - QCString trClassDiagram(const char *clName) + virtual QCString trClassDiagram(const char *clName) { return (QCString)"Klassdiagram för "+clName; } - QCString trForInternalUseOnly() + virtual QCString trForInternalUseOnly() { return "Endast för internt bruk."; } - QCString trReimplementedForInternalReasons() - { return "Omskriven av intern anledning ; API:n påverkas inte.";} + virtual QCString trReimplementedForInternalReasons() + { return "Omskriven av intern anledning; API:n påverkas inte.";} - QCString trWarning() + virtual QCString trWarning() { return "Varning"; } - QCString trBugsAndLimitations() + virtual QCString trBugsAndLimitations() { return "Fel och begränsningar"; } - QCString trVersion() + virtual QCString trVersion() { return "Version"; } - QCString trDate() + virtual QCString trDate() { return "Datum"; } - QCString trAuthors() - { return "Författare"; } - - QCString trReturns() + virtual QCString trReturns() { return "Returnerar"; } - QCString trSeeAlso() + virtual QCString trSeeAlso() { return "Se även"; } - QCString trParameters() + virtual QCString trParameters() { return "Parametrar"; } - QCString trExceptions() + virtual QCString trExceptions() { return "Undantag"; } - QCString trGeneratedBy() + virtual QCString trGeneratedBy() { return "Skapad av"; } // new since 0.49-990307 virtual QCString trNamespaceList() - { return "Namnrymdlista"; } + { return "Namnrymdslista"; } virtual QCString trNamespaceListDescription(bool extractAll) { QCString result="Här är en lista över alla "; if (!extractAll) result+="dokumenterade "; - result+="namnrymder med en kort förklaring:"; + result+="namnrymder med en kort beskrivning:"; return result; } @@ -384,7 +515,7 @@ class TranslatorSwedish : public TranslatorEnglish virtual QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, - bool /*isTemplate*/) + bool isTemplate) { QCString result=(QCString)clName+" "; switch(compType) @@ -393,8 +524,9 @@ class TranslatorSwedish : public TranslatorEnglish case ClassDef::Struct: result+=" strukt"; break; case ClassDef::Union: result+=" union"; break; case ClassDef::Interface: result+=" gränssnitt"; break; - case ClassDef::Exception: result+=" exception"; break; + case ClassDef::Exception: result+=" undantag"; break; } + if (isTemplate) result+="template"; result+="referens"; return result; } @@ -531,7 +663,7 @@ class TranslatorSwedish : public TranslatorEnglish case ClassDef::Struct: result+="denna strukt "; break; case ClassDef::Union: result+="denna union "; break; case ClassDef::Interface: result+="detta gränssnitt "; break; - case ClassDef::Exception: result+="exception "; break; + case ClassDef::Exception: result+="detta undantag "; break; } result+="var genererad från följande fil"; if (single) result+=":"; else result+="er:"; @@ -580,6 +712,642 @@ class TranslatorSwedish : public TranslatorEnglish { return "Definition i filen @0."; } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-991205 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trDeprecated() + { + return "Föråldrad"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.0.0 +////////////////////////////////////////////////////////////////////////// + + /*! this text is put before a collaboration diagram */ + virtual QCString trCollaborationDiagram(const char *clName) + { + return (QCString)"Samarbetsdiagram för "+clName+":"; + } + + /*! this text is put before an include dependency graph */ + virtual QCString trInclDepGraph(const char *fName) + { + return (QCString)"Include-beroendediagram för "+fName+":"; + } + + /*! header that is put before the list of constructor/destructors. */ + virtual QCString trConstructorDocumentation() + { + return "Dokumentation av konstruktorer och destruktorer"; + } + + /*! Used in the file documentation to point to the corresponding sources. */ + virtual QCString trGotoSourceCode() + { + return "Gå till denna fils källkod."; + } + + /*! Used in the file sources to point to the corresponding documentation. */ + virtual QCString trGotoDocumentation() + { + return "Gå till denna fils dokumentation."; + } + + /*! Text for the \\pre command */ + virtual QCString trPrecondition() + { + return "Förhandsvillkor"; + } + + /*! Text for the \\post command */ + virtual QCString trPostcondition() + { + return "Resultat"; //"Postcondition"; + } + + /*! Text for the \\invariant command */ + virtual QCString trInvariant() + { + return "Invariant"; + } + + /*! Text shown before a multi-line variable/enum initialization */ + virtual QCString trInitialValue() + { + return "Begynnelsevärde:"; + } + /*! Text used the source code in the file index */ + virtual QCString trCode() + { + return "källkod"; + } + + virtual QCString trGraphicalHierarchy() + { + return "Grafisk klasshierarki"; + } + virtual QCString trGotoGraphicalHierarchy() + { + return "Gå till den grafiska klasshierarkin"; + } + virtual QCString trGotoTextualHierarchy() + { + return "Gå till den textbaserade klasshierarkin"; + } + virtual QCString trPageIndex() + { + return "Sidindex"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.0 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trNote() + { + return "Notera"; + } + virtual QCString trPublicTypes() + { + return "Publika typer"; + } + virtual QCString trPublicAttribs() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Datafält"; + } + else + { + return "Publika attribut"; + } + } + virtual QCString trStaticPublicAttribs() + { + return "Statiska publika attribut"; + } + virtual QCString trProtectedTypes() + { + return "Skyddade typer"; + } + virtual QCString trProtectedAttribs() + { + return "Skyddade attribut"; + } + virtual QCString trStaticProtectedAttribs() + { + return "Statiska skyddade attribut"; + } + virtual QCString trPrivateTypes() + { + return "Privata typer"; + } + virtual QCString trPrivateAttribs() + { + return "Privata attribut"; + } + virtual QCString trStaticPrivateAttribs() + { + return "Statiska privata attribut"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.3 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a marker that is put before a \\todo item */ + virtual QCString trTodo() + { + return "Att-göra"; + } + /*! Used as the header of the todo list */ + virtual QCString trTodoList() + { + return "Att-göra lista"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.4 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trReferencedBy() + { + return "Refererad av"; + } + virtual QCString trRemarks() + { + return "Lägg märke till"; + } + virtual QCString trAttention() + { + return "Observera"; + } + virtual QCString trInclByDepGraph() + { + return "Den här grafen visar vilka filer som direkt eller " + "indirekt inkluderar denna filen."; + } + virtual QCString trSince() + { + return "Sedan"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.5 +////////////////////////////////////////////////////////////////////////// + + /*! title of the graph legend page */ + virtual QCString trLegendTitle() + { + return "Grafförklaring"; + } + + /*! 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 + "Den här sidan förklarar hur man ska tolka de grafer som doxygen " + "genererar.

    \n" + "Tag följande exempel:\n" + "\\code\n" + "/*! Osynlig klass på grund av stympning */\n" + "class Invisible { };\n\n" + "/*! Stympad klass, ärvningsrelationen är dold */\n" + "class Truncated : public Invisible { };\n\n" + "/* Klass utan doxygen-kommentarer */\n" + "class Undocumented { };\n\n" + "/*! Klass som ärvs med publikt arv */\n" + "class PublicBase : public Truncated { };\n\n" + "/*! En template-klass */\n" + "template class Templ { };\n\n" + "/*! Klass som ärvs med skyddat arv */\n" + "class ProtectedBase { };\n\n" + "/*! Klass som ärvs med privat arv */\n" + "class PrivateBase { };\n\n" + "/*! Klass som används av Inherited klassen */\n" + "class Used { };\n\n" + "/*! Super klassen som ärver ett antal andra klasser */\n" + "class Inherited : public PublicBase,\n" + " protected ProtectedBase,\n" + " private PrivateBase,\n" + " public Undocumented\n" + " public Templ\n" + "{\n" + " private:\n" + " Used *m_usedClass;\n" + "};\n" + "\\endcode\n" + "Om \\c MAX_DOT_GRAPH_HEIGHT är satt till 240 i konfigurationsfilen, " + "kommer följande graf att generas:" + "

    \"\"
    \n" + "

    \n" + "Rektanglarna i den ovanstående grafen har följande betydelser:\n" + "

      \n" + "
    • %En fylld svart rektangel representerar den strukt eller klass " + "som har genererat grafen.\n" + "
    • %En rektangel med svart kant symboliserar en dokumenterad " + "strukt eller klass.\n" + "
    • %En rektangel med grå kant symboliserar en odokumenterad strukt " + "eller klass.\n" + "
    • %En klass med röd kant symboliserar en strukt eller klass där " + "alla dess relationer inte visas. %En graf stympas om den inte får " + "plats inom de givna gränserna.\n" + "
    \n" + "Pilarna har följande betydelser:\n" + "
      \n" + "
    • %En mörkblå pil används för att visualisera en publik arvrelation " + "mellan två klasser.\n" + "
    • %En mörkgrön pil används för en skyddad arvsrelation.\n" + "
    • %En mörkröd pil används för en privat arvsrelation.\n" + "
    • %En sträckad lila pil används om en klass är innesluten eller " + "använd av en annan klass. Vid pilen står namnet på den eller de " + "variabler som klassen pilen pekar på kommer åt.\n" + "
    • %En sträckad gul pil symboliserar förhållandet mellan en " + "template-instans och template-klassen, som den instantierades från.\n" + "Vid pilen står instansens template-parametrar.\n" + "
    \n"; + } + + /*! text for the link to the legend page */ + virtual QCString trLegend() + { + return "förklaring"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.0 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a marker that is put before a test item */ + virtual QCString trTest() + { + return "Test"; + } + /*! Used as the header of the test list */ + virtual QCString trTestList() + { + return "Testlista"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.1 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a section header for KDE-2 IDL methods */ + virtual QCString trDCOPMethods() + { + return "DCOP metoder"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.2 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a section header for IDL properties */ + virtual QCString trProperties() + { + return "Egenskaper"; + } + /*! Used as a section header for IDL property documentation */ + virtual QCString trPropertyDocumentation() + { + return "Egenskapsdokumentation"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.4 +////////////////////////////////////////////////////////////////////////// + + /*! Used for Java interfaces in the summary section of Java packages */ + virtual QCString trInterfaces() + { + return "Gränssnitt"; + } + /*! Used for Java classes in the summary section of Java packages */ + virtual QCString trClasses() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Datastrukturer"; + } + else + { + return "Klasser"; + } + } + /*! Used as the title of a Java package */ + virtual QCString trPackage(const char *name) + { + return (QCString)"Paket "+name; + } + /*! Title of the package index page */ + virtual QCString trPackageList() + { + return "Paketlista"; + } + /*! The description of the package index page */ + virtual QCString trPackageListDescription() + { + return "Här är en lista över paketen med en kort beskrivning " + "(om sådan finns):"; + } + /*! The link name in the Quick links header for each page */ + virtual QCString trPackages() + { + return "Paket"; + } + /*! Used as a chapter title for Latex & RTF output */ + virtual QCString trPackageDocumentation() + { + return "Paketdokumentation"; + } + /*! Text shown before a multi-line define */ + virtual QCString trDefineValue() + { + return "Värde:"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.5 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a marker that is put before a \\bug item */ + virtual QCString trBug() + { + return "Bugg"; + } + /*! Used as the header of the bug list */ + virtual QCString trBugList() + { + return "Bugglista"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.6 +////////////////////////////////////////////////////////////////////////// + + /*! Used as ansicpg for RTF file + * (used table extract:) + *
    +     * Charset Name       Charset Value(hex)  Codepage number
    +     * ------------------------------------------------------
    +     * ANSI_CHARSET              0 (x00)            1252
    +	 * 
    + */ + virtual QCString trRTFansicp() + { + return "1252"; + } + + /*! Used as ansicpg for RTF fcharset */ + virtual QCString trRTFCharSet() + { + return "0"; + } + + /*! Used as header RTF general index */ + virtual QCString trRTFGeneralIndex() + { + 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 + * of the category. + */ + virtual QCString trClass(bool first_capital, bool singular) + { + QCString result((first_capital ? "Klass" : "klass")); + if (!singular) result+="er"; + 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 ? "Fil" : "fil")); + if (!singular) result+="er"; + 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 ? "Namnrymd" : "namnrynd")); + if (!singular) result+="er"; + 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 ? "Grupp" : "grupp")); + if (!singular) result+="er"; + 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 ? "Sid" : "sid")); + if (singular) + result+="a"; + else + result+="or"; + 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 ? "Medlem" : "medlem")); + if (!singular) result+="mar"; + 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 trField(bool first_capital, bool /*singular*/) + { + QCString result((first_capital ? "Fält" : "fält")); + 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 ? "Global" : "global")); + if (!singular) result+="er"; + 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 ? "Författare" : "författare")); + return result; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.11 +////////////////////////////////////////////////////////////////////////// + + /*! This text is put before the list of members referenced by a member + */ + virtual QCString trReferences() + { + return "Referenser"; + } + +////////////////////////////////////////////////////////////////////////// +// 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 "Implementerar "+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 "Implementerad i "+trWriteList(numEntries)+"."; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.16 +////////////////////////////////////////////////////////////////////////// + + /*! used in RTF documentation as a heading for the Table + * of Contents. + */ + virtual QCString trRTFTableOfContents() + { + return "Innehållsförteckning"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.17 +////////////////////////////////////////////////////////////////////////// + + /*! Used as the header of the list of item that have been + * flagged deprecated + */ + virtual QCString trDeprecatedList() + { + return "Lista över föråldrade"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.18 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a header for declaration section of the events found in + * a C# program + */ + virtual QCString trEvents() + { + return "Händelser"; + } + /*! Header used for the documentation section of a class' events. */ + virtual QCString trEventDocumentation() + { + return "Händelse Dokumentation"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.3 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a heading for a list of Java class types with package scope. + */ + virtual QCString trPackageTypes() + { + return "Paket typer"; + } + /*! Used as a heading for a list of Java class functions with package + * scope. + */ + virtual QCString trPackageMembers() + { + return "Paket funktioner"; + } + /*! Used as a heading for a list of static Java class functions with + * package scope. + */ + virtual QCString trStaticPackageMembers() + { + return "Statiska paket funktioner"; + } + /*! Used as a heading for a list of Java class variables with package + * scope. + */ + virtual QCString trPackageAttribs() + { + return "Paket attribut"; + } + /*! Used as a heading for a list of static Java class variables with + * package scope. + */ + virtual QCString trStaticPackageAttribs() + { + return "Statiska paket attribut"; + } + +////////////////////////////////////////////////////////////////////////// +// 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 "Alla"; + } + /*! Put in front of the call graph for a function. */ + virtual QCString trCallGraph() + { + return "Här är anropnings diagrammet för den här funktionen:"; + } + + + }; #endif diff --git a/src/translator_sr.h b/src/translator_sr.h index 8fe5973..4ee9a12 100644 --- a/src/translator_sr.h +++ b/src/translator_sr.h @@ -20,7 +20,7 @@ // translation by Dejan D. M. Milosavljevic ; -class TranslatorSerbian : public Translator +class TranslatorSerbian : public TranslatorAdapter_1_3_3 { private: QCString decode(const QCString& sInput) diff --git a/src/translator_tw.h b/src/translator_tw.h index bccfece..646d992 100644 --- a/src/translator_tw.h +++ b/src/translator_tw.h @@ -41,7 +41,7 @@ // Translator class (by the local maintainer) when the localized // translator is made up-to-date again. -class TranslatorChinesetraditional : public Translator +class TranslatorChinesetraditional : public TranslatorAdapter_1_3_3 { public: diff --git a/src/util.cpp b/src/util.cpp index 832ff5f..bab9314 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -542,7 +542,9 @@ NamespaceDef *getResolvedNamespace(const char *name) } } -ClassDef *getResolvedClass( +static QDict g_resolvedScopes; + +ClassDef *getResolvedClassRecursive( Definition *scope, const char *n, bool *pIsTypeDef, @@ -678,8 +680,13 @@ ClassDef *getResolvedClass( NamespaceDef *und; for (nli.toFirst();(und=nli.current());++nli) { - cd = getResolvedClass(und,name,pIsTypeDef,pTemplSpec); - if (cd) break; + if (g_resolvedScopes.find(und->name())==0) + { + g_resolvedScopes.insert(und->name(),und); + cd = getResolvedClassRecursive(und,name,pIsTypeDef,pTemplSpec); + g_resolvedScopes.remove(und->name()); + if (cd) break; + } } } } @@ -697,6 +704,18 @@ found: return cd; } + +ClassDef *getResolvedClass( + Definition *scope, + const char *n, + bool *pIsTypeDef, + QCString *pTemplSpec + ) +{ + g_resolvedScopes.clear(); + return getResolvedClassRecursive(scope,n,pIsTypeDef,pTemplSpec); +} + static bool findOperator(const QCString &s,int i) { int b = s.findRev("operator",i); @@ -1526,45 +1545,51 @@ static void trimNamespaceScope(QCString &t1,QCString &t2,const QCString &nsName) */ void stripIrrelevantConstVolatile(QCString &s) { + //printf("stripIrrelevantConstVolatile(%s)=",s.data()); int i; if (s=="const") { s.resize(0); return; } if (s=="volatile") { s.resize(0); return; } // strip occurrences of const + int constLen=6; i = s.find("const "); + if (i==-1 && s.right(5)=="const") { i=s.length()-5;constLen=5; } if (i!=-1) { // no & or * after the const - int i1=s.find('*',i+6); - int i2=s.find('&',i+6); + int i1=s.find('*',i+constLen); + int i2=s.find('&',i+constLen); if (i1==-1 && i2==-1) { - s=s.left(i)+s.right(s.length()-i-6); + s=s.left(i)+s.right(s.length()-i-constLen); } else if ((i1!=-1 && igroupTitle(); } + if (compound && compound->definitionType()==Definition::TypeFile) + { + linkText=linkToText(rt,TRUE); + } od.writeObjectLink(compound->getReference(), compound->getOutputFileBase(), 0,linkText); @@ -2784,7 +2813,7 @@ bool generateLink(OutputDocInterface &od,const char *clName, //printf("generateLink(clName=%s,lr=%s,lr=%s)\n",clName,lr,lt); Definition *compound; //PageDef *pageDef=0; - QCString anchor,linkText=linkToText(lt); + QCString anchor,linkText=linkToText(lt,FALSE); //printf("generateLink linkText=%s\n",linkText.data()); if (resolveLink(clName,lr,inSeeBlock,&compound,anchor)) { @@ -2808,7 +2837,7 @@ bool generateLink(OutputDocInterface &od,const char *clName, } else if (compound->definitionType()==Definition::TypeFile) { - linkText=lt; // use text "as is" + linkText=linkToText(lt,TRUE); } od.writeObjectLink(compound->getReference(), compound->getOutputFileBase(),anchor,linkText); @@ -4031,6 +4060,7 @@ void filterLatexString(QTextStream &t,const char *str, theTranslator->idLanguage()=="chinese-traditional"; static bool isLatin2 = theTranslator->idLanguageCharset()=="iso-8859-2"; static bool isGreek = theTranslator->idLanguage()=="greek"; + //printf("filterLatexString(%s)\n",str); if (str) { const unsigned char *p=(const unsigned char *)str; diff --git a/src/util.h b/src/util.h index b92279d..5531903 100644 --- a/src/util.h +++ b/src/util.h @@ -198,7 +198,7 @@ void filterLatexString(QTextStream &t,const char *str, bool insideTabbing=FALSE,bool insidePre=FALSE, bool insideItem=FALSE); QCString rtfFormatBmkStr(const char *name); -QCString linkToText(const char *link); +QCString linkToText(const char *link,bool isFileName); QCString stripExtension(const char *fName); void replaceNamespaceAliases(QCString &scope,int i); diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index 51dac52..917bb7a 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -89,6 +89,7 @@ void XmlDocVisitor::visit(DocSymbol *s) case DocSymbol::Szlig: m_t << ""; break; case DocSymbol::Cedil: m_t << "letter() << "\"/>"; break; case DocSymbol::Ring: m_t << "letter() << "\"/>"; break; + case DocSymbol::Slash: m_t << "letter() << "\"/>"; break; case DocSymbol::Nbsp: m_t << ""; break; default: err("Error: unknown symbol found\n"); @@ -653,14 +654,14 @@ void XmlDocVisitor::visitPost(DocLink *) void XmlDocVisitor::visitPre(DocRef *ref) { if (m_hide) return; - startLink(ref->ref(),ref->file(),ref->anchor()); + if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor()); if (!ref->hasLinkText()) filter(ref->targetTitle()); } -void XmlDocVisitor::visitPost(DocRef *) +void XmlDocVisitor::visitPost(DocRef *ref) { if (m_hide) return; - endLink(); + if (!ref->file().isEmpty()) endLink(); m_t << " "; } diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index f2f669e..695f9b2 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -391,14 +391,14 @@ static void writeTemplateList(ClassDef *cd,QTextStream &t) static void writeXMLDocBlock(QTextStream &t, const QCString &fileName, int lineNr, - const QCString &scope, + 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+"\n",FALSE); + DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text+"\n",FALSE,FALSE); // create a code generator XMLCodeGenerator *xmlCodeGen = new XMLCodeGenerator(t); // create a parse tree visitor for XML @@ -653,7 +653,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De { t << " "; writeXMLDocBlock(t,md->getDefFileName(),md->getDefLine(), - scopeName,md,defArg->docs); + md->getOuterScope(),md,defArg->docs); t << "" << endl; } t << " " << endl; @@ -717,20 +717,20 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De t << "" << endl; } t << " " << endl; - writeXMLDocBlock(t,emd->briefFile(),emd->briefLine(),scopeName,emd,emd->briefDescription()); + writeXMLDocBlock(t,emd->briefFile(),emd->briefLine(),emd->getOuterScope(),emd,emd->briefDescription()); t << " " << endl; t << " " << endl; - writeXMLDocBlock(t,emd->docFile(),emd->docLine(),scopeName,emd,emd->documentation()); + writeXMLDocBlock(t,emd->docFile(),emd->docLine(),emd->getOuterScope(),emd,emd->documentation()); t << " " << endl; t << " " << endl; } } } t << " " << endl; - writeXMLDocBlock(t,md->briefFile(),md->briefLine(),scopeName,md,md->briefDescription()); + writeXMLDocBlock(t,md->briefFile(),md->briefLine(),md->getOuterScope(),md,md->briefDescription()); t << " " << endl; t << " " << endl; - writeXMLDocBlock(t,md->docFile(),md->docLine(),scopeName,md,md->documentation()); + writeXMLDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation()); t << " " << endl; if (md->getDefLine()!=-1) { @@ -996,10 +996,10 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &ti) generateXMLSection(cd,ti,t,&cd->related,"related"); t << " " << endl; - writeXMLDocBlock(t,cd->briefFile(),cd->briefLine(),cd->name(),0,cd->briefDescription()); + writeXMLDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription()); t << " " << endl; t << " " << endl; - writeXMLDocBlock(t,cd->docFile(),cd->docLine(),cd->name(),0,cd->documentation()); + writeXMLDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation()); t << " " << endl; DotClassGraph inheritanceGraph(cd,DotNode::Inheritance, Config_getInt("MAX_DOT_GRAPH_DEPTH")); @@ -1105,10 +1105,10 @@ static void generateXMLForNamespace(NamespaceDef *nd,QTextStream &ti) generateXMLSection(nd,ti,t,&nd->decVarMembers,"var"); t << " " << endl; - writeXMLDocBlock(t,nd->briefFile(),nd->briefLine(),0,0,nd->briefDescription()); + writeXMLDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription()); t << " " << endl; t << " " << endl; - writeXMLDocBlock(t,nd->docFile(),nd->docLine(),0,0,nd->documentation()); + writeXMLDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation()); t << " " << endl; t << " getDefFileName() << "\" line=\"" @@ -1240,10 +1240,10 @@ static void generateXMLForFile(FileDef *fd,QTextStream &ti) generateXMLSection(fd,ti,t,&fd->decVarMembers,"var"); t << " " << endl; - writeXMLDocBlock(t,fd->briefFile(),fd->briefLine(),0,0,fd->briefDescription()); + writeXMLDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription()); t << " " << endl; t << " " << endl; - writeXMLDocBlock(t,fd->docFile(),fd->docLine(),0,0,fd->documentation()); + writeXMLDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation()); t << " " << endl; t << " " << endl; writeXMLCodeBlock(t,fd); @@ -1364,10 +1364,10 @@ static void generateXMLForGroup(GroupDef *gd,QTextStream &ti) generateXMLSection(gd,ti,t,&gd->decVarMembers,"var"); t << " " << endl; - writeXMLDocBlock(t,gd->briefFile(),gd->briefLine(),0,0,gd->briefDescription()); + writeXMLDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription()); t << " " << endl; t << " " << endl; - writeXMLDocBlock(t,gd->docFile(),gd->docLine(),0,0,gd->documentation()); + writeXMLDocBlock(t,gd->docFile(),gd->docLine(),gd,0,gd->documentation()); t << " " << endl; t << " " << endl; t << "" << endl; @@ -1412,7 +1412,7 @@ static void generateXMLForPage(PageDef *pd,QTextStream &ti) t << " " << convertToXML(si->title) << "" << endl; } t << " " << endl; - writeXMLDocBlock(t,pd->docFile(),pd->docLine(),0,0,pd->documentation()); + writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0,pd->documentation()); t << " " << endl; t << " " << endl; t << "" << endl; diff --git a/tmake/lib/macosx-c++/tmake.conf b/tmake/lib/macosx-c++/tmake.conf index 6956d07..c876dbd 100755 --- a/tmake/lib/macosx-c++/tmake.conf +++ b/tmake/lib/macosx-c++/tmake.conf @@ -27,8 +27,8 @@ TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC TMAKE_INCDIR = TMAKE_LIBDIR = -TMAKE_INCDIR_X11 = /usr/X11R6/include -TMAKE_LIBDIR_X11 = /usr/X11R6/lib +TMAKE_INCDIR_X11 = +TMAKE_LIBDIR_X11 = TMAKE_INCDIR_QT = $(QTDIR)/include TMAKE_LIBDIR_QT = $(QTDIR)/lib TMAKE_INCDIR_OPENGL = /usr/X11R6/include @@ -45,7 +45,7 @@ TMAKE_LFLAGS_SHLIB = -shared #TMAKE_LFLAGS_SONAME = -Wl,-soname TMAKE_LIBS = -TMAKE_LIBS_X11 = -lXext -lX11 -lm +TMAKE_LIBS_X11 = TMAKE_LIBS_QT = -lqt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/wintools/Doxysearch.dsp b/wintools/Doxysearch.dsp deleted file mode 100644 index 463bbe6..0000000 --- a/wintools/Doxysearch.dsp +++ /dev/null @@ -1,97 +0,0 @@ -# Microsoft Developer Studio Project File - Name="Doxysearch" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=Doxysearch - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "Doxysearch.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "Doxysearch.mak" CFG="Doxysearch - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "Doxysearch - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "Doxysearch - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "Doxysearch" -# PROP Scc_LocalPath "." -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "Doxysearch - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "..\src" /D "_CONSOLE" /D "WIN32" /D "_MBCS" /D "NDEBUG" /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "Doxysearch - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\src" /D "_CONSOLE" /D "WIN32" /D "_MBCS" /D "_DEBUG" /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -# SUBTRACT RSC /x -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# SUBTRACT LINK32 /nodefaultlib - -!ENDIF - -# Begin Target - -# Name "Doxysearch - Win32 Release" -# Name "Doxysearch - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\src\doxysearch.cpp -# End Source File -# End Group -# End Target -# End Project diff --git a/wintools/Doxysearch.dsw b/wintools/Doxysearch.dsw deleted file mode 100644 index 4a93e06..0000000 --- a/wintools/Doxysearch.dsw +++ /dev/null @@ -1,33 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "Doxysearch"=".\Doxysearch.dsp" - Package Owner=<4> - -Package=<5> -{{{ - begin source code control - Doxysearch - . - end source code control -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - -- cgit v0.12