diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2021-10-15 10:50:10 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2021-10-15 10:50:10 +0900 |
commit | 738086af77ab085837d0044a33a5d954a3edc6f5 (patch) | |
tree | 3b965243967bdf1aab50ec3dfe74ebdaf75b6942 /src | |
parent | 835421dad74e8989002b592f703a23d87f211df0 (diff) | |
download | doxygen-738086af77ab085837d0044a33a5d954a3edc6f5.tar.gz doxygen-738086af77ab085837d0044a33a5d954a3edc6f5.tar.bz2 doxygen-738086af77ab085837d0044a33a5d954a3edc6f5.zip |
Imported Upstream version 1.8.6upstream/1.8.6
Diffstat (limited to 'src')
166 files changed, 16318 insertions, 13754 deletions
diff --git a/src/Makefile.in b/src/Makefile.in index 2e78088..7d1d0d9 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,60 +1,61 @@ # -# +# # # Copyright (C) 1997-2013 by Dimitri van Heesch. -# +# # Permission to use, copy, modify, and distribute this software and its -# documentation under the terms of the GNU General Public License is hereby -# granted. No representations are made about the suitability of this software +# documentation under the terms of the GNU General Public License is hereby +# granted. No representations are made about the suitability of this software # for any purpose. It is provided "as is" without express or implied warranty. # See the GNU General Public License for more details. -# +# # Documents produced by Doxygen are derivative works derived from the # input used in their production; they are not affected by this license. -# +# all: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile - $(MAKE) -f Makefile.libdoxycfg PERL=$(PERL) $@ - $(MAKE) -f Makefile.libdoxygen PERL=$(PERL) $@ - $(MAKE) -f Makefile.doxygen PERL=$(PERL) $@ + $(MAKE) -f Makefile.libdoxycfg $@ + $(MAKE) -f Makefile.libdoxygen $@ + $(MAKE) -f Makefile.doxygen $@ -Makefile.libdoxygen: libdoxygen.pro libdoxygen.t +Makefile.libdoxygen: libdoxygen.pro libdoxygen.t $(ENV) $(PERL) "$(TMAKE)" libdoxygen.pro >Makefile.libdoxygen + echo 'HEADERS += ' `ls -1 translator_??.h` >>Makefile.libdoxygen -Makefile.libdoxycfg: libdoxycfg.pro libdoxycfg.t +Makefile.libdoxycfg: libdoxycfg.pro libdoxycfg.t $(ENV) $(PERL) "$(TMAKE)" libdoxycfg.pro >Makefile.libdoxycfg -Makefile.doxygen: doxygen.pro +Makefile.doxygen: doxygen.pro $(ENV) $(PERL) "$(TMAKE)" doxygen.pro >Makefile.doxygen -tmake: +tmake: $(ENV) $(PERL) "$(TMAKE)" libdoxygen.pro >Makefile.libdoxygen $(ENV) $(PERL) "$(TMAKE)" libdoxycfg.pro >Makefile.libdoxycfg $(ENV) $(PERL) "$(TMAKE)" doxygen.pro >Makefile.doxygen # clean objects -clean: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen - $(MAKE) -f Makefile.libdoxygen clean - $(MAKE) -f Makefile.libdoxycfg clean - $(MAKE) -f Makefile.doxygen clean +clean: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen + $(MAKE) -f Makefile.libdoxygen clean + $(MAKE) -f Makefile.libdoxycfg clean + $(MAKE) -f Makefile.doxygen clean # also clean flex/bison generated files distclean: clean - -$(RM) scanner.cpp code.cpp config.cpp pre.cpp ce_lex.cpp \ - ce_parse.cpp ce_parse.h tag.cpp commentscan.cpp \ + -$(RM) scanner.cpp code.cpp config.cpp pre.cpp constexp.cpp \ + ce_parse.cpp ce_parse.h tag.cpp commentscan.cpp \ declinfo.cpp defargs.cpp commentcnv.cpp doctokenizer.cpp \ pycode.cpp pyscanner.cpp fortrancode.cpp fortranscanner.cpp \ vhdlscanner.cpp vhdlcode.cpp tclscanner.cpp vhdlparser.h \ - vhdlparser.cpp \ + vhdlparser.cpp # clean also the generated files which are in SVN realclean: distclean - -$(RM) index_xsd.h compound_xsd.h layout_default.h \ - header_html.h footer_html.h search_functions_php.h search_opensearch_php.h \ - search_js.h search_css.h doxygen_css.h navtree_js.h navindex_js.h resize_js.h \ - jquery_fx_js.h jquery_p1_js.h jquery_p2_js.h \ - jquery_p3_js.h jquery_ui_js.h navtree_css.h svgpan_js.h dynsections_js.h \ - doxygen_bst.h bib2xhtml.h configoptions.cpp + -$(RM) index.xsd.h compound.xsd.h layout_default.xml.h \ + header.html.h footer.html.h search_functions.php.h search_opensearch.php.h \ + search.js.h search.css.h doxygen.css.h navtree.js.h resize.js.h \ + doxygen.sty.h jquery_fx.js.h jquery_p1.js.h jquery_p2.js.h \ + jquery_p3.js.h jquery_ui.js.h navtree.css.h svgpan.js.h dynsections.js.h \ + doxygen.bst.h bib2xhtml.pl.h configoptions.cpp jquery_pt.js.h extsearch.js.h FORCE: diff --git a/src/bib2xhtml.h b/src/bib2xhtml.h deleted file mode 100644 index 3615cee..0000000 --- a/src/bib2xhtml.h +++ /dev/null @@ -1,319 +0,0 @@ -"#\n" -"# Below is a stripped down version of bib2xhtml used by doxygen.\n" -"# For the full version see http://www.spinellis.gr/sw/textproc/bib2xhtml/\n" -"#\n" -"# Convert from bibtex to XHTML.\n" -"#\n" -"# (C) Copyright 1995, 1996 David Hull.\n" -"# (David Hull / hull@cs.uiuc.edu / http://www.uiuc.edu/ph/www/dlhull)\n" -"#\n" -"# (C) Copyright 2002-2010 Diomidis Spinellis\n" -"# http://www.spinellis.gr\n" -"#\n" -"# This program is free software. You can redistribute it and/or modify\n" -"# it under the terms of the GNU General Public License. See the\n" -"# files README and COPYING for details.\n" -"#\n" -"# This source code contains UTF-8 characters. You might want to use\n" -"# an appropriate editor, if you want to view/modify the LaTeX to Unicode\n" -"# substitution commands.\n" -"#\n" -"\n" -"use Getopt::Std;\n" -"use open IO => ':crlf';\n" -"$label_styles{'numbered'} = $LABEL_NUMBERED = 2;\n" -"$list_start[$LABEL_NUMBERED] = 'dl class=\"citelist\"';\n" -"$list_end[$LABEL_NUMBERED] = \"/dl\";\n" -"@tmpfiles = ();\n" -"sub html_ent {\n" -" s/\\\\i\\b/i/g;\n" -" s/\\\\\\'(\\001\\d+)\\{([AEIOUaeiou])\\1\\}/&$2acute;/gs;\n" -" s/\\\\\\'([AEIOUaeiou])/&$1acute;/g;\n" -" s/\\\\\\`(\\001\\d+)\\{([AEIOUaeiou])\\1\\}/&$2grave;/gs;\n" -" s/\\\\\\`([AEIOUaeiou])/&$1grave;/g;\n" -" s/\\\\\\\"(\\001\\d+)\\{([AEIOUaeiouy])\\1\\}/&$2uml;/gs;\n" -" s/\\\\\\\"([AEIOUaeiouy])/&$1uml;/g;\n" -" s/\\\\\\~(\\001\\d+)\\{([ANOano])\\1\\}/&$2tilde;/gs;\n" -" s/\\\\\\~([ANOano])/&$1tilde;/g;\n" -" s/\\\\\\^(\\001\\d+)\\{([AEIOUaeiou])\\1\\}/&$2circ;/gs;\n" -" s/\\\\\\^([AEIOUaeiou])/&$1circ;/g;\n" -" s/\\\\c(\\001\\d+)\\{([Cc])\\1\\}/&$2cedil;/gs;\n" -" s/\\\\u(\\001\\d+)\\{(.)\\1\\}/$2/gs;\n" -" s/\\\\v(\\001\\d+)\\{(.)\\1\\}/$2/gs;\n" -" s/\\\\([lL])\\b/$1/g;\n" -" s/\\\\\\=(\\001\\d+)\\{(.)\\1\\}/$2/gs;\n" -" s/\\\\\\=(.)/$1/g;\n" -" s/\\\\\\.(\\001\\d+)\\{(.)\\1\\}/$2/gs;\n" -" s/\\\\\\.(.)/$1/g;\n" -" s/\\\\([Oo])\\b\\s*/&$1slash;/g;\n" -" s/\\\\AA\\b\\s*/Å/g;\n" -" s/\\\\aa\\b\\s*/å/g;\n" -" s/\\\\AE\\b\\s*/Æ/g;\n" -" s/\\\\ae\\b\\s*/æ/g;\n" -" s/\\\\ss\\b\\s*/ß/g;\n" -" s/\\\\S\\b\\s*/§/g;\n" -" s/\\\\P\\b\\s*/¶/g;\n" -" s/\\\\pounds\\b\\s*/£/g;\n" -" s/\\?\\`/¿/g;\n" -" s/\\!\\`/¡/g;\n" -" s/\\-\\-\\-/—/g;\n" -" s/([^\\!])\\-\\-([^\\>])/$1–$2/g;\n" -" s/\\\\([aA]lpha)\\b/&$1;/g;\n" -" s/\\\\([bB]eta)\\b/&$1;/g;\n" -" s/\\\\([gG]amma)\\b/&$1;/g;\n" -" s/\\\\([dD]elta)\\b/&$1;/g;\n" -" s/\\\\varepsilon\\b/ε/g;\n" -" s/\\\\([eE]psilon)\\b/&$1;/g;\n" -" s/\\\\([zZ]eta)\\b/&$1;/g;\n" -" s/\\\\([eE]ta)\\b/&$1;/g;\n" -" s/\\\\([tT]heta)\\b/&$1;/g;\n" -" s/\\\\vartheta\\b/θ/g;\n" -" s/\\\\([iI]ota)\\b/&$1;/g;\n" -" s/\\\\([kK]appa)\\b/&$1;/g;\n" -" s/\\\\([lL]ambda)\\b/&$1;/g;\n" -" s/\\\\([mM]u)\\b/&$1;/g;\n" -" s/\\\\([nN]u)\\b/&$1;/g;\n" -" s/\\\\([xX]i)\\b/&$1;/g;\n" -" s/\\\\([oO]micron)\\b/&$1;/g;\n" -" s/\\\\([pP]i)\\b/&$1;/g;\n" -" s/\\\\varpi\\b/π/g;\n" -" s/\\\\([rR]ho)\\b/&$1;/g;\n" -" s/\\\\varrho\\b/ρ/g;\n" -" s/\\\\([sS]igma)\\b/&$1;/g;\n" -" s/\\\\varsigma\\b/ς/g;\n" -" s/\\\\([tT]au)\\b/&$1;/g;\n" -" s/\\\\([uU]psilon)\\b/&$1;/g;\n" -" s/\\\\([pP]hi)\\b/&$1;/g;\n" -" s/\\\\varphi\\b/φ/g;\n" -" s/\\\\([cC]hi)\\b/&$1;/g;\n" -" s/\\\\([pP]si)\\b/&$1;/g;\n" -" s/\\\\([oO]mega)\\b/&$1;/g;\n" -" s/\\\\S\\b/§/g;\n" -" s/^\\\\circ\\b/°/g;\n" -" s/\\\\infty\\b/∞/g;\n" -" s/\\\\emptyset\\b/∅/g;\n" -" s/\\\\pm\\b/±/g;\n" -" s/\\\\times\\b/×/g;\n" -" s/\\\\cdot\\b/⋅/g;\n" -" s/\\\\partial\\b/∂/g;\n" -" s/\\\\nabla\\b/∇/g;\n" -" s/\\\\surd\\b/√/g;\n" -" s/\\\\perp\\b/⊥/g;\n" -" s/\\\\sum\\b/∑/g;\n" -" s/\\\\int\\b/∫/g;\n" -" s/\\\\prod\\b/∏/g;\n" -" s/\\\\sim\\b/∼/g;\n" -" s/\\\\approx\\b/≈/g;\n" -" s/\\\\ne\\b/≠/g;\n" -" s/\\\\equiv\\b/≡/g;\n" -" s/\\\\propto\\b/∝/g;\n" -" s/\\\\le\\b/≤/g;\n" -" s/\\\\ge\\b/≥/g;\n" -" s/\\\\leftarrow\\b/←/g;\n" -" s/\\\\rightarrow\\b/→/g;\n" -" s/\\\\in\\b/∈/g;\n" -" s/\\\\notin\\b/∉/g;\n" -" s/\\\\lceil\\b/⌈/g;\n" -" s/\\\\rceil\\b/⌉/g;\n" -" s/\\\\lfloor\\b/⌊/g;\n" -" s/\\\\rfloor\\b/⌋/g;\n" -"}\n" -"foreach (@ARGV) {\n" -" if (/\\.bib$/) {\n" -" $bibfile = $_;\n" -" $bibfile =~ s/\\.bib$//;\n" -" push(@bibfiles,$bibfile);\n" -" } else {\n" -" $htmlfile = $_;\n" -" }\n" -"}\n" -"exit(1) unless defined($htmlfile);\n" -"$bibdatacmd=\"\\\\bibdata{\".join(',',@bibfiles).\"}\";\n" -"$label_style = $LABEL_NUMBERED;\n" -"$bstfile = \"doxygen\";\n" -"umask(077);\n" -"open(HTMLFILE,\">$htmlfile$$\");\n" -"if (open(OHTMLFILE, \"$htmlfile\")) {\n" -" $mode = (stat OHTMLFILE)[2] & 0xfff;\n" -"} else {\n" -" print \"Error opening $htmlfile\\n\";\n" -" exit(1);\n" -"}\n" -"$beginstring = \"<!-- BEGIN CITATIONS -->\";\n" -"$endstring = \"<!-- END CITATIONS -->\";\n" -"@citations = ();\n" -"loop:\n" -"while (<OHTMLFILE>) {\n" -" print HTMLFILE;\n" -" last loop if m/^$beginstring$/;\n" -"}\n" -"loop:\n" -"while (<OHTMLFILE>) {\n" -" print HTMLFILE;\n" -" last loop if m/^$endstring$/;\n" -" push(@citations, $2) if m/^([^\\\\]*)?(.+\\})(.*)?$/;\n" -"}\n" -"push(@citations, $bibdatacmd);\n" -"$auxfile = \"bib$$\";\n" -"push(@tmpfiles, \"$auxfile.aux\");\n" -"open(AUXFILE, \">$auxfile\" . \".aux\");\n" -"print AUXFILE \"\\\\relax\\n\\\\bibstyle{$bstfile}\\n\";\n" -"foreach $citation (@citations) {\n" -" print AUXFILE \"$citation\\n\";\n" -"}\n" -"close(AUXFILE);\n" -"push(@tmpfiles, \"$auxfile.blg\");\n" -"push(@tmpfiles, \"$auxfile.bbl\");\n" -"`bibtex $auxfile 2>&1`;\n" -"if ($?==-1)\n" -"{\n" -" print \"bibtex command failed: $!\\n\";\n" -"}\n" -"$beginstring = \"<!-- BEGIN BIBLIOGRAPHY -->\";\n" -"$endstring = \"<!-- END BIBLIOGRAPHY -->\";\n" -"loop:\n" -"while (<OHTMLFILE>) {\n" -" last loop if m/^$beginstring$/;\n" -" print HTMLFILE;\n" -"}\n" -"loop:\n" -"while (<OHTMLFILE>) {\n" -" last loop if m/^$endstring$/;\n" -"}\n" -"print HTMLFILE \"$beginstring\\n\";\n" -"$t = $auxfile . \".bbl\";\n" -"$/ = \"\";\n" -"open(BBLFILE, \"<$t\") || die \"error opening $t: $!\\n\";\n" -"$nentry = 0;\n" -"loop:\n" -"while (<BBLFILE>) {\n" -" if (($nentry == 0) && (m/^#/)) {\n" -" if ((m/#\\s*label-style:\\s*(\\S+)/) && (! defined $label_style)) {\n" -" $label_style = $label_styles{$1};\n" -" if (! defined $label_style) {\n" -" print STDERR \"label style unknown: \\n\";\n" -" next loop;\n" -" }\n" -" }\n" -" next loop;\n" -" }\n" -" $nentry++;\n" -" ($bcite, $blabel) = m+<dt><a name=\\\"([^\\\"]*)\\\">\\[([^\\]]*)\\]</a></dt><dd>+;\n" -" $blabel = \"$nentry\";\n" -" $bibcite{$bcite} = $blabel;\n" -"}\n" -"close(BBLFILE);\n" -"$label_style = $LABEL_DEFAULT if (! defined $label_style);\n" -"$list_start = $list_start[$label_style];\n" -"$list_end = $list_end[$label_style];\n" -"print HTMLFILE \"<$list_start>\\n\\n\";\n" -"open(BBLFILE, \"<$t\") || die \"error opening $t: $!\\n\";\n" -"$nentry = 0;\n" -"loop:\n" -"while (<BBLFILE>) {\n" -" next loop if (($nentry == 0) && (m/^#/));\n" -" $nentry++;\n" -" s/\\\\\\{/\\002/g;\n" -" s/\\\\\\}/\\003/g;\n" -" s/\\\\\\$/\\004/g;\n" -" {\n" -" local ($c, $l, $z) = (0, 0, ());\n" -" s/([\\{\\}])/join(\"\",\"\\001\",($1 eq \"\\{\" ? $z[$l++]=$c++ : $z[--$l]),$1)/ge;\n" -" }\n" -" s/\\%\\n//g;\n" -" s/(\\.(<\\/cite>|<\\/a>|\\')+)\\./$1/g;\n" -" s:(<dt><a name=\\\"[^\\\"]*\\\">\\[)[^\\]]*(\\]</a></dt><dd>):$1$nentry$2:;\n" -" while (m/(\\\\(cite(label)?)(\\001\\d+)\\{([^\\001]+)\\4\\})/) {\n" -" $old = $1;\n" -" $cmd = $2;\n" -" $doxref = defined($3);\n" -" $bcite = $5;\n" -" if (! defined $bibcite{$bcite}) {\n" -" $blabel = \" [\" . $bcite . \"]\";\n" -" } elsif ($doxref) {\n" -" $blabel = \" <a href=\\\"#$bcite\\\">[\" . $bibcite{$bcite} . \"]<\\/a>\";\n" -" } else {\n" -" $blabel = \" [\" . $bibcite{$bcite} . \"]\";\n" -" }\n" -" $old =~ s/(\\W)/\\\\$1/g;\n" -" s/\\s*$old/$blabel/g;\n" -" }\n" -" s/In (<a href=\\\"[^\\\"]*\\\">)([^\\[]+) \\[(\\2)/In $1\\[$2/;\n" -" s/\\\\htmladdnormallink(foot)?(\\001\\d+)\\{([^\\001]+)\\2\\}(\\001\\d+)\\{([^\\001]+)\\4\\}/<a href=\"$5\">$3<\\/a>/gs;\n" -" s/\\&/\\005/g;\n" -" s/\\\\?&/&/g;\n" -" s/\\005/&/g;\n" -" html_ent();\n" -" while (m/\\\\char([\\'\\\"]?[0-9a-fA-F]+)/) {\n" -" $o = $r = $1;\n" -" if ($r =~ s/^\\'//) {\n" -" $r = oct($r);\n" -" } elsif ($r =~ s/^\\\"//) {\n" -" $r = hex($r);\n" -" }\n" -" s/\\\\char$o\\s*/&#$r;/g;\n" -" }\n" -" s/{\\\\etalchar\\001(\\d+)\\{(.)}\\001\\1\\}/$2/g;\n" -" s/\\\\par\\b/<p \\/>/g;\n" -" s/\\\\url(\\001\\d+)\\{(.*)\\1\\}/<a href=\"$2\">$2<\\/a>/gs;\n" -" s/\\\\href(\\001\\d+)\\{(.*)\\1\\}(\\001\\d+)\\{([^\\001]*)\\3\\}/<a href=\"$2\">$4<\\/a>/gs;\n" -" s/\\\\href(\\001\\d+)\\{(.*)\\1\\}/<a href=\"$2\">$2<\\/a>/gs;\n" -" s/(\\001\\d+)\\{\\\\rm\\s+(.*)\\1\\}/$2/gs;\n" -" s/\\\\textrm(\\001\\d+)\\{(.*)\\1\\}/$2/gs;\n" -" s/(\\001\\d+)\\{\\\\em\\s+(.*)\\1\\}/<em>$2<\\/em>/gs;\n" -" s/(\\001\\d+)\\{\\\\it\\s+(.*)\\1\\}/<i>$2<\\/i>/gs;\n" -" s/(\\001\\d+)\\{\\\\bf\\s+(.*)\\1\\}/<b>$2<\\/b>/gs;\n" -" s/(\\001\\d+)\\{\\\\tt\\s+(.*)\\1\\}/<tt>$2<\\/tt>/gs;\n" -" s/\\\\emph(\\001\\d+)\\{(.*)\\1\\}/<em>$2<\\/em>/gs;\n" -" s/\\\\textit(\\001\\d+)\\{(.*)\\1\\}/<i>$2<\\/i>/gs;\n" -" s/\\\\textbf(\\001\\d+)\\{(.*)\\1\\}/<b>$2<\\/b>/gs;\n" -" s/\\\\texttt(\\001\\d+)\\{(.*)\\1\\}/<tt>$2<\\/tt>/gs;\n" -" s/\\\\mathrm(\\001\\d+)\\{(.*)\\1\\}/$2/gs;\n" -" s/\\\\mathnormal(\\001\\d+)\\{(.*)\\1\\}/$2/gs;\n" -" s/\\\\mathsf(\\001\\d+)\\{(.*)\\1\\}/$2/gs;\n" -" s/\\\\mathbf(\\001\\d+)\\{(.*)\\1\\}/<b>$2<\\/b>/gs;\n" -" s/\\\\mathcal(\\001\\d+)\\{(.*)\\1\\}/<i>$2<\\/i>/gs;\n" -" s/\\\\mathit(\\001\\d+)\\{(.*)\\1\\}/<i>$2<\\/i>/gs;\n" -" s/\\\\mathtt(\\001\\d+)\\{(.*)\\1\\}/<tt>$2<\\/tt>/gs;\n" -" s/\\\\bibxhtmlname(\\001\\d+)\\{(.*)\\1\\}/$2/ges;\n" -" sub domath {\n" -" local($t) = @_;\n" -" $t =~ s/\\^(\\001\\d+)\\{\\\\circ\\1\\}/\\&\\#176;/gs;\n" -" $t =~ s/\\^\\\\circ/\\&\\#176;/g;\n" -" $t =~ s/\\^(\\001\\d+)\\{(.*)\\1\\}/<sup>$2<\\/sup>/gs;\n" -" $t =~ s/\\^(\\w)/<sup>$1<\\/sup>/g;\n" -" $t =~ s/\\_(\\001\\d+)\\{(.*)\\1\\}/<sub>$2<\\/sub>/gs;\n" -" $t =~ s/\\_(\\w)/<sub>$1<\\/sub>/g;\n" -" $t;\n" -" }\n" -" s/(\\$([^\\$]+)\\$)/&domath($2)/ge;\n" -" s/(\\\\\\((([^\\\\]|\\\\[^\\(\\)])+)\\\\\\))/&domath($2)/ge;\n" -" s/\\\\mbox(\\001\\d+)\\{(.*)\\1\\}/$2/gs;\n" -" while (s/(\\<a href\\=\\\"[^\"]*?)\\~/$1\\005/g) { ; }\n" -" s/([^\\\\])~/$1 /g;\n" -" s/\\\\\\,/ /g;\n" -" s/\\\\ldots\\b/…/g;\n" -" s/\\\\dots\\b/…/g;\n" -" s/\\005/\\~/g;\n" -" s/\\\\ / /g;\n" -" s/\\\\textasciitilde\\b\\s*/~/g;\n" -" s/\\\\([\\#\\&\\%\\~\\_\\^\\|])/$1/g;\n" -" s/\\\\\\W//g;\n" -" s/\\001(\\d+)\\{\\\\[A-Za-z]+\\001(\\d+)\\{([^\\001]*)\\001\\2\\}\\001\\1\\}/$3/g;\n" -" s/\\\\([A-Za-z]+)/ $1 /g;\n" -" s+In <a href=\\\"[^\\\"]*\\\"></a>++;\n" -" s/\\001\\d+[\\{\\}]//gs;\n" -" tr/\\002\\003\\004/{}$/;\n" -" print HTMLFILE $_;\n" -"}\n" -"close(BBLFILE);\n" -"print HTMLFILE \"<$list_end>\\n\\n$endstring\\n\";\n" -"while (<OHTMLFILE>) {\n" -" print HTMLFILE;\n" -"}\n" -"close (OHTMLFILE);\n" -"close(HTMLFILE);\n" -"chmod($mode, \"$htmlfile$$\");\n" -"rename(\"$htmlfile$$\", $htmlfile);\n" -"unlink(@tmpfiles);\n" -"exit(0);\n" diff --git a/src/bufstr.h b/src/bufstr.h index 427b012..cfb89c4 100644 --- a/src/bufstr.h +++ b/src/bufstr.h @@ -33,7 +33,7 @@ class BufStr BufStr(int size) : m_size(size), m_writeOffset(0), m_spareRoom(10240), m_buf(0) { - m_buf = (char *)malloc(size); + m_buf = (char *)calloc(size,1); } ~BufStr() { @@ -62,12 +62,17 @@ class BufStr } void resize( uint newlen ) { + uint oldsize = m_size; m_size=newlen; if (m_writeOffset>=m_size) // offset out of range -> enlarge { m_size=m_writeOffset+m_spareRoom; } m_buf = (char *)realloc(m_buf,m_size); + if (m_size>oldsize) + { + memset(m_buf+oldsize,0,m_size-oldsize); + } } int size() const { diff --git a/src/cite.cpp b/src/cite.cpp index 576c4bf..3e3eb43 100644 --- a/src/cite.cpp +++ b/src/cite.cpp @@ -26,11 +26,11 @@ //-------------------------------------------------------------------------- static const char *doxygen_bst = -#include "doxygen_bst.h" +#include "doxygen.bst.h" ; static const char *bib2xhtml_pl = -#include "bib2xhtml.h" +#include "bib2xhtml.pl.h" ; //-------------------------------------------------------------------------- @@ -94,10 +94,15 @@ void CiteDict::writeLatexBibliography(FTextStream &t) QCString style = Config_getString("LATEX_BIB_STYLE"); if (style.isEmpty()) style="plain"; + QCString unit; + if (Config_getBool("COMPACT_LATEX")) + unit = "section"; + else + unit = "chapter"; t << "% Bibliography\n" "\\newpage\n" "\\phantomsection\n" - "\\addcontentsline{toc}{part}{" << theTranslator->trCiteReferences() << "}\n" + "\\addcontentsline{toc}{" << unit << "}{" << theTranslator->trCiteReferences() << "}\n" "\\bibliographystyle{" << style << "}\n" "\\bibliography{" << getListOfBibFiles(",",TRUE) << "}\n" "\n"; diff --git a/src/clangparser.h b/src/clangparser.h index 214ea50..6072208 100644 --- a/src/clangparser.h +++ b/src/clangparser.h @@ -16,7 +16,7 @@ class ClangParser /** Start parsing a file. * @param[in] fileName The name of the file to parse. - * @param[in,out] filesInTanslationUnit Other files that are + * @param[in,out] filesInTranslationUnit Other files that are * part of the input and included by the file. * The function will return a subset of the files, * only including the onces that were actually found @@ -26,7 +26,7 @@ class ClangParser /** Switches to another file within the translation unit started * with start(). - * @param[in] The name of the file to switch to. + * @param[in] fileName The name of the file to switch to. */ void switchToFile(const char *fileName); diff --git a/src/classdef.cpp b/src/classdef.cpp index 07a275c..6404431 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -1,12 +1,12 @@ /****************************************************************************** * - * + * * * Copyright (C) 1997-2013 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * @@ -57,29 +57,29 @@ class ClassDefImpl const QCString &ctStr, const char *fName); /*! file name that forms the base for the output file containing the - * class documentation. For compatibility with Qt (e.g. links via tag + * class documentation. For compatibility with Qt (e.g. links via tag * files) this name cannot be derived from the class name directly. */ - QCString fileName; + QCString fileName; /*! Include information about the header file should be included * in the documentation. 0 by default, set by setIncludeFile(). */ - IncludeInfo *incInfo; + IncludeInfo *incInfo; /*! List of base class (or super-classes) from which this class derives - * directly. + * directly. */ BaseClassList *inherits; - /*! List of sub-classes that directly derive from this class + /*! List of sub-classes that directly derive from this class */ BaseClassList *inheritedBy; - /*! Namespace this class is part of + /*! Namespace this class is part of * (this is the inner most namespace in case of nested namespaces) */ - NamespaceDef *nspace; + NamespaceDef *nspace; /*! File this class is defined in */ FileDef *fileDef; @@ -94,7 +94,7 @@ class ClassDefImpl ArgumentList *typeConstraints; /*! Files that were used for generating the class documentation. */ - QStrList files; + FileList files; /*! Examples that use this class */ ExampleSDict *exampleSDict; @@ -102,10 +102,10 @@ class ClassDefImpl /*! Holds the kind of "class" this is. */ ClassDef::CompoundType compType; - /*! The protection level in which this class was found. + /*! The protection level in which this class was found. * Typically Public, but for nested classes this can also be Protected * or Private. - */ + */ Protection prot; /*! The inner classes contained in this class. Will be 0 if there are @@ -120,13 +120,13 @@ class ClassDefImpl /*! Template instances that exists of this class, the key in the * dictionary is the template argument list. - */ + */ QDict<ClassDef> *templateInstances; /*! Template instances that exists of this class, as defined by variables. * We do NOT want to document these individually. The key in the * dictionary is the template argument list. - */ + */ QDict<ClassDef> *variableInstances; QDict<int> *templBaseClassNames; @@ -162,10 +162,10 @@ class ClassDefImpl bool isTemplArg; /*! Does this class group its user-grouped members - * as a sub-section of the normal (public/protected/..) + * as a sub-section of the normal (public/protected/..) * groups? */ - bool subGrouping; + bool subGrouping; /** Reason of existence is a "use" relation */ bool usedOnly; @@ -238,7 +238,7 @@ void ClassDefImpl::init(const char *defFileName, const char *name, // we cannot use getLanguage at this point, as setLanguage has not been called. SrcLangExt lang = getLanguageFromFileName(defFileName); - if ((lang==SrcLangExt_Cpp || lang==SrcLangExt_ObjC) && + if ((lang==SrcLangExt_Cpp || lang==SrcLangExt_ObjC) && guessSection(defFileName)==Entry::SOURCE_SEC) { isLocal=TRUE; @@ -280,7 +280,7 @@ ClassDef::ClassDef( const char *defFileName,int defLine,int defColumn, const char *nm,CompoundType ct, const char *lref,const char *fName, - bool isSymbol,bool isJavaEnum) + bool isSymbol,bool isJavaEnum) : Definition(defFileName,defLine,defColumn,removeRedundantWhiteSpace(nm),0,0,isSymbol) { visited=FALSE; @@ -312,7 +312,7 @@ QCString ClassDef::displayName(bool includeScope) const { n = VhdlDocGen::getClassName(this); } - else + else { if (includeScope) { @@ -337,7 +337,14 @@ QCString ClassDef::displayName(bool includeScope) const // n = n.left(n.length()-2); //} //printf("ClassDef::displayName()=%s\n",n.data()); - return n; + if (n.find('@')!=-1) + { + return removeAnonymousScopes(n); + } + else + { + return n; + } } // inserts a base/super class in the inheritance list @@ -360,6 +367,8 @@ void ClassDef::insertSubClass(ClassDef *cd,Protection p, Specifier s,const char *t) { //printf("*** insert sub class %s into %s\n",cd->name().data(),name().data()); + static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); + if (!extractPrivate && cd->protection()==Private) return; if (m_impl->inheritedBy==0) { m_impl->inheritedBy = new BaseClassList; @@ -388,7 +397,7 @@ void ClassDef::addMembersToMemberGroup() MemberGroup *mg; for (;(mg=mgli.current());++mgli) { - if (mg->allMembersInSameSection() && m_impl->subGrouping) + if (mg->allMembersInSameSection() && m_impl->subGrouping) { //printf("addToDeclarationSection(%s)\n",mg->header().data()); mg->addToDeclarationSection(); @@ -456,14 +465,14 @@ void ClassDef::internalInsertMember(MemberDef *md, case MemberType_Slot: // Qt specific switch (prot) { - case Protected: + case Protected: case Package: // slots in packages are not possible! addMemberToList(MemberListType_proSlots,md,TRUE); break; - case Public: + case Public: addMemberToList(MemberListType_pubSlots,md,TRUE); break; - case Private: + case Private: addMemberToList(MemberListType_priSlots,md,TRUE); break; } @@ -475,16 +484,16 @@ void ClassDef::internalInsertMember(MemberDef *md, { switch (prot) { - case Protected: + case Protected: addMemberToList(MemberListType_proStaticAttribs,md,TRUE); break; - case Package: + case Package: addMemberToList(MemberListType_pacStaticAttribs,md,TRUE); break; - case Public: + case Public: addMemberToList(MemberListType_pubStaticAttribs,md,TRUE); break; - case Private: + case Private: addMemberToList(MemberListType_priStaticAttribs,md,TRUE); break; } @@ -493,16 +502,16 @@ void ClassDef::internalInsertMember(MemberDef *md, { switch (prot) { - case Protected: + case Protected: addMemberToList(MemberListType_proStaticMethods,md,TRUE); break; - case Package: + case Package: addMemberToList(MemberListType_pacStaticMethods,md,TRUE); break; - case Public: + case Public: addMemberToList(MemberListType_pubStaticMethods,md,TRUE); break; - case Private: + case Private: addMemberToList(MemberListType_priStaticMethods,md,TRUE); break; } @@ -514,17 +523,17 @@ void ClassDef::internalInsertMember(MemberDef *md, { switch (prot) { - case Protected: + case Protected: addMemberToList(MemberListType_proAttribs,md,TRUE); break; case Package: addMemberToList(MemberListType_pacAttribs,md,TRUE); break; - case Public: + case Public: addMemberToList(MemberListType_pubAttribs,md,TRUE); isSimple=!md->isFunctionPtr(); break; - case Private: + case Private: addMemberToList(MemberListType_priAttribs,md,TRUE); break; } @@ -533,17 +542,17 @@ void ClassDef::internalInsertMember(MemberDef *md, { switch (prot) { - case Protected: + case Protected: addMemberToList(MemberListType_proTypes,md,TRUE); break; - case Package: + case Package: addMemberToList(MemberListType_pacTypes,md,TRUE); break; - case Public: + case Public: addMemberToList(MemberListType_pubTypes,md,TRUE); isSimple=QCString(md->typeString()).find(")(")==-1; break; - case Private: + case Private: addMemberToList(MemberListType_priTypes,md,TRUE); break; } @@ -552,22 +561,22 @@ void ClassDef::internalInsertMember(MemberDef *md, { switch (prot) { - case Protected: + case Protected: addMemberToList(MemberListType_proMethods,md,TRUE); break; - case Package: + case Package: addMemberToList(MemberListType_pacMethods,md,TRUE); break; - case Public: + case Public: addMemberToList(MemberListType_pubMethods,md,TRUE); break; - case Private: + case Private: addMemberToList(MemberListType_priMethods,md,TRUE); break; } } } - break; + break; } } if (!isSimple) // not a simple field -> not a simple struct @@ -641,17 +650,17 @@ void ClassDef::internalInsertMember(MemberDef *md, err("Unexpected member type %d found!\n",md->memberType()); } } - break; + break; } } /*************************************************/ /* insert member in the appropriate member group */ /*************************************************/ - // Note: this must be done AFTER inserting the member in the + // Note: this must be done AFTER inserting the member in the // regular groups //addMemberToGroup(md,groupId); - + } if (md->virtualness()==Pure) @@ -665,10 +674,10 @@ void ClassDef::internalInsertMember(MemberDef *md, } //::addClassMemberNameToIndex(md); - if (addToAllList && + if (addToAllList && !(Config_getBool("HIDE_FRIEND_COMPOUNDS") && md->isFriend() && - (QCString(md->typeString())=="friend class" || + (QCString(md->typeString())=="friend class" || QCString(md->typeString())=="friend struct" || QCString(md->typeString())=="friend union"))) { @@ -764,16 +773,17 @@ void ClassDef::findSectionsInDocumentation() // add a file name to the used files set -void ClassDef::insertUsedFile(const char *f) +void ClassDef::insertUsedFile(FileDef *fd) { - if (m_impl->files.find(f)==-1) m_impl->files.append(f); + if (fd==0) return; + if (m_impl->files.find(fd)==-1) m_impl->files.append(fd); if (m_impl->templateInstances) { QDictIterator<ClassDef> qdi(*m_impl->templateInstances); ClassDef *cd; for (qdi.toFirst();(cd=qdi.current());++qdi) { - cd->insertUsedFile(f); + cd->insertUsedFile(fd); } } } @@ -814,7 +824,7 @@ void ClassDef::setIncludeFile(FileDef *fd, m_impl->incInfo->includeName = includeName; m_impl->incInfo->local = local; } - if (force && includeName) + if (force && includeName) { m_impl->incInfo->includeName = includeName; m_impl->incInfo->local = local; @@ -829,7 +839,7 @@ void ClassDef::setIncludeFile(FileDef *fd, // int pi=0; // if (m_impl->tempArgs) return m_impl->tempArgs; // // find the outer most class scope -// while ((ti=name().find("::",pi))!=-1 && +// while ((ti=name().find("::",pi))!=-1 && // (pcd=getClass(name().left(ti)))==0 // ) pi=ti+2; // if (pcd) @@ -858,7 +868,7 @@ static void searchTemplateSpecs(/*in*/ Definition *d, } name+=clName; bool isSpecialization = d->localName().find('<')!=-1; - if (cd->templateArguments()) + if (cd->templateArguments()) { result.append(cd->templateArguments()); if (!isSpecialization) @@ -881,7 +891,7 @@ static void writeTemplateSpec(OutputList &ol,Definition *d, searchTemplateSpecs(d,specs,name); if (specs.count()>0) // class has template scope specifiers { - ol.startSubsubsection(); + ol.startSubsubsection(); QListIterator<ArgumentList> spi(specs); ArgumentList *al; for (spi.toFirst();(al=spi.current());++spi) @@ -900,7 +910,7 @@ static void writeTemplateSpec(OutputList &ol,Definition *d, { ol.docify(" = "); ol.docify(a->defval); - } + } a=al->next(); if (a) ol.docify(", "); } @@ -918,7 +928,7 @@ static void writeTemplateSpec(OutputList &ol,Definition *d, void ClassDef::writeBriefDescription(OutputList &ol,bool exampleFlag) { - if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) + if (hasBriefDescription()) { ol.startParagraph(); ol.generateDoc(briefFile(),briefLine(),this,0, @@ -929,10 +939,7 @@ void ClassDef::writeBriefDescription(OutputList &ol,bool exampleFlag) ol.enable(OutputGenerator::RTF); ol.popGeneratorState(); - if (Config_getBool("REPEAT_BRIEF") || - !documentation().isEmpty() || - exampleFlag - ) + if (hasDetailedDescription() || exampleFlag) { writeMoreLink(ol,anchor()); } @@ -990,14 +997,20 @@ void ClassDef::writeDetailedDocumentationBody(OutputList &ol) ol.endTextBlock(); } +bool ClassDef::hasDetailedDescription() const +{ + static bool repeatBrief = Config_getBool("REPEAT_BRIEF"); + static bool sourceBrowser = Config_getBool("SOURCE_BROWSER"); + return ((!briefDescription().isEmpty() && repeatBrief) || + !documentation().isEmpty() || + (sourceBrowser && getStartBodyLine()!=-1 && getBodyDef())); +} + // write the detailed description for this class -void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &/*pageType*/, bool exampleFlag, +void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &/*pageType*/, bool exampleFlag, const QCString &title,const QCString &anchor) { - if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) || - !documentation().isEmpty() || - (Config_getBool("SOURCE_BROWSER") && getStartBodyLine()!=-1 && getBodyDef()) || - exampleFlag) + if (hasDetailedDescription() || exampleFlag) { ol.pushGeneratorState(); ol.disable(OutputGenerator::Html); @@ -1029,111 +1042,113 @@ void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &/*pageTy //writeTemplateSpec(ol,this,pageType); } } - -void ClassDef::showUsedFiles(OutputList &ol) -{ - ol.pushGeneratorState(); - ol.disable(OutputGenerator::Man); +QCString ClassDef::generatedFromFiles() const +{ + QCString result; SrcLangExt lang = getLanguage(); - ol.writeRuler(); if (lang==SrcLangExt_Fortran) { - ol.parseText(theTranslator->trGeneratedFromFilesFortran( + result = theTranslator->trGeneratedFromFilesFortran( getLanguage()==SrcLangExt_ObjC && m_impl->compType==Interface ? Class : m_impl->compType, - m_impl->files.count()==1)); + m_impl->files.count()==1); } else if (isJavaEnum()) { - ol.parseText(theTranslator->trEnumGeneratedFromFiles(m_impl->files.count()==1)); + result = theTranslator->trEnumGeneratedFromFiles(m_impl->files.count()==1); } else if (m_impl->compType==Service) { - ol.parseText(theTranslator->trServiceGeneratedFromFiles(m_impl->files.count()==1)); + result = theTranslator->trServiceGeneratedFromFiles(m_impl->files.count()==1); } else if (m_impl->compType==Singleton) { - ol.parseText(theTranslator->trSingletonGeneratedFromFiles(m_impl->files.count()==1)); + result = theTranslator->trSingletonGeneratedFromFiles(m_impl->files.count()==1); } else { - ol.parseText(theTranslator->trGeneratedFromFiles( + result = theTranslator->trGeneratedFromFiles( getLanguage()==SrcLangExt_ObjC && m_impl->compType==Interface ? Class : m_impl->compType, - m_impl->files.count()==1)); + m_impl->files.count()==1); } + return result; +} + +void ClassDef::showUsedFiles(OutputList &ol) +{ + ol.pushGeneratorState(); + ol.disable(OutputGenerator::Man); + + + ol.writeRuler(); + ol.parseText(generatedFromFiles()); bool first=TRUE; - const char *file = m_impl->files.first(); - while (file) + FileDef *fd = m_impl->files.first(); + while (fd) { - bool ambig; - FileDef *fd=findFileDef(Doxygen::inputNameDict,file,ambig); - if (fd) + if (first) { - if (first) - { - first=FALSE; - ol.startItemList(); - } - - ol.startItemListItem(); - QCString path=fd->getPath(); - if (Config_getBool("FULL_PATH_NAMES")) - { - ol.docify(stripFromPath(path)); - } + first=FALSE; + ol.startItemList(); + } - QCString fname = fd->name(); - if (!fd->getVersion().isEmpty()) // append version if available - { - fname += " (" + fd->getVersion() + ")"; - } + ol.startItemListItem(); + QCString path=fd->getPath(); + if (Config_getBool("FULL_PATH_NAMES")) + { + ol.docify(stripFromPath(path)); + } - // for HTML - ol.pushGeneratorState(); - ol.disableAllBut(OutputGenerator::Html); - if (fd->generateSourceFile()) - { - ol.writeObjectLink(0,fd->getSourceFileBase(),0,fname); - } - else if (fd->isLinkable()) - { - ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0, - fname); - } - else - { - ol.docify(fname); - } - ol.popGeneratorState(); + QCString fname = fd->name(); + if (!fd->getVersion().isEmpty()) // append version if available + { + fname += " (" + fd->getVersion() + ")"; + } - // for other output formats - ol.pushGeneratorState(); - ol.disable(OutputGenerator::Html); - if (fd->isLinkable()) - { - ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0, - fname); - } - else - { - ol.docify(fname); - } - ol.popGeneratorState(); + // for HTML + ol.pushGeneratorState(); + ol.disableAllBut(OutputGenerator::Html); + if (fd->generateSourceFile()) + { + ol.writeObjectLink(0,fd->getSourceFileBase(),0,fname); + } + else if (fd->isLinkable()) + { + ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0, + fname); + } + else + { + ol.docify(fname); + } + ol.popGeneratorState(); - ol.endItemListItem(); + // for other output formats + ol.pushGeneratorState(); + ol.disable(OutputGenerator::Html); + if (fd->isLinkable()) + { + ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0, + fname); + } + else + { + ol.docify(fname); } - file=m_impl->files.next(); + ol.popGeneratorState(); + + ol.endItemListItem(); + + fd=m_impl->files.next(); } if (!first) ol.endItemList(); ol.popGeneratorState(); } - -void ClassDef::writeInheritanceGraph(OutputList &ol) +int ClassDef::countInheritanceNodes() { - // count direct inheritance relations int count=0; BaseClassDef *ibcd; if (m_impl->inheritedBy) @@ -1156,10 +1171,16 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) ibcd=m_impl->inherits->next(); } } + return count; +} + +void ClassDef::writeInheritanceGraph(OutputList &ol) +{ + // count direct inheritance relations + int count=countInheritanceNodes(); - bool renderDiagram = FALSE; - if (Config_getBool("HAVE_DOT") && + if (Config_getBool("HAVE_DOT") && (Config_getBool("CLASS_DIAGRAMS") || Config_getBool("CLASS_GRAPH"))) // write class diagram using dot { @@ -1175,7 +1196,7 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) renderDiagram = TRUE; } } - else if (Config_getBool("CLASS_DIAGRAMS") && count>0) + else if (Config_getBool("CLASS_DIAGRAMS") && count>0) // write class diagram using build-in generator { ClassDiagram diagram(this); // create a diagram of this class. @@ -1185,7 +1206,7 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) ol.enable(OutputGenerator::Man); ol.endClassDiagram(diagram,getOutputFileBase(),displayName()); renderDiagram = TRUE; - } + } if (renderDiagram) // if we already show the inheritance relations graphically, // then hide the text version @@ -1219,7 +1240,7 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) if (cd->isLinkable()) { - if (!Config_getString("GENERATE_TAGFILE").isEmpty()) + if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { Doxygen::tagFile << " <base"; if (bcd->prot==Protected) @@ -1234,7 +1255,7 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) { Doxygen::tagFile << " virtualness=\"virtual\""; } - Doxygen::tagFile << ">" << convertToXML(cd->name()) + Doxygen::tagFile << ">" << convertToXML(cd->name()) << "</base>" << endl; } ol.writeObjectLink(cd->getReference(), @@ -1252,7 +1273,7 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) err("invalid marker %d in inherits list!\n",entryIndex); } index=newIndex+matchLen; - } + } ol.parseText(inheritLine.right(inheritLine.length()-index)); ol.endParagraph(); } @@ -1285,12 +1306,12 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) writeInheritanceSpecifier(ol,bcd); } index=newIndex+matchLen; - } + } ol.parseText(inheritLine.right(inheritLine.length()-index)); ol.endParagraph(); } - if (renderDiagram) + if (renderDiagram) { ol.enableAll(); } @@ -1313,33 +1334,40 @@ void ClassDef::writeCollaborationGraph(OutputList &ol) } } +QCString ClassDef::includeStatement() const +{ + SrcLangExt lang = getLanguage(); + bool isIDLorJava = lang==SrcLangExt_IDL || lang==SrcLangExt_Java; + if (isIDLorJava) + { + return "import"; + } + else if (isObjectiveC()) + { + return "#import "; + } + else + { + return "#include "; + } +} + void ClassDef::writeIncludeFiles(OutputList &ol) { if (m_impl->incInfo /*&& Config_getBool("SHOW_INCLUDE_FILES")*/) { - QCString nm=m_impl->incInfo->includeName.isEmpty() ? + QCString nm=m_impl->incInfo->includeName.isEmpty() ? (m_impl->incInfo->fileDef ? - m_impl->incInfo->fileDef->docName().data() : "" + m_impl->incInfo->fileDef->docName().data() : "" ) : m_impl->incInfo->includeName.data(); if (!nm.isEmpty()) { ol.startParagraph(); ol.startTypewriter(); + ol.docify(includeStatement()); SrcLangExt lang = getLanguage(); bool isIDLorJava = lang==SrcLangExt_IDL || lang==SrcLangExt_Java; - if (isIDLorJava) - { - ol.docify("import "); - } - else if (isObjectiveC()) - { - ol.docify("#import "); - } - else - { - ol.docify("#include "); - } if (m_impl->incInfo->local || isIDLorJava) ol.docify("\""); else @@ -1362,7 +1390,7 @@ void ClassDef::writeIncludeFiles(OutputList &ol) ol.docify("\""); else ol.docify(">"); - if (isIDLorJava) + if (isIDLorJava) ol.docify(";"); ol.endTypewriter(); ol.endParagraph(); @@ -1417,7 +1445,7 @@ void ClassDef::writeMemberGroups(OutputList &ol,bool showInline) void ClassDef::writeNestedClasses(OutputList &ol,const QCString &title) { // nested classes - if (m_impl->innerClasses) + if (m_impl->innerClasses) { m_impl->innerClasses->writeDeclaration(ol,0,title,TRUE); } @@ -1425,7 +1453,7 @@ void ClassDef::writeNestedClasses(OutputList &ol,const QCString &title) void ClassDef::writeInlineClasses(OutputList &ol) { - if (m_impl->innerClasses) + if (m_impl->innerClasses) { m_impl->innerClasses->writeDocumentation(ol,this); } @@ -1493,12 +1521,12 @@ void ClassDef::writeSummaryLinks(OutputList &ol) LayoutDocEntry *lde; bool first=TRUE; SrcLangExt lang = getLanguage(); - + if (lang!=SrcLangExt_VHDL) { for (eli.toFirst();(lde=eli.current());++eli) { - if (lde->kind()==LayoutDocEntry::ClassNestedClasses && + if (lde->kind()==LayoutDocEntry::ClassNestedClasses && m_impl->innerClasses && m_impl->innerClasses->declVisible() ) @@ -1521,7 +1549,7 @@ void ClassDef::writeSummaryLinks(OutputList &ol) MemberList * ml = getMemberList(lmd->type); if (ml && ml->declVisible()) { - ol.writeSummaryLink(0,ml->listTypeAsString(ml->listType()),lmd->title(lang),first); + ol.writeSummaryLink(0,MemberList::listTypeAsString(ml->listType()),lmd->title(lang),first); first=FALSE; } } @@ -1546,7 +1574,7 @@ void ClassDef::writeSummaryLinks(OutputList &ol) void ClassDef::writeTagFileMarker() { // write section to the tag file - if (!Config_getString("GENERATE_TAGFILE").isEmpty()) + if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { Doxygen::tagFile << " <compound kind=\"" << compoundTypeString(); Doxygen::tagFile << "\""; @@ -1587,7 +1615,7 @@ void ClassDef::writeInlineDocumentation(OutputList &ol) LayoutDocEntry *lde; // part 1: anchor and title - QCString s = compoundTypeString()+" "+name(); + QCString s = compoundTypeString()+" "+name(); // part 1a ol.pushGeneratorState(); @@ -1631,7 +1659,7 @@ void ClassDef::writeInlineDocumentation(OutputList &ol) { switch (lde->kind()) { - case LayoutDocEntry::BriefDesc: + case LayoutDocEntry::BriefDesc: { // since we already shown the brief description in the // declaration part of the container, so we use this to @@ -1639,15 +1667,15 @@ void ClassDef::writeInlineDocumentation(OutputList &ol) writeDetailedDocumentationBody(ol); } break; - case LayoutDocEntry::ClassInheritanceGraph: - writeInheritanceGraph(ol); - break; - case LayoutDocEntry::ClassCollaborationGraph: - writeCollaborationGraph(ol); - break; - case LayoutDocEntry::MemberDeclStart: + case LayoutDocEntry::ClassInheritanceGraph: + writeInheritanceGraph(ol); + break; + case LayoutDocEntry::ClassCollaborationGraph: + writeCollaborationGraph(ol); + break; + case LayoutDocEntry::MemberDeclStart: if (!isSimple) startMemberDeclarations(ol); - break; + break; case LayoutDocEntry::MemberDecl: { LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde; @@ -1657,13 +1685,13 @@ void ClassDef::writeInlineDocumentation(OutputList &ol) case LayoutDocEntry::MemberGroups: if (!isSimple) writeMemberGroups(ol,TRUE); break; - case LayoutDocEntry::MemberDeclEnd: + case LayoutDocEntry::MemberDeclEnd: if (!isSimple) endMemberDeclarations(ol); break; - case LayoutDocEntry::MemberDefStart: + case LayoutDocEntry::MemberDefStart: if (!isSimple) startMemberDocumentation(ol); - break; - case LayoutDocEntry::MemberDef: + break; + case LayoutDocEntry::MemberDef: { LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde; if (isSimple) @@ -1675,8 +1703,8 @@ void ClassDef::writeInlineDocumentation(OutputList &ol) writeMemberDocumentation(ol,lmd->type,lmd->title(lang),TRUE); } } - break; - case LayoutDocEntry::MemberDefEnd: + break; + case LayoutDocEntry::MemberDefEnd: if (!isSimple) endMemberDocumentation(ol); break; default: @@ -1748,8 +1776,8 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade static bool extractLocalClasses = Config_getBool("EXTRACT_LOCAL_CLASSES"); bool isLink = isLinkable(); SrcLangExt lang = getLanguage(); - if (isLink || - (!hideUndocClasses && + if (isLink || + (!hideUndocClasses && (!isLocal() || extractLocalClasses) ) ) @@ -1767,7 +1795,7 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade } else { - ol.parseText(lang==SrcLangExt_Fortran ? + ol.parseText(lang==SrcLangExt_Fortran ? theTranslator->trDataTypes() : theTranslator->trCompounds()); } @@ -1778,7 +1806,7 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !isReference()) // skip classes found in tag files { - Doxygen::tagFile << " <class kind=\"" << compoundTypeString() + Doxygen::tagFile << " <class kind=\"" << compoundTypeString() << "\">" << convertToXML(name()) << "</class>" << endl; } ol.startMemberDeclaration(); @@ -1792,7 +1820,7 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade ol.writeString(" "); ol.insertMemberAlign(); } - if (isLink) + if (isLink) { ol.writeObjectLink(getReference(), getOutputFileBase(), @@ -1800,7 +1828,7 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade cname ); } - else + else { ol.startBold(); ol.docify(cname); @@ -1890,67 +1918,67 @@ void ClassDef::writeDocumentationContents(OutputList &ol,const QCString & /*page { switch (lde->kind()) { - case LayoutDocEntry::BriefDesc: + case LayoutDocEntry::BriefDesc: writeBriefDescription(ol,exampleFlag); - break; - case LayoutDocEntry::ClassIncludes: + break; + case LayoutDocEntry::ClassIncludes: writeIncludeFiles(ol); break; - case LayoutDocEntry::ClassInheritanceGraph: - writeInheritanceGraph(ol); - break; - case LayoutDocEntry::ClassCollaborationGraph: - writeCollaborationGraph(ol); - break; - case LayoutDocEntry::ClassAllMembersLink: + case LayoutDocEntry::ClassInheritanceGraph: + writeInheritanceGraph(ol); + break; + case LayoutDocEntry::ClassCollaborationGraph: + writeCollaborationGraph(ol); + break; + case LayoutDocEntry::ClassAllMembersLink: //writeAllMembersLink(ol); // this is now part of the summary links break; - case LayoutDocEntry::MemberDeclStart: + case LayoutDocEntry::MemberDeclStart: startMemberDeclarations(ol); - break; - case LayoutDocEntry::MemberGroups: + break; + case LayoutDocEntry::MemberGroups: writeMemberGroups(ol); break; - case LayoutDocEntry::MemberDecl: + case LayoutDocEntry::MemberDecl: { LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde; writeMemberDeclarations(ol,lmd->type,lmd->title(lang),lmd->subtitle(lang)); } - break; - case LayoutDocEntry::ClassNestedClasses: + break; + case LayoutDocEntry::ClassNestedClasses: { LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde; writeNestedClasses(ol,ls->title(lang)); } break; - case LayoutDocEntry::MemberDeclEnd: + case LayoutDocEntry::MemberDeclEnd: endMemberDeclarations(ol); break; - case LayoutDocEntry::DetailedDesc: + case LayoutDocEntry::DetailedDesc: { LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde; writeDetailedDescription(ol,pageType,exampleFlag,ls->title(lang)); } - break; - case LayoutDocEntry::MemberDefStart: + break; + case LayoutDocEntry::MemberDefStart: startMemberDocumentation(ol); - break; + break; case LayoutDocEntry::ClassInlineClasses: writeInlineClasses(ol); break; - case LayoutDocEntry::MemberDef: + case LayoutDocEntry::MemberDef: { LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde; writeMemberDocumentation(ol,lmd->type,lmd->title(lang)); } - break; - case LayoutDocEntry::MemberDefEnd: + break; + case LayoutDocEntry::MemberDefEnd: endMemberDocumentation(ol); break; - case LayoutDocEntry::ClassUsedFiles: + case LayoutDocEntry::ClassUsedFiles: showUsedFiles(ol); break; - case LayoutDocEntry::AuthorSection: + case LayoutDocEntry::AuthorSection: writeAuthorSection(ol); break; case LayoutDocEntry::NamespaceNestedNamespaces: @@ -1962,16 +1990,16 @@ void ClassDef::writeDocumentationContents(OutputList &ol,const QCString & /*page case LayoutDocEntry::FileConstantGroups: case LayoutDocEntry::FileIncludes: case LayoutDocEntry::FileIncludeGraph: - case LayoutDocEntry::FileIncludedByGraph: + case LayoutDocEntry::FileIncludedByGraph: case LayoutDocEntry::FileSourceLink: case LayoutDocEntry::FileInlineClasses: - case LayoutDocEntry::GroupClasses: - case LayoutDocEntry::GroupInlineClasses: + case LayoutDocEntry::GroupClasses: + case LayoutDocEntry::GroupInlineClasses: case LayoutDocEntry::GroupNamespaces: - case LayoutDocEntry::GroupDirs: - case LayoutDocEntry::GroupNestedGroups: + case LayoutDocEntry::GroupDirs: + case LayoutDocEntry::GroupNestedGroups: case LayoutDocEntry::GroupFiles: - case LayoutDocEntry::GroupGraph: + case LayoutDocEntry::GroupGraph: case LayoutDocEntry::GroupPageDocs: case LayoutDocEntry::DirSubDirs: case LayoutDocEntry::DirFiles: @@ -1982,7 +2010,7 @@ void ClassDef::writeDocumentationContents(OutputList &ol,const QCString & /*page } } - if (!Config_getString("GENERATE_TAGFILE").isEmpty()) + if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { writeDocAnchorsToTagFile(); Doxygen::tagFile << " </compound>" << endl; @@ -1990,20 +2018,16 @@ void ClassDef::writeDocumentationContents(OutputList &ol,const QCString & /*page ol.endContents(); } -// write all documentation for this class -void ClassDef::writeDocumentation(OutputList &ol) +QCString ClassDef::title() const { - static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); - //static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); - //static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); QCString pageTitle; SrcLangExt lang = getLanguage(); - + if (lang==SrcLangExt_Fortran) { pageTitle = theTranslator->trCompoundReferenceFortran(displayName(), m_impl->compType, - m_impl->tempArgs != 0); + m_impl->tempArgs != 0); } else if (lang==SrcLangExt_VHDL) { @@ -2027,8 +2051,18 @@ void ClassDef::writeDocumentation(OutputList &ol) m_impl->compType == Interface && getLanguage()==SrcLangExt_ObjC ? Class : m_impl->compType, m_impl->tempArgs != 0); } - - startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_ClassVisible,!generateTreeView); + return pageTitle; +} + +// write all documentation for this class +void ClassDef::writeDocumentation(OutputList &ol) +{ + static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); + //static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); + //static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); + QCString pageTitle = title(); + + startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_ClassVisible,!generateTreeView); if (!generateTreeView) { if (getOuterScope()!=Doxygen::globalScope) @@ -2044,7 +2078,7 @@ void ClassDef::writeDocumentation(OutputList &ol) addGroupListToTitle(ol,this); endTitle(ol,getOutputFileBase(),displayName()); writeDocumentationContents(ol,pageTitle); - + endFileWithNavPath(this,ol); if (Config_getBool("SEPARATE_MEMBER_PAGES")) @@ -2061,7 +2095,7 @@ void ClassDef::writeMemberPages(OutputList &ol) ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); - + QListIterator<MemberList> mli(m_impl->memberLists); MemberList *ml; for (mli.toFirst();(ml=mli.current());++mli) @@ -2162,7 +2196,7 @@ void ClassDef::writeMemberList(OutputList &ol) QCString memListFile = getMemberListFileName(); startFile(ol,memListFile,memListFile,theTranslator->trMemberList(), - HLI_ClassVisible,!generateTreeView,getOutputFileBase()); + HLI_ClassVisible,!generateTreeView,getOutputFileBase()); if (!generateTreeView) { if (getOuterScope()!=Doxygen::globalScope) @@ -2180,13 +2214,13 @@ void ClassDef::writeMemberList(OutputList &ol) ol.writeObjectLink(getReference(),getOutputFileBase(),anchor(),displayName()); ol.parseText(theTranslator->trIncludingInheritedMembers()); ol.endParagraph(); - + //ol.startItemList(); ol.writeString("<table class=\"directory\">\n"); - + int idx=0; //MemberNameInfo *mni=m_impl->allMemberNameInfoList->first(); - MemberNameInfoSDict::Iterator mnii(*m_impl->allMemberNameInfoSDict); + MemberNameInfoSDict::Iterator mnii(*m_impl->allMemberNameInfoSDict); MemberNameInfo *mni; for (mnii.toFirst();(mni=mnii.current());++mnii) { @@ -2197,14 +2231,14 @@ void ClassDef::writeMemberList(OutputList &ol) ClassDef *cd=md->getClassDef(); Protection prot = mi->prot; Specifier virt=md->virtualness(); - + //printf("%s: Member %s of class %s md->protection()=%d mi->prot=%d prot=%d inherited=%d\n", // name().data(),md->name().data(),cd->name().data(),md->protection(),mi->prot,prot,mi->inherited); if (cd && !md->name().isEmpty() && md->name()[0]!='@') { bool memberWritten=FALSE; - if (cd->isLinkable() && md->isLinkable()) + if (cd->isLinkable() && md->isLinkable()) // create a link to the documentation { QCString name=mi->ambiguityResolutionScope+md->name(); @@ -2240,7 +2274,7 @@ void ClassDef::writeMemberList(OutputList &ol) md->anchor(),name); if ( md->isFunction() || md->isSignal() || md->isSlot() || - (md->isFriend() && md->argsString())) + (md->isFriend() && md->argsString())) ol.docify(md->argsString()); else if (md->isEnumerate()) ol.parseText(" "+theTranslator->trEnumName()); @@ -2255,9 +2289,10 @@ void ClassDef::writeMemberList(OutputList &ol) ol.writeString("</td>"); memberWritten=TRUE; } - else if (!Config_getBool("HIDE_UNDOC_MEMBERS") && - (protectionLevelVisible(md->protection()) || md->isFriend()) - ) // no documentation, + else if (!cd->isArtificial() && + !Config_getBool("HIDE_UNDOC_MEMBERS") && + (protectionLevelVisible(md->protection()) || md->isFriend()) + ) // no documentation, // generate link to the class instead. { //ol.writeListItem(); @@ -2282,7 +2317,7 @@ void ClassDef::writeMemberList(OutputList &ol) ol.endBold(); if (!md->isObjCMethod()) { - if ( md->isFunction() || md->isSignal() || md->isSlot() ) + if ( md->isFunction() || md->isSignal() || md->isSlot() ) ol.docify(md->argsString()); else if (md->isEnumerate()) ol.parseText(" "+theTranslator->trEnumName()); @@ -2317,15 +2352,15 @@ void ClassDef::writeMemberList(OutputList &ol) ol.writeObjectLink(cd->getReference(), cd->getOutputFileBase(), cd->anchor(), - md->category() ? - md->category()->displayName() : + md->category() ? + md->category()->displayName() : cd->displayName()); ol.writeString("</td>"); ol.writeString("<td class=\"entry\">"); } SrcLangExt lang = md->getLanguage(); if ( - (prot!=Public || (virt!=Normal && getLanguage()!=SrcLangExt_ObjC) || + (prot!=Public || (virt!=Normal && getLanguage()!=SrcLangExt_ObjC) || md->isFriend() || md->isRelated() || md->isExplicit() || md->isMutable() || (md->isInline() && Config_getBool("INLINE_INFO")) || md->isSignal() || md->isSlot() || @@ -2337,7 +2372,7 @@ void ClassDef::writeMemberList(OutputList &ol) { ol.writeString("<span class=\"mlabel\">"); QStrList sl; - if (lang==SrcLangExt_VHDL) + if (lang==SrcLangExt_VHDL) { sl.append(VhdlDocGen::trVhdlType(md->getMemberSpecifiers())); //append vhdl type } @@ -2345,14 +2380,14 @@ void ClassDef::writeMemberList(OutputList &ol) else if (md->isRelated()) sl.append("related"); else { - if (Config_getBool("INLINE_INFO") && md->isInline()) + if (Config_getBool("INLINE_INFO") && md->isInline()) sl.append("inline"); if (md->isExplicit()) sl.append("explicit"); if (md->isMutable()) sl.append("mutable"); if (prot==Protected) sl.append("protected"); else if (prot==Private) sl.append("private"); else if (prot==Package) sl.append("package"); - if (virt==Virtual && getLanguage()!=SrcLangExt_ObjC) + if (virt==Virtual && getLanguage()!=SrcLangExt_ObjC) sl.append("virtual"); else if (virt==Pure) sl.append("pure virtual"); if (md->isStatic()) sl.append("static"); @@ -2392,7 +2427,7 @@ void ClassDef::writeMemberList(OutputList &ol) //ol.endItemList(); ol.writeString("</table>"); - + endFile(ol); ol.popGeneratorState(); } @@ -2420,12 +2455,12 @@ bool ClassDef::addExample(const char *anchor,const char *nameStr, } // returns TRUE if this class is used in an example -bool ClassDef::hasExamples() +bool ClassDef::hasExamples() const { - if (m_impl->exampleSDict==0) - return FALSE; - else - return m_impl->exampleSDict->count()>0; + bool result=FALSE; + if (m_impl->exampleSDict) + result = m_impl->exampleSDict->count()>0; + return result; } @@ -2433,7 +2468,7 @@ void ClassDef::setTemplateArguments(ArgumentList *al) { if (al==0) return; if (!m_impl->tempArgs) delete m_impl->tempArgs; // delete old list if needed - m_impl->tempArgs=new ArgumentList; + m_impl->tempArgs=new ArgumentList; ArgumentListIterator ali(*al); Argument *a; for (;(a=ali.current());++ali) @@ -2456,12 +2491,12 @@ void ClassDef::setTypeConstraints(ArgumentList *al) } /*! Returns \c TRUE iff this class or a class inheriting from this class - * is \e not defined in an external tag file. + * is \e not defined in an external tag file. */ bool ClassDef::hasNonReferenceSuperClass() { - bool found=!isReference() && isLinkableInProject() && !isHidden(); - if (found) + bool found=!isReference() && isLinkableInProject() && !isHidden(); + if (found) { return TRUE; // we're done if this class is not a reference } @@ -2472,7 +2507,7 @@ bool ClassDef::hasNonReferenceSuperClass() { ClassDef *bcd=bcli.current()->classDef; // recurse into the super class branch - found = found || bcd->hasNonReferenceSuperClass(); + found = found || bcd->hasNonReferenceSuperClass(); if (!found) { // look for template instances that might have non-reference super classes @@ -2492,29 +2527,20 @@ bool ClassDef::hasNonReferenceSuperClass() return found; } -/*! called from MemberDef::writeDeclaration() to (recusively) write the +/*! called from MemberDef::writeDeclaration() to (recusively) write the * definition of an anonymous struct, union or class. */ void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup, ClassDef *inheritedFrom,const char *inheritId) { - //ol.insertMemberAlign(); //printf("ClassName=`%s' inGroup=%d\n",name().data(),inGroup); - //if (inGroup && md && md->getClassDef()==this) return; - ol.docify(compoundTypeString()); - int ri=name().findRev("::"); - if (ri==-1) ri=name().length(); - QCString cn=name().right(name().length()-ri-2); - if (!cn.isEmpty() && cn.at(0)!='@' && md) - { - if (cn.right(2)=="-p" /*|| cn.right(2)=="-g"*/) - { - cn = cn.left(cn.length()-2); - } + QCString cn = displayName(FALSE); + if (!cn.isEmpty()) + { ol.docify(" "); - if (isLinkable()) + if (md && isLinkable()) { ol.writeObjectLink(0,0,md->anchor(),cn); } @@ -2526,7 +2552,7 @@ void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup, } } ol.docify(" {"); - ol.endMemberItem(); + ol.endMemberItem(); // write user defined member groups if (m_impl->memberGroupSDict) @@ -2555,7 +2581,7 @@ void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup, /*! a link to this class is possible within this project */ bool ClassDef::isLinkableInProject() const -{ +{ static bool extractLocal = Config_getBool("EXTRACT_LOCAL_CLASSES"); static bool extractStatic = Config_getBool("EXTRACT_STATIC"); static bool hideUndoc = Config_getBool("HIDE_UNDOC_CLASSES"); @@ -2570,7 +2596,7 @@ bool ClassDef::isLinkableInProject() const name().find('@')==-1 && /* not anonymous */ protectionLevelVisible(m_impl->prot) && /* private/internal */ (!m_impl->isLocal || extractLocal) && /* local */ - (hasDocumentation() || !hideUndoc) && /* documented */ + (hasDocumentation() || !hideUndoc) && /* documented */ (!m_impl->isStatic || extractStatic) && /* static */ !isReference(); /* not an external reference */ } @@ -2590,8 +2616,8 @@ bool ClassDef::isLinkable() const /*! the class is visible in a class diagram, or class hierarchy */ -bool ClassDef::isVisibleInHierarchy() -{ +bool ClassDef::isVisibleInHierarchy() +{ static bool allExternals = Config_getBool("ALLEXTERNALS"); static bool hideUndocClasses = Config_getBool("HIDE_UNDOC_CLASSES"); static bool extractStatic = Config_getBool("EXTRACT_STATIC"); @@ -2604,10 +2630,10 @@ bool ClassDef::isVisibleInHierarchy() /*!isArtificial() &&*/ // 1.8.2: allowed these to appear // and not privately inherited protectionLevelVisible(m_impl->prot) && - // documented or shown anyway or documentation is external - (hasDocumentation() || - !hideUndocClasses || - (m_impl->templateMaster && m_impl->templateMaster->hasDocumentation()) || + // documented or shown anyway or documentation is external + (hasDocumentation() || + !hideUndocClasses || + (m_impl->templateMaster && m_impl->templateMaster->hasDocumentation()) || isReference() ) && // is not part of an unnamed namespace or shown anyway @@ -2621,7 +2647,7 @@ bool ClassDef::hasDocumentation() const //---------------------------------------------------------------------- // recursive function: -// returns TRUE iff class definition `bcd' represents an (in)direct base +// returns TRUE iff class definition `bcd' represents an (in)direct base // class of class definition `cd'. bool ClassDef::isBaseClass(ClassDef *bcd, bool followInstances,int level) @@ -2643,9 +2669,9 @@ bool ClassDef::isBaseClass(ClassDef *bcd, bool followInstances,int level) ClassDef *ccd=bcli.current()->classDef; if (!followInstances && ccd->templateMaster()) ccd=ccd->templateMaster(); //printf("isBaseClass() baseclass %s\n",ccd->name().data()); - if (ccd==bcd) + if (ccd==bcd) found=TRUE; - else + else found=ccd->isBaseClass(bcd,followInstances,level+1); } } @@ -2668,9 +2694,9 @@ bool ClassDef::isSubClass(ClassDef *cd,int level) for ( ; bcli.current() && !found ; ++bcli) { ClassDef *ccd=bcli.current()->classDef; - if (ccd==cd) + if (ccd==cd) found=TRUE; - else + else found=ccd->isSubClass(cd,level+1); } } @@ -2686,8 +2712,8 @@ static bool isStandardFunc(MemberDef *md) md->isDestructor(); // destructor } -/*! - * recusively merges the `all members' lists of a class base +/*! + * recusively merges the `all members' lists of a class base * with that of this class. Must only be called for classes without * subclasses! */ @@ -2711,7 +2737,7 @@ void ClassDef::mergeMembers() BaseClassDef *bcd; for ( ; (bcd=bcli.current()) ; ++bcli ) { - ClassDef *bClass=bcd->classDef; + ClassDef *bClass=bcd->classDef; // merge the members in the base class of this inheritance branch first bClass->mergeMembers(); @@ -2730,10 +2756,10 @@ void ClassDef::mergeMembers() if (dstMnd!=0 && (dstMni=dstMnd->find(srcMni->memberName()))) // a member with that name is already in the class. // the member may hide or reimplement the one in the sub class - // or there may be another path to the base class that is already + // or there may be another path to the base class that is already // visited via another branch in the class hierarchy. { - MemberNameInfoIterator srcMnii(*srcMni); + MemberNameInfoIterator srcMnii(*srcMni); MemberInfo *srcMi; for ( ; (srcMi=srcMnii.current()) ; ++srcMnii ) { @@ -2741,7 +2767,7 @@ void ClassDef::mergeMembers() bool found=FALSE; bool ambigue=FALSE; bool hidden=FALSE; - MemberNameInfoIterator dstMnii(*dstMni); + MemberNameInfoIterator dstMnii(*dstMni); MemberInfo *dstMi; ClassDef *srcCd = srcMd->getClassDef(); for ( ; (dstMi=dstMnii.current()) && !found; ++dstMnii ) @@ -2751,7 +2777,7 @@ void ClassDef::mergeMembers() { ClassDef *dstCd = dstMd->getClassDef(); //printf(" Is %s a base class of %s?\n",srcCd->name().data(),dstCd->name().data()); - if (srcCd==dstCd || dstCd->isBaseClass(srcCd,TRUE)) + if (srcCd==dstCd || dstCd->isBaseClass(srcCd,TRUE)) // member is in the same or a base class { ArgumentList *srcAl = srcMd->argumentList(); @@ -2783,18 +2809,18 @@ void ClassDef::mergeMembers() } else // same members { - // do not add if base class is virtual or + // do not add if base class is virtual or // if scope paths are equal or // if base class is an interface (and thus implicitly virtual). //printf("same member found srcMi->virt=%d dstMi->virt=%d\n",srcMi->virt,dstMi->virt); if ((srcMi->virt!=Normal && dstMi->virt!=Normal) || bClass->name()+sep+srcMi->scopePath == dstMi->scopePath || dstMd->getClassDef()->compoundType()==Interface - ) + ) { found=TRUE; } - else // member can be reached via multiple paths in the + else // member can be reached via multiple paths in the // inheritance tree { //printf("$$ Existing member %s %s add scope %s\n", @@ -2816,10 +2842,10 @@ void ClassDef::mergeMembers() // TODO: fix the case where a member is hidden by inheritance // of a member with the same name but with another prototype, - // while there is more than one path to the member in the + // while there is more than one path to the member in the // base class due to multiple inheritance. In this case - // it seems that the member is not reachable by prefixing a - // scope name either (according to my compiler). Currently, + // it seems that the member is not reachable by prefixing a + // scope name either (according to my compiler). Currently, // this case is shown anyway. if (!found && srcMd->protection()!=Private && !srcMd->isFriend()) { @@ -2874,10 +2900,10 @@ void ClassDef::mergeMembers() } else // base class has a member that is not in the sub class => copy { - // create a deep copy of the list (only the MemberInfo's will be + // create a deep copy of the list (only the MemberInfo's will be // copied, not the actual MemberDef's) MemberNameInfo *newMni = 0; - newMni = new MemberNameInfo(srcMni->memberName()); + newMni = new MemberNameInfo(srcMni->memberName()); // copy the member(s) from the base to the sub class MemberNameInfoIterator mnii(*srcMni); @@ -2984,7 +3010,7 @@ void ClassDef::mergeCategory(ClassDef *category) } // make methods private for categories defined in the .m file //printf("%s::mergeCategory makePrivate=%d\n",name().data(),makePrivate); - + MemberNameInfoSDict *srcMnd = category->memberNameInfoSDict(); MemberNameInfoSDict *dstMnd = m_impl->allMemberNameInfoSDict; @@ -3003,7 +3029,7 @@ void ClassDef::mergeCategory(ClassDef *category) //if (dstMi) //{ // Protection prot = dstMi->prot; - // if (makePrivate || isExtension) + // if (makePrivate || isExtension) // { // prot = Private; // removeMemberFromLists(dstMi->memberDef); @@ -3023,7 +3049,7 @@ void ClassDef::mergeCategory(ClassDef *category) //printf("New member %s\n",srcMni->memberName()); // create a deep copy of the list MemberNameInfo *newMni = 0; - newMni = new MemberNameInfo(srcMni->memberName()); + newMni = new MemberNameInfo(srcMni->memberName()); // copy the member(s) from the category to this class MemberNameInfoIterator mnii(*srcMni); @@ -3063,7 +3089,7 @@ void ClassDef::mergeCategory(ClassDef *category) newMd->setCategory(category); newMd->setCategoryRelation(mi->memberDef); mi->memberDef->setCategoryRelation(newMd); - if (makePrivate || isExtension) + if (makePrivate || isExtension) { newMd->makeImplementationDetail(); } @@ -3086,9 +3112,9 @@ void ClassDef::addUsedClass(ClassDef *cd,const char *accessName, static bool umlLook = Config_getBool("UML_LOOK"); if (prot==Private && !extractPrivate) return; //printf("%s::addUsedClass(%s,%s)\n",name().data(),cd->name().data(),accessName); - if (m_impl->usesImplClassDict==0) + if (m_impl->usesImplClassDict==0) { - m_impl->usesImplClassDict = new UsesClassDict(17); + m_impl->usesImplClassDict = new UsesClassDict(17); m_impl->usesImplClassDict->setAutoDelete(TRUE); } UsesClassDef *ucd=m_impl->usesImplClassDict->find(cd->name()); @@ -3120,9 +3146,9 @@ void ClassDef::addUsedByClass(ClassDef *cd,const char *accessName, static bool umlLook = Config_getBool("UML_LOOK"); if (prot==Private && !extractPrivate) return; //printf("%s::addUsedByClass(%s,%s)\n",name().data(),cd->name().data(),accessName); - if (m_impl->usedByImplClassDict==0) + if (m_impl->usedByImplClassDict==0) { - m_impl->usedByImplClassDict = new UsesClassDict(17); + m_impl->usedByImplClassDict = new UsesClassDict(17); m_impl->usedByImplClassDict->setAutoDelete(TRUE); } UsesClassDef *ucd=m_impl->usedByImplClassDict->find(cd->name()); @@ -3149,8 +3175,8 @@ void ClassDef::addUsedByClass(ClassDef *cd,const char *accessName, #if 0 -/*! Builds up a dictionary of all classes that are used by the state of this - * class (the "implementation"). +/*! Builds up a dictionary of all classes that are used by the state of this + * class (the "implementation"). * Must be called before mergeMembers() is called! */ @@ -3189,7 +3215,7 @@ void ClassDef::determineImplUsageRelation() if (arg->name==usedClassName) // type is a template argument { found=TRUE; - if (m_impl->usesImplClassDict==0) m_impl->usesImplClassDict = new UsesClassDict(257); + if (m_impl->usesImplClassDict==0) m_impl->usesImplClassDict = new UsesClassDict(257); cd = new ClassDef(cd->getDefFileName(),cd->getDefLine(), usedClassName,ClassDef::Class); cd->setIsTemplateBaseClass(count); @@ -3216,12 +3242,12 @@ void ClassDef::determineImplUsageRelation() if (cd==0) cd=getResolvedClass(name()+"::"+usedClassName,0,&templSpec); if (cd==0) cd=getResolvedClass(usedClassName,0,&templSpec); // TODO: also try in-between scopes! //printf("Search for class %s result=%p\n",usedClassName.data(),cd); - if (cd) // class exists + if (cd) // class exists { found=TRUE; - if (m_impl->usesImplClassDict==0) + if (m_impl->usesImplClassDict==0) { - m_impl->usesImplClassDict = new UsesClassDict(257); + m_impl->usesImplClassDict = new UsesClassDict(257); m_impl->usesImplClassDict->setAutoDelete(TRUE); } UsesClassDef *ucd=m_impl->usesImplClassDict->find(cd->name()); @@ -3251,7 +3277,7 @@ void ClassDef::determineImplUsageRelation() for (;(ucd=ucdi.current());++ucdi) { msg(" %s via ",ucd->classDef->name().data()); - QDictIterator<void> dvi(*ucd->accessors); + QDictIterator<void> dvi(*ucd->accessors); const char *s; for (;(s=dvi.currentKey());++dvi) { @@ -3279,9 +3305,9 @@ void ClassDef::addUsedInterfaceClasses(MemberDef *md,const char *typeStr) if (cd==0) cd=getClass(type.mid(i,l)); // TODO: also try in-between scopes! if (cd && cd!=this && !isBaseClass(cd)) { - if (m_impl->usesIntfClassDict==0) + if (m_impl->usesIntfClassDict==0) { - m_impl->usesIntfClassDict = new UsesClassDict(257); + m_impl->usesIntfClassDict = new UsesClassDict(257); } UsesClassDef *ucd=m_impl->usesIntfClassDict->find(cd->name()); if (ucd==0) @@ -3310,7 +3336,7 @@ void ClassDef::determineIntfUsageRelation() for (mnii.toFirst();(mi=mnii.current());++mnii) { MemberDef *md=mi->memberDef; - + // compute the protection level for this member Protection protect=md->protection(); if (mi->prot==Protected) // inherited protection @@ -3318,8 +3344,8 @@ void ClassDef::determineIntfUsageRelation() if (protect==Public) protect=Protected; else if (protect==Protected) protect=Private; } - - if (!md->name().isEmpty() && md->name()[0]!='@' && + + if (!md->name().isEmpty() && md->name()[0]!='@' && (mi->prot!=Private && protect!=Private) ) { @@ -3359,7 +3385,7 @@ QCString ClassDef::compoundTypeString() const case Category: return "category"; case Exception: return "exception"; default: return "unknown"; - } + } } else { @@ -3379,8 +3405,8 @@ QCString ClassDef::compoundTypeString() const } } -QCString ClassDef::getOutputFileBase() const -{ +QCString ClassDef::getOutputFileBase() const +{ if (!Doxygen::generatingXmlOutput) { static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES"); @@ -3421,36 +3447,36 @@ QCString ClassDef::getOutputFileBase() const else { // normal locally defined class - return convertNameToFile(m_impl->fileName); + return convertNameToFile(m_impl->fileName); } } -QCString ClassDef::getInstanceOutputFileBase() const -{ +QCString ClassDef::getInstanceOutputFileBase() const +{ if (isReference()) { return m_impl->fileName; } else { - return convertNameToFile(m_impl->fileName); + return convertNameToFile(m_impl->fileName); } } -QCString ClassDef::getFileBase() const -{ +QCString ClassDef::getFileBase() const +{ if (m_impl->templateMaster) { return m_impl->templateMaster->getFileBase(); } else { - return m_impl->fileName; + return m_impl->fileName; } } -QCString ClassDef::getSourceFileBase() const -{ +QCString ClassDef::getSourceFileBase() const +{ if (m_impl->templateMaster) { return m_impl->templateMaster->getSourceFileBase(); @@ -3552,7 +3578,7 @@ ClassDef *ClassDef::insertTemplateInstance(const QCString &fileName, int startLine, int startColumn, const QCString &templSpec,bool &freshInstance) { freshInstance = FALSE; - if (m_impl->templateInstances==0) + if (m_impl->templateInstances==0) { m_impl->templateInstances = new QDict<ClassDef>(17); } @@ -3574,7 +3600,7 @@ ClassDef *ClassDef::insertTemplateInstance(const QCString &fileName, ClassDef *ClassDef::getVariableInstance(const char *templSpec) { - if (m_impl->variableInstances==0) + if (m_impl->variableInstances==0) { m_impl->variableInstances = new QDict<ClassDef>(17); m_impl->variableInstances->setAutoDelete(TRUE); @@ -3730,7 +3756,7 @@ QCString ClassDef::qualifiedNameWithTemplateParameters( QCString clName = className(); //bool isGeneric = getLanguage()==SrcLangExt_CSharp; - //if (isGeneric && clName.right(2)=="-g") + //if (isGeneric && clName.right(2)=="-g") //{ // clName = clName.left(clName.length()-2); //} @@ -3901,196 +3927,6 @@ void ClassDef::sortMemberLists() } } - -/** Computes for a given list type \a inListType, which are the - * the corresponding list type(s) in the base class that are to be - * added to this list. - * - * So for public inheritance, the mapping is 1-1, so outListType1=inListType - * Private members are to be hidden completely. - * - * For protected inheritance, both protected and public members of the - * base class should be joined in the protected member section. - * - * For private inheritance, both protected and public members of the - * base class should be joined in the private member section. - */ -static void convertProtectionLevel( - MemberListType inListType, - Protection inProt, - int *outListType1, - int *outListType2 - ) -{ - static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); - // default representing 1-1 mapping - *outListType1=inListType; - *outListType2=-1; - if (inProt==Public) - { - switch (inListType) // in the private section of the derived class, - // the private section of the base class should not - // be visible - { - case MemberListType_priMethods: - case MemberListType_priStaticMethods: - case MemberListType_priSlots: - case MemberListType_priAttribs: - case MemberListType_priStaticAttribs: - case MemberListType_priTypes: - *outListType1=-1; - *outListType2=-1; - break; - default: - break; - } - } - else if (inProt==Protected) // Protected inheritance - { - switch (inListType) // in the protected section of the derived class, - // both the public and protected members are shown - // as protected - { - case MemberListType_pubMethods: - case MemberListType_pubStaticMethods: - case MemberListType_pubSlots: - case MemberListType_pubAttribs: - case MemberListType_pubStaticAttribs: - case MemberListType_pubTypes: - case MemberListType_priMethods: - case MemberListType_priStaticMethods: - case MemberListType_priSlots: - case MemberListType_priAttribs: - case MemberListType_priStaticAttribs: - case MemberListType_priTypes: - *outListType1=-1; - *outListType2=-1; - break; - - case MemberListType_proMethods: - *outListType2=MemberListType_pubMethods; - break; - case MemberListType_proStaticMethods: - *outListType2=MemberListType_pubStaticMethods; - break; - case MemberListType_proSlots: - *outListType2=MemberListType_pubSlots; - break; - case MemberListType_proAttribs: - *outListType2=MemberListType_pubAttribs; - break; - case MemberListType_proStaticAttribs: - *outListType2=MemberListType_pubStaticAttribs; - break; - case MemberListType_proTypes: - *outListType2=MemberListType_pubTypes; - break; - default: - break; - } - } - else if (inProt==Private) - { - switch (inListType) // in the private section of the derived class, - // both the public and protected members are shown - // as private - { - case MemberListType_pubMethods: - case MemberListType_pubStaticMethods: - case MemberListType_pubSlots: - case MemberListType_pubAttribs: - case MemberListType_pubStaticAttribs: - case MemberListType_pubTypes: - case MemberListType_proMethods: - case MemberListType_proStaticMethods: - case MemberListType_proSlots: - case MemberListType_proAttribs: - case MemberListType_proStaticAttribs: - case MemberListType_proTypes: - *outListType1=-1; - *outListType2=-1; - break; - - case MemberListType_priMethods: - if (extractPrivate) - { - *outListType1=MemberListType_pubMethods; - *outListType2=MemberListType_proMethods; - } - else - { - *outListType1=-1; - *outListType2=-1; - } - break; - case MemberListType_priStaticMethods: - if (extractPrivate) - { - *outListType1=MemberListType_pubStaticMethods; - *outListType2=MemberListType_proStaticMethods; - } - else - { - *outListType1=-1; - *outListType2=-1; - } - break; - case MemberListType_priSlots: - if (extractPrivate) - { - *outListType1=MemberListType_pubSlots; - *outListType1=MemberListType_proSlots; - } - else - { - *outListType1=-1; - *outListType2=-1; - } - break; - case MemberListType_priAttribs: - if (extractPrivate) - { - *outListType1=MemberListType_pubAttribs; - *outListType2=MemberListType_proAttribs; - } - else - { - *outListType1=-1; - *outListType2=-1; - } - break; - case MemberListType_priStaticAttribs: - if (extractPrivate) - { - *outListType1=MemberListType_pubStaticAttribs; - *outListType2=MemberListType_proStaticAttribs; - } - else - { - *outListType1=-1; - *outListType2=-1; - } - break; - case MemberListType_priTypes: - if (extractPrivate) - { - *outListType1=MemberListType_pubTypes; - *outListType2=MemberListType_proTypes; - } - else - { - *outListType1=-1; - *outListType2=-1; - } - break; - default: - break; - } - } - //printf("convertProtectionLevel(type=%d prot=%d): %d,%d\n", - // inListType,inProt,*outListType1,*outListType2); -} - int ClassDef::countMemberDeclarations(MemberListType lt,ClassDef *inheritedFrom, int lt2,bool invert,bool showAlways,QPtrDict<void> *visitedClasses) { @@ -4100,7 +3936,7 @@ int ClassDef::countMemberDeclarations(MemberListType lt,ClassDef *inheritedFrom, MemberList * ml2 = getMemberList((MemberListType)lt2); if (getLanguage()!=SrcLangExt_VHDL) // use specific declarations function { - if (ml) + if (ml) { ml->countDecMembers(); count+=ml->numDecMembers(); @@ -4129,7 +3965,7 @@ int ClassDef::countInheritedDecMembers(MemberListType lt, QPtrDict<void> *visitedClasses) { int inhCount = 0; - int count = countMembersIncludingGrouped(lt,inheritedFrom,FALSE)>0; + int count = countMembersIncludingGrouped(lt,inheritedFrom,FALSE); bool process = count>0; //printf("%s: countInheritedDecMembers: lt=%d process=%d count=%d invert=%d\n", // name().data(),lt,process,count,invert); @@ -4143,15 +3979,18 @@ int ClassDef::countInheritedDecMembers(MemberListType lt, { ClassDef *icd=ibcd->classDef; int lt1,lt2; - convertProtectionLevel(lt,ibcd->prot,<1,<2); - //printf("%s: convert %d->(%d,%d) prot=%d\n", - // icd->name().data(),lt,lt1,lt2,ibcd->prot); - if (visitedClasses->find(icd)==0) + if (icd->isLinkable()) { - visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance - if (lt1!=-1) + convertProtectionLevel(lt,ibcd->prot,<1,<2); + //printf("%s: convert %d->(%d,%d) prot=%d\n", + // icd->name().data(),lt,lt1,lt2,ibcd->prot); + if (visitedClasses->find(icd)==0) { - inhCount+=icd->countMemberDeclarations((MemberListType)lt1,inheritedFrom,lt2,FALSE,TRUE,visitedClasses); + visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance + if (lt1!=-1) + { + inhCount+=icd->countMemberDeclarations((MemberListType)lt1,inheritedFrom,lt2,FALSE,TRUE,visitedClasses); + } } } } @@ -4172,7 +4011,7 @@ void ClassDef::getTitleForMemberListType(MemberListType type, if (lde->kind()==LayoutDocEntry::MemberDecl) { LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde; - if (lmd->type==type) + if (lmd->type==type) { title = lmd->title(lang); subtitle = lmd->subtitle(lang); @@ -4235,8 +4074,8 @@ int ClassDef::countMembersIncludingGrouped(MemberListType lt, { int count=0; MemberList *ml = getMemberList(lt); - if (ml) - { + if (ml) + { count=ml->countInheritableMembers(inheritedFrom); } //printf("%s:countMembersIncludingGrouped: count=%d\n",name().data(),count); @@ -4246,7 +4085,7 @@ int ClassDef::countMembersIncludingGrouped(MemberListType lt, MemberGroup *mg; for (;(mg=mgli.current());++mgli) { - bool hasOwnSection = !mg->allMembersInSameSection() || + bool hasOwnSection = !mg->allMembersInSameSection() || !m_impl->subGrouping; // group is in its own section if ((additional && hasOwnSection) || (!additional && !hasOwnSection)) { @@ -4266,7 +4105,7 @@ void ClassDef::writeInheritedMemberDeclarations(OutputList &ol, { ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); - int count = countMembersIncludingGrouped(lt,inheritedFrom,FALSE)>0; + int count = countMembersIncludingGrouped(lt,inheritedFrom,FALSE); bool process = count>0; //printf("%s: writeInheritedMemberDec: lt=%d process=%d invert=%d always=%d\n", // name().data(),lt,process,invert,showAlways); @@ -4279,25 +4118,28 @@ void ClassDef::writeInheritedMemberDeclarations(OutputList &ol, for (it.toFirst();(ibcd=it.current());++it) { ClassDef *icd=ibcd->classDef; - int lt1,lt3; - convertProtectionLevel(lt,ibcd->prot,<1,<3); - if (lt2==-1 && lt3!=-1) - { - lt2=lt3; - } - //printf("%s:convert %d->(%d,%d) prot=%d\n",icd->name().data(),lt,lt1,lt2,ibcd->prot); - if (visitedClasses->find(icd)==0) + if (icd->isLinkable()) { - visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance - if (lt1!=-1) + int lt1,lt3; + convertProtectionLevel(lt,ibcd->prot,<1,<3); + if (lt2==-1 && lt3!=-1) { - icd->writeMemberDeclarations(ol,(MemberListType)lt1, - title,QCString(),FALSE,inheritedFrom,lt2,FALSE /*invert*/,TRUE,visitedClasses); + lt2=lt3; + } + //printf("%s:convert %d->(%d,%d) prot=%d\n",icd->name().data(),lt,lt1,lt2,ibcd->prot); + if (visitedClasses->find(icd)==0) + { + visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance + if (lt1!=-1) + { + icd->writeMemberDeclarations(ol,(MemberListType)lt1, + title,QCString(),FALSE,inheritedFrom,lt2,FALSE,TRUE,visitedClasses); + } + } + else + { + //printf("%s: class already visited!\n",icd->name().data()); } - } - else - { - //printf("%s: class already visited!\n",icd->name().data()); } } } @@ -4323,29 +4165,26 @@ void ClassDef::writeMemberDeclarations(OutputList &ol,MemberListType lt,const QC { //printf("%s::writeMemberDeclarations(%s) ml=%p ml2=%p\n",name().data(),title.data(),ml,ml2); QCString tt = title, st = subTitle; - if (ml) + if (ml) { //printf(" writeDeclaration type=%d count=%d\n",lt,ml->numDecMembers()); - ml->writeDeclarations(ol,this,0,0,0,tt,st,definitionType(),FALSE,showInline,inheritedFrom,lt); + ml->writeDeclarations(ol,this,0,0,0,tt,st,definitionType(),FALSE,showInline,inheritedFrom,lt); tt.resize(0); st.resize(0); } if (ml2) { //printf(" writeDeclaration type=%d count=%d\n",lt2,ml2->numDecMembers()); - ml2->writeDeclarations(ol,this,0,0,0,tt,st,definitionType(),FALSE,showInline,inheritedFrom,lt); + ml2->writeDeclarations(ol,this,0,0,0,tt,st,definitionType(),FALSE,showInline,inheritedFrom,lt); } static bool inlineInheritedMembers = Config_getBool("INLINE_INHERITED_MEMB"); if (!inlineInheritedMembers) // show inherited members as separate lists { - if (lt!=-1) - { - QPtrDict<void> visited(17); - writeInheritedMemberDeclarations(ol,lt,lt2,title, - inheritedFrom ? inheritedFrom : this, - invert,showAlways, - visitedClasses==0 ? &visited: visitedClasses); - } + QPtrDict<void> visited(17); + writeInheritedMemberDeclarations(ol,lt,lt2,title, + inheritedFrom ? inheritedFrom : this, + invert,showAlways, + visitedClasses==0 ? &visited: visitedClasses); } } } @@ -4388,91 +4227,91 @@ void ClassDef::writePlainMemberDeclaration(OutputList &ol, { //printf("%s: ClassDef::writePlainMemberDeclaration()\n",name().data()); MemberList * ml = getMemberList(lt); - if (ml) + if (ml) { ml->setInGroup(inGroup); - ml->writePlainDeclarations(ol,this,0,0,0,definitionType(),inheritedFrom,inheritId); + ml->writePlainDeclarations(ol,this,0,0,0,definitionType(),inheritedFrom,inheritId); } } -bool ClassDef::isLocal() const -{ - return m_impl->isLocal; +bool ClassDef::isLocal() const +{ + return m_impl->isLocal; } -ClassSDict *ClassDef::getClassSDict() -{ - return m_impl->innerClasses; +ClassSDict *ClassDef::getClassSDict() +{ + return m_impl->innerClasses; } -ClassDef::CompoundType ClassDef::compoundType() const -{ - return m_impl->compType; -} +ClassDef::CompoundType ClassDef::compoundType() const +{ + return m_impl->compType; +} BaseClassList *ClassDef::baseClasses() const -{ - return m_impl->inherits; +{ + return m_impl->inherits; } BaseClassList *ClassDef::subClasses() const -{ - return m_impl->inheritedBy; +{ + return m_impl->inheritedBy; } MemberNameInfoSDict *ClassDef::memberNameInfoSDict() const -{ - return m_impl->allMemberNameInfoSDict; +{ + return m_impl->allMemberNameInfoSDict; } -Protection ClassDef::protection() const -{ - return m_impl->prot; +Protection ClassDef::protection() const +{ + return m_impl->prot; } -ArgumentList *ClassDef::templateArguments() const -{ - return m_impl->tempArgs; +ArgumentList *ClassDef::templateArguments() const +{ + return m_impl->tempArgs; } NamespaceDef *ClassDef::getNamespaceDef() const -{ - return m_impl->nspace; +{ + return m_impl->nspace; } -FileDef *ClassDef::getFileDef() const -{ - return m_impl->fileDef; +FileDef *ClassDef::getFileDef() const +{ + return m_impl->fileDef; } -QDict<ClassDef> *ClassDef::getTemplateInstances() const -{ - return m_impl->templateInstances; +QDict<ClassDef> *ClassDef::getTemplateInstances() const +{ + return m_impl->templateInstances; } -ClassDef *ClassDef::templateMaster() const -{ - return m_impl->templateMaster; -} +ClassDef *ClassDef::templateMaster() const +{ + return m_impl->templateMaster; +} -bool ClassDef::isTemplate() const -{ - return m_impl->tempArgs!=0; +bool ClassDef::isTemplate() const +{ + return m_impl->tempArgs!=0; } -IncludeInfo *ClassDef::includeInfo() const -{ - return m_impl->incInfo; +IncludeInfo *ClassDef::includeInfo() const +{ + return m_impl->incInfo; } -UsesClassDict *ClassDef::usedImplementationClasses() const -{ - return m_impl->usesImplClassDict; +UsesClassDict *ClassDef::usedImplementationClasses() const +{ + return m_impl->usesImplClassDict; } -UsesClassDict *ClassDef::usedByImplementationClasses() const -{ - return m_impl->usedByImplClassDict; +UsesClassDict *ClassDef::usedByImplementationClasses() const +{ + return m_impl->usedByImplClassDict; } UsesClassDict *ClassDef::usedInterfaceClasses() const @@ -4485,9 +4324,9 @@ bool ClassDef::isTemplateArgument() const return m_impl->isTemplArg; } -bool ClassDef::isAbstract() const -{ - return m_impl->isAbstract || (m_impl->spec&Entry::Abstract); +bool ClassDef::isAbstract() const +{ + return m_impl->isAbstract || (m_impl->spec&Entry::Abstract); } bool ClassDef::isFinal() const @@ -4505,69 +4344,69 @@ bool ClassDef::isPublished() const return m_impl->spec&Entry::Published; } -bool ClassDef::isObjectiveC() const -{ - return getLanguage()==SrcLangExt_ObjC; +bool ClassDef::isObjectiveC() const +{ + return getLanguage()==SrcLangExt_ObjC; } -bool ClassDef::isCSharp() const -{ - return getLanguage()==SrcLangExt_CSharp; +bool ClassDef::isCSharp() const +{ + return getLanguage()==SrcLangExt_CSharp; } -ClassDef *ClassDef::categoryOf() const -{ - return m_impl->categoryOf; +ClassDef *ClassDef::categoryOf() const +{ + return m_impl->categoryOf; } -const QList<MemberList> &ClassDef::getMemberLists() const -{ - return m_impl->memberLists; +const QList<MemberList> &ClassDef::getMemberLists() const +{ + return m_impl->memberLists; } -MemberGroupSDict *ClassDef::getMemberGroupSDict() const -{ - return m_impl->memberGroupSDict; +MemberGroupSDict *ClassDef::getMemberGroupSDict() const +{ + return m_impl->memberGroupSDict; } -void ClassDef::setNamespace(NamespaceDef *nd) -{ - m_impl->nspace = nd; +void ClassDef::setNamespace(NamespaceDef *nd) +{ + m_impl->nspace = nd; } -void ClassDef::setFileDef(FileDef *fd) -{ - m_impl->fileDef=fd; +void ClassDef::setFileDef(FileDef *fd) +{ + m_impl->fileDef=fd; } -void ClassDef::setSubGrouping(bool enabled) -{ - m_impl->subGrouping = enabled; +void ClassDef::setSubGrouping(bool enabled) +{ + m_impl->subGrouping = enabled; } -void ClassDef::setProtection(Protection p) -{ - m_impl->prot=p; +void ClassDef::setProtection(Protection p) +{ + m_impl->prot=p; } -void ClassDef::setIsStatic(bool b) -{ - m_impl->isStatic=b; +void ClassDef::setIsStatic(bool b) +{ + m_impl->isStatic=b; } -void ClassDef::setCompoundType(CompoundType t) -{ - m_impl->compType = t; -} +void ClassDef::setCompoundType(CompoundType t) +{ + m_impl->compType = t; +} -void ClassDef::setTemplateMaster(ClassDef *tm) -{ - m_impl->templateMaster=tm; +void ClassDef::setTemplateMaster(ClassDef *tm) +{ + m_impl->templateMaster=tm; } -void ClassDef::makeTemplateArgument(bool b) -{ - m_impl->isTemplArg = b; +void ClassDef::makeTemplateArgument(bool b) +{ + m_impl->isTemplArg = b; } void ClassDef::setCategoryOf(ClassDef *cd) @@ -4625,7 +4464,7 @@ QCString ClassDef::anchor() const else { // normal locally defined class - anc = convertNameToFile(m_impl->fileName); + anc = convertNameToFile(m_impl->fileName); } } return anc; @@ -4638,12 +4477,12 @@ bool ClassDef::isEmbeddedInOuterScope() const Definition *container = getOuterScope(); - bool containerLinkable = - container && + bool containerLinkable = + container && ( (container==Doxygen::globalScope && getFileDef() && getFileDef()->isLinkableInProject()) || // global class in documented file container->isLinkableInProject() // class in documented scope - ); + ); // inline because of INLINE_GROUPED_CLASSES=YES ? bool b1 = (inlineGroupedClasses && partOfGroups()!=0); // a grouped class @@ -4715,8 +4554,32 @@ bool ClassDef::isExtension() const QCString n = name(); int si = n.find('('); int ei = n.find(')'); - bool b = ei>si && n.mid(si+1,ei-si-1).stripWhiteSpace().isEmpty(); + bool b = ei>si && n.mid(si+1,ei-si-1).stripWhiteSpace().isEmpty(); return b; } +const ClassSDict *ClassDef::innerClasses() const +{ + return m_impl->innerClasses; +} + +const FileList &ClassDef::usedFiles() const +{ + return m_impl->files; +} + +const ArgumentList *ClassDef::typeConstraints() const +{ + return m_impl->typeConstraints; +} + +const ExampleSDict *ClassDef::exampleList() const +{ + return m_impl->exampleSDict; +} + +bool ClassDef::subGrouping() const +{ + return m_impl->subGrouping; +} diff --git a/src/classdef.h b/src/classdef.h index 494b8f2..4e76117 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -31,6 +31,7 @@ class ClassList; class ClassSDict; class OutputList; class FileDef; +class FileList; class BaseClassList; class NamespaceDef; class MemberDef; @@ -75,7 +76,6 @@ class ClassDef : public Definition * \param startColumn column number where the definition of this compound * starts. * \param name the name of this compound (including scope) - * \param symId unique Id for this symbol * \param ct the kind of Compound * \param ref the tag file from which this compound is extracted * or 0 if the compound doesn't come from a tag file @@ -125,6 +125,9 @@ class ClassDef : public Definition /** returns TRUE if this class has documentation */ bool hasDocumentation() const; + /** returns TRUE if this class has a non-empty detailed description */ + bool hasDetailedDescription() const; + /** Returns the name as it is appears in the documentation */ QCString displayName(bool includeScope=TRUE) const; @@ -301,6 +304,19 @@ class ClassDef : public Definition bool isJavaEnum() const; bool isGeneric() const; + const ClassSDict *innerClasses() const; + QCString title() const; + + QCString generatedFromFiles() const; + const FileList &usedFiles() const; + + QCString includeStatement() const; + + const ArgumentList *typeConstraints() const; + const ExampleSDict *exampleList() const; + bool hasExamples() const; + QCString getMemberListFileName() const; + bool subGrouping() const; //----------------------------------------------------------------------------------- // --- setters ---- @@ -310,7 +326,7 @@ class ClassDef : public Definition void insertSubClass(ClassDef *,Protection p,Specifier s,const char *t=0); void setIncludeFile(FileDef *fd,const char *incName,bool local,bool force); void insertMember(MemberDef *); - void insertUsedFile(const char *); + void insertUsedFile(FileDef *); bool addExample(const char *anchor,const char *name, const char *file); void mergeCategory(ClassDef *category); void setNamespace(NamespaceDef *nd); @@ -367,12 +383,12 @@ class ClassDef : public Definition void addGroupedInheritedMembers(OutputList &ol,MemberListType lt, ClassDef *inheritedFrom,const QCString &inheritId); int countMembersIncludingGrouped(MemberListType lt,ClassDef *inheritedFrom,bool additional); + int countInheritanceNodes(); bool visited; protected: void addUsedInterfaceClasses(MemberDef *md,const char *typeStr); - bool hasExamples(); bool hasNonReferenceSuperClass(); void showUsedFiles(OutputList &ol); @@ -380,7 +396,6 @@ class ClassDef : public Definition void writeTagFileMarker(); void writeDocumentationContents(OutputList &ol,const QCString &pageTitle); void internalInsertMember(MemberDef *md,Protection prot,bool addToAllList); - QCString getMemberListFileName() const; void addMemberToList(MemberListType lt,MemberDef *md,bool isBrief); MemberList *createMemberList(MemberListType lt); void writeInheritedMemberDeclarations(OutputList &ol,MemberListType lt,int lt2,const QCString &title,ClassDef *inheritedFrom,bool invert,bool showAlways,QPtrDict<void> *visitedClasses); diff --git a/src/classlist.cpp b/src/classlist.cpp index da5bf5a..f19c374 100644 --- a/src/classlist.cpp +++ b/src/classlist.cpp @@ -1,12 +1,12 @@ /****************************************************************************** * - * + * * * Copyright (C) 1997-2013 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * @@ -39,8 +39,8 @@ static int compItems(void *item1,void *item2) ClassDef *c2=(ClassDef *)item2; static bool b = Config_getBool("SORT_BY_SCOPE_NAME"); //printf("compItems: %d %s<->%s\n",b,c1->name().data(),c2->name().data()); - if (b) - { + if (b) + { return qstricmp(c1->name(), c2->name()); } @@ -76,13 +76,13 @@ bool ClassSDict::declVisible(const ClassDef::CompoundType *filter) const ClassDef *cd=0; for (sdi.toFirst();(cd=sdi.current());++sdi) { - if (cd->name().find('@')==-1 && + if (cd->name().find('@')==-1 && (filter==0 || *filter==cd->compoundType()) ) { bool isLink = cd->isLinkable(); - if (isLink || - (!hideUndocClasses && + if (isLink || + (!hideUndocClasses && (!cd->isLocal() || extractLocalClasses) ) ) @@ -107,8 +107,8 @@ void ClassSDict::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *f for (sdi.toFirst();(cd=sdi.current());++sdi) { //printf(" ClassSDict::writeDeclaration for %s\n",cd->name().data()); - if (cd->name().find('@')==-1 && - !cd->isExtension() && + if (cd->name().find('@')==-1 && + !cd->isExtension() && (cd->protection()!=Private || extractPrivate) && (filter==0 || *filter==cd->compoundType()) ) @@ -119,7 +119,7 @@ void ClassSDict::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *f if (found) ol.endMemberList(); } } - + void ClassSDict::writeDocumentation(OutputList &ol,Definition * container) { static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); @@ -140,7 +140,7 @@ void ClassSDict::writeDocumentation(OutputList &ol,Definition * container) // cd->name().data(),cd->getOuterScope(),cd->isEmbeddedInOuterScope(), // container); - if (cd->name().find('@')==-1 && + if (cd->name().find('@')==-1 && cd->isLinkableInProject() && cd->isEmbeddedInOuterScope() && (container==0 || cd->partOfGroups()==0) // if container==0 -> show as part of the group docs, otherwise only show if not part of a group diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp index f148085..c728be3 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -132,6 +132,9 @@ CommandMap cmdMap[] = { "docbookonly", CMD_DBONLY }, { "enddocbookonly",CMD_ENDDBONLY }, { "endinternal", CMD_ENDINTERNAL }, + { "parblock", CMD_PARBLOCK }, + { "endparblock", CMD_ENDPARBLOCK }, + { "diafile", CMD_DIAFILE }, { 0, 0 }, }; diff --git a/src/cmdmapper.h b/src/cmdmapper.h index 88028f1..0017c02 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -121,7 +121,10 @@ enum CommandType CMD_VHDLFLOW = 91, CMD_DBONLY = 92, CMD_ENDDBONLY = 93, - CMD_ENDINTERNAL = 94 + CMD_ENDINTERNAL = 94, + CMD_PARBLOCK = 95, + CMD_ENDPARBLOCK = 96, + CMD_DIAFILE = 97 }; enum HtmlTagType @@ -29,7 +29,8 @@ class Definition; void parseCCode(CodeOutputInterface &,const char *,const QCString &, SrcLangExt lang, bool isExample, const char *exName,FileDef *fd, int startLine,int endLine,bool inlineFragment, - MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx); + MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx, + bool collectXRefs); void resetCCodeParserState(); void codeFreeScanner(); @@ -123,6 +123,7 @@ static bool g_lexInit = FALSE; static QStack<int> g_classScopeLengthStack; static Definition *g_searchCtx; +static bool g_collectXRefs; // context for an Objective-C method call struct ObjCCallCtx @@ -398,7 +399,7 @@ static CallContext g_theCallContext; static void pushScope(const char *s) { g_classScopeLengthStack.push(new int(g_classScope.length())); - if (g_classScope.isEmpty()) + if (g_classScope.isEmpty() || leftScopeMatch(s,g_classScope)) { g_classScope = s; } @@ -885,7 +886,7 @@ static bool getLinkInScope(const QCString &c, // scope // g_currentDefinition,g_currentMemberDef,g_insideBody); if (g_currentDefinition && g_currentMemberDef && - md!=g_currentMemberDef && g_insideBody) + md!=g_currentMemberDef && g_insideBody && g_collectXRefs) { addDocCrossReference(g_currentMemberDef,md); } @@ -1018,7 +1019,8 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName Definition *d = md->getOuterScope()==Doxygen::globalScope ? md->getFileDef() : md->getOuterScope(); if (md->getGroupDef()) d = md->getGroupDef(); - if (d && d->isLinkable() && md->isLinkable() && g_currentMemberDef) + if (d && d->isLinkable() && md->isLinkable() && + g_currentMemberDef && g_collectXRefs) { addDocCrossReference(g_currentMemberDef,md); } @@ -1071,7 +1073,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName } writeMultiLineCodeLink(ol,md,text); addToSearchIndex(clName); - if (g_currentMemberDef) + if (g_currentMemberDef && g_collectXRefs) { addDocCrossReference(g_currentMemberDef,md); } @@ -1127,7 +1129,7 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const { // add usage reference if (g_currentDefinition && g_currentMemberDef && - /*xmd!=g_currentMemberDef &&*/ g_insideBody) + /*xmd!=g_currentMemberDef &&*/ g_insideBody && g_collectXRefs) { addDocCrossReference(g_currentMemberDef,xmd); } @@ -1504,7 +1506,7 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) if (ctx->method && ctx->method->isLinkable()) { writeMultiLineCodeLink(*g_code,ctx->method,pName->data()); - if (g_currentMemberDef) + if (g_currentMemberDef && g_collectXRefs) { addDocCrossReference(g_currentMemberDef,ctx->method); } @@ -1583,7 +1585,7 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx) else if (ctx->objectVar && ctx->objectVar->isLinkable()) // object is class variable { writeMultiLineCodeLink(*g_code,ctx->objectVar,pObject->data()); - if (g_currentMemberDef) + if (g_currentMemberDef && g_collectXRefs) { addDocCrossReference(g_currentMemberDef,ctx->objectVar); } @@ -2600,7 +2602,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" BEGIN( g_lastStringContext ); } } -<RawString>[^)]+ { g_code->codify(yytext); } +<RawString>[^)\n]+ { g_code->codify(yytext); } <RawString>. { g_code->codify(yytext); } <RawString>\n { codifyLines(yytext); } <SkipVerbString>[^"\n]+ { @@ -3537,13 +3539,18 @@ void resetCCodeParserState() } void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s, - SrcLangExt lang,bool exBlock, const char *exName,FileDef *fd, - int startLine,int endLine,bool inlineFragment, - MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx) + SrcLangExt lang,bool exBlock, const char *exName,FileDef *fd, + int startLine,int endLine,bool inlineFragment, + MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx, + bool collectXRefs) { //printf("***parseCode() exBlock=%d exName=%s fd=%p className=%s searchCtx=%s\n", // exBlock,exName,fd,className,searchCtx?searchCtx->name().data():"<none>"); + if (s.isEmpty()) return; + + printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL); + TooltipManager::instance()->clearTooltips(); if (g_codeClassSDict==0) { @@ -3555,6 +3562,7 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s, g_currentFontClass = 0; g_needsTermination = FALSE; g_searchCtx = searchCtx; + g_collectXRefs = collectXRefs; g_inFunctionTryBlock = FALSE; if (endLine!=-1) g_inputLines = endLine+1; @@ -3633,6 +3641,8 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s, delete g_sourceFileDef; g_sourceFileDef=0; } + + printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL); return; } diff --git a/src/commentcnv.l b/src/commentcnv.l index 09230eb..d59ef51 100644 --- a/src/commentcnv.l +++ b/src/commentcnv.l @@ -78,6 +78,7 @@ static int g_blockCount; static bool g_lastEscaped; static int g_lastBlockContext; static bool g_pythonDocString; +static int g_nestingCount; static SrcLangExt g_lang; static bool isFixedForm; // For Fortran @@ -240,9 +241,12 @@ void replaceComment(int offset); %% -<Scan>[^"'!\/\n\\#\\-]* { /* eat anything that is not " / or \n */ - copyToOutput(yytext,(int)yyleng); - } +<Scan>[^"'!\/\n\\#-,]* { /* eat anything that is not " / , or \n */ + copyToOutput(yytext,(int)yyleng); + } +<Scan>[,] { /* eat , so we have a nice separator in long initialization lines */ + copyToOutput(yytext,(int)yyleng); + } <Scan>"\"\"\""! { /* start of python long comment */ if (g_lang!=SrcLangExt_Python) { @@ -251,7 +255,8 @@ void replaceComment(int offset); else { g_pythonDocString = TRUE; - copyToOutput(yytext,(int)yyleng); + g_nestingCount=0; + copyToOutput(yytext,(int)yyleng); BEGIN(CComment); } } @@ -263,6 +268,7 @@ void replaceComment(int offset); else { copyToOutput(yytext,(int)yyleng); + g_nestingCount=0; BEGIN(CComment); } } @@ -277,6 +283,7 @@ void replaceComment(int offset); if (isFixedForm && (g_col == 0)) { copyToOutput(yytext,(int)yyleng); + g_nestingCount=0; BEGIN(CComment); } else @@ -365,8 +372,12 @@ void replaceComment(int offset); g_readLineCtx=YY_START; BEGIN(ReadLine); } +<Scan>"/**/" { /* avoid matching next rule for empty C comment, see bug 711723 */ + copyToOutput(yytext,(int)yyleng); + } <Scan>"/*"[*!]? { /* start of a C comment */ g_specialComment=(int)yyleng==3; + g_nestingCount=0; copyToOutput(yytext,(int)yyleng); BEGIN(CComment); } @@ -378,6 +389,7 @@ void replaceComment(int offset); else { copyToOutput(yytext,(int)yyleng); + g_nestingCount=0; BEGIN(CComment); } } @@ -389,6 +401,7 @@ void replaceComment(int offset); else { copyToOutput(yytext,(int)yyleng); + g_nestingCount=0; BEGIN(CComment); } } @@ -400,6 +413,7 @@ void replaceComment(int offset); else { copyToOutput(yytext,(int)yyleng); + g_nestingCount=0; BEGIN(CComment); } } @@ -564,7 +578,7 @@ void replaceComment(int offset); copyToOutput(yytext,(int)yyleng); } -<CComment>[^\\!@*\n{\"]* { /* anything that is not a '*' or command */ +<CComment>[^\\!@*\n{\"\/]* { /* anything that is not a '*' or command */ copyToOutput(yytext,(int)yyleng); } <CComment>"*"+[^*/\\@\n{\"]* { /* stars without slashes */ @@ -590,6 +604,10 @@ void replaceComment(int offset); BEGIN(Scan); } } +<CComment>"/"+"*" { /* nested C comment */ + g_nestingCount++; + copyToOutput(yytext,(int)yyleng); + } <CComment>"*"+"/" { /* end of C comment */ if (g_lang==SrcLangExt_Python) { @@ -597,8 +615,15 @@ void replaceComment(int offset); } else { - copyToOutput(yytext,(int)yyleng); - BEGIN(Scan); + if (g_nestingCount<=0) + { + copyToOutput(yytext,(int)yyleng); + BEGIN(Scan); + } + else + { + g_nestingCount--; + } } } <CComment>"\n"/[ \t]*[^#] { /* end of Python comment */ @@ -927,6 +952,7 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName) g_condStack.clear(); g_condStack.setAutoDelete(TRUE); + printlex(yy_flex_debug, TRUE, __FILE__, fileName); isFixedForm = FALSE; if (g_lang==SrcLangExt_Fortran) { @@ -935,6 +961,7 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName) if (g_lang==SrcLangExt_Markdown) { + g_nestingCount=0; BEGIN(CComment); } else @@ -955,6 +982,7 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName) g_outBuf->at(g_outBuf->curPos())='\0'; msg("-------------\n%s\n-------------\n",g_outBuf->data()); } + printlex(yy_flex_debug, FALSE, __FILE__, fileName); } diff --git a/src/commentscan.l b/src/commentscan.l index 886c2dd..0d08e5c 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -118,6 +118,8 @@ static bool handleExtends(const QCString &); static bool handleCopyDoc(const QCString &); static bool handleCopyBrief(const QCString &); static bool handleCopyDetails(const QCString &); +static bool handleParBlock(const QCString &); +static bool handleEndParBlock(const QCString &); typedef bool (*DocCmdFunc)(const QCString &name); @@ -170,6 +172,8 @@ static DocCmdMap docCmdMap[] = { "relates", &handleRelated, TRUE }, { "relatedalso", &handleRelatedAlso, TRUE }, { "relatesalso", &handleRelatedAlso, TRUE }, + { "parblock", &handleParBlock, TRUE }, + { "endparblock", &handleEndParBlock, TRUE }, { "refitem", &handleRefItem, TRUE }, { "cite", &handleCite, FALSE }, { "subpage", &handleSubpage, TRUE }, @@ -178,7 +182,7 @@ static DocCmdMap docCmdMap[] = { "subsubsection", &handleSection, TRUE }, { "paragraph", &handleSection, TRUE }, { "anchor", &handleAnchor, TRUE }, - { "verbatim", &handleFormatBlock, TRUE }, + { "verbatim", &handleFormatBlock, TRUE }, { "latexonly", &handleFormatBlock, FALSE }, { "htmlonly", &handleFormatBlock, FALSE }, { "xmlonly", &handleFormatBlock, FALSE }, @@ -421,6 +425,8 @@ static QCString g_copyDocArg; static QCString g_guardExpr; static int g_roundCount; +static bool g_insideParBlock; + //----------------------------------------------------------------------------- static QStack<Grouping> g_autoGroupStack; @@ -437,6 +443,7 @@ static void initParser() g_sectionLabel.resize(0); g_sectionTitle.resize(0); g_memberGroupHeader.resize(0); + g_insideParBlock = FALSE; } //----------------------------------------------------------------------------- @@ -1040,7 +1047,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" int i=0; while (yytext[i]==' ' || yytext[i]=='\t') i++; g_spaceBeforeCmd = QCString(yytext).left(i); - if (cmdPtr->endsBrief) + if (cmdPtr->endsBrief && inContext!=OutputXRef) { briefEndsAtDot=FALSE; // this command forces the end of brief description @@ -1192,7 +1199,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" if (inContext==OutputXRef) { // see bug 613024, we need to put the newlines after ending the XRef section. - setOutput(OutputDoc); + if (!g_insideParBlock) setOutput(OutputDoc); int i; for (i=0;i<yyleng;) { @@ -2389,6 +2396,31 @@ static bool handleXRefItem(const QCString &) return FALSE; } +static bool handleParBlock(const QCString &) +{ + if (g_insideParBlock) + { + warn(yyFileName,yyLineNr, + "found \\parblock command while already in a parblock!"); + } + addOutput("@parblock "); + g_insideParBlock = TRUE; + return FALSE; +} + +static bool handleEndParBlock(const QCString &) +{ + if (!g_insideParBlock) + { + warn(yyFileName,yyLineNr, + "found \\endparblock command without matching \\parblock!"); + } + addOutput("@endparblock"); + setOutput(OutputDoc); // to end a parblock inside a xrefitem like context + g_insideParBlock = FALSE; + return FALSE; +} + static bool handleRelated(const QCString &) { BEGIN(RelatesParam1); @@ -2786,6 +2818,7 @@ bool parseCommentBlock(/* in */ ParserInterface *parser, g_spaceBeforeCmd.resize(0); g_spaceBeforeIf.resize(0); + printlex(yy_flex_debug, TRUE, __FILE__, fileName ? fileName.data(): NULL); if (!current->inbodyDocs.isEmpty() && isInbody) // separate in body fragments { current->inbodyDocs+="\n\n"; @@ -2795,9 +2828,9 @@ bool parseCommentBlock(/* in */ ParserInterface *parser, "input=[\n%s]\n",fileName.data(),lineNr,comment.data() ); - commentScanYYrestart( commentScanYYin ); + commentscanYYrestart( commentscanYYin ); BEGIN( Comment ); - commentScanYYlex(); + commentscanYYlex(); setOutput( OutputDoc ); if (YY_START==OverloadParam) // comment ended with \overload @@ -2810,6 +2843,12 @@ bool parseCommentBlock(/* in */ ParserInterface *parser, warn(yyFileName,yyLineNr,"Documentation block ended in the middle of a conditional section!"); } + if (g_insideParBlock) + { + warn(yyFileName,yyLineNr, + "Documentation block ended while inside a \\parblock. Missing \\endparblock"); + } + current->doc=stripLeadingAndTrailingEmptyLines(current->doc,current->docLine); if (current->section==Entry::FILEDOC_SEC && current->doc.isEmpty()) @@ -2856,6 +2895,7 @@ bool parseCommentBlock(/* in */ ParserInterface *parser, //printf("position=%d parseMore=%d newEntryNeeded=%d\n", // position,parseMore,newEntryNeeded); + printlex(yy_flex_debug, FALSE, __FILE__, fileName ? fileName.data(): NULL); return parseMore; } @@ -3074,7 +3114,7 @@ static void handleGuard(const QCString &expr) #if !defined(YY_FLEX_SUBMINOR_VERSION) //---------------------------------------------------------------------------- extern "C" { // some bogus code to keep the compiler happy - void commentScanYYdummy() { yy_flex_realloc(0,0); } + void commentscanYYdummy() { yy_flex_realloc(0,0); } } #endif diff --git a/src/compound.xsd b/src/compound.xsd index d623c5f..c1eb0ab 100644 --- a/src/compound.xsd +++ b/src/compound.xsd @@ -386,6 +386,7 @@ <xsd:element name="rtfonly" type="xsd:string" /> <xsd:element name="latexonly" type="xsd:string" /> <xsd:element name="dot" type="xsd:string" /> + <xsd:element name="msc" type="xsd:string" /> <xsd:element name="anchor" type="docAnchorType" /> <xsd:element name="formula" type="docFormulaType" /> <xsd:element name="ref" type="docRefTextType" /> @@ -501,13 +502,16 @@ <xsd:element name="table" type="docTableType" /> <xsd:element name="heading" type="docHeadingType" /> <xsd:element name="image" type="docImageType" /> - <xsd:element name="dotfile" type="docDotFileType" /> + <xsd:element name="dotfile" type="docFileType" /> + <xsd:element name="mscfile" type="docFileType" /> + <xsd:element name="diafile" type="docFileType" /> <xsd:element name="toclist" type="docTocListType" /> <xsd:element name="language" type="docLanguageType" /> <xsd:element name="parameterlist" type="docParamListType" /> <xsd:element name="xrefsect" type="docXRefSectType" /> <xsd:element name="copydoc" type="docCopyType" /> <xsd:element name="blockquote" type="docBlockQuoteType" /> + <xsd:element name="parblock" type="docParBlockType" /> </xsd:choice> </xsd:group> @@ -627,7 +631,7 @@ <xsd:attribute name="height" type="xsd:string" /> </xsd:complexType> - <xsd:complexType name="docDotFileType" mixed="true"> + <xsd:complexType name="docFileType" mixed="true"> <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" /> <xsd:attribute name="name" type="xsd:string" /> </xsd:complexType> @@ -707,6 +711,12 @@ </xsd:sequence> </xsd:complexType> + <xsd:complexType name="docParBlockType"> + <xsd:sequence> + <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="docCharType"> <xsd:attribute name="char" type="DoxCharRange"/> </xsd:complexType> diff --git a/src/compound_xsd.h b/src/compound_xsd.h deleted file mode 100644 index 8ec3633..0000000 --- a/src/compound_xsd.h +++ /dev/null @@ -1,926 +0,0 @@ -"<?xml version='1.0' encoding='utf-8' ?>\n" -"<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n" -" <xsd:element name=\"doxygen\" type=\"DoxygenType\"/>\n" -"\n" -" <!-- Complex types -->\n" -"\n" -" <xsd:complexType name=\"DoxygenType\">\n" -" <xsd:sequence maxOccurs=\"unbounded\">\n" -" <xsd:element name=\"compounddef\" type=\"compounddefType\" minOccurs=\"0\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"version\" type=\"DoxVersionNumber\" use=\"required\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"compounddefType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"compoundname\" type=\"xsd:string\"/>\n" -" <xsd:element name=\"title\" type=\"xsd:string\" minOccurs=\"0\" />\n" -" <xsd:element name=\"basecompoundref\" type=\"compoundRefType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"derivedcompoundref\" type=\"compoundRefType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"includes\" type=\"incType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"includedby\" type=\"incType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"incdepgraph\" type=\"graphType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"invincdepgraph\" type=\"graphType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"innerdir\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"innerfile\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"innerclass\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"innernamespace\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"innerpage\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"innergroup\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"templateparamlist\" type=\"templateparamlistType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"sectiondef\" type=\"sectiondefType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"briefdescription\" type=\"descriptionType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"detaileddescription\" type=\"descriptionType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"inheritancegraph\" type=\"graphType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"collaborationgraph\" type=\"graphType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"programlisting\" type=\"listingType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"location\" type=\"locationType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"listofallmembers\" type=\"listofallmembersType\" minOccurs=\"0\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"kind\" type=\"DoxCompoundKind\" />\n" -" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n" -" <xsd:attribute name=\"final\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"sealed\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"abstract\" type=\"DoxBool\" use=\"optional\"/>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"listofallmembersType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"member\" type=\"memberRefType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"memberRefType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"scope\" />\n" -" <xsd:element name=\"name\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n" -" <xsd:attribute name=\"virt\" type=\"DoxVirtualKind\" />\n" -" <xsd:attribute name=\"ambiguityscope\" type=\"xsd:string\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"compoundRefType\">\n" -" <xsd:simpleContent>\n" -" <xsd:extension base=\"xsd:string\">\n" -" <xsd:attribute name=\"refid\" type=\"xsd:string\" use=\"optional\" />\n" -" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n" -" <xsd:attribute name=\"virt\" type=\"DoxVirtualKind\" />\n" -" </xsd:extension>\n" -" </xsd:simpleContent>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"reimplementType\">\n" -" <xsd:simpleContent>\n" -" <xsd:extension base=\"xsd:string\">\n" -" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n" -" </xsd:extension>\n" -" </xsd:simpleContent>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"incType\">\n" -" <xsd:simpleContent>\n" -" <xsd:extension base=\"xsd:string\">\n" -" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"local\" type=\"DoxBool\" />\n" -" </xsd:extension>\n" -" </xsd:simpleContent>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"refType\">\n" -" <xsd:simpleContent>\n" -" <xsd:extension base=\"xsd:string\">\n" -" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" use=\"optional\"/>\n" -" </xsd:extension>\n" -" </xsd:simpleContent>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"refTextType\">\n" -" <xsd:simpleContent>\n" -" <xsd:extension base=\"xsd:string\">\n" -" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"kindref\" type=\"DoxRefKind\" />\n" -" <xsd:attribute name=\"external\" type=\"xsd:string\" use=\"optional\"/>\n" -" <xsd:attribute name=\"tooltip\" type=\"xsd:string\" use=\"optional\"/>\n" -" </xsd:extension>\n" -" </xsd:simpleContent>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"sectiondefType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"header\" type=\"xsd:string\" minOccurs=\"0\" />\n" -" <xsd:element name=\"description\" type=\"descriptionType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"memberdef\" type=\"memberdefType\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"kind\" type=\"DoxSectionKind\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"memberdefType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"templateparamlist\" type=\"templateparamlistType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"type\" type=\"linkedTextType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"definition\" minOccurs=\"0\" />\n" -" <xsd:element name=\"argsstring\" minOccurs=\"0\" />\n" -" <xsd:element name=\"name\" />\n" -" <xsd:element name=\"read\" minOccurs=\"0\" />\n" -" <xsd:element name=\"write\" minOccurs=\"0\" />\n" -" <xsd:element name=\"bitfield\" minOccurs=\"0\" />\n" -" <xsd:element name=\"reimplements\" type=\"reimplementType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"reimplementedby\" type=\"reimplementType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"param\" type=\"paramType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"enumvalue\" type=\"enumvalueType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"initializer\" type=\"linkedTextType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"exceptions\" type=\"linkedTextType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"briefdescription\" type=\"descriptionType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"detaileddescription\" type=\"descriptionType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"inbodydescription\" type=\"descriptionType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"location\" type=\"locationType\" />\n" -" <xsd:element name=\"references\" type=\"referenceType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"referencedby\" type=\"referenceType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"kind\" type=\"DoxMemberKind\" />\n" -" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n" -" <xsd:attribute name=\"static\" type=\"DoxBool\" />\n" -" <xsd:attribute name=\"const\" type=\"DoxBool\" />\n" -" <xsd:attribute name=\"explicit\" type=\"DoxBool\" />\n" -" <xsd:attribute name=\"inline\" type=\"DoxBool\" />\n" -" <xsd:attribute name=\"virt\" type=\"DoxVirtualKind\" />\n" -" <xsd:attribute name=\"volatile\" type=\"DoxBool\" />\n" -" <xsd:attribute name=\"mutable\" type=\"DoxBool\" />\n" -" <!-- Qt property -->\n" -" <xsd:attribute name=\"readable\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"writable\" type=\"DoxBool\" use=\"optional\"/>\n" -" <!-- C++/CLI variable -->\n" -" <xsd:attribute name=\"initonly\" type=\"DoxBool\" use=\"optional\"/>\n" -" <!-- C++/CLI and C# property -->\n" -" <xsd:attribute name=\"settable\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"gettable\" type=\"DoxBool\" use=\"optional\"/>\n" -" <!-- C++/CLI function -->\n" -" <xsd:attribute name=\"final\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"sealed\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"new\" type=\"DoxBool\" use=\"optional\"/>\n" -" <!-- C++/CLI event -->\n" -" <xsd:attribute name=\"add\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"remove\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"raise\" type=\"DoxBool\" use=\"optional\"/>\n" -" <!-- Objective-C 2.0 protocol method -->\n" -" <xsd:attribute name=\"optional\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"required\" type=\"DoxBool\" use=\"optional\"/>\n" -" <!-- Objective-C 2.0 property accessor -->\n" -" <xsd:attribute name=\"accessor\" type=\"DoxAccessor\" use=\"optional\"/>\n" -" <!-- UNO IDL -->\n" -" <xsd:attribute name=\"attribute\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"property\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"readonly\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"bound\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"removable\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"contrained\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"transient\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"maybevoid\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"maybedefault\" type=\"DoxBool\" use=\"optional\"/>\n" -" <xsd:attribute name=\"maybeambiguous\" type=\"DoxBool\" use=\"optional\"/>\n" -"\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"descriptionType\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"title\" type=\"xsd:string\" minOccurs=\"0\"/> \n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"sect1\" type=\"docSect1Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"internal\" type=\"docInternalType\" minOccurs=\"0\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"enumvalueType\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"name\" />\n" -" <xsd:element name=\"initializer\" type=\"linkedTextType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"briefdescription\" type=\"descriptionType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"detaileddescription\" type=\"descriptionType\" minOccurs=\"0\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"templateparamlistType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"param\" type=\"paramType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"paramType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"type\" type=\"linkedTextType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"declname\" minOccurs=\"0\" />\n" -" <xsd:element name=\"defname\" minOccurs=\"0\" />\n" -" <xsd:element name=\"array\" minOccurs=\"0\" />\n" -" <xsd:element name=\"defval\" type=\"linkedTextType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"briefdescription\" type=\"descriptionType\" minOccurs=\"0\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"linkedTextType\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"ref\" type=\"refTextType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"graphType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"node\" type=\"nodeType\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"nodeType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"label\" />\n" -" <xsd:element name=\"link\" type=\"linkType\" minOccurs=\"0\" />\n" -" <xsd:element name=\"childnode\" type=\"childnodeType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"childnodeType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"edgelabel\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"relation\" type=\"DoxGraphRelation\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"linkType\">\n" -" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"external\" type=\"xsd:string\" use=\"optional\"/>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"listingType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"codeline\" type=\"codelineType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"codelineType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"highlight\" type=\"highlightType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"lineno\" type=\"xsd:integer\" />\n" -" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"refkind\" type=\"DoxRefKind\" />\n" -" <xsd:attribute name=\"external\" type=\"DoxBool\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"highlightType\" mixed=\"true\">\n" -" <xsd:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n" -" <xsd:element name=\"sp\" />\n" -" <xsd:element name=\"ref\" type=\"refTextType\" />\n" -" </xsd:choice>\n" -" <xsd:attribute name=\"class\" type=\"DoxHighlightClass\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"referenceType\" mixed=\"true\">\n" -" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"compoundref\" type=\"xsd:string\" use=\"optional\" />\n" -" <xsd:attribute name=\"startline\" type=\"xsd:integer\" />\n" -" <xsd:attribute name=\"endline\" type=\"xsd:integer\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"locationType\">\n" -" <xsd:attribute name=\"file\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"line\" type=\"xsd:integer\" />\n" -" <xsd:attribute name=\"column\" type=\"xsd:integer\" use=\"optional\"/>\n" -" <xsd:attribute name=\"bodyfile\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"bodystart\" type=\"xsd:integer\" />\n" -" <xsd:attribute name=\"bodyend\" type=\"xsd:integer\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docSect1Type\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"title\" type=\"xsd:string\" /> \n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"sect2\" type=\"docSect2Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"internal\" type=\"docInternalS1Type\" minOccurs=\"0\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docSect2Type\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"title\" type=\"xsd:string\" /> \n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"sect3\" type=\"docSect3Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"internal\" type=\"docInternalS2Type\" minOccurs=\"0\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docSect3Type\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"title\" type=\"xsd:string\" /> \n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"sect4\" type=\"docSect4Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"internal\" type=\"docInternalS3Type\" minOccurs=\"0\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docSect4Type\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"title\" type=\"xsd:string\" /> \n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"internal\" type=\"docInternalS4Type\" minOccurs=\"0\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docInternalType\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"sect1\" type=\"docSect1Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docInternalS1Type\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"sect2\" type=\"docSect2Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docInternalS2Type\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"sect3\" type=\"docSect3Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docInternalS3Type\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"sect3\" type=\"docSect4Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docInternalS4Type\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -" \n" -" <xsd:group name=\"docTitleCmdGroup\">\n" -" <xsd:choice>\n" -" <xsd:element name=\"ulink\" type=\"docURLLink\" />\n" -" <xsd:element name=\"bold\" type=\"docMarkupType\" />\n" -" <xsd:element name=\"emphasis\" type=\"docMarkupType\" />\n" -" <xsd:element name=\"computeroutput\" type=\"docMarkupType\" />\n" -" <xsd:element name=\"subscript\" type=\"docMarkupType\" />\n" -" <xsd:element name=\"superscript\" type=\"docMarkupType\" />\n" -" <xsd:element name=\"center\" type=\"docMarkupType\" />\n" -" <xsd:element name=\"small\" type=\"docMarkupType\" />\n" -" <xsd:element name=\"htmlonly\" type=\"xsd:string\" />\n" -" <xsd:element name=\"manonly\" type=\"xsd:string\" />\n" -" <xsd:element name=\"xmlonly\" type=\"xsd:string\" />\n" -" <xsd:element name=\"rtfonly\" type=\"xsd:string\" />\n" -" <xsd:element name=\"latexonly\" type=\"xsd:string\" />\n" -" <xsd:element name=\"dot\" type=\"xsd:string\" />\n" -" <xsd:element name=\"anchor\" type=\"docAnchorType\" />\n" -" <xsd:element name=\"formula\" type=\"docFormulaType\" />\n" -" <xsd:element name=\"ref\" type=\"docRefTextType\" />\n" -" <xsd:element name=\"copy\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"trademark\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"registered\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"lsquo\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"rsquo\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"ldquo\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"rdquo\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"ndash\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"mdash\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"umlaut\" type=\"docCharType\" />\n" -" <xsd:element name=\"acute\" type=\"docCharType\" />\n" -" <xsd:element name=\"grave\" type=\"docCharType\" />\n" -" <xsd:element name=\"circ\" type=\"docCharType\" />\n" -" <xsd:element name=\"slash\" type=\"docCharType\" />\n" -" <xsd:element name=\"tilde\" type=\"docCharType\" />\n" -" <xsd:element name=\"cedil\" type=\"docCharType\" />\n" -" <xsd:element name=\"ring\" type=\"docCharType\" />\n" -" <xsd:element name=\"szlig\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"nonbreakablespace\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"aelig\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"AElig\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"Gamma\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"Delta\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"Theta\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"Lambda\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"Xi\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"Pi\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"Sigma\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"Upsilon\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"Phi\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"Psi\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"Omega\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"alpha\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"beta\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"gamma\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"delta\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"epsilon\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"zeta\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"eta\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"theta\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"iota\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"kappa\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"lambda\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"mu\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"nu\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"xi\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"pi\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"rho\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"sigma\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"tau\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"upsilon\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"phi\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"chi\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"psi\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"omega\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"sigmaf\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"sect\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"deg\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"prime\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"Prime\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"infin\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"empty\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"plusmn\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"times\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"minus\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"sdot\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"part\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"nabla\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"radic\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"perp\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"sum\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"int\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"prod\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"sim\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"asymp\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"ne\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"equiv\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"prop\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"le\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"ge\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"larr\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"rarr\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"isin\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"notin\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"lceil\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"rceil\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"lfloor\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"rfloor\" type=\"docEmptyType\" />\n" -" </xsd:choice>\n" -" </xsd:group>\n" -"\n" -" <xsd:complexType name=\"docTitleType\" mixed=\"true\">\n" -" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:group name=\"docCmdGroup\">\n" -" <xsd:choice>\n" -" <xsd:group ref=\"docTitleCmdGroup\"/>\n" -" <xsd:element name=\"linebreak\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"hruler\" type=\"docEmptyType\" />\n" -" <xsd:element name=\"preformatted\" type=\"docMarkupType\" />\n" -" <xsd:element name=\"programlisting\" type=\"listingType\" />\n" -" <xsd:element name=\"verbatim\" type=\"xsd:string\" />\n" -" <xsd:element name=\"indexentry\" type=\"docIndexEntryType\" />\n" -" <xsd:element name=\"orderedlist\" type=\"docListType\" />\n" -" <xsd:element name=\"itemizedlist\" type=\"docListType\" />\n" -" <xsd:element name=\"simplesect\" type=\"docSimpleSectType\" />\n" -" <xsd:element name=\"title\" type=\"docTitleType\" />\n" -" <xsd:element name=\"variablelist\" type=\"docVariableListType\" />\n" -" <xsd:element name=\"table\" type=\"docTableType\" />\n" -" <xsd:element name=\"heading\" type=\"docHeadingType\" />\n" -" <xsd:element name=\"image\" type=\"docImageType\" />\n" -" <xsd:element name=\"dotfile\" type=\"docDotFileType\" />\n" -" <xsd:element name=\"toclist\" type=\"docTocListType\" />\n" -" <xsd:element name=\"language\" type=\"docLanguageType\" />\n" -" <xsd:element name=\"parameterlist\" type=\"docParamListType\" />\n" -" <xsd:element name=\"xrefsect\" type=\"docXRefSectType\" />\n" -" <xsd:element name=\"copydoc\" type=\"docCopyType\" />\n" -" <xsd:element name=\"blockquote\" type=\"docBlockQuoteType\" />\n" -" </xsd:choice>\n" -" </xsd:group>\n" -"\n" -" <xsd:complexType name=\"docParaType\" mixed=\"true\">\n" -" <xsd:group ref=\"docCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docMarkupType\" mixed=\"true\">\n" -" <xsd:group ref=\"docCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docURLLink\" mixed=\"true\">\n" -" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:attribute name=\"url\" type=\"xsd:string\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docAnchorType\" mixed=\"true\">\n" -" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docFormulaType\" mixed=\"true\">\n" -" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docIndexEntryType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"primaryie\" type=\"xsd:string\" />\n" -" <xsd:element name=\"secondaryie\" type=\"xsd:string\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docListType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"listitem\" type=\"docListItemType\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docListItemType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docSimpleSectType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"title\" type=\"docTitleType\" minOccurs=\"0\" />\n" -" <xsd:sequence minOccurs=\"0\" maxOccurs=\"unbounded\">\n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"1\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"simplesectsep\" type=\"docEmptyType\" minOccurs=\"0\"/>\n" -" </xsd:sequence>\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"kind\" type=\"DoxSimpleSectKind\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docVarListEntryType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"term\" type=\"docTitleType\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:group name=\"docVariableListGroup\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"varlistentry\" type=\"docVarListEntryType\" />\n" -" <xsd:element name=\"listitem\" type=\"docListItemType\" />\n" -" </xsd:sequence>\n" -" </xsd:group>\n" -"\n" -" <xsd:complexType name=\"docVariableListType\">\n" -" <xsd:sequence>\n" -" <xsd:group ref=\"docVariableListGroup\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docRefTextType\" mixed=\"true\">\n" -" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"kindref\" type=\"DoxRefKind\" />\n" -" <xsd:attribute name=\"external\" type=\"xsd:string\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docTableType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"row\" type=\"docRowType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"caption\" type=\"docCaptionType\" minOccurs=\"0\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"rows\" type=\"xsd:integer\" />\n" -" <xsd:attribute name=\"cols\" type=\"xsd:integer\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docRowType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"entry\" type=\"docEntryType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docEntryType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"thead\" type=\"DoxBool\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docCaptionType\" mixed=\"true\">\n" -" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docHeadingType\" mixed=\"true\">\n" -" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:attribute name=\"level\" type=\"xsd:integer\" /> <!-- todo: range 1-6 -->\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docImageType\" mixed=\"true\">\n" -" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:attribute name=\"type\" type=\"DoxImageKind\" /> \n" -" <xsd:attribute name=\"name\" type=\"xsd:string\" /> \n" -" <xsd:attribute name=\"width\" type=\"xsd:string\" /> \n" -" <xsd:attribute name=\"height\" type=\"xsd:string\" /> \n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docDotFileType\" mixed=\"true\">\n" -" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:attribute name=\"name\" type=\"xsd:string\" /> \n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docTocItemType\" mixed=\"true\">\n" -" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:attribute name=\"id\" type=\"xsd:string\" /> \n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docTocListType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"tocitem\" type=\"docTocItemType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docLanguageType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"langid\" type=\"xsd:string\" /> \n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docParamListType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"parameteritem\" type=\"docParamListItem\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"kind\" type=\"DoxParamListKind\" /> \n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docParamListItem\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"parameternamelist\" type=\"docParamNameList\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"parameterdescription\" type=\"descriptionType\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docParamNameList\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"parametertype\" type=\"docParamType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"parametername\" type=\"docParamName\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docParamType\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"ref\" type=\"refTextType\" minOccurs=\"0\" maxOccurs=\"1\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docParamName\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"ref\" type=\"refTextType\" minOccurs=\"0\" maxOccurs=\"1\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"direction\" type=\"DoxParamDir\" use=\"optional\" />\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docXRefSectType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"xreftitle\" type=\"xsd:string\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"xrefdescription\" type=\"descriptionType\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"id\" type=\"xsd:string\" /> \n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docCopyType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"sect1\" type=\"docSect1Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" <xsd:element name=\"internal\" type=\"docInternalType\" minOccurs=\"0\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"link\" type=\"xsd:string\" /> \n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docBlockQuoteType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docCharType\">\n" -" <xsd:attribute name=\"char\" type=\"DoxCharRange\"/> \n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docEmptyType\"/>\n" -"\n" -" <!-- Simple types -->\n" -"\n" -" <xsd:simpleType name=\"DoxBool\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"yes\" />\n" -" <xsd:enumeration value=\"no\" />\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxGraphRelation\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"include\" />\n" -" <xsd:enumeration value=\"usage\" />\n" -" <xsd:enumeration value=\"template-instance\" />\n" -" <xsd:enumeration value=\"public-inheritance\" />\n" -" <xsd:enumeration value=\"protected-inheritance\" />\n" -" <xsd:enumeration value=\"private-inheritance\" />\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxRefKind\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"compound\" />\n" -" <xsd:enumeration value=\"member\" />\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxMemberKind\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"define\" />\n" -" <xsd:enumeration value=\"property\" />\n" -" <xsd:enumeration value=\"event\" />\n" -" <xsd:enumeration value=\"variable\" />\n" -" <xsd:enumeration value=\"typedef\" />\n" -" <xsd:enumeration value=\"enum\" />\n" -" <xsd:enumeration value=\"function\" />\n" -" <xsd:enumeration value=\"signal\" />\n" -" <xsd:enumeration value=\"prototype\" />\n" -" <xsd:enumeration value=\"friend\" />\n" -" <xsd:enumeration value=\"dcop\" />\n" -" <xsd:enumeration value=\"slot\" />\n" -" <xsd:enumeration value=\"interface\" />\n" -" <xsd:enumeration value=\"service\" />\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxProtectionKind\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"public\" />\n" -" <xsd:enumeration value=\"protected\" />\n" -" <xsd:enumeration value=\"private\" />\n" -" <xsd:enumeration value=\"package\" />\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxVirtualKind\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"non-virtual\" />\n" -" <xsd:enumeration value=\"virtual\" />\n" -" <xsd:enumeration value=\"pure-virtual\" />\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxCompoundKind\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"class\" />\n" -" <xsd:enumeration value=\"struct\" />\n" -" <xsd:enumeration value=\"union\" />\n" -" <xsd:enumeration value=\"interface\" />\n" -" <xsd:enumeration value=\"protocol\" />\n" -" <xsd:enumeration value=\"category\" />\n" -" <xsd:enumeration value=\"exception\" />\n" -" <xsd:enumeration value=\"service\" />\n" -" <xsd:enumeration value=\"singleton\" />\n" -" <xsd:enumeration value=\"module\" />\n" -" <xsd:enumeration value=\"type\" />\n" -" <xsd:enumeration value=\"file\" />\n" -" <xsd:enumeration value=\"namespace\" />\n" -" <xsd:enumeration value=\"group\" />\n" -" <xsd:enumeration value=\"page\" />\n" -" <xsd:enumeration value=\"example\" />\n" -" <xsd:enumeration value=\"dir\" />\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxSectionKind\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"user-defined\" />\n" -" <xsd:enumeration value=\"public-type\" />\n" -" <xsd:enumeration value=\"public-func\" />\n" -" <xsd:enumeration value=\"public-attrib\" />\n" -" <xsd:enumeration value=\"public-slot\" />\n" -" <xsd:enumeration value=\"signal\" />\n" -" <xsd:enumeration value=\"dcop-func\" />\n" -" <xsd:enumeration value=\"property\" />\n" -" <xsd:enumeration value=\"event\" />\n" -" <xsd:enumeration value=\"public-static-func\" />\n" -" <xsd:enumeration value=\"public-static-attrib\" />\n" -" <xsd:enumeration value=\"protected-type\" />\n" -" <xsd:enumeration value=\"protected-func\" />\n" -" <xsd:enumeration value=\"protected-attrib\" />\n" -" <xsd:enumeration value=\"protected-slot\" />\n" -" <xsd:enumeration value=\"protected-static-func\" />\n" -" <xsd:enumeration value=\"protected-static-attrib\" />\n" -" <xsd:enumeration value=\"package-type\" />\n" -" <xsd:enumeration value=\"package-func\" />\n" -" <xsd:enumeration value=\"package-attrib\" />\n" -" <xsd:enumeration value=\"package-static-func\" />\n" -" <xsd:enumeration value=\"package-static-attrib\" />\n" -" <xsd:enumeration value=\"private-type\" />\n" -" <xsd:enumeration value=\"private-func\" />\n" -" <xsd:enumeration value=\"private-attrib\" />\n" -" <xsd:enumeration value=\"private-slot\" />\n" -" <xsd:enumeration value=\"private-static-func\" />\n" -" <xsd:enumeration value=\"private-static-attrib\" />\n" -" <xsd:enumeration value=\"friend\" />\n" -" <xsd:enumeration value=\"related\" />\n" -" <xsd:enumeration value=\"define\" />\n" -" <xsd:enumeration value=\"prototype\" />\n" -" <xsd:enumeration value=\"typedef\" />\n" -" <xsd:enumeration value=\"enum\" />\n" -" <xsd:enumeration value=\"func\" />\n" -" <xsd:enumeration value=\"var\" />\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxHighlightClass\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"comment\" />\n" -" <xsd:enumeration value=\"normal\" />\n" -" <xsd:enumeration value=\"preprocessor\" />\n" -" <xsd:enumeration value=\"keyword\" />\n" -" <xsd:enumeration value=\"keywordtype\" />\n" -" <xsd:enumeration value=\"keywordflow\" />\n" -" <xsd:enumeration value=\"stringliteral\" />\n" -" <xsd:enumeration value=\"charliteral\" />\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxSimpleSectKind\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"see\" />\n" -" <xsd:enumeration value=\"return\" />\n" -" <xsd:enumeration value=\"author\" />\n" -" <xsd:enumeration value=\"authors\" />\n" -" <xsd:enumeration value=\"version\" />\n" -" <xsd:enumeration value=\"since\" />\n" -" <xsd:enumeration value=\"date\" />\n" -" <xsd:enumeration value=\"note\" />\n" -" <xsd:enumeration value=\"warning\" />\n" -" <xsd:enumeration value=\"pre\" />\n" -" <xsd:enumeration value=\"post\" />\n" -" <xsd:enumeration value=\"copyright\" />\n" -" <xsd:enumeration value=\"invariant\" />\n" -" <xsd:enumeration value=\"remark\" />\n" -" <xsd:enumeration value=\"attention\" />\n" -" <xsd:enumeration value=\"par\" />\n" -" <xsd:enumeration value=\"rcs\" />\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxVersionNumber\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:pattern value=\"\\d+\\.\\d+.*\" />\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxImageKind\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"html\" />\n" -" <xsd:enumeration value=\"latex\" />\n" -" <xsd:enumeration value=\"rtf\" />\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxParamListKind\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"param\" />\n" -" <xsd:enumeration value=\"retval\" />\n" -" <xsd:enumeration value=\"exception\" />\n" -" <xsd:enumeration value=\"templateparam\" />\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxCharRange\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:pattern value=\"[aeiouncAEIOUNC]\" />\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxParamDir\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"in\"/>\n" -" <xsd:enumeration value=\"out\"/>\n" -" <xsd:enumeration value=\"inout\"/>\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"DoxAccessor\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"retain\"/>\n" -" <xsd:enumeration value=\"copy\"/>\n" -" <xsd:enumeration value=\"assign\"/>\n" -" <xsd:enumeration value=\"weak\"/>\n" -" <xsd:enumeration value=\"strong\"/>\n" -" <xsd:enumeration value=\"unretained\"/>\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -"</xsd:schema>\n" -"\n" diff --git a/src/config.h b/src/config.h index 7d72f52..3dcf8de 100644 --- a/src/config.h +++ b/src/config.h @@ -22,6 +22,7 @@ #include <qstrlist.h> #include <qdict.h> #include <qlist.h> +#include <qregexp.h> #include "ftextstream.h" @@ -518,7 +519,7 @@ class Config { QCString result=m_userComment; m_userComment.resize(0); - return result; + return result.replace(QRegExp("\r"),""); } protected: diff --git a/src/config.l b/src/config.l index f3b0962..05df386 100644 --- a/src/config.l +++ b/src/config.l @@ -33,6 +33,7 @@ #include "version.h" #include "portable.h" #include "util.h" +#include "message.h" #include "lang_cfg.h" #include "configoptions.h" @@ -856,7 +857,7 @@ void Config::writeTemplate(FTextStream &t,bool sl,bool upd) if (m_userComment) { t << "\n"; - t << m_userComment; + t << takeUserComment(); } } @@ -1311,7 +1312,30 @@ void Config::check() mscgenPath=""; } - + // check dia path + QCString &diaPath = Config_getString("DIA_PATH"); + if (!diaPath.isEmpty()) + { + QFileInfo dp(diaPath+"/dia"+portable_commandExtension()); + if (!dp.exists() || !dp.isFile()) + { + config_err("Warning: dia could not be found at %s\n",diaPath.data()); + diaPath=""; + } + else + { + diaPath=dp.dirPath(TRUE).utf8()+"/"; +#if defined(_WIN32) // convert slashes + uint i=0,l=diaPath.length(); + for (i=0;i<l;i++) if (diaPath.at(i)=='/') diaPath.at(i)='\\'; +#endif + } + } + else // make sure the string is empty but not null! + { + diaPath=""; + } + // check input QStrList &inputSources=Config_getList("INPUT"); if (inputSources.count()==0) @@ -1663,8 +1687,12 @@ bool Config::parseString(const char *fn,const char *str) bool Config::parse(const char *fn) { + int retval; encoding = "UTF-8"; - return parseString(fn,configFileToString(fn)); + printlex(yy_flex_debug, TRUE, __FILE__, fn); + retval = parseString(fn,configFileToString(fn)); + printlex(yy_flex_debug, FALSE, __FILE__, fn); + return retval; } extern "C" { // some bogus code to keep the compiler happy diff --git a/src/config.xml b/src/config.xml index d7ace9f..eff8cff 100644 --- a/src/config.xml +++ b/src/config.xml @@ -289,6 +289,7 @@ Go to the <a href="commands.html">next</a> section or return to the </docs> <value name='Afrikaans'/> <value name='Arabic'/> + <value name='Armenian'/> <value name='Brazilian'/> <value name='Catalan'/> <value name='Chinese'/> @@ -297,28 +298,31 @@ Go to the <a href="commands.html">next</a> section or return to the <value name='Czech'/> <value name='Danish'/> <value name='Dutch'/> - <value name='English'/> + <value name='English' desc='(United States)'/> <value name='Esperanto'/> - <value name='Farsi'/> + <value name='Farsi' desc='(Persian)'/> <value name='Finnish'/> <value name='French'/> <value name='German'/> <value name='Greek'/> <value name='Hungarian'/> + <value name='Indonesian'/> <value name='Italian'/> <value name='Japanese'/> - <value name='Japanese-en'/> + <value name='Japanese-en' desc='(Japanese with English messages)'/> <value name='Korean'/> - <value name='Korean-en'/> + <value name='Korean-en' desc='(Korean with English messages)'/> <value name='Latvian'/> - <value name='Norwegian'/> + <value name='Lithuanian'/> <value name='Macedonian'/> - <value name='Persian'/> + <value name='Norwegian'/> + <value name='Persian' desc='(Farsi)'/> <value name='Polish'/> <value name='Portuguese'/> <value name='Romanian'/> <value name='Russian'/> <value name='Serbian'/> + <value name='Serbian-Cyrillic'/> <value name='Slovak'/> <value name='Slovene'/> <value name='Spanish'/> @@ -878,6 +882,15 @@ Go to the <a href="commands.html">next</a> section or return to the ]]> </docs> </option> + <option type='bool' id='SHOW_GROUPED_MEMB_INC' defval='0'> + <docs> +<![CDATA[ + If the SHOW_GROUPED_MEMB_INC tag is set to \c YES then Doxygen + will add for each grouped member an include statement to the documentation, + telling the reader which file to include in order to use the member. +]]> + </docs> + </option> <option type='bool' id='FORCE_LOCAL_INCLUDES' defval='0'> <docs> <![CDATA[ @@ -911,7 +924,8 @@ Go to the <a href="commands.html">next</a> section or return to the If the \c SORT_BRIEF_DOCS tag is set to \c YES then doxygen will sort the brief descriptions of file, namespace and class members alphabetically by member name. If set to \c NO the members will appear in - declaration order. + declaration order. Note that this will also influence the order of the + classes in the class list. ]]> </docs> </option> @@ -3011,6 +3025,16 @@ where `loc1` and `loc2` can be relative or absolute paths or URLs. ]]> </docs> </option> + <option type='string' id='DIA_PATH' format='dir' defval=''> + <docs> +<![CDATA[ +You can include diagrams made with dia in doxygen documentation. Doxygen will then run +dia to produce the diagram and insert it in the documentation. The DIA_PATH tag allows +you to specify the directory where the dia binary resides. If left empty dia is assumed +to be found in the default search path. +]]> + </docs> + </option> <option type='bool' id='HIDE_UNDOC_RELATIONS' defval='1'> <docs> <![CDATA[ @@ -3245,6 +3269,15 @@ where `loc1` and `loc2` can be relative or absolute paths or URLs. ]]> </docs> </option> + <option type='list' id='DIAFILE_DIRS' format='dir'> + <docs> +<![CDATA[ + The \c DIAFILE_DIRS tag can be used to specify one or more directories that + contain dia files that are included in the documentation (see the + \ref cmdmscfile "\\diafile" command). +]]> + </docs> + </option> <option type='int' id='DOT_GRAPH_MAX_NODES' minval='0' maxval='10000' defval='50' depends='HAVE_DOT'> <docs> <![CDATA[ diff --git a/src/configoptions.cpp b/src/configoptions.cpp deleted file mode 100644 index 7f7d454..0000000 --- a/src/configoptions.cpp +++ /dev/null @@ -1,3076 +0,0 @@ -/* WARNING: This file is generated! - * Do not edit this file, but edit config.xml instead and run - * python configgen.py -cpp config.xml to regenerate this file! - */ - -#include "configoptions.h" -#include "config.h" -#include "portable.h" -#include "settings.h" - -void addConfigOptions(Config *cfg) -{ - ConfigString *cs; - ConfigEnum *ce; - ConfigList *cl; - ConfigInt *ci; - ConfigBool *cb; - - cfg->setHeader( - "This file describes the settings to be used by the documentation system\n" - "doxygen (www.doxygen.org) for a project.\n" - "\n" - "All text after a double hash (##) is considered a comment and is placed in\n" - "front of the TAG it is preceding.\n" - "\n" - "All text after a single hash (#) is considered a comment and will be ignored.\n" - "The format is:\n" - "TAG = value [value, ...]\n" - "For lists, items can also be appended using:\n" - "TAG += value [value, ...]\n" - "Values that contain spaces should be placed between quotes (\\\" \\\")." - ); - //--------------------------------------------------------------------------- - cfg->addInfo("Project","Project related configuration options"); - //--------------------------------------------------------------------------- - - //---- - cs = cfg->addString( - "DOXYFILE_ENCODING", - "This tag specifies the encoding used for all characters in the config file\n" - "that follow. The default is UTF-8 which is also the encoding used for all text\n" - "before the first occurrence of this tag. Doxygen uses libiconv (or the iconv\n" - "built into libc) for the transcoding. See http://www.gnu.org/software/libiconv\n" - "for the list of possible encodings.\n" - "The default value is: UTF-8." - ); - cs->setDefaultValue("UTF-8"); - //---- - cs = cfg->addString( - "PROJECT_NAME", - "The PROJECT_NAME tag is a single word (or a sequence of words surrounded by\n" - "double-quotes, unless you are using Doxywizard) that should identify the\n" - "project for which the documentation is generated. This name is used in the\n" - "title of most generated pages and in a few other places.\n" - "The default value is: My Project." - ); - cs->setDefaultValue("My Project"); - //---- - cs = cfg->addString( - "PROJECT_NUMBER", - "The PROJECT_NUMBER tag can be used to enter a project or revision number. This\n" - "could be handy for archiving the generated documentation or if some version\n" - "control system is used." - ); - //---- - cs = cfg->addString( - "PROJECT_BRIEF", - "Using the PROJECT_BRIEF tag one can provide an optional one line description\n" - "for a project that appears at the top of each page and should give viewer a\n" - "quick idea about the purpose of the project. Keep the description short." - ); - //---- - cs = cfg->addString( - "PROJECT_LOGO", - "With the PROJECT_LOGO tag one can specify an logo or icon that is included in\n" - "the documentation. The maximum height of the logo should not exceed 55 pixels\n" - "and the maximum width should not exceed 200 pixels. Doxygen will copy the logo\n" - "to the output directory." - ); - cs->setWidgetType(ConfigString::File); - //---- - cs = cfg->addString( - "OUTPUT_DIRECTORY", - "The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path\n" - "into which the generated documentation will be written. If a relative path is\n" - "entered, it will be relative to the location where doxygen was started. If\n" - "left blank the current directory will be used." - ); - cs->setWidgetType(ConfigString::Dir); - //---- - cb = cfg->addBool( - "CREATE_SUBDIRS", - "If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-\n" - "directories (in 2 levels) under the output directory of each output format and\n" - "will distribute the generated files over these directories. Enabling this\n" - "option can be useful when feeding doxygen a huge amount of source files, where\n" - "putting all generated files in the same directory would otherwise causes\n" - "performance problems for the file system.\n" - "The default value is: NO.", - FALSE - ); - //---- - ce = cfg->addEnum( - "OUTPUT_LANGUAGE", - "The OUTPUT_LANGUAGE tag is used to specify the language in which all\n" - "documentation generated by doxygen is written. Doxygen will use this\n" - "information to generate all constant output in the proper language.\n" - "Possible values are: Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-\n" - "Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, Farsi,\n" - "Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en,\n" - "Korean, Korean-en, Latvian, Norwegian, Macedonian, Persian, Polish,\n" - "Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish,\n" - "Turkish, Ukrainian and Vietnamese.\n" - "The default value is: English.", - "English" - ); - ce->addValue("Afrikaans"); - ce->addValue("Arabic"); - ce->addValue("Brazilian"); - ce->addValue("Catalan"); - ce->addValue("Chinese"); - ce->addValue("Chinese-Traditional"); - ce->addValue("Croatian"); - ce->addValue("Czech"); - ce->addValue("Danish"); - ce->addValue("Dutch"); - ce->addValue("English"); - ce->addValue("Esperanto"); - ce->addValue("Farsi"); - ce->addValue("Finnish"); - ce->addValue("French"); - ce->addValue("German"); - ce->addValue("Greek"); - ce->addValue("Hungarian"); - ce->addValue("Italian"); - ce->addValue("Japanese"); - ce->addValue("Japanese-en"); - ce->addValue("Korean"); - ce->addValue("Korean-en"); - ce->addValue("Latvian"); - ce->addValue("Norwegian"); - ce->addValue("Macedonian"); - ce->addValue("Persian"); - ce->addValue("Polish"); - ce->addValue("Portuguese"); - ce->addValue("Romanian"); - ce->addValue("Russian"); - ce->addValue("Serbian"); - ce->addValue("Slovak"); - ce->addValue("Slovene"); - ce->addValue("Spanish"); - ce->addValue("Swedish"); - ce->addValue("Turkish"); - ce->addValue("Ukrainian"); - ce->addValue("Vietnamese"); - //---- - cb = cfg->addBool( - "BRIEF_MEMBER_DESC", - "If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member\n" - "descriptions after the members that are listed in the file and class\n" - "documentation (similar to Javadoc). Set to NO to disable this.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "REPEAT_BRIEF", - "If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief\n" - "description of a member or function before the detailed description\n" - "\n" - "Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n" - "brief descriptions will be completely suppressed.\n" - "The default value is: YES.", - TRUE - ); - //---- - cl = cfg->addList( - "ABBREVIATE_BRIEF", - "This tag implements a quasi-intelligent brief description abbreviator that is\n" - "used to form the text in various listings. Each string in this list, if found\n" - "as the leading text of the brief description, will be stripped from the text\n" - "and the result, after processing the whole list, is used as the annotated\n" - "text. Otherwise, the brief description is used as-is. If left blank, the\n" - "following values are used ($name is automatically replaced with the name of\n" - "the entity):The $name class, The $name widget, The $name file, is, provides,\n" - "specifies, contains, represents, a, an and the." - ); - cl->addValue("The $name class"); - cl->addValue("The $name widget"); - cl->addValue("The $name file"); - cl->addValue("is"); - cl->addValue("provides"); - cl->addValue("specifies"); - cl->addValue("contains"); - cl->addValue("represents"); - cl->addValue("a"); - cl->addValue("an"); - cl->addValue("the"); - //---- - cb = cfg->addBool( - "ALWAYS_DETAILED_SEC", - "If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n" - "doxygen will generate a detailed section even if there is only a brief\n" - "description.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "INLINE_INHERITED_MEMB", - "If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n" - "inherited members of a class in the documentation of that class as if those\n" - "members were ordinary class members. Constructors, destructors and assignment\n" - "operators of the base classes will not be shown.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "FULL_PATH_NAMES", - "If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path\n" - "before files name in the file list and in the header files. If set to NO the\n" - "shortest path that makes the file name unique will be used\n" - "The default value is: YES.", - TRUE - ); - //---- - cl = cfg->addList( - "STRIP_FROM_PATH", - "The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.\n" - "Stripping is only done if one of the specified strings matches the left-hand\n" - "part of the path. The tag can be used to show relative paths in the file list.\n" - "If left blank the directory from which doxygen is run is used as the path to\n" - "strip.\n" - "\n" - "Note that you can specify absolute paths here, but also relative paths, which\n" - "will be relative from the directory where doxygen is started.\n" - "This tag requires that the tag FULL_PATH_NAMES is set to YES." - ); - cl->addValue(""); - cl->addDependency("FULL_PATH_NAMES"); - //---- - cl = cfg->addList( - "STRIP_FROM_INC_PATH", - "The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the\n" - "path mentioned in the documentation of a class, which tells the reader which\n" - "header file to include in order to use a class. If left blank only the name of\n" - "the header file containing the class definition is used. Otherwise one should\n" - "specify the list of include paths that are normally passed to the compiler\n" - "using the -I flag." - ); - //---- - cb = cfg->addBool( - "SHORT_NAMES", - "If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but\n" - "less readable) file names. This can be useful is your file systems doesn't\n" - "support long names like on DOS, Mac, or CD-ROM.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "JAVADOC_AUTOBRIEF", - "If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the\n" - "first line (until the first dot) of a Javadoc-style comment as the brief\n" - "description. If set to NO, the Javadoc-style will behave just like regular Qt-\n" - "style comments (thus requiring an explicit @brief command for a brief\n" - "description.)\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "QT_AUTOBRIEF", - "If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first\n" - "line (until the first dot) of a Qt-style comment as the brief description. If\n" - "set to NO, the Qt-style will behave just like regular Qt-style comments (thus\n" - "requiring an explicit \\brief command for a brief description.)\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "MULTILINE_CPP_IS_BRIEF", - "The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a\n" - "multi-line C++ special comment block (i.e. a block of //! or /// comments) as\n" - "a brief description. This used to be the default behavior. The new default is\n" - "to treat a multi-line C++ comment block as a detailed description. Set this\n" - "tag to YES if you prefer the old behavior instead.\n" - "\n" - "Note that setting this tag to YES also means that rational rose comments are\n" - "not recognized any more.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "INHERIT_DOCS", - "If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the\n" - "documentation from any documented member that it re-implements.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "SEPARATE_MEMBER_PAGES", - "If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a\n" - "new page for each member. If set to NO, the documentation of a member will be\n" - "part of the file/class/namespace that contains it.\n" - "The default value is: NO.", - FALSE - ); - //---- - ci = cfg->addInt( - "TAB_SIZE", - "The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen\n" - "uses this value to replace tabs by spaces in code fragments.\n" - "Minimum value: 1, maximum value: 16, default value: 4.", - 1,16,4 - ); - //---- - cl = cfg->addList( - "ALIASES", - "This tag can be used to specify a number of aliases that act as commands in\n" - "the documentation. An alias has the form:\n" - "name=value\n" - "For example adding\n" - "\"sideeffect=@par Side Effects:\\n\"\n" - "will allow you to put the command \\sideeffect (or @sideeffect) in the\n" - "documentation, which will result in a user-defined paragraph with heading\n" - "\"Side Effects:\". You can put \\n's in the value part of an alias to insert\n" - "newlines." - ); - //---- - cl = cfg->addList( - "TCL_SUBST", - "This tag can be used to specify a number of word-keyword mappings (TCL only).\n" - "A mapping has the form \"name=value\". For example adding \"class=itcl::class\"\n" - "will allow you to use the command class in the itcl::class meaning." - ); - //---- - cb = cfg->addBool( - "OPTIMIZE_OUTPUT_FOR_C", - "Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources\n" - "only. Doxygen will then generate output that is more tailored for C. For\n" - "instance, some of the names that are used will be different. The list of all\n" - "members will be omitted, etc.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "OPTIMIZE_OUTPUT_JAVA", - "Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or\n" - "Python sources only. Doxygen will then generate output that is more tailored\n" - "for that language. For instance, namespaces will be presented as packages,\n" - "qualified scopes will look different, etc.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "OPTIMIZE_FOR_FORTRAN", - "Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n" - "sources. Doxygen will then generate output that is tailored for Fortran.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "OPTIMIZE_OUTPUT_VHDL", - "Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n" - "sources. Doxygen will then generate output that is tailored for VHDL.\n" - "The default value is: NO.", - FALSE - ); - //---- - cl = cfg->addList( - "EXTENSION_MAPPING", - "Doxygen selects the parser to use depending on the extension of the files it\n" - "parses. With this tag you can assign which parser to use for a given\n" - "extension. Doxygen has a built-in mapping, but you can override or extend it\n" - "using this tag. The format is ext=language, where ext is a file extension, and\n" - "language is one of the parsers supported by doxygen: IDL, Java, Javascript,\n" - "C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make\n" - "doxygen treat .inc files as Fortran files (default is PHP), and .f files as C\n" - "(default is Fortran), use: inc=Fortran f=C.\n" - "\n" - "Note For files without extension you can use no_extension as a placeholder.\n" - "\n" - "Note that for custom extensions you also need to set FILE_PATTERNS otherwise\n" - "the files are not read by doxygen." - ); - //---- - cb = cfg->addBool( - "MARKDOWN_SUPPORT", - "If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments\n" - "according to the Markdown format, which allows for more readable\n" - "documentation. See http://daringfireball.net/projects/markdown/ for details.\n" - "The output of markdown processing is further processed by doxygen, so you can\n" - "mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in\n" - "case of backward compatibilities issues.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "AUTOLINK_SUPPORT", - "When enabled doxygen tries to link words that correspond to documented\n" - "classes, or namespaces to their corresponding documentation. Such a link can\n" - "be prevented in individual cases by by putting a % sign in front of the word\n" - "or globally by setting AUTOLINK_SUPPORT to NO.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "BUILTIN_STL_SUPPORT", - "If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n" - "to include (a tag file for) the STL sources as input, then you should set this\n" - "tag to YES in order to let doxygen match functions declarations and\n" - "definitions whose arguments contain STL classes (e.g. func(std::string);\n" - "versus func(std::string) {}). This also make the inheritance and collaboration\n" - "diagrams that involve STL classes more complete and accurate.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "CPP_CLI_SUPPORT", - "If you use Microsoft's C++/CLI language, you should set this option to YES to\n" - "enable parsing support.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "SIP_SUPPORT", - "Set the SIP_SUPPORT tag to YES if your project consists of sip (see:\n" - "http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen\n" - "will parse them like normal C++ but will assume all classes use public instead\n" - "of private inheritance when no explicit protection keyword is present.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "IDL_PROPERTY_SUPPORT", - "For Microsoft's IDL there are propget and propput attributes to indicate\n" - "getter and setter methods for a property. Setting this option to YES will make\n" - "doxygen to replace the get and set methods by a property in the documentation.\n" - "This will only work if the methods are indeed getting or setting a simple\n" - "type. If this is not the case, or you want to show the methods anyway, you\n" - "should set this option to NO.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "DISTRIBUTE_GROUP_DOC", - "If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n" - "tag is set to YES, then doxygen will reuse the documentation of the first\n" - "member in the group (if any) for the other members of the group. By default\n" - "all members of a group must be documented explicitly.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "SUBGROUPING", - "Set the SUBGROUPING tag to YES to allow class member groups of the same type\n" - "(for instance a group of public functions) to be put as a subgroup of that\n" - "type (e.g. under the Public Functions section). Set it to NO to prevent\n" - "subgrouping. Alternatively, this can be done per class using the\n" - "\\nosubgrouping command.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "INLINE_GROUPED_CLASSES", - "When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions\n" - "are shown inside the group in which they are included (e.g. using \\ingroup)\n" - "instead of on a separate page (for HTML and Man pages) or section (for LaTeX\n" - "and RTF).\n" - "\n" - "Note that this feature does not work in combination with\n" - "SEPARATE_MEMBER_PAGES.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "INLINE_SIMPLE_STRUCTS", - "When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions\n" - "with only public data fields or simple typedef fields will be shown inline in\n" - "the documentation of the scope in which they are defined (i.e. file,\n" - "namespace, or group documentation), provided this scope is documented. If set\n" - "to NO, structs, classes, and unions are shown on a separate page (for HTML and\n" - "Man pages) or section (for LaTeX and RTF).\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "TYPEDEF_HIDES_STRUCT", - "When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or\n" - "enum is documented as struct, union, or enum with the name of the typedef. So\n" - "typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n" - "with name TypeT. When disabled the typedef will appear as a member of a file,\n" - "namespace, or class. And the struct will be named TypeS. This can typically be\n" - "useful for C code in case the coding convention dictates that all compound\n" - "types are typedef'ed and only the typedef is referenced, never the tag name.\n" - "The default value is: NO.", - FALSE - ); - //---- - ci = cfg->addInt( - "LOOKUP_CACHE_SIZE", - "The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This\n" - "cache is used to resolve symbols given their name and scope. Since this can be\n" - "an expensive process and often the same symbol appears multiple times in the\n" - "code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small\n" - "doxygen will become slower. If the cache is too large, memory is wasted. The\n" - "cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range\n" - "is 0..9, the default is 0, corresponding to a cache size of 2^16=65536\n" - "symbols. At the end of a run doxygen will report the cache usage and suggest\n" - "the optimal cache size from a speed point of view.\n" - "Minimum value: 0, maximum value: 9, default value: 0.", - 0,9,0 - ); - //--------------------------------------------------------------------------- - cfg->addInfo("Build","Build related configuration options"); - //--------------------------------------------------------------------------- - - //---- - cb = cfg->addBool( - "EXTRACT_ALL", - "If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n" - "documentation are documented, even if no documentation was available. Private\n" - "class members and static file members will be hidden unless the\n" - "EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.\n" - "Note: This will also disable the warnings about undocumented members that are\n" - "normally produced when WARNINGS is set to YES.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "EXTRACT_PRIVATE", - "If the EXTRACT_PRIVATE tag is set to YES all private members of a class will\n" - "be included in the documentation.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "EXTRACT_PACKAGE", - "If the EXTRACT_PACKAGE tag is set to YES all members with package or internal\n" - "scope will be included in the documentation.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "EXTRACT_STATIC", - "If the EXTRACT_STATIC tag is set to YES all static members of a file will be\n" - "included in the documentation.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "EXTRACT_LOCAL_CLASSES", - "If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined\n" - "locally in source files will be included in the documentation. If set to NO\n" - "only classes defined in header files are included. Does not have any effect\n" - "for Java sources.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "EXTRACT_LOCAL_METHODS", - "This flag is only useful for Objective-C code. When set to YES local methods,\n" - "which are defined in the implementation section but not in the interface are\n" - "included in the documentation. If set to NO only methods in the interface are\n" - "included.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "EXTRACT_ANON_NSPACES", - "If this flag is set to YES, the members of anonymous namespaces will be\n" - "extracted and appear in the documentation as a namespace called\n" - "'anonymous_namespace{file}', where file will be replaced with the base name of\n" - "the file that contains the anonymous namespace. By default anonymous namespace\n" - "are hidden.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "HIDE_UNDOC_MEMBERS", - "If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all\n" - "undocumented members inside documented classes or files. If set to NO these\n" - "members will be included in the various overviews, but no documentation\n" - "section is generated. This option has no effect if EXTRACT_ALL is enabled.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "HIDE_UNDOC_CLASSES", - "If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all\n" - "undocumented classes that are normally visible in the class hierarchy. If set\n" - "to NO these classes will be included in the various overviews. This option has\n" - "no effect if EXTRACT_ALL is enabled.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "HIDE_FRIEND_COMPOUNDS", - "If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend\n" - "(class|struct|union) declarations. If set to NO these declarations will be\n" - "included in the documentation.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "HIDE_IN_BODY_DOCS", - "If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any\n" - "documentation blocks found inside the body of a function. If set to NO these\n" - "blocks will be appended to the function's detailed documentation block.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "INTERNAL_DOCS", - "The INTERNAL_DOCS tag determines if documentation that is typed after a\n" - "\\internal command is included. If the tag is set to NO then the documentation\n" - "will be excluded. Set it to YES to include the internal documentation.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "CASE_SENSE_NAMES", - "If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file\n" - "names in lower-case letters. If set to YES upper-case letters are also\n" - "allowed. This is useful if you have classes or files whose names only differ\n" - "in case and if your file system supports case sensitive file names. Windows\n" - "and Mac users are advised to set this option to NO.\n" - "The default value is: system dependent.", - portable_fileSystemIsCaseSensitive() - ); - //---- - cb = cfg->addBool( - "HIDE_SCOPE_NAMES", - "If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with\n" - "their full class and namespace scopes in the documentation. If set to YES the\n" - "scope will be hidden.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "SHOW_INCLUDE_FILES", - "If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of\n" - "the files that are included by a file in the documentation of that file.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "FORCE_LOCAL_INCLUDES", - "If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include\n" - "files with double quotes in the documentation rather than with sharp brackets.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "INLINE_INFO", - "If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the\n" - "documentation for inline members.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "SORT_MEMBER_DOCS", - "If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the\n" - "(detailed) documentation of file and class members alphabetically by member\n" - "name. If set to NO the members will appear in declaration order.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "SORT_BRIEF_DOCS", - "If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief\n" - "descriptions of file, namespace and class members alphabetically by member\n" - "name. If set to NO the members will appear in declaration order.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "SORT_MEMBERS_CTORS_1ST", - "If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the\n" - "(brief and detailed) documentation of class members so that constructors and\n" - "destructors are listed first. If set to NO the constructors will appear in the\n" - "respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.\n" - "Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief\n" - "member documentation.\n" - "Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting\n" - "detailed member documentation.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "SORT_GROUP_NAMES", - "If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy\n" - "of group names into alphabetical order. If set to NO the group names will\n" - "appear in their defined order.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "SORT_BY_SCOPE_NAME", - "If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by\n" - "fully-qualified names, including namespaces. If set to NO, the class list will\n" - "be sorted only by class name, not including the namespace part.\n" - "Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n" - "Note: This option applies only to the class list, not to the alphabetical\n" - "list.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "STRICT_PROTO_MATCHING", - "If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper\n" - "type resolution of all parameters of a function it will reject a match between\n" - "the prototype and the implementation of a member function even if there is\n" - "only one candidate or it is obvious which candidate to choose by doing a\n" - "simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still\n" - "accept a match between prototype and implementation in such cases.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "GENERATE_TODOLIST", - "The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the\n" - "todo list. This list is created by putting \\todo commands in the\n" - "documentation.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "GENERATE_TESTLIST", - "The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the\n" - "test list. This list is created by putting \\test commands in the\n" - "documentation.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "GENERATE_BUGLIST", - "The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug\n" - "list. This list is created by putting \\bug commands in the documentation.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "GENERATE_DEPRECATEDLIST", - "The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)\n" - "the deprecated list. This list is created by putting \\deprecated commands in\n" - "the documentation.\n" - "The default value is: YES.", - TRUE - ); - //---- - cl = cfg->addList( - "ENABLED_SECTIONS", - "The ENABLED_SECTIONS tag can be used to enable conditional documentation\n" - "sections, marked by \\if <section_label> ... \\endif and \\cond <section_label>\n" - "... \\endcond blocks." - ); - //---- - ci = cfg->addInt( - "MAX_INITIALIZER_LINES", - "The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the\n" - "initial value of a variable or macro / define can have for it to appear in the\n" - "documentation. If the initializer consists of more lines than specified here\n" - "it will be hidden. Use a value of 0 to hide initializers completely. The\n" - "appearance of the value of individual variables and macros / defines can be\n" - "controlled using \\showinitializer or \\hideinitializer command in the\n" - "documentation regardless of this setting.\n" - "Minimum value: 0, maximum value: 10000, default value: 30.", - 0,10000,30 - ); - //---- - cb = cfg->addBool( - "SHOW_USED_FILES", - "Set the SHOW_USED_FILES tag to NO to disable the list of files generated at\n" - "the bottom of the documentation of classes and structs. If set to YES the list\n" - "will mention the files that were used to generate the documentation.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "SHOW_FILES", - "Set the SHOW_FILES tag to NO to disable the generation of the Files page. This\n" - "will remove the Files entry from the Quick Index and from the Folder Tree View\n" - "(if specified).\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "SHOW_NAMESPACES", - "Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces\n" - "page. This will remove the Namespaces entry from the Quick Index and from the\n" - "Folder Tree View (if specified).\n" - "The default value is: YES.", - TRUE - ); - //---- - cs = cfg->addString( - "FILE_VERSION_FILTER", - "The FILE_VERSION_FILTER tag can be used to specify a program or script that\n" - "doxygen should invoke to get the current version for each file (typically from\n" - "the version control system). Doxygen will invoke the program by executing (via\n" - "popen()) the command command input-file, where command is the value of the\n" - "FILE_VERSION_FILTER tag, and input-file is the name of an input file provided\n" - "by doxygen. Whatever the program writes to standard output is used as the file\n" - "version. For an example see the documentation." - ); - cs->setWidgetType(ConfigString::File); - //---- - cs = cfg->addString( - "LAYOUT_FILE", - "The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n" - "by doxygen. The layout file controls the global structure of the generated\n" - "output files in an output format independent way. To create the layout file\n" - "that represents doxygen's defaults, run doxygen with the -l option. You can\n" - "optionally specify a file name after the option, if omitted DoxygenLayout.xml\n" - "will be used as the name of the layout file.\n" - "\n" - "Note that if you run doxygen from a directory containing a file called\n" - "DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE\n" - "tag is left empty." - ); - cs->setWidgetType(ConfigString::File); - //---- - cl = cfg->addList( - "CITE_BIB_FILES", - "The CITE_BIB_FILES tag can be used to specify one or more bib files containing\n" - "the reference definitions. This must be a list of .bib files. The .bib\n" - "extension is automatically appended if omitted. This requires the bibtex tool\n" - "to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.\n" - "For LaTeX the style of the bibliography can be controlled using\n" - "LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the\n" - "search path. Do not use file names with spaces, bibtex cannot handle them. See\n" - "also \\cite for info how to create references." - ); - cl->setWidgetType(ConfigList::File); - //--------------------------------------------------------------------------- - cfg->addInfo("Messages","Configuration options related to warning and progress messages"); - //--------------------------------------------------------------------------- - - //---- - cb = cfg->addBool( - "QUIET", - "The QUIET tag can be used to turn on/off the messages that are generated to\n" - "standard output by doxygen. If QUIET is set to YES this implies that the\n" - "messages are off.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "WARNINGS", - "The WARNINGS tag can be used to turn on/off the warning messages that are\n" - "generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES\n" - "this implies that the warnings are on.\n" - "\n" - "Tip: Turn warnings on while writing the documentation.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "WARN_IF_UNDOCUMENTED", - "If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate\n" - "warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag\n" - "will automatically be disabled.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "WARN_IF_DOC_ERROR", - "If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for\n" - "potential errors in the documentation, such as not documenting some parameters\n" - "in a documented function, or documenting parameters that don't exist or using\n" - "markup commands wrongly.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "WARN_NO_PARAMDOC", - "This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that\n" - "are documented, but have no documentation for their parameters or return\n" - "value. If set to NO doxygen will only warn about wrong or incomplete parameter\n" - "documentation, but not about the absence of documentation.\n" - "The default value is: NO.", - FALSE - ); - //---- - cs = cfg->addString( - "WARN_FORMAT", - "The WARN_FORMAT tag determines the format of the warning messages that doxygen\n" - "can produce. The string should contain the $file, $line, and $text tags, which\n" - "will be replaced by the file and line number from which the warning originated\n" - "and the warning text. Optionally the format may contain $version, which will\n" - "be replaced by the version of the file (if it could be obtained via\n" - "FILE_VERSION_FILTER)\n" - "The default value is: $file:$line: $text." - ); - cs->setDefaultValue("$file:$line: $text"); - //---- - cs = cfg->addString( - "WARN_LOGFILE", - "The WARN_LOGFILE tag can be used to specify a file to which warning and error\n" - "messages should be written. If left blank the output is written to standard\n" - "error (stderr)." - ); - cs->setWidgetType(ConfigString::File); - //--------------------------------------------------------------------------- - cfg->addInfo("Input","Configuration options related to the input files"); - //--------------------------------------------------------------------------- - - //---- - cl = cfg->addList( - "INPUT", - "The INPUT tag is used to specify the files and/or directories that contain\n" - "documented source files. You may enter file names like myfile.cpp or\n" - "directories like /usr/src/myproject. Separate the files or directories with\n" - "spaces.\n" - "Note: If this tag is empty the current directory is searched." - ); - cl->addValue(""); - cl->setWidgetType(ConfigList::FileAndDir); - //---- - cs = cfg->addString( - "INPUT_ENCODING", - "This tag can be used to specify the character encoding of the source files\n" - "that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses\n" - "libiconv (or the iconv built into libc) for the transcoding. See the libiconv\n" - "documentation (see: http://www.gnu.org/software/libiconv) for the list of\n" - "possible encodings.\n" - "The default value is: UTF-8." - ); - cs->setDefaultValue("UTF-8"); - //---- - cl = cfg->addList( - "FILE_PATTERNS", - "If the value of the INPUT tag contains directories, you can use the\n" - "FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and\n" - "*.h) to filter out the source-files in the directories. If left blank the\n" - "following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,\n" - "*.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,\n" - "*.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,\n" - "*.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,\n" - "*.qsf, *.as and *.js." - ); - cl->addValue("*.c"); - cl->addValue("*.cc"); - cl->addValue("*.cxx"); - cl->addValue("*.cpp"); - cl->addValue("*.c++"); - cl->addValue("*.java"); - cl->addValue("*.ii"); - cl->addValue("*.ixx"); - cl->addValue("*.ipp"); - cl->addValue("*.i++"); - cl->addValue("*.inl"); - cl->addValue("*.idl"); - cl->addValue("*.ddl"); - cl->addValue("*.odl"); - cl->addValue("*.h"); - cl->addValue("*.hh"); - cl->addValue("*.hxx"); - cl->addValue("*.hpp"); - cl->addValue("*.h++"); - cl->addValue("*.cs"); - cl->addValue("*.d"); - cl->addValue("*.php"); - cl->addValue("*.php4"); - cl->addValue("*.php5"); - cl->addValue("*.phtml"); - cl->addValue("*.inc"); - cl->addValue("*.m"); - cl->addValue("*.markdown"); - cl->addValue("*.md"); - cl->addValue("*.mm"); - cl->addValue("*.dox"); - cl->addValue("*.py"); - cl->addValue("*.f90"); - cl->addValue("*.f"); - cl->addValue("*.for"); - cl->addValue("*.tcl"); - cl->addValue("*.vhd"); - cl->addValue("*.vhdl"); - cl->addValue("*.ucf"); - cl->addValue("*.qsf"); - cl->addValue("*.as"); - cl->addValue("*.js"); - //---- - cb = cfg->addBool( - "RECURSIVE", - "The RECURSIVE tag can be used to specify whether or not subdirectories should\n" - "be searched for input files as well.\n" - "The default value is: NO.", - FALSE - ); - //---- - cl = cfg->addList( - "EXCLUDE", - "The EXCLUDE tag can be used to specify files and/or directories that should be\n" - "excluded from the INPUT source files. This way you can easily exclude a\n" - "subdirectory from a directory tree whose root is specified with the INPUT tag.\n" - "\n" - "Note that relative paths are relative to the directory from which doxygen is\n" - "run." - ); - cl->setWidgetType(ConfigList::FileAndDir); - //---- - cb = cfg->addBool( - "EXCLUDE_SYMLINKS", - "The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\n" - "directories that are symbolic links (a Unix file system feature) are excluded\n" - "from the input.\n" - "The default value is: NO.", - FALSE - ); - //---- - cl = cfg->addList( - "EXCLUDE_PATTERNS", - "If the value of the INPUT tag contains directories, you can use the\n" - "EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n" - "certain files from those directories.\n" - "\n" - "Note that the wildcards are matched against the file with absolute path, so to\n" - "exclude all test directories for example use the pattern */test/*" - ); - //---- - cl = cfg->addList( - "EXCLUDE_SYMBOLS", - "The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n" - "(namespaces, classes, functions, etc.) that should be excluded from the\n" - "output. The symbol name can be a fully qualified name, a word, or if the\n" - "wildcard * is used, a substring. Examples: ANamespace, AClass,\n" - "AClass::ANamespace, ANamespace::*Test\n" - "\n" - "Note that the wildcards are matched against the file with absolute path, so to\n" - "exclude all test directories use the pattern */test/*" - ); - //---- - cl = cfg->addList( - "EXAMPLE_PATH", - "The EXAMPLE_PATH tag can be used to specify one or more files or directories\n" - "that contain example code fragments that are included (see the \\include\n" - "command)." - ); - cl->setWidgetType(ConfigList::FileAndDir); - //---- - cl = cfg->addList( - "EXAMPLE_PATTERNS", - "If the value of the EXAMPLE_PATH tag contains directories, you can use the\n" - "EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and\n" - "*.h) to filter out the source-files in the directories. If left blank all\n" - "files are included." - ); - cl->addValue("*"); - //---- - cb = cfg->addBool( - "EXAMPLE_RECURSIVE", - "If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n" - "searched for input files to be used with the \\include or \\dontinclude commands\n" - "irrespective of the value of the RECURSIVE tag.\n" - "The default value is: NO.", - FALSE - ); - //---- - cl = cfg->addList( - "IMAGE_PATH", - "The IMAGE_PATH tag can be used to specify one or more files or directories\n" - "that contain images that are to be included in the documentation (see the\n" - "\\image command)." - ); - cl->setWidgetType(ConfigList::FileAndDir); - //---- - cs = cfg->addString( - "INPUT_FILTER", - "The INPUT_FILTER tag can be used to specify a program that doxygen should\n" - "invoke to filter for each input file. Doxygen will invoke the filter program\n" - "by executing (via popen()) the command:\n" - "\n" - "<filter> <input-file>\n" - "\n" - "where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the\n" - "name of an input file. Doxygen will then use the output that the filter\n" - "program writes to standard output. If FILTER_PATTERNS is specified, this tag\n" - "will be ignored.\n" - "\n" - "Note that the filter must not add or remove lines; it is applied before the\n" - "code is scanned, but not when the output code is generated. If lines are added\n" - "or removed, the anchors will not be placed correctly." - ); - cs->setWidgetType(ConfigString::File); - //---- - cl = cfg->addList( - "FILTER_PATTERNS", - "The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n" - "basis. Doxygen will compare the file name with each pattern and apply the\n" - "filter if there is a match. The filters are a list of the form: pattern=filter\n" - "(like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how\n" - "filters are used. If the FILTER_PATTERNS tag is empty or if none of the\n" - "patterns match the file name, INPUT_FILTER is applied." - ); - //---- - cb = cfg->addBool( - "FILTER_SOURCE_FILES", - "If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n" - "INPUT_FILTER ) will also be used to filter the input files that are used for\n" - "producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).\n" - "The default value is: NO.", - FALSE - ); - //---- - cl = cfg->addList( - "FILTER_SOURCE_PATTERNS", - "The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n" - "pattern. A pattern will override the setting for FILTER_PATTERN (if any) and\n" - "it is also possible to disable source filtering for a specific pattern using\n" - "*.ext= (so without naming a filter).\n" - "This tag requires that the tag FILTER_SOURCE_FILES is set to YES." - ); - cl->addDependency("FILTER_SOURCE_FILES"); - //---- - cs = cfg->addString( - "USE_MDFILE_AS_MAINPAGE", - "If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that\n" - "is part of the input, its contents will be placed on the main page\n" - "(index.html). This can be useful if you have a project on for instance GitHub\n" - "and want to reuse the introduction page also for the doxygen output." - ); - //--------------------------------------------------------------------------- - cfg->addInfo("Source_Browser","Configuration options related to source browsing"); - //--------------------------------------------------------------------------- - - //---- - cb = cfg->addBool( - "SOURCE_BROWSER", - "If the SOURCE_BROWSER tag is set to YES then a list of source files will be\n" - "generated. Documented entities will be cross-referenced with these sources.\n" - "\n" - "Note: To get rid of all source code in the generated output, make sure that\n" - "also VERBATIM_HEADERS is set to NO.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "INLINE_SOURCES", - "Setting the INLINE_SOURCES tag to YES will include the body of functions,\n" - "classes and enums directly into the documentation.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "STRIP_CODE_COMMENTS", - "Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any\n" - "special comment blocks from generated source code fragments. Normal C, C++ and\n" - "Fortran comments will always remain visible.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "REFERENCED_BY_RELATION", - "If the REFERENCED_BY_RELATION tag is set to YES then for each documented\n" - "function all documented functions referencing it will be listed.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "REFERENCES_RELATION", - "If the REFERENCES_RELATION tag is set to YES then for each documented function\n" - "all documented entities called/used by that function will be listed.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "REFERENCES_LINK_SOURCE", - "If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set\n" - "to YES, then the hyperlinks from functions in REFERENCES_RELATION and\n" - "REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will\n" - "link to the documentation.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "SOURCE_TOOLTIPS", - "If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the\n" - "source code will show a tooltip with additional information such as prototype,\n" - "brief description and links to the definition and documentation. Since this\n" - "will make the HTML file larger and loading of large files a bit slower, you\n" - "can opt to disable this feature.\n" - "The default value is: YES.\n" - "This tag requires that the tag SOURCE_BROWSER is set to YES.", - TRUE - ); - cb->addDependency("SOURCE_BROWSER"); - //---- - cb = cfg->addBool( - "USE_HTAGS", - "If the USE_HTAGS tag is set to YES then the references to source code will\n" - "point to the HTML generated by the htags(1) tool instead of doxygen built-in\n" - "source browser. The htags tool is part of GNU's global source tagging system\n" - "(see http://www.gnu.org/software/global/global.html). You will need version\n" - "4.8.6 or higher.\n" - "\n" - "To use it do the following:\n" - "- Install the latest version of global\n" - "- Enable SOURCE_BROWSER and USE_HTAGS in the config file\n" - "- Make sure the INPUT points to the root of the source tree\n" - "- Run doxygen as normal\n" - "\n" - "Doxygen will invoke htags (and that will in turn invoke gtags), so these\n" - "tools must be available from the command line (i.e. in the search path).\n" - "\n" - "The result: instead of the source browser generated by doxygen, the links to\n" - "source code will now point to the output of htags.\n" - "The default value is: NO.\n" - "This tag requires that the tag SOURCE_BROWSER is set to YES.", - FALSE - ); - cb->addDependency("SOURCE_BROWSER"); - //---- - cb = cfg->addBool( - "VERBATIM_HEADERS", - "If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a\n" - "verbatim copy of the header file for each class for which an include is\n" - "specified. Set to NO to disable this.\n" - "See also: Section \\class.\n" - "The default value is: YES.", - TRUE - ); -#if USE_LIBCLANG - //---- - cb = cfg->addBool( - "CLANG_ASSISTED_PARSING", - "If the CLANG_ASSISTED_PARSING tag is set to YES, then doxygen will use the\n" - "clang parser (see: http://clang.llvm.org/) for more acurate parsing at the\n" - "cost of reduced performance. This can be particularly helpful with template\n" - "rich C++ code for which doxygen's built-in parser lacks the necessary type\n" - "information.\n" - "Note: The availability of this option depends on whether or not doxygen was\n" - "compiled with the --with-libclang option.\n" - "The default value is: NO.", - FALSE - ); -#else - cfg->addDisabled("CLANG_ASSISTED_PARSING"); -#endif -#if USE_LIBCLANG - //---- - cl = cfg->addList( - "CLANG_OPTIONS", - "If clang assisted parsing is enabled you can provide the compiler with command\n" - "line options that you would normally use when invoking the compiler. Note that\n" - "the include paths will already be set by doxygen for the files and directories\n" - "specified with INPUT and INCLUDE_PATH.\n" - "This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES." - ); - cl->addDependency("CLANG_ASSISTED_PARSING"); -#else - cfg->addDisabled("CLANG_OPTIONS"); -#endif - //--------------------------------------------------------------------------- - cfg->addInfo("Index","Configuration options related to the alphabetical class index"); - //--------------------------------------------------------------------------- - - //---- - cb = cfg->addBool( - "ALPHABETICAL_INDEX", - "If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all\n" - "compounds will be generated. Enable this if the project contains a lot of\n" - "classes, structs, unions or interfaces.\n" - "The default value is: YES.", - TRUE - ); - //---- - ci = cfg->addInt( - "COLS_IN_ALPHA_INDEX", - "The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in\n" - "which the alphabetical index list will be split.\n" - "Minimum value: 1, maximum value: 20, default value: 5.\n" - "This tag requires that the tag ALPHABETICAL_INDEX is set to YES.", - 1,20,5 - ); - ci->addDependency("ALPHABETICAL_INDEX"); - //---- - cl = cfg->addList( - "IGNORE_PREFIX", - "In case all classes in a project start with a common prefix, all classes will\n" - "be put under the same header in the alphabetical index. The IGNORE_PREFIX tag\n" - "can be used to specify a prefix (or a list of prefixes) that should be ignored\n" - "while generating the index headers.\n" - "This tag requires that the tag ALPHABETICAL_INDEX is set to YES." - ); - cl->addDependency("ALPHABETICAL_INDEX"); - //--------------------------------------------------------------------------- - cfg->addInfo("HTML","Configuration options related to the HTML output"); - //--------------------------------------------------------------------------- - - //---- - cb = cfg->addBool( - "GENERATE_HTML", - "If the GENERATE_HTML tag is set to YES doxygen will generate HTML output\n" - "The default value is: YES.", - TRUE - ); - //---- - cs = cfg->addString( - "HTML_OUTPUT", - "The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a\n" - "relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n" - "it.\n" - "The default directory is: html.\n" - "This tag requires that the tag GENERATE_HTML is set to YES." - ); - cs->setDefaultValue("html"); - cs->setWidgetType(ConfigString::Dir); - cs->addDependency("GENERATE_HTML"); - //---- - cs = cfg->addString( - "HTML_FILE_EXTENSION", - "The HTML_FILE_EXTENSION tag can be used to specify the file extension for each\n" - "generated HTML page (for example: .htm, .php, .asp).\n" - "The default value is: .html.\n" - "This tag requires that the tag GENERATE_HTML is set to YES." - ); - cs->setDefaultValue(".html"); - cs->addDependency("GENERATE_HTML"); - //---- - cs = cfg->addString( - "HTML_HEADER", - "The HTML_HEADER tag can be used to specify a user-defined HTML header file for\n" - "each generated HTML page. If the tag is left blank doxygen will generate a\n" - "standard header.\n" - "\n" - "To get valid HTML the header file that includes any scripts and style sheets\n" - "that doxygen needs, which is dependent on the configuration options used (e.g.\n" - "the setting GENERATE_TREEVIEW). It is highly recommended to start with a\n" - "default header using\n" - "doxygen -w html new_header.html new_footer.html new_stylesheet.css\n" - "YourConfigFile\n" - "and then modify the file new_header.html. See also section \"Doxygen usage\"\n" - "for information on how to generate the default header that doxygen normally\n" - "uses.\n" - "Note: The header is subject to change so you typically have to regenerate the\n" - "default header when upgrading to a newer version of doxygen. For a description\n" - "of the possible markers and block names see the documentation.\n" - "This tag requires that the tag GENERATE_HTML is set to YES." - ); - cs->setWidgetType(ConfigString::File); - cs->addDependency("GENERATE_HTML"); - //---- - cs = cfg->addString( - "HTML_FOOTER", - "The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each\n" - "generated HTML page. If the tag is left blank doxygen will generate a standard\n" - "footer. See HTML_HEADER for more information on how to generate a default\n" - "footer and what special commands can be used inside the footer. See also\n" - "section \"Doxygen usage\" for information on how to generate the default footer\n" - "that doxygen normally uses.\n" - "This tag requires that the tag GENERATE_HTML is set to YES." - ); - cs->setWidgetType(ConfigString::File); - cs->addDependency("GENERATE_HTML"); - //---- - cs = cfg->addString( - "HTML_STYLESHEET", - "The HTML_STYLESHEET tag can be used to specify a user-defined cascading style\n" - "sheet that is used by each HTML page. It can be used to fine-tune the look of\n" - "the HTML output. If left blank doxygen will generate a default style sheet.\n" - "See also section \"Doxygen usage\" for information on how to generate the style\n" - "sheet that doxygen normally uses.\n" - "Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as\n" - "it is more robust and this tag (HTML_STYLESHEET) will in the future become\n" - "obsolete.\n" - "This tag requires that the tag GENERATE_HTML is set to YES." - ); - cs->setWidgetType(ConfigString::File); - cs->addDependency("GENERATE_HTML"); - //---- - cs = cfg->addString( - "HTML_EXTRA_STYLESHEET", - "The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-\n" - "defined cascading style sheet that is included after the standard style sheets\n" - "created by doxygen. Using this option one can overrule certain style aspects.\n" - "This is preferred over using HTML_STYLESHEET since it does not replace the\n" - "standard style sheet and is therefor more robust against future updates.\n" - "Doxygen will copy the style sheet file to the output directory. For an example\n" - "see the documentation.\n" - "This tag requires that the tag GENERATE_HTML is set to YES." - ); - cs->setWidgetType(ConfigString::File); - cs->addDependency("GENERATE_HTML"); - //---- - cl = cfg->addList( - "HTML_EXTRA_FILES", - "The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n" - "other source files which should be copied to the HTML output directory. Note\n" - "that these files will be copied to the base HTML output directory. Use the\n" - "$relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n" - "files. In the HTML_STYLESHEET file, use the file name only. Also note that the\n" - "files will be copied as-is; there are no commands or markers available.\n" - "This tag requires that the tag GENERATE_HTML is set to YES." - ); - cl->addDependency("GENERATE_HTML"); - cl->setWidgetType(ConfigList::File); - //---- - ci = cfg->addInt( - "HTML_COLORSTYLE_HUE", - "The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen\n" - "will adjust the colors in the stylesheet and background images according to\n" - "this color. Hue is specified as an angle on a colorwheel, see\n" - "http://en.wikipedia.org/wiki/Hue for more information. For instance the value\n" - "0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300\n" - "purple, and 360 is red again.\n" - "Minimum value: 0, maximum value: 359, default value: 220.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - 0,359,220 - ); - ci->addDependency("GENERATE_HTML"); - //---- - ci = cfg->addInt( - "HTML_COLORSTYLE_SAT", - "The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors\n" - "in the HTML output. For a value of 0 the output will use grayscales only. A\n" - "value of 255 will produce the most vivid colors.\n" - "Minimum value: 0, maximum value: 255, default value: 100.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - 0,255,100 - ); - ci->addDependency("GENERATE_HTML"); - //---- - ci = cfg->addInt( - "HTML_COLORSTYLE_GAMMA", - "The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the\n" - "luminance component of the colors in the HTML output. Values below 100\n" - "gradually make the output lighter, whereas values above 100 make the output\n" - "darker. The value divided by 100 is the actual gamma applied, so 80 represents\n" - "a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not\n" - "change the gamma.\n" - "Minimum value: 40, maximum value: 240, default value: 80.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - 40,240,80 - ); - ci->addDependency("GENERATE_HTML"); - //---- - cb = cfg->addBool( - "HTML_TIMESTAMP", - "If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n" - "page will contain the date and time when the page was generated. Setting this\n" - "to NO can help when comparing the output of multiple runs.\n" - "The default value is: YES.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - TRUE - ); - cb->addDependency("GENERATE_HTML"); - //---- - cb = cfg->addBool( - "HTML_DYNAMIC_SECTIONS", - "If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n" - "documentation will contain sections that can be hidden and shown after the\n" - "page has loaded.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_HTML"); - //---- - ci = cfg->addInt( - "HTML_INDEX_NUM_ENTRIES", - "With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries\n" - "shown in the various tree structured indices initially; the user can expand\n" - "and collapse entries dynamically later on. Doxygen will expand the tree to\n" - "such a level that at most the specified number of entries are visible (unless\n" - "a fully collapsed tree already exceeds this amount). So setting the number of\n" - "entries 1 will produce a full collapsed tree by default. 0 is a special value\n" - "representing an infinite number of entries and will result in a full expanded\n" - "tree by default.\n" - "Minimum value: 0, maximum value: 9999, default value: 100.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - 0,9999,100 - ); - ci->addDependency("GENERATE_HTML"); - //---- - cb = cfg->addBool( - "GENERATE_DOCSET", - "If the GENERATE_DOCSET tag is set to YES, additional index files will be\n" - "generated that can be used as input for Apple's Xcode 3 integrated development\n" - "environment (see: http://developer.apple.com/tools/xcode/), introduced with\n" - "OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a\n" - "Makefile in the HTML output directory. Running make will produce the docset in\n" - "that directory and running make install will install the docset in\n" - "~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at\n" - "startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n" - "for more information.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_HTML"); - //---- - cs = cfg->addString( - "DOCSET_FEEDNAME", - "This tag determines the name of the docset feed. A documentation feed provides\n" - "an umbrella under which multiple documentation sets from a single provider\n" - "(such as a company or product suite) can be grouped.\n" - "The default value is: Doxygen generated docs.\n" - "This tag requires that the tag GENERATE_DOCSET is set to YES." - ); - cs->setDefaultValue("Doxygen generated docs"); - cs->addDependency("GENERATE_DOCSET"); - //---- - cs = cfg->addString( - "DOCSET_BUNDLE_ID", - "This tag specifies a string that should uniquely identify the documentation\n" - "set bundle. This should be a reverse domain-name style string, e.g.\n" - "com.mycompany.MyDocSet. Doxygen will append .docset to the name.\n" - "The default value is: org.doxygen.Project.\n" - "This tag requires that the tag GENERATE_DOCSET is set to YES." - ); - cs->setDefaultValue("org.doxygen.Project"); - cs->addDependency("GENERATE_DOCSET"); - //---- - cs = cfg->addString( - "DOCSET_PUBLISHER_ID", - "The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify\n" - "the documentation publisher. This should be a reverse domain-name style\n" - "string, e.g. com.mycompany.MyDocSet.documentation.\n" - "The default value is: org.doxygen.Publisher.\n" - "This tag requires that the tag GENERATE_DOCSET is set to YES." - ); - cs->setDefaultValue("org.doxygen.Publisher"); - cs->addDependency("GENERATE_DOCSET"); - //---- - cs = cfg->addString( - "DOCSET_PUBLISHER_NAME", - "The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.\n" - "The default value is: Publisher.\n" - "This tag requires that the tag GENERATE_DOCSET is set to YES." - ); - cs->setDefaultValue("Publisher"); - cs->addDependency("GENERATE_DOCSET"); - //---- - cb = cfg->addBool( - "GENERATE_HTMLHELP", - "If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three\n" - "additional HTML index files: index.hhp, index.hhc, and index.hhk. The\n" - "index.hhp is a project file that can be read by Microsoft's HTML Help Workshop\n" - "(see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on\n" - "Windows.\n" - "\n" - "The HTML Help Workshop contains a compiler that can convert all HTML output\n" - "generated by doxygen into a single compiled HTML file (.chm). Compiled HTML\n" - "files are now used as the Windows 98 help format, and will replace the old\n" - "Windows help format (.hlp) on all Windows platforms in the future. Compressed\n" - "HTML files also contain an index, a table of contents, and you can search for\n" - "words in the documentation. The HTML workshop also contains a viewer for\n" - "compressed HTML files.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_HTML"); - //---- - cs = cfg->addString( - "CHM_FILE", - "The CHM_FILE tag can be used to specify the file name of the resulting .chm\n" - "file. You can add a path in front of the file if the result should not be\n" - "written to the html output directory.\n" - "This tag requires that the tag GENERATE_HTMLHELP is set to YES." - ); - cs->setWidgetType(ConfigString::File); - cs->addDependency("GENERATE_HTMLHELP"); - //---- - cs = cfg->addString( - "HHC_LOCATION", - "The HHC_LOCATION tag can be used to specify the location (absolute path\n" - "including file name) of the HTML help compiler ( hhc.exe). If non-empty\n" - "doxygen will try to run the HTML help compiler on the generated index.hhp.\n" - "The file has to be specified with full path.\n" - "This tag requires that the tag GENERATE_HTMLHELP is set to YES." - ); - cs->setWidgetType(ConfigString::File); - cs->addDependency("GENERATE_HTMLHELP"); - //---- - cb = cfg->addBool( - "GENERATE_CHI", - "The GENERATE_CHI flag controls if a separate .chi index file is generated (\n" - "YES) or that it should be included in the master .chm file ( NO).\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_HTMLHELP is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_HTMLHELP"); - //---- - cs = cfg->addString( - "CHM_INDEX_ENCODING", - "The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)\n" - "and project file content.\n" - "This tag requires that the tag GENERATE_HTMLHELP is set to YES." - ); - cs->addDependency("GENERATE_HTMLHELP"); - //---- - cb = cfg->addBool( - "BINARY_TOC", - "The BINARY_TOC flag controls whether a binary table of contents is generated (\n" - "YES) or a normal table of contents ( NO) in the .chm file.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_HTMLHELP is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_HTMLHELP"); - //---- - cb = cfg->addBool( - "TOC_EXPAND", - "The TOC_EXPAND flag can be set to YES to add extra items for group members to\n" - "the table of contents of the HTML help documentation and to the tree view.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_HTMLHELP is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_HTMLHELP"); - //---- - cb = cfg->addBool( - "GENERATE_QHP", - "If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n" - "QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that\n" - "can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help\n" - "(.qch) of the generated HTML documentation.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_HTML"); - //---- - cs = cfg->addString( - "QCH_FILE", - "If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify\n" - "the file name of the resulting .qch file. The path specified is relative to\n" - "the HTML output folder.\n" - "This tag requires that the tag GENERATE_QHP is set to YES." - ); - cs->setWidgetType(ConfigString::File); - cs->addDependency("GENERATE_QHP"); - //---- - cs = cfg->addString( - "QHP_NAMESPACE", - "The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help\n" - "Project output. For more information please see Qt Help Project / Namespace\n" - "(see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).\n" - "The default value is: org.doxygen.Project.\n" - "This tag requires that the tag GENERATE_QHP is set to YES." - ); - cs->setDefaultValue("org.doxygen.Project"); - cs->addDependency("GENERATE_QHP"); - //---- - cs = cfg->addString( - "QHP_VIRTUAL_FOLDER", - "The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt\n" - "Help Project output. For more information please see Qt Help Project / Virtual\n" - "Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-\n" - "folders).\n" - "The default value is: doc.\n" - "This tag requires that the tag GENERATE_QHP is set to YES." - ); - cs->setDefaultValue("doc"); - cs->addDependency("GENERATE_QHP"); - //---- - cs = cfg->addString( - "QHP_CUST_FILTER_NAME", - "If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom\n" - "filter to add. For more information please see Qt Help Project / Custom\n" - "Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-\n" - "filters).\n" - "This tag requires that the tag GENERATE_QHP is set to YES." - ); - cs->addDependency("GENERATE_QHP"); - //---- - cs = cfg->addString( - "QHP_CUST_FILTER_ATTRS", - "The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the\n" - "custom filter to add. For more information please see Qt Help Project / Custom\n" - "Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-\n" - "filters).\n" - "This tag requires that the tag GENERATE_QHP is set to YES." - ); - cs->addDependency("GENERATE_QHP"); - //---- - cs = cfg->addString( - "QHP_SECT_FILTER_ATTRS", - "The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n" - "project's filter section matches. Qt Help Project / Filter Attributes (see:\n" - "http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).\n" - "This tag requires that the tag GENERATE_QHP is set to YES." - ); - cs->addDependency("GENERATE_QHP"); - //---- - cs = cfg->addString( - "QHG_LOCATION", - "The QHG_LOCATION tag can be used to specify the location of Qt's\n" - "qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the\n" - "generated .qhp file.\n" - "This tag requires that the tag GENERATE_QHP is set to YES." - ); - cs->setWidgetType(ConfigString::File); - cs->addDependency("GENERATE_QHP"); - //---- - cb = cfg->addBool( - "GENERATE_ECLIPSEHELP", - "If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be\n" - "generated, together with the HTML files, they form an Eclipse help plugin. To\n" - "install this plugin and make it available under the help contents menu in\n" - "Eclipse, the contents of the directory containing the HTML and XML files needs\n" - "to be copied into the plugins directory of eclipse. The name of the directory\n" - "within the plugins directory should be the same as the ECLIPSE_DOC_ID value.\n" - "After copying Eclipse needs to be restarted before the help appears.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_HTML"); - //---- - cs = cfg->addString( - "ECLIPSE_DOC_ID", - "A unique identifier for the Eclipse help plugin. When installing the plugin\n" - "the directory name containing the HTML and XML files should also have this\n" - "name. Each documentation set should have its own identifier.\n" - "The default value is: org.doxygen.Project.\n" - "This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES." - ); - cs->setDefaultValue("org.doxygen.Project"); - cs->addDependency("GENERATE_ECLIPSEHELP"); - //---- - cb = cfg->addBool( - "DISABLE_INDEX", - "If you want full control over the layout of the generated HTML pages it might\n" - "be necessary to disable the index and replace it with your own. The\n" - "DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top\n" - "of each HTML page. A value of NO enables the index and the value YES disables\n" - "it. Since the tabs in the index contain the same information as the navigation\n" - "tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_HTML"); - //---- - cb = cfg->addBool( - "GENERATE_TREEVIEW", - "The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n" - "structure should be generated to display hierarchical information. If the tag\n" - "value is set to YES, a side panel will be generated containing a tree-like\n" - "index structure (just like the one that is generated for HTML Help). For this\n" - "to work a browser that supports JavaScript, DHTML, CSS and frames is required\n" - "(i.e. any modern browser). Windows users are probably better off using the\n" - "HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can\n" - "further fine-tune the look of the index. As an example, the default style\n" - "sheet generated by doxygen has an example that shows how to put an image at\n" - "the root of the tree instead of the PROJECT_NAME. Since the tree basically has\n" - "the same information as the tab index, you could consider setting\n" - "DISABLE_INDEX to YES when enabling this option.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_HTML"); - //---- - ci = cfg->addInt( - "ENUM_VALUES_PER_LINE", - "The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that\n" - "doxygen will group on one line in the generated HTML documentation.\n" - "\n" - "Note that a value of 0 will completely suppress the enum values from appearing\n" - "in the overview section.\n" - "Minimum value: 0, maximum value: 20, default value: 4.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - 0,20,4 - ); - ci->addDependency("GENERATE_HTML"); - //---- - ci = cfg->addInt( - "TREEVIEW_WIDTH", - "If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used\n" - "to set the initial width (in pixels) of the frame in which the tree is shown.\n" - "Minimum value: 0, maximum value: 1500, default value: 250.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - 0,1500,250 - ); - ci->addDependency("GENERATE_HTML"); - //---- - cb = cfg->addBool( - "EXT_LINKS_IN_WINDOW", - "When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to\n" - "external symbols imported via tag files in a separate window.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_HTML"); - //---- - ci = cfg->addInt( - "FORMULA_FONTSIZE", - "Use this tag to change the font size of LaTeX formulas included as images in\n" - "the HTML documentation. When you change the font size after a successful\n" - "doxygen run you need to manually remove any form_*.png images from the HTML\n" - "output directory to force them to be regenerated.\n" - "Minimum value: 8, maximum value: 50, default value: 10.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - 8,50,10 - ); - ci->addDependency("GENERATE_HTML"); - //---- - cb = cfg->addBool( - "FORMULA_TRANSPARENT", - "Use the FORMULA_TRANPARENT tag to determine whether or not the images\n" - "generated for formulas are transparent PNGs. Transparent PNGs are not\n" - "supported properly for IE 6.0, but are supported on all modern browsers.\n" - "\n" - "Note that when changing this option you need to delete any form_*.png files in\n" - "the HTML output directory before the changes have effect.\n" - "The default value is: YES.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - TRUE - ); - cb->addDependency("GENERATE_HTML"); - //---- - cb = cfg->addBool( - "USE_MATHJAX", - "Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see\n" - "http://www.mathjax.org) which uses client side Javascript for the rendering\n" - "instead of using prerendered bitmaps. Use this if you do not have LaTeX\n" - "installed or if you want to formulas look prettier in the HTML output. When\n" - "enabled you may also need to install MathJax separately and configure the path\n" - "to it using the MATHJAX_RELPATH option.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_HTML"); - //---- - ce = cfg->addEnum( - "MATHJAX_FORMAT", - "When MathJax is enabled you can set the default output format to be used for\n" - "the MathJax output. See the MathJax site (see:\n" - "http://docs.mathjax.org/en/latest/output.html) for more details.\n" - "Possible values are: HTML-CSS (which is slower, but has the best\n" - "compatibility), NativeMML (i.e. MathML) and SVG.\n" - "The default value is: HTML-CSS.\n" - "This tag requires that the tag USE_MATHJAX is set to YES.", - "HTML-CSS" - ); - ce->addValue("HTML-CSS"); - ce->addValue("NativeMML"); - ce->addValue("SVG"); - ce->addDependency("USE_MATHJAX"); - //---- - cs = cfg->addString( - "MATHJAX_RELPATH", - "When MathJax is enabled you need to specify the location relative to the HTML\n" - "output directory using the MATHJAX_RELPATH option. The destination directory\n" - "should contain the MathJax.js script. For instance, if the mathjax directory\n" - "is located at the same level as the HTML output directory, then\n" - "MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax\n" - "Content Delivery Network so you can quickly see the result without installing\n" - "MathJax. However, it is strongly recommended to install a local copy of\n" - "MathJax from http://www.mathjax.org before deployment.\n" - "The default value is: http://cdn.mathjax.org/mathjax/latest.\n" - "This tag requires that the tag USE_MATHJAX is set to YES." - ); - cs->setDefaultValue("http://cdn.mathjax.org/mathjax/latest"); - cs->addDependency("USE_MATHJAX"); - //---- - cl = cfg->addList( - "MATHJAX_EXTENSIONS", - "The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax\n" - "extension names that should be enabled during MathJax rendering. For example\n" - "MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols\n" - "This tag requires that the tag USE_MATHJAX is set to YES." - ); - cl->addDependency("USE_MATHJAX"); - //---- - cs = cfg->addString( - "MATHJAX_CODEFILE", - "The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces\n" - "of code that will be used on startup of the MathJax code. See the MathJax site\n" - "(see: http://docs.mathjax.org/en/latest/output.html) for more details. For an\n" - "example see the documentation.\n" - "This tag requires that the tag USE_MATHJAX is set to YES." - ); - cs->addDependency("USE_MATHJAX"); - //---- - cb = cfg->addBool( - "SEARCHENGINE", - "When the SEARCHENGINE tag is enabled doxygen will generate a search box for\n" - "the HTML output. The underlying search engine uses javascript and DHTML and\n" - "should work on any modern browser. Note that when using HTML help\n" - "(GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)\n" - "there is already a search function so this one should typically be disabled.\n" - "For large projects the javascript based search engine can be slow, then\n" - "enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to\n" - "search using the keyboard; to jump to the search box use <access key> + S\n" - "(what the <access key> is depends on the OS and browser, but it is typically\n" - "<CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down\n" - "key> to jump into the search results window, the results can be navigated\n" - "using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel\n" - "the search. The filter options can be selected when the cursor is inside the\n" - "search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>\n" - "to select a filter and <Enter> or <escape> to activate or cancel the filter\n" - "option.\n" - "The default value is: YES.\n" - "This tag requires that the tag GENERATE_HTML is set to YES.", - TRUE - ); - cb->addDependency("GENERATE_HTML"); - //---- - cb = cfg->addBool( - "SERVER_BASED_SEARCH", - "When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n" - "implemented using a web server instead of a web client using Javascript. There\n" - "are two flavours of web server based searching depending on the\n" - "EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for\n" - "searching and an index file used by the script. When EXTERNAL_SEARCH is\n" - "enabled the indexing and searching needs to be provided by external tools. See\n" - "the section \"External Indexing and Searching\" for details.\n" - "The default value is: NO.\n" - "This tag requires that the tag SEARCHENGINE is set to YES.", - FALSE - ); - cb->addDependency("SEARCHENGINE"); - //---- - cb = cfg->addBool( - "EXTERNAL_SEARCH", - "When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP\n" - "script for searching. Instead the search results are written to an XML file\n" - "which needs to be processed by an external indexer. Doxygen will invoke an\n" - "external search engine pointed to by the SEARCHENGINE_URL option to obtain the\n" - "search results.\n" - "\n" - "Doxygen ships with an example indexer ( doxyindexer) and search engine\n" - "(doxysearch.cgi) which are based on the open source search engine library\n" - "Xapian (see: http://xapian.org/).\n" - "\n" - "See the section \"External Indexing and Searching\" for details.\n" - "The default value is: NO.\n" - "This tag requires that the tag SEARCHENGINE is set to YES.", - FALSE - ); - cb->addDependency("SEARCHENGINE"); - //---- - cs = cfg->addString( - "SEARCHENGINE_URL", - "The SEARCHENGINE_URL should point to a search engine hosted by a web server\n" - "which will return the search results when EXTERNAL_SEARCH is enabled.\n" - "\n" - "Doxygen ships with an example indexer ( doxyindexer) and search engine\n" - "(doxysearch.cgi) which are based on the open source search engine library\n" - "Xapian (see: http://xapian.org/). See the section \"External Indexing and\n" - "Searching\" for details.\n" - "This tag requires that the tag SEARCHENGINE is set to YES." - ); - cs->addDependency("SEARCHENGINE"); - //---- - cs = cfg->addString( - "SEARCHDATA_FILE", - "When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed\n" - "search data is written to a file for indexing by an external tool. With the\n" - "SEARCHDATA_FILE tag the name of this file can be specified.\n" - "The default file is: searchdata.xml.\n" - "This tag requires that the tag SEARCHENGINE is set to YES." - ); - cs->setDefaultValue("searchdata.xml"); - cs->setWidgetType(ConfigString::File); - cs->addDependency("SEARCHENGINE"); - //---- - cs = cfg->addString( - "EXTERNAL_SEARCH_ID", - "When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the\n" - "EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is\n" - "useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple\n" - "projects and redirect the results back to the right project.\n" - "This tag requires that the tag SEARCHENGINE is set to YES." - ); - cs->addDependency("SEARCHENGINE"); - //---- - cl = cfg->addList( - "EXTRA_SEARCH_MAPPINGS", - "The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen\n" - "projects other than the one defined by this configuration file, but that are\n" - "all added to the same external search index. Each project needs to have a\n" - "unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of\n" - "to a relative location where the documentation can be found. The format is:\n" - "EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...\n" - "This tag requires that the tag SEARCHENGINE is set to YES." - ); - cl->addDependency("SEARCHENGINE"); - //--------------------------------------------------------------------------- - cfg->addInfo("LaTeX","Configuration options related to the LaTeX output"); - //--------------------------------------------------------------------------- - - //---- - cb = cfg->addBool( - "GENERATE_LATEX", - "If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.\n" - "The default value is: YES.", - TRUE - ); - //---- - cs = cfg->addString( - "LATEX_OUTPUT", - "The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a\n" - "relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n" - "it.\n" - "The default directory is: latex.\n" - "This tag requires that the tag GENERATE_LATEX is set to YES." - ); - cs->setDefaultValue("latex"); - cs->setWidgetType(ConfigString::Dir); - cs->addDependency("GENERATE_LATEX"); - //---- - cs = cfg->addString( - "LATEX_CMD_NAME", - "The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n" - "invoked.\n" - "\n" - "Note that when enabling USE_PDFLATEX this option is only used for generating\n" - "bitmaps for formulas in the HTML output, but not in the Makefile that is\n" - "written to the output directory.\n" - "The default file is: latex.\n" - "This tag requires that the tag GENERATE_LATEX is set to YES." - ); - cs->setDefaultValue("latex"); - cs->setWidgetType(ConfigString::File); - cs->addDependency("GENERATE_LATEX"); - //---- - cs = cfg->addString( - "MAKEINDEX_CMD_NAME", - "The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate\n" - "index for LaTeX.\n" - "The default file is: makeindex.\n" - "This tag requires that the tag GENERATE_LATEX is set to YES." - ); - cs->setDefaultValue("makeindex"); - cs->setWidgetType(ConfigString::File); - cs->addDependency("GENERATE_LATEX"); - //---- - cb = cfg->addBool( - "COMPACT_LATEX", - "If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX\n" - "documents. This may be useful for small projects and may help to save some\n" - "trees in general.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_LATEX is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_LATEX"); - //---- - ce = cfg->addEnum( - "PAPER_TYPE", - "The PAPER_TYPE tag can be used to set the paper type that is used by the\n" - "printer.\n" - "Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x\n" - "14 inches) and executive (7.25 x 10.5 inches).\n" - "The default value is: a4.\n" - "This tag requires that the tag GENERATE_LATEX is set to YES.", - "a4" - ); - ce->addValue("a4"); - ce->addValue("letter"); - ce->addValue("legal"); - ce->addValue("executive"); - ce->addDependency("GENERATE_LATEX"); - //---- - cl = cfg->addList( - "EXTRA_PACKAGES", - "The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names\n" - "that should be included in the LaTeX output. To get the times font for\n" - "instance you can specify\n" - "EXTRA_PACKAGES=times\n" - "If left blank no extra packages will be included.\n" - "This tag requires that the tag GENERATE_LATEX is set to YES." - ); - cl->addDependency("GENERATE_LATEX"); - //---- - cs = cfg->addString( - "LATEX_HEADER", - "The LATEX_HEADER tag can be used to specify a personal LaTeX header for the\n" - "generated LaTeX document. The header should contain everything until the first\n" - "chapter. If it is left blank doxygen will generate a standard header. See\n" - "section \"Doxygen usage\" for information on how to let doxygen write the\n" - "default header to a separate file.\n" - "\n" - "Note: Only use a user-defined header if you know what you are doing! The\n" - "following commands have a special meaning inside the header: $title,\n" - "$datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will\n" - "replace them by respectively the title of the page, the current date and time,\n" - "only the current date, the version number of doxygen, the project name (see\n" - "PROJECT_NAME), or the project number (see PROJECT_NUMBER).\n" - "This tag requires that the tag GENERATE_LATEX is set to YES." - ); - cs->setWidgetType(ConfigString::File); - cs->addDependency("GENERATE_LATEX"); - //---- - cs = cfg->addString( - "LATEX_FOOTER", - "The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the\n" - "generated LaTeX document. The footer should contain everything after the last\n" - "chapter. If it is left blank doxygen will generate a standard footer.\n" - "\n" - "Note: Only use a user-defined footer if you know what you are doing!\n" - "This tag requires that the tag GENERATE_LATEX is set to YES." - ); - cs->setWidgetType(ConfigString::File); - cs->addDependency("GENERATE_LATEX"); - //---- - cl = cfg->addList( - "LATEX_EXTRA_FILES", - "The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or\n" - "other source files which should be copied to the LATEX_OUTPUT output\n" - "directory. Note that the files will be copied as-is; there are no commands or\n" - "markers available.\n" - "This tag requires that the tag GENERATE_LATEX is set to YES." - ); - cl->addDependency("GENERATE_LATEX"); - cl->setWidgetType(ConfigList::File); - //---- - cb = cfg->addBool( - "PDF_HYPERLINKS", - "If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is\n" - "prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will\n" - "contain links (just like the HTML output) instead of page references. This\n" - "makes the output suitable for online browsing using a PDF viewer.\n" - "The default value is: YES.\n" - "This tag requires that the tag GENERATE_LATEX is set to YES.", - TRUE - ); - cb->addDependency("GENERATE_LATEX"); - //---- - cb = cfg->addBool( - "USE_PDFLATEX", - "If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate\n" - "the PDF file directly from the LaTeX files. Set this option to YES to get a\n" - "higher quality PDF documentation.\n" - "The default value is: YES.\n" - "This tag requires that the tag GENERATE_LATEX is set to YES.", - TRUE - ); - cb->addDependency("GENERATE_LATEX"); - //---- - cb = cfg->addBool( - "LATEX_BATCHMODE", - "If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode\n" - "command to the generated LaTeX files. This will instruct LaTeX to keep running\n" - "if errors occur, instead of asking the user for help. This option is also used\n" - "when generating formulas in HTML.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_LATEX is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_LATEX"); - //---- - cb = cfg->addBool( - "LATEX_HIDE_INDICES", - "If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the\n" - "index chapters (such as File Index, Compound Index, etc.) in the output.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_LATEX is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_LATEX"); - //---- - cb = cfg->addBool( - "LATEX_SOURCE_CODE", - "If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source\n" - "code with syntax highlighting in the LaTeX output.\n" - "\n" - "Note that which sources are shown also depends on other settings such as\n" - "SOURCE_BROWSER.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_LATEX is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_LATEX"); - //---- - cs = cfg->addString( - "LATEX_BIB_STYLE", - "The LATEX_BIB_STYLE tag can be used to specify the style to use for the\n" - "bibliography, e.g. plainnat, or ieeetr. See\n" - "http://en.wikipedia.org/wiki/BibTeX and \\cite for more info.\n" - "The default value is: plain.\n" - "This tag requires that the tag GENERATE_LATEX is set to YES." - ); - cs->setDefaultValue("plain"); - cs->addDependency("GENERATE_LATEX"); - //--------------------------------------------------------------------------- - cfg->addInfo("RTF","Configuration options related to the RTF output"); - //--------------------------------------------------------------------------- - - //---- - cb = cfg->addBool( - "GENERATE_RTF", - "If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The\n" - "RTF output is optimized for Word 97 and may not look too pretty with other RTF\n" - "readers/editors.\n" - "The default value is: NO.", - FALSE - ); - //---- - cs = cfg->addString( - "RTF_OUTPUT", - "The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a\n" - "relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n" - "it.\n" - "The default directory is: rtf.\n" - "This tag requires that the tag GENERATE_RTF is set to YES." - ); - cs->setDefaultValue("rtf"); - cs->setWidgetType(ConfigString::Dir); - cs->addDependency("GENERATE_RTF"); - //---- - cb = cfg->addBool( - "COMPACT_RTF", - "If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF\n" - "documents. This may be useful for small projects and may help to save some\n" - "trees in general.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_RTF is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_RTF"); - //---- - cb = cfg->addBool( - "RTF_HYPERLINKS", - "If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will\n" - "contain hyperlink fields. The RTF file will contain links (just like the HTML\n" - "output) instead of page references. This makes the output suitable for online\n" - "browsing using Word or some other Word compatible readers that support those\n" - "fields.\n" - "\n" - "Note: WordPad (write) and others do not support links.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_RTF is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_RTF"); - //---- - cs = cfg->addString( - "RTF_STYLESHEET_FILE", - "Load stylesheet definitions from file. Syntax is similar to doxygen's config\n" - "file, i.e. a series of assignments. You only have to provide replacements,\n" - "missing definitions are set to their default value.\n" - "\n" - "See also section \"Doxygen usage\" for information on how to generate the\n" - "default style sheet that doxygen normally uses.\n" - "This tag requires that the tag GENERATE_RTF is set to YES." - ); - cs->setWidgetType(ConfigString::File); - cs->addDependency("GENERATE_RTF"); - //---- - cs = cfg->addString( - "RTF_EXTENSIONS_FILE", - "Set optional variables used in the generation of an RTF document. Syntax is\n" - "similar to doxygen's config file. A template extensions file can be generated\n" - "using doxygen -e rtf extensionFile.\n" - "This tag requires that the tag GENERATE_RTF is set to YES." - ); - cs->setWidgetType(ConfigString::File); - cs->addDependency("GENERATE_RTF"); - //--------------------------------------------------------------------------- - cfg->addInfo("Man","Configuration options related to the man page output"); - //--------------------------------------------------------------------------- - - //---- - cb = cfg->addBool( - "GENERATE_MAN", - "If the GENERATE_MAN tag is set to YES doxygen will generate man pages for\n" - "classes and files.\n" - "The default value is: NO.", - FALSE - ); - //---- - cs = cfg->addString( - "MAN_OUTPUT", - "The MAN_OUTPUT tag is used to specify where the man pages will be put. If a\n" - "relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n" - "it. A directory man3 will be created inside the directory specified by\n" - "MAN_OUTPUT.\n" - "The default directory is: man.\n" - "This tag requires that the tag GENERATE_MAN is set to YES." - ); - cs->setDefaultValue("man"); - cs->setWidgetType(ConfigString::Dir); - cs->addDependency("GENERATE_MAN"); - //---- - cs = cfg->addString( - "MAN_EXTENSION", - "The MAN_EXTENSION tag determines the extension that is added to the generated\n" - "man pages. In case the manual section does not start with a number, the number\n" - "3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is\n" - "optional.\n" - "The default value is: .3.\n" - "This tag requires that the tag GENERATE_MAN is set to YES." - ); - cs->setDefaultValue(".3"); - cs->addDependency("GENERATE_MAN"); - //---- - cb = cfg->addBool( - "MAN_LINKS", - "If the MAN_LINKS tag is set to YES and doxygen generates man output, then it\n" - "will generate one additional man file for each entity documented in the real\n" - "man page(s). These additional files only source the real man page, but without\n" - "them the man command would be unable to find the correct page.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_MAN is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_MAN"); - //--------------------------------------------------------------------------- - cfg->addInfo("XML","Configuration options related to the XML output"); - //--------------------------------------------------------------------------- - - //---- - cb = cfg->addBool( - "GENERATE_XML", - "If the GENERATE_XML tag is set to YES doxygen will generate an XML file that\n" - "captures the structure of the code including all documentation.\n" - "The default value is: NO.", - FALSE - ); - //---- - cs = cfg->addString( - "XML_OUTPUT", - "The XML_OUTPUT tag is used to specify where the XML pages will be put. If a\n" - "relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n" - "it.\n" - "The default directory is: xml.\n" - "This tag requires that the tag GENERATE_XML is set to YES." - ); - cs->setDefaultValue("xml"); - cs->setWidgetType(ConfigString::Dir); - cs->addDependency("GENERATE_XML"); - //---- - cs = cfg->addString( - "XML_SCHEMA", - "The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a\n" - "validating XML parser to check the syntax of the XML files.\n" - "This tag requires that the tag GENERATE_XML is set to YES." - ); - cs->addDependency("GENERATE_XML"); - //---- - cs = cfg->addString( - "XML_DTD", - "The XML_DTD tag can be used to specify a XML DTD, which can be used by a\n" - "validating XML parser to check the syntax of the XML files.\n" - "This tag requires that the tag GENERATE_XML is set to YES." - ); - cs->addDependency("GENERATE_XML"); - //---- - cb = cfg->addBool( - "XML_PROGRAMLISTING", - "If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program\n" - "listings (including syntax highlighting and cross-referencing information) to\n" - "the XML output. Note that enabling this will significantly increase the size\n" - "of the XML output.\n" - "The default value is: YES.\n" - "This tag requires that the tag GENERATE_XML is set to YES.", - TRUE - ); - cb->addDependency("GENERATE_XML"); - //--------------------------------------------------------------------------- - cfg->addInfo("Docbook","Configuration options related to the DOCBOOK output"); - //--------------------------------------------------------------------------- - - //---- - cb = cfg->addBool( - "GENERATE_DOCBOOK", - "If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files\n" - "that can be used to generate PDF.\n" - "The default value is: NO.", - FALSE - ); - //---- - cs = cfg->addString( - "DOCBOOK_OUTPUT", - "The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.\n" - "If a relative path is entered the value of OUTPUT_DIRECTORY will be put in\n" - "front of it.\n" - "The default directory is: docbook.\n" - "This tag requires that the tag GENERATE_DOCBOOK is set to YES." - ); - cs->setDefaultValue("docbook"); - cs->setWidgetType(ConfigString::Dir); - cs->addDependency("GENERATE_DOCBOOK"); - //--------------------------------------------------------------------------- - cfg->addInfo("AutoGen","Configuration options for the AutoGen Definitions output"); - //--------------------------------------------------------------------------- - - //---- - cb = cfg->addBool( - "GENERATE_AUTOGEN_DEF", - "If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen\n" - "Definitions (see http://autogen.sf.net) file that captures the structure of\n" - "the code including all documentation. Note that this feature is still\n" - "experimental and incomplete at the moment.\n" - "The default value is: NO.", - FALSE - ); - //--------------------------------------------------------------------------- - cfg->addInfo("PerlMod","Configuration options related to the Perl module output"); - //--------------------------------------------------------------------------- - - //---- - cb = cfg->addBool( - "GENERATE_PERLMOD", - "If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module\n" - "file that captures the structure of the code including all documentation.\n" - "\n" - "Note that this feature is still experimental and incomplete at the moment.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "PERLMOD_LATEX", - "If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary\n" - "Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI\n" - "output from the Perl module output.\n" - "The default value is: NO.\n" - "This tag requires that the tag GENERATE_PERLMOD is set to YES.", - FALSE - ); - cb->addDependency("GENERATE_PERLMOD"); - //---- - cb = cfg->addBool( - "PERLMOD_PRETTY", - "If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely\n" - "formatted so it can be parsed by a human reader. This is useful if you want to\n" - "understand what is going on. On the other hand, if this tag is set to NO the\n" - "size of the Perl module output will be much smaller and Perl will parse it\n" - "just the same.\n" - "The default value is: YES.\n" - "This tag requires that the tag GENERATE_PERLMOD is set to YES.", - TRUE - ); - cb->addDependency("GENERATE_PERLMOD"); - //---- - cs = cfg->addString( - "PERLMOD_MAKEVAR_PREFIX", - "The names of the make variables in the generated doxyrules.make file are\n" - "prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful\n" - "so different doxyrules.make files included by the same Makefile don't\n" - "overwrite each other's variables.\n" - "This tag requires that the tag GENERATE_PERLMOD is set to YES." - ); - cs->addDependency("GENERATE_PERLMOD"); - //--------------------------------------------------------------------------- - cfg->addInfo("Preprocessor","Configuration options related to the preprocessor"); - //--------------------------------------------------------------------------- - - //---- - cb = cfg->addBool( - "ENABLE_PREPROCESSING", - "If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all\n" - "C-preprocessor directives found in the sources and include files.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "MACRO_EXPANSION", - "If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names\n" - "in the source code. If set to NO only conditional compilation will be\n" - "performed. Macro expansion can be done in a controlled way by setting\n" - "EXPAND_ONLY_PREDEF to YES.\n" - "The default value is: NO.\n" - "This tag requires that the tag ENABLE_PREPROCESSING is set to YES.", - FALSE - ); - cb->addDependency("ENABLE_PREPROCESSING"); - //---- - cb = cfg->addBool( - "EXPAND_ONLY_PREDEF", - "If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then\n" - "the macro expansion is limited to the macros specified with the PREDEFINED and\n" - "EXPAND_AS_DEFINED tags.\n" - "The default value is: NO.\n" - "This tag requires that the tag ENABLE_PREPROCESSING is set to YES.", - FALSE - ); - cb->addDependency("ENABLE_PREPROCESSING"); - //---- - cb = cfg->addBool( - "SEARCH_INCLUDES", - "If the SEARCH_INCLUDES tag is set to YES the includes files in the\n" - "INCLUDE_PATH will be searched if a #include is found.\n" - "The default value is: YES.\n" - "This tag requires that the tag ENABLE_PREPROCESSING is set to YES.", - TRUE - ); - cb->addDependency("ENABLE_PREPROCESSING"); - //---- - cl = cfg->addList( - "INCLUDE_PATH", - "The INCLUDE_PATH tag can be used to specify one or more directories that\n" - "contain include files that are not input files but should be processed by the\n" - "preprocessor.\n" - "This tag requires that the tag SEARCH_INCLUDES is set to YES." - ); - cl->addDependency("SEARCH_INCLUDES"); - cl->setWidgetType(ConfigList::Dir); - //---- - cl = cfg->addList( - "INCLUDE_FILE_PATTERNS", - "You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n" - "patterns (like *.h and *.hpp) to filter out the header-files in the\n" - "directories. If left blank, the patterns specified with FILE_PATTERNS will be\n" - "used.\n" - "This tag requires that the tag ENABLE_PREPROCESSING is set to YES." - ); - cl->addDependency("ENABLE_PREPROCESSING"); - //---- - cl = cfg->addList( - "PREDEFINED", - "The PREDEFINED tag can be used to specify one or more macro names that are\n" - "defined before the preprocessor is started (similar to the -D option of e.g.\n" - "gcc). The argument of the tag is a list of macros of the form: name or\n" - "name=definition (no spaces). If the definition and the \"=\" are omitted, \"=1\"\n" - "is assumed. To prevent a macro definition from being undefined via #undef or\n" - "recursively expanded use the := operator instead of the = operator.\n" - "This tag requires that the tag ENABLE_PREPROCESSING is set to YES." - ); - cl->addDependency("ENABLE_PREPROCESSING"); - //---- - cl = cfg->addList( - "EXPAND_AS_DEFINED", - "If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this\n" - "tag can be used to specify a list of macro names that should be expanded. The\n" - "macro definition that is found in the sources will be used. Use the PREDEFINED\n" - "tag if you want to use a different macro definition that overrules the\n" - "definition found in the source code.\n" - "This tag requires that the tag ENABLE_PREPROCESSING is set to YES." - ); - cl->addDependency("ENABLE_PREPROCESSING"); - //---- - cb = cfg->addBool( - "SKIP_FUNCTION_MACROS", - "If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will\n" - "remove all refrences to function-like macros that are alone on a line, have an\n" - "all uppercase name, and do not end with a semicolon. Such function macros are\n" - "typically used for boiler-plate code, and will confuse the parser if not\n" - "removed.\n" - "The default value is: YES.\n" - "This tag requires that the tag ENABLE_PREPROCESSING is set to YES.", - TRUE - ); - cb->addDependency("ENABLE_PREPROCESSING"); - //--------------------------------------------------------------------------- - cfg->addInfo("External","Configuration options related to external references"); - //--------------------------------------------------------------------------- - - //---- - cl = cfg->addList( - "TAGFILES", - "The TAGFILES tag can be used to specify one or more tag files. For each tag\n" - "file the location of the external documentation should be added. The format of\n" - "a tag file without this location is as follows:\n" - "TAGFILES = file1 file2 ...\n" - "Adding location for the tag files is done as follows:\n" - "TAGFILES = file1=loc1 \"file2 = loc2\" ...\n" - "where loc1 and loc2 can be relative or absolute paths or URLs. See the\n" - "section \"Linking to external documentation\" for more information about the use\n" - "of tag files.\n" - "Note: Each tag file must have an unique name (where the name does NOT include\n" - "the path). If a tag file is not located in the directory in which doxygen is\n" - "run, you must also specify the path to the tagfile here." - ); - cl->setWidgetType(ConfigList::File); - //---- - cs = cfg->addString( - "GENERATE_TAGFILE", - "When a file name is specified after GENERATE_TAGFILE, doxygen will create a\n" - "tag file that is based on the input files it reads. See section \"Linking to\n" - "external documentation\" for more information about the usage of tag files." - ); - cs->setWidgetType(ConfigString::File); - //---- - cb = cfg->addBool( - "ALLEXTERNALS", - "If the ALLEXTERNALS tag is set to YES all external class will be listed in the\n" - "class index. If set to NO only the inherited external classes will be listed.\n" - "The default value is: NO.", - FALSE - ); - //---- - cb = cfg->addBool( - "EXTERNAL_GROUPS", - "If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in\n" - "the modules index. If set to NO, only the current project's groups will be\n" - "listed.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "EXTERNAL_PAGES", - "If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in\n" - "the related pages index. If set to NO, only the current project's pages will\n" - "be listed.\n" - "The default value is: YES.", - TRUE - ); - //---- - cs = cfg->addString( - "PERL_PATH", - "The PERL_PATH should be the absolute path and name of the perl script\n" - "interpreter (i.e. the result of 'which perl').\n" - "The default file (with absolute path) is: /usr/bin/perl." - ); - cs->setDefaultValue("/usr/bin/perl"); - cs->setWidgetType(ConfigString::File); - //--------------------------------------------------------------------------- - cfg->addInfo("Dot","Configuration options related to the dot tool"); - //--------------------------------------------------------------------------- - - //---- - cb = cfg->addBool( - "CLASS_DIAGRAMS", - "If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram\n" - "(in HTML and LaTeX) for classes with base or super classes. Setting the tag to\n" - "NO turns the diagrams off. Note that this option also works with HAVE_DOT\n" - "disabled, but it is recommended to install and use dot, since it yields more\n" - "powerful graphs.\n" - "The default value is: YES.", - TRUE - ); - //---- - cs = cfg->addString( - "MSCGEN_PATH", - "You can define message sequence charts within doxygen comments using the \\msc\n" - "command. Doxygen will then run the mscgen tool (see:\n" - "http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the\n" - "documentation. The MSCGEN_PATH tag allows you to specify the directory where\n" - "the mscgen tool resides. If left empty the tool is assumed to be found in the\n" - "default search path." - ); - cs->setWidgetType(ConfigString::Dir); - //---- - cb = cfg->addBool( - "HIDE_UNDOC_RELATIONS", - "If set to YES, the inheritance and collaboration graphs will hide inheritance\n" - "and usage relations if the target is undocumented or is not a class.\n" - "The default value is: YES.", - TRUE - ); - //---- - cb = cfg->addBool( - "HAVE_DOT", - "If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n" - "available from the path. This tool is part of Graphviz (see:\n" - "http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent\n" - "Bell Labs. The other options in this section have no effect if this option is\n" - "set to NO\n" - "The default value is: NO.", - FALSE - ); - //---- - ci = cfg->addInt( - "DOT_NUM_THREADS", - "The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed\n" - "to run in parallel. When set to 0 doxygen will base this on the number of\n" - "processors available in the system. You can set it explicitly to a value\n" - "larger than 0 to get control over the balance between CPU load and processing\n" - "speed.\n" - "Minimum value: 0, maximum value: 32, default value: 0.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - 0,32,0 - ); - ci->addDependency("HAVE_DOT"); - //---- - cs = cfg->addString( - "DOT_FONTNAME", - "When you want a differently looking font n the dot files that doxygen\n" - "generates you can specify the font name using DOT_FONTNAME. You need to make\n" - "sure dot is able to find the font, which can be done by putting it in a\n" - "standard location or by setting the DOTFONTPATH environment variable or by\n" - "setting DOT_FONTPATH to the directory containing the font.\n" - "The default value is: Helvetica.\n" - "This tag requires that the tag HAVE_DOT is set to YES." - ); - cs->setDefaultValue("Helvetica"); - cs->addDependency("HAVE_DOT"); - //---- - ci = cfg->addInt( - "DOT_FONTSIZE", - "The DOT_FONTSIZE tag can be used to set the size (in points) of the font of\n" - "dot graphs.\n" - "Minimum value: 4, maximum value: 24, default value: 10.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - 4,24,10 - ); - ci->addDependency("HAVE_DOT"); - //---- - cs = cfg->addString( - "DOT_FONTPATH", - "By default doxygen will tell dot to use the default font as specified with\n" - "DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set\n" - "the path where dot can find it using this tag.\n" - "This tag requires that the tag HAVE_DOT is set to YES." - ); - cs->setWidgetType(ConfigString::Dir); - cs->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "CLASS_GRAPH", - "If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for\n" - "each documented class showing the direct and indirect inheritance relations.\n" - "Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.\n" - "The default value is: YES.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - TRUE - ); - cb->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "COLLABORATION_GRAPH", - "If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a\n" - "graph for each documented class showing the direct and indirect implementation\n" - "dependencies (inheritance, containment, and class references variables) of the\n" - "class with other documented classes.\n" - "The default value is: YES.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - TRUE - ); - cb->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "GROUP_GRAPHS", - "If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for\n" - "groups, showing the direct groups dependencies.\n" - "The default value is: YES.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - TRUE - ); - cb->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "UML_LOOK", - "If the UML_LOOK tag is set to YES doxygen will generate inheritance and\n" - "collaboration diagrams in a style similar to the OMG's Unified Modeling\n" - "Language.\n" - "The default value is: NO.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - FALSE - ); - cb->addDependency("HAVE_DOT"); - //---- - ci = cfg->addInt( - "UML_LIMIT_NUM_FIELDS", - "If the UML_LOOK tag is enabled, the fields and methods are shown inside the\n" - "class node. If there are many fields or methods and many nodes the graph may\n" - "become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the\n" - "number of items for each type to make the size more manageable. Set this to 0\n" - "for no limit. Note that the threshold may be exceeded by 50% before the limit\n" - "is enforced. So when you set the threshold to 10, up to 15 fields may appear,\n" - "but if the number exceeds 15, the total amount of fields shown is limited to\n" - "10.\n" - "Minimum value: 0, maximum value: 100, default value: 10.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - 0,100,10 - ); - ci->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "TEMPLATE_RELATIONS", - "If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and\n" - "collaboration graphs will show the relations between templates and their\n" - "instances.\n" - "The default value is: NO.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - FALSE - ); - cb->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "INCLUDE_GRAPH", - "If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to\n" - "YES then doxygen will generate a graph for each documented file showing the\n" - "direct and indirect include dependencies of the file with other documented\n" - "files.\n" - "The default value is: YES.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - TRUE - ); - cb->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "INCLUDED_BY_GRAPH", - "If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are\n" - "set to YES then doxygen will generate a graph for each documented file showing\n" - "the direct and indirect include dependencies of the file with other documented\n" - "files.\n" - "The default value is: YES.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - TRUE - ); - cb->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "CALL_GRAPH", - "If the CALL_GRAPH tag is set to YES then doxygen will generate a call\n" - "dependency graph for every global function or class method.\n" - "\n" - "Note that enabling this option will significantly increase the time of a run.\n" - "So in most cases it will be better to enable call graphs for selected\n" - "functions only using the \\callgraph command.\n" - "The default value is: NO.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - FALSE - ); - cb->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "CALLER_GRAPH", - "If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller\n" - "dependency graph for every global function or class method.\n" - "\n" - "Note that enabling this option will significantly increase the time of a run.\n" - "So in most cases it will be better to enable caller graphs for selected\n" - "functions only using the \\callergraph command.\n" - "The default value is: NO.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - FALSE - ); - cb->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "GRAPHICAL_HIERARCHY", - "If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical\n" - "hierarchy of all classes instead of a textual one.\n" - "The default value is: YES.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - TRUE - ); - cb->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "DIRECTORY_GRAPH", - "If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the\n" - "dependencies a directory has on other directories in a graphical way. The\n" - "dependency relations are determined by the #include relations between the\n" - "files in the directories.\n" - "The default value is: YES.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - TRUE - ); - cb->addDependency("HAVE_DOT"); - //---- - ce = cfg->addEnum( - "DOT_IMAGE_FORMAT", - "The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n" - "generated by dot.\n" - "Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order\n" - "to make the SVG files visible in IE 9+ (other browsers do not have this\n" - "requirement).\n" - "Possible values are: png, jpg, gif and svg.\n" - "The default value is: png.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - "png" - ); - ce->addValue("png"); - ce->addValue("jpg"); - ce->addValue("gif"); - ce->addValue("svg"); - ce->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "INTERACTIVE_SVG", - "If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\n" - "enable generation of interactive SVG images that allow zooming and panning.\n" - "\n" - "Note that this requires a modern browser other than Internet Explorer. Tested\n" - "and working are Firefox, Chrome, Safari, and Opera.\n" - "Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make\n" - "the SVG files visible. Older versions of IE do not have SVG support.\n" - "The default value is: NO.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - FALSE - ); - cb->addDependency("HAVE_DOT"); - //---- - cs = cfg->addString( - "DOT_PATH", - "The DOT_PATH tag can be used to specify the path where the dot tool can be\n" - "found. If left blank, it is assumed the dot tool can be found in the path.\n" - "This tag requires that the tag HAVE_DOT is set to YES." - ); - cs->setWidgetType(ConfigString::Dir); - cs->addDependency("HAVE_DOT"); - //---- - cl = cfg->addList( - "DOTFILE_DIRS", - "The DOTFILE_DIRS tag can be used to specify one or more directories that\n" - "contain dot files that are included in the documentation (see the \\dotfile\n" - "command).\n" - "This tag requires that the tag HAVE_DOT is set to YES." - ); - cl->addDependency("HAVE_DOT"); - cl->setWidgetType(ConfigList::Dir); - //---- - cl = cfg->addList( - "MSCFILE_DIRS", - "The MSCFILE_DIRS tag can be used to specify one or more directories that\n" - "contain msc files that are included in the documentation (see the \\mscfile\n" - "command)." - ); - cl->setWidgetType(ConfigList::Dir); - //---- - ci = cfg->addInt( - "DOT_GRAPH_MAX_NODES", - "The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes\n" - "that will be shown in the graph. If the number of nodes in a graph becomes\n" - "larger than this value, doxygen will truncate the graph, which is visualized\n" - "by representing a node as a red box. Note that doxygen if the number of direct\n" - "children of the root node in a graph is already larger than\n" - "DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that\n" - "the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n" - "Minimum value: 0, maximum value: 10000, default value: 50.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - 0,10000,50 - ); - ci->addDependency("HAVE_DOT"); - //---- - ci = cfg->addInt( - "MAX_DOT_GRAPH_DEPTH", - "The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs\n" - "generated by dot. A depth value of 3 means that only nodes reachable from the\n" - "root by following a path via at most 3 edges will be shown. Nodes that lay\n" - "further from the root node will be omitted. Note that setting this option to 1\n" - "or 2 may greatly reduce the computation time needed for large code bases. Also\n" - "note that the size of a graph can be further restricted by\n" - "DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n" - "Minimum value: 0, maximum value: 1000, default value: 0.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - 0,1000,0 - ); - ci->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "DOT_TRANSPARENT", - "Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n" - "background. This is disabled by default, because dot on Windows does not seem\n" - "to support this out of the box.\n" - "\n" - "Warning: Depending on the platform used, enabling this option may lead to\n" - "badly anti-aliased labels on the edges of a graph (i.e. they become hard to\n" - "read).\n" - "The default value is: NO.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - FALSE - ); - cb->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "DOT_MULTI_TARGETS", - "Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output\n" - "files in one run (i.e. multiple -o and -T options on the command line). This\n" - "makes dot run faster, but since only newer versions of dot (>1.8.10) support\n" - "this, this feature is disabled by default.\n" - "The default value is: NO.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - FALSE - ); - cb->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "GENERATE_LEGEND", - "If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page\n" - "explaining the meaning of the various boxes and arrows in the dot generated\n" - "graphs.\n" - "The default value is: YES.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - TRUE - ); - cb->addDependency("HAVE_DOT"); - //---- - cb = cfg->addBool( - "DOT_CLEANUP", - "If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot\n" - "files that are used to generate the various graphs.\n" - "The default value is: YES.\n" - "This tag requires that the tag HAVE_DOT is set to YES.", - TRUE - ); - cb->addDependency("HAVE_DOT"); - //---- - cfg->addObsolete("USE_WINDOWS_ENCODING"); - //---- - cfg->addObsolete("DETAILS_AT_TOP"); - //---- - cfg->addObsolete("QTHELP_FILE"); - //---- - cfg->addObsolete("QTHELP_CONFIG"); - //---- - cfg->addObsolete("DOXYGEN2QTHELP_LOC"); - //---- - cfg->addObsolete("MAX_DOT_GRAPH_WIDTH"); - //---- - cfg->addObsolete("MAX_DOT_GRAPH_HEIGHT"); - //---- - cfg->addObsolete("CGI_NAME"); - //---- - cfg->addObsolete("CGI_URL"); - //---- - cfg->addObsolete("DOC_URL"); - //---- - cfg->addObsolete("DOC_ABSPATH"); - //---- - cfg->addObsolete("BIN_ABSPATH"); - //---- - cfg->addObsolete("EXT_DOC_PATHS"); - //---- - cfg->addObsolete("USE_INLINE_TREES"); - //---- - cfg->addObsolete("SHOW_DIRECTORIES"); - //---- - cfg->addObsolete("HTML_ALIGN_MEMBERS"); - //---- - cfg->addObsolete("SYMBOL_CACHE_SIZE"); -} diff --git a/src/constexp.h b/src/constexp.h index 60e4722..1828b0b 100644 --- a/src/constexp.h +++ b/src/constexp.h @@ -22,9 +22,9 @@ #include "cppvalue.h" #include <qcstring.h> -extern bool parseCppExpression(const char *fileName,int line,const QCString &s); -extern int cppExpYYparse(); -extern int cppExpYYdebug; +extern bool parseconstexp(const char *fileName,int line,const QCString &s); +extern int constexpYYparse(); +extern int constexpYYdebug; extern QCString g_strToken; extern CPPValue g_resultValue; extern QCString g_constExpFileName; diff --git a/src/constexp.l b/src/constexp.l index f72e99d..b333c72 100644 --- a/src/constexp.l +++ b/src/constexp.l @@ -21,6 +21,7 @@ #include "constexp.h" #include "cppvalue.h" #include "ce_parse.h" // generated header file +#include "message.h" #define YY_NEVER_INTERACTIVE 1 #define YY_NO_INPUT 1 @@ -103,19 +104,21 @@ CONSTSUFFIX ([uU][lL]?[lL]?)|([lL][lL]?[uU]?) %% -bool parseCppExpression(const char *fileName,int lineNr,const QCString &s) +bool parseconstexp(const char *fileName,int lineNr,const QCString &s) { + printlex(yy_flex_debug, TRUE, __FILE__, fileName); //printf("Expression: `%s'\n",s.data()); g_constExpFileName = fileName; g_constExpLineNr = lineNr; g_inputString = s; g_inputPosition = 0; - cppExpYYrestart( cppExpYYin ); - cppExpYYparse(); + constexpYYrestart( constexpYYin ); + constexpYYparse(); //printf("Result: %ld\n",(long)g_resultValue); + printlex(yy_flex_debug, FALSE, __FILE__, fileName); return (long)g_resultValue!=0; } extern "C" { - int cppExpYYwrap() { return 1; } + int constexpYYwrap() { return 1; } } diff --git a/src/constexp.y b/src/constexp.y index f47e7c0..421e26e 100644 --- a/src/constexp.y +++ b/src/constexp.y @@ -31,14 +31,14 @@ #include <stdio.h> #include <stdlib.h> -int cppExpYYerror(const char *s) +int constexpYYerror(const char *s) { warn(g_constExpFileName,g_constExpLineNr, "preprocessing issue while doing constant expression evaluation: %s",s); return 0; } -int cppExpYYlex(); +int constexpYYlex(); %} diff --git a/src/context.cpp b/src/context.cpp new file mode 100644 index 0000000..e573dde --- /dev/null +++ b/src/context.cpp @@ -0,0 +1,5765 @@ +#include "context.h" +#include "config.h" +#include "index.h" +#include "classlist.h" +#include "doxygen.h" +#include "namespacedef.h" +#include "filedef.h" +#include "pagedef.h" +#include "groupdef.h" +#include "util.h" +#include "version.h" +#include "language.h" +#include "message.h" +#include "vhdldocgen.h" +#include "filename.h" +#include "dirdef.h" +#include "docparser.h" +#include "htmlgen.h" +#include "htmldocvisitor.h" +#include "dot.h" +#include "diagram.h" +#include "example.h" +#include "membername.h" +#include "parserintf.h" +#include "portable.h" + +// TODO: pass the current file to Dot*::writeGraph, so the user can put dot graphs in other +// files as well + +struct ContextGlobals +{ + enum OutputFormat + { + Html, + LateX, + Rtf, + ManPage, + DocBook, + Xml, + TagFile + }; + int dynSectionId; + QCString outputDir; + OutputFormat outputFormat; +} g_globals; + +/** @brief Scoped smart pointer */ +template<class T> class ScopedPtr +{ + private: + T *m_ptr; + ScopedPtr(const ScopedPtr &); + ScopedPtr &operator=(const ScopedPtr &); + void operator==(const ScopedPtr &) const; + void operator!=(const ScopedPtr &) const; + + public: + typedef T Type; + explicit ScopedPtr(T *p=0) : m_ptr(p) {} + ~ScopedPtr() { delete m_ptr; }; + T &operator*() const { return *m_ptr; } + T *operator->() const { return m_ptr; } + T *get() const { return m_ptr; } + operator bool() const { return m_ptr!=0; } + void reset(T *p=0) { if (p!=m_ptr) { delete m_ptr; m_ptr = p; } } +}; + +/** @brief Template List iterator support */ +template<class T> +class GenericConstIterator : public TemplateListIntf::ConstIterator +{ + public: + GenericConstIterator(const QList<T> &list) + : m_it(list) { } + virtual ~GenericConstIterator() {} + void toFirst() + { + m_it.toFirst(); + } + void toLast() + { + m_it.toLast(); + } + void toNext() + { + if (m_it.current()) ++m_it; + } + void toPrev() + { + if (m_it.current()) --m_it; + } + bool current(TemplateVariant &v) const + { + if (m_it.current()) + { + v = m_it.current(); + return TRUE; + } + else + { + v = TemplateVariant(); + return FALSE; + } + } + private: + QListIterator<T> m_it; +}; + +//------------------------------------------------------------------------ + +/** @brief standard template list implementation */ +template<class T> +class GenericNodeListContext : public TemplateListIntf +{ + public: + GenericNodeListContext() + { + m_children.setAutoDelete(TRUE); + } + + // TemplateListIntf methods + int count() const + { + return (int)m_children.count(); + } + TemplateVariant at(int index) const + { + TemplateVariant result; + if (index>=0 && index<count()) + { + result = m_children.at(index); + } + return result; + } + TemplateListIntf::ConstIterator *createIterator() const + { + return new GenericConstIterator<T>(m_children); + } + + void append(T *ctn) + { + m_children.append(ctn); + } + bool isEmpty() const + { + return m_children.isEmpty(); + } + private: + mutable QList<T> m_children; +}; + +//------------------------------------------------------------------------ + +/** @brief Helper class to map a property name to a handler member function */ +class PropertyMapper +{ + private: + struct PropertyFuncIntf + { + virtual ~PropertyFuncIntf() {} + virtual TemplateVariant operator()() const = 0; + }; + template<typename T> + struct PropertyFunc : public PropertyFuncIntf + { + typedef TemplateVariant (T::*Handler)() const; + PropertyFunc(const T *o,Handler h) : obj(o), handler(h) {} + TemplateVariant operator()() const + { + return (obj->*handler)(); + } + const T *obj; + Handler handler; + }; + + public: + PropertyMapper() { m_map.setAutoDelete(TRUE); } + + /** Add a property to the map + * @param[in] name The name of the property to add. + * @param[in] obj The object handling access to the property. + * @param[in] handle The method to call when the property is accessed. + */ + template<typename T> + void addProperty(const char *name,const T* obj, + typename PropertyFunc<T>::Handler handle) + { + if (m_map.find(name)) + { + err("Error: adding property '%s' more than once",name); + } + else + { + m_map.insert(name,new PropertyFunc<T>(obj,handle)); + } + } + + /** Gets the value of a property. + * @param[in] name The name of the property. + * @returns A variant representing the properties value or an + * invalid variant if it was not found. + */ + TemplateVariant get(const char *name) const + { + //printf("PropertyMapper::get(%s)\n",name); + TemplateVariant result; + PropertyFuncIntf *func = m_map.find(name); + if (func) + { + result = (*func)(); + } + return result; + } + + private: + QDict<PropertyFuncIntf> m_map; +}; + + +//------------------------------------------------------------------------ + +//%% struct Config : configuration options +//%% { +class ConfigContext::Private +{ + public: + Private() { cachedLists.setAutoDelete(TRUE); } + TemplateVariant fetchList(const QCString &name,const QStrList *list) + { + TemplateList *tlist = cachedLists.find(name); + if (tlist==0) + { + tlist = new TemplateList; + cachedLists.insert(name,tlist); + QStrListIterator li(*list); + char *s; + for (li.toFirst();(s=li.current());++li) + { + tlist->append(s); + } + } + return tlist; + } + private: + QDict<TemplateList> cachedLists; +}; +//%% } + +ConfigContext::ConfigContext() +{ + p = new Private; +} + +ConfigContext::~ConfigContext() +{ + delete p; +} + +TemplateVariant ConfigContext::get(const char *name) const +{ + TemplateVariant result; + if (name) + { + ConfigOption *option = Config::instance()->get(name); + if (option) + { + switch (option->kind()) + { + case ConfigOption::O_Bool: + return TemplateVariant(*((ConfigBool*)option)->valueRef()); + case ConfigOption::O_Int: + return TemplateVariant(*((ConfigInt*)option)->valueRef()); + case ConfigOption::O_Enum: + return TemplateVariant(*((ConfigEnum*)option)->valueRef()); + case ConfigOption::O_String: + return TemplateVariant(*((ConfigString*)option)->valueRef()); + case ConfigOption::O_List: + return p->fetchList(name,((ConfigList*)option)->valueRef()); + break; + default: + break; + } + } + } + return result; +} + +//------------------------------------------------------------------------ + +//%% struct Doxygen: global information +//%% { +class DoxygenContext::Private : public PropertyMapper +{ + public: + TemplateVariant version() const + { + return versionString; + } + TemplateVariant date() const + { + return TemplateVariant(dateToString(TRUE)); + } + Private() + { + //%% string version + addProperty("version",this,&Private::version); //makeProperty(this,&Private::version)); + //%% string date + addProperty("date", this,&Private::date); + } +}; +//%% } + +DoxygenContext::DoxygenContext() +{ + p = new Private; +} + +DoxygenContext::~DoxygenContext() +{ + delete p; +} + +TemplateVariant DoxygenContext::get(const char *n) const +{ + return p->get(n); +} + +//------------------------------------------------------------------------ + +//%% struct Translator: translation methods +//%% { +class TranslateContext::Private : public PropertyMapper +{ + public: + + TemplateVariant handleGeneratedAt(const QValueList<TemplateVariant> &args) const + { + if (args.count()==2) + { + return theTranslator->trGeneratedAt(args[0].toString(),args[1].toString()); + } + else + { + err("tr.generateAt should take two arguments, got %d!\n",args.count()); + } + return TemplateVariant(); + } + TemplateVariant handleInheritanceDiagramFor(const QValueList<TemplateVariant> &args) const + { + if (args.count()==1) + { + return theTranslator->trClassDiagram(args[0].toString()); + } + else + { + err("tr.inheritanceDiagramFor should take one argument, got %d!\n",args.count()); + } + return TemplateVariant(); + } + TemplateVariant handleCollaborationDiagramFor(const QValueList<TemplateVariant> &args) const + { + if (args.count()==1) + { + return theTranslator->trCollaborationDiagram(args[0].toString()); + } + else + { + err("tr.collaborationDiagramFor should take one argument, got %d!\n",args.count()); + } + return TemplateVariant(); + } + TemplateVariant handleInheritsList(const QValueList<TemplateVariant> &args) const + { + if (args.count()==1) + { + return theTranslator->trInheritsList(args[0].toInt()); + } + else + { + err("tr.inheritsList should take one integer argument, got %d!\n",args.count()); + } + return TemplateVariant(); + } + TemplateVariant handleInheritedByList(const QValueList<TemplateVariant> &args) const + { + if (args.count()==1) + { + return theTranslator->trInheritedByList(args[0].toInt()); + } + else + { + err("tr.inheritedByList should take one integer argument, got %d!\n",args.count()); + } + return TemplateVariant(); + } + TemplateVariant handleWriteList(const QValueList<TemplateVariant> &args) const + { + if (args.count()==1) + { + return theTranslator->trWriteList(args[0].toInt()); + } + else + { + err("tr.*List should take one integer argument, got %d!\n",args.count()); + } + return TemplateVariant(); + } + TemplateVariant handleImplementedBy(const QValueList<TemplateVariant> &args) const + { + if (args.count()==1) + { + return theTranslator->trImplementedInList(args[0].toInt()); + } + else + { + err("tr.implementedBy should take one integer argument, got %d!\n",args.count()); + } + return TemplateVariant(); + } + TemplateVariant handleReimplementedBy(const QValueList<TemplateVariant> &args) const + { + if (args.count()==1) + { + return theTranslator->trReimplementedInList(args[0].toInt()); + } + else + { + err("tr.reimplementedBy should take one integer argument, got %d!\n",args.count()); + } + return TemplateVariant(); + } + TemplateVariant handleSourceRefs(const QValueList<TemplateVariant> &args) const + { + if (args.count()==1) + { + return theTranslator->trReferences()+" "+theTranslator->trWriteList(args[0].toInt())+"."; + } + else + { + err("tr.sourceRefs should take one integer argument, got %d\n",args.count()); + } + return TemplateVariant(); + } + TemplateVariant handleSourceRefBys(const QValueList<TemplateVariant> &args) const + { + if (args.count()==1) + { + return theTranslator->trReferencedBy()+" "+theTranslator->trWriteList(args[0].toInt())+"."; + } + else + { + err("tr.sourceRefBys should take one integer argument, got %d\n",args.count()); + } + return TemplateVariant(); + } + + + + TemplateVariant generatedBy() const + { + return theTranslator->trGeneratedBy(); + } + TemplateVariant generatedAt() const + { + return TemplateVariant::Delegate::fromMethod<Private,&Private::handleGeneratedAt>(this); + } + TemplateVariant inheritanceDiagramFor() const + { + return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritanceDiagramFor>(this); + } + TemplateVariant collaborationDiagramFor() const + { + return TemplateVariant::Delegate::fromMethod<Private,&Private::handleCollaborationDiagramFor>(this); + } + TemplateVariant search() const + { + return theTranslator->trSearch(); + } + TemplateVariant mainPage() const + { + return theTranslator->trMainPage(); + } + TemplateVariant classes() const + { + return theTranslator->trClasses(); + } + TemplateVariant classList() const + { + return theTranslator->trCompoundList(); + } + TemplateVariant classIndex() const + { + return theTranslator->trCompoundIndex(); + } + TemplateVariant classHierarchy() const + { + return theTranslator->trClassHierarchy(); + } + TemplateVariant classMembers() const + { + return theTranslator->trCompoundMembers(); + } + TemplateVariant modules() const + { + return theTranslator->trModules(); + } + TemplateVariant namespaces() const + { + if (m_javaOpt || m_vhdlOpt) + { + return theTranslator->trPackages(); + } + else if (m_fortranOpt) + { + return theTranslator->trModules(); + } + else + { + return theTranslator->trNamespaces(); + } + } + TemplateVariant files() const + { + return theTranslator->trFile(TRUE,FALSE); + } + TemplateVariant pages() const + { + return theTranslator->trRelatedPages(); + } + TemplateVariant examples() const + { + return theTranslator->trExamples(); + } + TemplateVariant namespaceList() const + { + if (m_javaOpt || m_vhdlOpt) + { + return theTranslator->trPackages(); + } + else if (m_fortranOpt) + { + return theTranslator->trModulesList(); + } + else + { + return theTranslator->trNamespaceList(); + } + } + TemplateVariant namespaceMembers() const + { + if (m_javaOpt || m_vhdlOpt) + { + return theTranslator->trPackageMembers(); + } + else if (m_fortranOpt) + { + return theTranslator->trModulesMembers(); + } + else + { + return theTranslator->trNamespaceMembers(); + } + } + TemplateVariant fileList() const + { + return theTranslator->trFileList(); + } + TemplateVariant fileMembers() const + { + return theTranslator->trFileMembers(); + } + TemplateVariant relatedPagesDesc() const + { + return theTranslator->trRelatedPagesDescription(); + } + TemplateVariant more() const + { + return theTranslator->trMore(); + } + TemplateVariant detailedDesc() const + { + return theTranslator->trDetailedDescription(); + } + TemplateVariant inheritsList() const + { + return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritsList>(this); + } + TemplateVariant inheritedByList() const + { + return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritedByList>(this); + } + TemplateVariant definedAtLineInSourceFile() const + { + return theTranslator->trDefinedAtLineInSourceFile(); + } + TemplateVariant typeConstraints() const + { + return theTranslator->trTypeConstraints(); + } + TemplateVariant exampleList() const + { + return TemplateVariant::Delegate::fromMethod<Private,&Private::handleWriteList>(this); + } + TemplateVariant listOfAllMembers() const + { + return theTranslator->trListOfAllMembers(); + } + TemplateVariant memberList() const + { + return theTranslator->trMemberList(); + } + TemplateVariant theListOfAllMembers() const + { + return theTranslator->trThisIsTheListOfAllMembers(); + } + TemplateVariant incInheritedMembers() const + { + return theTranslator->trIncludingInheritedMembers(); + } + TemplateVariant defineValue() const + { + return theTranslator->trDefineValue(); + } + TemplateVariant initialValue() const + { + return theTranslator->trInitialValue(); + } + TemplateVariant enumerationValues() const + { + return theTranslator->trEnumerationValues(); + } + TemplateVariant implements() const + { + return theTranslator->trImplementedFromList(1); + } + TemplateVariant reimplements() const + { + return theTranslator->trReimplementedFromList(1); + } + TemplateVariant implementedBy() const + { + return TemplateVariant::Delegate::fromMethod<Private,&Private::handleImplementedBy>(this); + } + TemplateVariant reimplementedBy() const + { + return TemplateVariant::Delegate::fromMethod<Private,&Private::handleReimplementedBy>(this); + } + TemplateVariant sourceRefs() const + { + return TemplateVariant::Delegate::fromMethod<Private,&Private::handleSourceRefs>(this); + } + TemplateVariant sourceRefBys() const + { + return TemplateVariant::Delegate::fromMethod<Private,&Private::handleSourceRefBys>(this); + } + TemplateVariant callGraph() const + { + return theTranslator->trCallGraph(); + } + TemplateVariant callerGraph() const + { + return theTranslator->trCallerGraph(); + } + TemplateVariant inheritedFrom() const + { + return theTranslator->trInheritedFrom("@0","@1"); + } + TemplateVariant additionalInheritedMembers() const + { + return theTranslator->trAdditionalInheritedMembers(); + } + Private() + { + //%% string generatedBy + addProperty("generatedby", this,&Private::generatedBy); + //%% string generatedAt + addProperty("generatedAt", this,&Private::generatedAt); + //%% string search + addProperty("search", this,&Private::search); + //%% string mainPage + addProperty("mainPage", this,&Private::mainPage); + //%% string classes + addProperty("classes", this,&Private::classes); + //%% string classList + addProperty("classList", this,&Private::classList); + //%% string classIndex + addProperty("classIndex", this,&Private::classIndex); + //%% string classHierarchy + addProperty("classHierarchy", this,&Private::classHierarchy); + //%% string classMembers + addProperty("classMembers", this,&Private::classMembers); + //%% string modules + addProperty("modules", this,&Private::modules); + //%% string namespaces + addProperty("namespaces", this,&Private::namespaces); + //%% string files + addProperty("files", this,&Private::files); + //%% string pages + addProperty("pages", this,&Private::pages); + //%% string examples + addProperty("examples", this,&Private::examples); + //%% string namespaceList + addProperty("namespaceList", this,&Private::namespaceList); + //%% string namespaceMembers + addProperty("namespaceMembers", this,&Private::namespaceMembers); + //%% srting fileList + addProperty("fileList", this,&Private::fileList); + //%% string fileMembers + addProperty("fileMembers", this,&Private::fileMembers); + //%% string relatedPagesDescripiton + addProperty("relatedPagesDesc", this,&Private::relatedPagesDesc); + //%% string more + addProperty("more", this,&Private::more); + //%% string detailedDescription + addProperty("detailedDesc", this,&Private::detailedDesc); + //%% string inheritanceDiagramFor + addProperty("inheritanceDiagramFor", this,&Private::inheritanceDiagramFor); + //%% string collaborationDiagramFor + addProperty("collaborationDiagramFor", this,&Private::collaborationDiagramFor); + //%% markerstring inheritsList + addProperty("inheritsList", this,&Private::inheritsList); + //%% markerstring inheritedByList + addProperty("inheritedByList", this,&Private::inheritedByList); + //%% markerstring definedAtLineInSourceFile + addProperty("definedAtLineInSourceFile", this,&Private::definedAtLineInSourceFile); + //%% string typeConstraints + addProperty("typeConstraints", this,&Private::typeConstraints); + //%% string exampleList + addProperty("exampleList", this,&Private::exampleList); + //%% string listOfAllMembers + addProperty("listOfAllMembers", this,&Private::listOfAllMembers); + //%% string memberList + addProperty("memberList", this,&Private::memberList); + //%% string theListOfAllMembers + addProperty("theListOfAllMembers",this,&Private::theListOfAllMembers); + //%% string incInheritedMembers + addProperty("incInheritedMembers",this,&Private::incInheritedMembers); + //%% string defineValue + addProperty("defineValue", this,&Private::defineValue); + //%% string initialValue + addProperty("initialValue", this,&Private::initialValue); + //%% string enumerationValues + addProperty("enumerationValues", this,&Private::enumerationValues); + //%% markerstring implements + addProperty("implements", this,&Private::implements); + //%% markerstring reimplements + addProperty("reimplements", this,&Private::reimplements); + //%% markerstring implementedBy + addProperty("implementedBy", this,&Private::implementedBy); + //%% markerstring reimplementedBy + addProperty("reimplementedBy", this,&Private::reimplementedBy); + //%% markerstring sourceRefs + addProperty("sourceRefs", this,&Private::sourceRefs); + //%% markerstring sourceRefBys + addProperty("sourceRefBys", this,&Private::sourceRefBys); + //%% string callGraph + addProperty("callGraph", this,&Private::callGraph); + //%% string callerGraph + addProperty("callerGraph", this,&Private::callerGraph); + //%% markerstring inheritedFrom + addProperty("inheritedFrom", this,&Private::inheritedFrom); + //%% string addtionalInheritedMembers + addProperty("additionalInheritedMembers",this,&Private::additionalInheritedMembers); + + m_javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); + m_fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); + m_vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); + } + private: + bool m_javaOpt; + bool m_fortranOpt; + bool m_vhdlOpt; +}; +//%% } + +TranslateContext::TranslateContext() +{ + p = new Private; +} + +TranslateContext::~TranslateContext() +{ + delete p; +} + +TemplateVariant TranslateContext::get(const char *n) const +{ + return p->get(n); +} + +static TemplateVariant parseDoc(Definition *def,const QCString &file,int line, + const QCString &relPath,const QCString &docStr,bool isBrief) +{ + TemplateVariant result; + DocRoot *root = validatingParseDoc(file,line,def,0,docStr,TRUE,FALSE,0,isBrief,FALSE); + QGString docs; + { + FTextStream ts(&docs); + // TODO: support other generators + HtmlCodeGenerator codeGen(ts,relPath); + HtmlDocVisitor visitor(ts,codeGen,def); + root->accept(&visitor); + } + bool isEmpty = root->isEmpty(); + if (isEmpty) + result = ""; + else + result = TemplateVariant(docs,TRUE); + delete root; + return result; +} + +static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const QCString &relPath, + const QCString &code,int startLine=-1,int endLine=-1,bool showLineNumbers=FALSE) +{ + ParserInterface *pIntf = Doxygen::parserManager->getParser(md->getDefFileExtension()); + pIntf->resetCodeParserState(); + QGString s; + FTextStream t(&s); + HtmlCodeGenerator codeGen(t,relPath); + pIntf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(), + startLine,endLine,TRUE,md,showLineNumbers,md); + return TemplateVariant(s.data(),TRUE); +} + +//------------------------------------------------------------------------ + +//%% struct Symbol: shared info for all symbols +//%% { +template<typename T> +class DefinitionContext : public PropertyMapper +{ + public: + DefinitionContext(Definition *d) : m_def(d) + { + //%% string name: the name of the symbol + addProperty("name",this,&DefinitionContext::name); + //%% string bareName: the bare name of the symbol with scope info + addProperty("bareName",this,&DefinitionContext::bareName); + //%% string relPath: the relative path to the root of the output (CREATE_SUBDIRS) + addProperty("relPath",this,&DefinitionContext::relPath); + //%% string fileName: the file name of the output file associated with the symbol (without extension) + addProperty("fileName",this,&DefinitionContext::fileName); + //%% string anchor: anchor within the page + addProperty("anchor",this,&DefinitionContext::anchor); + //%% string details: the detailed documentation for this symbol + addProperty("details",this,&DefinitionContext::details); + //%% string brief: the brief description for this symbol + addProperty("brief",this,&DefinitionContext::brief); + //%% string inbodyDocs: the documentation found in the body + addProperty("inbodyDocs",this,&DefinitionContext::inbodyDocs); + //%% string sourceFileName: the file name of the source file (without extension) + addProperty("sourceFileName",this,&DefinitionContext::sourceFileName); + //%% bool isLinkable: can the symbol be linked to? + addProperty("isLinkable",this,&DefinitionContext::isLinkable); + //%% bool isLinkableInProject: can the symbol be linked within this project? + addProperty("isLinkableInProject",this,&DefinitionContext::isLinkableInProject); + //%% int dynSectionId: identifier that can be used for collapsable sections + addProperty("dynSectionId",this,&DefinitionContext::dynSectionId); + //%% string language: the programming language in which the symbol is written + addProperty("language",this,&DefinitionContext::language); + //%% string sourceDef: A link to the source definition + addProperty("sourceDef",this,&DefinitionContext::sourceDef); + //%% list[Definition] navigationPath: Breadcrumb navigation path to this item + addProperty("navigationPath",this,&DefinitionContext::navigationPath); + + if (m_def && !m_def->getSourceFileBase().isEmpty()) + { + m_sourceDef.append(&m_lineLink); + m_sourceDef.append(&m_fileLink); + m_lineLink.set("text",m_def->getStartBodyLine()); + m_lineLink.set("isLinkable",TRUE); + m_lineLink.set("fileName",m_def->getSourceFileBase()); + m_lineLink.set("anchor",m_def->getSourceAnchor()); + if (m_def->definitionType()==Definition::TypeFile) + { + m_fileLink.set("text",m_def->name()); + } + else if (m_def->getBodyDef()) + { + m_fileLink.set("text",m_def->getBodyDef()->name()); + } + else + { + m_fileLink.set("text",name()); + } + m_fileLink.set("isLinkable",TRUE); + m_fileLink.set("fileName",m_def->getSourceFileBase()); + m_fileLink.set("anchor",QCString()); + } + } + TemplateVariant fileName() const + { + return m_def->getOutputFileBase(); + } + TemplateVariant anchor() const + { + return m_def->anchor(); + } + TemplateVariant sourceFileName() const + { + return m_def->getSourceFileBase(); + } + TemplateVariant isLinkable() const + { + return m_def->isLinkable(); + } + TemplateVariant isLinkableInProject() const + { + return m_def->isLinkableInProject(); + } + TemplateVariant name() const + { + return m_def->displayName(TRUE); + } + TemplateVariant bareName() const + { + return m_def->displayName(FALSE); + } + QCString relPathAsString() const + { + static bool createSubdirs = Config_getBool("CREATE_SUBDIRS"); + return createSubdirs ? QCString("../../") : QCString(""); + } + TemplateVariant relPath() const + { + return relPathAsString(); + } + TemplateVariant details() const + { + if (!m_cache.details) + { + m_cache.details.reset(new TemplateVariant(parseDoc(m_def,m_def->docFile(),m_def->docLine(), + relPathAsString(),m_def->documentation(),FALSE))); + } + return *m_cache.details; + } + TemplateVariant brief() const + { + if (!m_cache.brief) + { + if (m_def->hasBriefDescription()) + { + m_cache.brief.reset(new TemplateVariant(parseDoc(m_def,m_def->briefFile(),m_def->briefLine(), + relPathAsString(),m_def->briefDescription(),TRUE))); + } + else + { + m_cache.brief.reset(new TemplateVariant("")); + } + } + return *m_cache.brief; + } + TemplateVariant inbodyDocs() const + { + if (!m_cache.inbodyDocs) + { + if (!m_def->inbodyDocumentation().isEmpty()) + { + m_cache.inbodyDocs.reset(new TemplateVariant(parseDoc(m_def,m_def->inbodyFile(),m_def->inbodyLine(), + relPathAsString(),m_def->inbodyDocumentation(),FALSE))); + } + else + { + m_cache.inbodyDocs.reset(new TemplateVariant("")); + } + } + return *m_cache.inbodyDocs; + } + TemplateVariant dynSectionId() const + { + return g_globals.dynSectionId; + } + TemplateVariant language() const + { + SrcLangExt lang = m_def->getLanguage(); + QCString result = "unknown"; + switch (lang) + { + case SrcLangExt_Unknown: break; + case SrcLangExt_IDL: result="idl"; break; + case SrcLangExt_Java: result="java"; break; + case SrcLangExt_CSharp: result="csharp"; break; + case SrcLangExt_D: result="d"; break; + case SrcLangExt_PHP: result="php"; break; + case SrcLangExt_ObjC: result="objc"; break; + case SrcLangExt_Cpp: result="cpp"; break; + case SrcLangExt_JS: result="js"; break; + case SrcLangExt_Python: result="python"; break; + case SrcLangExt_Fortran: result="fortran"; break; + case SrcLangExt_VHDL: result="vhdl"; break; + case SrcLangExt_XML: result="xml"; break; + case SrcLangExt_Tcl: result="tcl"; break; + case SrcLangExt_Markdown: result="markdown"; break; + } + return result; + } + TemplateVariant sourceDef() const + { + if (m_sourceDef.count()==2) + { + return &m_sourceDef; + } + else + { + return FALSE; + } + } + void fillPath(Definition *def,TemplateList *list) const + { + Definition *outerScope = def->getOuterScope(); + Definition::DefType type = def->definitionType(); + if (outerScope && outerScope!=Doxygen::globalScope) + { + fillPath(outerScope,list); + } + else if (type==Definition::TypeFile && ((const FileDef*)def)->getDirDef()) + { + fillPath(((const FileDef*)def)->getDirDef(),list); + } + NavPathElemContext *elem = new NavPathElemContext(def); + list->append(elem); + m_cache.navPathElems.append(elem); + } + TemplateVariant navigationPath() const + { + if (!m_cache.navPath) + { + TemplateList *list = new TemplateList; + fillPath(m_def,list); + m_cache.navPath.reset(list); + } + return m_cache.navPath.get(); + } + + private: + Definition *m_def; + struct Cachable + { + Cachable() { navPathElems.setAutoDelete(TRUE); } + ScopedPtr<TemplateVariant> details; + ScopedPtr<TemplateVariant> brief; + ScopedPtr<TemplateVariant> inbodyDocs; + ScopedPtr<TemplateList> navPath; + QList<NavPathElemContext> navPathElems; + }; + mutable Cachable m_cache; + TemplateList m_sourceDef; + TemplateStruct m_fileLink; + TemplateStruct m_lineLink; +}; +//%% } + +//------------------------------------------------------------------------ + +//%% struct IncludeInfo: include file information +//%% { +class IncludeInfoContext::Private : public PropertyMapper +{ + public: + Private(IncludeInfo *info,SrcLangExt lang) : + m_info(info), + m_fileContext(info && info->fileDef ? info->fileDef : 0), + m_lang(lang) + { + if (m_info) + { + addProperty("file",this,&Private::file); + addProperty("name",this,&Private::name); + addProperty("isImport",this,&Private::isImport); + addProperty("isLocal",this,&Private::isLocal); + } + } + TemplateVariant isLocal() const + { + bool isIDLorJava = m_lang==SrcLangExt_IDL || m_lang==SrcLangExt_Java; + return m_info->local || isIDLorJava; + } + TemplateVariant isImport() const + { + return m_info->imported; + } + TemplateVariant file() const + { + if (m_info->fileDef) + { + return &m_fileContext; + } + else + { + return FALSE; + } + } + TemplateVariant name() const + { + return m_info->includeName; + } + private: + IncludeInfo *m_info; + FileContext m_fileContext; + SrcLangExt m_lang; +}; + +IncludeInfoContext::IncludeInfoContext(IncludeInfo *info,SrcLangExt lang) +{ + p = new Private(info,lang); +} + +IncludeInfoContext::~IncludeInfoContext() +{ + delete p; +} + +TemplateVariant IncludeInfoContext::get(const char *n) const +{ + return p->get(n); +} +//%% } + +//------------------------------------------------------------------------ + +//%% struct Class(Symbol): class information +//%% { +class ClassContext::Private : public DefinitionContext<ClassContext::Private> +{ + public: + Private(ClassDef *cd) : DefinitionContext<ClassContext::Private>(cd) , + m_classDef(cd), m_usedFiles(cd), + m_includeInfo(cd ? cd->includeInfo() : 0, cd ? cd->getLanguage() : SrcLangExt_Unknown) + { + addProperty("title", this,&Private::title); + addProperty("highlight", this,&Private::highlight); + addProperty("subhighlight", this,&Private::subHighlight); + addProperty("hasDetails", this,&Private::hasDetails); + addProperty("generatedFromFiles", this,&Private::generatedFromFiles); + addProperty("usedFiles", this,&Private::usedFiles); + addProperty("hasInheritanceDiagram", this,&Private::hasInheritanceDiagram); + addProperty("inheritanceDiagram", this,&Private::inheritanceDiagram); + addProperty("hasCollaborationDiagram", this,&Private::hasCollaborationDiagram); + addProperty("collaborationDiagram", this,&Private::collaborationDiagram); + addProperty("includeInfo", this,&Private::includeInfo); + addProperty("includeStatement", this,&Private::includeStatement); + addProperty("inherits", this,&Private::inherits); + addProperty("inheritedBy", this,&Private::inheritedBy); + addProperty("unoIDLServices", this,&Private::unoIDLServices); + addProperty("unoIDLInterfaces", this,&Private::unoIDLInterfaces); + addProperty("signals", this,&Private::signals); + addProperty("publicTypes", this,&Private::publicTypes); + addProperty("publicMethods", this,&Private::publicMethods); + addProperty("publicStaticMethods", this,&Private::publicStaticMethods); + addProperty("publicAttributes", this,&Private::publicAttributes); + addProperty("publicStaticAttributes", this,&Private::publicStaticAttributes); + addProperty("publicSlots", this,&Private::publicSlots); + addProperty("protectedTypes", this,&Private::protectedTypes); + addProperty("protectedMethods", this,&Private::protectedMethods); + addProperty("protectedStaticMethods", this,&Private::protectedStaticMethods); + addProperty("protectedAttributes", this,&Private::protectedAttributes); + addProperty("protectedStaticAttributes", this,&Private::protectedStaticAttributes); + addProperty("protectedSlots", this,&Private::protectedSlots); + addProperty("privateTypes", this,&Private::privateTypes); + addProperty("privateMethods", this,&Private::privateMethods); + addProperty("privateStaticMethods", this,&Private::privateStaticMethods); + addProperty("privateAttributes", this,&Private::privateAttributes); + addProperty("privateStaticAttributes", this,&Private::privateStaticAttributes); + addProperty("privateSlots", this,&Private::privateSlots); + addProperty("packageTypes", this,&Private::packageTypes); + addProperty("packageMethods", this,&Private::packageMethods); + addProperty("packageStaticMethods", this,&Private::packageStaticMethods); + addProperty("packageAttributes", this,&Private::packageAttributes); + addProperty("packageStaticAttributes", this,&Private::packageStaticAttributes); + addProperty("properties", this,&Private::properties); + addProperty("events", this,&Private::events); + addProperty("friends", this,&Private::friends); + addProperty("related", this,&Private::related); + addProperty("detailedTypedefs", this,&Private::detailedTypedefs); + addProperty("detailedEnums", this,&Private::detailedEnums); + addProperty("detailedServices", this,&Private::detailedServices); + addProperty("detailedInterfaces", this,&Private::detailedInterfaces); + addProperty("detailedConstructors", this,&Private::detailedConstructors); + addProperty("detailedMethods", this,&Private::detailedMethods); + addProperty("detailedRelated", this,&Private::detailedRelated); + addProperty("detailedVariables", this,&Private::detailedVariables); + addProperty("detailedProperties", this,&Private::detailedProperties); + addProperty("detailedEvents", this,&Private::detailedEvents); + addProperty("nestedClasses", this,&Private::nestedClasses); + addProperty("compoundType", this,&Private::compoundType); + addProperty("templateDecls", this,&Private::templateDecls); + addProperty("typeConstraints", this,&Private::typeConstraints); + addProperty("examples", this,&Private::examples); + addProperty("members", this,&Private::members); + addProperty("allMembersList", this,&Private::allMembersList); + addProperty("allMembersFileName", this,&Private::allMembersFileName); + addProperty("memberGroups", this,&Private::memberGroups); + addProperty("additionalInheritedMembers",this,&Private::additionalInheritedMembers); + } + TemplateVariant title() const + { + return TemplateVariant(m_classDef->title()); + } + TemplateVariant highlight() const + { + return TemplateVariant("classes"); + } + TemplateVariant subHighlight() const + { + return TemplateVariant(""); + } + TemplateVariant hasDetails() const + { + return m_classDef->hasDetailedDescription(); + } + TemplateVariant generatedFromFiles() const + { + return m_classDef->generatedFromFiles(); + } + TemplateVariant usedFiles() const + { + return TemplateVariant(&m_usedFiles); + } + DotClassGraph *getClassGraph() const + { + if (!m_cache.classGraph) + { + m_cache.classGraph.reset(new DotClassGraph(m_classDef,DotNode::Inheritance)); + } + return m_cache.classGraph.get(); + } + int numInheritanceNodes() const + { + if (m_cache.inheritanceNodes==-1) + { + m_cache.inheritanceNodes=m_classDef->countInheritanceNodes(); + } + return m_cache.inheritanceNodes>0; + } + TemplateVariant hasInheritanceDiagram() const + { + bool result=FALSE; + static bool haveDot = Config_getBool("HAVE_DOT"); + static bool classDiagrams = Config_getBool("CLASS_DIAGRAMS"); + static bool classGraph = Config_getBool("CLASS_GRAPH"); + if (haveDot && (classDiagrams || classGraph)) + { + DotClassGraph *cg = getClassGraph(); + result = !cg->isTrivial() && !cg->isTooBig(); + } + else if (classDiagrams) + { + result = numInheritanceNodes()>0; + } + return result; + } + TemplateVariant inheritanceDiagram() const + { + QGString result; + static bool haveDot = Config_getBool("HAVE_DOT"); + static bool classDiagrams = Config_getBool("CLASS_DIAGRAMS"); + static bool classGraph = Config_getBool("CLASS_GRAPH"); + if (haveDot && (classDiagrams || classGraph)) + { + DotClassGraph *cg = getClassGraph(); + FTextStream t(&result); + cg->writeGraph(t,BITMAP, + g_globals.outputDir, + g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension, + relPathAsString(),TRUE,TRUE,g_globals.dynSectionId + ); + } + else if (classDiagrams) + { + ClassDiagram d(m_classDef); + FTextStream t(&result); + QCString name = convertToHtml(m_classDef->displayName()); + t << "<div class=\"center\">" << endl; + t << "<img src=\""; + t << relPathAsString() << m_classDef->getOutputFileBase(); + t << ".png\" usemap=\"#" << name << "_map\" alt=\"\"/>" << endl; + t << "<map id=\"" << name << "_map\" name=\"" << name << "_map\">" << endl; + d.writeImage(t,g_globals.outputDir, + relPathAsString(), + m_classDef->getOutputFileBase()); + t << "</div>"; + } + g_globals.dynSectionId++; + return TemplateVariant(result.data(),TRUE); + } + DotClassGraph *getCollaborationGraph() const + { + if (!m_cache.collaborationGraph) + { + m_cache.collaborationGraph.reset(new DotClassGraph(m_classDef,DotNode::Collaboration)); + } + return m_cache.collaborationGraph.get(); + } + TemplateVariant hasCollaborationDiagram() const + { + static bool haveDot = Config_getBool("HAVE_DOT"); + return haveDot && !getCollaborationGraph()->isTrivial(); + } + TemplateVariant collaborationDiagram() const + { + static bool haveDot = Config_getBool("HAVE_DOT"); + QGString result; + if (haveDot) + { + DotClassGraph *cg = getCollaborationGraph(); + FTextStream t(&result); + cg->writeGraph(t,BITMAP, + g_globals.outputDir, + g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension, + relPathAsString(),TRUE,TRUE,g_globals.dynSectionId + ); + } + g_globals.dynSectionId++; + return TemplateVariant(result.data(),TRUE); + } + + TemplateVariant includeInfo() const + { + if (m_classDef->includeInfo()) + { + return TemplateVariant(&m_includeInfo); + } + else + { + return TemplateVariant(FALSE); + } + } + TemplateVariant includeStatement() const + { + return m_classDef->includeStatement(); + } + TemplateVariant inherits() const + { + if (!m_cache.inheritsList) + { + m_cache.inheritsList.reset(new InheritanceListContext(m_classDef->baseClasses(),TRUE)); + } + return m_cache.inheritsList.get(); + } + TemplateVariant inheritedBy() const + { + if (!m_cache.inheritedByList) + { + m_cache.inheritedByList.reset(new InheritanceListContext(m_classDef->subClasses(),FALSE)); + } + return m_cache.inheritedByList.get(); + } + TemplateVariant getMemberList(ScopedPtr<MemberListInfoContext> &list, + MemberListType type,const char *title,bool detailed=FALSE) const + { + if (!list) + { + MemberList *ml = m_classDef->getMemberList(type); + if (ml) + { + list.reset(new MemberListInfoContext(m_classDef,relPathAsString(),ml,title,detailed)); + } + } + if (list) + { + return list.get(); + } + else + { + return TemplateVariant(FALSE); + } + } + TemplateVariant unoIDLServices() const + { + return getMemberList(m_cache.unoIDLServices,MemberListType_services,theTranslator->trServices()); + } + TemplateVariant unoIDLInterfaces() const + { + return getMemberList(m_cache.unoIDLInterfaces,MemberListType_interfaces,theTranslator->trInterfaces()); + } + TemplateVariant signals() const + { + return getMemberList(m_cache.signals,MemberListType_signals,theTranslator->trSignals()); + } + TemplateVariant publicTypes() const + { + return getMemberList(m_cache.publicTypes,MemberListType_pubTypes,theTranslator->trPublicTypes()); + } + TemplateVariant publicMethods() const + { + return getMemberList(m_cache.publicMethods,MemberListType_pubMethods, + m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trInstanceMethods() + : theTranslator->trPublicMembers()); + } + TemplateVariant publicStaticMethods() const + { + return getMemberList(m_cache.publicStaticMethods,MemberListType_pubStaticMethods, + m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trClassMethods() + : theTranslator->trStaticPublicMembers()); + } + TemplateVariant publicAttributes() const + { + return getMemberList(m_cache.publicAttributes,MemberListType_pubAttribs,theTranslator->trPublicAttribs()); + } + TemplateVariant publicStaticAttributes() const + { + return getMemberList(m_cache.publicStaticAttributes,MemberListType_pubStaticAttribs,theTranslator->trStaticPublicAttribs()); + } + TemplateVariant publicSlots() const + { + return getMemberList(m_cache.publicSlots,MemberListType_pubSlots,theTranslator->trPublicSlots()); + } + TemplateVariant protectedTypes() const + { + return getMemberList(m_cache.protectedTypes,MemberListType_proTypes,theTranslator->trProtectedTypes()); + } + TemplateVariant protectedMethods() const + { + return getMemberList(m_cache.protectedMethods,MemberListType_proMethods,theTranslator->trProtectedMembers()); + } + TemplateVariant protectedStaticMethods() const + { + return getMemberList(m_cache.protectedStaticMethods,MemberListType_proStaticMethods,theTranslator->trStaticProtectedMembers()); + } + TemplateVariant protectedAttributes() const + { + return getMemberList(m_cache.protectedAttributes,MemberListType_proAttribs,theTranslator->trProtectedAttribs()); + } + TemplateVariant protectedStaticAttributes() const + { + return getMemberList(m_cache.protectedStaticAttributes,MemberListType_proStaticAttribs,theTranslator->trStaticProtectedAttribs()); + } + TemplateVariant protectedSlots() const + { + return getMemberList(m_cache.protectedSlots,MemberListType_proSlots,theTranslator->trProtectedSlots()); + } + TemplateVariant privateTypes() const + { + return getMemberList(m_cache.privateTypes,MemberListType_priTypes,theTranslator->trPrivateTypes()); + } + TemplateVariant privateSlots() const + { + return getMemberList(m_cache.privateSlots,MemberListType_priSlots,theTranslator->trPrivateSlots()); + } + TemplateVariant privateMethods() const + { + return getMemberList(m_cache.privateMethods,MemberListType_priMethods,theTranslator->trPrivateMembers()); + } + TemplateVariant privateStaticMethods() const + { + return getMemberList(m_cache.privateStaticMethods,MemberListType_priStaticMethods,theTranslator->trStaticPrivateMembers()); + } + TemplateVariant privateAttributes() const + { + return getMemberList(m_cache.privateAttributes,MemberListType_priAttribs,theTranslator->trPrivateAttribs()); + } + TemplateVariant privateStaticAttributes() const + { + return getMemberList(m_cache.privateStaticAttributes,MemberListType_priStaticAttribs,theTranslator->trStaticPrivateAttribs()); + } + TemplateVariant packageTypes() const + { + return getMemberList(m_cache.packageTypes,MemberListType_pacTypes,theTranslator->trPackageTypes()); + } + TemplateVariant packageMethods() const + { + return getMemberList(m_cache.packageMethods,MemberListType_pacMethods,theTranslator->trPackageMembers()); + } + TemplateVariant packageStaticMethods() const + { + return getMemberList(m_cache.packageStaticMethods,MemberListType_pacStaticMethods,theTranslator->trStaticPackageMembers()); + } + TemplateVariant packageAttributes() const + { + return getMemberList(m_cache.packageAttributes,MemberListType_pacAttribs,theTranslator->trPackageAttribs()); + } + TemplateVariant packageStaticAttributes() const + { + return getMemberList(m_cache.packageStaticAttributes,MemberListType_pacStaticAttribs,theTranslator->trStaticPackageAttribs()); + } + TemplateVariant properties() const + { + return getMemberList(m_cache.properties,MemberListType_properties,theTranslator->trProperties()); + } + TemplateVariant events() const + { + return getMemberList(m_cache.events,MemberListType_events,theTranslator->trEvents()); + } + TemplateVariant friends() const + { + return getMemberList(m_cache.friends,MemberListType_friends,theTranslator->trFriends()); + } + TemplateVariant related() const + { + return getMemberList(m_cache.related,MemberListType_related,theTranslator->trRelatedFunctions()); + } + TemplateVariant detailedTypedefs() const + { + return getMemberList(m_cache.detailedTypedefs,MemberListType_typedefMembers,theTranslator->trMemberTypedefDocumentation(),TRUE); + } + TemplateVariant detailedEnums() const + { + return getMemberList(m_cache.detailedEnums,MemberListType_enumMembers,theTranslator->trMemberEnumerationDocumentation(),TRUE); + } + TemplateVariant detailedServices() const + { + return getMemberList(m_cache.detailedServices,MemberListType_serviceMembers,theTranslator->trServices(),TRUE); + } + TemplateVariant detailedInterfaces() const + { + return getMemberList(m_cache.detailedInterfaces,MemberListType_interfaceMembers,theTranslator->trInterfaces(),TRUE); + } + TemplateVariant detailedConstructors() const + { + return getMemberList(m_cache.detailedConstructors,MemberListType_constructors,theTranslator->trConstructorDocumentation(),TRUE); + } + TemplateVariant detailedMethods() const + { + return getMemberList(m_cache.detailedMethods,MemberListType_functionMembers,theTranslator->trMemberFunctionDocumentation(),TRUE); + } + TemplateVariant detailedRelated() const + { + return getMemberList(m_cache.detailedRelated,MemberListType_relatedMembers,theTranslator->trRelatedFunctionDocumentation(),TRUE); + } + TemplateVariant detailedVariables() const + { + return getMemberList(m_cache.detailedVariables,MemberListType_variableMembers,theTranslator->trMemberDataDocumentation(),TRUE); + } + TemplateVariant detailedProperties() const + { + return getMemberList(m_cache.detailedProperties,MemberListType_propertyMembers,theTranslator->trPropertyDocumentation(),TRUE); + } + TemplateVariant detailedEvents() const + { + return getMemberList(m_cache.detailedEvents,MemberListType_eventMembers,theTranslator->trEventDocumentation(),TRUE); + } + TemplateVariant nestedClasses() const + { + static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); + static bool hideUndocClasses = Config_getBool("HIDE_UNDOC_CLASSES"); + static bool extractLocalClasses = Config_getBool("EXTRACT_LOCAL_CLASSES"); + if (!m_cache.nestedClasses) + { + NestedClassListContext *classList = new NestedClassListContext; + if (m_classDef->getClassSDict()) + { + ClassSDict::Iterator sdi(*m_classDef->getClassSDict()); + ClassDef *cd; + for (sdi.toFirst();(cd=sdi.current());++sdi) + { + bool linkable = cd->isLinkable(); + if (cd->name().find('@')==-1 && !cd->isExtension() && + (cd->protection()!=::Private || extractPrivate) && + (linkable || + (!hideUndocClasses && (!cd->isLocal() || extractLocalClasses))) + ) + { + classList->append(cd); + } + } + } + m_cache.nestedClasses.reset(classList); + } + return m_cache.nestedClasses.get(); + } + TemplateVariant compoundType() const + { + return m_classDef->compoundTypeString(); + } + void addTemplateDecls(Definition *d,TemplateList *tl) const + { + if (d->definitionType()==Definition::TypeClass) + { + Definition *parent = d->getOuterScope(); + if (parent) + { + addTemplateDecls(parent,tl); + } + ClassDef *cd=(ClassDef *)d; + if (cd->templateArguments()) + { + ArgumentListContext *al = new ArgumentListContext(cd->templateArguments(),cd,relPathAsString()); + // since a TemplateVariant does take ownership of the object, we add it + // a separate list just to be able to delete it and avoid a memory leak + m_cache.templateArgList.append(al); + tl->append(al); + } + } + } + void addExamples(TemplateList *list) const + { + if (m_classDef->hasExamples()) + { + ExampleSDict::Iterator it(*m_classDef->exampleList()); + Example *ex; + for (it.toFirst();(ex=it.current());++it) + { + TemplateStruct *s = new TemplateStruct; + m_cache.exampleList.append(s); + s->set("text",ex->name); + s->set("isLinkable",TRUE); + s->set("anchor",ex->anchor); + s->set("fileName",ex->file); + list->append(s); + } + } + } + TemplateVariant templateDecls() const + { + if (!m_cache.templateDecls) + { + TemplateList *tl = new TemplateList; + addTemplateDecls(m_classDef,tl); + m_cache.templateDecls.reset(tl); + } + return m_cache.templateDecls.get(); + } + TemplateVariant typeConstraints() const + { + if (!m_cache.typeConstraints && m_classDef->typeConstraints()) + { + m_cache.typeConstraints.reset(new ArgumentListContext(m_classDef->typeConstraints(),m_classDef,relPathAsString())); + } + else + { + m_cache.typeConstraints.reset(new ArgumentListContext); + } + return m_cache.typeConstraints.get(); + } + TemplateVariant examples() const + { + if (!m_cache.examples) + { + TemplateList *exampleList = new TemplateList; + addExamples(exampleList); + m_cache.examples.reset(exampleList); + } + return m_cache.examples.get(); + } + void addMembers(ClassDef *cd,MemberListType lt) const + { + MemberList *ml = cd->getMemberList(lt); + if (ml) + { + MemberListIterator li(*ml); + const MemberDef *md; + for (li.toFirst();(md=li.current());++li) + { + if (md->isBriefSectionVisible()) + { + m_cache.allMembers.append(md); + } + } + } + } + TemplateVariant members() const + { + if (!m_cache.members) + { + addMembers(m_classDef,MemberListType_pubTypes); + addMembers(m_classDef,MemberListType_services); + addMembers(m_classDef,MemberListType_interfaces); + addMembers(m_classDef,MemberListType_pubSlots); + addMembers(m_classDef,MemberListType_signals); + addMembers(m_classDef,MemberListType_pubMethods); + addMembers(m_classDef,MemberListType_pubStaticMethods); + addMembers(m_classDef,MemberListType_pubAttribs); + addMembers(m_classDef,MemberListType_pubStaticAttribs); + addMembers(m_classDef,MemberListType_proTypes); + addMembers(m_classDef,MemberListType_proSlots); + addMembers(m_classDef,MemberListType_proMethods); + addMembers(m_classDef,MemberListType_proStaticMethods); + addMembers(m_classDef,MemberListType_proAttribs); + addMembers(m_classDef,MemberListType_proStaticAttribs); + addMembers(m_classDef,MemberListType_pacTypes); + addMembers(m_classDef,MemberListType_pacMethods); + addMembers(m_classDef,MemberListType_pacStaticMethods); + addMembers(m_classDef,MemberListType_pacAttribs); + addMembers(m_classDef,MemberListType_pacStaticAttribs); + addMembers(m_classDef,MemberListType_properties); + addMembers(m_classDef,MemberListType_events); + addMembers(m_classDef,MemberListType_priTypes); + addMembers(m_classDef,MemberListType_priSlots); + addMembers(m_classDef,MemberListType_priMethods); + addMembers(m_classDef,MemberListType_priStaticMethods); + addMembers(m_classDef,MemberListType_priAttribs); + addMembers(m_classDef,MemberListType_priStaticAttribs); + addMembers(m_classDef,MemberListType_related); + m_cache.members.reset(new MemberListContext(&m_cache.allMembers)); + } + return m_cache.members.get(); + } + TemplateVariant allMembersList() const + { + if (!m_cache.allMembersList && m_classDef->memberNameInfoSDict()) + { + AllMembersListContext *ml = new AllMembersListContext(m_classDef->memberNameInfoSDict()); + m_cache.allMembersList.reset(ml); + } + else + { + m_cache.allMembersList.reset(new AllMembersListContext); + } + return m_cache.allMembersList.get(); + } + TemplateVariant allMembersFileName() const + { + return m_classDef->getMemberListFileName(); + } + TemplateVariant memberGroups() const + { + if (!m_cache.memberGroups) + { + if (m_classDef->getMemberGroupSDict()) + { + m_cache.memberGroups.reset(new MemberGroupListContext(m_classDef,relPathAsString(),m_classDef->getMemberGroupSDict(),m_classDef->subGrouping())); + } + else + { + m_cache.memberGroups.reset(new MemberGroupListContext); + } + } + return m_cache.memberGroups.get(); + } + TemplateVariant additionalInheritedMembers() const + { + if (!m_cache.additionalInheritedMembers) + { + InheritedMemberInfoListContext *ctx = new InheritedMemberInfoListContext; + ctx->addMemberList(m_classDef,MemberListType_pubTypes,theTranslator->trPublicTypes()); + ctx->addMemberList(m_classDef,MemberListType_services,theTranslator->trServices()); + ctx->addMemberList(m_classDef,MemberListType_interfaces,theTranslator->trInterfaces()); + ctx->addMemberList(m_classDef,MemberListType_pubSlots,theTranslator->trPublicSlots()); + ctx->addMemberList(m_classDef,MemberListType_signals,theTranslator->trSignals()); + ctx->addMemberList(m_classDef,MemberListType_pubMethods, + m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trInstanceMethods() + : theTranslator->trPublicMembers()); + ctx->addMemberList(m_classDef,MemberListType_pubStaticMethods, + m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trClassMethods() + : theTranslator->trStaticPublicMembers()); + ctx->addMemberList(m_classDef,MemberListType_pubAttribs,theTranslator->trPublicAttribs()); + ctx->addMemberList(m_classDef,MemberListType_pubStaticAttribs,theTranslator->trStaticPublicAttribs()); + ctx->addMemberList(m_classDef,MemberListType_proTypes,theTranslator->trProtectedTypes()); + ctx->addMemberList(m_classDef,MemberListType_proSlots,theTranslator->trProtectedSlots()); + ctx->addMemberList(m_classDef,MemberListType_proMethods,theTranslator->trProtectedMembers()); + ctx->addMemberList(m_classDef,MemberListType_proStaticMethods,theTranslator->trStaticProtectedMembers()); + ctx->addMemberList(m_classDef,MemberListType_proAttribs,theTranslator->trProtectedAttribs()); + ctx->addMemberList(m_classDef,MemberListType_proStaticAttribs,theTranslator->trStaticProtectedAttribs()); + ctx->addMemberList(m_classDef,MemberListType_pacTypes,theTranslator->trPackageTypes()); + ctx->addMemberList(m_classDef,MemberListType_pacMethods,theTranslator->trPackageMembers()); + ctx->addMemberList(m_classDef,MemberListType_pacStaticMethods,theTranslator->trStaticPackageMembers()); + ctx->addMemberList(m_classDef,MemberListType_pacAttribs,theTranslator->trPackageAttribs()); + ctx->addMemberList(m_classDef,MemberListType_pacStaticAttribs,theTranslator->trStaticPackageAttribs()); + ctx->addMemberList(m_classDef,MemberListType_properties,theTranslator->trProperties()); + ctx->addMemberList(m_classDef,MemberListType_events,theTranslator->trEvents()); + ctx->addMemberList(m_classDef,MemberListType_priTypes,theTranslator->trPrivateTypes()); + ctx->addMemberList(m_classDef,MemberListType_priSlots,theTranslator->trPrivateSlots()); + ctx->addMemberList(m_classDef,MemberListType_priMethods,theTranslator->trPrivateMembers()); + ctx->addMemberList(m_classDef,MemberListType_priStaticMethods,theTranslator->trStaticPrivateMembers()); + ctx->addMemberList(m_classDef,MemberListType_priAttribs,theTranslator->trPrivateAttribs()); + ctx->addMemberList(m_classDef,MemberListType_priStaticAttribs,theTranslator->trStaticPrivateAttribs()); + ctx->addMemberList(m_classDef,MemberListType_related,theTranslator->trRelatedFunctions()); + m_cache.additionalInheritedMembers.reset(ctx); + } + return m_cache.additionalInheritedMembers.get(); + } + + private: + ClassDef *m_classDef; + UsedFilesContext m_usedFiles; + IncludeInfoContext m_includeInfo; + struct Cachable + { + Cachable() : inheritanceNodes(-1) + { + templateArgList.setAutoDelete(TRUE); + exampleList.setAutoDelete(TRUE); + allMembers.setAutoDelete(TRUE); + } + ScopedPtr<InheritanceListContext> inheritsList; + ScopedPtr<InheritanceListContext> inheritedByList; + ScopedPtr<DotClassGraph> classGraph; + ScopedPtr<DotClassGraph> collaborationGraph; + ScopedPtr<NestedClassListContext> nestedClasses; + ScopedPtr<MemberListInfoContext> publicTypes; + ScopedPtr<MemberListInfoContext> publicMethods; + ScopedPtr<MemberListInfoContext> publicStaticMethods; + ScopedPtr<MemberListInfoContext> publicAttributes; + ScopedPtr<MemberListInfoContext> publicStaticAttributes; + ScopedPtr<MemberListInfoContext> publicSlots; + ScopedPtr<MemberListInfoContext> protectedTypes; + ScopedPtr<MemberListInfoContext> protectedMethods; + ScopedPtr<MemberListInfoContext> protectedStaticMethods; + ScopedPtr<MemberListInfoContext> protectedAttributes; + ScopedPtr<MemberListInfoContext> protectedStaticAttributes; + ScopedPtr<MemberListInfoContext> protectedSlots; + ScopedPtr<MemberListInfoContext> privateTypes; + ScopedPtr<MemberListInfoContext> privateMethods; + ScopedPtr<MemberListInfoContext> privateStaticMethods; + ScopedPtr<MemberListInfoContext> privateAttributes; + ScopedPtr<MemberListInfoContext> privateStaticAttributes; + ScopedPtr<MemberListInfoContext> privateSlots; + ScopedPtr<MemberListInfoContext> packageTypes; + ScopedPtr<MemberListInfoContext> packageMethods; + ScopedPtr<MemberListInfoContext> packageStaticMethods; + ScopedPtr<MemberListInfoContext> packageAttributes; + ScopedPtr<MemberListInfoContext> packageStaticAttributes; + ScopedPtr<MemberListInfoContext> unoIDLServices; + ScopedPtr<MemberListInfoContext> unoIDLInterfaces; + ScopedPtr<MemberListInfoContext> signals; + ScopedPtr<MemberListInfoContext> properties; + ScopedPtr<MemberListInfoContext> events; + ScopedPtr<MemberListInfoContext> friends; + ScopedPtr<MemberListInfoContext> related; + ScopedPtr<MemberListInfoContext> detailedTypedefs; + ScopedPtr<MemberListInfoContext> detailedEnums; + ScopedPtr<MemberListInfoContext> detailedServices; + ScopedPtr<MemberListInfoContext> detailedInterfaces; + ScopedPtr<MemberListInfoContext> detailedConstructors; + ScopedPtr<MemberListInfoContext> detailedMethods; + ScopedPtr<MemberListInfoContext> detailedRelated; + ScopedPtr<MemberListInfoContext> detailedVariables; + ScopedPtr<MemberListInfoContext> detailedProperties; + ScopedPtr<MemberListInfoContext> detailedEvents; + ScopedPtr<MemberGroupListContext> memberGroups; + ScopedPtr<AllMembersListContext> allMembersList; + ScopedPtr<ArgumentListContext> typeConstraints; + ScopedPtr<TemplateList> examples; + ScopedPtr<TemplateList> templateDecls; + ScopedPtr<InheritedMemberInfoListContext> additionalInheritedMembers; + ScopedPtr<MemberListContext> members; + QList<ArgumentListContext> templateArgList; + int inheritanceNodes; + QList<TemplateStruct> exampleList; + MemberList allMembers; + }; + mutable Cachable m_cache; +}; +//%% } + +ClassContext::ClassContext(ClassDef *cd) +{ + //printf("ClassContext::ClassContext(%s)\n",cd?cd->name().data():"<none>"); + p = new Private(cd); +} + +ClassContext::~ClassContext() +{ + delete p; +} + +TemplateVariant ClassContext::get(const char *n) const +{ + return p->get(n); +} + +//------------------------------------------------------------------------ + +//%% struct Namespace(Symbol): namespace information +//%% { +class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Private> +{ + public: + Private(NamespaceDef *nd) : DefinitionContext<NamespaceContext::Private>(nd) , m_namespaceDef(nd) + { + addProperty("title",this,&Private::title); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subHighlight); + } + TemplateVariant title() const + { + return TemplateVariant(m_namespaceDef->title()); + } + TemplateVariant highlight() const + { + return TemplateVariant("namespaces"); + } + TemplateVariant subHighlight() const + { + return TemplateVariant(""); + } + private: + NamespaceDef *m_namespaceDef; +}; +//%% } + +NamespaceContext::NamespaceContext(NamespaceDef *nd) +{ + p = new Private(nd); +} + +NamespaceContext::~NamespaceContext() +{ + delete p; +} + +TemplateVariant NamespaceContext::get(const char *n) const +{ + return p->get(n); +} + +//------------------------------------------------------------------------ + +//%% struct File(Symbol): file information +//%% { +class FileContext::Private : public DefinitionContext<FileContext::Private> +{ + public: + Private(FileDef *fd) : DefinitionContext<FileContext::Private>(fd) , m_fileDef(fd) + { + addProperty("title",this,&Private::title); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subHighlight); + addProperty("versionInfo",this,&Private::versionInfo); + } + TemplateVariant title() const + { + return m_fileDef->title(); + } + TemplateVariant highlight() const + { + return TemplateVariant("files"); + } + TemplateVariant subHighlight() const + { + return TemplateVariant(""); + } + TemplateVariant versionInfo() const + { + return m_fileDef->getVersion(); + } + private: + FileDef *m_fileDef; +}; +//%% } + +FileContext::FileContext(FileDef *fd) +{ + p = new Private(fd); +} + +FileContext::~FileContext() +{ + delete p; +} + +TemplateVariant FileContext::get(const char *n) const +{ + return p->get(n); +} + +//------------------------------------------------------------------------ + +//%% struct Dir(Symbol): directory information +//%% { +class DirContext::Private : public DefinitionContext<DirContext::Private> +{ + public: + Private(DirDef *dd) : DefinitionContext<DirContext::Private>(dd) , m_dirDef(dd) + { + addProperty("title",this,&Private::title); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subHighlight); + addProperty("dirName",this,&Private::dirName); + } + TemplateVariant title() const + { + return TemplateVariant(m_dirDef->shortTitle()); + } + TemplateVariant highlight() const + { + return TemplateVariant("files"); + } + TemplateVariant subHighlight() const + { + return TemplateVariant(""); + } + TemplateVariant dirName() const + { + return TemplateVariant(m_dirDef->shortName()); + } + private: + DirDef *m_dirDef; +}; +//%% } + +DirContext::DirContext(DirDef *fd) +{ + p = new Private(fd); +} + +DirContext::~DirContext() +{ + delete p; +} + +TemplateVariant DirContext::get(const char *n) const +{ + return p->get(n); +} + + +//------------------------------------------------------------------------ + +//%% struct Page(Symbol): page information +//%% { +class PageContext::Private : public DefinitionContext<PageContext::Private> +{ + public: + Private(PageDef *pd) : DefinitionContext<PageContext::Private>(pd) , m_pageDef(pd) + { + addProperty("title",this,&Private::title); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subHighlight); + } + TemplateVariant title() const + { + return TemplateVariant(m_pageDef->title()); + } + TemplateVariant highlight() const + { + return TemplateVariant("pages"); + } + TemplateVariant subHighlight() const + { + return TemplateVariant(""); + } + private: + PageDef *m_pageDef; +}; +//%% } + +PageContext::PageContext(PageDef *pd) +{ + p = new Private(pd); +} + +PageContext::~PageContext() +{ + delete p; +} + +TemplateVariant PageContext::get(const char *n) const +{ + return p->get(n); +} + +//------------------------------------------------------------------------ + +class TextGeneratorHtml : public TextGeneratorIntf +{ + public: + TextGeneratorHtml(FTextStream &ts,const QCString &relPath) + : m_ts(ts), m_relPath(relPath) {} + void writeString(const char *s,bool keepSpaces) const + { + if (s==0) return; + //printf("TextGeneratorOlImpl::writeString('%s',%d)\n",s,keepSpaces); + if (keepSpaces) + { + const char *p=s; + char c; + while ((c=*p++)) + { + switch(c) + { + case '<': m_ts << "<"; break; + case '>': m_ts << ">"; break; + case '\'': m_ts << "'"; break; + case '"': m_ts << """; break; + case '&': m_ts << "&"; break; + case ' ': m_ts << " "; break; + } + } + } + else + { + m_ts << convertToHtml(s); + } + } + + void writeBreak(int indent) const + { + m_ts << "<br/>"; + for (int i=0;i<indent;i++) + { + m_ts << " "; + } + } + + void writeLink(const char *ref,const char *f, + const char *anchor,const char *name + ) const + { + if (ref) + { + m_ts << "<a class=\"elRef\" "; + m_ts << externalLinkTarget() << externalRef(m_relPath,ref,FALSE); + } + else + { + m_ts << "<a class=\"el\" "; + } + m_ts << "href=\""; + m_ts << externalRef(m_relPath,ref,TRUE); + if (f) m_ts << f << Doxygen::htmlFileExtension; + if (anchor) m_ts << "#" << anchor; + m_ts << "\">"; + m_ts << convertToHtml(name); + m_ts << "</a>"; + } + + private: + FTextStream &m_ts; + QCString m_relPath; +}; + +class TextGeneratorFactory +{ + public: + static TextGeneratorFactory *instance() + { + static TextGeneratorFactory *instance = 0; + if (instance==0) instance = new TextGeneratorFactory; + return instance; + } + TextGeneratorIntf *create(FTextStream &ts,const QCString &relPath) + { + switch (g_globals.outputFormat) + { + case ContextGlobals::Html: + return new TextGeneratorHtml(ts,relPath); + break; + default: + break; + } + return 0; + } + private: + TextGeneratorFactory() {} + virtual ~TextGeneratorFactory() {} +}; + +TemplateVariant createLinkedText(Definition *def,const QCString &relPath,const QCString &text) +{ + QGString s; + FTextStream ts(&s); + TextGeneratorIntf *tg = TextGeneratorFactory::instance()->create(ts,relPath); + if (tg) + { + linkifyText(*tg,def->getOuterScope(),def->getBodyDef(),def,text); + return TemplateVariant(s.data(),TRUE); + } + else + { + return text; + } +} + +//%% struct Member(Symbol): member information +//%% { +class MemberContext::Private : public DefinitionContext<MemberContext::Private> +{ + public: + Private(MemberDef *md) : DefinitionContext<MemberContext::Private>(md) , m_memberDef(md) + { + addProperty("declType", this,&Private::declType); + addProperty("declArgs", this,&Private::declArgs); + addProperty("isStatic", this,&Private::isStatic); + addProperty("isObjCMethod", this,&Private::isObjCMethod); + addProperty("isObjCProperty", this,&Private::isObjCProperty); + addProperty("isDefine", this,&Private::isDefine); + addProperty("isImplementation", this,&Private::isImplementation); + addProperty("isEvent", this,&Private::isEvent); + addProperty("isProperty", this,&Private::isProperty); + addProperty("isEnumeration", this,&Private::isEnumeration); + addProperty("isEnumValue", this,&Private::isEnumValue); + addProperty("isAnonymous", this,&Private::isAnonymous); + addProperty("anonymousType", this,&Private::anonymousType); + addProperty("anonymousMember", this,&Private::anonymousMember); + addProperty("isRelated", this,&Private::isRelated); + addProperty("hasDetails", this,&Private::hasDetails); + addProperty("exception", this,&Private::exception); + addProperty("bitfields", this,&Private::bitfields); + addProperty("initializer", this,&Private::initializer); + addProperty("initializerAsCode", this,&Private::initializerAsCode); + addProperty("hasOneLineInitializer", this,&Private::hasOneLineInitializer); + addProperty("hasMultiLineInitializer", this,&Private::hasMultiLineInitializer); + addProperty("templateArgs", this,&Private::templateArgs); + addProperty("templateAlias", this,&Private::templateAlias); + addProperty("propertyAttrs", this,&Private::propertyAttrs); + addProperty("eventAttrs", this,&Private::eventAttrs); + addProperty("class", this,&Private::getClass); + addProperty("definition", this,&Private::definition); + addProperty("parameters", this,&Private::parameters); + addProperty("hasParameterList", this,&Private::hasParameterList); + addProperty("hasConstQualifier", this,&Private::hasConstQualifier); + addProperty("hasVolatileQualifier",this,&Private::hasVolatileQualifier); + addProperty("trailingReturnType", this,&Private::trailingReturnType); + addProperty("extraTypeChars", this,&Private::extraTypeChars); + addProperty("templateDecls", this,&Private::templateDecls); + addProperty("labels", this,&Private::labels); + addProperty("enumBaseType", this,&Private::enumBaseType); + addProperty("enumValues", this,&Private::enumValues); + addProperty("paramDocs", this,&Private::paramDocs); + addProperty("reimplements", this,&Private::reimplements); + addProperty("implements", this,&Private::implements); + addProperty("reimplementedBy", this,&Private::reimplementedBy); + addProperty("implementedBy", this,&Private::implementedBy); + addProperty("examples", this,&Private::examples); + addProperty("typeConstraints", this,&Private::typeConstraints); + addProperty("functionQualifier", this,&Private::functionQualifier); + addProperty("sourceRefs", this,&Private::sourceRefs); + addProperty("sourceRefBys", this,&Private::sourceRefBys); + addProperty("hasSources", this,&Private::hasSources); + addProperty("sourceCode", this,&Private::sourceCode); + addProperty("hasCallGraph", this,&Private::hasCallGraph); + addProperty("callGraph", this,&Private::callGraph); + addProperty("hasCallerGraph", this,&Private::hasCallerGraph); + addProperty("callerGraph", this,&Private::callerGraph); + + if (md && md->isProperty()) + { + if (md->isGettable()) m_propertyAttrs.append("get"); + if (md->isSettable()) m_propertyAttrs.append("set"); + } + if (md && md->isEvent()) + { + if (md->isAddable()) m_eventAttrs.append("add"); + if (md->isRemovable()) m_eventAttrs.append("remove"); + if (md->isRaisable()) m_eventAttrs.append("raise"); + } + } + TemplateVariant declType() const + { + return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->getDeclType()); + } + TemplateVariant declArgs() const + { + return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->argsString()); + } + TemplateVariant exception() const + { + return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->excpString()); + } + TemplateVariant bitfields() const + { + return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->bitfieldString()); + } + TemplateVariant isStatic() const + { + return m_memberDef->isStatic(); + } + TemplateVariant isObjCMethod() const + { + return m_memberDef->isObjCMethod(); + } + TemplateVariant isObjCProperty() const + { + return m_memberDef->isObjCProperty(); + } + TemplateVariant isImplementation() const + { + return m_memberDef->isImplementation(); + } + TemplateVariant isEvent() const + { + return m_memberDef->isEvent(); + } + TemplateVariant isProperty() const + { + return m_memberDef->isProperty(); + } + TemplateVariant isEnumValue() const + { + return m_memberDef->isEnumValue(); + } + TemplateVariant isEnumeration() const + { + return m_memberDef->isEnumerate(); + } + TemplateVariant hasDetails() const + { + return m_memberDef->isDetailedSectionLinkable(); + } + TemplateVariant initializer() const + { + return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->initializer()); + } + TemplateVariant initializerAsCode() const + { + if (!m_cache.initializerParsed) + { + QCString scopeName; + if (m_memberDef->getClassDef()) + { + scopeName = m_memberDef->getClassDef()->name(); + } + else if (m_memberDef->getNamespaceDef()) + { + scopeName = m_memberDef->getNamespaceDef()->name(); + } + m_cache.initializer = parseCode(m_memberDef,scopeName,relPathAsString(), + m_memberDef->initializer()); + m_cache.initializerParsed = TRUE; + } + return m_cache.initializer; + } + TemplateVariant isDefine() const + { + return m_memberDef->isDefine(); + } + TemplateVariant isAnonymous() const + { + QCString name = m_memberDef->name(); + return !name.isEmpty() && name.at(0)=='@'; + } + TemplateVariant anonymousType() const + { + if (!m_cache.anonymousType) + { + ClassDef *cd = m_memberDef->getClassDefOfAnonymousType(); + if (cd) + { + m_cache.anonymousType.reset(new ClassContext(cd)); + } + } + if (m_cache.anonymousType) + { + return m_cache.anonymousType.get(); + } + else + { + return FALSE; + } + } + TemplateVariant anonymousMember() const + { + if (!m_cache.anonymousMember) + { + MemberDef *md = m_memberDef->fromAnonymousMember(); + if (md) + { + m_cache.anonymousMember.reset(new MemberContext(md)); + } + } + if (m_cache.anonymousMember) + { + return m_cache.anonymousMember.get(); + } + else + { + return FALSE; + } + } + TemplateVariant isRelated() const + { + return m_memberDef->isRelated(); + } + TemplateVariant enumBaseType() const + { + return m_memberDef->enumBaseType(); + } + TemplateVariant hasOneLineInitializer() const + { + return m_memberDef->hasOneLineInitializer(); + } + TemplateVariant hasMultiLineInitializer() const + { + return m_memberDef->hasMultiLineInitializer(); + } + TemplateVariant enumValues() const + { + if (!m_cache.enumValues) + { + MemberList *ml = m_memberDef->enumFieldList(); + if (ml) + { + m_cache.enumValues.reset(new MemberListContext(ml)); + } + else + { + m_cache.enumValues.reset(new MemberListContext); + } + } + return m_cache.enumValues.get(); + } + TemplateVariant templateArgs() const + { + if (!m_cache.templateArgs && m_memberDef->templateArguments()) + { + m_cache.templateArgs.reset(new ArgumentListContext(m_memberDef->templateArguments(),m_memberDef,relPathAsString())); + } + if (m_cache.templateArgs) + { + return m_cache.templateArgs.get(); + } + else + { + return TemplateVariant(FALSE); + } + } + TemplateVariant templateAlias() const + { + if (m_memberDef->isAlias()) + { + return createLinkedText(m_memberDef,relPathAsString(), + QCString(" = ")+m_memberDef->typeString()); + } + return ""; + } + TemplateVariant propertyAttrs() const + { + return &m_propertyAttrs; + } + TemplateVariant eventAttrs() const + { + return &m_eventAttrs; + } + TemplateVariant getClass() const + { + if (!m_cache.classDef && m_memberDef->getClassDef()) + { + m_cache.classDef.reset(new ClassContext(m_memberDef->getClassDef())); + } + if (m_cache.classDef) + { + return m_cache.classDef.get(); + } + else + { + return TemplateVariant(FALSE); + } + } + TemplateVariant definition() const + { + return createLinkedText(m_memberDef,relPathAsString(), + m_memberDef->displayDefinition()); + } + ArgumentList *getDefArgList() const + { + return (m_memberDef->isDocsForDefinition()) ? + m_memberDef->argumentList() : m_memberDef->declArgumentList(); + } + TemplateVariant parameters() const + { + if (!m_cache.arguments) + { + ArgumentList *defArgList = getDefArgList(); + if (defArgList && !m_memberDef->isProperty()) + { + m_cache.arguments.reset(new ArgumentListContext(defArgList,m_memberDef,relPathAsString())); + } + else + { + m_cache.arguments.reset(new ArgumentListContext); + } + } + return m_cache.arguments.get(); + } + TemplateVariant hasParameterList() const + { + return getDefArgList()!=0; + } + TemplateVariant hasConstQualifier() const + { + ArgumentList *al = getDefArgList(); + return al ? al->constSpecifier : FALSE; + } + TemplateVariant hasVolatileQualifier() const + { + ArgumentList *al = getDefArgList(); + return al ? al->volatileSpecifier : FALSE; + } + TemplateVariant trailingReturnType() const + { + ArgumentList *al = getDefArgList(); + if (al && !al->trailingReturnType.isEmpty()) + { + return createLinkedText(m_memberDef,relPathAsString(), + al->trailingReturnType); + } + else + { + return ""; + } + } + TemplateVariant extraTypeChars() const + { + return m_memberDef->extraTypeChars(); + } + void addTemplateDecls(TemplateList *tl) const + { + ClassDef *cd=m_memberDef->getClassDef(); + if (m_memberDef->definitionTemplateParameterLists()) + { + QListIterator<ArgumentList> ali(*m_memberDef->definitionTemplateParameterLists()); + ArgumentList *tal; + for (ali.toFirst();(tal=ali.current());++ali) + { + if (tal->count()>0) + { + ArgumentListContext *al = new ArgumentListContext(tal,m_memberDef,relPathAsString()); + m_cache.templateArgList.append(al); + tl->append(al); + } + } + } + else + { + if (cd && !m_memberDef->isRelated() && !m_memberDef->isTemplateSpecialization()) + { + QList<ArgumentList> tempParamLists; + cd->getTemplateParameterLists(tempParamLists); + //printf("#tempParamLists=%d\n",tempParamLists.count()); + QListIterator<ArgumentList> ali(tempParamLists); + ArgumentList *tal; + for (ali.toFirst();(tal=ali.current());++ali) + { + if (tal->count()>0) + { + ArgumentListContext *al = new ArgumentListContext(tal,m_memberDef,relPathAsString()); + m_cache.templateArgList.append(al); + tl->append(al); + } + } + } + if (m_memberDef->templateArguments()) // function template prefix + { + ArgumentListContext *al = new ArgumentListContext( + m_memberDef->templateArguments(),m_memberDef,relPathAsString()); + m_cache.templateArgList.append(al); + tl->append(al); + } + } + } + TemplateVariant templateDecls() const + { + if (!m_cache.templateDecls) + { + TemplateList *tl = new TemplateList; + addTemplateDecls(tl); + m_cache.templateDecls.reset(tl); + } + return m_cache.templateDecls.get(); + } + TemplateVariant labels() const + { + if (!m_cache.labels) + { + QStrList sl; + m_memberDef->getLabels(sl,m_memberDef->getOuterScope()); + TemplateList *tl = new TemplateList; + if (sl.count()>0) + { + QStrListIterator it(sl); + for (;it.current();++it) + { + tl->append(*it); + } + } + m_cache.labels.reset(tl); + } + return m_cache.labels.get(); + } + TemplateVariant paramDocs() const + { + if (!m_cache.paramDocs) + { + if (m_memberDef->argumentList() && m_memberDef->argumentList()->hasDocumentation()) + { + QCString paramDocs; + ArgumentListIterator ali(*m_memberDef->argumentList()); + Argument *a; + // convert the parameter documentation into a list of @param commands + for (ali.toFirst();(a=ali.current());++ali) + { + if (a->hasDocumentation()) + { + QCString direction = extractDirection(a->docs); + paramDocs+="@param"+direction+" "+a->name+" "+a->docs; + } + } + m_cache.paramDocs.reset(new TemplateVariant(parseDoc(m_memberDef, + m_memberDef->docFile(),m_memberDef->docLine(), + relPathAsString(),paramDocs,FALSE))); + } + else + { + m_cache.paramDocs.reset(new TemplateVariant("")); + } + } + return *m_cache.paramDocs; + } + TemplateVariant implements() const + { + if (!m_cache.implements) + { + MemberDef *md = m_memberDef->reimplements(); + m_cache.implements.reset(new TemplateList); + if (md) + { + ClassDef *cd = md->getClassDef(); + if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface)) + { + MemberContext *mc = new MemberContext(md); + m_cache.implementsMember.reset(mc); + m_cache.implements->append(mc); + } + } + } + return m_cache.implements.get(); + } + TemplateVariant reimplements() const + { + if (!m_cache.reimplements) + { + MemberDef *md = m_memberDef->reimplements(); + m_cache.reimplements.reset(new TemplateList); + if (md) + { + ClassDef *cd = md->getClassDef(); + if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface) + { + MemberContext *mc = new MemberContext(md); + m_cache.reimplementsMember.reset(mc); + m_cache.reimplements->append(mc); + } + } + } + return m_cache.reimplements.get(); + } + TemplateVariant implementedBy() const + { + if (!m_cache.implementedBy) + { + MemberList *ml = m_memberDef->reimplementedBy(); + m_cache.implementedBy.reset(new TemplateList); + if (ml) + { + MemberListIterator mli(*ml); + MemberDef *md=0; + for (mli.toFirst();(md=mli.current());++mli) + { + ClassDef *cd = md->getClassDef(); + if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface)) + { + MemberContext *mc = new MemberContext(md); + m_cache.implementedByMembers.append(mc); + m_cache.implementedBy->append(mc); + } + } + } + } + return m_cache.implementedBy.get(); + } + TemplateVariant reimplementedBy() const + { + if (!m_cache.reimplementedBy) + { + m_cache.reimplementedBy.reset(new TemplateList); + MemberList *ml = m_memberDef->reimplementedBy(); + if (ml) + { + MemberListIterator mli(*ml); + MemberDef *md=0; + for (mli.toFirst();(md=mli.current());++mli) + { + ClassDef *cd = md->getClassDef(); + if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface) + { + MemberContext *mc = new MemberContext(md); + m_cache.reimplementedByMembers.append(mc); + m_cache.reimplementedBy->append(mc); + } + } + } + } + return m_cache.reimplementedBy.get(); + } + void addExamples(TemplateList *list) const + { + if (m_memberDef->hasExamples()) + { + ExampleSDict::Iterator it(*m_memberDef->getExamples()); + Example *ex; + for (it.toFirst();(ex=it.current());++it) + { + TemplateStruct *s = new TemplateStruct; + m_cache.exampleList.append(s); + s->set("text",ex->name); + s->set("isLinkable",TRUE); + s->set("anchor",ex->anchor); + s->set("fileName",ex->file); + list->append(s); + } + } + } + TemplateVariant examples() const + { + if (!m_cache.examples) + { + TemplateList *exampleList = new TemplateList; + addExamples(exampleList); + m_cache.examples.reset(exampleList); + } + return m_cache.examples.get(); + } + TemplateVariant typeConstraints() const + { + if (!m_cache.typeConstraints && m_memberDef->typeConstraints()) + { + m_cache.typeConstraints.reset(new ArgumentListContext(m_memberDef->typeConstraints(),m_memberDef,relPathAsString())); + } + else + { + m_cache.typeConstraints.reset(new ArgumentListContext); + } + return m_cache.typeConstraints.get(); + } + TemplateVariant functionQualifier() const + { + if (!m_memberDef->isObjCMethod() && + (m_memberDef->isFunction() || m_memberDef->isSlot() || + m_memberDef->isPrototype() || m_memberDef->isSignal() + ) + ) + { + return "()"; + } + else + { + return ""; + } + } + TemplateVariant sourceRefs() const + { + if (!m_cache.sourceRefs) + { + m_cache.sourceRefs.reset(new MemberListContext(m_memberDef->getReferencesMembers(),TRUE)); + } + return m_cache.sourceRefs.get(); + } + TemplateVariant sourceRefBys() const + { + if (!m_cache.sourceRefBys) + { + m_cache.sourceRefBys.reset(new MemberListContext(m_memberDef->getReferencedByMembers(),TRUE)); + } + return m_cache.sourceRefBys.get(); + } + TemplateVariant hasSources() const + { + return TemplateVariant(m_memberDef->hasSources()); + } + TemplateVariant sourceCode() const + { + if (!m_cache.sourceCodeParsed) + { + QCString codeFragment; + FileDef *fd = m_memberDef->getBodyDef(); + int startLine = m_memberDef->getStartBodyLine(); + int endLine = m_memberDef->getEndBodyLine(); + if (fd && readCodeFragment(fd->absFilePath(), + startLine,endLine,codeFragment) + ) + { + QCString scopeName; + if (m_memberDef->getClassDef()) + { + scopeName = m_memberDef->getClassDef()->name(); + } + else if (m_memberDef->getNamespaceDef()) + { + scopeName = m_memberDef->getNamespaceDef()->name(); + } + m_cache.sourceCode = parseCode(m_memberDef,scopeName,relPathAsString(),codeFragment,startLine,endLine,TRUE); + m_cache.sourceCodeParsed = TRUE; + } + } + return m_cache.sourceCode; + } + DotCallGraph *getCallGraph() const + { + if (!m_cache.callGraph) + { + m_cache.callGraph.reset(new DotCallGraph(m_memberDef,FALSE)); + } + return m_cache.callGraph.get(); + } + TemplateVariant hasCallGraph() const + { + static bool haveDot = Config_getBool("HAVE_DOT"); + static bool callGraph = Config_getBool("CALL_GRAPH"); + if ((callGraph || m_memberDef->hasCallGraph()) && haveDot && + (m_memberDef->isFunction() || m_memberDef->isSlot() || m_memberDef->isSignal())) + { + DotCallGraph *cg = getCallGraph(); + return !cg->isTooBig() && !cg->isTrivial(); + } + return TemplateVariant(FALSE); + } + TemplateVariant callGraph() const + { + if (hasCallGraph().toBool()) + { + DotCallGraph *cg = getCallGraph(); + QGString result; + FTextStream t(&result); + cg->writeGraph(t,BITMAP, + g_globals.outputDir, + g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension, + relPathAsString(),TRUE,g_globals.dynSectionId + ); + g_globals.dynSectionId++; + return TemplateVariant(result.data(),TRUE); + } + else + { + return TemplateVariant(""); + } + } + DotCallGraph *getCallerGraph() const + { + if (!m_cache.callerGraph) + { + m_cache.callerGraph.reset(new DotCallGraph(m_memberDef,TRUE)); + } + return m_cache.callerGraph.get(); + } + TemplateVariant hasCallerGraph() const + { + static bool haveDot = Config_getBool("HAVE_DOT"); + static bool callerGraph = Config_getBool("CALLER_GRAPH"); + if ((callerGraph || m_memberDef->hasCallerGraph()) && haveDot && + (m_memberDef->isFunction() || m_memberDef->isSlot() || m_memberDef->isSignal())) + { + DotCallGraph *cg = getCallerGraph(); + return !cg->isTooBig() && !cg->isTrivial(); + } + return TemplateVariant(FALSE); + } + TemplateVariant callerGraph() const + { + if (hasCallerGraph().toBool()) + { + DotCallGraph *cg = getCallerGraph(); + QGString result; + FTextStream t(&result); + cg->writeGraph(t,BITMAP, + g_globals.outputDir, + g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension, + relPathAsString(),TRUE,g_globals.dynSectionId + ); + g_globals.dynSectionId++; + return TemplateVariant(result.data(),TRUE); + } + else + { + return TemplateVariant(""); + } + } + private: + MemberDef *m_memberDef; + struct Cachable + { + Cachable() : initializerParsed(FALSE), sourceCodeParsed(FALSE) + { + implementedByMembers.setAutoDelete(TRUE); + reimplementedByMembers.setAutoDelete(TRUE); + templateArgList.setAutoDelete(TRUE); + exampleList.setAutoDelete(TRUE); + } + ScopedPtr<ArgumentListContext> templateArgs; + ScopedPtr<ArgumentListContext> arguments; + ScopedPtr<MemberListContext> enumValues; + ScopedPtr<ClassContext> classDef; + ScopedPtr<ClassContext> anonymousType; + ScopedPtr<TemplateList> templateDecls; + ScopedPtr<TemplateVariant> paramDocs; + ScopedPtr<TemplateList> implements; + ScopedPtr<MemberContext> implementsMember; + ScopedPtr<TemplateList> reimplements; + ScopedPtr<MemberContext> reimplementsMember; + ScopedPtr<TemplateList> implementedBy; + ScopedPtr<MemberListContext> sourceRefs; + ScopedPtr<MemberListContext> sourceRefBys; + ScopedPtr<DotCallGraph> callGraph; + ScopedPtr<DotCallGraph> callerGraph; + ScopedPtr<MemberContext> anonymousMember; + QList<MemberContext> implementedByMembers; + ScopedPtr<TemplateList> reimplementedBy; + QList<MemberContext> reimplementedByMembers; + QList<ArgumentListContext> templateArgList; + ScopedPtr<TemplateList> labels; + TemplateVariant initializer; + bool initializerParsed; + TemplateVariant sourceCode; + bool sourceCodeParsed; + ScopedPtr<TemplateList> examples; + QList<TemplateStruct> exampleList; + ScopedPtr<ArgumentListContext> typeConstraints; + }; + mutable Cachable m_cache; + TemplateList m_propertyAttrs; + TemplateList m_eventAttrs; +}; +//%% } + +MemberContext::MemberContext(MemberDef *md) +{ + p = new Private(md); +} + +MemberContext::~MemberContext() +{ + delete p; +} + +TemplateVariant MemberContext::get(const char *n) const +{ + return p->get(n); +} + + +//------------------------------------------------------------------------ + +//%% struct Module(Symbol): group information +//%% { +class ModuleContext::Private : public DefinitionContext<ModuleContext::Private> +{ + public: + Private(GroupDef *gd) : DefinitionContext<ModuleContext::Private>(gd) , m_groupDef(gd) + { + addProperty("title",this,&Private::title); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subHighlight); + } + TemplateVariant title() const + { + return TemplateVariant(m_groupDef->groupTitle()); + } + TemplateVariant highlight() const + { + return TemplateVariant("modules"); + } + TemplateVariant subHighlight() const + { + return TemplateVariant(""); + } + private: + GroupDef *m_groupDef; +}; +//%% } + +ModuleContext::ModuleContext(GroupDef *gd) +{ + p = new Private(gd); +} + +ModuleContext::~ModuleContext() +{ + delete p; +} + +TemplateVariant ModuleContext::get(const char *n) const +{ + return p->get(n); +} + +//------------------------------------------------------------------------ + +//%% list NestedClassList[Class] : list of nested classes +class NestedClassListContext::Private : public GenericNodeListContext<ClassContext> +{ +}; + +NestedClassListContext::NestedClassListContext() +{ + p = new Private; +} + +NestedClassListContext::~NestedClassListContext() +{ + delete p; +} + +// TemplateListIntf +int NestedClassListContext::count() const +{ + return p->count(); +} + +TemplateVariant NestedClassListContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *NestedClassListContext::createIterator() const +{ + return p->createIterator(); +} + +void NestedClassListContext::append(ClassDef *cd) +{ + if (cd) + { + p->append(new ClassContext(cd)); + } +} + +//------------------------------------------------------------------------ + +//%% list ClassList[Class] : list of classes +class ClassListContext::Private : public GenericNodeListContext<ClassContext> +{ + public: + void addClasses(const ClassSDict &classSDict) + { + ClassSDict::Iterator cli(classSDict); + ClassDef *cd; + for (cli.toFirst() ; (cd=cli.current()) ; ++cli ) + { + if (cd->getLanguage()==SrcLangExt_VHDL && + ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS || + (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS) + ) // no architecture + { + continue; + } + if (cd->isLinkableInProject() && cd->templateMaster()==0) + { + append(new ClassContext(cd)); + } + } + } +}; + +ClassListContext::ClassListContext() +{ + p = new Private; + p->addClasses(*Doxygen::classSDict); + p->addClasses(*Doxygen::hiddenClasses); +} + +ClassListContext::~ClassListContext() +{ + delete p; +} + +// TemplateListIntf +int ClassListContext::count() const +{ + return p->count(); +} + +TemplateVariant ClassListContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *ClassListContext::createIterator() const +{ + return p->createIterator(); +} + +//------------------------------------------------------------------------ + +//%% struct ClassInheritanceNode: node in inheritance tree +//%% { +class ClassInheritanceNodeContext::Private : public PropertyMapper +{ + public: + Private(ClassDef *cd) : m_classContext(cd) + { + //%% bool is_leaf_node: true if this node does not have any children + addProperty("is_leaf_node",this,&Private::isLeafNode); + //%% ClassInheritance children: list of nested classes/namespaces + addProperty("children",this,&Private::children); + //%% Class class: class info + addProperty("class",this,&Private::getClass); + } + void addChildren(const BaseClassList *bcl,bool hideSuper) + { + if (bcl==0) return; + BaseClassListIterator bcli(*bcl); + BaseClassDef *bcd; + for (bcli.toFirst() ; (bcd=bcli.current()) ; ++bcli) + { + ClassDef *cd=bcd->classDef; + if (cd->getLanguage()==SrcLangExt_VHDL && (VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS) + { + continue; + } + + bool b; + if (cd->getLanguage()==SrcLangExt_VHDL) + { + b=hasVisibleRoot(cd->subClasses()); + } + else + { + b=hasVisibleRoot(cd->baseClasses()); + } + + if (cd->isVisibleInHierarchy() && b) // hasVisibleRoot(cd->baseClasses())) + { + bool hasChildren = !cd->visited && !hideSuper && classHasVisibleChildren(cd); + ClassInheritanceNodeContext *tnc = new ClassInheritanceNodeContext(cd); + m_children.append(tnc); + if (hasChildren) + { + //printf("Class %s at %p visited=%d\n",cd->name().data(),cd,cd->visited); + bool wasVisited=cd->visited; + cd->visited=TRUE; + if (cd->getLanguage()==SrcLangExt_VHDL) + { + tnc->addChildren(cd->baseClasses(),wasVisited); + } + else + { + tnc->addChildren(cd->subClasses(),wasVisited); + } + } + } + } + } + TemplateVariant isLeafNode() const + { + return m_children.isEmpty(); + } + TemplateVariant children() const + { + return TemplateVariant(&m_children); + } + TemplateVariant getClass() const + { + return TemplateVariant(&m_classContext); + } + private: + GenericNodeListContext<ClassInheritanceNodeContext> m_children; + ClassContext m_classContext; +}; +//%% } + +ClassInheritanceNodeContext::ClassInheritanceNodeContext(ClassDef *cd) +{ + p = new Private(cd); +} + +ClassInheritanceNodeContext::~ClassInheritanceNodeContext() +{ + delete p; +} + +TemplateVariant ClassInheritanceNodeContext::get(const char *n) const +{ + return p->get(n); +} + +void ClassInheritanceNodeContext::addChildren(const BaseClassList *bcl,bool hideSuper) +{ + p->addChildren(bcl,hideSuper); +} + +//------------------------------------------------------------------------ + +//%% list ClassInheritance[ClassInheritanceNode]: list of classes +class ClassInheritanceContext::Private : public + GenericNodeListContext<ClassInheritanceNodeContext> +{ + public: + void addClasses(const ClassSDict &classSDict) + { + ClassSDict::Iterator cli(classSDict); + ClassDef *cd; + for (cli.toFirst();(cd=cli.current());++cli) + { + bool b; + if (cd->getLanguage()==SrcLangExt_VHDL) + { + if (!(VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS) + { + continue; + } + b=!hasVisibleRoot(cd->subClasses()); + } + else + { + b=!hasVisibleRoot(cd->baseClasses()); + } + if (b) + { + if (cd->isVisibleInHierarchy()) // should it be visible + { + // new root level class + ClassInheritanceNodeContext *tnc = new ClassInheritanceNodeContext(cd); + append(tnc); + bool hasChildren = !cd->visited && classHasVisibleChildren(cd); + if (cd->getLanguage()==SrcLangExt_VHDL && hasChildren) + { + tnc->addChildren(cd->baseClasses(),cd->visited); + cd->visited=TRUE; + } + else if (hasChildren) + { + tnc->addChildren(cd->subClasses(),cd->visited); + cd->visited=TRUE; + } + } + } + } + } +}; + +ClassInheritanceContext::ClassInheritanceContext() +{ + p = new Private; + initClassHierarchy(Doxygen::classSDict); + initClassHierarchy(Doxygen::hiddenClasses); + p->addClasses(*Doxygen::classSDict); + p->addClasses(*Doxygen::hiddenClasses); +} + +ClassInheritanceContext::~ClassInheritanceContext() +{ + delete p; +} + +// TemplateListIntf +int ClassInheritanceContext::count() const +{ + return (int)p->count(); +} + +TemplateVariant ClassInheritanceContext::at(int index) const +{ + TemplateVariant result; + if (index>=0 && index<count()) + { + result = p->at(index); + } + return result; +} + +TemplateListIntf::ConstIterator *ClassInheritanceContext::createIterator() const +{ + return p->createIterator(); +} + +//------------------------------------------------------------------------ + +//%% struct ClassHierarchy: inheritance tree +//%% { +class ClassHierarchyContext::Private : public PropertyMapper +{ + public: + TemplateVariant tree() const + { + return TemplateVariant(&m_classTree); + } + TemplateVariant fileName() const + { + return "hierarchy"; + } + TemplateVariant relPath() const + { + return ""; + } + TemplateVariant highlight() const + { + return "classes"; + } + TemplateVariant subhighlight() const + { + return "classhierarchy"; + } + TemplateVariant title() const + { + static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); + if (vhdlOpt) + { + return VhdlDocGen::trDesignUnitHierarchy(); + } + else + { + return theTranslator->trClassHierarchy(); + } + } + Private() + { + //%% ClassInheritance tree + addProperty("tree",this,&Private::tree); + addProperty("fileName",this,&Private::fileName); + addProperty("relPath",this,&Private::relPath); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title",this,&Private::title); + } + private: + ClassInheritanceContext m_classTree; +}; +//%% } + +ClassHierarchyContext::ClassHierarchyContext() +{ + p = new Private; +} + +ClassHierarchyContext::~ClassHierarchyContext() +{ + delete p; +} + +TemplateVariant ClassHierarchyContext::get(const char *name) const +{ + return p->get(name); +} + +//------------------------------------------------------------------------ + +//%% struct NestingNode: node is a nesting relation tree +//%% { +class NestingNodeContext::Private : public PropertyMapper +{ + public: + Private(Definition *d,bool addCls) : m_def(d), + m_classContext(m_def->definitionType()==Definition::TypeClass?(ClassDef*)d:0), + m_namespaceContext(m_def->definitionType()==Definition::TypeNamespace?(NamespaceDef*)d:0) + { + //%% bool is_leaf_node: true if this node does not have any children + addProperty("is_leaf_node",this,&Private::isLeafNode); + //%% Nesting children: list of nested classes/namespaces + addProperty("children",this,&Private::children); + //%% [optional] Class class: class info (if this node represents a class) + addProperty("class",this,&Private::getClass); + //%% [optional] Namespace namespace: namespace info (if this node represents a namespace) + addProperty("namespace",this,&Private::getNamespace); + addNamespaces(addCls); + addClasses(); + } + TemplateVariant isLeafNode() const + { + return m_children.count()==0; + } + TemplateVariant children() const + { + return TemplateVariant(&m_children); + } + TemplateVariant getClass() const + { + if (m_def->definitionType()==Definition::TypeClass) + { + return TemplateVariant(&m_classContext); + } + else + { + return TemplateVariant(FALSE); + } + } + TemplateVariant getNamespace() const + { + if (m_def->definitionType()==Definition::TypeNamespace) + { + return TemplateVariant(&m_namespaceContext); + } + else + { + return TemplateVariant(FALSE); + } + } + void addClasses() + { + ClassDef *cd = m_def->definitionType()==Definition::TypeClass ? (ClassDef*)m_def : 0; + if (cd && cd->getClassSDict()) + { + m_children.addClasses(*cd->getClassSDict(),FALSE); + } + } + void addNamespaces(bool addClasses) + { + NamespaceDef *nd = m_def->definitionType()==Definition::TypeNamespace ? (NamespaceDef*)m_def : 0; + if (nd && nd->getNamespaceSDict()) + { + m_children.addNamespaces(*nd->getNamespaceSDict(),FALSE,addClasses); + } + if (addClasses && nd && nd->getClassSDict()) + { + m_children.addClasses(*nd->getClassSDict(),FALSE); + } + } + Definition *m_def; + private: + NestingContext m_children; + ClassContext m_classContext; + NamespaceContext m_namespaceContext; +}; +//%% } + +NestingNodeContext::NestingNodeContext(Definition *d,bool addClass) +{ + p = new Private(d,addClass); +} + +NestingNodeContext::~NestingNodeContext() +{ + delete p; +} + +TemplateVariant NestingNodeContext::get(const char *n) const +{ + return p->get(n); +} + +//------------------------------------------------------------------------ + +//%% list Nesting[NestingNode]: namespace and class nesting relations +class NestingContext::Private : public GenericNodeListContext<NestingNodeContext> +{ + public: + void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses) + { + NamespaceSDict::Iterator nli(nsDict); + NamespaceDef *nd; + for (nli.toFirst();(nd=nli.current());++nli) + { + if (nd->localName().find('@')==-1 && + (!rootOnly || nd->getOuterScope()==Doxygen::globalScope)) + { + bool hasChildren = namespaceHasVisibleChild(nd,addClasses); + bool isLinkable = nd->isLinkableInProject(); + if (isLinkable || hasChildren) + { + NestingNodeContext *nnc = new NestingNodeContext(nd,addClasses); + append(nnc); + } + } + } + } + void addClasses(const ClassSDict &clDict,bool rootOnly) + { + ClassSDict::Iterator cli(clDict); + ClassDef *cd; + for (;(cd=cli.current());++cli) + { + if (cd->getLanguage()==SrcLangExt_VHDL) + { + if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS || + (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS + )// no architecture + { + continue; + } + } + if (!rootOnly || + cd->getOuterScope()==0 || + cd->getOuterScope()==Doxygen::globalScope + ) + { + if (classVisibleInIndex(cd) && cd->templateMaster()==0) + { + NestingNodeContext *nnc = new NestingNodeContext(cd,TRUE); + append(nnc); + } + } + } + } +}; + +NestingContext::NestingContext() +{ + p = new Private; +} + +NestingContext::~NestingContext() +{ + delete p; +} + +// TemplateListIntf +int NestingContext::count() const +{ + return p->count(); +} + +TemplateVariant NestingContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *NestingContext::createIterator() const +{ + return p->createIterator(); +} + +void NestingContext::addClasses(const ClassSDict &clDict,bool rootOnly) +{ + p->addClasses(clDict,rootOnly); +} + +void NestingContext::addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses) +{ + p->addNamespaces(nsDict,rootOnly,addClasses); +} + +//------------------------------------------------------------------------ + +//%% struct ClassTree: Class nesting relations +//%% { +class ClassTreeContext::Private : public PropertyMapper +{ + public: + TemplateVariant tree() const + { + return TemplateVariant(&m_classTree); + } + TemplateVariant fileName() const + { + return "annotated"; + } + TemplateVariant relPath() const + { + return ""; + } + TemplateVariant highlight() const + { + return "classes"; + } + TemplateVariant subhighlight() const + { + return "classlist"; + } + TemplateVariant title() const + { + static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); + static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); + if (fortranOpt) + { + return theTranslator->trCompoundListFortran(); + } + else if (vhdlOpt) + { + return VhdlDocGen::trDesignUnitList(); + } + else + { + return theTranslator->trClasses(); + } + } + Private() + { + if (Doxygen::namespaceSDict) + { + m_classTree.addNamespaces(*Doxygen::namespaceSDict,TRUE,TRUE); + } + if (Doxygen::classSDict) + { + m_classTree.addClasses(*Doxygen::classSDict,TRUE); + } + //%% Nesting tree + addProperty("tree",this,&Private::tree); + addProperty("fileName",this,&Private::fileName); + addProperty("relPath",this,&Private::relPath); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title",this,&Private::title); + } + private: + NestingContext m_classTree; +}; +//%% } + +ClassTreeContext::ClassTreeContext() +{ + p = new Private; +} + +ClassTreeContext::~ClassTreeContext() +{ + delete p; +} + +TemplateVariant ClassTreeContext::get(const char *name) const +{ + return p->get(name); +} + +//------------------------------------------------------------------------ + +//%% list NamespaceList[Namespace] : list of namespaces +class NamespaceListContext::Private : public GenericNodeListContext<NamespaceContext> +{ + public: + void addNamespaces(const NamespaceSDict &nsDict) + { + NamespaceSDict::Iterator nli(nsDict); + NamespaceDef *nd; + for (nli.toFirst();(nd=nli.current());++nli) + { + if (nd->isLinkableInProject()) + { + append(new NamespaceContext(nd)); + } + } + } +}; + +NamespaceListContext::NamespaceListContext() +{ + p = new Private; + p->addNamespaces(*Doxygen::namespaceSDict); +} + +NamespaceListContext::~NamespaceListContext() +{ + delete p; +} + +// TemplateListIntf +int NamespaceListContext::count() const +{ + return p->count(); +} + +TemplateVariant NamespaceListContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *NamespaceListContext::createIterator() const +{ + return p->createIterator(); +} + +//------------------------------------------------------------------------ + +//%% struct NamespaceTree: tree of nested namespace +//%% { +class NamespaceTreeContext::Private : public PropertyMapper +{ + public: + TemplateVariant tree() const + { + return TemplateVariant(&m_namespaceTree); + } + TemplateVariant fileName() const + { + return "namespaces"; + } + TemplateVariant relPath() const + { + return ""; + } + TemplateVariant highlight() const + { + return "namespaces"; + } + TemplateVariant subhighlight() const + { + return "namespacelist"; + } + TemplateVariant title() const + { + static bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); + static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); + static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); + if (javaOpt || vhdlOpt) + { + return theTranslator->trPackages(); + } + else if (fortranOpt) + { + return theTranslator->trModulesList(); + } + else + { + return theTranslator->trNamespaceList(); + } + } + Private() + { + if (Doxygen::namespaceSDict) + { + m_namespaceTree.addNamespaces(*Doxygen::namespaceSDict,TRUE,FALSE); + } + //%% Nesting tree + addProperty("tree",this,&Private::tree); + addProperty("fileName",this,&Private::fileName); + addProperty("relPath",this,&Private::relPath); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title",this,&Private::title); + } + private: + NestingContext m_namespaceTree; +}; +//%% } + +NamespaceTreeContext::NamespaceTreeContext() +{ + p = new Private; +} + +NamespaceTreeContext::~NamespaceTreeContext() +{ + delete p; +} + +TemplateVariant NamespaceTreeContext::get(const char *name) const +{ + return p->get(name); +} + +//------------------------------------------------------------------------ + +//%% list FileList[File] : list of files +class FileListContext::Private : public GenericNodeListContext<FileContext> +{ + public: + void addFiles(const FileNameList &fnList) + { + // TODO: if FULL_PATH_NAMES is enabled, the ordering should be dir+file + FileNameListIterator fnli(fnList); + FileName *fn; + for (fnli.toFirst();(fn=fnli.current());++fnli) + { + FileNameIterator fni(*fn); + FileDef *fd; + for (fni.toFirst();(fd=fni.current());++fni) + { + bool doc = fd->isLinkableInProject(); + bool src = fd->generateSourceFile(); + bool nameOk = !fd->isDocumentationFile(); + if (nameOk && (doc || src) && !fd->isReference()) + { + append(new FileContext(fd)); + } + } + } + } +}; + +FileListContext::FileListContext() +{ + p = new Private; + if (Doxygen::inputNameList) p->addFiles(*Doxygen::inputNameList); +} + +FileListContext::~FileListContext() +{ + delete p; +} + +// TemplateListIntf +int FileListContext::count() const +{ + return p->count(); +} + +TemplateVariant FileListContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *FileListContext::createIterator() const +{ + return p->createIterator(); +} + +//------------------------------------------------------------------------ + +//%% list UsedFiles[File] : list of files +class UsedFilesContext::Private : public GenericNodeListContext<FileContext> +{ + public: + void addFile(FileDef *fd) + { + append(new FileContext(fd)); + } +}; + +UsedFilesContext::UsedFilesContext(ClassDef *cd) +{ + p = new Private; + if (cd) + { + QListIterator<FileDef> li(cd->usedFiles()); + FileDef *fd; + for (li.toFirst();(fd=li.current());++li) + { + p->addFile(fd); + } + } +} + +UsedFilesContext::~UsedFilesContext() +{ + delete p; +} + +// TemplateListIntf +int UsedFilesContext::count() const +{ + return p->count(); +} + +TemplateVariant UsedFilesContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *UsedFilesContext::createIterator() const +{ + return p->createIterator(); +} + +void UsedFilesContext::addFile(FileDef *fd) +{ + p->addFile(fd); +} + +//------------------------------------------------------------------------ + + +//%% struct DirFileNode: node is a directory hierarchy +//%% { +class DirFileNodeContext::Private : public PropertyMapper +{ + public: + Private(Definition *d) : m_def(d), + m_dirContext (m_def->definitionType()==Definition::TypeDir ? (DirDef*)d : 0), + m_fileContext(m_def->definitionType()==Definition::TypeFile ? (FileDef*)d : 0) + { + //%% bool is_leaf_node: true if this node does not have any children + addProperty("is_leaf_node",this,&Private::isLeafNode); + //%% DirFile children: list of nested classes/namespaces + addProperty("children",this,&Private::children); + //%% [optional] Dir dir: directory info (if this node represents a directory) + addProperty("dir",this,&Private::getDir); + //%% [optional] File file: file info (if this node represents a file) + addProperty("file",this,&Private::getFile); + addDirFiles(); + } + TemplateVariant isLeafNode() const + { + return m_children.count()==0; + } + TemplateVariant children() const + { + return TemplateVariant(&m_children); + } + TemplateVariant getDir() const + { + if (m_def->definitionType()==Definition::TypeDir) + { + return TemplateVariant(&m_dirContext); + } + else + { + return TemplateVariant(FALSE); + } + } + TemplateVariant getFile() const + { + if (m_def->definitionType()==Definition::TypeFile) + { + return TemplateVariant(&m_fileContext); + } + else + { + return TemplateVariant(FALSE); + } + } + void addDirFiles() + { + DirDef *dd = m_def->definitionType()==Definition::TypeDir ? (DirDef*)m_def : 0; + if (dd) + { + m_children.addDirs(dd->subDirs()); + if (dd && dd->getFiles()) + { + m_children.addFiles(*dd->getFiles()); + } + } + } + private: + Definition *m_def; + DirFileContext m_children; + DirContext m_dirContext; + FileContext m_fileContext; +}; +//%% } + +DirFileNodeContext::DirFileNodeContext(Definition *d) +{ + p = new Private(d); +} + +DirFileNodeContext::~DirFileNodeContext() +{ + delete p; +} + +TemplateVariant DirFileNodeContext::get(const char *n) const +{ + return p->get(n); +} + + +//------------------------------------------------------------------------ + +//%% list DirFile[DirFileNode]: list of directories and/or files +class DirFileContext::Private : public GenericNodeListContext<DirFileNodeContext> +{ + public: + void addDirs(const DirSDict &dirDict) + { + SDict<DirDef>::Iterator dli(dirDict); + DirDef *dd; + for (dli.toFirst();(dd=dli.current());++dli) + { + if (dd->getOuterScope()==Doxygen::globalScope) + { + append(new DirFileNodeContext(dd)); + } + } + } + void addDirs(const DirList &dirList) + { + QListIterator<DirDef> li(dirList); + DirDef *dd; + for (li.toFirst();(dd=li.current());++li) + { + append(new DirFileNodeContext(dd)); + } + } + void addFiles(const FileNameList &fnList) + { + FileNameListIterator fnli(fnList); + FileName *fn; + for (fnli.toFirst();(fn=fnli.current());++fnli) + { + FileNameIterator fni(*fn); + FileDef *fd; + for (;(fd=fni.current());++fni) + { + if (fd->getDirDef()==0) // top level file + { + append(new DirFileNodeContext(fd)); + } + } + } + } + void addFiles(const FileList &fList) + { + QListIterator<FileDef> li(fList); + FileDef *fd; + for (li.toFirst();(fd=li.current());++li) + { + append(new DirFileNodeContext(fd)); + } + } +}; + +DirFileContext::DirFileContext() +{ + p = new Private; +} + +DirFileContext::~DirFileContext() +{ + delete p; +} + +// TemplateListIntf +int DirFileContext::count() const +{ + return p->count(); +} + +TemplateVariant DirFileContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *DirFileContext::createIterator() const +{ + return p->createIterator(); +} + +void DirFileContext::addDirs(const DirSDict &dirs) +{ + p->addDirs(dirs); +} + +void DirFileContext::addDirs(const DirList &dirs) +{ + p->addDirs(dirs); +} + +void DirFileContext::addFiles(const FileNameList &files) +{ + p->addFiles(files); +} + +void DirFileContext::addFiles(const FileList &files) +{ + p->addFiles(files); +} + + +//------------------------------------------------------------------------ + +//%% struct FileTree: tree of directories and files +//%% { +class FileTreeContext::Private : public PropertyMapper +{ + public: + TemplateVariant tree() const + { + return TemplateVariant(&m_dirFileTree); + } + TemplateVariant fileName() const + { + return "files"; + } + TemplateVariant relPath() const + { + return ""; + } + TemplateVariant highlight() const + { + return "files"; + } + TemplateVariant subhighlight() const + { + return "filelist"; + } + TemplateVariant title() const + { + return theTranslator->trFileList(); + } + Private() + { + // Add dirs tree + if (Doxygen::directories) + { + m_dirFileTree.addDirs(*Doxygen::directories); + } + if (Doxygen::inputNameList) + { + m_dirFileTree.addFiles(*Doxygen::inputNameList); + } + //%% DirFile tree: + addProperty("tree",this,&Private::tree); + addProperty("fileName",this,&Private::fileName); + addProperty("relPath",this,&Private::relPath); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title",this,&Private::title); + } + private: + DirFileContext m_dirFileTree; +}; +//%% } + +FileTreeContext::FileTreeContext() +{ + p = new Private; +} + +FileTreeContext::~FileTreeContext() +{ + delete p; +} + +TemplateVariant FileTreeContext::get(const char *name) const +{ + return p->get(name); +} + +//------------------------------------------------------------------------ + +//%% struct PageNode: node is a directory hierarchy +//%% { +class PageNodeContext::Private : public PropertyMapper +{ + public: + Private(PageDef *pd) : m_pageDef(pd), m_pageContext(pd) + { + //%% bool is_leaf_node: true if this node does not have any children + addProperty("is_leaf_node",this,&Private::isLeafNode); + //%% PageList children: list of nested classes/namespaces + addProperty("children",this,&Private::children); + //%% Page page: page info + addProperty("page",this,&Private::getPage); + addPages(); + } + TemplateVariant isLeafNode() const + { + return m_children.count()==0; + } + TemplateVariant children() const + { + return TemplateVariant(&m_children); + } + TemplateVariant getPage() const + { + return TemplateVariant(&m_pageContext); + } + void addPages() + { + if (m_pageDef->getSubPages()) + { + m_children.addPages(*m_pageDef->getSubPages(),FALSE); + } + } + private: + PageDef *m_pageDef; + PageNodeListContext m_children; + PageContext m_pageContext; +}; +//%% } + +PageNodeContext::PageNodeContext(PageDef *pd) +{ + p = new Private(pd); +} + +PageNodeContext::~PageNodeContext() +{ + delete p; +} + +TemplateVariant PageNodeContext::get(const char *n) const +{ + return p->get(n); +} + +//------------------------------------------------------------------------ + +//%% list PageList[PageNode]: list of directories and/or files +class PageNodeListContext::Private : public GenericNodeListContext<PageNodeContext> +{ + public: + void addPages(const PageSDict &pages,bool rootOnly) + { + SDict<PageDef>::Iterator pli(pages); + PageDef *pd; + for (pli.toFirst();(pd=pli.current());++pli) + { + if (!rootOnly || + pd->getOuterScope()==0 || + pd->getOuterScope()->definitionType()!=Definition::TypePage) + { + append(new PageNodeContext(pd)); + } + } + } +}; + +PageNodeListContext::PageNodeListContext() +{ + p = new Private; +} + +PageNodeListContext::~PageNodeListContext() +{ + delete p; +} + +// TemplateListIntf +int PageNodeListContext::count() const +{ + return p->count(); +} + +TemplateVariant PageNodeListContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *PageNodeListContext::createIterator() const +{ + return p->createIterator(); +} + +void PageNodeListContext::addPages(const PageSDict &pages,bool rootOnly) +{ + p->addPages(pages,rootOnly); +} + +//------------------------------------------------------------------------ + +//%% struct PageTree: tree of related pages +//%% { +class PageTreeContext::Private : public PropertyMapper +{ + public: + TemplateVariant tree() const + { + return TemplateVariant(&m_pageList); + } + TemplateVariant fileName() const + { + return "pages"; + } + TemplateVariant relPath() const + { + return ""; + } + TemplateVariant highlight() const + { + return "pages"; + } + TemplateVariant subhighlight() const + { + return ""; + } + TemplateVariant title() const + { + return theTranslator->trRelatedPages(); + } + Private() + { + // Add pages + if (Doxygen::pageSDict) + { + m_pageList.addPages(*Doxygen::pageSDict,TRUE); + } + + //%% PageNodeList tree: + addProperty("tree",this,&Private::tree); + addProperty("fileName",this,&Private::fileName); + addProperty("relPath",this,&Private::relPath); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title",this,&Private::title); + } + private: + PageNodeListContext m_pageList; +}; +//%% } + +PageTreeContext::PageTreeContext() +{ + p = new Private; +} + +PageTreeContext::~PageTreeContext() +{ + delete p; +} + +TemplateVariant PageTreeContext::get(const char *name) const +{ + return p->get(name); +} + +//------------------------------------------------------------------------ + +//%% struct PageList: list of related pages +//%% { +class PageListContext::Private : public PropertyMapper +{ + public: + TemplateVariant items() const + { + return TemplateVariant(&m_pageList); + } + TemplateVariant fileName() const + { + return "pages"; + } + TemplateVariant relPath() const + { + return ""; + } + TemplateVariant highlight() const + { + return "pages"; + } + TemplateVariant subhighlight() const + { + return ""; + } + TemplateVariant title() const + { + return theTranslator->trRelatedPages(); + } + Private() + { + // Add pages + PageSDict::Iterator pdi(*Doxygen::pageSDict); + PageDef *pd=0; + for (pdi.toFirst();(pd=pdi.current());++pdi) + { + if (!pd->getGroupDef() && !pd->isReference()) + { + m_pageList.append(new PageContext(pd)); + } + } + + //%% list[Page] items: + addProperty("items",this,&Private::items); + addProperty("fileName",this,&Private::fileName); + addProperty("relPath",this,&Private::relPath); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title",this,&Private::title); + } + private: + GenericNodeListContext<PageContext> m_pageList; +}; +//%% } + +PageListContext::PageListContext() +{ + p = new Private; +} + +PageListContext::~PageListContext() +{ + delete p; +} + +TemplateVariant PageListContext::get(const char *name) const +{ + return p->get(name); +} + + +//------------------------------------------------------------------------ + +//%% struct ModuleNode: node is a directory hierarchy +//%% { +class ModuleNodeContext::Private : public PropertyMapper +{ + public: + Private(GroupDef *gd) : m_groupDef(gd), m_moduleContext(gd) + { + //%% bool is_leaf_node: true if this node does not have any children + addProperty("is_leaf_node",this,&Private::isLeafNode); + //%% ModuleList children: list of submodules + addProperty("children",this,&Private::children); + //%% Module module: module info + addProperty("module",this,&Private::getModule); + addModules(); + } + TemplateVariant isLeafNode() const + { + return m_children.count()==0; + } + TemplateVariant children() const + { + return TemplateVariant(&m_children); + } + TemplateVariant getModule() const + { + return TemplateVariant(&m_moduleContext); + } + void addModules() + { + if (m_groupDef->getSubGroups()) + { + m_children.addModules(*m_groupDef->getSubGroups()); + } + } + private: + GroupDef *m_groupDef; + ModuleListContext m_children; + ModuleContext m_moduleContext; +}; +//%% } + +ModuleNodeContext::ModuleNodeContext(GroupDef *gd) +{ + p = new Private(gd); +} + +ModuleNodeContext::~ModuleNodeContext() +{ + delete p; +} + +TemplateVariant ModuleNodeContext::get(const char *n) const +{ + return p->get(n); +} + +//------------------------------------------------------------------------ + +//%% list ModuleList[ModuleNode]: list of directories and/or files +class ModuleListContext::Private : public GenericNodeListContext<ModuleNodeContext> +{ + public: + void addModules(const GroupSDict &modules) + { + static bool externalGroups = Config_getBool("EXTERNAL_GROUPS"); + GroupSDict::Iterator gli(modules); + GroupDef *gd; + for (gli.toFirst();(gd=gli.current());++gli) + { + if (!gd->isASubGroup() && gd->isVisible() && (!gd->isReference() || externalGroups)) + { + append(new ModuleNodeContext(gd)); + } + } + } + void addModules(const GroupList &list) + { + QListIterator<GroupDef> gli(list); + GroupDef *gd; + for (gli.toFirst();(gd=gli.current());++gli) + { + append(new ModuleNodeContext(gd)); + } + } +}; + +ModuleListContext::ModuleListContext() +{ + p = new Private; +} + +ModuleListContext::~ModuleListContext() +{ + delete p; +} + +// TemplateListIntf +int ModuleListContext::count() const +{ + return p->count(); +} + +TemplateVariant ModuleListContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *ModuleListContext::createIterator() const +{ + return p->createIterator(); +} + +void ModuleListContext::addModules(const GroupSDict &modules) +{ + p->addModules(modules); +} + +void ModuleListContext::addModules(const GroupList &modules) +{ + p->addModules(modules); +} + + +//------------------------------------------------------------------------ + +//%% struct ModuleTree: tree of modules +//%% { +class ModuleTreeContext::Private : public PropertyMapper +{ + public: + TemplateVariant tree() const + { + return TemplateVariant(&m_moduleList); + } + TemplateVariant fileName() const + { + return "modules"; + } + TemplateVariant relPath() const + { + return ""; + } + TemplateVariant highlight() const + { + return "modules"; + } + TemplateVariant subhighlight() const + { + return ""; + } + TemplateVariant title() const + { + return theTranslator->trModules(); + } + Private() + { + // Add modules + if (Doxygen::groupSDict) + { + m_moduleList.addModules(*Doxygen::groupSDict); + } + + //%% ModuleList tree: + addProperty("tree",this,&Private::tree); + addProperty("fileName",this,&Private::fileName); + addProperty("relPath",this,&Private::relPath); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title",this,&Private::title); + } + private: + ModuleListContext m_moduleList; +}; +//%% } + +ModuleTreeContext::ModuleTreeContext() +{ + p = new Private; +} + +ModuleTreeContext::~ModuleTreeContext() +{ + delete p; +} + +TemplateVariant ModuleTreeContext::get(const char *name) const +{ + return p->get(name); +} + +//------------------------------------------------------------------------ + +//%% struct NavPathElem: list of examples page +//%% { +class NavPathElemContext::Private : public PropertyMapper +{ + public: + Private(Definition *def) : m_def(def) + { + addProperty("isLinkable",this,&Private::isLinkable); + addProperty("fileName",this,&Private::fileName); + addProperty("anchor",this,&Private::anchor); + addProperty("text",this,&Private::text); + } + TemplateVariant isLinkable() const + { + return m_def->isLinkable(); + } + TemplateVariant anchor() const + { + return m_def->anchor(); + } + TemplateVariant fileName() const + { + return m_def->getOutputFileBase(); + } + TemplateVariant text() const + { + Definition::DefType type = m_def->definitionType(); + QCString text = m_def->localName(); + if (type==Definition::TypeGroup) + { + text = ((const GroupDef*)m_def)->groupTitle(); + } + else if (type==Definition::TypePage && !(((const PageDef*)this)->title().isEmpty())) + { + text = ((const PageDef*)m_def)->title(); + } + else if (type==Definition::TypeClass) + { + if (text.right(2)=="-p") + { + text = text.left(text.length()-2); + } + } + return text; + } + private: + Definition *m_def; +}; +//%% } + +NavPathElemContext::NavPathElemContext(Definition *def) +{ + p = new Private(def); +} + +NavPathElemContext::~NavPathElemContext() +{ + delete p; +} + +TemplateVariant NavPathElemContext::get(const char *name) const +{ + return p->get(name); +} + + +//------------------------------------------------------------------------ + +//%% struct ExampleList: list of examples page +//%% { +class ExampleListContext::Private : public PropertyMapper +{ + public: + TemplateVariant items() const + { + return TemplateVariant(&m_pageList); + } + TemplateVariant fileName() const + { + return "examples"; + } + TemplateVariant relPath() const + { + return ""; + } + TemplateVariant highlight() const + { + return "examples"; + } + TemplateVariant subhighlight() const + { + return ""; + } + TemplateVariant title() const + { + return theTranslator->trExamples(); + } + Private() + { + // Add pages + if (Doxygen::exampleSDict) + { + m_pageList.addPages(*Doxygen::exampleSDict,FALSE); + } + + //%% PageNodeList items: + addProperty("items",this,&Private::items); + addProperty("fileName",this,&Private::fileName); + addProperty("relPath",this,&Private::relPath); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title",this,&Private::title); + } + private: + PageNodeListContext m_pageList; +}; +//%% } + +ExampleListContext::ExampleListContext() +{ + p = new Private; +} + +ExampleListContext::~ExampleListContext() +{ + delete p; +} + +TemplateVariant ExampleListContext::get(const char *name) const +{ + return p->get(name); +} + + +//------------------------------------------------------------------------ + +//%% struct InheritanceNode: a class in the inheritance list +//%% { +class InheritanceNodeContext::Private : public PropertyMapper +{ + public: + Private(ClassDef *cd,const QCString &name) : m_classContext(cd), m_name(name) + { + addProperty("class",this,&Private::getClass); + addProperty("name",this,&Private::name); + } + TemplateVariant getClass() const + { + return &m_classContext; + } + TemplateVariant name() const + { + return m_name; + } + private: + ClassContext m_classContext; + QCString m_name; +}; +//%% } + +InheritanceNodeContext::InheritanceNodeContext(ClassDef *cd,const QCString &name) +{ + p = new Private(cd,name); +} + +InheritanceNodeContext::~InheritanceNodeContext() +{ + delete p; +} + +TemplateVariant InheritanceNodeContext::get(const char *name) const +{ + return p->get(name); +} + +//------------------------------------------------------------------------ + +//%% list InheritanceList[InheritanceNode] : list of inherited classes +class InheritanceListContext::Private : public GenericNodeListContext<InheritanceNodeContext> +{ + public: + void addClass(ClassDef *cd,const QCString &name) + { + append(new InheritanceNodeContext(cd,name)); + } +}; + +InheritanceListContext::InheritanceListContext(const BaseClassList *list, bool baseClasses) +{ + p = new Private; + if (list) + { + BaseClassListIterator li(*list); + BaseClassDef *bcd; + for (li.toFirst();(bcd=li.current());++li) + { + ClassDef *cd=bcd->classDef; + QCString name; + if (baseClasses) + { + name = insertTemplateSpecifierInScope( + cd->displayName(),bcd->templSpecifiers); + } + else + { + name = cd->displayName(); + } + //printf("InheritanceListContext: adding %s baseClass=%d\n",name.data(),baseClasses); + p->addClass(cd,name); + } + } +} + +InheritanceListContext::~InheritanceListContext() +{ + delete p; +} + +// TemplateListIntf +int InheritanceListContext::count() const +{ + return p->count(); +} + +TemplateVariant InheritanceListContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *InheritanceListContext::createIterator() const +{ + return p->createIterator(); +} + +//------------------------------------------------------------------------ + +//%% list MemberList[Member] : list of inherited classes +class MemberListContext::Private : public GenericNodeListContext<MemberContext> +{ + public: + void addMember(MemberDef *md) + { + append(new MemberContext(md)); + } +}; + +MemberListContext::MemberListContext() +{ + p = new Private; +} + +MemberListContext::MemberListContext(const MemberList *list) +{ + p = new Private; + if (list) + { + bool details = list->listType()&MemberListType_detailedLists; + MemberListIterator mli(*list); + MemberDef *md; + for (mli.toFirst();(md=mli.current());++mli) + { + if ((md->isBriefSectionVisible() && !details) || + (md->isDetailedSectionLinkable() && details) + ) + { + p->addMember(md); + } + } + } +} + +MemberListContext::MemberListContext(MemberSDict *list,bool doSort) +{ + p = new Private; + if (list) + { + if (doSort) + { + list->sort(); + } + MemberSDict::Iterator it(*list); + MemberDef *md; + for (it.toFirst();(md=it.current());++it) + { + p->addMember(md); + } + } +} + +MemberListContext::~MemberListContext() +{ + delete p; +} + +// TemplateListIntf +int MemberListContext::count() const +{ + return p->count(); +} + +TemplateVariant MemberListContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *MemberListContext::createIterator() const +{ + return p->createIterator(); +} + +//------------------------------------------------------------------------ + +//%% struct MemberInfo: member information +//%% { +class MemberInfoContext::Private : public PropertyMapper +{ + public: + Private(const MemberInfo *mi) : m_memberInfo(mi) + { + //%% string protection + addProperty("protection",this,&Private::protection); + //%% string virtualness + addProperty("virtualness",this,&Private::virtualness); + //%% string ambiguityScope + addProperty("ambiguityScope",this,&Private::ambiguityScope); + //%% Member member + addProperty("member",this,&Private::member); + } + TemplateVariant protection() const + { + switch (m_memberInfo->prot) + { + case ::Public: return "public"; + case ::Protected: return "protected"; + case ::Private: return "private"; + case ::Package: return "package"; + } + return ""; + } + TemplateVariant virtualness() const + { + switch (m_memberInfo->virt) + { + case ::Normal: return "normal"; + case ::Virtual: return "virtual"; + case ::Pure: return "pure"; + } + return ""; + } + TemplateVariant ambiguityScope() const + { + return m_memberInfo->ambiguityResolutionScope; + } + TemplateVariant member() const + { + if (!m_member && m_memberInfo->memberDef) + { + m_member.reset(new MemberContext(m_memberInfo->memberDef)); + } + if (m_member) + { + return m_member.get(); + } + else + { + return TemplateVariant(FALSE); + } + } + private: + const MemberInfo *m_memberInfo; + mutable ScopedPtr<MemberContext> m_member; +}; +//%% } + +MemberInfoContext::MemberInfoContext(const MemberInfo *mi) +{ + p = new Private(mi); +} + +MemberInfoContext::~MemberInfoContext() +{ + delete p; +} + +TemplateVariant MemberInfoContext::get(const char *name) const +{ + return p->get(name); +} + + +//------------------------------------------------------------------------ + +//%% list AllMembersList[MemberList] : list of inherited classes +class AllMembersListContext::Private : public GenericNodeListContext<MemberInfoContext> +{ + public: + Private(const MemberNameInfoSDict *ml) + { + if (ml) + { + static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS"); + MemberNameInfoSDict::Iterator mnii(*ml); + MemberNameInfo *mni; + for (mnii.toFirst();(mni=mnii.current());++mnii) + { + MemberNameInfoIterator mnii2(*mni); + MemberInfo *mi; + for (mnii2.toFirst();(mi=mnii2.current());++mnii2) + { + MemberDef *md=mi->memberDef; + ClassDef *cd=md->getClassDef(); + if (cd && !md->name().isEmpty() && md->name()[0]!='@') + { + if ((cd->isLinkable() && md->isLinkable()) || + (!cd->isArtificial() && !hideUndocMembers && + (protectionLevelVisible(md->protection()) || md->isFriend()) + ) + ) + { + append(new MemberInfoContext(mi)); + } + } + } + } + } + } +}; + +AllMembersListContext::AllMembersListContext() +{ + p = new Private(0); +} + +AllMembersListContext::AllMembersListContext(const MemberNameInfoSDict *ml) +{ + p = new Private(ml); +} + +AllMembersListContext::~AllMembersListContext() +{ + delete p; +} + +// TemplateListIntf +int AllMembersListContext::count() const +{ + return p->count(); +} + +TemplateVariant AllMembersListContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *AllMembersListContext::createIterator() const +{ + return p->createIterator(); +} + +//------------------------------------------------------------------------ + +//%% struct MemberGroupInfo: member group information +//%% { +class MemberGroupInfoContext::Private : public PropertyMapper +{ + public: + Private(Definition *def,const QCString &relPath,const MemberGroup *mg) : + m_def(def), + m_relPath(relPath), + m_memberListContext(mg->members()), + m_memberGroups(def,relPath,0), m_memberGroup(mg) + { + addProperty("members", this,&Private::members); + addProperty("title", this,&Private::groupTitle); + addProperty("subtitle", this,&Private::groupSubtitle); + addProperty("anchor", this,&Private::groupAnchor); + addProperty("memberGroups", this,&Private::memberGroups); + addProperty("docs", this,&Private::docs); + addProperty("inherited", this,&Private::inherited); + } + TemplateVariant members() const + { + return &m_memberListContext; + } + TemplateVariant groupTitle() const + { + return m_memberGroup->header(); + } + TemplateVariant groupSubtitle() const + { + return ""; + } + TemplateVariant groupAnchor() const + { + return m_memberGroup->anchor(); + } + TemplateVariant memberGroups() const + { + return &m_memberGroups; + } + TemplateVariant docs() const + { + if (!m_docs) + { + QCString docs = m_memberGroup->documentation(); + if (!docs.isEmpty()) + { + m_docs.reset(new TemplateVariant( + parseDoc(m_def,"[@name docs]",-1, // TODO store file & line + m_relPath, + m_memberGroup->documentation()+"\n",FALSE))); + } + else + { + m_docs.reset(new TemplateVariant("")); + } + } + return *m_docs; + } + TemplateVariant inherited() const + { + return FALSE; + } + private: + Definition *m_def; + QCString m_relPath; + MemberListContext m_memberListContext; + MemberGroupListContext m_memberGroups; + const MemberGroup *m_memberGroup; + mutable ScopedPtr<TemplateVariant> m_docs; +}; +//%% } + +MemberGroupInfoContext::MemberGroupInfoContext(Definition *def, + const QCString &relPath,const MemberGroup *mg) +{ + p = new Private(def,relPath,mg); +} + +MemberGroupInfoContext::~MemberGroupInfoContext() +{ + delete p; +} + +TemplateVariant MemberGroupInfoContext::get(const char *name) const +{ + return p->get(name); +} + +//------------------------------------------------------------------------ + +//%% list MemberGroupList[MemberGroupInfo] : list of member groups +class MemberGroupListContext::Private : public GenericNodeListContext<MemberGroupInfoContext> +{ + public: + void addMemberGroup(Definition *def,const QCString &relPath,const MemberGroup *mg) + { + append(new MemberGroupInfoContext(def,relPath,mg)); + } +}; + +MemberGroupListContext::MemberGroupListContext() +{ + p = new Private; +} + +MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list) +{ + p = new Private; + if (list) + { + MemberGroupListIterator mgli(*list); + MemberGroup *mg; + for (;(mg=mgli.current());++mgli) + { + p->addMemberGroup(def,relPath,mg); + } + } +} + +MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping) +{ + p = new Private; + if (dict) + { + MemberGroupSDict::Iterator di(*dict); + const MemberGroup *mg; + for (di.toFirst();(mg=di.current());++di) + { + if (!mg->allMembersInSameSection() || !subGrouping) + { + p->addMemberGroup(def,relPath,mg); + } + } + } +} + +MemberGroupListContext::~MemberGroupListContext() +{ + delete p; +} + +// TemplateListIntf +int MemberGroupListContext::count() const +{ + return p->count(); +} + +TemplateVariant MemberGroupListContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *MemberGroupListContext::createIterator() const +{ + return p->createIterator(); +} + + +//------------------------------------------------------------------------ + +//%% struct MemberListInfo: member list information +//%% { +class MemberListInfoContext::Private : public PropertyMapper +{ + public: + Private(Definition *def,const QCString &relPath,const MemberList *ml,const QCString &title,const QCString &subtitle) : + m_def(def), + m_memberListContext(ml), + m_memberGroups(def,relPath,ml ? ml->getMemberGroupList() : 0), + m_memberList(ml), + m_title(title), + m_subtitle(subtitle) + { + addProperty("members", this,&Private::members); + addProperty("title", this,&Private::title); + addProperty("subtitle", this,&Private::subtitle); + addProperty("anchor", this,&Private::anchor); + addProperty("memberGroups", this,&Private::memberGroups); + addProperty("inherited", this,&Private::inherited); + } + TemplateVariant members() const + { + return &m_memberListContext; + } + TemplateVariant title() const + { + return m_title; + } + TemplateVariant subtitle() const + { + return m_subtitle; + } + TemplateVariant anchor() const + { + return MemberList::listTypeAsString(m_memberList->listType()); + } + TemplateVariant memberGroups() const + { + return &m_memberGroups; + } + TemplateVariant inherited() const + { + if (!m_inherited && (m_memberList->listType()&MemberListType_detailedLists)==0 && + m_def->definitionType()==Definition::TypeClass) + { + InheritedMemberInfoListContext *ctx = new InheritedMemberInfoListContext; + ctx->addMemberList((ClassDef*)m_def,m_memberList->listType(),m_title,FALSE); + m_inherited.reset(ctx); + } + if (m_inherited) + { + return m_inherited.get(); + } + else + { + return TemplateVariant(FALSE); + } + } + private: + Definition *m_def; + MemberListContext m_memberListContext; + MemberGroupListContext m_memberGroups; + const MemberList *m_memberList; + QCString m_title; + QCString m_subtitle; + mutable ScopedPtr<InheritedMemberInfoListContext> m_inherited; +}; +//%% } + +MemberListInfoContext::MemberListInfoContext( + Definition *def,const QCString &relPath,const MemberList *ml, + const QCString &title,const QCString &subtitle) +{ + p = new Private(def,relPath,ml,title,subtitle); +} + +MemberListInfoContext::~MemberListInfoContext() +{ + delete p; +} + +TemplateVariant MemberListInfoContext::get(const char *name) const +{ + return p->get(name); +} + +//------------------------------------------------------------------------ + +//%% struct InheritedMemberInfo: inherited member information +//%% { +class InheritedMemberInfoContext::Private : public PropertyMapper +{ + public: + Private(ClassDef *cd,MemberList *ml,const QCString &title) + : m_class(cd), m_memberList(ml), m_title(title) + { + addProperty("class", this,&Private::getClass); + addProperty("title", this,&Private::title); + addProperty("members", this,&Private::members); + addProperty("id", this,&Private::id); + addProperty("inheritedFrom", this,&Private::inheritedFrom); + } + ~Private() + { + delete m_memberList; + } + TemplateVariant getClass() const + { + if (!m_classCtx) + { + m_classCtx.reset(new ClassContext(m_class)); + } + return m_classCtx.get(); + } + TemplateVariant title() const + { + return m_title; + } + TemplateVariant members() const + { + if (!m_memberListCtx) + { + m_memberListCtx.reset(new MemberListContext(m_memberList)); + } + return m_memberListCtx.get(); + } + TemplateVariant id() const + { + return substitute(MemberList::listTypeAsString(m_memberList->listType()),"-","_")+"_"+ + stripPath(m_class->getOutputFileBase()); + } + TemplateVariant inheritedFrom() const + { + if (m_inheritedFrom.count()==0) + { + m_inheritedFrom.append(title()); + m_inheritedFrom.append(getClass()); + } + return &m_inheritedFrom; + } + + private: + ClassDef * m_class; + MemberList *m_memberList; + QCString m_title; + mutable ScopedPtr<ClassContext> m_classCtx; + mutable ScopedPtr<MemberListContext> m_memberListCtx; + mutable TemplateList m_inheritedFrom; +}; +//%% } + +InheritedMemberInfoContext::InheritedMemberInfoContext(ClassDef *cd,MemberList *ml, + const QCString &title) +{ + p = new Private(cd,ml,title); +} + +InheritedMemberInfoContext::~InheritedMemberInfoContext() +{ + delete p; +} + +TemplateVariant InheritedMemberInfoContext::get(const char *name) const +{ + return p->get(name); +} + +//------------------------------------------------------------------------ + +//%% list InheritedMemberList[InheritedMemberInfo] : list of inherited classes +class InheritedMemberInfoListContext::Private : public GenericNodeListContext<InheritedMemberInfoContext> +{ + public: + void addMemberList(ClassDef *inheritedFrom,MemberList *ml,MemberList *combinedList) + { + if (ml) + { + MemberListIterator li(*ml); + MemberDef *md; + for (li.toFirst();(md=li.current());++li) + { + if (md->isBriefSectionVisible() && !md->isReimplementedBy(inheritedFrom)) + { + combinedList->append(md); + } + } + } + } + void addMemberListIncludingGrouped(ClassDef *inheritedFrom,MemberList *ml,MemberList *combinedList) + { + if (ml) + { + addMemberList(inheritedFrom,ml,combinedList); + if (ml->getMemberGroupList()) + { + MemberGroupListIterator mgli(*ml->getMemberGroupList()); + MemberGroup *mg; + for (mgli.toFirst();(mg=mgli.current());++mgli) + { + addMemberList(inheritedFrom,mg->members(),combinedList); + } + } + } + } + void addMemberGroupsOfClass(ClassDef *inheritedFrom, + ClassDef *cd,MemberListType lt,MemberList *combinedList) + { + if (cd->getMemberGroupSDict()) + { + MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict()); + MemberGroup *mg; + for (;(mg=mgli.current());++mgli) + { + if (mg->members() && (!mg->allMembersInSameSection() || !cd->subGrouping())) // group is in its own section + { + MemberListIterator li(*mg->members()); + MemberDef *md; + for (li.toFirst();(md=li.current());++li) + { + if (lt==md->getSectionList(mg->parent())->listType() && + !md->isReimplementedBy(inheritedFrom) && + md->isBriefSectionVisible()) + { + combinedList->append(md); + } + } + } + } + } + } + void addInheritedMembers(ClassDef *inheritedFrom,ClassDef *cd,MemberListType lt, + MemberListType lt1,int lt2,const QCString &title,bool additionalList) + { + int count = cd->countMembersIncludingGrouped(lt1,inheritedFrom,additionalList); + if (lt2!=-1) count += cd->countMembersIncludingGrouped((MemberListType)lt2,inheritedFrom,additionalList); + if (count>0) + { + MemberList *ml = cd->getMemberList(lt1); + MemberList *ml2 = lt2!=-1 ? cd->getMemberList((MemberListType)lt2) : 0; + MemberList *combinedList = new MemberList(lt); + addMemberListIncludingGrouped(inheritedFrom,ml,combinedList); + addMemberListIncludingGrouped(inheritedFrom,ml2,combinedList); + addMemberGroupsOfClass(inheritedFrom,cd,lt,combinedList); + if (lt2!=-1) addMemberGroupsOfClass(inheritedFrom,cd,(MemberListType)lt2,combinedList); + append(new InheritedMemberInfoContext(cd,combinedList,title)); + } + } + void findInheritedMembers(ClassDef *inheritedFrom,ClassDef *cd,MemberListType lt, + int lt2, const QCString &title,bool additionalList, + QPtrDict<void> *visitedClasses) + { + if (cd->baseClasses()) + { + BaseClassListIterator it(*cd->baseClasses()); + BaseClassDef *ibcd; + for (it.toFirst();(ibcd=it.current());++it) + { + ClassDef *icd=ibcd->classDef; + if (icd->isLinkable()) + { + int lt1,lt3; + convertProtectionLevel(lt,ibcd->prot,<1,<3); + if (lt2==-1 && lt3!=-1) + { + lt2=lt3; + } + if (visitedClasses->find(icd)==0) + { + visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance + if (lt1!=-1) + { + // add member info for members of cd with list type lt + addInheritedMembers(inheritedFrom,icd,lt,(MemberListType)lt1,lt2,title,additionalList); + // recurse down the inheritance tree + findInheritedMembers(inheritedFrom,icd,(MemberListType)lt1,lt2,title,additionalList,visitedClasses); + } + } + } + } + } + } +}; + +InheritedMemberInfoListContext::InheritedMemberInfoListContext() +{ + p = new Private; +} + +void InheritedMemberInfoListContext::addMemberList( + ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList) +{ + QPtrDict<void> visited(17); + bool memberInSection = cd->countMembersIncludingGrouped(lt,cd,FALSE); + bool show = (additionalList && !memberInSection) || // inherited member to show in the additional inherited members list + (!additionalList && memberInSection); // inherited member to show in a member list of the class + //printf("%s:%s show=%d\n",cd->name().data(),MemberList::listTypeAsString(lt).data(),show); + if (show) + { + p->findInheritedMembers(cd,cd,lt,-1,title,additionalList,&visited); + } +} + +InheritedMemberInfoListContext::~InheritedMemberInfoListContext() +{ + delete p; +} + +// TemplateListIntf +int InheritedMemberInfoListContext::count() const +{ + return p->count(); +} + +TemplateVariant InheritedMemberInfoListContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *InheritedMemberInfoListContext::createIterator() const +{ + return p->createIterator(); +} + +//------------------------------------------------------------------------ + +//%% struct Argument: parameter information +//%% { +class ArgumentContext::Private : public PropertyMapper +{ + public: + Private(const Argument *arg,Definition *def,const QCString &relPath) : + m_argument(arg), m_def(def), m_relPath(relPath) + { + addProperty("type", this,&Private::type); + addProperty("name", this,&Private::name); + addProperty("defVal", this,&Private::defVal); + addProperty("docs", this,&Private::docs); + addProperty("attrib", this,&Private::attrib); + addProperty("array", this,&Private::array); + addProperty("namePart", this,&Private::namePart); + } + TemplateVariant type() const + { + return createLinkedText(m_def,m_relPath,m_argument->type); + } + TemplateVariant attrib() const + { + return m_argument->attrib; + } + TemplateVariant name() const + { + return m_argument->name; + } + TemplateVariant defVal() const + { + return createLinkedText(m_def,m_relPath,m_argument->defval); + } + TemplateVariant array() const + { + return m_argument->array; + } + TemplateVariant docs() const + { + if (!m_cache.docs && m_def) + { + if (!m_argument->docs.isEmpty()) + { + m_cache.docs.reset(new TemplateVariant( + parseDoc(m_def,m_def->docFile(),m_def->docLine(), + m_relPath,m_argument->docs,TRUE))); + } + else + { + m_cache.docs.reset(new TemplateVariant("")); + } + } + return *m_cache.docs; + } + TemplateVariant namePart() const + { + QCString result = m_argument->attrib; + int l = result.length(); + if (l>2 && result.at(0)=='[' && result.at(l-1)==']') + { + result = result.mid(1,l-2); + if (result!=",") result+=":"; // for normal keywords add colon + } + return result; + } + private: + const Argument *m_argument; + Definition *m_def; + QCString m_relPath; + struct Cachable + { + ScopedPtr<TemplateVariant> docs; + }; + mutable Cachable m_cache; +}; +//%% } + +ArgumentContext::ArgumentContext(const Argument *al,Definition *def,const QCString &relPath) +{ + p = new Private(al,def,relPath); +} + +ArgumentContext::~ArgumentContext() +{ + delete p; +} + +TemplateVariant ArgumentContext::get(const char *name) const +{ + return p->get(name); +} + +//------------------------------------------------------------------------ + +//%% list ArgumentList[Argument] : list of inherited classes +class ArgumentListContext::Private : public GenericNodeListContext<ArgumentContext> +{ + public: + void addArgument(const Argument *arg,Definition *def,const QCString &relPath) + { + append(new ArgumentContext(arg,def,relPath)); + } +}; + +ArgumentListContext::ArgumentListContext() +{ + p = new Private; +} + +ArgumentListContext::ArgumentListContext(const ArgumentList *list, + Definition *def,const QCString &relPath) +{ + p = new Private; + if (list) + { + ArgumentListIterator ali(*list); + const Argument *arg; + for (ali.toFirst();(arg=ali.current());++ali) + { + p->addArgument(arg,def,relPath); + } + } +} + +ArgumentListContext::~ArgumentListContext() +{ + delete p; +} + +// TemplateListIntf +int ArgumentListContext::count() const +{ + return p->count(); +} + +TemplateVariant ArgumentListContext::at(int index) const +{ + return p->at(index); +} + +TemplateListIntf::ConstIterator *ArgumentListContext::createIterator() const +{ + return p->createIterator(); +} + +//------------------------------------------------------------------------ + +class HtmlEscaper : public TemplateEscapeIntf +{ + public: + QCString escape(const QCString &s) + { + return convertToHtml(s,TRUE); + } +}; + +//------------------------------------------------------------------------ + +class HtmlSpaceless : public TemplateSpacelessIntf +{ + public: + HtmlSpaceless() : m_insideTag(FALSE), m_insideString('\0'), m_removeSpaces(TRUE) {} + QCString remove(const QCString &s) + { + QGString result; + const char *p = s.data(); + char c; + while ((c=*p++)) + { + switch(c) + { + case '<': // start of a tag + if (!m_insideString) m_insideTag=TRUE,m_removeSpaces=FALSE; + result+=c; + break; + case '>': // end of a tag + if (!m_insideString) m_insideTag=FALSE,m_removeSpaces=TRUE; + result+=c; + break; + case '\\': // escaped character in a string + result+=c; + if (m_insideString && *p) result+=*p++; + break; + case '"': case '\'': + if (m_insideTag) + { + if (m_insideString==c) // end of string + { + m_insideString='\0'; + } + else // start of string + { + m_insideString=c; + } + } + result+=c; + break; + case ' ': case '\t': case '\n': // whitespace + if (!m_insideTag) // outside tags strip consecutive whitespace + { + m_removeSpaces=TRUE; + } + else + { + result+=' '; + } + break; + default: + //if (m_removeSpaces) result+=' '; + result+=c; + m_removeSpaces=FALSE; + break; + } + } + result+='\0'; + //printf("HtmlSpaceless::remove('%s')='%s' m_insideTag=%d m_insideString=%d removeSpaces=%d\n",s.data(),result.data(), + // m_insideTag,m_insideString,m_removeSpaces); + return result.data(); + } + private: + bool m_insideTag; + char m_insideString; + bool m_removeSpaces; +}; + +//------------------------------------------------------------------------ + +void generateOutputViaTemplate() +{ + TemplateEngine e; + TemplateContext *ctx = e.createContext(); + if (ctx) + { + DoxygenContext doxygen; + ConfigContext config; + TranslateContext tr; + ClassListContext classList; + ClassTreeContext classTree; + ClassHierarchyContext classHierarchy; + NamespaceListContext namespaceList; + NamespaceTreeContext namespaceTree; + FileListContext fileList; + FileTreeContext fileTree; + PageTreeContext pageTree; + PageListContext pageList; + ModuleTreeContext moduleTree; + ExampleListContext exampleList; + + //%% Doxygen doxygen: + ctx->set("doxygen",&doxygen); + //%% Translator tr: + ctx->set("tr",&tr); + //%% Config config: + ctx->set("config",&config); + //%% ClassList classList: + ctx->set("classList",&classList); // not used for standard HTML + //%% ClassTree classTree: + ctx->set("classTree",&classTree); + // classIndex + //%% ClassHierarchy classHierarchy: + ctx->set("classHierarchy",&classHierarchy); + //%% NamespaceList namespaceList: + ctx->set("namespaceList",&namespaceList); + //%% NamespaceTree namespaceTree: + ctx->set("namespaceTree",&namespaceTree); + //%% FileList fileList: + ctx->set("fileList",&fileList); + //%% FileTree fileTree: + ctx->set("fileTree",&fileTree); + //%% PageList pageList + ctx->set("pageList",&pageList); + //%% PageTree pageTree + ctx->set("pageTree",&pageTree); + //%% ModuleTree moduleTree + ctx->set("moduleTree",&moduleTree); + //%% ExampleList exampleList + ctx->set("exampleList",&exampleList); + + // render HTML output + Template *tpl = e.loadByName("htmllayout.tpl"); + if (tpl) + { + g_globals.outputFormat = ContextGlobals::Html; + g_globals.dynSectionId = 0; + g_globals.outputDir = Config_getString("HTML_OUTPUT"); + HtmlEscaper esc; + ctx->setEscapeIntf(&esc); + HtmlSpaceless spl; + ctx->setSpacelessIntf(&spl); + ctx->setOutputDirectory(g_globals.outputDir); + FTextStream ts; + tpl->render(ts,ctx); + } + + // TODO: render other outputs + } +} + diff --git a/src/context.h b/src/context.h new file mode 100644 index 0000000..f027749 --- /dev/null +++ b/src/context.h @@ -0,0 +1,852 @@ +#ifndef CONTEXT_H +#define CONTEXT_H + +#include "types.h" +#include "template.h" + +class Definition; +class ClassDef; +class ClassSDict; +class BaseClassList; +class PageDef; +class GroupDef; +class NamespaceDef; +class BaseClassList; +class NamespaceSDict; +class FileDef; +class FileList; +class FileNameList; +class DirSDict; +class DirList; +class DirDef; +class PageSDict; +class GroupSDict; +class GroupDef; +class GroupList; +struct IncludeInfo; +class MemberList; +class MemberSDict; +class MemberDef; +struct Argument; +class ArgumentList; +class MemberNameInfoSDict; +struct MemberInfo; +class MemberGroup; +class MemberGroupSDict; +class MemberGroupList; + +//---------------------------------------------------- + +class ConfigContext : public TemplateStructIntf +{ + public: + ConfigContext(); + ~ConfigContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class DoxygenContext : public TemplateStructIntf +{ + public: + DoxygenContext(); + ~DoxygenContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class TranslateContext : public TemplateStructIntf +{ + public: + TranslateContext(); + ~TranslateContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class UsedFilesContext : public TemplateListIntf +{ + public: + UsedFilesContext(ClassDef *cd); + ~UsedFilesContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + void addFile(FileDef *fd); + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class IncludeInfoContext : public TemplateStructIntf +{ + public: + IncludeInfoContext(IncludeInfo *,SrcLangExt lang); + ~IncludeInfoContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class ClassContext : public TemplateStructIntf +{ + public: + ClassContext(ClassDef *); + ~ClassContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class NamespaceContext : public TemplateStructIntf +{ + public: + NamespaceContext(NamespaceDef *); + ~NamespaceContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class FileContext : public TemplateStructIntf +{ + public: + FileContext(FileDef *); + ~FileContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; +//---------------------------------------------------- + +class DirContext : public TemplateStructIntf +{ + public: + DirContext(DirDef *); + ~DirContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + + +//---------------------------------------------------- + +class PageContext : public TemplateStructIntf +{ + public: + PageContext(PageDef *); + ~PageContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class MemberContext : public TemplateStructIntf +{ + public: + MemberContext(MemberDef *); + ~MemberContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + + +//---------------------------------------------------- + +class ModuleContext : public TemplateStructIntf +{ + public: + ModuleContext(GroupDef *); + ~ModuleContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class NestedClassListContext : public TemplateListIntf +{ + public: + NestedClassListContext(); + ~NestedClassListContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + void append(ClassDef *cd); + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class ClassListContext : public TemplateListIntf +{ + public: + ClassListContext(); + ~ClassListContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class ClassInheritanceNodeContext : public TemplateStructIntf +{ + public: + ClassInheritanceNodeContext(ClassDef *); + ~ClassInheritanceNodeContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + void addChildren(const BaseClassList *bcl,bool hideSuper); + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class ClassInheritanceContext : public TemplateListIntf +{ + public: + ClassInheritanceContext(); + ~ClassInheritanceContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class ClassHierarchyContext : public TemplateStructIntf +{ + public: + ClassHierarchyContext(); + ~ClassHierarchyContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class NestingNodeContext : public TemplateStructIntf +{ + public: + NestingNodeContext(Definition *,bool addClasses); + ~NestingNodeContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class NestingContext : public TemplateListIntf +{ + public: + NestingContext(); + ~NestingContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses); + void addClasses(const ClassSDict &clDict,bool rootOnly); + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class ClassTreeContext : public TemplateStructIntf +{ + public: + ClassTreeContext(); + ~ClassTreeContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class NamespaceListContext : public TemplateListIntf +{ + public: + NamespaceListContext(); + ~NamespaceListContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class NamespaceTreeContext : public TemplateStructIntf +{ + public: + NamespaceTreeContext(); + ~NamespaceTreeContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class DirFileNodeContext : public TemplateStructIntf +{ + public: + DirFileNodeContext(Definition *); + ~DirFileNodeContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class DirFileContext : public TemplateListIntf +{ + public: + DirFileContext(); + ~DirFileContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + void addDirs(const DirSDict &); + void addDirs(const DirList &); + void addFiles(const FileNameList &); + void addFiles(const FileList &); + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class FileListContext : public TemplateListIntf +{ + public: + FileListContext(); + ~FileListContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class FileTreeContext : public TemplateStructIntf +{ + public: + FileTreeContext(); + ~FileTreeContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class PageNodeContext : public TemplateStructIntf +{ + public: + PageNodeContext(PageDef *); + ~PageNodeContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class PageNodeListContext : public TemplateListIntf +{ + public: + PageNodeListContext(); + ~PageNodeListContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + void addPages(const PageSDict &,bool rootOnly); + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class PageListContext : public TemplateStructIntf +{ + public: + PageListContext(); + ~PageListContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class PageTreeContext : public TemplateStructIntf +{ + public: + PageTreeContext(); + ~PageTreeContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class ModuleNodeContext : public TemplateStructIntf +{ + public: + ModuleNodeContext(GroupDef *); + ~ModuleNodeContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class ModuleListContext : public TemplateListIntf +{ + public: + ModuleListContext(); + ~ModuleListContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + void addModules(const GroupSDict &); + void addModules(const GroupList &); + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class ModuleTreeContext : public TemplateStructIntf +{ + public: + ModuleTreeContext(); + ~ModuleTreeContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class ExampleListContext : public TemplateStructIntf +{ + public: + ExampleListContext(); + ~ExampleListContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class NavPathElemContext : public TemplateStructIntf +{ + public: + NavPathElemContext(Definition *def); + ~NavPathElemContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + + +//---------------------------------------------------- + +class InheritanceNodeContext : public TemplateStructIntf +{ + public: + InheritanceNodeContext(ClassDef *cd,const QCString &name); + ~InheritanceNodeContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class InheritanceListContext : public TemplateListIntf +{ + public: + InheritanceListContext(const BaseClassList *list,bool baseClasses); + ~InheritanceListContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class MemberListContext : public TemplateListIntf +{ + public: + MemberListContext(); + MemberListContext(const MemberList *ml); + MemberListContext(MemberSDict *ml,bool doSort); + ~MemberListContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class MemberGroupInfoContext : public TemplateStructIntf +{ + public: + MemberGroupInfoContext(Definition *def,const QCString &relPath,const MemberGroup *mg); + ~MemberGroupInfoContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class MemberGroupListContext : public TemplateListIntf +{ + public: + MemberGroupListContext(); + MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list); + MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *mgDict,bool subGrouping); + ~MemberGroupListContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + private: + class Private; + Private *p; +}; + + +//---------------------------------------------------- + +class MemberListInfoContext : public TemplateStructIntf +{ + public: + MemberListInfoContext(Definition *def,const QCString &relPath, + const MemberList *ml,const QCString &title, + const QCString &subtitle=QCString()); + ~MemberListInfoContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class MemberInfoContext : public TemplateStructIntf +{ + public: + MemberInfoContext(const MemberInfo *mi); + ~MemberInfoContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class InheritedMemberInfoContext : public TemplateStructIntf +{ + public: + InheritedMemberInfoContext(ClassDef *cd,MemberList *ml,const QCString &title); + ~InheritedMemberInfoContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class InheritedMemberInfoListContext : public TemplateListIntf +{ + public: + InheritedMemberInfoListContext(); + void addMemberList(ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList=TRUE); + ~InheritedMemberInfoListContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class AllMembersListContext : public TemplateListIntf +{ + public: + AllMembersListContext(); + AllMembersListContext(const MemberNameInfoSDict *ml); + ~AllMembersListContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class ArgumentContext : public TemplateStructIntf +{ + public: + ArgumentContext(const Argument *arg,Definition *def,const QCString &relPath); + ~ArgumentContext(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class ArgumentListContext : public TemplateListIntf +{ + public: + ArgumentListContext(); + ArgumentListContext(const ArgumentList *al,Definition *def,const QCString &relPath); + ~ArgumentListContext(); + + // TemplateListIntf + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + private: + class Private; + Private *p; +}; + +//---------------------------------------------------- + +void generateOutputViaTemplate(); + +#endif diff --git a/src/dbusxmlscanner.cpp b/src/dbusxmlscanner.cpp index 12168dd..8b8df0d 100644 --- a/src/dbusxmlscanner.cpp +++ b/src/dbusxmlscanner.cpp @@ -870,7 +870,8 @@ void DBusXMLScanner::parseCode(CodeOutputInterface & /* codeOutIntf */, bool /* inlineFragment */, MemberDef * /* memberDef */, bool /*showLineNumbers*/, - Definition * /* searchCtx */) + Definition * /* searchCtx */, + bool /*collectXRefs*/ ) { } void DBusXMLScanner::resetCodeParserState() diff --git a/src/dbusxmlscanner.h b/src/dbusxmlscanner.h index 64ba1a7..e1504e9 100644 --- a/src/dbusxmlscanner.h +++ b/src/dbusxmlscanner.h @@ -51,7 +51,8 @@ public: bool inlineFragment=FALSE, MemberDef *memberDef=0, bool showLineNumbers=TRUE, - Definition *searchCtx=0 + Definition *searchCtx=0, + bool collectXRefs=TRUE ); void resetCodeParserState(); diff --git a/src/debug.cpp b/src/debug.cpp index c962214..a5000ff 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -21,6 +21,7 @@ #include <qdict.h> #include "debug.h" +#include "message.h" //------------------------------------------------------------------------ @@ -46,6 +47,7 @@ static LabelMap s_labels[] = { "extcmd", Debug::ExtCmd }, { "markdown", Debug::Markdown }, { "filteroutput", Debug::FilterOutput }, + { "lex", Debug::Lex }, { 0, (Debug::DebugMask)0 } }; @@ -97,9 +99,11 @@ static int labelToEnumValue(const char *l) if (event) return *event; else return 0; } -void Debug::setFlag(const char *lab) +int Debug::setFlag(const char *lab) { + int retVal = labelToEnumValue(lab); curMask = (DebugMask)(curMask | labelToEnumValue(lab)); + return retVal; } void Debug::clearFlag(const char *lab) @@ -117,3 +121,14 @@ bool Debug::isFlagSet(DebugMask mask) return (curMask & mask)!=0; } +void Debug::printFlags(void) +{ + int i; + for (i = 0; i < (int)(sizeof(s_labels)/sizeof(*s_labels)); i++) + { + if (s_labels[i].name) + { + msg("\t%s\n",s_labels[i].name); + } + } +} diff --git a/src/debug.h b/src/debug.h index bcac588..e1affab 100644 --- a/src/debug.h +++ b/src/debug.h @@ -36,12 +36,14 @@ class Debug Time = 0x00000200, ExtCmd = 0x00000400, Markdown = 0x00000800, - FilterOutput = 0x00001000 + FilterOutput = 0x00001000, + Lex = 0x00002000 }; static void print(DebugMask mask,int prio,const char *fmt,...); - static void setFlag(const char *label); + static int setFlag(const char *label); static void clearFlag(const char *label); static bool isFlagSet(DebugMask mask); + static void printFlags(void); static void setPriority(int p); private: diff --git a/src/declinfo.l b/src/declinfo.l index 3e4ad4a..58ecb05 100644 --- a/src/declinfo.l +++ b/src/declinfo.l @@ -231,6 +231,7 @@ ID "$"?([a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*)|(@[0-9]+) void parseFuncDecl(const QCString &decl,bool objC,QCString &cl,QCString &t, QCString &n,QCString &a,QCString &ftl,QCString &exc) { + printlex(yy_flex_debug, TRUE, __FILE__, NULL); inputString = decl; //printf("Input=`%s'\n",inputString); if (inputString==0) return; @@ -307,6 +308,7 @@ void parseFuncDecl(const QCString &decl,bool objC,QCString &cl,QCString &t, //printf("type=`%s' class=`%s' name=`%s' args=`%s'\n", // t.data(),cl.data(),n.data(),a.data()); + printlex(yy_flex_debug, FALSE, __FILE__, NULL); return; diff --git a/src/defargs.l b/src/defargs.l index fa945f6..5f64b66 100644 --- a/src/defargs.l +++ b/src/defargs.l @@ -55,6 +55,7 @@ #include "entry.h" #include "util.h" #include "arguments.h" +#include "message.h" #define YY_NEVER_INTERACTIVE 1 #define YY_NO_INPUT 1 @@ -212,6 +213,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" else // yytext=='<' { g_argSharpCount=0; + g_argRoundCount=0; BEGIN( CopyArgSharp ); } } @@ -239,6 +241,26 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" if (g_argRoundCount>0) g_argRoundCount--; else BEGIN( g_readArgContext ); } +<CopyArgSharp>"<<" { + if (g_argRoundCount>0) + { + *g_copyArgValue += yytext; + } + else + { + REJECT; + } + } +<CopyArgSharp>">>" { + if (g_argRoundCount>0) + { + *g_copyArgValue += yytext; + } + else + { + REJECT; + } + } <CopyArgSharp>"<" { g_argSharpCount++; *g_copyArgValue += *yytext; @@ -248,6 +270,14 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" if (g_argSharpCount>0) g_argSharpCount--; else BEGIN( g_readArgContext ); } +<CopyArgSharp>"(" { + g_argRoundCount++; + *g_copyArgValue += *yytext; + } +<CopyArgSharp>")" { + g_argRoundCount--; + *g_copyArgValue += *yytext; + } <CopyArgCurly>"{" { g_argCurlyCount++; *g_copyArgValue += *yytext; @@ -498,6 +528,7 @@ void stringToArgumentList(const char *argsString,ArgumentList* al,QCString *extr { if (al==0) return; if (argsString==0) return; + printlex(yy_flex_debug, TRUE, __FILE__, NULL); g_copyArgValue=0; g_curArgDocs.resize(0); @@ -520,6 +551,7 @@ void stringToArgumentList(const char *argsString,ArgumentList* al,QCString *extr defargsYYlex(); if (extraTypeChars) *extraTypeChars=g_extraTypeChars; //printf("stringToArgumentList(%s) result=%s\n",argsString,argListToString(al).data()); + printlex(yy_flex_debug, FALSE, __FILE__, NULL); } #if !defined(YY_FLEX_SUBMINOR_VERSION) diff --git a/src/definition.cpp b/src/definition.cpp index b259088..46147fc 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -959,7 +959,7 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.disable(OutputGenerator::Latex); } - // write line link (HTML, LaTeX optionally) + // write file link (HTML, LaTeX optionally) ol.writeObjectLink(0,fn,0,m_impl->body->fileDef->name()); ol.enableAll(); ol.disable(OutputGenerator::Html); @@ -1050,6 +1050,13 @@ void Definition::setBodyDef(FileDef *fd) m_impl->body->fileDef=fd; } +bool Definition::hasSources() const +{ + return m_impl->body && m_impl->body->startLine!=-1 && + m_impl->body->endLine>=m_impl->body->startLine && + m_impl->body->fileDef; +} + /*! Write code of this definition into the documentation */ void Definition::writeInlineCode(OutputList &ol,const char *scopeName) { @@ -1057,9 +1064,7 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName) ol.pushGeneratorState(); //printf("Source Fragment %s: %d-%d bodyDef=%p\n",name().data(), // m_startBodyLine,m_endBodyLine,m_bodyDef); - if (inlineSources && - m_impl->body && m_impl->body->startLine!=-1 && - m_impl->body->endLine>=m_impl->body->startLine && m_impl->body->fileDef) + if (inlineSources && hasSources()) { QCString codeFragment; int actualStart=m_impl->body->startLine,actualEnd=m_impl->body->endLine; @@ -1815,7 +1820,7 @@ int Definition::getEndBodyLine() const return m_impl->body ? m_impl->body->endLine : -1; } -FileDef *Definition::getBodyDef() +FileDef *Definition::getBodyDef() const { return m_impl->body ? m_impl->body->fileDef : 0; } @@ -1876,4 +1881,10 @@ void Definition::_setSymbolName(const QCString &name) m_symbolName=name; } +bool Definition::hasBriefDescription() const +{ + static bool briefMemberDesc = Config_getBool("BRIEF_MEMBER_DESC"); + return !briefDescription().isEmpty() && briefMemberDesc; +} + diff --git a/src/definition.h b/src/definition.h index 6b6e1d7..f444cc5 100644 --- a/src/definition.h +++ b/src/definition.h @@ -137,18 +137,18 @@ class Definition : public DefinitionIntf virtual QCString getSourceAnchor() const; /*! Returns the detailed description of this definition */ - QCString documentation() const; - + virtual QCString documentation() const; + /*! Returns the line number at which the detailed documentation was found. */ int docLine() const; - /*! Returns the file in which the detailed documentation block was found. + /*! Returns the file in which the detailed documentation block was found. * This can differ from getDefFileName(). */ QCString docFile() const; /*! Returns the brief description of this definition. This can include commands. */ - QCString briefDescription(bool abbreviate=FALSE) const; + virtual QCString briefDescription(bool abbreviate=FALSE) const; /*! Returns a plain text version of the brief description suitable for use * as a tool tip. @@ -243,7 +243,7 @@ class Definition : public DefinitionIntf /*! Returns the file in which the body of this item is located or 0 if no * body is available. */ - FileDef *getBodyDef(); + FileDef *getBodyDef() const; /** Returns the programming language this definition was written in. */ SrcLangExt getLanguage() const; @@ -259,6 +259,10 @@ class Definition : public DefinitionIntf MemberSDict *getReferencedByMembers() const; bool hasSections() const; + bool hasSources() const; + + /** returns TRUE if this class has a brief description */ + bool hasBriefDescription() const; QCString id() const; diff --git a/src/dia.cpp b/src/dia.cpp new file mode 100644 index 0000000..1032564 --- /dev/null +++ b/src/dia.cpp @@ -0,0 +1,88 @@ +/****************************************************************************** + * + * + * + * Copyright (C) 1997-2013 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#include "dia.h" +#include "portable.h" +#include "config.h" +#include "message.h" +#include "util.h" + +#include <qdir.h> + +static const int maxCmdLine = 40960; + +void writeDiaGraphFromFile(const char *inFile,const char *outDir, + const char *outFile,DiaOutputFormat format) +{ + QCString absOutFile = outDir; + absOutFile+=portable_pathSeparator(); + absOutFile+=outFile; + + // chdir to the output dir, so dot can find the font file. + QCString oldDir = QDir::currentDirPath().utf8(); + // go to the html output directory (i.e. path) + QDir::setCurrent(outDir); + //printf("Going to dir %s\n",QDir::currentDirPath().data()); + QCString diaExe = Config_getString("DIA_PATH")+"dia"+portable_commandExtension(); + QCString diaArgs; + QCString extension; + diaArgs+="-n "; + if (format==DIA_BITMAP) + { + diaArgs+="-t png-libart"; + extension=".png"; + } + else if (format==DIA_EPS) + { + diaArgs+="-t eps"; + extension=".eps"; + } + + diaArgs+=" -e \""; + diaArgs+=outFile; + diaArgs+=extension+"\""; + + diaArgs+=" \""; + diaArgs+=inFile; + diaArgs+="\""; + + int exitCode; + //printf("*** running: %s %s outDir:%s %s\n",diaExe.data(),diaArgs.data(),outDir,outFile); + portable_sysTimerStart(); + if ((exitCode=portable_system(diaExe,diaArgs,FALSE))!=0) + { + portable_sysTimerStop(); + goto error; + } + portable_sysTimerStop(); + if ( (format==DIA_EPS) && (Config_getBool("USE_PDFLATEX")) ) + { + QCString epstopdfArgs(maxCmdLine); + epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"", + outFile,outFile); + portable_sysTimerStart(); + if (portable_system("epstopdf",epstopdfArgs)!=0) + { + err("Problems running epstopdf. Check your TeX installation!\n"); + } + portable_sysTimerStop(); + } + +error: + QDir::setCurrent(oldDir); +} + diff --git a/src/dia.h b/src/dia.h new file mode 100644 index 0000000..01d5962 --- /dev/null +++ b/src/dia.h @@ -0,0 +1,30 @@ +/****************************************************************************** + * + * + * + * Copyright (C) 1997-2013 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#ifndef _DIA_H +#define _DIA_H + +class QCString; +class FTextStream; + +enum DiaOutputFormat { DIA_BITMAP , DIA_EPS }; + +void writeDiaGraphFromFile(const char *inFile,const char *outDir, + const char *outFile,DiaOutputFormat format); + +#endif + diff --git a/src/dirdef.cpp b/src/dirdef.cpp index fe6e47d..5df047a 100644 --- a/src/dirdef.cpp +++ b/src/dirdef.cpp @@ -329,12 +329,16 @@ void DirDef::endMemberDeclarations(OutputList &ol) ol.endMemberSections(); } +QCString DirDef::shortTitle() const +{ + return theTranslator->trDirReference(m_shortName); +} + void DirDef::writeDocumentation(OutputList &ol) { static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); ol.pushGeneratorState(); - QCString shortTitle=theTranslator->trDirReference(m_shortName); QCString title=theTranslator->trDirReference(m_dispName); startFile(ol,getOutputFileBase(),name(),title,HLI_None,!generateTreeView); @@ -348,7 +352,7 @@ void DirDef::writeDocumentation(OutputList &ol) startTitle(ol,getOutputFileBase()); ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); - ol.parseText(shortTitle); + ol.parseText(shortTitle()); ol.enableAll(); ol.disable(OutputGenerator::Html); ol.parseText(title); diff --git a/src/dirdef.h b/src/dirdef.h index 99e2137..8b11b2e 100644 --- a/src/dirdef.h +++ b/src/dirdef.h @@ -66,6 +66,7 @@ class DirDef : public Definition const QDict<UsedDir> *usedDirs() const { return m_usedDirs; } bool isParentOf(DirDef *dir) const; bool depGraphIsTrivial() const; + QCString shortTitle() const; // generate output void writeDocumentation(OutputList &ol); diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp index df922b3..47d3b98 100644 --- a/src/docbookgen.cpp +++ b/src/docbookgen.cpp @@ -57,13 +57,13 @@ //------------------ static const char index_xsd[] = -#include "index_xsd.h" +#include "index.xsd.h" ; //------------------ // static const char compound_xsd[] = -#include "compound_xsd.h" +#include "compound.xsd.h" ; //------------------ @@ -191,8 +191,7 @@ class DocbookCodeGenerator : public CodeOutputInterface { public: DocbookCodeGenerator(FTextStream &t) : m_t(t), m_lineNumber(-1), - m_insideCodeLine(FALSE), m_normalHLNeedStartTag(TRUE), - m_insideSpecialHL(FALSE) {} + m_insideCodeLine(FALSE), m_insideSpecialHL(FALSE) {} virtual ~DocbookCodeGenerator() {} void codify(const char *text) @@ -291,7 +290,6 @@ class DocbookCodeGenerator : public CodeOutputInterface bool m_isMemberRef; int col; bool m_insideCodeLine; - bool m_normalHLNeedStartTag; bool m_insideSpecialHL; }; diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp index ad5965d..aaea045 100644 --- a/src/docbookvisitor.cpp +++ b/src/docbookvisitor.cpp @@ -32,6 +32,7 @@ #include "config.h" #include "filedef.h" #include "msc.h" +#include "dia.h" DocbookDocVisitor::DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci) : DocVisitor(DocVisitor_Docbook), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE) @@ -1007,6 +1008,18 @@ void DocbookDocVisitor::visitPost(DocMscFile *df) if (m_hide) return; endMscFile(df->hasCaption()); } +void DocbookDocVisitor::visitPre(DocDiaFile *df) +{ + if (m_hide) return; + startDiaFile(df->file(),df->width(),df->height(),df->hasCaption()); +} + +void DocbookDocVisitor::visitPost(DocDiaFile *df) +{ + if (m_hide) return; + endDiaFile(df->hasCaption()); +} + void DocbookDocVisitor::visitPre(DocLink *lnk) { if (m_hide) return; @@ -1147,6 +1160,7 @@ void DocbookDocVisitor::visitPost(DocParamList *) void DocbookDocVisitor::visitPre(DocXRefItem *x) { if (m_hide) return; + if (x->title().isEmpty()) return; m_t << "<para><link linkend=\""; m_t << x->file() << "_1" << x->anchor(); m_t << "\">"; @@ -1155,9 +1169,10 @@ void DocbookDocVisitor::visitPre(DocXRefItem *x) m_t << " "; } -void DocbookDocVisitor::visitPost(DocXRefItem *) +void DocbookDocVisitor::visitPost(DocXRefItem *x) { if (m_hide) return; + if (x->title().isEmpty()) return; m_t << "</para>"; } @@ -1223,6 +1238,15 @@ void DocbookDocVisitor::visitPost(DocVhdlFlow *) // TODO: to be implemented } +void DocbookDocVisitor::visitPre(DocParBlock *) +{ +} + +void DocbookDocVisitor::visitPost(DocParBlock *) +{ +} + + void DocbookDocVisitor::filter(const char *str) { m_t << convertToXML(str); @@ -1327,6 +1351,80 @@ void DocbookDocVisitor::endMscFile(bool hasCaption) m_t << "</para>" << endl; } +void DocbookDocVisitor::writeDiaFile(const QCString &baseName) +{ + QCString shortName = baseName; + int i; + if ((i=shortName.findRev('/'))!=-1) + { + shortName=shortName.right(shortName.length()-i-1); + } + QCString outDir = Config_getString("DOCBOOK_OUTPUT"); + writeDiaGraphFromFile(baseName+".dia",outDir,shortName,DIA_BITMAP); + m_t << " <imagedata"; + m_t << " align=\"center\" fileref=\"" << shortName << ".png" << "\">"; + m_t << "</imagedata>" << endl; +} + +void DocbookDocVisitor::startDiaFile(const QCString &fileName, + const QCString &width, + const QCString &height, + bool hasCaption + ) +{ + QCString baseName=fileName; + int i; + if ((i=baseName.findRev('/'))!=-1) + { + baseName=baseName.right(baseName.length()-i-1); + } + if ((i=baseName.find('.'))!=-1) + { + baseName=baseName.left(i); + } + baseName.prepend("msc_"); + QCString outDir = Config_getString("DOCBOOK_OUTPUT"); + writeDiaGraphFromFile(fileName,outDir,baseName,DIA_BITMAP); + m_t << "<para>" << endl; + m_t << " <figure>" << endl; + m_t << " <title></title>" << endl; + m_t << " <mediaobject>" << endl; + m_t << " <imageobject>" << endl; + m_t << " <imagedata"; + if (!width.isEmpty()) + { + m_t << " width=\""; + m_t << width; + m_t << "\""; + } + else if (!height.isEmpty()) + { + m_t << " depth=\""; + m_t << height; + m_t << "\""; + } + m_t << " align=\"center\" fileref=\"" << baseName << ".png" << "\">"; + m_t << "</imagedata>" << endl; + m_t << " </imageobject>" << endl; + if (hasCaption) + { + m_t << " <caption>" << endl; + } +} + +void DocbookDocVisitor::endDiaFile(bool hasCaption) +{ + if (m_hide) return; + m_t << "endl"; + if (hasCaption) + { + m_t << " </caption>" << endl; + } + m_t << " </mediaobject>" << endl; + m_t << " </figure>" << endl; + m_t << "</para>" << endl; +} + void DocbookDocVisitor::writeDotFile(const QCString &baseName) { QCString shortName = baseName; diff --git a/src/docbookvisitor.h b/src/docbookvisitor.h index c79301d..a03e04a 100644 --- a/src/docbookvisitor.h +++ b/src/docbookvisitor.h @@ -103,6 +103,8 @@ class DocbookDocVisitor : public DocVisitor void visitPost(DocDotFile *); void visitPre(DocMscFile *); void visitPost(DocMscFile *); + void visitPre(DocDiaFile *); + void visitPost(DocDiaFile *); void visitPre(DocLink *); void visitPost(DocLink *); void visitPre(DocRef *); @@ -129,7 +131,10 @@ class DocbookDocVisitor : public DocVisitor void visitPost(DocHtmlBlockQuote *); void visitPre(DocVhdlFlow *); void visitPost(DocVhdlFlow *); - private: + void visitPre(DocParBlock *); + void visitPost(DocParBlock *); + + private: //-------------------------------------- // helper functions //-------------------------------------- @@ -143,6 +148,10 @@ class DocbookDocVisitor : public DocVisitor const QCString &height, bool hasCaption); void endMscFile(bool hasCaption); void writeMscFile(const QCString &fileName); + void startDiaFile(const QCString &fileName,const QCString &width, + const QCString &height, bool hasCaption); + void endDiaFile(bool hasCaption); + void writeDiaFile(const QCString &fileName); void startDotFile(const QCString &fileName,const QCString &width, const QCString &height, bool hasCaption); void endDotFile(bool hasCaption); diff --git a/src/docparser.cpp b/src/docparser.cpp index 5259d46..4a18b4e 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -52,6 +52,7 @@ #include "formula.h" #include "config.h" #include "growbuf.h" +#include "markdown.h" // debug off #define DBG(x) do {} while(0) @@ -269,6 +270,14 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type) break; } QCString outputFile = outputDir+"/"+result; + QFileInfo outfi(outputFile); + if (outfi.isSymLink()) + { + QFile::remove(outputFile); + warn_doc_error(g_fileName,doctokenizerYYlineno, + "destination of image %s is a symlink, replacing with image", + qPrint(outputFile)); + } if (outputFile!=inputFile) // prevent copying to ourself { QFile outImage(outputFile.data()); @@ -287,6 +296,10 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type) "could not write output image %s",qPrint(outputFile)); } } + else + { + printf("Source & Destination are the same!\n"); + } } else { @@ -1562,6 +1575,7 @@ DocSymbol::SymType DocSymbol::decodeSymbol(const QCString &symName,char *letter) { int l=symName.length(); DBG(("decodeSymbol(%s) l=%d\n",qPrint(symName),l)); + // TODO: replace this with a hash if (symName=="©") return DocSymbol::Copy; else if (symName=="™") return DocSymbol::Tm; else if (symName=="&tm;") return DocSymbol::Tm; // alias for ™ @@ -2404,8 +2418,13 @@ DocRef::DocRef(DocNode *parent,const QCString &target,const QCString &context) : QCString anchor; //printf("DocRef::DocRef(target=%s,context=%s)\n",target.data(),context.data()); ASSERT(!target.isEmpty()); + SrcLangExt lang = getLanguageFromFileName(target); m_relPath = g_relPath; SectionInfo *sec = Doxygen::sectionDict->find(target); + if (sec==0 && lang==SrcLangExt_Markdown) // lookup as markdown file + { + sec = Doxygen::sectionDict->find(markdownFileNameToId(target)); + } if (sec) // ref to section or anchor { PageDef *pd = 0; @@ -2874,6 +2893,92 @@ void DocMscFile::parse() //--------------------------------------------------------------------------- +DocDiaFile::DocDiaFile(DocNode *parent,const QCString &name,const QCString &context) : + m_name(name), m_relPath(g_relPath), m_context(context) +{ + m_parent = parent; +} + +void DocDiaFile::parse() +{ + g_nodeStack.push(this); + DBG(("DocDiaFile::parse() start\n")); + + doctokenizerYYsetStateTitle(); + int tok; + while ((tok=doctokenizerYYlex())) + { + if (!defaultHandleToken(this,tok,m_children)) + { + switch (tok) + { + case TK_COMMAND: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Illegal command %s as part of a \\diafile", + qPrint(g_token->name)); + break; + case TK_SYMBOL: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", + qPrint(g_token->name)); + break; + default: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", + tokToString(tok)); + break; + } + } + } + tok=doctokenizerYYlex(); + while (tok==TK_WORD) // there are values following the title + { + if (g_token->name=="width") + { + m_width=g_token->chars; + } + else if (g_token->name=="height") + { + m_height=g_token->chars; + } + else + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unknown option %s after image title", + qPrint(g_token->name)); + } + tok=doctokenizerYYlex(); + } + ASSERT(tok==0); + doctokenizerYYsetStatePara(); + handlePendingStyleCommands(this,m_children); + + bool ambig; + FileDef *fd = findFileDef(Doxygen::diaFileNameDict,m_name,ambig); + if (fd==0 && m_name.right(4)!=".dia") // try with .dia extension as well + { + fd = findFileDef(Doxygen::diaFileNameDict,m_name+".dia",ambig); + } + if (fd) + { + m_file = fd->absFilePath(); + } + else if (ambig) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"included dia file name %s is ambiguous.\n" + "Possible candidates:\n%s",qPrint(m_name), + qPrint(showFileDefMatches(Doxygen::exampleNameDict,m_name)) + ); + } + else + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"included dia file %s is not found " + "in any of the paths specified via DIAFILE_DIRS!",qPrint(m_name)); + } + + DBG(("DocDiaFile::parse() end\n")); + DocNode *n=g_nodeStack.pop(); + ASSERT(n==this); +} + +//--------------------------------------------------------------------------- + DocVhdlFlow::DocVhdlFlow(DocNode *parent) { m_parent = parent; @@ -4323,6 +4428,33 @@ int DocHtmlBlockQuote::parse() //--------------------------------------------------------------------------- +int DocParBlock::parse() +{ + DBG(("DocParBlock::parse() start\n")); + int retval=0; + g_nodeStack.push(this); + + // parse one or more paragraphs + bool isFirst=TRUE; + DocPara *par=0; + do + { + par = new DocPara(this); + if (isFirst) { par->markFirst(); isFirst=FALSE; } + m_children.append(par); + retval=par->parse(); + } + while (retval==TK_NEWPARA); + if (par) par->markLast(); + + DocNode *n=g_nodeStack.pop(); + ASSERT(n==this); + DBG(("DocParBlock::parse() end retval=%x\n",retval)); + return (retval==RetVal_EndBlockQuote) ? RetVal_OK : retval; +} + +//--------------------------------------------------------------------------- + int DocSimpleListItem::parse() { g_nodeStack.push(this); @@ -5077,6 +5209,30 @@ void DocPara::handleMscFile(const QCString &cmdName) df->parse(); } +void DocPara::handleDiaFile(const QCString &cmdName) +{ + int tok=doctokenizerYYlex(); + if (tok!=TK_WHITESPACE) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"expected whitespace after %s command", + qPrint(cmdName)); + return; + } + doctokenizerYYsetStateFile(); + tok=doctokenizerYYlex(); + doctokenizerYYsetStatePara(); + if (tok!=TK_WORD) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected token %s as the argument of %s", + tokToString(tok),qPrint(cmdName)); + return; + } + QCString name = g_token->name; + DocDiaFile *df = new DocDiaFile(this,name,g_context); + m_children.append(df); + df->parse(); +} + void DocPara::handleVhdlFlow() { DocVhdlFlow *vf = new DocVhdlFlow(this); @@ -5509,6 +5665,9 @@ int DocPara::handleCommand(const QCString &cmdName) doctokenizerYYsetStatePara(); } break; + case CMD_ENDPARBLOCK: + retval=RetVal_EndParBlock; + break; case CMD_ENDCODE: case CMD_ENDHTMLONLY: case CMD_ENDMANONLY: @@ -5567,6 +5726,13 @@ int DocPara::handleCommand(const QCString &cmdName) case CMD_ENDINTERNAL: retval = RetVal_EndInternal; break; + case CMD_PARBLOCK: + { + DocParBlock *block = new DocParBlock(this); + m_children.append(block); + retval = block->parse(); + } + break; case CMD_COPYDOC: // fall through case CMD_COPYBRIEF: // fall through case CMD_COPYDETAILS: @@ -5615,6 +5781,9 @@ int DocPara::handleCommand(const QCString &cmdName) case CMD_MSCFILE: handleMscFile(cmdName); break; + case CMD_DIAFILE: + handleDiaFile(cmdName); + break; case CMD_LINK: handleLink(cmdName,FALSE); break; @@ -6920,11 +7089,19 @@ static QCString extractCopyDocId(const char *data, uint &j, uint len) } if (!found) j++; } + if (qstrncmp(data+j," const",6)==0) + { + j+=6; + } + else if (qstrncmp(data+j," volatile",9)==0) + { + j+=9; + } e=j; QCString id(e-s+1); if (e>s) memcpy(id.data(),data+s,e-s); id.at(e-s)='\0'; - //printf("extractCopyDocId=%s input='%s'\n",id.data(),&data[s]); + //printf("extractCopyDocId='%s' input='%s'\n",id.data(),&data[s]); return id; } diff --git a/src/docparser.h b/src/docparser.h index b80e5e1..050c871 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -130,7 +130,9 @@ class DocNode Kind_Text = 47, Kind_MscFile = 48, Kind_HtmlBlockQuote = 49, - Kind_VhdlFlow = 50 + Kind_VhdlFlow = 50, + Kind_ParBlock = 51, + Kind_DiaFile = 52 }; /*! Creates a new node */ DocNode() : m_parent(0), m_insidePre(FALSE) {} @@ -687,6 +689,30 @@ class DocMscFile : public CompAccept<DocMscFile>, public DocNode QCString m_context; }; +/** Node representing a dia file */ +class DocDiaFile : public CompAccept<DocDiaFile>, public DocNode +{ + public: + DocDiaFile(DocNode *parent,const QCString &name,const QCString &context); + void parse(); + Kind kind() const { return Kind_DiaFile; } + QCString name() const { return m_name; } + QCString file() const { return m_file; } + QCString relPath() const { return m_relPath; } + bool hasCaption() const { return !m_children.isEmpty(); } + QCString width() const { return m_width; } + QCString height() const { return m_height; } + QCString context() const { return m_context; } + void accept(DocVisitor *v) { CompAccept<DocDiaFile>::accept(this,v); } + private: + QCString m_name; + QCString m_file; + QCString m_relPath; + QCString m_width; + QCString m_height; + QCString m_context; +}; + /** Node representing a VHDL flow chart */ class DocVhdlFlow : public CompAccept<DocVhdlFlow>, public DocNode { @@ -900,6 +926,19 @@ class DocInternal : public CompAccept<DocInternal>, public DocNode private: }; +/** Node representing an block of paragraphs */ +class DocParBlock : public CompAccept<DocParBlock>, public DocNode +{ + public: + DocParBlock(DocNode *parent) { m_parent = parent; } + int parse(); + Kind kind() const { return Kind_ParBlock; } + void accept(DocVisitor *v) { CompAccept<DocParBlock>::accept(this,v); } + + private: +}; + + /** Node representing a simple list */ class DocSimpleList : public CompAccept<DocSimpleList>, public DocNode { @@ -983,8 +1022,7 @@ class DocParamSect : public CompAccept<DocParamSect>, public DocNode In=1, Out=2, InOut=3, Unspecified=0 }; DocParamSect(DocNode *parent,Type t) - : m_type(t), m_dir(Unspecified), - m_hasInOutSpecifier(FALSE), m_hasTypeSpecifier(FALSE) + : m_type(t), m_hasInOutSpecifier(FALSE), m_hasTypeSpecifier(FALSE) { m_parent = parent; } int parse(const QCString &cmdName,bool xmlContext,Direction d); Kind kind() const { return Kind_ParamSect; } @@ -995,7 +1033,6 @@ class DocParamSect : public CompAccept<DocParamSect>, public DocNode private: Type m_type; - Direction m_dir; bool m_hasInOutSpecifier; bool m_hasTypeSpecifier; }; @@ -1027,6 +1064,7 @@ class DocPara : public CompAccept<DocPara>, public DocNode void handleImage(const QCString &cmdName); void handleDotFile(const QCString &cmdName); void handleMscFile(const QCString &cmdName); + void handleDiaFile(const QCString &cmdName); void handleInclude(const QCString &cmdName,DocInclude::Type t); void handleLink(const QCString &cmdName,bool isJavaLink); void handleCite(); @@ -1189,7 +1227,6 @@ class DocHtmlCaption : public CompAccept<DocHtmlCaption>, public DocNode private: HtmlAttribList m_attribs; - bool m_atTop; }; /** Node representing a HTML table row */ diff --git a/src/doctokenizer.h b/src/doctokenizer.h index d2e6ea1..ca0490c 100644 --- a/src/doctokenizer.h +++ b/src/doctokenizer.h @@ -63,7 +63,8 @@ enum Tokens RetVal_CloseXml = 0x10013, RetVal_EndBlockQuote = 0x10014, RetVal_CopyDoc = 0x10015, - RetVal_EndInternal = 0x10016 + RetVal_EndInternal = 0x10016, + RetVal_EndParBlock = 0x10017 }; /** @brief Data associated with a token used by the comment block parser. */ diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 3c924cf..5ba1a72 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -320,6 +320,9 @@ static int yyread(char *buf,int max_size) } //-------------------------------------------------------------------------- +#define REAL_YY_DECL int doctokenizerYYlex (void) +#define YY_DECL static int local_doctokinizer(void) +#define LOCAL_YY_DECL local_doctokinizer() %} @@ -355,6 +358,7 @@ INOUT "inout"|"in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLAN PARAMIO {CMD}param{BLANK}*"["{BLANK}*{INOUT}{BLANK}*"]" TEMPCHAR [a-z_A-Z0-9.,: \t\*\&\(\)\[\]] FUNCCHAR [a-z_A-Z0-9,:\<\> \t\^\*\&\[\]] +FUNCPART {FUNCCHAR}*("("{FUNCCHAR}*")"{FUNCCHAR}*)? SCOPESEP "::"|"#"|"." TEMPLPART "<"{TEMPCHAR}*">" ANONNS "anonymous_namespace{"[^}]*"}" @@ -363,7 +367,7 @@ SCOPEKEYS ":"({ID}":")* SCOPECPP {SCOPEPRE}*(~)?{ID}{TEMPLPART}? SCOPEOBJC {SCOPEPRE}?{ID}{SCOPEKEYS}? SCOPEMASK {SCOPECPP}|{SCOPEOBJC} -FUNCARG "("{FUNCCHAR}*")"({BLANK}*("volatile"|"const"){BLANK})? +FUNCARG "("{FUNCPART}")"({BLANK}*("volatile"|"const"){BLANK})? OPNEW {BLANK}+"new"({BLANK}*"[]")? OPDEL {BLANK}+"delete"({BLANK}*"[]")? OPNORM {OPNEW}|{OPDEL}|"+"|"-"|"*"|"/"|"%"|"^"|"&"|"|"|"~"|"!"|"="|"<"|">"|"+="|"-="|"*="|"/="|"%="|"^="|"&="|"|="|"<<"|">>"|"<<="|">>="|"=="|"!="|"<="|">="|"&&"|"||"|"++"|"--"|","|"->*"|"->"|"[]"|"()" @@ -386,7 +390,7 @@ HTMLKEYU "STRONG"|"CENTER"|"TABLE"|"CAPTION"|"SMALL"|"CODE"|"DFN"|"VAR"|"IMG"|" HTMLKEYW {HTMLKEYL}|{HTMLKEYU} REFWORD2 ("#"|"::")?((({ID}{TEMPLPART}?)|{ANONNS})("."|"#"|"::"|"-"|"/"))*({ID}{TEMPLPART}?(":")?){FUNCARG}? REFWORD3 ({ID}":")*{ID}":"? -REFWORD {LABELID}|{REFWORD2}|{REFWORD3} +REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2} %option noyywrap %option yylineno @@ -735,7 +739,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} } <St_CodeOpt>{BLANK}*"{"(".")?{LABELID}"}" { g_token->name = yytext; - int i=g_token->name.find('{'); + int i=g_token->name.find('{'); /* } to keep vi happy */ g_token->name = g_token->name.mid(i+1,g_token->name.length()-i-2); BEGIN(St_Code); } @@ -1022,6 +1026,10 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} } <St_Param>[^ \t\n,]+ { g_token->name = yytext; + if (g_token->name.at(yyleng-1)==':') + { + g_token->name=g_token->name.left(yyleng-1); + } return TK_WORD; } <St_Param>{WS}*","{WS}* /* param separator */ @@ -1184,6 +1192,7 @@ void doctokenizerYYFindSections(const char *input,Definition *d, MemberGroup *mg,const char *fileName) { if (input==0) return; + printlex(yy_flex_debug, TRUE, __FILE__, fileName); g_inputString = input; //printf("parsing --->`%s'<---\n",input); g_inputPos = 0; @@ -1193,6 +1202,7 @@ void doctokenizerYYFindSections(const char *input,Definition *d, BEGIN(St_Sections); doctokenizerYYlineno = 1; doctokenizerYYlex(); + printlex(yy_flex_debug, FALSE, __FILE__, fileName); } void doctokenizerYYinit(const char *input,const char *fileName) @@ -1380,6 +1390,13 @@ void doctokenizerYYendAutoList() g_autoListLevel--; } +REAL_YY_DECL +{ + printlex(yy_flex_debug, TRUE, __FILE__, g_fileName); + int retval = LOCAL_YY_DECL; + printlex(yy_flex_debug, FALSE, __FILE__, g_fileName); + return retval; +} #if !defined(YY_FLEX_SUBMINOR_VERSION) extern "C" { // some bogus code to keep the compiler happy void doctokenizerYYdummy() { yy_flex_realloc(0,0); } diff --git a/src/docvisitor.h b/src/docvisitor.h index 240e137..d12295c 100644 --- a/src/docvisitor.h +++ b/src/docvisitor.h @@ -67,6 +67,7 @@ class DocHtmlHeader; class DocImage; class DocDotFile; class DocMscFile; +class DocDiaFile; class DocLink; class DocCite; class DocRef; @@ -82,6 +83,7 @@ class DocText; class DocSimpleSectSep; class DocHtmlBlockQuote; class DocVhdlFlow; +class DocParBlock; /*! @brief Abstract visitor that participates in the visitor pattern. */ @@ -165,6 +167,8 @@ class DocVisitor virtual void visitPost(DocDotFile *) = 0; virtual void visitPre(DocMscFile *) = 0; virtual void visitPost(DocMscFile *) = 0; + virtual void visitPre(DocDiaFile *) = 0; + virtual void visitPost(DocDiaFile *) = 0; virtual void visitPre(DocLink *) = 0; virtual void visitPost(DocLink *) = 0; virtual void visitPre(DocRef *) = 0; @@ -189,6 +193,8 @@ class DocVisitor virtual void visitPost(DocHtmlBlockQuote *) = 0; virtual void visitPre(DocVhdlFlow *) = 0; virtual void visitPost(DocVhdlFlow *) = 0; + virtual void visitPre(DocParBlock *) = 0; + virtual void visitPost(DocParBlock *) = 0; /*! @} */ }; diff --git a/src/dot.cpp b/src/dot.cpp index 7d9e795..8d9ba3f 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -1180,8 +1180,8 @@ uint DotRunnerQueue::count() const //-------------------------------------------------------------------- -DotWorkerThread::DotWorkerThread(int id,DotRunnerQueue *queue) - : m_id(id), m_queue(queue) +DotWorkerThread::DotWorkerThread(DotRunnerQueue *queue) + : m_queue(queue) { m_cleanupItems.setAutoDelete(TRUE); } @@ -1235,7 +1235,7 @@ DotManager::DotManager() : m_dotMaps(1007) if (numThreads==0) numThreads = QMAX(2,QThread::idealThreadCount()+1); for (i=0;i<numThreads;i++) { - DotWorkerThread *thread = new DotWorkerThread(i,m_queue); + DotWorkerThread *thread = new DotWorkerThread(m_queue); thread->start(); if (thread->isRunning()) { @@ -236,7 +236,6 @@ class DotCallGraph DotNode *m_startNode; static int m_curNodeNumber; QDict<DotNode> *m_usedNodes; - int m_recDepth; bool m_inverse; QCString m_diskName; Definition * m_scope; @@ -406,11 +405,10 @@ class DotRunnerQueue class DotWorkerThread : public QThread { public: - DotWorkerThread(int id,DotRunnerQueue *queue); + DotWorkerThread(DotRunnerQueue *queue); void run(); void cleanup(); private: - int m_id; DotRunnerQueue *m_queue; QList<DotRunner::CleanupItem> m_cleanupItems; }; diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 14d34c0..41fca96 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -97,6 +97,7 @@ #include "docsets.h" #include "formula.h" #include "settings.h" +#include "context.h" #define RECURSE_ENTRYTREE(func,var) \ do { if (var->children()) { \ @@ -132,7 +133,8 @@ FileNameDict *Doxygen::includeNameDict = 0; // include names FileNameDict *Doxygen::exampleNameDict = 0; // examples FileNameDict *Doxygen::imageNameDict = 0; // images FileNameDict *Doxygen::dotFileNameDict = 0; // dot files -FileNameDict *Doxygen::mscFileNameDict = 0; // dot files +FileNameDict *Doxygen::mscFileNameDict = 0; // msc files +FileNameDict *Doxygen::diaFileNameDict = 0; // dia files StringDict Doxygen::namespaceAliasDict(257); // all namespace aliases StringDict Doxygen::tagDestinationDict(257); // all tag locations QDict<void> Doxygen::expandAsDefinedDict(257); // all macros that should be expanded @@ -176,6 +178,7 @@ static QDict<FileDef> g_usingDeclarations(1009); // used classes static FileStorage *g_storage = 0; static bool g_successfulRun = FALSE; static bool g_dumpSymbolMap = FALSE; +static bool g_useOutputTemplate = FALSE; void clearAll() { @@ -196,6 +199,7 @@ void clearAll() Doxygen::imageNameDict->clear(); Doxygen::dotFileNameDict->clear(); Doxygen::mscFileNameDict->clear(); + Doxygen::diaFileNameDict->clear(); Doxygen::formulaDict->clear(); Doxygen::formulaNameDict->clear(); Doxygen::tagDestinationDict.clear(); @@ -262,6 +266,8 @@ void statistics() Doxygen::dotFileNameDict->statistics(); fprintf(stderr,"--- mscFileNameDict stats ----\n"); Doxygen::mscFileNameDict->statistics(); + fprintf(stderr,"--- diaFileNameDict stats ----\n"); + Doxygen::diaFileNameDict->statistics(); //fprintf(stderr,"--- g_excludeNameDict stats ----\n"); //g_excludeNameDict.statistics(); fprintf(stderr,"--- aliasDict stats ----\n"); @@ -1330,8 +1336,7 @@ static void addClassToContext(EntryNav *rootNav) // see if the class is found inside a namespace //bool found=addNamespace(root,cd); - // the empty string test is needed for extract all case - cd->insertUsedFile(root->fileName); + cd->insertUsedFile(fd); // add class to the list //printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data()); @@ -1531,7 +1536,6 @@ static ClassDef *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,const QC gd->addClass(cd); } } - //cd->insertUsedFile(root->fileName); //printf("** adding class %s based on %s\n",fullName.data(),templ->name().data()); Doxygen::classSDict->append(fullName,cd); @@ -1770,7 +1774,7 @@ static void buildNamespaceList(EntryNav *rootNav) // the empty string test is needed for extract all case nd->setBriefDescription(root->brief,root->briefFile,root->briefLine); - nd->insertUsedFile(root->fileName); + nd->insertUsedFile(fd); nd->setBodySegment(root->bodyLine,root->endBodyLine); nd->setBodyDef(fd); // add class to the list @@ -1832,6 +1836,10 @@ static void findUsingDirectives(EntryNav *rootNav) //printf("Found using directive %s at line %d of %s\n", // root->name.data(),root->startLine,root->fileName.data()); QCString name=substitute(root->name,".","::"); + if (name.right(2)=="::") + { + name=name.left(name.length()-2); + } if (!name.isEmpty()) { NamespaceDef *usingNd = 0; @@ -1948,7 +1956,7 @@ static void findUsingDirectives(EntryNav *rootNav) // the empty string test is needed for extract all case nd->setBriefDescription(root->brief,root->briefFile,root->briefLine); - nd->insertUsedFile(root->fileName); + nd->insertUsedFile(fd); // add class to the list Doxygen::namespaceSDict->inSort(name,nd); nd->setRefItems(root->sli); @@ -2367,7 +2375,7 @@ static MemberDef *addVariableToClass( md->setRefItems(root->sli); //TODO: insert FileDef instead of filename strings. - cd->insertUsedFile(root->fileName); + cd->insertUsedFile(rootNav->fileDef()); rootNav->changeSection(Entry::EMPTY_SEC); return md; } @@ -2787,10 +2795,13 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1) root->type=root->name; static const QRegExp reName("[a-z_A-Z][a-z_A-Z0-9]*"); - int l; + int l=0; int i=root->args.isEmpty() ? -1 : reName.match(root->args,0,&l); - root->name=root->args.mid(i,l); - root->args=root->args.mid(i+l,root->args.find(')',i+l)-i-l); + if (i!=-1) + { + root->name=root->args.mid(i,l); + root->args=root->args.mid(i+l,root->args.find(')',i+l)-i-l); + } //printf("new: type=`%s' name=`%s' args=`%s'\n", // root->type.data(),root->name.data(),root->args.data()); } @@ -3105,7 +3116,7 @@ static void addInterfaceOrServiceToServiceOrSingleton( findClassRelation(rootNav,cd,cd,&base,0,DocumentedOnly,true) || findClassRelation(rootNav,cd,cd,&base,0,Undocumented,true); // add file to list of used files - cd->insertUsedFile(root->fileName); + cd->insertUsedFile(fd); addMemberToGroups(root,md); rootNav->changeSection(Entry::EMPTY_SEC); @@ -3348,7 +3359,7 @@ static void addMethodToClass(EntryNav *rootNav,ClassDef *cd, // add member to the class cd cd->insertMember(md); // add file to list of used files - cd->insertUsedFile(root->fileName); + cd->insertUsedFile(fd); addMemberToGroups(root,md); rootNav->changeSection(Entry::EMPTY_SEC); @@ -3569,7 +3580,7 @@ static void buildFunctionList(EntryNav *rootNav) md->setDocumentation(root->doc,root->docFile,root->docLine); md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine); md->setDocsForDefinition(!root->proto); - if (md->getStartBodyLine()!=-1 && md->getStartBodyLine()==-1) + if (md->getStartBodyLine()==-1 && root->bodyLine!=-1) { md->setBodySegment(root->bodyLine,root->endBodyLine); md->setBodyDef(rfd); @@ -4822,7 +4833,7 @@ static bool findClassRelation( // add this class as super class to the base class baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec); // the undocumented base was found in this file - baseClass->insertUsedFile(root->fileName); + baseClass->insertUsedFile(rootNav->fileDef()); baseClass->setOuterScope(Doxygen::globalScope); if (baseClassName.right(2)=="-p") { @@ -5335,7 +5346,7 @@ static void addMemberDocs(EntryNav *rootNav, md->mergeMemberSpecifiers(root->spec); md->addSectionsToDefinition(root->anchors); addMemberToGroups(root,md); - if (cd) cd->insertUsedFile(root->fileName); + if (cd) cd->insertUsedFile(rfd); //printf("root->mGrpId=%d\n",root->mGrpId); if (root->mGrpId!=-1) { @@ -6125,6 +6136,21 @@ static void findMember(EntryNav *rootNav, matching = FALSE; } } + bool classIsTemplate = md->getClassDef() && md->getClassDef()->templateArguments(); + bool mdIsTemplate = md->templateArguments()!=0; + bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate; + bool rootIsTemplate = root->tArgLists!=0; + //printf("classIsTemplate=%d mdIsTemplate=%d rootIsTemplate=%d\n",classIsTemplate,mdIsTemplate,rootIsTemplate); + if ((mdIsTemplate || rootIsTemplate) && // either md or root is a template + ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate)) + ) + { + // Method with template return type does not match method without return type + // even if the parameters are the same. See also bug709052 + Debug::print(Debug::FindMembers,0, + "5b. Comparing return types: template v.s. non-template\n"); + matching = FALSE; + } Debug::print(Debug::FindMembers,0, @@ -6407,7 +6433,7 @@ static void findMember(EntryNav *rootNav, md->setMemberGroupId(root->mGrpId); mn->append(md); cd->insertMember(md); - cd->insertUsedFile(root->fileName); + cd->insertUsedFile(fd); md->setRefItems(root->sli); } } @@ -6604,7 +6630,7 @@ static void findMember(EntryNav *rootNav, //md->setMemberDefTemplateArguments(root->mtArgList); mn->append(md); cd->insertMember(md); - cd->insertUsedFile(root->fileName); + cd->insertUsedFile(fd); md->setRefItems(root->sli); if (root->relatesType == Duplicate) md->setRelatedAlso(cd); if (!isDefine) @@ -6676,7 +6702,7 @@ localObjCMethod: md->setMemberSpecifiers(root->spec); md->setMemberGroupId(root->mGrpId); cd->insertMember(md); - cd->insertUsedFile(root->fileName); + cd->insertUsedFile(fd); md->setRefItems(root->sli); if ((mn=Doxygen::memberNameSDict->find(root->name))) { @@ -7060,7 +7086,7 @@ static void findEnums(EntryNav *rootNav) md->setDefinition(cd->name()+"::"+name+baseType); } cd->insertMember(md); - cd->insertUsedFile(root->fileName); + cd->insertUsedFile(fd); } md->setDocumentation(root->doc,root->docFile,root->docLine); md->setDocsForDefinition(!root->proto); @@ -8585,7 +8611,7 @@ static void findMainPage(EntryNav *rootNav) indexName, root->brief+root->doc+root->inbodyDocs,title); //setFileNameForSections(root->anchors,"index",Doxygen::mainPage); Doxygen::mainPage->setBriefDescription(root->brief,root->briefFile,root->briefLine); - Doxygen::mainPage->setFileName(indexName); + Doxygen::mainPage->setFileName(indexName,TRUE); Doxygen::mainPage->setShowToc(root->stat); addPageToContext(Doxygen::mainPage,rootNav); @@ -8783,7 +8809,7 @@ static void buildExampleList(EntryNav *rootNav) PageDef *pd=new PageDef(root->fileName,root->startLine, root->name,root->brief+root->doc+root->inbodyDocs,root->args); pd->setBriefDescription(root->brief,root->briefFile,root->briefLine); - pd->setFileName(convertNameToFile(pd->name()+"-example",FALSE,TRUE)); + pd->setFileName(convertNameToFile(pd->name()+"-example",FALSE,TRUE),FALSE); pd->addSectionsToDefinition(root->anchors); pd->setLanguage(root->lang); //pi->addSections(root->anchors); @@ -9128,7 +9154,7 @@ static void copyExtraFiles(const QCString& filesOption,const QCString &outputOpt QFileInfo fi(fileName); if (!fi.exists()) { - err("Extra file '%s' specified in" + filesOption + " does not exist!\n", fileName.data()); + err("Extra file '%s' specified in " + filesOption + " does not exist!\n", fileName.data()); } else { @@ -9757,6 +9783,18 @@ static void dumpSymbolMap() } } +// print developer options of doxygen +static void devUsage() +{ + msg("Developer parameters:\n"); + msg(" -m dump symbol map\n"); + msg(" -b output to wizard\n"); + msg(" -T activates output generation via Django like template\n"); + msg(" -d <level> enable a debug level, such as (multiple invocations of -d are possible):\n"); + Debug::printFlags(); +} + + //---------------------------------------------------------------------------- // print the usage of doxygen @@ -9780,11 +9818,11 @@ static void usage(const char *name) msg(" RTF: %s -w rtf styleSheetFile\n",name); msg(" HTML: %s -w html headerFile footerFile styleSheetFile [configFile]\n",name); msg(" LaTeX: %s -w latex headerFile footerFile styleSheetFile [configFile]\n\n",name); - msg("6) Use doxygen to generate an rtf extensions file\n"); + msg("6) Use doxygen to generate a rtf extensions file\n"); msg(" RTF: %s -e rtf extensionsFile\n\n",name); msg("If -s is specified the comments of the configuration items in the config file will be omitted.\n"); msg("If configName is omitted `Doxyfile' will be used as a default.\n\n"); - exit(1); + msg("-v print version string\n"); } //---------------------------------------------------------------------------- @@ -9863,6 +9901,7 @@ void initDoxygen() Doxygen::imageNameDict->setAutoDelete(TRUE); Doxygen::dotFileNameDict = new FileNameDict(257); Doxygen::mscFileNameDict = new FileNameDict(257); + Doxygen::diaFileNameDict = new FileNameDict(257); Doxygen::memGrpInfoDict.setAutoDelete(TRUE); Doxygen::tagDestinationDict.setAutoDelete(TRUE); Doxygen::dirRelations.setAutoDelete(TRUE); @@ -9903,6 +9942,7 @@ void cleanUpDoxygen() delete Doxygen::imageNameDict; delete Doxygen::dotFileNameDict; delete Doxygen::mscFileNameDict; + delete Doxygen::diaFileNameDict; delete Doxygen::mainPage; delete Doxygen::pageSDict; delete Doxygen::exampleSDict; @@ -9977,6 +10017,7 @@ void readConfiguration(int argc, char **argv) bool shortList=FALSE; bool updateConfig=FALSE; bool genLayout=FALSE; + int retVal; while (optind<argc && argv[optind][0]=='-' && (isalpha(argv[optind][1]) || argv[optind][1]=='?' || argv[optind][1]=='-') @@ -10000,7 +10041,20 @@ void readConfiguration(int argc, char **argv) break; case 'd': debugLabel=getArg(argc,argv,optind); - Debug::setFlag(debugLabel); + if (!debugLabel) + { + err("option \"-d\" is missing debug specifier.\n"); + devUsage(); + cleanUpDoxygen(); + exit(1); + } + retVal = Debug::setFlag(debugLabel); + if (!retVal) + { + err("option \"-d\" has unknown debug specifier: \"%s\".\n",debugLabel); + cleanUpDoxygen(); + exit(1); + } break; case 's': shortList=TRUE; @@ -10012,7 +10066,7 @@ void readConfiguration(int argc, char **argv) formatName=getArg(argc,argv,optind); if (!formatName) { - err("option -e is missing format specifier rtf.\n"); + err("option \"-e\" is missing format specifier rtf.\n"); cleanUpDoxygen(); exit(1); } @@ -10030,7 +10084,7 @@ void readConfiguration(int argc, char **argv) RTFGenerator::writeExtensionsFile(f); } cleanUpDoxygen(); - exit(1); + exit(0); } err("option \"-e\" has invalid format specifier.\n"); cleanUpDoxygen(); @@ -10040,7 +10094,7 @@ void readConfiguration(int argc, char **argv) formatName=getArg(argc,argv,optind); if (!formatName) { - err("option -w is missing format specifier rtf, html or latex\n"); + err("option \"-w\" is missing format specifier rtf, html or latex\n"); cleanUpDoxygen(); exit(1); } @@ -10165,7 +10219,7 @@ void readConfiguration(int argc, char **argv) } else { - err("Illegal format specifier %s: should be one of rtf, html, latex, or bst\n",formatName); + err("Illegal format specifier \"%s\": should be one of rtf, html or latex\n",formatName); cleanUpDoxygen(); exit(1); } @@ -10182,6 +10236,7 @@ void readConfiguration(int argc, char **argv) if (qstrcmp(&argv[optind][2],"help")==0) { usage(argv[0]); + exit(0); } else if (qstrcmp(&argv[optind][2],"version")==0) { @@ -10191,21 +10246,30 @@ void readConfiguration(int argc, char **argv) } else { - err("Unknown option -%s\n",&argv[optind][1]); + err("Unknown option \"-%s\"\n",&argv[optind][1]); usage(argv[0]); + exit(1); } break; case 'b': setvbuf(stdout,NULL,_IONBF,0); Doxygen::outputToWizard=TRUE; break; + case 'T': + msg("Warning: this option activates output generation via Django like template files. " + "This option is scheduled for doxygen 2.0, is currently incomplete and highly experimental! " + "Only use if you are a doxygen developer\n"); + g_useOutputTemplate=TRUE; + break; case 'h': case '?': usage(argv[0]); + exit(0); break; default: - err("Unknown option -%c\n",argv[optind][1]); + err("Unknown option \"-%c\"\n",argv[optind][1]); usage(argv[0]); + exit(1); } optind++; } @@ -10244,6 +10308,7 @@ void readConfiguration(int argc, char **argv) { err("Doxyfile not found and no input file specified!\n"); usage(argv[0]); + exit(1); } } else @@ -10257,6 +10322,7 @@ void readConfiguration(int argc, char **argv) { err("configuration file %s not found!\n",argv[optind]); usage(argv[0]); + exit(1); } } @@ -10525,6 +10591,18 @@ void searchInputFiles() } g_s.end(); + g_s.begin("Searching for dia files...\n"); + QStrList &diaFileList=Config_getList("DIAFILE_DIRS"); + s=diaFileList.first(); + while (s) + { + readFileOrDirectory(s,0,Doxygen::diaFileNameDict,0,0, + 0,0,0, + alwaysRecursive); + s=diaFileList.next(); + } + g_s.end(); + g_s.begin("Searching for files to exclude\n"); QStrList &excludeList = Config_getList("EXCLUDE"); s=excludeList.first(); @@ -11262,6 +11340,17 @@ void generateOutput() Doxygen::formulaList->generateBitmaps(Config_getString("HTML_OUTPUT")); g_s.end(); } + + if (Config_getBool("SORT_GROUP_NAMES")) + { + Doxygen::groupSDict->sort(); + GroupSDict::Iterator gli(*Doxygen::groupSDict); + GroupDef *gd; + for (gli.toFirst();(gd=gli.current());++gli) + { + gd->sortSubGroups(); + } + } writeMainPageTagFileData(); @@ -11349,6 +11438,8 @@ void generateOutput() g_s.end(); } + if (g_useOutputTemplate) generateOutputViaTemplate(); + if (generateRtf) { g_s.begin("Combining RTF output...\n"); @@ -11428,6 +11519,7 @@ void generateOutput() msg("finished...\n"); } + /************************************************************************** * Start cleaning up * **************************************************************************/ diff --git a/src/doxygen.css b/src/doxygen.css index 3e9451f..3c981f3 100644 --- a/src/doxygen.css +++ b/src/doxygen.css @@ -56,10 +56,14 @@ div.multicol { -webkit-column-count: 3; } -p.startli, p.startdd, p.starttd { +p.startli, p.startdd { margin-top: 2px; } +p.starttd { + margin-top: 0px; +} + p.endli { margin-bottom: 0px; } @@ -169,8 +173,8 @@ pre.fragment { } div.fragment { - padding: 0px; - margin: 0px; + padding: 4px 6px; + margin: 4px 8px 4px 2px; background-color: ##FC; border: 1px solid ##CC; } @@ -1065,6 +1069,11 @@ dl.section dd { text-align: center; } +.diagraph +{ + text-align: center; +} + .caption { font-weight: bold; diff --git a/src/doxygen.h b/src/doxygen.h index 4edf395..ff9c620 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -109,6 +109,7 @@ class Doxygen static FileNameDict *imageNameDict; static FileNameDict *dotFileNameDict; static FileNameDict *mscFileNameDict; + static FileNameDict *diaFileNameDict; static QStrList tagfileList; static MemberNameSDict *memberNameSDict; static MemberNameSDict *functionNameSDict; diff --git a/src/doxygen.md b/src/doxygen.md index ee87e71..9a9d726 100644 --- a/src/doxygen.md +++ b/src/doxygen.md @@ -97,6 +97,78 @@ For doxygen specific concepts the following subclasses are available Finally the data for members of classes, namespaces, and files is stored in the subclass MemberDef. +Producing debug output +---------------------- + +Within doxygen there are a number of ways to obtain debug output. Besides the +invasive method of putting print statements in the code there are a number of +easy ways to get debug information. + +- Compilation of `.l` files<br> + This is also an invasive method but it will be automatically done by the + `flex / lex` command. The result is that of each input line the (lex) rule(s) + that are applied on it are shown. + - windows + - in the Visual C++ GUI + - find the required `.l` file + - select the `Properties` of this file + - set the item `Write used lex rules` to `Yes` + - see to it that the `.l` file is newer than the corresponding `.cpp` file + or remove the corresponding `.cpp` file + - unices + - global change<br> + In the chapter "Doxygen's internals" a `perl` script is given to toggle the + possibility of having the rules debug information. + - command line change<br> + It is possible to the option `LEX="flex -d"` with the `make` command on the + command line. In this case the `.l` that are converted to the corresponding + `.cpp` files during this `make` get the rules debug information.<br> + To undo the rules debug information output just recompile the file with + just `make`.<br> + Note this method applies for all the `.l` files that are rebuild to `.cpp` + files so be sure that only the `.l` files(s) of which you want to have the + rules debug information is (are) newer than the corresponding `.cpp` + file(s). +- Running doxygen<br> + During a run of doxygen it is possible to specify the `-d` option with the + following possibilities (each option has to be preceded by `-d`): + - findmembers<br> + Gives of global, class, module members its scope, arguments and other relevant information. + - functions<br> + Gives of functions its scope, arguments and other relevant information. + - variables<br> + Gives of variables its scope and other relevant information. + - classes<br> + Gives of classes en modules its scope and other relevant information. + - preprocessor<br> + Shows the results of the preprocessing phase, i.e. results from include files, + <tt>\#define</tt> statements etc., definitions in the doxygen configuration file like: + `EXPAND_ONLY_PREDEF`, `PREDEFINED` and `MACRO_EXPANSION`. + - commentcnv<br> + Shows the results of the comment conversion, the comment conversion does the + following: + - It converts multi-line C++ style comment blocks (that are aligned) + to C style comment blocks (if `MULTILINE_CPP_IS_BRIEF` is set to `NO`). + - It replaces aliases with their definition (see `ALIASES`) + - It handles conditional sections (<tt>\\cond ... \\endcond</tt> blocks) + - commentscan<br> + Will print each comment block before and after the comment is interpreted by + the comment scanner. + - printtree<br> + Give the results in in pretty print way, i.e. in an XML like way with each + level indented by a `"."` (dot). + - time<br> + Provides information of the different stages of the doxygen process. + - extcmd<br> + Shows which external commands are executed and which pipes are opened. + - markdown<br> + Will print each comment block before and after Markdown processing. + - filteroutput<br> + Gives the output of the output as result of the filter command (when a filter + command is specified) + - validate<br> + Currently not used + Producing output ---------------- @@ -121,7 +193,7 @@ Topics TODO - comment conversion - comment scanner - markdown processor - - doc tokeninzer + - doc tokenizer - doc parser - doc visitors - Diagrams and Images diff --git a/src/doxygen_bst.h b/src/doxygen_bst.h deleted file mode 100644 index c51f2df..0000000 --- a/src/doxygen_bst.h +++ /dev/null @@ -1,1388 +0,0 @@ -" % \n" -" % \n" -" % This file is either \"html-btxbst.doc\" or was derived from\n" -" % \"html-btxbst.doc\" using cpp. \"html-btxbst.doc\" itself was edited\n" -" % from \"btxbst.doc\" and \"named.bst\".\n" -" % The following copyright information is from btxbst.doc:\n" -" % version 0.99b for BibTeX versions 0.99a or later, LaTeX version 2.09.\n" -" % Copyright (C) 1985, all rights reserved.\n" -" % Copying of this file is authorized only if either\n" -" % (1) you make absolutely no changes to your copy, including name, or\n" -" % (2) if you do make changes, you name it something other than\n" -" % btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst.\n" -" % This restriction helps ensure that all standard styles are identical.\n" -" % The file btxbst.doc has the documentation for this style.\n" -" % \"named\" style (sorted keys of the form [name, year])\n" -" % Some code for this was taken from \"named.bst\".\n" -"\n" -"ENTRY\n" -" { address\n" -" author\n" -" booktitle\n" -" chapter\n" -" edition\n" -" editor\n" -" howpublished\n" -" institution\n" -" journal\n" -" key\n" -" month\n" -" note\n" -" number\n" -" organization\n" -" pages\n" -" publisher\n" -" school\n" -" series\n" -" title\n" -" type\n" -" volume\n" -" year\n" -" dvi\n" -" html\n" -" keywords\n" -" pdf\n" -" postscript\n" -" url\n" -" doi\n" -" mailto\n" -" }\n" -" {}\n" -" { label extra.label sort.label }\n" -"\n" -"INTEGERS { output.state before.all mid.sentence after.sentence after.block }\n" -"\n" -"FUNCTION {init.state.consts}\n" -"{ #0 'before.all :=\n" -" #1 'mid.sentence :=\n" -" #2 'after.sentence :=\n" -" #3 'after.block :=\n" -"}\n" -"\n" -"STRINGS { s t }\n" -"\n" -"FUNCTION {output.nonnull}\n" -"{ 's :=\n" -" output.state mid.sentence =\n" -" { \", \" * write$ }\n" -" { output.state after.block =\n" -" { add.period$ write$\n" -" newline$\n" -" }\n" -" { output.state before.all =\n" -" 'write$\n" -" { add.period$ \" \" * write$ }\n" -" if$\n" -" }\n" -" if$\n" -" mid.sentence 'output.state :=\n" -" }\n" -" if$\n" -" s\n" -"}\n" -"\n" -"FUNCTION {output}\n" -"{ duplicate$ empty$\n" -" 'pop$\n" -" 'output.nonnull\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {output.check}\n" -"{ 't :=\n" -" duplicate$ empty$\n" -" { pop$ \"empty \" t * \" in \" * cite$ * warning$ }\n" -" 'output.nonnull\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {output.bibitem}\n" -"{ newline$\n" -" author empty$\n" -" { editor empty$\n" -" { organization empty$\n" -" 'skip$\n" -" { \"<!-- Authors: \" organization purify$ * \" -->\" * write$ newline$ }\n" -" if$\n" -" } \n" -" { \"<!-- Authors: \" editor purify$ * \" -->\" * write$ newline$ }\n" -" if$\n" -" }\n" -" { \"<!-- Authors: \" author purify$ * \" -->\" * write$ newline$ }\n" -" if$\n" -" keywords empty$\n" -" 'skip$\n" -" { \"<!-- Keywords: \" keywords * \" -->\" * write$ newline$ }\n" -" if$\n" -" \"<dt><a name=\" quote$ * \"CITEREF_\" * cite$ * quote$ * \">[\" * label * \"]</a></dt><dd>\" * write$\n" -" \"\"\n" -" before.all 'output.state :=\n" -"}\n" -"\n" -"FUNCTION {fin.entry}\n" -"{ add.period$\n" -" write$\n" -" postscript empty$\n" -" 'skip$\n" -" { newline$ \"<!-- PostScript: \" postscript * \" -->\" * write$ }\n" -" if$\n" -" pdf empty$\n" -" 'skip$\n" -" { newline$ \"<!-- PDF: \" pdf * \" -->\" * write$ }\n" -" if$\n" -" dvi empty$\n" -" 'skip$\n" -" { newline$ \"<!-- DVI: \" dvi * \" -->\" * write$ }\n" -" if$\n" -" doi empty$\n" -" 'skip$\n" -" { newline$ \"<!-- DOI: \" doi * \" -->\" * write$ }\n" -" if$\n" -" \"</dd>\" write$\n" -" newline$\n" -" newline$\n" -"}\n" -"\n" -"FUNCTION {new.block}\n" -"{ output.state before.all =\n" -" 'skip$\n" -" { after.block 'output.state := }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {new.sentence}\n" -"{ output.state after.block =\n" -" 'skip$\n" -" { output.state before.all =\n" -" 'skip$\n" -" { after.sentence 'output.state := }\n" -" if$\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {not}\n" -"{ { #0 }\n" -" { #1 }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {and}\n" -"{ 'skip$\n" -" { pop$ #0 }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {or}\n" -"{ { pop$ #1 }\n" -" 'skip$\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {str.to.int}\n" -"{\n" -" 's :=\n" -" #0\n" -" { s empty$ not }\n" -" { % Multiply the number on the top of the stack by 10 = 1010 binary\n" -" duplicate$ + % x2\n" -" duplicate$ % x2 x2\n" -" duplicate$ + duplicate$ + % x2 x8\n" -" +\n" -" s #1 #1 substring$ chr.to.int$ #48 - + % #48 is ascii for '0'\n" -" s #2 global.max$ substring$ 's :=\n" -" }\n" -" while$\n" -"}\n" -"\n" -"FUNCTION {new.block.checka}\n" -"{ empty$\n" -" 'skip$\n" -" 'new.block\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {new.block.checkb}\n" -"{ empty$\n" -" swap$ empty$\n" -" and\n" -" 'skip$\n" -" 'new.block\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {new.sentence.checka}\n" -"{ empty$\n" -" 'skip$\n" -" 'new.sentence\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {new.sentence.checkb}\n" -"{ empty$\n" -" swap$ empty$\n" -" and\n" -" 'skip$\n" -" 'new.sentence\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {field.or.null}\n" -"{ duplicate$ empty$\n" -" { pop$ \"\" }\n" -" 'skip$\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {emphasize}\n" -"{ duplicate$ empty$\n" -" { pop$ \"\" }\n" -" { \"<em>\" swap$ * \"</em>\" * }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {add.link} % title\n" -"{\n" -" 't :=\n" -" t empty$\n" -" { \"\" }\n" -" { url empty$\n" -" { html empty$\n" -" { t }\n" -" { \"<a href=\" quote$ * html * quote$ * \">\" * t * \"</a>\" * }\n" -" if$ }\n" -" { \"<a href=\" quote$ * url * quote$ * \">\" * t * \"</a>\" * }\n" -" if$\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {add.mailto} % authors\n" -"{\n" -" 't :=\n" -" t empty$\n" -" { \"\" }\n" -" { mailto empty$\n" -" { t }\n" -" { \"<a href=\" quote$ * \"mailto:\" * mailto * quote$ * \">\" * t * \"</a>\" * }\n" -" if$\n" -" }\n" -" if$\n" -"}\n" -"\n" -"INTEGERS { nameptr namesleft numnames }\n" -"\n" -"FUNCTION {format.names}\n" -"{ 's :=\n" -" #1 'nameptr :=\n" -" s num.names$ 'numnames :=\n" -" numnames 'namesleft :=\n" -" { namesleft #0 > }\n" -" { s nameptr \"{ff~}{vv~}{ll}{, jj}\" format.name$ 't :=\n" -" \"\\bibxhtmlname{\" t * \"}\" * 't :=\n" -" nameptr #1 >\n" -" { namesleft #1 >\n" -" { \", \" * t * }\n" -" { numnames #2 >\n" -" { \",\" * }\n" -" 'skip$\n" -" if$\n" -" t \"others\" =\n" -" { \" et~al.\" * }\n" -" { \" and \" * t * }\n" -" if$\n" -" }\n" -" if$\n" -" }\n" -" 't\n" -" if$\n" -" nameptr #1 + 'nameptr :=\n" -" namesleft #1 - 'namesleft :=\n" -" }\n" -" while$\n" -"}\n" -"\n" -"FUNCTION {format.authors}\n" -"{ author empty$\n" -" { \"\" }\n" -" { author format.names }\n" -" if$\n" -" add.mailto\n" -"}\n" -"\n" -"FUNCTION {format.editors}\n" -"{ editor empty$\n" -" { \"\" }\n" -" { editor format.names\n" -" editor num.names$ #1 >\n" -" { \", editors\" * }\n" -" { \", editor\" * }\n" -" if$\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {format.title}\n" -"{ title empty$\n" -" { \"\" }\n" -" { title \"t\" change.case$ }\n" -" if$\n" -" add.link\n" -"}\n" -"\n" -"FUNCTION {n.dashify}\n" -"{ 't :=\n" -" \"\"\n" -" { t empty$ not }\n" -" { t #1 #1 substring$ \"-\" =\n" -" { t #1 #2 substring$ \"--\" = not\n" -" { \"--\" *\n" -" t #2 global.max$ substring$ 't :=\n" -" }\n" -" { { t #1 #1 substring$ \"-\" = }\n" -" { \"-\" *\n" -" t #2 global.max$ substring$ 't :=\n" -" }\n" -" while$\n" -" }\n" -" if$\n" -" }\n" -" { t #1 #1 substring$ *\n" -" t #2 global.max$ substring$ 't :=\n" -" }\n" -" if$\n" -" }\n" -" while$\n" -"}\n" -"\n" -"FUNCTION {format.date}\n" -"{ year empty$\n" -" { month empty$\n" -" { \"\" }\n" -" { \"there's a month but no year in \" cite$ * warning$\n" -" month\n" -" }\n" -" if$\n" -" }\n" -" { month empty$\n" -" 'year\n" -" { month \" \" * year * }\n" -" if$\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {format.btitle}\n" -"{ title emphasize\n" -" add.link\n" -"}\n" -"\n" -"FUNCTION {tie.or.space.connect}\n" -"{ duplicate$ text.length$ #3 <\n" -" { \"~\" }\n" -" { \" \" }\n" -" if$\n" -" swap$ * *\n" -"}\n" -"\n" -"FUNCTION {either.or.check}\n" -"{ empty$\n" -" 'pop$\n" -" { \"can't use both \" swap$ * \" fields in \" * cite$ * warning$ }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {format.bvolume}\n" -"{ volume empty$\n" -" { \"\" }\n" -" { \"volume\" volume tie.or.space.connect\n" -" series empty$\n" -" 'skip$\n" -" { \" of \" * series emphasize * }\n" -" if$\n" -" \"volume and number\" number either.or.check\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {format.number.series}\n" -"{ volume empty$\n" -" { number empty$\n" -" { series field.or.null }\n" -" { output.state mid.sentence =\n" -" { \"number\" }\n" -" { \"Number\" }\n" -" if$\n" -" number tie.or.space.connect\n" -" series empty$\n" -" { \"there's a number but no series in \" cite$ * warning$ }\n" -" { \" in \" * series * }\n" -" if$\n" -" }\n" -" if$\n" -" }\n" -" { \"\" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {format.edition}\n" -"{ edition empty$\n" -" { \"\" }\n" -" { output.state mid.sentence =\n" -" { edition \"l\" change.case$ \" edition\" * }\n" -" { edition \"t\" change.case$ \" edition\" * }\n" -" if$\n" -" }\n" -" if$\n" -"}\n" -"\n" -"INTEGERS { multiresult }\n" -"\n" -"FUNCTION {multi.page.check}\n" -"{ 't :=\n" -" #0 'multiresult :=\n" -" { multiresult not\n" -" t empty$ not\n" -" and\n" -" }\n" -" { t #1 #1 substring$\n" -" duplicate$ \"-\" =\n" -" swap$ duplicate$ \",\" =\n" -" swap$ \"+\" =\n" -" or or\n" -" { #1 'multiresult := }\n" -" { t #2 global.max$ substring$ 't := }\n" -" if$\n" -" }\n" -" while$\n" -" multiresult\n" -"}\n" -"\n" -"FUNCTION {format.pages}\n" -"{ pages empty$\n" -" { \"\" }\n" -" { pages multi.page.check\n" -" { \"pages\" pages n.dashify tie.or.space.connect }\n" -" { \"page\" pages tie.or.space.connect }\n" -" if$\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {format.vol.num.pages}\n" -"{ volume field.or.null\n" -" number empty$\n" -" 'skip$\n" -" { \"(\" number * \")\" * *\n" -" volume empty$\n" -" { \"there's a number but no volume in \" cite$ * warning$ }\n" -" 'skip$\n" -" if$\n" -" }\n" -" if$\n" -" pages empty$\n" -" 'skip$\n" -" { duplicate$ empty$\n" -" { pop$ format.pages }\n" -" { \":\" * pages n.dashify * }\n" -" if$\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {format.chapter.pages}\n" -"{ chapter empty$\n" -" 'format.pages\n" -" { type empty$\n" -" { \"chapter\" }\n" -" { type \"l\" change.case$ }\n" -" if$\n" -" chapter tie.or.space.connect\n" -" pages empty$\n" -" 'skip$\n" -" { \", \" * format.pages * }\n" -" if$\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {format.in.ed.booktitle}\n" -"{ booktitle empty$\n" -" { \"\" }\n" -" { editor empty$\n" -" { \"In \" booktitle emphasize * }\n" -" { \"In \" format.editors * \", \" * booktitle emphasize * }\n" -" if$\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {empty.misc.check}\n" -"{ author empty$ title empty$ howpublished empty$\n" -" month empty$ year empty$ note empty$\n" -" and and and and and\n" -" key empty$ not and\n" -" { \"all relevant fields are empty in \" cite$ * warning$ }\n" -" 'skip$\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {format.thesis.type}\n" -"{ type empty$\n" -" 'skip$\n" -" { pop$\n" -" type \"t\" change.case$\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {format.tr.number}\n" -"{ type empty$\n" -" { \"Technical Report\" }\n" -" 'type\n" -" if$\n" -" number empty$\n" -" { \"t\" change.case$ }\n" -" { number tie.or.space.connect }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {format.article.crossref}\n" -"{\n" -" \"In <a href=\" quote$ * \"#\" * crossref * quote$ * \">\" *\n" -" key empty$\n" -" { journal empty$\n" -" { \"need key or journal for \" cite$ * \" to crossref \" * crossref *\n" -" warning$\n" -" \"\"\n" -" }\n" -" { \"<cite>\" * journal * \"</cite>\" * }\n" -" if$\n" -" }\n" -" { key * }\n" -" if$\n" -" \"</a> \\citelabel{\" * crossref * \"}\" *\n" -"}\n" -"\n" -"FUNCTION {format.crossref.editor}\n" -"{ editor #1 \"{vv~}{ll}\" format.name$\n" -" editor num.names$ duplicate$\n" -" #2 >\n" -" { pop$ \" et~al.\" * }\n" -" { #2 <\n" -" 'skip$\n" -" { editor #2 \"{ff }{vv }{ll}{ jj}\" format.name$ \"others\" =\n" -" { \" et~al.\" * }\n" -" { \" and \" * editor #2 \"{vv~}{ll}\" format.name$ * }\n" -" if$\n" -" }\n" -" if$\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {format.book.crossref}\n" -"{ volume empty$\n" -" { \"empty volume in \" cite$ * \"'s crossref of \" * crossref * warning$\n" -" \"In \"\n" -" }\n" -" { \"Volume\" volume tie.or.space.connect\n" -" \" of \" *\n" -" }\n" -" if$\n" -" \"<a href=\" * quote$ * \"#\" * crossref * quote$ * \">\" *\n" -" editor empty$\n" -" editor field.or.null author field.or.null =\n" -" or\n" -" { key empty$\n" -" { series empty$\n" -" { \"need editor, key, or series for \" cite$ * \" to crossref \" *\n" -" crossref * warning$\n" -" \"\" *\n" -" }\n" -" { \"<cite>\" * series * \"</cite>\" * }\n" -" if$\n" -" }\n" -" { key * }\n" -" if$\n" -" }\n" -" { format.crossref.editor * }\n" -" if$\n" -" \"</a> \\citelabel{\" * crossref * \"}\" *\n" -"}\n" -"\n" -"FUNCTION {format.incoll.inproc.crossref}\n" -"{\n" -" \"In <a href=\" quote$ * \"#\" * crossref * quote$ * \">\" *\n" -" editor empty$\n" -" editor field.or.null author field.or.null =\n" -" or\n" -" { key empty$\n" -" { booktitle empty$\n" -" { \"need editor, key, or booktitle for \" cite$ * \" to crossref \" *\n" -" crossref * warning$\n" -" \"\"\n" -" }\n" -" { \"<cite>\" * booktitle * \"</cite>\" * }\n" -" if$\n" -" }\n" -" { key * }\n" -" if$\n" -" }\n" -" { format.crossref.editor * }\n" -" if$\n" -" \"</a> \\citelabel{\" * crossref * \"}\" *\n" -"}\n" -"\n" -"FUNCTION {article}\n" -"{ output.bibitem\n" -" format.authors \"author\" output.check\n" -" new.block\n" -" format.title \"title\" output.check\n" -" new.block\n" -" crossref missing$\n" -" { journal emphasize \"journal\" output.check\n" -" format.vol.num.pages output\n" -" format.date \"year\" output.check\n" -" }\n" -" { format.article.crossref output.nonnull\n" -" format.pages output\n" -" }\n" -" if$\n" -" new.block\n" -" note output\n" -" fin.entry\n" -"}\n" -"\n" -"FUNCTION {book}\n" -"{ output.bibitem\n" -" author empty$\n" -" { format.editors \"author and editor\" output.check }\n" -" { format.authors output.nonnull\n" -" crossref missing$\n" -" { \"author and editor\" editor either.or.check }\n" -" 'skip$\n" -" if$\n" -" }\n" -" if$\n" -" new.block\n" -" format.btitle \"title\" output.check\n" -" crossref missing$\n" -" { format.bvolume output\n" -" new.block\n" -" format.number.series output\n" -" new.sentence\n" -" publisher \"publisher\" output.check\n" -" address output\n" -" }\n" -" { new.block\n" -" format.book.crossref output.nonnull\n" -" }\n" -" if$\n" -" format.edition output\n" -" format.date \"year\" output.check\n" -" new.block\n" -" note output\n" -" fin.entry\n" -"}\n" -"\n" -"FUNCTION {booklet}\n" -"{ output.bibitem\n" -" format.authors output\n" -" new.block\n" -" format.title \"title\" output.check\n" -" howpublished address new.block.checkb\n" -" howpublished output\n" -" address output\n" -" format.date output\n" -" new.block\n" -" note output\n" -" fin.entry\n" -"}\n" -"\n" -"FUNCTION {inbook}\n" -"{ output.bibitem\n" -" author empty$\n" -" { format.editors \"author and editor\" output.check }\n" -" { format.authors output.nonnull\n" -" crossref missing$\n" -" { \"author and editor\" editor either.or.check }\n" -" 'skip$\n" -" if$\n" -" }\n" -" if$\n" -" new.block\n" -" format.btitle \"title\" output.check\n" -" crossref missing$\n" -" { format.bvolume output\n" -" format.chapter.pages \"chapter and pages\" output.check\n" -" new.block\n" -" format.number.series output\n" -" new.sentence\n" -" publisher \"publisher\" output.check\n" -" address output\n" -" }\n" -" { format.chapter.pages \"chapter and pages\" output.check\n" -" new.block\n" -" format.book.crossref output.nonnull\n" -" }\n" -" if$\n" -" format.edition output\n" -" format.date \"year\" output.check\n" -" new.block\n" -" note output\n" -" fin.entry\n" -"}\n" -"\n" -"FUNCTION {incollection}\n" -"{ output.bibitem\n" -" format.authors \"author\" output.check\n" -" new.block\n" -" format.title \"title\" output.check\n" -" new.block\n" -" crossref missing$\n" -" { format.in.ed.booktitle \"booktitle\" output.check\n" -" format.bvolume output\n" -" format.number.series output\n" -" format.chapter.pages output\n" -" new.sentence\n" -" publisher \"publisher\" output.check\n" -" address output\n" -" format.edition output\n" -" format.date \"year\" output.check\n" -" }\n" -" { format.incoll.inproc.crossref output.nonnull\n" -" format.chapter.pages output\n" -" }\n" -" if$\n" -" new.block\n" -" note output\n" -" fin.entry\n" -"}\n" -"\n" -"FUNCTION {inproceedings}\n" -"{ output.bibitem\n" -" format.authors \"author\" output.check\n" -" new.block\n" -" format.title \"title\" output.check\n" -" new.block\n" -" crossref missing$\n" -" { format.in.ed.booktitle \"booktitle\" output.check\n" -" format.bvolume output\n" -" format.number.series output\n" -" format.pages output\n" -" address empty$\n" -" { organization publisher new.sentence.checkb\n" -" organization output\n" -" publisher output\n" -" format.date \"year\" output.check\n" -" }\n" -" { address output.nonnull\n" -" format.date \"year\" output.check\n" -" new.sentence\n" -" organization output\n" -" publisher output\n" -" }\n" -" if$\n" -" }\n" -" { format.incoll.inproc.crossref output.nonnull\n" -" format.pages output\n" -" }\n" -" if$\n" -" new.block\n" -" note output\n" -" fin.entry\n" -"}\n" -"\n" -"FUNCTION {conference} { inproceedings }\n" -"\n" -"FUNCTION {manual}\n" -"{ output.bibitem\n" -" author empty$\n" -" { organization empty$\n" -" 'skip$\n" -" { organization output.nonnull\n" -" address output\n" -" }\n" -" if$\n" -" }\n" -" { format.authors output.nonnull }\n" -" if$\n" -" new.block\n" -" format.btitle \"title\" output.check\n" -" author empty$\n" -" { organization empty$\n" -" { address new.block.checka\n" -" address output\n" -" }\n" -" 'skip$\n" -" if$\n" -" }\n" -" { organization address new.block.checkb\n" -" organization output\n" -" address output\n" -" }\n" -" if$\n" -" format.edition output\n" -" format.date output\n" -" new.block\n" -" note output\n" -" fin.entry\n" -"}\n" -"\n" -"FUNCTION {mastersthesis}\n" -"{ output.bibitem\n" -" format.authors \"author\" output.check\n" -" new.block\n" -" format.title \"title\" output.check\n" -" new.block\n" -" \"Master's thesis\" format.thesis.type output.nonnull\n" -" school \"school\" output.check\n" -" address output\n" -" format.date \"year\" output.check\n" -" new.block\n" -" note output\n" -" fin.entry\n" -"}\n" -"\n" -"FUNCTION {misc}\n" -"{ output.bibitem\n" -" format.authors output\n" -" title howpublished new.block.checkb\n" -" format.title output\n" -" howpublished new.block.checka\n" -" howpublished output\n" -" format.date output\n" -" new.block\n" -" note output\n" -" fin.entry\n" -" empty.misc.check\n" -"}\n" -"\n" -"FUNCTION {phdthesis}\n" -"{ output.bibitem\n" -" format.authors \"author\" output.check\n" -" new.block\n" -" format.btitle \"title\" output.check\n" -" new.block\n" -" \"PhD thesis\" format.thesis.type output.nonnull\n" -" school \"school\" output.check\n" -" address output\n" -" format.date \"year\" output.check\n" -" new.block\n" -" note output\n" -" fin.entry\n" -"}\n" -"\n" -"FUNCTION {proceedings}\n" -"{ output.bibitem\n" -" editor empty$\n" -" { organization output }\n" -" { format.editors output.nonnull }\n" -" if$\n" -" new.block\n" -" format.btitle \"title\" output.check\n" -" format.bvolume output\n" -" format.number.series output\n" -" address empty$\n" -" { editor empty$\n" -" { publisher new.sentence.checka }\n" -" { organization publisher new.sentence.checkb\n" -" organization output\n" -" }\n" -" if$\n" -" publisher output\n" -" format.date \"year\" output.check\n" -" }\n" -" { address output.nonnull\n" -" format.date \"year\" output.check\n" -" new.sentence\n" -" editor empty$\n" -" 'skip$\n" -" { organization output }\n" -" if$\n" -" publisher output\n" -" }\n" -" if$\n" -" new.block\n" -" note output\n" -" fin.entry\n" -"}\n" -"\n" -"FUNCTION {techreport}\n" -"{ output.bibitem\n" -" format.authors \"author\" output.check\n" -" new.block\n" -" format.title \"title\" output.check\n" -" new.block\n" -" format.tr.number output.nonnull\n" -" institution \"institution\" output.check\n" -" address output\n" -" format.date \"year\" output.check\n" -" new.block\n" -" note output\n" -" fin.entry\n" -"}\n" -"\n" -"FUNCTION {unpublished}\n" -"{ output.bibitem\n" -" format.authors \"author\" output.check\n" -" new.block\n" -" format.title \"title\" output.check\n" -" new.block\n" -" note \"note\" output.check\n" -" format.date output\n" -" fin.entry\n" -"}\n" -"\n" -"FUNCTION {default.type} { misc }\n" -"\n" -"MACRO {jan} {\"January\"}\n" -"\n" -"MACRO {feb} {\"February\"}\n" -"\n" -"MACRO {mar} {\"March\"}\n" -"\n" -"MACRO {apr} {\"April\"}\n" -"\n" -"MACRO {may} {\"May\"}\n" -"\n" -"MACRO {jun} {\"June\"}\n" -"\n" -"MACRO {jul} {\"July\"}\n" -"\n" -"MACRO {aug} {\"August\"}\n" -"\n" -"MACRO {sep} {\"September\"}\n" -"\n" -"MACRO {oct} {\"October\"}\n" -"\n" -"MACRO {nov} {\"November\"}\n" -"\n" -"MACRO {dec} {\"December\"}\n" -"\n" -"MACRO {acmcs} {\"ACM Computing Surveys\"}\n" -"\n" -"MACRO {acta} {\"Acta Informatica\"}\n" -"\n" -"MACRO {cacm} {\"Communications of the ACM\"}\n" -"\n" -"MACRO {ibmjrd} {\"IBM Journal of Research and Development\"}\n" -"\n" -"MACRO {ibmsj} {\"IBM Systems Journal\"}\n" -"\n" -"MACRO {ieeese} {\"IEEE Transactions on Software Engineering\"}\n" -"\n" -"MACRO {ieeetc} {\"IEEE Transactions on Computers\"}\n" -"\n" -"MACRO {ieeetcad}\n" -" {\"IEEE Transactions on Computer-Aided Design of Integrated Circuits\"}\n" -"\n" -"MACRO {ipl} {\"Information Processing Letters\"}\n" -"\n" -"MACRO {jacm} {\"Journal of the ACM\"}\n" -"\n" -"MACRO {jcss} {\"Journal of Computer and System Sciences\"}\n" -"\n" -"MACRO {scp} {\"Science of Computer Programming\"}\n" -"\n" -"MACRO {sicomp} {\"SIAM Journal on Computing\"}\n" -"\n" -"MACRO {tocs} {\"ACM Transactions on Computer Systems\"}\n" -"\n" -"MACRO {tods} {\"ACM Transactions on Database Systems\"}\n" -"\n" -"MACRO {tog} {\"ACM Transactions on Graphics\"}\n" -"\n" -"MACRO {toms} {\"ACM Transactions on Mathematical Software\"}\n" -"\n" -"MACRO {toois} {\"ACM Transactions on Office Information Systems\"}\n" -"\n" -"MACRO {toplas} {\"ACM Transactions on Programming Languages and Systems\"}\n" -"\n" -"MACRO {tcs} {\"Theoretical Computer Science\"}\n" -"\n" -"READ\n" -"\n" -"FUNCTION {sortify}\n" -"{ purify$\n" -" \"l\" change.case$\n" -"}\n" -"\n" -"INTEGERS { len }\n" -"\n" -"FUNCTION {chop.word}\n" -"{ 's :=\n" -" 'len :=\n" -" s #1 len substring$ =\n" -" { s len #1 + global.max$ substring$ }\n" -" 's\n" -" if$\n" -"}\n" -"\n" -"\n" -"FUNCTION {format.lab.names}\n" -"{ 's :=\n" -" s num.names$ 'numnames :=\n" -" numnames #1 =\n" -" { s #1 \"{vv }{ll}\" format.name$ }\n" -" { numnames #2 =\n" -" { s #1 \"{vv }{ll }and \" format.name$ s #2 \"{vv }{ll}\" format.name$ * }\n" -" { s #1 \"{vv }{ll }\" format.name$ \"et~al.\" * }\n" -" if$\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {author.key.label}\n" -"{ author empty$\n" -" { key empty$\n" -" { cite$ #1 #3 substring$ }\n" -" { key }\n" -" if$\n" -" }\n" -" { author format.lab.names }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {author.editor.key.label}\n" -"{ author empty$\n" -" { editor empty$\n" -" { key empty$\n" -" { cite$ #1 #3 substring$ }\n" -" { key }\n" -" if$\n" -" }\n" -" { editor format.lab.names }\n" -" if$\n" -" }\n" -" { author format.lab.names }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {author.key.organization.label}\n" -"{ author empty$\n" -" { key empty$\n" -" { organization empty$\n" -" { cite$ #1 #3 substring$ }\n" -" { \"The \" #4 organization chop.word #3 text.prefix$ }\n" -" if$\n" -" }\n" -" { key }\n" -" if$\n" -" }\n" -" { author format.lab.names }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {editor.key.organization.label}\n" -"{ editor empty$\n" -" { key empty$\n" -" { organization empty$\n" -" { cite$ #1 #3 substring$ }\n" -" { \"The \" #4 organization chop.word #3 text.prefix$ }\n" -" if$\n" -" }\n" -" { key }\n" -" if$\n" -" }\n" -" { editor format.lab.names }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {month.to.int}\n" -"{\n" -" \"l\" change.case$ #3 text.prefix$\n" -" 's :=\n" -" s \"jan\" = { #1 } {\n" -" s \"feb\" = { #2 } {\n" -" s \"mar\" = { #3 } {\n" -" s \"apr\" = { #4 } {\n" -" s \"may\" = { #5 } {\n" -" s \"jun\" = { #6 } {\n" -" s \"jul\" = { #7 } {\n" -" s \"aug\" = { #8 } {\n" -" s \"sep\" = { #9 } {\n" -" s \"oct\" = { #10 } {\n" -" s \"nov\" = { #11 } {\n" -" s \"dec\" = { #12 } { #13 } % 13 if nothing matches\n" -" if$}if$}if$}if$}if$}if$}if$}if$}if$}if$}if$}if$\n" -"}\n" -"\n" -"INTEGERS { done c } \n" -"FUNCTION { get.day }\n" -"{ month field.or.null 's :=\n" -" \n" -" % Strip out month name\n" -" #0 'done := \n" -" { s \"\" = not done not and }\n" -" { s #1 #1 substring$ \" \" = 'done :=\n" -" s #2 global.max$ substring$ 's :=\n" -" }\n" -" while$\n" -"\n" -" % Build up first number in t\n" -" \"0\" 't :=\n" -" #0 'done :=\n" -" { s \"\" = not done not and }\n" -" { s #1 #1 substring$ chr.to.int$ 'c :=\n" -" c #47 > c #58 < and\n" -" { t c int.to.chr$ * 't := }\n" -" { #1 'done := }\n" -" if$\n" -" s #2 global.max$ substring$ 's :=\n" -" }\n" -" while$\n" -"\n" -" t str.to.int\n" -"}\n" -"\n" -"FUNCTION { sortify.fourdigit }\n" -"{ 's :=\n" -" s empty$\n" -" { \"0000\" }\n" -" { s\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION { sortify.twodigit }\n" -"{ 's :=\n" -" s empty$\n" -" { \"00\" }\n" -" { s\n" -" str.to.int #10 + int.to.str$\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {calc.label}\n" -"{ type$ \"book\" =\n" -" type$ \"inbook\" =\n" -" or\n" -" 'author.editor.key.label\n" -" { type$ \"proceedings\" =\n" -" 'editor.key.organization.label\n" -" { type$ \"manual\" =\n" -" 'author.key.organization.label\n" -" 'author.key.label\n" -" if$\n" -" }\n" -" if$\n" -" }\n" -" if$\n" -" duplicate$\n" -"\n" -" year empty$\n" -" 'skip$\n" -" { \", \" * }\n" -" if$\n" -" year field.or.null purify$ * % CHANGED - pfps - 15 Feb 1989\n" -" 'label :=\n" -"\n" -" year field.or.null purify$\n" -" #-1 #4 substring$ \n" -" sortify.fourdigit \n" -" \" \" *\n" -" month field.or.null month.to.int int.to.str$ sortify.twodigit *\n" -" \" \" * \n" -" get.day int.to.str$ sortify.twodigit *\n" -" \" \" *\n" -" * sortify 'sort.label :=\n" -"}\n" -"\n" -"FUNCTION {sort.format.names}\n" -"{ 's :=\n" -" #1 'nameptr :=\n" -" \"\"\n" -" s num.names$ 'numnames :=\n" -" numnames 'namesleft :=\n" -" { namesleft #0 > }\n" -" { nameptr #1 >\n" -" { \" \" * }\n" -" 'skip$\n" -" if$\n" -" s nameptr \"{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}\" format.name$ 't :=\n" -" nameptr numnames = t \"others\" = and\n" -" { \"et al.\" * }\n" -" { t sortify * }\n" -" if$\n" -" nameptr #1 + 'nameptr :=\n" -" namesleft #1 - 'namesleft :=\n" -" }\n" -" while$\n" -"}\n" -"\n" -"FUNCTION {sort.format.title}\n" -"{ 't :=\n" -" \"A \" #2\n" -" \"An \" #3\n" -" \"The \" #4 t chop.word\n" -" chop.word\n" -" chop.word\n" -" sortify\n" -" #1 global.max$ substring$\n" -"}\n" -"\n" -"FUNCTION {author.sort}\n" -"{ author empty$\n" -" { key empty$\n" -" { \"to sort, need author or key in \" cite$ * warning$\n" -" \"\"\n" -" }\n" -" { key sortify }\n" -" if$\n" -" }\n" -" { author sort.format.names }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {author.editor.sort}\n" -"{ author empty$\n" -" { editor empty$\n" -" { key empty$\n" -" { \"to sort, need author, editor, or key in \" cite$ * warning$\n" -" \"\"\n" -" }\n" -" { key sortify }\n" -" if$\n" -" }\n" -" { editor sort.format.names }\n" -" if$\n" -" }\n" -" { author sort.format.names }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {author.organization.sort}\n" -"{ author empty$\n" -" { organization empty$\n" -" { key empty$\n" -" { \"to sort, need author, organization, or key in \" cite$ * warning$\n" -" \"\"\n" -" }\n" -" { key sortify }\n" -" if$\n" -" }\n" -" { \"The \" #4 organization chop.word sortify }\n" -" if$\n" -" }\n" -" { author sort.format.names }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {editor.organization.sort}\n" -"{ editor empty$\n" -" { organization empty$\n" -" { key empty$\n" -" { \"to sort, need editor, organization, or key in \" cite$ * warning$\n" -" \"\"\n" -" }\n" -" { key sortify }\n" -" if$\n" -" }\n" -" { \"The \" #4 organization chop.word sortify }\n" -" if$\n" -" }\n" -" { editor sort.format.names }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {presort}\n" -"{ calc.label\n" -" sort.label\n" -" \" \"\n" -" *\n" -" type$ \"book\" =\n" -" type$ \"inbook\" =\n" -" or\n" -" 'author.editor.sort\n" -" { type$ \"proceedings\" =\n" -" 'editor.organization.sort\n" -" { type$ \"manual\" =\n" -" 'author.organization.sort\n" -" 'author.sort\n" -" if$\n" -" }\n" -" if$\n" -" }\n" -" if$\n" -" *\n" -" \" \"\n" -" *\n" -" year field.or.null sortify\n" -" *\n" -" \" \"\n" -" *\n" -" title field.or.null\n" -" sort.format.title\n" -" *\n" -" #1 entry.max$ substring$\n" -" 'sort.key$ :=\n" -"}\n" -"\n" -"ITERATE {presort}\n" -"\n" -"SORT\n" -"\n" -"STRINGS { longest.label last.sort.label next.extra }\n" -"\n" -"INTEGERS { longest.label.width last.extra.num }\n" -"\n" -"FUNCTION {initialize.longest.label}\n" -"{ \"\" 'longest.label :=\n" -" #0 int.to.chr$ 'last.sort.label :=\n" -" \"\" 'next.extra :=\n" -" #0 'longest.label.width :=\n" -" #0 'last.extra.num :=\n" -"}\n" -"\n" -"FUNCTION {forward.pass}\n" -"{ last.sort.label sort.label =\n" -" { last.extra.num #1 + 'last.extra.num :=\n" -" last.extra.num int.to.chr$ 'extra.label :=\n" -" }\n" -" { \"a\" chr.to.int$ 'last.extra.num :=\n" -" \"\" 'extra.label :=\n" -" sort.label 'last.sort.label :=\n" -" }\n" -" if$\n" -"}\n" -"\n" -"FUNCTION {reverse.pass}\n" -"{ next.extra \"b\" =\n" -" { \"a\" 'extra.label := }\n" -" 'skip$\n" -" if$\n" -" label extra.label * 'label :=\n" -" label width$ longest.label.width >\n" -" { label 'longest.label :=\n" -" label width$ 'longest.label.width :=\n" -" }\n" -" 'skip$\n" -" if$\n" -" extra.label 'next.extra :=\n" -"}\n" -"\n" -"EXECUTE {initialize.longest.label}\n" -"\n" -"ITERATE {forward.pass}\n" -"\n" -"REVERSE {reverse.pass}\n" -"\n" -"FUNCTION {begin.bib}\n" -"{\n" -" \"# label-style: default\" write$ newline$\n" -"}\n" -"\n" -"EXECUTE {begin.bib}\n" -"\n" -"EXECUTE {init.state.consts}\n" -"\n" -"ITERATE {call.type$}\n" -"\n" -"FUNCTION {end.bib}\n" -"{ newline$\n" -"}\n" -"\n" -"EXECUTE {end.bib}\n" diff --git a/src/doxygen_css.h b/src/doxygen_css.h deleted file mode 100644 index 38ffa19..0000000 --- a/src/doxygen_css.h +++ /dev/null @@ -1,1357 +0,0 @@ -"/* The standard CSS for doxygen $doxygenversion */\n" -"\n" -"body, table, div, p, dl {\n" -" font: 400 14px/22px Roboto,sans-serif;\n" -"}\n" -"\n" -"/* @group Heading Levels */\n" -"\n" -"h1.groupheader {\n" -" font-size: 150%;\n" -"}\n" -"\n" -".title {\n" -" font: 400 14px/28px Roboto,sans-serif;\n" -" font-size: 150%;\n" -" font-weight: bold;\n" -" margin: 10px 2px;\n" -"}\n" -"\n" -"h2.groupheader {\n" -" border-bottom: 1px solid ##99;\n" -" color: ##44;\n" -" font-size: 150%;\n" -" font-weight: normal;\n" -" margin-top: 1.75em;\n" -" padding-top: 8px;\n" -" padding-bottom: 4px;\n" -" width: 100%;\n" -"}\n" -"\n" -"h3.groupheader {\n" -" font-size: 100%;\n" -"}\n" -"\n" -"h1, h2, h3, h4, h5, h6 {\n" -" -webkit-transition: text-shadow 0.5s linear;\n" -" -moz-transition: text-shadow 0.5s linear;\n" -" -ms-transition: text-shadow 0.5s linear;\n" -" -o-transition: text-shadow 0.5s linear;\n" -" transition: text-shadow 0.5s linear;\n" -" margin-right: 15px;\n" -"}\n" -"\n" -"h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {\n" -" text-shadow: 0 0 15px cyan;\n" -"}\n" -"\n" -"dt {\n" -" font-weight: bold;\n" -"}\n" -"\n" -"div.multicol {\n" -" -moz-column-gap: 1em;\n" -" -webkit-column-gap: 1em;\n" -" -moz-column-count: 3;\n" -" -webkit-column-count: 3;\n" -"}\n" -"\n" -"p.startli, p.startdd, p.starttd {\n" -" margin-top: 2px;\n" -"}\n" -"\n" -"p.endli {\n" -" margin-bottom: 0px;\n" -"}\n" -"\n" -"p.enddd {\n" -" margin-bottom: 4px;\n" -"}\n" -"\n" -"p.endtd {\n" -" margin-bottom: 2px;\n" -"}\n" -"\n" -"/* @end */\n" -"\n" -"caption {\n" -" font-weight: bold;\n" -"}\n" -"\n" -"span.legend {\n" -" font-size: 70%;\n" -" text-align: center;\n" -"}\n" -"\n" -"h3.version {\n" -" font-size: 90%;\n" -" text-align: center;\n" -"}\n" -"\n" -"div.qindex, div.navtab{\n" -" background-color: ##ee;\n" -" border: 1px solid ##b0;\n" -" text-align: center;\n" -"}\n" -"\n" -"div.qindex, div.navpath {\n" -" width: 100%;\n" -" line-height: 140%;\n" -"}\n" -"\n" -"div.navtab {\n" -" margin-right: 15px;\n" -"}\n" -"\n" -"/* @group Link Styling */\n" -"\n" -"a {\n" -" color: ##50;\n" -" font-weight: normal;\n" -" text-decoration: none;\n" -"}\n" -"\n" -".contents a:visited {\n" -" color: ##60;\n" -"}\n" -"\n" -"a:hover {\n" -" text-decoration: underline;\n" -"}\n" -"\n" -"a.qindex {\n" -" font-weight: bold;\n" -"}\n" -"\n" -"a.qindexHL {\n" -" font-weight: bold;\n" -" background-color: ##AA;\n" -" color: #ffffff;\n" -" border: 1px double ##98;\n" -"}\n" -"\n" -".contents a.qindexHL:visited {\n" -" color: #ffffff;\n" -"}\n" -"\n" -"a.el {\n" -" font-weight: bold;\n" -"}\n" -"\n" -"a.elRef {\n" -"}\n" -"\n" -"a.code, a.code:visited, a.line, a.line:visited {\n" -" color: #4665A2; \n" -"}\n" -"\n" -"a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {\n" -" color: #4665A2; \n" -"}\n" -"\n" -"/* @end */\n" -"\n" -"dl.el {\n" -" margin-left: -1cm;\n" -"}\n" -"\n" -"pre.fragment {\n" -" border: 1px solid #C4CFE5;\n" -" background-color: #FBFCFD;\n" -" padding: 4px 6px;\n" -" margin: 4px 8px 4px 2px;\n" -" overflow: auto;\n" -" word-wrap: break-word;\n" -" font-size: 9pt;\n" -" line-height: 125%;\n" -" font-family: monospace, fixed;\n" -" font-size: 105%;\n" -"}\n" -"\n" -"div.fragment {\n" -" padding: 0px;\n" -" margin: 0px;\n" -" background-color: ##FC;\n" -" border: 1px solid ##CC;\n" -"}\n" -"\n" -"div.line {\n" -" font-family: monospace, fixed;\n" -" font-size: 13px;\n" -" min-height: 13px;\n" -" line-height: 1.0;\n" -" text-wrap: unrestricted;\n" -" white-space: -moz-pre-wrap; /* Moz */\n" -" white-space: -pre-wrap; /* Opera 4-6 */\n" -" white-space: -o-pre-wrap; /* Opera 7 */\n" -" white-space: pre-wrap; /* CSS3 */\n" -" word-wrap: break-word; /* IE 5.5+ */\n" -" text-indent: -53px;\n" -" padding-left: 53px;\n" -" padding-bottom: 0px;\n" -" margin: 0px;\n" -" -webkit-transition-property: background-color, box-shadow;\n" -" -webkit-transition-duration: 0.5s;\n" -" -moz-transition-property: background-color, box-shadow;\n" -" -moz-transition-duration: 0.5s;\n" -" -ms-transition-property: background-color, box-shadow;\n" -" -ms-transition-duration: 0.5s;\n" -" -o-transition-property: background-color, box-shadow;\n" -" -o-transition-duration: 0.5s;\n" -" transition-property: background-color, box-shadow;\n" -" transition-duration: 0.5s;\n" -"}\n" -"\n" -"div.line.glow {\n" -" background-color: cyan;\n" -" box-shadow: 0 0 10px cyan;\n" -"}\n" -"\n" -"\n" -"span.lineno {\n" -" padding-right: 4px;\n" -" text-align: right;\n" -" border-right: 2px solid #0F0;\n" -" background-color: #E8E8E8;\n" -" white-space: pre;\n" -"}\n" -"span.lineno a {\n" -" background-color: #D8D8D8;\n" -"}\n" -"\n" -"span.lineno a:hover {\n" -" background-color: #C8C8C8;\n" -"}\n" -"\n" -"div.ah {\n" -" background-color: black;\n" -" font-weight: bold;\n" -" color: #ffffff;\n" -" margin-bottom: 3px;\n" -" margin-top: 3px;\n" -" padding: 0.2em;\n" -" border: solid thin #333;\n" -" border-radius: 0.5em;\n" -" -webkit-border-radius: .5em;\n" -" -moz-border-radius: .5em;\n" -" box-shadow: 2px 2px 3px #999;\n" -" -webkit-box-shadow: 2px 2px 3px #999;\n" -" -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;\n" -" background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));\n" -" background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);\n" -"}\n" -"\n" -"div.groupHeader {\n" -" margin-left: 16px;\n" -" margin-top: 12px;\n" -" font-weight: bold;\n" -"}\n" -"\n" -"div.groupText {\n" -" margin-left: 16px;\n" -" font-style: italic;\n" -"}\n" -"\n" -"body {\n" -" background-color: white;\n" -" color: black;\n" -" margin: 0;\n" -"}\n" -"\n" -"div.contents {\n" -" margin-top: 10px;\n" -" margin-left: 12px;\n" -" margin-right: 8px;\n" -"}\n" -"\n" -"td.indexkey {\n" -" background-color: ##ee;\n" -" font-weight: bold;\n" -" border: 1px solid ##cc;\n" -" margin: 2px 0px 2px 0;\n" -" padding: 2px 10px;\n" -" white-space: nowrap;\n" -" vertical-align: top;\n" -"}\n" -"\n" -"td.indexvalue {\n" -" background-color: ##ee;\n" -" border: 1px solid ##cc;\n" -" padding: 2px 10px;\n" -" margin: 2px 0px;\n" -"}\n" -"\n" -"tr.memlist {\n" -" background-color: ##f0;\n" -"}\n" -"\n" -"p.formulaDsp {\n" -" text-align: center;\n" -"}\n" -"\n" -"img.formulaDsp {\n" -" \n" -"}\n" -"\n" -"img.formulaInl {\n" -" vertical-align: middle;\n" -"}\n" -"\n" -"div.center {\n" -" text-align: center;\n" -" margin-top: 0px;\n" -" margin-bottom: 0px;\n" -" padding: 0px;\n" -"}\n" -"\n" -"div.center img {\n" -" border: 0px;\n" -"}\n" -"\n" -"address.footer {\n" -" text-align: right;\n" -" padding-right: 12px;\n" -"}\n" -"\n" -"img.footer {\n" -" border: 0px;\n" -" vertical-align: middle;\n" -"}\n" -"\n" -"/* @group Code Colorization */\n" -"\n" -"span.keyword {\n" -" color: #008000\n" -"}\n" -"\n" -"span.keywordtype {\n" -" color: #604020\n" -"}\n" -"\n" -"span.keywordflow {\n" -" color: #e08000\n" -"}\n" -"\n" -"span.comment {\n" -" color: #800000\n" -"}\n" -"\n" -"span.preprocessor {\n" -" color: #806020\n" -"}\n" -"\n" -"span.stringliteral {\n" -" color: #002080\n" -"}\n" -"\n" -"span.charliteral {\n" -" color: #008080\n" -"}\n" -"\n" -"span.vhdldigit { \n" -" color: #ff00ff \n" -"}\n" -"\n" -"span.vhdlchar { \n" -" color: #000000 \n" -"}\n" -"\n" -"span.vhdlkeyword { \n" -" color: #700070 \n" -"}\n" -"\n" -"span.vhdllogic { \n" -" color: #ff0000 \n" -"}\n" -"\n" -"blockquote {\n" -" background-color: ##F8;\n" -" border-left: 2px solid ##AA;\n" -" margin: 0 24px 0 4px;\n" -" padding: 0 12px 0 16px;\n" -"}\n" -"\n" -"/* @end */\n" -"\n" -"/*\n" -".search {\n" -" color: #003399;\n" -" font-weight: bold;\n" -"}\n" -"\n" -"form.search {\n" -" margin-bottom: 0px;\n" -" margin-top: 0px;\n" -"}\n" -"\n" -"input.search {\n" -" font-size: 75%;\n" -" color: #000080;\n" -" font-weight: normal;\n" -" background-color: #e8eef2;\n" -"}\n" -"*/\n" -"\n" -"td.tiny {\n" -" font-size: 75%;\n" -"}\n" -"\n" -".dirtab {\n" -" padding: 4px;\n" -" border-collapse: collapse;\n" -" border: 1px solid ##b0;\n" -"}\n" -"\n" -"th.dirtab {\n" -" background: ##ee;\n" -" font-weight: bold;\n" -"}\n" -"\n" -"hr {\n" -" height: 0px;\n" -" border: none;\n" -" border-top: 1px solid ##66;\n" -"}\n" -"\n" -"hr.footer {\n" -" height: 1px;\n" -"}\n" -"\n" -"/* @group Member Descriptions */\n" -"\n" -"table.memberdecls {\n" -" border-spacing: 0px;\n" -" padding: 0px;\n" -"}\n" -"\n" -".memberdecls td, .fieldtable tr {\n" -" -webkit-transition-property: background-color, box-shadow;\n" -" -webkit-transition-duration: 0.5s;\n" -" -moz-transition-property: background-color, box-shadow;\n" -" -moz-transition-duration: 0.5s;\n" -" -ms-transition-property: background-color, box-shadow;\n" -" -ms-transition-duration: 0.5s;\n" -" -o-transition-property: background-color, box-shadow;\n" -" -o-transition-duration: 0.5s;\n" -" transition-property: background-color, box-shadow;\n" -" transition-duration: 0.5s;\n" -"}\n" -"\n" -".memberdecls td.glow, .fieldtable tr.glow {\n" -" background-color: cyan;\n" -" box-shadow: 0 0 15px cyan;\n" -"}\n" -"\n" -".mdescLeft, .mdescRight,\n" -".memItemLeft, .memItemRight,\n" -".memTemplItemLeft, .memTemplItemRight, .memTemplParams {\n" -" background-color: ##FA;\n" -" border: none;\n" -" margin: 4px;\n" -" padding: 1px 0 0 8px;\n" -"}\n" -"\n" -".mdescLeft, .mdescRight {\n" -" padding: 0px 8px 4px 8px;\n" -" color: #555;\n" -"}\n" -"\n" -".memSeparator {\n" -" border-bottom: 1px solid #DEE4F0;\n" -" line-height: 1px;\n" -" margin: 0px;\n" -" padding: 0px;\n" -"}\n" -"\n" -".memItemLeft, .memTemplItemLeft {\n" -" white-space: nowrap;\n" -"}\n" -"\n" -".memItemRight {\n" -" width: 100%;\n" -"}\n" -"\n" -".memTemplParams {\n" -" color: ##60;\n" -" white-space: nowrap;\n" -" font-size: 80%;\n" -"}\n" -"\n" -"/* @end */\n" -"\n" -"/* @group Member Details */\n" -"\n" -"/* Styles for detailed member documentation */\n" -"\n" -".memtemplate {\n" -" font-size: 80%;\n" -" color: ##60;\n" -" font-weight: normal;\n" -" margin-left: 9px;\n" -"}\n" -"\n" -".memnav {\n" -" background-color: ##ee;\n" -" border: 1px solid ##b0;\n" -" text-align: center;\n" -" margin: 2px;\n" -" margin-right: 15px;\n" -" padding: 2px;\n" -"}\n" -"\n" -".mempage {\n" -" width: 100%;\n" -"}\n" -"\n" -".memitem {\n" -" padding: 0;\n" -" margin-bottom: 10px;\n" -" margin-right: 5px;\n" -" -webkit-transition: box-shadow 0.5s linear;\n" -" -moz-transition: box-shadow 0.5s linear;\n" -" -ms-transition: box-shadow 0.5s linear;\n" -" -o-transition: box-shadow 0.5s linear;\n" -" transition: box-shadow 0.5s linear;\n" -" display: table !important;\n" -" width: 100%;\n" -"}\n" -"\n" -".memitem.glow {\n" -" box-shadow: 0 0 15px cyan;\n" -"}\n" -"\n" -".memname {\n" -" font-weight: bold;\n" -" margin-left: 6px;\n" -"}\n" -"\n" -".memname td {\n" -" vertical-align: bottom;\n" -"}\n" -"\n" -".memproto, dl.reflist dt {\n" -" border-top: 1px solid ##B4;\n" -" border-left: 1px solid ##B4;\n" -" border-right: 1px solid ##B4;\n" -" padding: 6px 0px 6px 0px;\n" -" color: ##2b;\n" -" font-weight: bold;\n" -" text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);\n" -" background-image:url('nav_f.png');\n" -" background-repeat:repeat-x;\n" -" background-color: ##E6;\n" -" /* opera specific markup */\n" -" box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n" -" border-top-right-radius: 4px;\n" -" border-top-left-radius: 4px;\n" -" /* firefox specific markup */\n" -" -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n" -" -moz-border-radius-topright: 4px;\n" -" -moz-border-radius-topleft: 4px;\n" -" /* webkit specific markup */\n" -" -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n" -" -webkit-border-top-right-radius: 4px;\n" -" -webkit-border-top-left-radius: 4px;\n" -"\n" -"}\n" -"\n" -".memdoc, dl.reflist dd {\n" -" border-bottom: 1px solid ##B4; \n" -" border-left: 1px solid ##B4; \n" -" border-right: 1px solid ##B4; \n" -" padding: 6px 10px 2px 10px;\n" -" background-color: ##FC;\n" -" border-top-width: 0;\n" -" background-image:url('nav_g.png');\n" -" background-repeat:repeat-x;\n" -" background-color: #FFFFFF;\n" -" /* opera specific markup */\n" -" border-bottom-left-radius: 4px;\n" -" border-bottom-right-radius: 4px;\n" -" box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n" -" /* firefox specific markup */\n" -" -moz-border-radius-bottomleft: 4px;\n" -" -moz-border-radius-bottomright: 4px;\n" -" -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n" -" /* webkit specific markup */\n" -" -webkit-border-bottom-left-radius: 4px;\n" -" -webkit-border-bottom-right-radius: 4px;\n" -" -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n" -"}\n" -"\n" -"dl.reflist dt {\n" -" padding: 5px;\n" -"}\n" -"\n" -"dl.reflist dd {\n" -" margin: 0px 0px 10px 0px;\n" -" padding: 5px;\n" -"}\n" -"\n" -".paramkey {\n" -" text-align: right;\n" -"}\n" -"\n" -".paramtype {\n" -" white-space: nowrap;\n" -"}\n" -"\n" -".paramname {\n" -" color: #602020;\n" -" white-space: nowrap;\n" -"}\n" -".paramname em {\n" -" font-style: normal;\n" -"}\n" -".paramname code {\n" -" line-height: 14px;\n" -"}\n" -"\n" -".params, .retval, .exception, .tparams {\n" -" margin-left: 0px;\n" -" padding-left: 0px;\n" -"} \n" -"\n" -".params .paramname, .retval .paramname {\n" -" font-weight: bold;\n" -" vertical-align: top;\n" -"}\n" -" \n" -".params .paramtype {\n" -" font-style: italic;\n" -" vertical-align: top;\n" -"} \n" -" \n" -".params .paramdir {\n" -" font-family: \"courier new\",courier,monospace;\n" -" vertical-align: top;\n" -"}\n" -"\n" -"table.mlabels {\n" -" border-spacing: 0px;\n" -"}\n" -"\n" -"td.mlabels-left {\n" -" width: 100%;\n" -" padding: 0px;\n" -"}\n" -"\n" -"td.mlabels-right {\n" -" vertical-align: bottom;\n" -" padding: 0px;\n" -" white-space: nowrap;\n" -"}\n" -"\n" -"span.mlabels {\n" -" margin-left: 8px;\n" -"}\n" -"\n" -"span.mlabel {\n" -" background-color: ##88;\n" -" border-top:1px solid ##70;\n" -" border-left:1px solid ##70;\n" -" border-right:1px solid ##CC;\n" -" border-bottom:1px solid ##CC;\n" -" text-shadow: none;\n" -" color: white;\n" -" margin-right: 4px;\n" -" padding: 2px 3px;\n" -" border-radius: 3px;\n" -" font-size: 7pt;\n" -" white-space: nowrap;\n" -" vertical-align: middle;\n" -"}\n" -"\n" -"\n" -"\n" -"/* @end */\n" -"\n" -"/* these are for tree view when not used as main index */\n" -"\n" -"div.directory {\n" -" margin: 10px 0px;\n" -" border-top: 1px solid #A8B8D9;\n" -" border-bottom: 1px solid #A8B8D9;\n" -" width: 100%;\n" -"}\n" -"\n" -".directory table {\n" -" border-collapse:collapse;\n" -"}\n" -"\n" -".directory td {\n" -" margin: 0px;\n" -" padding: 0px;\n" -" vertical-align: top;\n" -"}\n" -"\n" -".directory td.entry {\n" -" white-space: nowrap;\n" -" padding-right: 6px;\n" -" padding-top: 3px;\n" -"}\n" -"\n" -".directory td.entry a {\n" -" outline:none;\n" -"}\n" -"\n" -".directory td.entry a img {\n" -" border: none;\n" -"}\n" -"\n" -".directory td.desc {\n" -" width: 100%;\n" -" padding-left: 6px;\n" -" padding-right: 6px;\n" -" padding-top: 3px;\n" -" border-left: 1px solid rgba(0,0,0,0.05);\n" -"}\n" -"\n" -".directory tr.even {\n" -" padding-left: 6px;\n" -" background-color: ##F8;\n" -"}\n" -"\n" -".directory img {\n" -" vertical-align: -30%;\n" -"}\n" -"\n" -".directory .levels {\n" -" white-space: nowrap;\n" -" width: 100%;\n" -" text-align: right;\n" -" font-size: 9pt;\n" -"}\n" -"\n" -".directory .levels span {\n" -" cursor: pointer;\n" -" padding-left: 2px;\n" -" padding-right: 2px;\n" -" color: ##50;\n" -"}\n" -"\n" -"div.dynheader {\n" -" margin-top: 8px;\n" -" -webkit-touch-callout: none;\n" -" -webkit-user-select: none;\n" -" -khtml-user-select: none;\n" -" -moz-user-select: none;\n" -" -ms-user-select: none;\n" -" user-select: none;\n" -"}\n" -"\n" -"address {\n" -" font-style: normal;\n" -" color: ##33;\n" -"}\n" -"\n" -"table.doxtable {\n" -" border-collapse:collapse;\n" -" margin-top: 4px;\n" -" margin-bottom: 4px;\n" -"}\n" -"\n" -"table.doxtable td, table.doxtable th {\n" -" border: 1px solid ##37;\n" -" padding: 3px 7px 2px;\n" -"}\n" -"\n" -"table.doxtable th {\n" -" background-color: ##47;\n" -" color: #FFFFFF;\n" -" font-size: 110%;\n" -" padding-bottom: 4px;\n" -" padding-top: 5px;\n" -"}\n" -"\n" -"table.fieldtable {\n" -" /*width: 100%;*/\n" -" margin-bottom: 10px;\n" -" border: 1px solid ##B4;\n" -" border-spacing: 0px;\n" -" -moz-border-radius: 4px;\n" -" -webkit-border-radius: 4px;\n" -" border-radius: 4px;\n" -" -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;\n" -" -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);\n" -" box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);\n" -"}\n" -"\n" -".fieldtable td, .fieldtable th {\n" -" padding: 3px 7px 2px;\n" -"}\n" -"\n" -".fieldtable td.fieldtype, .fieldtable td.fieldname {\n" -" white-space: nowrap;\n" -" border-right: 1px solid ##B4;\n" -" border-bottom: 1px solid ##B4;\n" -" vertical-align: top;\n" -"}\n" -"\n" -".fieldtable td.fieldname {\n" -" padding-top: 3px;\n" -"}\n" -"\n" -".fieldtable td.fielddoc {\n" -" border-bottom: 1px solid ##B4;\n" -" /*width: 100%;*/\n" -"}\n" -"\n" -".fieldtable td.fielddoc p:first-child {\n" -" margin-top: 0px;\n" -"} \n" -" \n" -".fieldtable td.fielddoc p:last-child {\n" -" margin-bottom: 2px;\n" -"}\n" -"\n" -".fieldtable tr:last-child td {\n" -" border-bottom: none;\n" -"}\n" -"\n" -".fieldtable th {\n" -" background-image:url('nav_f.png');\n" -" background-repeat:repeat-x;\n" -" background-color: ##E6;\n" -" font-size: 90%;\n" -" color: ##2B;\n" -" padding-bottom: 4px;\n" -" padding-top: 5px;\n" -" text-align:left;\n" -" -moz-border-radius-topleft: 4px;\n" -" -moz-border-radius-topright: 4px;\n" -" -webkit-border-top-left-radius: 4px;\n" -" -webkit-border-top-right-radius: 4px;\n" -" border-top-left-radius: 4px;\n" -" border-top-right-radius: 4px;\n" -" border-bottom: 1px solid ##B4;\n" -"}\n" -"\n" -"\n" -".tabsearch {\n" -" top: 0px;\n" -" left: 10px;\n" -" height: 36px;\n" -" background-image: url('tab_b.png');\n" -" z-index: 101;\n" -" overflow: hidden;\n" -" font-size: 13px;\n" -"}\n" -"\n" -".navpath ul\n" -"{\n" -" font-size: 11px;\n" -" background-image:url('tab_b.png');\n" -" background-repeat:repeat-x;\n" -" background-position: 0 -5px;\n" -" height:30px;\n" -" line-height:30px;\n" -" color:##9b;\n" -" border:solid 1px ##ca;\n" -" overflow:hidden;\n" -" margin:0px;\n" -" padding:0px;\n" -"}\n" -"\n" -".navpath li\n" -"{\n" -" list-style-type:none;\n" -" float:left;\n" -" padding-left:10px;\n" -" padding-right:15px;\n" -" background-image:url('bc_s.png');\n" -" background-repeat:no-repeat;\n" -" background-position:right;\n" -" color:##45;\n" -"}\n" -"\n" -".navpath li.navelem a\n" -"{\n" -" height:32px;\n" -" display:block;\n" -" text-decoration: none;\n" -" outline: none;\n" -" color: ##30;\n" -" font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;\n" -" text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);\n" -" text-decoration: none; \n" -"}\n" -"\n" -".navpath li.navelem a:hover\n" -"{\n" -" color:##80;\n" -"}\n" -"\n" -".navpath li.footer\n" -"{\n" -" list-style-type:none;\n" -" float:right;\n" -" padding-left:10px;\n" -" padding-right:15px;\n" -" background-image:none;\n" -" background-repeat:no-repeat;\n" -" background-position:right;\n" -" color:##45;\n" -" font-size: 8pt;\n" -"}\n" -"\n" -"\n" -"div.summary\n" -"{\n" -" float: right;\n" -" font-size: 8pt;\n" -" padding-right: 5px;\n" -" width: 50%;\n" -" text-align: right;\n" -"} \n" -"\n" -"div.summary a\n" -"{\n" -" white-space: nowrap;\n" -"}\n" -"\n" -"div.ingroups\n" -"{\n" -" font-size: 8pt;\n" -" width: 50%;\n" -" text-align: left;\n" -"}\n" -"\n" -"div.ingroups a\n" -"{\n" -" white-space: nowrap;\n" -"}\n" -"\n" -"div.header\n" -"{\n" -" background-image:url('nav_h.png');\n" -" background-repeat:repeat-x;\n" -" background-color: ##FA;\n" -" margin: 0px;\n" -" border-bottom: 1px solid ##CC;\n" -"}\n" -"\n" -"div.headertitle\n" -"{\n" -" padding: 5px 5px 5px 10px;\n" -"}\n" -"\n" -"dl\n" -"{\n" -" padding: 0 0 0 10px;\n" -"}\n" -"\n" -"/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */\n" -"dl.section\n" -"{\n" -" margin-left: 0px;\n" -" padding-left: 0px;\n" -"}\n" -"\n" -"dl.note\n" -"{\n" -" margin-left:-7px;\n" -" padding-left: 3px;\n" -" border-left:4px solid;\n" -" border-color: #D0C000;\n" -"}\n" -"\n" -"dl.warning, dl.attention\n" -"{\n" -" margin-left:-7px;\n" -" padding-left: 3px;\n" -" border-left:4px solid;\n" -" border-color: #FF0000;\n" -"}\n" -"\n" -"dl.pre, dl.post, dl.invariant\n" -"{\n" -" margin-left:-7px;\n" -" padding-left: 3px;\n" -" border-left:4px solid;\n" -" border-color: #00D000;\n" -"}\n" -"\n" -"dl.deprecated\n" -"{\n" -" margin-left:-7px;\n" -" padding-left: 3px;\n" -" border-left:4px solid;\n" -" border-color: #505050;\n" -"}\n" -"\n" -"dl.todo\n" -"{\n" -" margin-left:-7px;\n" -" padding-left: 3px;\n" -" border-left:4px solid;\n" -" border-color: #00C0E0;\n" -"}\n" -"\n" -"dl.test\n" -"{\n" -" margin-left:-7px;\n" -" padding-left: 3px;\n" -" border-left:4px solid;\n" -" border-color: #3030E0;\n" -"}\n" -"\n" -"dl.bug\n" -"{\n" -" margin-left:-7px;\n" -" padding-left: 3px;\n" -" border-left:4px solid;\n" -" border-color: #C08050;\n" -"}\n" -"\n" -"dl.section dd {\n" -" margin-bottom: 6px;\n" -"}\n" -"\n" -"\n" -"#projectlogo\n" -"{\n" -" text-align: center;\n" -" vertical-align: bottom;\n" -" border-collapse: separate;\n" -"}\n" -" \n" -"#projectlogo img\n" -"{ \n" -" border: 0px none;\n" -"}\n" -" \n" -"#projectname\n" -"{\n" -" font: 300% Tahoma, Arial,sans-serif;\n" -" margin: 0px;\n" -" padding: 2px 0px;\n" -"}\n" -" \n" -"#projectbrief\n" -"{\n" -" font: 120% Tahoma, Arial,sans-serif;\n" -" margin: 0px;\n" -" padding: 0px;\n" -"}\n" -"\n" -"#projectnumber\n" -"{\n" -" font: 50% Tahoma, Arial,sans-serif;\n" -" margin: 0px;\n" -" padding: 0px;\n" -"}\n" -"\n" -"#titlearea\n" -"{\n" -" padding: 0px;\n" -" margin: 0px;\n" -" width: 100%;\n" -" border-bottom: 1px solid ##70;\n" -"}\n" -"\n" -".image\n" -"{\n" -" text-align: center;\n" -"}\n" -"\n" -".dotgraph\n" -"{\n" -" text-align: center;\n" -"}\n" -"\n" -".mscgraph\n" -"{\n" -" text-align: center;\n" -"}\n" -"\n" -".caption\n" -"{\n" -" font-weight: bold;\n" -"}\n" -"\n" -"div.zoom\n" -"{\n" -" border: 1px solid ##A0;\n" -"}\n" -"\n" -"dl.citelist {\n" -" margin-bottom:50px;\n" -"}\n" -"\n" -"dl.citelist dt {\n" -" color:##40;\n" -" float:left;\n" -" font-weight:bold;\n" -" margin-right:10px;\n" -" padding:5px;\n" -"}\n" -"\n" -"dl.citelist dd {\n" -" margin:2px 0;\n" -" padding:5px 0;\n" -"}\n" -"\n" -"div.toc {\n" -" padding: 14px 25px;\n" -" background-color: ##F6;\n" -" border: 1px solid ##DD;\n" -" border-radius: 7px 7px 7px 7px;\n" -" float: right;\n" -" height: auto;\n" -" margin: 0 20px 10px 10px;\n" -" width: 200px;\n" -"}\n" -"\n" -"div.toc li {\n" -" background: url(\"bdwn.png\") no-repeat scroll 0 5px transparent;\n" -" font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;\n" -" margin-top: 5px;\n" -" padding-left: 10px;\n" -" padding-top: 2px;\n" -"}\n" -"\n" -"div.toc h3 {\n" -" font: bold 12px/1.2 Arial,FreeSans,sans-serif;\n" -" color: ##60;\n" -" border-bottom: 0 none;\n" -" margin: 0;\n" -"}\n" -"\n" -"div.toc ul {\n" -" list-style: none outside none;\n" -" border: medium none;\n" -" padding: 0px;\n" -"} \n" -"\n" -"div.toc li.level1 {\n" -" margin-left: 0px;\n" -"}\n" -"\n" -"div.toc li.level2 {\n" -" margin-left: 15px;\n" -"}\n" -"\n" -"div.toc li.level3 {\n" -" margin-left: 30px;\n" -"}\n" -"\n" -"div.toc li.level4 {\n" -" margin-left: 45px;\n" -"}\n" -"\n" -".inherit_header {\n" -" font-weight: bold;\n" -" color: gray;\n" -" cursor: pointer;\n" -" -webkit-touch-callout: none;\n" -" -webkit-user-select: none;\n" -" -khtml-user-select: none;\n" -" -moz-user-select: none;\n" -" -ms-user-select: none;\n" -" user-select: none;\n" -"}\n" -"\n" -".inherit_header td {\n" -" padding: 6px 0px 2px 5px;\n" -"}\n" -"\n" -".inherit {\n" -" display: none;\n" -"}\n" -"\n" -"tr.heading h2 {\n" -" margin-top: 12px;\n" -" margin-bottom: 4px;\n" -"}\n" -"\n" -"/* tooltip related style info */\n" -"\n" -".ttc {\n" -" position: absolute;\n" -" display: none;\n" -"}\n" -"\n" -"#powerTip {\n" -" cursor: default;\n" -" white-space: nowrap;\n" -" background-color: white;\n" -" border: 1px solid gray;\n" -" border-radius: 4px 4px 4px 4px;\n" -" box-shadow: 1px 1px 7px gray;\n" -" display: none;\n" -" font-size: smaller;\n" -" max-width: 80%;\n" -" opacity: 0.9;\n" -" padding: 1ex 1em 1em;\n" -" position: absolute;\n" -" z-index: 2147483647;\n" -"}\n" -"\n" -"#powerTip div.ttdoc {\n" -" color: grey;\n" -" font-style: italic;\n" -"}\n" -"\n" -"#powerTip div.ttname a {\n" -" font-weight: bold;\n" -"}\n" -"\n" -"#powerTip div.ttname {\n" -" font-weight: bold;\n" -"}\n" -"\n" -"#powerTip div.ttdeci {\n" -" color: #006318;\n" -"}\n" -"\n" -"#powerTip div {\n" -" margin: 0px;\n" -" padding: 0px;\n" -" font: 12px/16px Roboto,sans-serif;\n" -"}\n" -"\n" -"#powerTip:before, #powerTip:after {\n" -" content: \"\";\n" -" position: absolute;\n" -" margin: 0px;\n" -"}\n" -"\n" -"#powerTip.n:after, #powerTip.n:before,\n" -"#powerTip.s:after, #powerTip.s:before,\n" -"#powerTip.w:after, #powerTip.w:before,\n" -"#powerTip.e:after, #powerTip.e:before,\n" -"#powerTip.ne:after, #powerTip.ne:before,\n" -"#powerTip.se:after, #powerTip.se:before,\n" -"#powerTip.nw:after, #powerTip.nw:before,\n" -"#powerTip.sw:after, #powerTip.sw:before {\n" -" border: solid transparent;\n" -" content: \" \";\n" -" height: 0;\n" -" width: 0;\n" -" position: absolute;\n" -"}\n" -"\n" -"#powerTip.n:after, #powerTip.s:after,\n" -"#powerTip.w:after, #powerTip.e:after,\n" -"#powerTip.nw:after, #powerTip.ne:after,\n" -"#powerTip.sw:after, #powerTip.se:after {\n" -" border-color: rgba(255, 255, 255, 0);\n" -"}\n" -"\n" -"#powerTip.n:before, #powerTip.s:before,\n" -"#powerTip.w:before, #powerTip.e:before,\n" -"#powerTip.nw:before, #powerTip.ne:before,\n" -"#powerTip.sw:before, #powerTip.se:before {\n" -" border-color: rgba(128, 128, 128, 0);\n" -"}\n" -"\n" -"#powerTip.n:after, #powerTip.n:before,\n" -"#powerTip.ne:after, #powerTip.ne:before,\n" -"#powerTip.nw:after, #powerTip.nw:before {\n" -" top: 100%;\n" -"}\n" -"\n" -"#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {\n" -" border-top-color: #ffffff;\n" -" border-width: 10px;\n" -" margin: 0px -10px;\n" -"}\n" -"#powerTip.n:before {\n" -" border-top-color: #808080;\n" -" border-width: 11px;\n" -" margin: 0px -11px;\n" -"}\n" -"#powerTip.n:after, #powerTip.n:before {\n" -" left: 50%;\n" -"}\n" -"\n" -"#powerTip.nw:after, #powerTip.nw:before {\n" -" right: 14px;\n" -"}\n" -"\n" -"#powerTip.ne:after, #powerTip.ne:before {\n" -" left: 14px;\n" -"}\n" -"\n" -"#powerTip.s:after, #powerTip.s:before,\n" -"#powerTip.se:after, #powerTip.se:before,\n" -"#powerTip.sw:after, #powerTip.sw:before {\n" -" bottom: 100%;\n" -"}\n" -"\n" -"#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {\n" -" border-bottom-color: #ffffff;\n" -" border-width: 10px;\n" -" margin: 0px -10px;\n" -"}\n" -"\n" -"#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {\n" -" border-bottom-color: #808080;\n" -" border-width: 11px;\n" -" margin: 0px -11px;\n" -"}\n" -"\n" -"#powerTip.s:after, #powerTip.s:before {\n" -" left: 50%;\n" -"}\n" -"\n" -"#powerTip.sw:after, #powerTip.sw:before {\n" -" right: 14px;\n" -"}\n" -"\n" -"#powerTip.se:after, #powerTip.se:before {\n" -" left: 14px;\n" -"}\n" -"\n" -"#powerTip.e:after, #powerTip.e:before {\n" -" left: 100%;\n" -"}\n" -"#powerTip.e:after {\n" -" border-left-color: #ffffff;\n" -" border-width: 10px;\n" -" top: 50%;\n" -" margin-top: -10px;\n" -"}\n" -"#powerTip.e:before {\n" -" border-left-color: #808080;\n" -" border-width: 11px;\n" -" top: 50%;\n" -" margin-top: -11px;\n" -"}\n" -"\n" -"#powerTip.w:after, #powerTip.w:before {\n" -" right: 100%;\n" -"}\n" -"#powerTip.w:after {\n" -" border-right-color: #ffffff;\n" -" border-width: 10px;\n" -" top: 50%;\n" -" margin-top: -10px;\n" -"}\n" -"#powerTip.w:before {\n" -" border-right-color: #808080;\n" -" border-width: 11px;\n" -" top: 50%;\n" -" margin-top: -11px;\n" -"}\n" -"\n" -"@media print\n" -"{\n" -" #top { display: none; }\n" -" #side-nav { display: none; }\n" -" #nav-path { display: none; }\n" -" body { overflow:visible; }\n" -" h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }\n" -" .summary { display: none; }\n" -" .memitem { page-break-inside: avoid; }\n" -" #doc-content\n" -" {\n" -" margin-left:0 !important;\n" -" height:auto !important;\n" -" width:auto !important;\n" -" overflow:inherit;\n" -" display:inline;\n" -" }\n" -"}\n" -"\n" diff --git a/src/doxygen_sty.h b/src/doxygen_sty.h deleted file mode 100644 index fedbd17..0000000 --- a/src/doxygen_sty.h +++ /dev/null @@ -1,464 +0,0 @@ -"\\NeedsTeXFormat{LaTeX2e}\n" -"\\ProvidesPackage{doxygen}\n" -"\n" -"% Packages used by this style file\n" -"\\RequirePackage{alltt}\n" -"\\RequirePackage{array}\n" -"\\RequirePackage{calc}\n" -"\\RequirePackage{float}\n" -"\\RequirePackage{ifthen}\n" -"\\RequirePackage{verbatim}\n" -"\\RequirePackage[table]{xcolor}\n" -"\\RequirePackage{xtab}\n" -"\n" -"%---------- Internal commands used in this style file ----------------\n" -"\n" -"\\newcommand{\\ensurespace}[1]{%\n" -" \\begingroup%\n" -" \\setlength{\\dimen@}{#1}%\n" -" \\vskip\\z@\\@plus\\dimen@%\n" -" \\penalty -100\\vskip\\z@\\@plus -\\dimen@%\n" -" \\vskip\\dimen@%\n" -" \\penalty 9999%\n" -" \\vskip -\\dimen@%\n" -" \\vskip\\z@skip% hide the previous |\\vskip| from |\\addvspace|\n" -" \\endgroup%\n" -"}\n" -"\n" -"\\newcommand{\\DoxyLabelFont}{}\n" -"\\newcommand{\\entrylabel}[1]{%\n" -" {%\n" -" \\parbox[b]{\\labelwidth-4pt}{%\n" -" \\makebox[0pt][l]{\\DoxyLabelFont#1}%\n" -" \\vspace{1.5\\baselineskip}%\n" -" }%\n" -" }%\n" -"}\n" -"\n" -"\\newenvironment{DoxyDesc}[1]{%\n" -" \\ensurespace{4\\baselineskip}%\n" -" \\begin{list}{}{%\n" -" \\settowidth{\\labelwidth}{20pt}%\n" -" \\setlength{\\parsep}{0pt}%\n" -" \\setlength{\\itemsep}{0pt}%\n" -" \\setlength{\\leftmargin}{\\labelwidth+\\labelsep}%\n" -" \\renewcommand{\\makelabel}{\\entrylabel}%\n" -" }%\n" -" \\item[#1]%\n" -"}{%\n" -" \\end{list}%\n" -"}\n" -"\n" -"\\newsavebox{\\xrefbox}\n" -"\\newlength{\\xreflength}\n" -"\\newcommand{\\xreflabel}[1]{%\n" -" \\sbox{\\xrefbox}{#1}%\n" -" \\setlength{\\xreflength}{\\wd\\xrefbox}%\n" -" \\ifthenelse{\\xreflength>\\labelwidth}{%\n" -" \\begin{minipage}{\\textwidth}%\n" -" \\setlength{\\parindent}{0pt}%\n" -" \\hangindent=15pt\\bfseries #1\\vspace{1.2\\itemsep}%\n" -" \\end{minipage}%\n" -" }{%\n" -" \\parbox[b]{\\labelwidth}{\\makebox[0pt][l]{\\textbf{#1}}}%\n" -" }%\n" -"}\n" -"\n" -"%---------- Commands used by doxygen LaTeX output generator ----------\n" -"\n" -"% Used by <pre> ... </pre>\n" -"\\newenvironment{DoxyPre}{%\n" -" \\small%\n" -" \\begin{alltt}%\n" -"}{%\n" -" \\end{alltt}%\n" -" \\normalsize%\n" -"}\n" -"\n" -"% Used by @code ... @endcode\n" -"\\newenvironment{DoxyCode}{%\n" -" \\par%\n" -" \\scriptsize%\n" -" \\begin{alltt}%\n" -"}{%\n" -" \\end{alltt}%\n" -" \\normalsize%\n" -"}\n" -"\n" -"% Used by @example, @include, @includelineno and @dontinclude\n" -"\\newenvironment{DoxyCodeInclude}{%\n" -" \\DoxyCode%\n" -"}{%\n" -" \\endDoxyCode%\n" -"}\n" -"\n" -"% Used by @verbatim ... @endverbatim\n" -"\\newenvironment{DoxyVerb}{%\n" -" \\footnotesize%\n" -" \\verbatim%\n" -"}{%\n" -" \\endverbatim%\n" -" \\normalsize%\n" -"}\n" -"\n" -"% Used by @verbinclude\n" -"\\newenvironment{DoxyVerbInclude}{%\n" -" \\DoxyVerb%\n" -"}{%\n" -" \\endDoxyVerb%\n" -"}\n" -"\n" -"% Used by numbered lists (using '-#' or <ol> ... </ol>)\n" -"\\newenvironment{DoxyEnumerate}{%\n" -" \\enumerate%\n" -"}{%\n" -" \\endenumerate%\n" -"}\n" -"\n" -"% Used by bullet lists (using '-', @li, @arg, or <ul> ... </ul>)\n" -"\\newenvironment{DoxyItemize}{%\n" -" \\itemize%\n" -"}{%\n" -" \\enditemize%\n" -"}\n" -"\n" -"% Used by description lists (using <dl> ... </dl>)\n" -"\\newenvironment{DoxyDescription}{%\n" -" \\description%\n" -"}{%\n" -" \\enddescription%\n" -"}\n" -"\n" -"% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc\n" -"% (only if caption is specified)\n" -"\\newenvironment{DoxyImage}{%\n" -" \\begin{figure}[H]%\n" -" \\begin{center}%\n" -"}{%\n" -" \\end{center}%\n" -" \\end{figure}%\n" -"}\n" -"\n" -"% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc\n" -"% (only if no caption is specified)\n" -"\\newenvironment{DoxyImageNoCaption}{%\n" -"}{%\n" -"}\n" -"\n" -"% Used by @attention\n" -"\\newenvironment{DoxyAttention}[1]{%\n" -" \\begin{DoxyDesc}{#1}%\n" -"}{%\n" -" \\end{DoxyDesc}%\n" -"}\n" -"\n" -"% Used by @author and @authors\n" -"\\newenvironment{DoxyAuthor}[1]{%\n" -" \\begin{DoxyDesc}{#1}%\n" -"}{%\n" -" \\end{DoxyDesc}%\n" -"}\n" -"\n" -"% Used by @date\n" -"\\newenvironment{DoxyDate}[1]{%\n" -" \\begin{DoxyDesc}{#1}%\n" -"}{%\n" -" \\end{DoxyDesc}%\n" -"}\n" -"\n" -"% Used by @invariant\n" -"\\newenvironment{DoxyInvariant}[1]{%\n" -" \\begin{DoxyDesc}{#1}%\n" -"}{%\n" -" \\end{DoxyDesc}%\n" -"}\n" -"\n" -"% Used by @note\n" -"\\newenvironment{DoxyNote}[1]{%\n" -" \\begin{DoxyDesc}{#1}%\n" -"}{%\n" -" \\end{DoxyDesc}%\n" -"}\n" -"\n" -"% Used by @post\n" -"\\newenvironment{DoxyPostcond}[1]{%\n" -" \\begin{DoxyDesc}{#1}%\n" -"}{%\n" -" \\end{DoxyDesc}%\n" -"}\n" -"\n" -"% Used by @pre\n" -"\\newenvironment{DoxyPrecond}[1]{%\n" -" \\begin{DoxyDesc}{#1}%\n" -"}{%\n" -" \\end{DoxyDesc}%\n" -"}\n" -"\n" -"% Used by @copyright\n" -"\\newenvironment{DoxyCopyright}[1]{%\n" -" \\begin{DoxyDesc}{#1}%\n" -"}{%\n" -" \\end{DoxyDesc}%\n" -"}\n" -"\n" -"% Used by @remark\n" -"\\newenvironment{DoxyRemark}[1]{%\n" -" \\begin{DoxyDesc}{#1}%\n" -"}{%\n" -" \\end{DoxyDesc}%\n" -"}\n" -"\n" -"% Used by @return and @returns\n" -"\\newenvironment{DoxyReturn}[1]{%\n" -" \\begin{DoxyDesc}{#1}%\n" -"}{%\n" -" \\end{DoxyDesc}%\n" -"}\n" -"\n" -"% Used by @since\n" -"\\newenvironment{DoxySince}[1]{%\n" -" \\begin{DoxyDesc}{#1}%\n" -"}{%\n" -" \\end{DoxyDesc}%\n" -"}\n" -"\n" -"% Used by @see\n" -"\\newenvironment{DoxySeeAlso}[1]{%\n" -" \\begin{DoxyDesc}{#1}%\n" -"}{%\n" -" \\end{DoxyDesc}%\n" -"}\n" -"\n" -"% Used by @version\n" -"\\newenvironment{DoxyVersion}[1]{%\n" -" \\begin{DoxyDesc}{#1}%\n" -"}{%\n" -" \\end{DoxyDesc}%\n" -"}\n" -"\n" -"% Used by @warning\n" -"\\newenvironment{DoxyWarning}[1]{%\n" -" \\begin{DoxyDesc}{#1}%\n" -"}{%\n" -" \\end{DoxyDesc}%\n" -"}\n" -"\n" -"% Used by @internal\n" -"\\newenvironment{DoxyInternal}[1]{%\n" -" \\paragraph*{#1}%\n" -"}{%\n" -"}\n" -"\n" -"% Used by @par and @paragraph\n" -"\\newenvironment{DoxyParagraph}[1]{%\n" -" \\begin{list}{}{%\n" -" \\settowidth{\\labelwidth}{40pt}%\n" -" \\setlength{\\leftmargin}{\\labelwidth}%\n" -" \\setlength{\\parsep}{0pt}%\n" -" \\setlength{\\itemsep}{-4pt}%\n" -" \\renewcommand{\\makelabel}{\\entrylabel}%\n" -" }%\n" -" \\item[#1]%\n" -"}{%\n" -" \\end{list}%\n" -"}\n" -"\n" -"% Used by parameter lists\n" -"\\newenvironment{DoxyParams}[2][]{%\n" -" \\par%\n" -" \\tabletail{\\hline}%\n" -" \\tablelasttail{\\hline}%\n" -" \\tablefirsthead{}%\n" -" \\tablehead{}%\n" -" \\ifthenelse{\\equal{#1}{}}%\n" -" {\\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #2}\\\\[1ex]}%\n" -" \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n" -" p{0.805\\textwidth}|}}%\n" -" {\\ifthenelse{\\equal{#1}{1}}%\n" -" {\\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #2}\\\\[1ex]}%\n" -" \\begin{xtabular}{|>{\\centering}p{0.10\\textwidth}|%\n" -" >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n" -" p{0.678\\textwidth}|}}%\n" -" {\\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #2}\\\\[1ex]}%\n" -" \\begin{xtabular}{|>{\\centering}p{0.10\\textwidth}|%\n" -" >{\\centering\\hspace{0pt}}p{0.15\\textwidth}|%\n" -" >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n" -" p{0.501\\textwidth}|}}%\n" -" }\\hline%\n" -"}{%\n" -" \\end{xtabular}%\n" -" \\tablefirsthead{}%\n" -" \\vspace{6pt}%\n" -"}\n" -"\n" -"% Used for fields of simple structs\n" -"\\newenvironment{DoxyFields}[1]{%\n" -" \\par%\n" -" \\tabletail{\\hline}%\n" -" \\tablelasttail{\\hline}%\n" -" \\tablehead{}%\n" -" \\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #1}\\\\[1ex]}%\n" -" \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n" -" p{0.15\\textwidth}|%\n" -" p{0.63\\textwidth}|}%\n" -" \\hline%\n" -"}{%\n" -" \\end{xtabular}%\n" -" \\tablefirsthead{}%\n" -" \\vspace{6pt}%\n" -"}\n" -"\n" -"% Used for parameters within a detailed function description\n" -"\\newenvironment{DoxyParamCaption}{%\n" -" \\renewcommand{\\item}[2][]{##1 {\\em ##2}}%\n" -"}{%\n" -"}\n" -"\n" -"% Used by return value lists\n" -"\\newenvironment{DoxyRetVals}[1]{%\n" -" \\par%\n" -" \\tabletail{\\hline}%\n" -" \\tablelasttail{\\hline}%\n" -" \\tablehead{}%\n" -" \\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #1}\\\\[1ex]}%\n" -" \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n" -" p{0.705\\textwidth}|}%\n" -" \\hline%\n" -"}{%\n" -" \\end{xtabular}%\n" -" \\tablefirsthead{}%\n" -" \\vspace{6pt}%\n" -"}\n" -"\n" -"% Used by exception lists\n" -"\\newenvironment{DoxyExceptions}[1]{%\n" -" \\par%\n" -" \\tabletail{\\hline}%\n" -" \\tablelasttail{\\hline}%\n" -" \\tablehead{}%\n" -" \\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #1}\\\\[1ex]}%\n" -" \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n" -" p{0.705\\textwidth}|}%\n" -" \\hline%\n" -"}{%\n" -" \\end{xtabular}%\n" -" \\tablefirsthead{}%\n" -" \\vspace{6pt}%\n" -"}\n" -"\n" -"% Used by template parameter lists\n" -"\\newenvironment{DoxyTemplParams}[1]{%\n" -" \\par%\n" -" \\tabletail{\\hline}%\n" -" \\tablelasttail{\\hline}%\n" -" \\tablehead{}%\n" -" \\tablefirsthead{\\multicolumn{2}{l}{\\hspace{-6pt}\\bfseries\\fontseries{bc}\\selectfont\\color{darkgray} #1}\\\\[1ex]}%\n" -" \\begin{xtabular}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n" -" p{0.705\\textwidth}|}%\n" -" \\hline%\n" -"}{%\n" -" \\end{xtabular}%\n" -" \\tablefirsthead{}%\n" -" \\vspace{6pt}%\n" -"}\n" -"\n" -"% Used for member lists\n" -"\\newenvironment{DoxyCompactItemize}{%\n" -" \\begin{itemize}%\n" -" \\setlength{\\itemsep}{-3pt}%\n" -" \\setlength{\\parsep}{0pt}%\n" -" \\setlength{\\topsep}{0pt}%\n" -" \\setlength{\\partopsep}{0pt}%\n" -"}{%\n" -" \\end{itemize}%\n" -"}\n" -"\n" -"% Used for member descriptions\n" -"\\newenvironment{DoxyCompactList}{%\n" -" \\begin{list}{}{%\n" -" \\setlength{\\leftmargin}{0.5cm}%\n" -" \\setlength{\\itemsep}{0pt}%\n" -" \\setlength{\\parsep}{0pt}%\n" -" \\setlength{\\topsep}{0pt}%\n" -" \\renewcommand{\\makelabel}{\\hfill}%\n" -" }%\n" -"}{%\n" -" \\end{list}%\n" -"}\n" -"\n" -"% Used for reference lists (@bug, @deprecated, @todo, etc.)\n" -"\\newenvironment{DoxyRefList}{%\n" -" \\begin{list}{}{%\n" -" \\setlength{\\labelwidth}{10pt}%\n" -" \\setlength{\\leftmargin}{\\labelwidth}%\n" -" \\addtolength{\\leftmargin}{\\labelsep}%\n" -" \\renewcommand{\\makelabel}{\\xreflabel}%\n" -" }%\n" -"}{%\n" -" \\end{list}%\n" -"}\n" -"\n" -"% Used by @bug, @deprecated, @todo, etc.\n" -"\\newenvironment{DoxyRefDesc}[1]{%\n" -" \\begin{list}{}{%\n" -" \\renewcommand\\makelabel[1]{\\textbf{##1}}%\n" -" \\settowidth\\labelwidth{\\makelabel{#1}}%\n" -" \\setlength\\leftmargin{\\labelwidth+\\labelsep}%\n" -" }%\n" -"}{%\n" -" \\end{list}%\n" -"}\n" -"\n" -"% Used by parameter lists and simple sections\n" -"\\newenvironment{Desc}\n" -"{\\begin{list}{}{%\n" -" \\settowidth{\\labelwidth}{40pt}%\n" -" \\setlength{\\leftmargin}{\\labelwidth}%\n" -" \\setlength{\\parsep}{0pt}%\n" -" \\setlength{\\itemsep}{-4pt}%\n" -" \\renewcommand{\\makelabel}{\\entrylabel}%\n" -" }\n" -"}{%\n" -" \\end{list}%\n" -"}\n" -"\n" -"% Used by tables\n" -"\\newcommand{\\PBS}[1]{\\let\\temp=\\\\#1\\let\\\\=\\temp}%\n" -"\\newlength{\\tmplength}%\n" -"\\newenvironment{TabularC}[1]%\n" -"{%\n" -"\\setlength{\\tmplength}%\n" -" {\\linewidth/(#1)-\\tabcolsep*2-\\arrayrulewidth*(#1+1)/(#1)}%\n" -" \\par\\begin{xtabular*}{\\linewidth}%\n" -" {*{#1}{|>{\\PBS\\raggedright\\hspace{0pt}}p{\\the\\tmplength}}|}%\n" -"}%\n" -"{\\end{xtabular*}\\par}%\n" -"\n" -"% Used for member group headers\n" -"\\newenvironment{Indent}{%\n" -" \\begin{list}{}{%\n" -" \\setlength{\\leftmargin}{0.5cm}%\n" -" }%\n" -" \\item[]\\ignorespaces%\n" -"}{%\n" -" \\unskip%\n" -" \\end{list}%\n" -"}\n" -"\n" -"% Used when hyperlinks are turned off\n" -"\\newcommand{\\doxyref}[3]{%\n" -" \\textbf{#1} (\\textnormal{#2}\\,\\pageref{#3})%\n" -"}\n" -"\n" -"% Used for syntax highlighting\n" -"\\definecolor{comment}{rgb}{0.5,0.0,0.0}\n" -"\\definecolor{keyword}{rgb}{0.0,0.5,0.0}\n" -"\\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}\n" -"\\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}\n" -"\\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}\n" -"\\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}\n" -"\\definecolor{charliteral}{rgb}{0.0,0.5,0.5}\n" -"\\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}\n" -"\\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}\n" -"\\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}\n" -"\\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}\n" diff --git a/src/dynsections_js.h b/src/dynsections_js.h deleted file mode 100644 index c2fba04..0000000 --- a/src/dynsections_js.h +++ /dev/null @@ -1,97 +0,0 @@ -"function toggleVisibility(linkObj)\n" -"{\n" -" var base = $(linkObj).attr('id');\n" -" var summary = $('#'+base+'-summary');\n" -" var content = $('#'+base+'-content');\n" -" var trigger = $('#'+base+'-trigger');\n" -" var src=$(trigger).attr('src');\n" -" if (content.is(':visible')===true) {\n" -" content.hide();\n" -" summary.show();\n" -" $(linkObj).addClass('closed').removeClass('opened');\n" -" $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');\n" -" } else {\n" -" content.show();\n" -" summary.hide();\n" -" $(linkObj).removeClass('closed').addClass('opened');\n" -" $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');\n" -" } \n" -" return false;\n" -"}\n" -"\n" -"function updateStripes()\n" -"{\n" -" $('table.directory tr').\n" -" removeClass('even').filter(':visible:even').addClass('even');\n" -"}\n" -"function toggleLevel(level)\n" -"{\n" -" $('table.directory tr').each(function(){ \n" -" var l = this.id.split('_').length-1;\n" -" var i = $('#img'+this.id.substring(3));\n" -" var a = $('#arr'+this.id.substring(3));\n" -" if (l<level+1) {\n" -" i.attr('src','ftv2folderopen.png');\n" -" a.attr('src','ftv2mnode.png');\n" -" $(this).show();\n" -" } else if (l==level+1) {\n" -" i.attr('src','ftv2folderclosed.png');\n" -" a.attr('src','ftv2pnode.png');\n" -" $(this).show();\n" -" } else {\n" -" $(this).hide();\n" -" }\n" -" });\n" -" updateStripes();\n" -"}\n" -"\n" -"function toggleFolder(id)\n" -"{\n" -" //The clicked row\n" -" var currentRow = $('#row_'+id);\n" -" var currentRowImages = currentRow.find(\"img\");\n" -"\n" -" //All rows after the clicked row\n" -" var rows = currentRow.nextAll(\"tr\");\n" -"\n" -" //Only match elements AFTER this one (can't hide elements before)\n" -" var childRows = rows.filter(function() {\n" -" var re = new RegExp('^row_'+id+'\\\\d+_$', \"i\"); //only one sub\n" -" return this.id.match(re);\n" -" });\n" -"\n" -" //First row is visible we are HIDING\n" -" if (childRows.filter(':first').is(':visible')===true) {\n" -" currentRowImages.filter(\"[id^=arr]\").attr('src', 'ftv2pnode.png');\n" -" currentRowImages.filter(\"[id^=img]\").attr('src', 'ftv2folderclosed.png');\n" -" rows.filter(\"[id^=row_\"+id+\"]\").hide();\n" -" } else { //We are SHOWING\n" -" //All sub images\n" -" var childImages = childRows.find(\"img\");\n" -" var childImg = childImages.filter(\"[id^=img]\");\n" -" var childArr = childImages.filter(\"[id^=arr]\");\n" -"\n" -" currentRow.find(\"[id^=arr]\").attr('src', 'ftv2mnode.png'); //open row\n" -" currentRow.find(\"[id^=img]\").attr('src', 'ftv2folderopen.png'); //open row\n" -" childImg.attr('src','ftv2folderclosed.png'); //children closed\n" -" childArr.attr('src','ftv2pnode.png'); //children closed\n" -" childRows.show(); //show all children\n" -" }\n" -" updateStripes();\n" -"}\n" -"\n" -"\n" -"function toggleInherit(id)\n" -"{\n" -" var rows = $('tr.inherit.'+id);\n" -" var img = $('tr.inherit_header.'+id+' img');\n" -" var src = $(img).attr('src');\n" -" if (rows.filter(':first').is(':visible')===true) {\n" -" rows.css('display','none');\n" -" $(img).attr('src',src.substring(0,src.length-8)+'closed.png');\n" -" } else {\n" -" rows.css('display','table-row'); // using show() causes jump in firefox\n" -" $(img).attr('src',src.substring(0,src.length-10)+'open.png');\n" -" }\n" -"}\n" -"\n" diff --git a/src/extsearch_js.h b/src/extsearch_js.h deleted file mode 100644 index dc72659..0000000 --- a/src/extsearch_js.h +++ /dev/null @@ -1,129 +0,0 @@ -"function SearchBox(name, resultsPath, inFrame, label)\n" -"{\n" -" this.searchLabel = label;\n" -" this.DOMSearchField = function()\n" -" { return document.getElementById(\"MSearchField\"); }\n" -" this.DOMSearchBox = function()\n" -" { return document.getElementById(\"MSearchBox\"); }\n" -" this.OnSearchFieldFocus = function(isActive)\n" -" {\n" -" if (isActive)\n" -" {\n" -" this.DOMSearchBox().className = 'MSearchBoxActive';\n" -" var searchField = this.DOMSearchField();\n" -" if (searchField.value == this.searchLabel) \n" -" {\n" -" searchField.value = '';\n" -" }\n" -" }\n" -" else\n" -" {\n" -" this.DOMSearchBox().className = 'MSearchBoxInactive';\n" -" this.DOMSearchField().value = this.searchLabel;\n" -" }\n" -" }\n" -"}\n" -"\n" -"function trim(s) {\n" -" return s?s.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, ''):'';\n" -"}\n" -"\n" -"function getURLParameter(name) {\n" -" return decodeURIComponent((new RegExp('[?|&]'+name+\n" -" '='+'([^&;]+?)(&|#|;|$)').exec(location.search)\n" -" ||[,\"\"])[1].replace(/\\+/g, '%20'))||null;\n" -"}\n" -"\n" -"var entityMap = {\n" -" \"&\": \"&\",\n" -" \"<\": \"<\",\n" -" \">\": \">\",\n" -" '\"': '"',\n" -" \"'\": ''',\n" -" \"/\": '/'\n" -"};\n" -"\n" -"function escapeHtml(s) {\n" -" return String(s).replace(/[&<>\"'\\/]/g, function (s) {\n" -" return entityMap[s];\n" -" });\n" -"}\n" -"\n" -"function searchFor(query,page,count) {\n" -" $.getJSON(serverUrl+\"?cb=?\",\n" -" {\n" -" n:count,\n" -" p:page,\n" -" q:query\n" -" },\n" -" function(data) {\n" -" var results = $('#searchresults');\n" -" $('#MSearchField').val(query);\n" -" if (data.hits>0) {\n" -" if (data.hits==1) {\n" -" results.html('<p>'+searchResultsText[1]+'</p>');\n" -" } else {\n" -" results.html('<p>'+searchResultsText[2].replace(/\\$num/,data.hits)+'</p>');\n" -" }\n" -" var r='<table>';\n" -" $.each(data.items, function(i,item){\n" -" var prefix = tagMap[item.tag];\n" -" if (prefix) prefix+='/'; else prefix='';\n" -" r+='<tr class=\"searchresult\">'+\n" -" '<td align=\"right\">'+(data.first+i+1)+'.</td>'+\n" -" '<td>'+escapeHtml(item.type)+' '+\n" -" '<a href=\"'+escapeHtml(prefix+item.url)+\n" -" '\">'+escapeHtml(item.name)+'</a>';\n" -" if (item.type==\"source\") {\n" -" var l=item.url.match(/[1-9][0-9]*$/);\n" -" if (l) r+=' at line '+parseInt(l[0]);\n" -" }\n" -" r+='</td>';\n" -" for (var i=0;i<item.fragments.length;i++)\n" -" {\n" -" r+='<tr><td></td><td>'+item.fragments[i]+'</td></tr>';\n" -" }\n" -" r+='</tr>';\n" -" });\n" -" r+='</table>';\n" -" if (data.pages>1) // write multi page navigation bar\n" -" {\n" -" r+='<div class=\"searchpages\">';\n" -" if (data.page>0)\n" -" {\n" -" r+='<span class=\"pages\"><a href=\"javascript:searchFor(\\''+escapeHtml(query)+'\\','+(page-1).toString()+','+count.toString()+')\">«</a></span> ';\n" -" }\n" -" var firstPage = data.page-5;\n" -" var lastPage = data.page+5;\n" -" if (firstPage<0)\n" -" {\n" -" lastPage-=firstPage;\n" -" firstPage=0;\n" -" } \n" -" if (lastPage>data.pages)\n" -" {\n" -" lastPage=data.pages;\n" -" }\n" -" for(var i=firstPage;i<lastPage;i++)\n" -" {\n" -" if (i==data.page)\n" -" {\n" -" r+='<span class=\"pages\"><b>'+(i+1).toString()+'</b></span> ';\n" -" }\n" -" else\n" -" {\n" -" r+='<span class=\"pages\"><a href=\"javascript:searchFor(\\''+escapeHtml(query)+'\\','+i.toString()+','+count.toString()+')\">'+(i+1).toString()+'</a></span> ';\n" -" }\n" -" }\n" -" if (data.page+1<data.pages)\n" -" {\n" -" r+='<span class=\"pages\"><a href=\"javascript:searchFor(\\''+escapeHtml(query)+'\\','+(page+1).toString()+','+count.toString()+')\">»</a></span>';\n" -" }\n" -" r+='</div>';\n" -" }\n" -" results.append(r);\n" -" } else {\n" -" results.html('<p>'+searchResultsText[0]+'</p>');\n" -" }\n" -" });\n" -"}\n" diff --git a/src/filedef.cpp b/src/filedef.cpp index 7bd6aeb..e286284 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -514,7 +514,7 @@ void FileDef::writeSummaryLinks(OutputList &ol) MemberList * ml = getMemberList(lmd->type); if (ml && ml->declVisible()) { - ol.writeSummaryLink(0,ml->listTypeAsString(ml->listType()),lmd->title(lang),first); + ol.writeSummaryLink(0,MemberList::listTypeAsString(ml->listType()),lmd->title(lang),first); first=FALSE; } } @@ -807,6 +807,7 @@ void FileDef::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu) static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES"); static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE"); + DevNullCodeDocInterface devNullIntf; QCString title = m_docname; if (!m_fileVersion.isEmpty()) { @@ -878,10 +879,33 @@ void FileDef::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu) ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension()); pIntf->resetCodeParserState(); ol.startCodeFragment(); + bool needs2PassParsing = + Doxygen::parseSourcesNeeded && // we need to parse (filtered) sources for cross-references + !filterSourceFiles && // but user wants to show sources as-is + !getFileFilter(absFilePath(),TRUE).isEmpty(); // and there is a filter used while parsing + + if (needs2PassParsing) + { + // parse code for cross-references only (see bug707641) + pIntf->parseCode(devNullIntf,0, + fileToString(absFilePath(),TRUE,TRUE), + getLanguage(), + FALSE,0,this + ); + } pIntf->parseCode(ol,0, fileToString(absFilePath(),filterSourceFiles,TRUE), - getLanguage(), - FALSE,0,this + getLanguage(), // lang + FALSE, // isExampleBlock + 0, // exampleName + this, // fileDef + -1, // startLine + -1, // endLine + FALSE, // inlineFragment + 0, // memberDef + TRUE, // showLineNumbers + 0, // searchCtx + !needs2PassParsing // collectXRefs ); ol.endCodeFragment(); } @@ -1770,3 +1794,9 @@ void FileDef::getAllIncludeFilesRecursively(QStrList &incFiles) const QDict<void> includes(257); ::getAllIncludeFilesRecursively(&includes,this,incFiles); } + +QCString FileDef::title() const +{ + return theTranslator->trFileReference(name()); +} + diff --git a/src/filedef.h b/src/filedef.h index f6e5bad..d1d7496 100644 --- a/src/filedef.h +++ b/src/filedef.h @@ -131,6 +131,8 @@ class FileDef : public Definition MemberGroupSDict *getMemberGroupSDict() const { return m_memberGroupSDict; } NamespaceSDict *getNamespaceSDict() const { return m_namespaceSDict; } ClassSDict *getClassSDict() const { return m_classSDict; } + + QCString title() const; //--------------------------------- @@ -294,7 +296,6 @@ class DirEntry private: EntryKind m_kind; FileDef *m_fd; - int num; bool m_isLast; }; diff --git a/src/footer_html.h b/src/footer_html.h deleted file mode 100644 index 2891692..0000000 --- a/src/footer_html.h +++ /dev/null @@ -1,20 +0,0 @@ -"<!-- start footer part -->\n" -"<!--BEGIN GENERATE_TREEVIEW-->\n" -"<div id=\"nav-path\" class=\"navpath\"><!-- id is needed for treeview function! -->\n" -" <ul>\n" -" $navpath\n" -" <li class=\"footer\">$generatedby\n" -" <a href=\"http://www.doxygen.org/index.html\">\n" -" <img class=\"footer\" src=\"$relpath^doxygen.png\" alt=\"doxygen\"/></a> $doxygenversion </li>\n" -" </ul>\n" -"</div>\n" -"<!--END GENERATE_TREEVIEW-->\n" -"<!--BEGIN !GENERATE_TREEVIEW-->\n" -"<hr class=\"footer\"/><address class=\"footer\"><small>\n" -"$generatedby  <a href=\"http://www.doxygen.org/index.html\">\n" -"<img class=\"footer\" src=\"$relpath^doxygen.png\" alt=\"doxygen\"/>\n" -"</a> $doxygenversion\n" -"</small></address>\n" -"<!--END !GENERATE_TREEVIEW-->\n" -"</body>\n" -"</html>\n" diff --git a/src/fortrancode.h b/src/fortrancode.h index 4b709c5..3913ebb 100644 --- a/src/fortrancode.h +++ b/src/fortrancode.h @@ -27,7 +27,8 @@ class Definition; void parseFortranCode(CodeOutputInterface &,const char *,const QCString &, bool ,const char *,FileDef *fd, int startLine,int endLine,bool inlineFragment, - MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx); + MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx, + bool collectRefs); void resetFortranCodeParserState(); void codeFreeScanner(); diff --git a/src/fortrancode.l b/src/fortrancode.l index 80fc333..8ee825b 100644 --- a/src/fortrancode.l +++ b/src/fortrancode.l @@ -132,6 +132,7 @@ static int g_inputLines; //!< number of line in the code fragment static int g_yyLineNr; //!< current line number static bool g_needsTermination; static Definition *g_searchCtx; +static bool g_collectXRefs; static bool g_isFixedForm; static bool g_insideBody; //!< inside subprog/program body? => create links @@ -378,36 +379,6 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol, } } -#if 0 -static QCString fileLocation() -{ - QCString result = g_sourceFileDef?g_sourceFileDef->absFilePath():QCString("[unknown]"); - result+=":"+QCString().setNum(g_yyLineNr); - result+=":"+QCString().setNum(1); - return result; -} - - -/** - generates dictionay entries that are used if REFERENCED_BY_RELATION ... options are set - (e.g. the "referenced by ..." list after the function documentation) -*/ - -static void addDocCrossReference(MemberDef *src, MemberDef *dst) -{ - if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types - //printf("======= addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data()); - if ((Config_getBool("REFERENCED_BY_RELATION") || Config_getBool("CALLER_GRAPH")) && - (src->isFunction())) - { - dst->addSourceReferencedBy(src,fileLocation()); - } - if ((Config_getBool("REFERENCES_RELATION") || Config_getBool("CALL_GRAPH")) && (src->isFunction())) - { - src->addSourceReferences(dst,fileLocation()); - } -} -#endif //------------------------------------------------------------------------------- /** @@ -565,7 +536,8 @@ static bool getLink(UseSDict *usedict, // dictonary with used modules if (md->getGroupDef()) d = md->getGroupDef(); if (d && d->isLinkable()) { - if (g_currentDefinition && g_currentMemberDef && md!=g_currentMemberDef && g_insideBody) + if (g_currentDefinition && g_currentMemberDef && + md!=g_currentMemberDef && g_insideBody && g_collectXRefs) { addDocCrossReference(g_currentMemberDef,md); } @@ -712,14 +684,14 @@ CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS})) TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}COMPLEX|DOUBLE{BS_}PRECISION|{CHAR}) INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")" -ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|ELEMENTAL) +ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|IMPURE|ELEMENTAL) ACCESS_SPEC (PROTECTED|PRIVATE|PUBLIC) /* Assume that attribute statements are almost the same as attributes. */ ATTR_STMT {ATTR_SPEC}|DIMENSION FLOW (DO|SELECT|CASE|WHERE|IF|THEN|ELSE|WHILE|FORALL|ELSEWHERE|ELSEIF|RETURN|CONTINUE|EXIT) COMMANDS (FORMAT|CONTAINS|MODULE{BS_}PROCEDURE|WRITE|READ|ALLOCATE|ALLOCATED|ASSOCIATED|DEALLOCATE|SIZE|INQUIRE|OPEN|CLOSE|DATA|COMMON) IGNORE (CALL) -PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTAL)? +PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|IMPURE|PURE|ELEMENTAL)? /* | */ @@ -1133,7 +1105,8 @@ void resetFortranCodeParserState() {} void parseFortranCode(CodeOutputInterface &od,const char *className,const QCString &s, bool exBlock, const char *exName,FileDef *fd, int startLine,int endLine,bool inlineFragment, - MemberDef *memberDef,bool,Definition *searchCtx) + MemberDef *memberDef,bool,Definition *searchCtx, + bool collectXRefs) { //printf("***parseCode() exBlock=%d exName=%s fd=%p\n",exBlock,exName,fd); @@ -1142,6 +1115,7 @@ void parseFortranCode(CodeOutputInterface &od,const char *className,const QCStri (void)className; if (s.isEmpty()) return; + printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL); TooltipManager::instance()->clearTooltips(); g_code = &od; g_inputString = s; @@ -1150,6 +1124,7 @@ void parseFortranCode(CodeOutputInterface &od,const char *className,const QCStri g_currentFontClass = 0; g_needsTermination = FALSE; g_searchCtx = searchCtx; + g_collectXRefs = collectXRefs; if (endLine!=-1) g_inputLines = endLine+1; else @@ -1182,9 +1157,9 @@ void parseFortranCode(CodeOutputInterface &od,const char *className,const QCStri startCodeLine(); g_parmName.resize(0); g_parmType.resize(0); - fcodeYYrestart( fcodeYYin ); + fortrancodeYYrestart( fortrancodeYYin ); BEGIN( Start ); - fcodeYYlex(); + fortrancodeYYlex(); if (g_needsTermination) { endFontClass(); @@ -1200,18 +1175,19 @@ void parseFortranCode(CodeOutputInterface &od,const char *className,const QCStri delete g_sourceFileDef; g_sourceFileDef=0; } + printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL); return; } #if !defined(YY_FLEX_SUBMINOR_VERSION) extern "C" { // some bogus code to keep the compiler happy - void fcodeYYdummy() { yy_flex_realloc(0,0); } + void fortrancodeYYdummy() { yy_flex_realloc(0,0); } } #elif YY_FLEX_SUBMINOR_VERSION<33 #error "You seem to be using a version of flex newer than 2.5.4 but older than 2.5.33. These versions do NOT work with doxygen! Please use version <=2.5.4 or >=2.5.33 or expect things to be parsed wrongly!" #else extern "C" { // some bogus code to keep the compiler happy - void fcodeYYdummy() { yy_top_state(); } + void fortrancodeYYdummy() { yy_top_state(); } } #endif diff --git a/src/fortranscanner.h b/src/fortranscanner.h index e834698..41f7790 100644 --- a/src/fortranscanner.h +++ b/src/fortranscanner.h @@ -48,7 +48,8 @@ class FortranLanguageScanner : public ParserInterface bool inlineFragment=FALSE, MemberDef *memberDef=0, bool showLineNumbers=TRUE, - Definition *searchCtx=0 + Definition *searchCtx=0, + bool collectXRefs=TRUE ); void resetCodeParserState(); void parsePrototype(const char *text); diff --git a/src/fortranscanner.l b/src/fortranscanner.l index 3ed0031..4cdea23 100644 --- a/src/fortranscanner.l +++ b/src/fortranscanner.l @@ -265,7 +265,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?") ATTR_STMT {ATTR_SPEC}|DIMENSION|{ACCESS_SPEC} CONTAINS CONTAINS -PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTAL)? +PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|IMPURE|PURE|ELEMENTAL)? SCOPENAME ({ID}{BS}"::"{BS})* %option noyywrap @@ -738,7 +738,7 @@ private { } {ID} { } -^{BS}"type"{BS_}"is" { } +^{BS}"type"{BS_}"is"/{BS_} { } } <AttributeList>{ {COMMA} {} @@ -944,7 +944,7 @@ private { } // TYPE_SPEC is for old function style function result - result = QCString(yytext).stripWhiteSpace(); + result = QCString(yytext).stripWhiteSpace().lower(); current->type = result; yy_push_state(SubprogPrefix); } @@ -1170,11 +1170,11 @@ static void extractPrefix(QCString &text) int prefixIndex = 0; int curIndex = 0; bool cont = TRUE; - const char* pre[] = {"RECURSIVE","PURE","ELEMENTAL"}; + const char* pre[] = {"RECURSIVE","IMPURE","PURE","ELEMENTAL"}; while(cont) { cont = FALSE; - for(unsigned int i=0; i<3; i++) + for(unsigned int i=0; i<4; i++) { if((prefixIndex=text.find(pre[i], curIndex, FALSE))==0) { @@ -1366,7 +1366,7 @@ static const char* prepassFixedForm(const char* contents) int prevLineLength=0; int prevLineAmpOrExclIndex=-1; bool emptyLabel=TRUE; - int newContentsSize = strlen(contents)+2; // \000 and one spare character (to avoid reallocation) + int newContentsSize = strlen(contents)+3; // \000, \n (when necessary) and one spare character (to avoid reallocation) char* newContents = (char*)malloc(newContentsSize); for(int i=0, j=0;;i++,j++) { @@ -1390,6 +1390,14 @@ static const char* prepassFixedForm(const char* contents) break; case '\000': newContents[j]='\000'; + newContentsSize = strlen(newContents); + if (newContents[newContentsSize - 1] != '\n') + { + // to be on the safe side + newContents = (char*)realloc(newContents, newContentsSize+2); + newContents[newContentsSize] = '\n'; + newContents[newContentsSize + 1] = '\000'; + } return newContents; case 'C': case 'c': @@ -1425,6 +1433,15 @@ static const char* prepassFixedForm(const char* contents) break; } } + + newContentsSize = strlen(newContents); + if (newContents[newContentsSize - 1] != '\n') + { + // to be on the safe side + newContents = (char*)realloc(newContents, newContentsSize+2); + newContents[newContentsSize] = '\n'; + newContents[newContentsSize + 1] = '\000'; + } return newContents; } @@ -1998,7 +2015,7 @@ static void addSubprogram(const char *text) subrCurrent.prepend(current); current->section = Entry::FUNCTION_SEC ; QCString subtype = text; subtype=subtype.lower().stripWhiteSpace(); - functionLine = subtype=="function"; + functionLine = (subtype.find("function") != -1); current->type += " " + subtype; current->type = current->type.stripWhiteSpace(); current->fileName = yyFileName; @@ -2109,7 +2126,7 @@ static void handleCommentBlock(const QCString &doc,bool brief) int lineNr = brief ? current->briefLine : current->docLine; while (parseCommentBlock( g_thisParser, - docBlockInBody ? last_entry : current, + docBlockInBody ? subrCurrent.first() : current, doc, // text yyFileName, // file lineNr, @@ -2228,6 +2245,7 @@ level--; static void parseMain(const char *fileName,const char *fileBuf,Entry *rt) { + char *tmpBuf = NULL; initParser(); defaultProtection = Public; @@ -2258,6 +2276,14 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt) //clock_t end=clock(); //printf("CPU time used=%f\n", ((double) (end-start))/CLOCKS_PER_SEC); } + else if (inputString[strlen(fileBuf)-1] != '\n') + { + tmpBuf = (char *)malloc(strlen(fileBuf)+2); + strcpy(tmpBuf,fileBuf); + tmpBuf[strlen(fileBuf)]= '\n'; + tmpBuf[strlen(fileBuf)+1]= '\000'; + inputString = tmpBuf; + } yyLineNr= 1 ; yyFileName = fileName; @@ -2276,12 +2302,12 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt) current = new Entry; current->lang = SrcLangExt_Fortran; - fscanYYrestart( fscanYYin ); + fortranscannerYYrestart( fortranscannerYYin ); { BEGIN( Start ); } - fscanYYlex(); + fortranscannerYYlex(); groupLeaveFile(yyFileName,yyLineNr); endScope(current_root, TRUE); // TRUE - global root @@ -2291,6 +2317,10 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt) rt->program.resize(0); delete current; current=0; moduleProcedures.clear(); + if (tmpBuf) { + free((char*)tmpBuf); + inputString=NULL; + } if (isFixedForm) { free((char*)inputString); inputString=NULL; @@ -2309,7 +2339,12 @@ void FortranLanguageScanner::parseInput(const char *fileName, QStrList & /*filesInSameTranslationUnit*/) { g_thisParser = this; + + printlex(yy_flex_debug, TRUE, __FILE__, fileName); + ::parseMain(fileName,fileBuf,root); + + printlex(yy_flex_debug, FALSE, __FILE__, fileName); } void FortranLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, @@ -2324,12 +2359,13 @@ void FortranLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, bool inlineFragment, MemberDef *memberDef, bool showLineNumbers, - Definition *searchCtx + Definition *searchCtx, + bool collectXRefs ) { ::parseFortranCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName, fileDef,startLine,endLine,inlineFragment,memberDef, - showLineNumbers,searchCtx); + showLineNumbers,searchCtx,collectXRefs); } bool FortranLanguageScanner::needsPreprocessing(const QCString &extension) @@ -2347,7 +2383,7 @@ void FortranLanguageScanner::parsePrototype(const char *text) pushBuffer(buffer); parsingPrototype = TRUE; BEGIN(Prototype); - fscanYYlex(); + fortranscannerYYlex(); parsingPrototype = FALSE; popBuffer(); } @@ -2380,7 +2416,7 @@ static void scanner_abort() #if !defined(YY_FLEX_SUBMINOR_VERSION) //---------------------------------------------------------------------------- extern "C" { // some bogus code to keep the compiler happy - void fscannerYYdummy() { yy_flex_realloc(0,0); } + void fortranscannernerYYdummy() { yy_flex_realloc(0,0); } } #endif diff --git a/src/ftextstream.h b/src/ftextstream.h index 9167ae9..d073f40 100644 --- a/src/ftextstream.h +++ b/src/ftextstream.h @@ -48,14 +48,14 @@ class FTextStream inline FTextStream &FTextStream::operator<<( char c) { - m_dev->putch(c); + if (m_dev) m_dev->putch(c); return *this; } inline FTextStream &FTextStream::operator<<( const char* s) { uint len = qstrlen( s ); - m_dev->writeBlock( s, len ); + if (m_dev) m_dev->writeBlock( s, len ); return *this; } diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp index c0ea2bd..11d3b1d 100644 --- a/src/ftvhelp.cpp +++ b/src/ftvhelp.cpp @@ -41,15 +41,15 @@ static const char navtree_script[]= -#include "navtree_js.h" +#include "navtree.js.h" ; static const char resize_script[]= -#include "resize_js.h" +#include "resize.js.h" ; static const char navtree_css[]= -#include "navtree_css.h" +#include "navtree.css.h" ; static unsigned char blank_png[352] = @@ -890,7 +890,7 @@ static void generateBriefDoc(FTextStream &t,Definition *def) def,0,brief,FALSE,FALSE,0,TRUE,TRUE); QCString relPath = relativePathToRoot(def->getOutputFileBase()); HtmlCodeGenerator htmlGen(t,relPath); - HtmlDocVisitor *visitor = new HtmlDocVisitor(t,htmlGen,def,0); + HtmlDocVisitor *visitor = new HtmlDocVisitor(t,htmlGen,def); root->accept(visitor); delete visitor; delete root; @@ -1129,7 +1129,14 @@ static bool generateJSTree(NavIndexEntryList &navIndex,FTextStream &t, if (n->children.count()>0) // write children to separate file for dynamic loading { QCString fileId = n->file; - if (dupOfParent(n)) fileId+="_dup"; + if (n->anchor) + { + fileId+="_"+n->anchor; + } + if (dupOfParent(n)) + { + fileId+="_dup"; + } QFile f(htmlOutput+"/"+fileId+".js"); if (f.open(IO_WriteOnly)) { diff --git a/src/groupdef.cpp b/src/groupdef.cpp index f9b47ae..9426c24 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -913,7 +913,7 @@ void GroupDef::writeSummaryLinks(OutputList &ol) MemberList * ml = getMemberList(lmd->type); if (ml && ml->declVisible()) { - ol.writeSummaryLink(0,ml->listTypeAsString(ml->listType()),lmd->title(lang),first); + ol.writeSummaryLink(0,MemberList::listTypeAsString(ml->listType()),lmd->title(lang),first); first=FALSE; } } diff --git a/src/header_html.h b/src/header_html.h deleted file mode 100644 index 62960d6..0000000 --- a/src/header_html.h +++ /dev/null @@ -1,54 +0,0 @@ -"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" -"<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" -"<head>\n" -"<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n" -"<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n" -"<meta name=\"generator\" content=\"Doxygen $doxygenversion\"/>\n" -"<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->\n" -"<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->\n" -"<link href=\"$relpath^tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n" -"<script type=\"text/javascript\" src=\"$relpath^jquery.js\"></script>\n" -"<script type=\"text/javascript\" src=\"$relpath^dynsections.js\"></script>\n" -"$treeview\n" -"$search\n" -"$mathjax\n" -"<link href=\"$relpath^$stylesheet\" rel=\"stylesheet\" type=\"text/css\" />\n" -"$extrastylesheet\n" -"</head>\n" -"<body>\n" -"<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n" -"\n" -"<!--BEGIN TITLEAREA-->\n" -"<div id=\"titlearea\">\n" -"<table cellspacing=\"0\" cellpadding=\"0\">\n" -" <tbody>\n" -" <tr style=\"height: 56px;\">\n" -" <!--BEGIN PROJECT_LOGO-->\n" -" <td id=\"projectlogo\"><img alt=\"Logo\" src=\"$relpath^$projectlogo\"/></td>\n" -" <!--END PROJECT_LOGO-->\n" -" <!--BEGIN PROJECT_NAME-->\n" -" <td style=\"padding-left: 0.5em;\">\n" -" <div id=\"projectname\">$projectname\n" -" <!--BEGIN PROJECT_NUMBER--> <span id=\"projectnumber\">$projectnumber</span><!--END PROJECT_NUMBER-->\n" -" </div>\n" -" <!--BEGIN PROJECT_BRIEF--><div id=\"projectbrief\">$projectbrief</div><!--END PROJECT_BRIEF-->\n" -" </td>\n" -" <!--END PROJECT_NAME-->\n" -" <!--BEGIN !PROJECT_NAME-->\n" -" <!--BEGIN PROJECT_BRIEF-->\n" -" <td style=\"padding-left: 0.5em;\">\n" -" <div id=\"projectbrief\">$projectbrief</div>\n" -" </td>\n" -" <!--END PROJECT_BRIEF-->\n" -" <!--END !PROJECT_NAME-->\n" -" <!--BEGIN DISABLE_INDEX-->\n" -" <!--BEGIN SEARCHENGINE-->\n" -" <td>$searchbox</td>\n" -" <!--END SEARCHENGINE-->\n" -" <!--END DISABLE_INDEX-->\n" -" </tr>\n" -" </tbody>\n" -"</table>\n" -"</div>\n" -"<!--END TITLEAREA-->\n" -"<!-- end header part -->\n" diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 6fe4f35..6ccbda4 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -28,6 +28,7 @@ #include "htmlgen.h" #include "parserintf.h" #include "msc.h" +#include "dia.h" #include "util.h" #include "vhdldocgen.h" #include "filedef.h" @@ -102,6 +103,8 @@ static bool mustBeOutsideParagraph(DocNode *n) case DocNode::Kind_Copy: /* <blockquote> */ case DocNode::Kind_HtmlBlockQuote: + /* \parblock */ + case DocNode::Kind_ParBlock: return TRUE; case DocNode::Kind_StyleChange: return ((DocStyleChange*)n)->style()==DocStyleChange::Preformatted || @@ -136,9 +139,9 @@ static QString htmlAttribsToString(const HtmlAttribList &attribs) //------------------------------------------------------------------------- HtmlDocVisitor::HtmlDocVisitor(FTextStream &t,CodeOutputInterface &ci, - Definition *ctx,MemberDef *md) + Definition *ctx) : DocVisitor(DocVisitor_Html), m_t(t), m_ci(ci), m_insidePre(FALSE), - m_hide(FALSE), m_ctx(ctx), m_md(md) + m_hide(FALSE), m_ctx(ctx) { if (ctx) m_langExt=ctx->getDefFileExtension(); } @@ -829,21 +832,21 @@ bool isSeparatedParagraph(DocSimpleSect *parent,DocPara *par) int i = nodes.findRef(par); if (i==-1) return FALSE; int count = parent->children().count(); - if (count>1 && i==0) + if (count>1 && i==0) // first node { if (nodes.at(i+1)->kind()==DocNode::Kind_SimpleSectSep) { return TRUE; } } - else if (count>1 && i==count-1) + else if (count>1 && i==count-1) // last node { if (nodes.at(i-1)->kind()==DocNode::Kind_SimpleSectSep) { return TRUE; } } - else if (count>2 && i>0 && i<count-1) + else if (count>2 && i>0 && i<count-1) // intermediate node { if (nodes.at(i-1)->kind()==DocNode::Kind_SimpleSectSep && nodes.at(i+1)->kind()==DocNode::Kind_SimpleSectSep) @@ -863,9 +866,58 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast) { switch (p->parent()->kind()) { + case DocNode::Kind_ParBlock: + { // hierarchy: node N -> para -> parblock -> para + // adapt return value to kind of N + DocNode::Kind kind = DocNode::Kind_Para; + if ( p->parent()->parent() && p->parent()->parent()->parent() ) + { + kind = p->parent()->parent()->parent()->kind(); + } + isFirst=isFirstChildNode((DocParBlock*)p->parent(),p); + isLast =isLastChildNode ((DocParBlock*)p->parent(),p); + t=0; + if (isFirst) + { + if (kind==DocNode::Kind_HtmlListItem || + kind==DocNode::Kind_SecRefItem) + { + t=1; + } + else if (kind==DocNode::Kind_HtmlDescData || + kind==DocNode::Kind_XRefItem || + kind==DocNode::Kind_SimpleSect) + { + t=2; + } + else if (kind==DocNode::Kind_HtmlCell || + kind==DocNode::Kind_ParamList) + { + t=5; + } + } + if (isLast) + { + if (kind==DocNode::Kind_HtmlListItem || + kind==DocNode::Kind_SecRefItem) + { + t=3; + } + else if (kind==DocNode::Kind_HtmlDescData || + kind==DocNode::Kind_XRefItem || + kind==DocNode::Kind_SimpleSect) + { + t=4; + } + else if (kind==DocNode::Kind_HtmlCell || + kind==DocNode::Kind_ParamList) + { + t=6; + } + } + break; + } case DocNode::Kind_AutoListItem: - //isFirst=TRUE; - //isLast =TRUE; isFirst=isFirstChildNode((DocAutoListItem*)p->parent(),p); isLast =isLastChildNode ((DocAutoListItem*)p->parent(),p); t=1; // not used @@ -904,12 +956,6 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast) if (isFirst) t=2; if (isLast) t=4; break; - case DocNode::Kind_HtmlCell: - isFirst=isFirstChildNode((DocHtmlCell*)p->parent(),p); - isLast =isLastChildNode ((DocHtmlCell*)p->parent(),p); - if (isFirst) t=5; - if (isLast) t=6; - break; case DocNode::Kind_SimpleSect: isFirst=isFirstChildNode((DocSimpleSect*)p->parent(),p); isLast =isLastChildNode ((DocSimpleSect*)p->parent(),p); @@ -923,6 +969,12 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast) isFirst=isLast=TRUE; } break; + case DocNode::Kind_HtmlCell: + isFirst=isFirstChildNode((DocHtmlCell*)p->parent(),p); + isLast =isLastChildNode ((DocHtmlCell*)p->parent(),p); + if (isFirst) t=5; + if (isLast) t=6; + break; default: break; } @@ -955,6 +1007,7 @@ void HtmlDocVisitor::visitPre(DocPara *p) case DocNode::Kind_XRefItem: case DocNode::Kind_Copy: case DocNode::Kind_HtmlBlockQuote: + case DocNode::Kind_ParBlock: needsTag = TRUE; break; case DocNode::Kind_Root: @@ -1028,6 +1081,7 @@ void HtmlDocVisitor::visitPost(DocPara *p) case DocNode::Kind_XRefItem: case DocNode::Kind_Copy: case DocNode::Kind_HtmlBlockQuote: + case DocNode::Kind_ParBlock: needsTag = TRUE; break; case DocNode::Kind_Root: @@ -1493,6 +1547,26 @@ void HtmlDocVisitor::visitPost(DocMscFile *df) m_t << "</div>" << endl; } +void HtmlDocVisitor::visitPre(DocDiaFile *df) +{ + if (m_hide) return; + m_t << "<div class=\"diagraph\">" << endl; + writeDiaFile(df->file(),df->relPath(),df->context()); + if (df->hasCaption()) + { + m_t << "<div class=\"caption\">" << endl; + } +} +void HtmlDocVisitor::visitPost(DocDiaFile *df) +{ + if (m_hide) return; + if (df->hasCaption()) + { + m_t << "</div>" << endl; + } + m_t << "</div>" << endl; +} + void HtmlDocVisitor::visitPre(DocLink *lnk) { if (m_hide) return; @@ -1703,6 +1777,8 @@ void HtmlDocVisitor::visitPost(DocParamList *) void HtmlDocVisitor::visitPre(DocXRefItem *x) { if (m_hide) return; + if (x->title().isEmpty()) return; + forceEndParagraph(x); bool anonymousEnum = x->file()=="@"; if (!anonymousEnum) @@ -1724,6 +1800,7 @@ void HtmlDocVisitor::visitPre(DocXRefItem *x) void HtmlDocVisitor::visitPost(DocXRefItem *x) { if (m_hide) return; + if (x->title().isEmpty()) return; m_t << "</dd></dl>" << endl; forceStartParagraph(x); } @@ -1811,6 +1888,18 @@ void HtmlDocVisitor::visitPost(DocVhdlFlow *vf) } } +void HtmlDocVisitor::visitPre(DocParBlock *) +{ + if (m_hide) return; +} + +void HtmlDocVisitor::visitPost(DocParBlock *) +{ + if (m_hide) return; +} + + + void HtmlDocVisitor::filter(const char *str) { if (str==0) return; @@ -1942,8 +2031,33 @@ void HtmlDocVisitor::writeMscFile(const QCString &fileName, } baseName.prepend("msc_"); QCString outDir = Config_getString("HTML_OUTPUT"); - writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP); - writeMscImageMapFromFile(m_t,fileName,outDir,relPath,baseName,context); + QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT"); + MscOutputFormat mscFormat = MSC_BITMAP; + if ("svg" == imgExt) + mscFormat = MSC_SVG; + writeMscGraphFromFile(fileName,outDir,baseName,mscFormat); + writeMscImageMapFromFile(m_t,fileName,outDir,relPath,baseName,context,mscFormat); +} + +void HtmlDocVisitor::writeDiaFile(const QCString &fileName, + const QCString &, + const QCString &) +{ + QCString baseName=fileName; + int i; + if ((i=baseName.findRev('/'))!=-1) // strip path + { + baseName=baseName.right(baseName.length()-i-1); + } + if ((i=baseName.find('.'))!=-1) // strip extension + { + baseName=baseName.left(i); + } + baseName.prepend("dia_"); + QCString outDir = Config_getString("HTML_OUTPUT"); + writeDiaGraphFromFile(fileName,outDir,baseName,DIA_BITMAP); + + m_t << "<img src=\"" << outDir << '/' << baseName << ".png" << "\" />" << endl; } /** Used for items found inside a paragraph, which due to XHTML restrictions diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h index 3624224..fd7c23a 100644 --- a/src/htmldocvisitor.h +++ b/src/htmldocvisitor.h @@ -33,7 +33,7 @@ class CodeOutputInterface; class HtmlDocVisitor : public DocVisitor { public: - HtmlDocVisitor(FTextStream &t,CodeOutputInterface &ci,Definition *ctx,MemberDef *md); + HtmlDocVisitor(FTextStream &t,CodeOutputInterface &ci,Definition *ctx); //-------------------------------------- // visitor functions for leaf nodes @@ -108,6 +108,8 @@ class HtmlDocVisitor : public DocVisitor void visitPost(DocDotFile *); void visitPre(DocMscFile *); void visitPost(DocMscFile *); + void visitPre(DocDiaFile *); + void visitPost(DocDiaFile *); void visitPre(DocLink *); void visitPost(DocLink *); void visitPre(DocRef *); @@ -132,6 +134,8 @@ class HtmlDocVisitor : public DocVisitor void visitPost(DocHtmlBlockQuote *); void visitPre(DocVhdlFlow *); void visitPost(DocVhdlFlow *); + void visitPre(DocParBlock *); + void visitPost(DocParBlock *); private: @@ -148,6 +152,7 @@ class HtmlDocVisitor : public DocVisitor void endLink(); void writeDotFile(const QCString &fileName,const QCString &relPath,const QCString &context); void writeMscFile(const QCString &fileName,const QCString &relPath,const QCString &context); + void writeDiaFile(const QCString &fileName,const QCString &relPath,const QCString &context); void pushEnabled(); void popEnabled(); @@ -165,7 +170,6 @@ class HtmlDocVisitor : public DocVisitor bool m_hide; QStack<bool> m_enabled; Definition *m_ctx; - MemberDef *m_md; QCString m_langExt; }; diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 6fe61fc..059d0e7 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -47,63 +47,63 @@ #define DBG_HTML(x) static const char defaultHtmlHeader[] = -#include "header_html.h" +#include "header.html.h" ; static const char defaultHtmlFooter[] = -#include "footer_html.h" +#include "footer.html.h" ; static const char defaultStyleSheet[] = -#include "doxygen_css.h" +#include "doxygen.css.h" ; static const char search_functions_script[]= -#include "search_functions_php.h" +#include "search_functions.php.h" ; static const char search_opensearch_script[]= -#include "search_opensearch_php.h" +#include "search_opensearch.php.h" ; static const char search_styleSheet[] = -#include "search_css.h" +#include "search.css.h" ; static const char search_jquery_script1[]= -#include "jquery_p1_js.h" +#include "jquery_p1.js.h" ; static const char search_jquery_script2[]= -#include "jquery_p2_js.h" +#include "jquery_p2.js.h" ; static const char search_jquery_script3[]= -#include "jquery_p3_js.h" +#include "jquery_p3.js.h" ; static const char search_jquery_script4[]= -#include "jquery_ui_js.h" +#include "jquery_ui.js.h" ; static const char search_jquery_script5[]= -#include "jquery_fx_js.h" +#include "jquery_fx.js.h" ; static const char search_jquery_script6[]= -#include "jquery_pt_js.h" +#include "jquery_pt.js.h" ; static const char svgpan_script[]= -#include "svgpan_js.h" +#include "svgpan.js.h" ; static const char dynsections_script[]= -#include "dynsections_js.h" +#include "dynsections.js.h" ; static const char extsearch_script[]= -#include "extsearch_js.h" +#include "extsearch.js.h" ; static QCString g_header; @@ -1385,8 +1385,8 @@ void HtmlCodeGenerator::_writeCodeLink(const char *className, } void HtmlCodeGenerator::writeTooltip(const char *id, const DocLinkInfo &docInfo, - const char *decl, const char *desc, - const SourceLinkInfo &defInfo, + const char *decl, const char *desc, + const SourceLinkInfo &defInfo, const SourceLinkInfo &declInfo) { m_t << "<div class=\"ttc\" id=\"" << id << "\">"; @@ -1417,7 +1417,7 @@ void HtmlCodeGenerator::writeTooltip(const char *id, const DocLinkInfo &docInfo, if (desc) { m_t << "<div class=\"ttdoc\">"; - docify(desc); + m_t << desc; // desc is already HTML escaped m_t << "</div>"; } if (!defInfo.file.isEmpty()) @@ -2748,9 +2748,9 @@ void HtmlGenerator::endParamList() t << "</dl>"; } -void HtmlGenerator::writeDoc(DocNode *n,Definition *ctx,MemberDef *md) +void HtmlGenerator::writeDoc(DocNode *n,Definition *ctx,MemberDef *) { - HtmlDocVisitor *visitor = new HtmlDocVisitor(t,m_codeGen,ctx,md); + HtmlDocVisitor *visitor = new HtmlDocVisitor(t,m_codeGen,ctx); n->accept(visitor); delete visitor; } @@ -3279,7 +3279,7 @@ void HtmlGenerator::writeExternalSearchPage() void HtmlGenerator::startConstraintList(const char *header) { t << "<div class=\"typeconstraint\">" << endl; - t << "<dl><dt><b>" << header << "</b><dt><dd>" << endl; + t << "<dl><dt><b>" << header << "</b></dt><dd>" << endl; t << "<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl; } diff --git a/src/htmlgen.h b/src/htmlgen.h index 6fb168b..366027d 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -282,7 +282,7 @@ class HtmlGenerator : public OutputGenerator //{ t << "<tr><td valign=\"top\"><em>"; } { t << "<tr><td class=\"fieldname\"><em>"; } void endDescTableTitle() - { t << "</em> </td>"; } + { t << "</em> </td>"; } void startDescTableData() //{ t << "<td>" << endl; } { t << "<td class=\"fielddoc\">" << endl; } diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp index 6b1f98b..23d5194 100644 --- a/src/htmlhelp.cpp +++ b/src/htmlhelp.cpp @@ -406,7 +406,7 @@ void HtmlHelp::initialize() s_languageDict.insert("norwegian", new QCString("0x814 Norwegian")); s_languageDict.insert("polish", new QCString("0x415 Polish")); s_languageDict.insert("portuguese", new QCString("0x816 Portuguese(Portugal)")); - s_languageDict.insert("brazil", new QCString("0x416 Portuguese(Brazil)")); + s_languageDict.insert("brazilian", new QCString("0x416 Portuguese(Brazil)")); s_languageDict.insert("russian", new QCString("0x419 Russian")); s_languageDict.insert("spanish", new QCString("0x40A Spanish(Traditional Sort)")); s_languageDict.insert("swedish", new QCString("0x41D Swedish")); @@ -433,6 +433,13 @@ void HtmlHelp::initialize() s_languageDict.insert("persian", new QCString("0x429 Persian (Iran)")); s_languageDict.insert("arabic", new QCString("0xC01 Arabic (Egypt)")); s_languageDict.insert("latvian", new QCString("0x426 Latvian")); + s_languageDict.insert("macedonian", new QCString("0x042f Macedonian (Former Yugoslav Republic of Macedonia)")); + s_languageDict.insert("armenian", new QCString("0x42b Armenian")); + //Code for Esperanto should be as shown below but the htmlhelp compiler 1.3 does not support this + // (and no newer version is available). + //So do a fallback to the default language (see getLanguageString()) + //s_languageDict.insert("esperanto", new QCString("0x48f Esperanto")); + s_languageDict.insert("serbian-cyrillic", new QCString("0xC1A Serbian (Serbia, Cyrillic)")); } diff --git a/src/increasebuffer.pl b/src/increasebuffer.pl deleted file mode 100755 index 109f9ad..0000000 --- a/src/increasebuffer.pl +++ /dev/null @@ -1,9 +0,0 @@ -# Since the internal token buffer of a generated flex file is hardcoded -# to 16K, this script is used to increase the buffer size of a flex -# generated scanner to 256K. -while (<>) -{ - s/YY_BUF_SIZE 16384/YY_BUF_SIZE 262144/g; - s/YY_READ_BUF_SIZE 8192/YY_READ_BUF_SIZE 262144/g; - print $_; -} diff --git a/src/increasebuffer.py b/src/increasebuffer.py new file mode 100755 index 0000000..e2b2d0c --- /dev/null +++ b/src/increasebuffer.py @@ -0,0 +1,7 @@ +# Since the internal token buffer of a generated flex file is hardcoded +# to 16K, this script is used to increase the buffer size of a flex +# generated scanner to 256K. +import sys +sys.stdout.write(sys.stdin.read(). + replace('YY_BUF_SIZE 16384','YY_BUF_SIZE 262144'). + replace('YY_READ_BUF_SIZE 8192','YY_READ_BUF_SIZE 262144')) diff --git a/src/index.cpp b/src/index.cpp index 5970a43..ae96c80 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -119,23 +119,28 @@ static void endIndexHierarchy(OutputList &ol,int level) class MemberIndexList : public QList<MemberDef> { public: - MemberIndexList() : QList<MemberDef>() {} + typedef MemberDef ElementType; + MemberIndexList(uint letter) : QList<MemberDef>(), m_letter(letter) {} ~MemberIndexList() {} int compareItems(QCollection::Item item1, QCollection::Item item2) { MemberDef *md1=(MemberDef *)item1; MemberDef *md2=(MemberDef *)item2; - return qstricmp(md1->name(),md2->name()); + int result = qstricmp(md1->name(),md2->name()); + if (result==0) + { + result = qstricmp(md1->qualifiedName(),md2->qualifiedName()); + } + return result; } + uint letter() const { return m_letter; } + private: + uint m_letter; }; -#define MEMBER_INDEX_ENTRIES 256 - -static MemberIndexList g_memberIndexLetterUsed[CMHL_Total][MEMBER_INDEX_ENTRIES]; -static MemberIndexList g_fileIndexLetterUsed[FMHL_Total][MEMBER_INDEX_ENTRIES]; -static MemberIndexList g_namespaceIndexLetterUsed[NMHL_Total][MEMBER_INDEX_ENTRIES]; - -//static bool g_classIndexLetterUsed[CHL_Total][256]; +static LetterToIndexMap<MemberIndexList> g_memberIndexLetterUsed[CMHL_Total]; +static LetterToIndexMap<MemberIndexList> g_fileIndexLetterUsed[FMHL_Total]; +static LetterToIndexMap<MemberIndexList> g_namespaceIndexLetterUsed[NMHL_Total]; const int maxItemsBeforeQuickIndex = MAX_ITEMS_BEFORE_QUICK_INDEX; @@ -409,38 +414,11 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part, } } -//---------------------------------------------------------------------------- - -static bool classHasVisibleChildren(ClassDef *cd) -{ - BaseClassList *bcl; - - if (cd->getLanguage()==SrcLangExt_VHDL) // reverse baseClass/subClass relation - { - if (cd->baseClasses()==0) return FALSE; - bcl=cd->baseClasses(); - } - else - { - if (cd->subClasses()==0) return FALSE; - bcl=cd->subClasses(); - } - - BaseClassListIterator bcli(*bcl); - for ( ; bcli.current() ; ++bcli) - { - if (bcli.current()->classDef->isVisibleInHierarchy()) - { - return TRUE; - } - } - return FALSE; -} //---------------------------------------------------------------------------- /*! Generates HTML Help tree of classes */ -static void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level,FTVHelp* ftv,bool addToIndex) +static void writeClassTree(OutputList &ol,const BaseClassList *bcl,bool hideSuper,int level,FTVHelp* ftv,bool addToIndex) { if (bcl==0) return; BaseClassListIterator bcli(*bcl); @@ -557,14 +535,6 @@ static void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int //---------------------------------------------------------------------------- -static bool classVisibleInIndex(ClassDef *cd) -{ - static bool allExternals = Config_getBool("ALLEXTERNALS"); - return (allExternals && cd->isLinkable()) || cd->isLinkableInProject(); -} - -//---------------------------------------------------------------------------- - static bool dirHasVisibleChildren(DirDef *dd) { if (dd->hasDocumentation()) return TRUE; @@ -1404,39 +1374,6 @@ void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalO } } -static bool containsVisibleChild(NamespaceDef *nd,bool includeClasses) -{ - if (nd->getNamespaceSDict()) - { - NamespaceSDict::Iterator cnli(*nd->getNamespaceSDict()); - NamespaceDef *cnd; - for (cnli.toFirst();(cnd=cnli.current());++cnli) - { - if (cnd->isLinkable() && cnd->localName().find('@')==-1) - { - return TRUE; - } - else if (containsVisibleChild(cnd,includeClasses)) - { - return TRUE; - } - } - } - if (includeClasses && nd->getClassSDict()) - { - ClassSDict::Iterator cli(*nd->getClassSDict()); - ClassDef *cd; - for (;(cd=cli.current());++cli) - { - if (cd->isLinkableInProject() && cd->templateMaster()==0) - { - return TRUE; - } - } - } - return FALSE; -} - static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv, bool rootOnly,bool showClasses,bool addToIndex) { @@ -1450,7 +1387,7 @@ static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv, (!rootOnly || nd->getOuterScope()==Doxygen::globalScope)) { - bool hasChildren = containsVisibleChild(nd,showClasses); + bool hasChildren = namespaceHasVisibleChild(nd,showClasses); bool isLinkable = nd->isLinkableInProject(); QCString ref; @@ -1690,21 +1627,39 @@ static void writeAnnotatedClassList(OutputList &ol) ol.endIndexList(); } -static QCString letterToLabel(char startLetter) +static QCString letterToLabel(uint startLetter) { - QCString s(5); - if (isId(startLetter)) + char s[10]; + if (startLetter>0x20 && startLetter<=0x7f) // printable ASCII character { - s[0]=startLetter; s[1]=0; + s[0]=(char)startLetter; + s[1]=0; } else { const char hex[]="0123456789abcdef"; - s[0]='0'; - s[1]='x'; - s[2]=hex[startLetter>>4]; - s[3]=hex[startLetter&0xF]; - s[4]=0; + int i=0; + s[i++]='0'; + s[i++]='x'; + if (startLetter>(1<<24)) // 4 byte character + { + s[i++]=hex[(startLetter>>28)&0xf]; + s[i++]=hex[(startLetter>>24)&0xf]; + } + if (startLetter>(1<<16)) // 3 byte character + { + s[i++]=hex[(startLetter>>20)&0xf]; + s[i++]=hex[(startLetter>>16)&0xf]; + } + if (startLetter>(1<<8)) // 2 byte character + { + s[i++]=hex[(startLetter>>12)&0xf]; + s[i++]=hex[(startLetter>>8)&0xf]; + } + // one byte character + s[i++]=hex[(startLetter>>4)&0xf]; + s[i++]=hex[(startLetter>>0)&0xf]; + s[i++]=0; } return s; } @@ -1714,35 +1669,40 @@ static QCString letterToLabel(char startLetter) /** Special class list where sorting takes IGNORE_PREFIX into account. */ class PrefixIgnoreClassList : public ClassList { -public: - virtual int compareItems(QCollection::Item item1, QCollection::Item item2) - { - ClassDef *c1=(ClassDef *)item1; - ClassDef *c2=(ClassDef *)item2; + public: + typedef ClassDef ElementType; + PrefixIgnoreClassList(uint letter) : m_letter(letter) {} + virtual int compareItems(QCollection::Item item1, QCollection::Item item2) + { + ClassDef *c1=(ClassDef *)item1; + ClassDef *c2=(ClassDef *)item2; - QCString n1 = c1->className(); - QCString n2 = c2->className(); - return qstricmp (n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2)); - } + QCString n1 = c1->className(); + QCString n2 = c2->className(); + return qstricmp (n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2)); + } + uint letter() const { return m_letter; } + private: + uint m_letter; }; /** Class representing a cell in the alphabetical class index. */ class AlphaIndexTableCell { public: - AlphaIndexTableCell(int row,int col,uchar letter,ClassDef *cd) : + AlphaIndexTableCell(int row,int col,uint letter,ClassDef *cd) : m_letter(letter), m_class(cd), m_row(row), m_col(col) { //printf("AlphaIndexTableCell(%d,%d,%c,%s)\n",row,col,letter!=0 ? letter: '-', // cd!=(ClassDef*)0x8 ? cd->name().data() : "<null>"); } ClassDef *classDef() const { return m_class; } - uchar letter() const { return m_letter; } + uint letter() const { return m_letter; } int row() const { return m_row; } int column() const { return m_col; } private: - uchar m_letter; + uint m_letter; ClassDef *m_class; int m_row; int m_col; @@ -1770,12 +1730,31 @@ class AlphaIndexTableColumns : public QList<AlphaIndexTableRows> AlphaIndexTableColumns() { setAutoDelete(TRUE); } }; +class UsedIndexLetters : public SIntDict<uint> +{ + public: + UsedIndexLetters() : SIntDict<uint>(257) { setAutoDelete(TRUE); } + int compareItems( QCollection::Item item1, QCollection::Item item2) + { + int *p1=(int *)item1; + int *p2=(int *)item2; + return *p1 - *p2; // subtracting is done by int not uint. + } + void add(uint letter) + { + uint *v = find(letter); + if (v==0) + { + append(letter,new uint(letter)); + } + } +}; + // write an alphabetical index of all class with a header for each letter static void writeAlphabeticalClassList(OutputList &ol) { // What starting letters are used - bool indexLetterUsed[256]; - memset (indexLetterUsed, 0, sizeof (indexLetterUsed)); + UsedIndexLetters indexLettersUsed; // first count the number of headers ClassSDict::Iterator cli(*Doxygen::classSDict); @@ -1791,24 +1770,25 @@ static void writeAlphabeticalClassList(OutputList &ol) int index = getPrefixIndex(cd->className()); //printf("name=%s index=%d %d\n",cd->className().data(),index,cd->protection()); - startLetter=toupper(cd->className().at(index))&0xFF; - indexLetterUsed[startLetter] = true; + startLetter=getUtf8CodeToUpper(cd->className(),index); + indexLettersUsed.add(startLetter); } } + indexLettersUsed.sort(); // write quick link index (row of letters) QCString alphaLinks = "<div class=\"qindex\">"; - int l; - for (l=0; l<256; l++) - { - if (indexLetterUsed[l]) - { - if (headerItems) alphaLinks += " | "; - headerItems++; - alphaLinks += (QCString)"<a class=\"qindex\" href=\"#letter_" + - (char)l + "\">" + - (char)l + "</a>"; - } + SIntDict<uint>::Iterator it(indexLettersUsed); + uint *pLetter; + for (it.toFirst();(pLetter=it.current());++it) + { + if (headerItems) alphaLinks += " | "; + headerItems++; + QCString li = letterToLabel(*pLetter); + QCString ls = QString(QChar(*pLetter)).utf8(); + alphaLinks += (QCString)"<a class=\"qindex\" href=\"#letter_" + + li + "\">" + + ls + "</a>"; } alphaLinks += "</div>\n"; ol.writeString(alphaLinks); @@ -1825,7 +1805,7 @@ static void writeAlphabeticalClassList(OutputList &ol) // headerItems,totalItems,columns,rows,itemsInLastRow); // Keep a list of classes for each starting letter - PrefixIgnoreClassList classesByLetter[256]; + LetterToIndexMap<PrefixIgnoreClassList> classesByLetter; AlphaIndexTableColumns tableColumns; // fill the columns with the class list (row elements in each column, @@ -1841,16 +1821,20 @@ static void writeAlphabeticalClassList(OutputList &ol) if (cd->isLinkableInProject() && cd->templateMaster()==0) { int index = getPrefixIndex(cd->className()); - startLetter=toupper(cd->className().at(index))&0xFF; + startLetter=getUtf8Code(cd->className(),index); // Do some sorting again, since the classes are sorted by name with // prefix, which should be ignored really. if (cd->getLanguage()==SrcLangExt_VHDL) { if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS )// no architecture - classesByLetter[startLetter].inSort(cd); + { + classesByLetter.append(startLetter,cd); + } } else - classesByLetter[startLetter].inSort(cd); + { + classesByLetter.append(startLetter,cd); + } } } @@ -1871,25 +1855,29 @@ static void writeAlphabeticalClassList(OutputList &ol) AlphaIndexTableRows *tableRows = new AlphaIndexTableRows; tableColumns.append(tableRows); int col=0,row=0,maxRows=0; - for (l=0; l<256; l++) - { - if (classesByLetter[l].count()>0) + PrefixIgnoreClassList *cl; + SIntDict<PrefixIgnoreClassList>::Iterator lit(classesByLetter); + for (lit.toFirst();(cl=lit.current());++lit) + { + uint l = cl->letter(); + // add special header cell + tableRows->append(new AlphaIndexTableCell(row,col,l,(ClassDef*)0x8)); + row++; + tableRows->append(new AlphaIndexTableCell(row,col,0,(ClassDef*)0x8)); + row++; + ClassListIterator cit(*cl); + cit.toFirst(); + ClassDef *cd = cit.current(); + ++cit; + tableRows->append(new AlphaIndexTableCell(row,col,0,cd)); + row++; + NEXT_ROW(); + for (;(cd=cit.current()); ++cit) { - // add special header cell - tableRows->append(new AlphaIndexTableCell(row,col,(uchar)l,(ClassDef*)0x8)); + // add normal cell + tableRows->append(new AlphaIndexTableCell(row,col,0,cd)); row++; - tableRows->append(new AlphaIndexTableCell(row,col,0,(ClassDef*)0x8)); - row++; - tableRows->append(new AlphaIndexTableCell(row,col,0,classesByLetter[l].at(0))); - row++; NEXT_ROW(); - for (i=1; i<(int)classesByLetter[l].count(); i++) - { - // add normal cell - tableRows->append(new AlphaIndexTableCell(row,col,0,classesByLetter[l].at(i))); - row++; - NEXT_ROW(); - } } } @@ -1936,7 +1924,7 @@ static void writeAlphabeticalClassList(OutputList &ol) ol.writeString("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">" "<tr>" "<td><div class=\"ah\">  "); - ol.writeString(s); + ol.writeString(QString(QChar(cell->letter())).utf8()); ol.writeString( "  </div>" "</td>" "</tr>" @@ -2164,14 +2152,9 @@ static void writeNamespaceLinkForMember(OutputList &ol,MemberDef *md,const char } static void writeMemberList(OutputList &ol,bool useSections,int page, - MemberIndexList memberLists[MEMBER_INDEX_ENTRIES], + const LetterToIndexMap<MemberIndexList> &memberLists, DefinitionIntf::DefType type) { - int pi; - // page==-1 => write all member indices to one page (used when total members is small) - // page!=-1 => write all member for this page only (used when total member is large) - int startIndex = page==-1 ? 0 : page; - int endIndex = page==-1 ? MEMBER_INDEX_ENTRIES-1 : page; ASSERT((int)type<3); typedef void (*writeLinkForMember_t)(OutputList &ol,MemberDef *md,const char *separator, @@ -2189,10 +2172,16 @@ static void writeMemberList(OutputList &ol,bool useSections,int page, bool first=TRUE; bool firstSection=TRUE; bool firstItem=TRUE; - for (pi=startIndex; pi<=endIndex; pi++) // page==-1 => pi=[0..127], page!=-1 => pi=page + MemberIndexList *ml; + SIntDict<MemberIndexList>::Iterator it(memberLists); + for (it.toFirst();(ml=it.current());++it) { - MemberIndexList *ml = &memberLists[pi]; - if (ml->count()==0) continue; + if (page!=-1) + { + ml = memberLists[page]; + it.toLast(); + } + if (ml==0 || ml->count()==0) continue; ml->sort(); QListIterator<MemberDef> mli(*ml); MemberDef *md; @@ -2211,10 +2200,8 @@ static void writeMemberList(OutputList &ol,bool useSections,int page, { if (!firstItem) ol.endItemListItem(); if (!firstSection) ol.endItemList(); - char cl[2]; - cl[0] = tolower(name.at(startIndex)); - cl[1] = 0; - QCString cs = letterToLabel(cl[0]); + QCString cs = letterToLabel(ml->letter()); + QCString cl = QString(QChar(ml->letter())).utf8(); QCString anchor=(QCString)"index_"+cs; QCString title=(QCString)"- "+cl+" -"; ol.startSection(anchor,title,SectionInfo::Subsection); @@ -2260,15 +2247,11 @@ static void writeMemberList(OutputList &ol,bool useSections,int page, void initClassMemberIndices() { - int i=0; int j=0; for (j=0;j<CMHL_Total;j++) { documentedClassMembers[j]=0; - for (i=0;i<MEMBER_INDEX_ENTRIES;i++) - { - g_memberIndexLetterUsed[j][i].clear(); - } + g_memberIndexLetterUsed[j].clear(); } } @@ -2286,8 +2269,7 @@ void addClassMemberNameToIndex(MemberDef *md) { QCString n = md->name(); int index = getPrefixIndex(n); - uchar charCode = (uchar)n.at(index); - uint letter = charCode<128 ? tolower(charCode) : charCode; + uint letter = getUtf8CodeToLower(n,index); if (!n.isEmpty()) { bool isFriendToHide = hideFriendCompounds && @@ -2296,48 +2278,48 @@ void addClassMemberNameToIndex(MemberDef *md) QCString(md->typeString())=="friend union"); if (!(md->isFriend() && isFriendToHide)) { - g_memberIndexLetterUsed[CMHL_All][letter].append(md); + g_memberIndexLetterUsed[CMHL_All].append(letter,md); documentedClassMembers[CMHL_All]++; } if (md->isFunction() || md->isSlot() || md->isSignal()) { - g_memberIndexLetterUsed[CMHL_Functions][letter].append(md); + g_memberIndexLetterUsed[CMHL_Functions].append(letter,md); documentedClassMembers[CMHL_Functions]++; } else if (md->isVariable()) { - g_memberIndexLetterUsed[CMHL_Variables][letter].append(md); + g_memberIndexLetterUsed[CMHL_Variables].append(letter,md); documentedClassMembers[CMHL_Variables]++; } else if (md->isTypedef()) { - g_memberIndexLetterUsed[CMHL_Typedefs][letter].append(md); + g_memberIndexLetterUsed[CMHL_Typedefs].append(letter,md); documentedClassMembers[CMHL_Typedefs]++; } else if (md->isEnumerate()) { - g_memberIndexLetterUsed[CMHL_Enums][letter].append(md); + g_memberIndexLetterUsed[CMHL_Enums].append(letter,md); documentedClassMembers[CMHL_Enums]++; } else if (md->isEnumValue()) { - g_memberIndexLetterUsed[CMHL_EnumValues][letter].append(md); + g_memberIndexLetterUsed[CMHL_EnumValues].append(letter,md); documentedClassMembers[CMHL_EnumValues]++; } else if (md->isProperty()) { - g_memberIndexLetterUsed[CMHL_Properties][letter].append(md); + g_memberIndexLetterUsed[CMHL_Properties].append(letter,md); documentedClassMembers[CMHL_Properties]++; } else if (md->isEvent()) { - g_memberIndexLetterUsed[CMHL_Events][letter].append(md); + g_memberIndexLetterUsed[CMHL_Events].append(letter,md); documentedClassMembers[CMHL_Events]++; } else if (md->isRelated() || md->isForeign() || (md->isFriend() && !isFriendToHide)) { - g_memberIndexLetterUsed[CMHL_Related][letter].append(md); + g_memberIndexLetterUsed[CMHL_Related].append(letter,md); documentedClassMembers[CMHL_Related]++; } } @@ -2348,15 +2330,11 @@ void addClassMemberNameToIndex(MemberDef *md) void initNamespaceMemberIndices() { - int i=0; int j=0; for (j=0;j<NMHL_Total;j++) { documentedNamespaceMembers[j]=0; - for (i=0;i<MEMBER_INDEX_ENTRIES;i++) - { - g_namespaceIndexLetterUsed[j][i].clear(); - } + g_namespaceIndexLetterUsed[j].clear(); } } @@ -2367,36 +2345,35 @@ void addNamespaceMemberNameToIndex(MemberDef *md) { QCString n = md->name(); int index = getPrefixIndex(n); - uchar charCode = (uchar)n.at(index); - uint letter = charCode<128 ? tolower(charCode) : charCode; + uint letter = getUtf8CodeToLower(n,index); if (!n.isEmpty()) { - g_namespaceIndexLetterUsed[NMHL_All][letter].append(md); + g_namespaceIndexLetterUsed[NMHL_All].append(letter,md); documentedNamespaceMembers[NMHL_All]++; if (md->isFunction()) { - g_namespaceIndexLetterUsed[NMHL_Functions][letter].append(md); + g_namespaceIndexLetterUsed[NMHL_Functions].append(letter,md); documentedNamespaceMembers[NMHL_Functions]++; } else if (md->isVariable()) { - g_namespaceIndexLetterUsed[NMHL_Variables][letter].append(md); + g_namespaceIndexLetterUsed[NMHL_Variables].append(letter,md); documentedNamespaceMembers[NMHL_Variables]++; } else if (md->isTypedef()) { - g_namespaceIndexLetterUsed[NMHL_Typedefs][letter].append(md); + g_namespaceIndexLetterUsed[NMHL_Typedefs].append(letter,md); documentedNamespaceMembers[NMHL_Typedefs]++; } else if (md->isEnumerate()) { - g_namespaceIndexLetterUsed[NMHL_Enums][letter].append(md); + g_namespaceIndexLetterUsed[NMHL_Enums].append(letter,md); documentedNamespaceMembers[NMHL_Enums]++; } else if (md->isEnumValue()) { - g_namespaceIndexLetterUsed[NMHL_EnumValues][letter].append(md); + g_namespaceIndexLetterUsed[NMHL_EnumValues].append(letter,md); documentedNamespaceMembers[NMHL_EnumValues]++; } } @@ -2407,15 +2384,11 @@ void addNamespaceMemberNameToIndex(MemberDef *md) void initFileMemberIndices() { - int i=0; int j=0; for (j=0;j<NMHL_Total;j++) { documentedFileMembers[j]=0; - for (i=0;i<MEMBER_INDEX_ENTRIES;i++) - { - g_fileIndexLetterUsed[j][i].clear(); - } + g_fileIndexLetterUsed[j].clear(); } } @@ -2426,41 +2399,40 @@ void addFileMemberNameToIndex(MemberDef *md) { QCString n = md->name(); int index = getPrefixIndex(n); - uchar charCode = (uchar)n.at(index); - uint letter = charCode<128 ? tolower(charCode) : charCode; + uint letter = getUtf8CodeToLower(n,index); if (!n.isEmpty()) { - g_fileIndexLetterUsed[FMHL_All][letter].append(md); + g_fileIndexLetterUsed[FMHL_All].append(letter,md); documentedFileMembers[FMHL_All]++; if (md->isFunction()) { - g_fileIndexLetterUsed[FMHL_Functions][letter].append(md); + g_fileIndexLetterUsed[FMHL_Functions].append(letter,md); documentedFileMembers[FMHL_Functions]++; } else if (md->isVariable()) { - g_fileIndexLetterUsed[FMHL_Variables][letter].append(md); + g_fileIndexLetterUsed[FMHL_Variables].append(letter,md); documentedFileMembers[FMHL_Variables]++; } else if (md->isTypedef()) { - g_fileIndexLetterUsed[FMHL_Typedefs][letter].append(md); + g_fileIndexLetterUsed[FMHL_Typedefs].append(letter,md); documentedFileMembers[FMHL_Typedefs]++; } else if (md->isEnumerate()) { - g_fileIndexLetterUsed[FMHL_Enums][letter].append(md); + g_fileIndexLetterUsed[FMHL_Enums].append(letter,md); documentedFileMembers[FMHL_Enums]++; } else if (md->isEnumValue()) { - g_fileIndexLetterUsed[FMHL_EnumValues][letter].append(md); + g_fileIndexLetterUsed[FMHL_EnumValues].append(letter,md); documentedFileMembers[FMHL_EnumValues]++; } else if (md->isDefine()) { - g_fileIndexLetterUsed[FMHL_Defines][letter].append(md); + g_fileIndexLetterUsed[FMHL_Defines].append(letter,md); documentedFileMembers[FMHL_Defines]++; } } @@ -2470,31 +2442,30 @@ void addFileMemberNameToIndex(MemberDef *md) //---------------------------------------------------------------------------- static void writeQuickMemberIndex(OutputList &ol, - MemberIndexList charUsed[MEMBER_INDEX_ENTRIES],int page, + const LetterToIndexMap<MemberIndexList> &charUsed,uint page, QCString fullName,bool multiPage) { bool first=TRUE; - int i; startQuickIndexList(ol,TRUE); - for (i=33;i<127;i++) - { - char is[2];is[0]=(char)i;is[1]='\0'; - QCString ci = letterToLabel((char)i); - if (charUsed[i].count()>0) - { - QCString anchor; - QCString extension=Doxygen::htmlFileExtension; - if (!multiPage) - anchor="#index_"; - else if (first) - anchor=fullName+extension+"#index_"; - else - anchor=fullName+QCString().sprintf("_0x%02x",i)+extension+"#index_"; - startQuickIndexItem(ol,anchor+ci,i==page,TRUE,first); - ol.writeString(is); - endQuickIndexItem(ol); - first=FALSE; - } + SIntDict<MemberIndexList>::Iterator it(charUsed); + MemberIndexList *ml; + for (it.toFirst();(ml=it.current());++it) + { + uint i = ml->letter(); + QCString is = letterToLabel(i); + QCString ci = QString(QChar(i)).utf8(); + QCString anchor; + QCString extension=Doxygen::htmlFileExtension; + if (!multiPage) + anchor="#index_"; + else if (first) + anchor=fullName+extension+"#index_"; + else + anchor=fullName+"_"+letterToLabel(i)+extension+"#index_"; + startQuickIndexItem(ol,anchor+ci,i==page,TRUE,first); + ol.writeString(is); + endQuickIndexItem(ol); + first=FALSE; } endQuickIndexList(ol); } @@ -2534,15 +2505,13 @@ static const CmhlInfo *getCmhlInfo(int hl) static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight hl) { if (documentedClassMembers[hl]==0) return; - + static bool disableIndex = Config_getBool("DISABLE_INDEX"); bool multiPageIndex=FALSE; - int numPages=1; if (documentedClassMembers[hl]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX) { multiPageIndex=TRUE; - numPages=127; } ol.pushGeneratorState(); @@ -2557,99 +2526,96 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h if (addToIndex) { Doxygen::indexList->addContentsItem(multiPageIndex,getCmhlInfo(hl)->title,0, - getCmhlInfo(hl)->fname,0,multiPageIndex,TRUE); + getCmhlInfo(hl)->fname,0,multiPageIndex,TRUE); if (multiPageIndex) Doxygen::indexList->incContentsDepth(); } - int page; bool first=TRUE; - for (page=0;page<numPages;page++) + SIntDict<MemberIndexList>::Iterator it(g_memberIndexLetterUsed[hl]); + MemberIndexList *ml; + for (it.toFirst();(ml=it.current());++it) { - if (!multiPageIndex || g_memberIndexLetterUsed[hl][page].count()>0) - { - QCString fileName = getCmhlInfo(hl)->fname; - if (multiPageIndex) - { - if (!first) - { - fileName+=QCString().sprintf("_0x%02x",page); - } - char cs[2]; - cs[0]=page; - cs[1]=0; - if (addToIndex) - { - Doxygen::indexList->addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE); - } + uint page = ml->letter(); + QCString fileName = getCmhlInfo(hl)->fname; + if (multiPageIndex) + { + if (!first) + { + fileName+="_"+letterToLabel(page); } - bool quickIndex = documentedClassMembers[hl]>maxItemsBeforeQuickIndex; - - ol.startFile(fileName+extension,0,title); - ol.startQuickIndices(); - if (!disableIndex) + QCString cs = QString(QChar(page)).utf8(); + if (addToIndex) { - ol.writeQuickLinks(TRUE,HLI_Functions,0); - startQuickIndexList(ol); - - // index item for global member list - startQuickIndexItem(ol, - getCmhlInfo(0)->fname+Doxygen::htmlFileExtension,hl==CMHL_All,TRUE,first); - ol.writeString(fixSpaces(getCmhlInfo(0)->title)); - endQuickIndexItem(ol); - - int i; - // index items per category member lists - for (i=1;i<CMHL_Total;i++) - { - if (documentedClassMembers[i]>0) - { - startQuickIndexItem(ol,getCmhlInfo(i)->fname+Doxygen::htmlFileExtension,hl==i,TRUE,first); - ol.writeString(fixSpaces(getCmhlInfo(i)->title)); - //printf("multiPageIndex=%d first=%d fileName=%s file=%s title=%s\n", - // multiPageIndex,first,fileName.data(),getCmhlInfo(i)->fname,getCmhlInfo(i)->title.data()); - endQuickIndexItem(ol); - } - } + Doxygen::indexList->addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE); + } + } + bool quickIndex = documentedClassMembers[hl]>maxItemsBeforeQuickIndex; + + ol.startFile(fileName+extension,0,title); + ol.startQuickIndices(); + if (!disableIndex) + { + ol.writeQuickLinks(TRUE,HLI_Functions,0); + startQuickIndexList(ol); - endQuickIndexList(ol); + // index item for global member list + startQuickIndexItem(ol, + getCmhlInfo(0)->fname+Doxygen::htmlFileExtension,hl==CMHL_All,TRUE,first); + ol.writeString(fixSpaces(getCmhlInfo(0)->title)); + endQuickIndexItem(ol); - // quick alphabetical index - if (quickIndex) + int i; + // index items per category member lists + for (i=1;i<CMHL_Total;i++) + { + if (documentedClassMembers[i]>0) { - writeQuickMemberIndex(ol,g_memberIndexLetterUsed[hl],page, - getCmhlInfo(hl)->fname,multiPageIndex); + startQuickIndexItem(ol,getCmhlInfo(i)->fname+Doxygen::htmlFileExtension,hl==i,TRUE,first); + ol.writeString(fixSpaces(getCmhlInfo(i)->title)); + //printf("multiPageIndex=%d first=%d fileName=%s file=%s title=%s\n", + // multiPageIndex,first,fileName.data(),getCmhlInfo(i)->fname,getCmhlInfo(i)->title.data()); + endQuickIndexItem(ol); } } - ol.endQuickIndices(); - ol.writeSplitBar(fileName); - ol.writeSearchInfo(); - ol.startContents(); + endQuickIndexList(ol); - if (hl==CMHL_All) - { - ol.startTextBlock(); - ol.parseText(lne ? lne->intro() : theTranslator->trCompoundMembersDescription(Config_getBool("EXTRACT_ALL"))); - ol.endTextBlock(); - } - else + // quick alphabetical index + if (quickIndex) { - // hack to work around a mozilla bug, which refuses to switch to - // normal lists otherwise - ol.writeString(" "); + writeQuickMemberIndex(ol,g_memberIndexLetterUsed[hl],page, + getCmhlInfo(hl)->fname,multiPageIndex); } - //ol.newParagraph(); // FIXME:PARA - writeMemberList(ol,quickIndex, - multiPageIndex?page:-1, - g_memberIndexLetterUsed[hl], - Definition::TypeClass); - endFile(ol); - first=FALSE; } + ol.endQuickIndices(); + ol.writeSplitBar(fileName); + ol.writeSearchInfo(); + + ol.startContents(); + + if (hl==CMHL_All) + { + ol.startTextBlock(); + ol.parseText(lne ? lne->intro() : theTranslator->trCompoundMembersDescription(Config_getBool("EXTRACT_ALL"))); + ol.endTextBlock(); + } + else + { + // hack to work around a mozilla bug, which refuses to switch to + // normal lists otherwise + ol.writeString(" "); + } + + writeMemberList(ol,quickIndex, + multiPageIndex?page:-1, + g_memberIndexLetterUsed[hl], + Definition::TypeClass); + endFile(ol); + first=FALSE; } if (multiPageIndex && addToIndex) Doxygen::indexList->decContentsDepth(); - + ol.popGeneratorState(); } @@ -2716,11 +2682,9 @@ static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl) static bool disableIndex = Config_getBool("DISABLE_INDEX"); bool multiPageIndex=FALSE; - int numPages=1; if (documentedFileMembers[hl]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX) { multiPageIndex=TRUE; - numPages=127; } ol.pushGeneratorState(); @@ -2734,94 +2698,90 @@ static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl) if (addToIndex) { Doxygen::indexList->addContentsItem(multiPageIndex,getFmhlInfo(hl)->title,0, - getFmhlInfo(hl)->fname,0,multiPageIndex,TRUE); + getFmhlInfo(hl)->fname,0,multiPageIndex,TRUE); if (multiPageIndex) Doxygen::indexList->incContentsDepth(); } - int page; bool first=TRUE; - for (page=0;page<numPages;page++) + SIntDict<MemberIndexList>::Iterator it(g_fileIndexLetterUsed[hl]); + MemberIndexList *ml; + for (it.toFirst();(ml=it.current());++it) { - if (!multiPageIndex || g_fileIndexLetterUsed[hl][page].count()>0) + uint page = ml->letter(); + QCString fileName = getFmhlInfo(hl)->fname; + if (multiPageIndex) { - QCString fileName = getFmhlInfo(hl)->fname; - if (multiPageIndex) + if (!first) { - if (!first) - { - fileName+=QCString().sprintf("_0x%02x",page); - } - char cs[2]; - cs[0]=page; - cs[1]=0; - if (addToIndex) - { - Doxygen::indexList->addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE); - } + fileName+="_"+letterToLabel(page); } - bool quickIndex = documentedFileMembers[hl]>maxItemsBeforeQuickIndex; - - ol.startFile(fileName+extension,0,title); - ol.startQuickIndices(); - if (!disableIndex) + QCString cs = QString(QChar(page)).utf8(); + if (addToIndex) { - ol.writeQuickLinks(TRUE,HLI_Globals,0); - startQuickIndexList(ol); - - // index item for all file member lists - startQuickIndexItem(ol, - getFmhlInfo(0)->fname+Doxygen::htmlFileExtension,hl==FMHL_All,TRUE,first); - ol.writeString(fixSpaces(getFmhlInfo(0)->title)); - endQuickIndexItem(ol); - - int i; - // index items for per category member lists - for (i=1;i<FMHL_Total;i++) - { - if (documentedFileMembers[i]>0) - { - startQuickIndexItem(ol, - getFmhlInfo(i)->fname+Doxygen::htmlFileExtension,hl==i,TRUE,first); - ol.writeString(fixSpaces(getFmhlInfo(i)->title)); - endQuickIndexItem(ol); - } - } + Doxygen::indexList->addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE); + } + } + bool quickIndex = documentedFileMembers[hl]>maxItemsBeforeQuickIndex; + + ol.startFile(fileName+extension,0,title); + ol.startQuickIndices(); + if (!disableIndex) + { + ol.writeQuickLinks(TRUE,HLI_Globals,0); + startQuickIndexList(ol); - endQuickIndexList(ol); + // index item for all file member lists + startQuickIndexItem(ol, + getFmhlInfo(0)->fname+Doxygen::htmlFileExtension,hl==FMHL_All,TRUE,first); + ol.writeString(fixSpaces(getFmhlInfo(0)->title)); + endQuickIndexItem(ol); - if (quickIndex) + int i; + // index items for per category member lists + for (i=1;i<FMHL_Total;i++) + { + if (documentedFileMembers[i]>0) { - writeQuickMemberIndex(ol,g_fileIndexLetterUsed[hl],page, - getFmhlInfo(hl)->fname,multiPageIndex); + startQuickIndexItem(ol, + getFmhlInfo(i)->fname+Doxygen::htmlFileExtension,hl==i,TRUE,first); + ol.writeString(fixSpaces(getFmhlInfo(i)->title)); + endQuickIndexItem(ol); } } - ol.endQuickIndices(); - ol.writeSplitBar(fileName); - ol.writeSearchInfo(); - ol.startContents(); + endQuickIndexList(ol); - if (hl==FMHL_All) - { - ol.startTextBlock(); - ol.parseText(lne ? lne->intro() : theTranslator->trFileMembersDescription(Config_getBool("EXTRACT_ALL"))); - ol.endTextBlock(); - } - else + if (quickIndex) { - // hack to work around a mozilla bug, which refuses to switch to - // normal lists otherwise - ol.writeString(" "); + writeQuickMemberIndex(ol,g_fileIndexLetterUsed[hl],page, + getFmhlInfo(hl)->fname,multiPageIndex); } - //ol.newParagraph(); // FIXME:PARA - //writeFileMemberList(ol,quickIndex,hl,page); - writeMemberList(ol,quickIndex, - multiPageIndex?page:-1, - g_fileIndexLetterUsed[hl], - Definition::TypeFile); - endFile(ol); - first=FALSE; } + ol.endQuickIndices(); + ol.writeSplitBar(fileName); + ol.writeSearchInfo(); + + ol.startContents(); + + if (hl==FMHL_All) + { + ol.startTextBlock(); + ol.parseText(lne ? lne->intro() : theTranslator->trFileMembersDescription(Config_getBool("EXTRACT_ALL"))); + ol.endTextBlock(); + } + else + { + // hack to work around a mozilla bug, which refuses to switch to + // normal lists otherwise + ol.writeString(" "); + } + + writeMemberList(ol,quickIndex, + multiPageIndex?page:-1, + g_fileIndexLetterUsed[hl], + Definition::TypeFile); + endFile(ol); + first=FALSE; } if (multiPageIndex && addToIndex) Doxygen::indexList->decContentsDepth(); ol.popGeneratorState(); @@ -2890,11 +2850,9 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol, bool multiPageIndex=FALSE; - int numPages=1; if (documentedNamespaceMembers[hl]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX) { multiPageIndex=TRUE; - numPages=127; } ol.pushGeneratorState(); @@ -2908,95 +2866,90 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol, if (addToIndex) { Doxygen::indexList->addContentsItem(multiPageIndex,getNmhlInfo(hl)->title,0, - getNmhlInfo(hl)->fname,0,multiPageIndex,TRUE); + getNmhlInfo(hl)->fname,0,multiPageIndex,TRUE); if (multiPageIndex) Doxygen::indexList->incContentsDepth(); } - int page; bool first=TRUE; - for (page=0;page<numPages;page++) + SIntDict<MemberIndexList>::Iterator it(g_namespaceIndexLetterUsed[hl]); + MemberIndexList *ml; + for (it.toFirst();(ml=it.current());++it) { - if (!multiPageIndex || g_namespaceIndexLetterUsed[hl][page].count()>0) + uint page = ml->letter(); + QCString fileName = getNmhlInfo(hl)->fname; + if (multiPageIndex) { - QCString fileName = getNmhlInfo(hl)->fname; - if (multiPageIndex) + if (!first) { - if (!first) - { - fileName+=QCString().sprintf("_0x%02x",page); - } - char cs[2]; - cs[0]=page; - cs[1]=0; - if (addToIndex) - { - Doxygen::indexList->addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE); - } + fileName+="_"+letterToLabel(page); } - bool quickIndex = documentedNamespaceMembers[hl]>maxItemsBeforeQuickIndex; - - ol.startFile(fileName+extension,0,title); - ol.startQuickIndices(); - if (!disableIndex) + QCString cs = QString(QChar(page)).utf8(); + if (addToIndex) { - ol.writeQuickLinks(TRUE,HLI_NamespaceMembers,0); - startQuickIndexList(ol); - - // index item for all namespace member lists - startQuickIndexItem(ol, - getNmhlInfo(0)->fname+Doxygen::htmlFileExtension,hl==NMHL_All,TRUE,first); - ol.writeString(fixSpaces(getNmhlInfo(0)->title)); - endQuickIndexItem(ol); - - int i; - // index items per category member lists - for (i=1;i<NMHL_Total;i++) - { - if (documentedNamespaceMembers[i]>0) - { - startQuickIndexItem(ol, - getNmhlInfo(i)->fname+Doxygen::htmlFileExtension,hl==i,TRUE,first); - ol.writeString(fixSpaces(getNmhlInfo(i)->title)); - endQuickIndexItem(ol); - } - } + Doxygen::indexList->addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE); + } + } + bool quickIndex = documentedNamespaceMembers[hl]>maxItemsBeforeQuickIndex; - endQuickIndexList(ol); + ol.startFile(fileName+extension,0,title); + ol.startQuickIndices(); + if (!disableIndex) + { + ol.writeQuickLinks(TRUE,HLI_NamespaceMembers,0); + startQuickIndexList(ol); + + // index item for all namespace member lists + startQuickIndexItem(ol, + getNmhlInfo(0)->fname+Doxygen::htmlFileExtension,hl==NMHL_All,TRUE,first); + ol.writeString(fixSpaces(getNmhlInfo(0)->title)); + endQuickIndexItem(ol); - if (quickIndex) + int i; + // index items per category member lists + for (i=1;i<NMHL_Total;i++) + { + if (documentedNamespaceMembers[i]>0) { - writeQuickMemberIndex(ol,g_namespaceIndexLetterUsed[hl],page, - getNmhlInfo(hl)->fname,multiPageIndex); + startQuickIndexItem(ol, + getNmhlInfo(i)->fname+Doxygen::htmlFileExtension,hl==i,TRUE,first); + ol.writeString(fixSpaces(getNmhlInfo(i)->title)); + endQuickIndexItem(ol); } - } - ol.endQuickIndices(); - ol.writeSplitBar(fileName); - ol.writeSearchInfo(); - ol.startContents(); + endQuickIndexList(ol); - if (hl==NMHL_All) - { - ol.startTextBlock(); - ol.parseText(lne ? lne->intro() : theTranslator->trNamespaceMemberDescription(Config_getBool("EXTRACT_ALL"))); - ol.endTextBlock(); - } - else + if (quickIndex) { - // hack to work around a mozilla bug, which refuses to switch to - // normal lists otherwise - ol.writeString(" "); + writeQuickMemberIndex(ol,g_namespaceIndexLetterUsed[hl],page, + getNmhlInfo(hl)->fname,multiPageIndex); } - //ol.newParagraph(); // FIXME:PARA - - //writeNamespaceMemberList(ol,quickIndex,hl,page); - writeMemberList(ol,quickIndex, - multiPageIndex?page:-1, - g_namespaceIndexLetterUsed[hl], - Definition::TypeNamespace); - endFile(ol); + + } + ol.endQuickIndices(); + ol.writeSplitBar(fileName); + ol.writeSearchInfo(); + + ol.startContents(); + + if (hl==NMHL_All) + { + ol.startTextBlock(); + ol.parseText(lne ? lne->intro() : theTranslator->trNamespaceMemberDescription(Config_getBool("EXTRACT_ALL"))); + ol.endTextBlock(); } + else + { + // hack to work around a mozilla bug, which refuses to switch to + // normal lists otherwise + ol.writeString(" "); + } + + writeMemberList(ol,quickIndex, + multiPageIndex?page:-1, + g_namespaceIndexLetterUsed[hl], + Definition::TypeNamespace); + endFile(ol); } if (multiPageIndex && addToIndex) Doxygen::indexList->decContentsDepth(); ol.popGeneratorState(); @@ -3095,167 +3048,6 @@ static void writeExampleIndex(OutputList &ol) //---------------------------------------------------------------------------- -template<typename T> -bool writeMemberNavIndex(FTextStream &t, - int indent, - int n, - int documentedMembers[], - MemberIndexList indexLetterUsed[][MEMBER_INDEX_ENTRIES], - const T *(*getInfo)(int), - bool &first - ) - -{ - bool found=FALSE; - QCString indentStr; - indentStr.fill(' ',indent*2); - // index items per category member lists - int i; - for (i=0;i<n;i++) - { - bool hasIndex = documentedMembers[i]>0; - bool quickIndex = documentedMembers[i]>maxItemsBeforeQuickIndex; - bool multiIndexPage = documentedMembers[i]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX; - if (hasIndex) - { - // terminate previous entry - if (!first) t << "," << endl; - first = FALSE; - - // start entry - if (!found) - { - t << "[" << endl; - } - found = TRUE; - - t << indentStr << " [ "; - t << "\"" << fixSpaces(getInfo(i)->title) << "\", "; - t << "\"" << getInfo(i)->fname << Doxygen::htmlFileExtension << "\", "; - bool firstPage=TRUE; - if (quickIndex) - { - t << "[ " << endl; - int j; - for (j=33;j<127;j++) - { - if (indexLetterUsed[i][j].count()>0) - { - if (!firstPage) t << "," << endl; - QCString fullName = getInfo(i)->fname; - QCString extension = Doxygen::htmlFileExtension; - QCString anchor; - if (firstPage || !multiIndexPage) - anchor=fullName+extension+"#index_"; - else - anchor=fullName+QCString().sprintf("_0x%02x",j)+extension+"#index_"; - char is[2];is[0]=(char)j;is[1]='\0'; - QCString ci = letterToLabel((char)j); - t << indentStr << " [ "; - t << "\"" << is << "\", "; - t << "\"" << anchor << ci << "\", null ]"; - firstPage=FALSE; - } - } - t << endl << indentStr << " ] ]"; - } - else - { - t << "null" << " ]"; - } - } - } - return found; -} - -//---------------------------------------------------------------------------- - -#if 0 -static bool writeFullNavIndex(FTextStream &t, LayoutNavEntry *root,int indent,bool &first) -{ - static struct NavEntryCountMap - { - LayoutNavEntry::Kind kind; - bool hasItems; - } navEntryCountMap[] = - { - { LayoutNavEntry::MainPage, TRUE }, - { LayoutNavEntry::Pages, indexedPages>0 }, - { LayoutNavEntry::Modules, documentedGroups>0 }, - { LayoutNavEntry::Namespaces, documentedNamespaces>0 }, - { LayoutNavEntry::NamespaceList, documentedNamespaces>0 }, - { LayoutNavEntry::NamespaceMembers, documentedNamespaceMembers[NMHL_All]>0 }, - { LayoutNavEntry::Classes, annotatedClasses>0 }, - { LayoutNavEntry::ClassList, annotatedClasses>0 }, - { LayoutNavEntry::ClassIndex, annotatedClasses>0 }, - { LayoutNavEntry::ClassHierarchy, hierarchyClasses>0 }, - { LayoutNavEntry::ClassMembers, documentedClassMembers[CMHL_All]>0 }, - { LayoutNavEntry::Files, documentedFiles>0 }, - { LayoutNavEntry::FileList, documentedFiles>0 }, - { LayoutNavEntry::FileGlobals, documentedFileMembers[FMHL_All]>0 }, - //{ LayoutNavEntry::Dirs, documentedDirs>0 }, - { LayoutNavEntry::Examples, Doxygen::exampleSDict->count()>0 } - }; - - QCString indentStr; - indentStr.fill(' ',indent*2); - bool found=FALSE; - if (root->children().count()>0) - { - QListIterator<LayoutNavEntry> li(root->children()); - LayoutNavEntry *entry; - for (li.toFirst();(entry=li.current());++li) - { - if (navEntryCountMap[entry->kind()].hasItems && entry->visible()) - { - // terminate previous entry - if (!first) t << "," << endl; - first = FALSE; - - // start entry - if (!found) - { - t << "[" << endl; - } - found = TRUE; - - bool emptySection=TRUE; - t << indentStr << " [ "; - t << "\"" << fixSpaces(entry->title()) << "\", "; - t << "\"" << entry->baseFile() << Doxygen::htmlFileExtension << "\", "; - - // write children (if any) - bool firstChild=TRUE; - if (entry->kind()==LayoutNavEntry::ClassMembers) - { - emptySection = !writeMemberNavIndex(t,indent+1,CMHL_Total,documentedClassMembers,g_memberIndexLetterUsed,&getCmhlInfo,firstChild); - } - else if (entry->kind()==LayoutNavEntry::NamespaceMembers) - { - emptySection = !writeMemberNavIndex(t,indent+1,NMHL_Total,documentedNamespaceMembers,g_namespaceIndexLetterUsed,&getNmhlInfo,firstChild); - } - else if (entry->kind()==LayoutNavEntry::FileGlobals) - { - emptySection = !writeMemberNavIndex(t,indent+1,FMHL_Total,documentedFileMembers,g_fileIndexLetterUsed,&getFmhlInfo,firstChild); - } - else - { - emptySection = !writeFullNavIndex(t,entry,indent+1,firstChild); - } - // end entry - if (emptySection) // entry without children - t << "null ]"; - else // entry with children - t << endl << indentStr << " ] ]"; - } - } - } - return found; -} -#endif - -//---------------------------------------------------------------------------- - static void countRelatedPages(int &docPages,int &indexPages) { docPages=indexPages=0; @@ -3440,15 +3232,21 @@ void writeGraphInfo(OutputList &ol) ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); generateGraphLegend(Config_getString("HTML_OUTPUT")); + + bool &stripCommentsStateRef = Config_getBool("STRIP_CODE_COMMENTS"); + bool oldStripCommentsState = stripCommentsStateRef; + bool &createSubdirs = Config_getBool("CREATE_SUBDIRS"); + bool oldCreateSubdirs = createSubdirs; + // temporarily disable the stripping of comments for our own code example! + stripCommentsStateRef = FALSE; + // temporarily disable create subdirs for linking to our example + createSubdirs = FALSE; + startFile(ol,"graph_legend",0,theTranslator->trLegendTitle().data()); startTitle(ol,0); ol.parseText(theTranslator->trLegendTitle()); endTitle(ol,0,0); ol.startContents(); - bool &stripCommentsStateRef = Config_getBool("STRIP_CODE_COMMENTS"); - bool oldStripCommentsState = stripCommentsStateRef; - // temporarily disable the stripping of comments for our own code example! - stripCommentsStateRef = FALSE; QCString legendDocs = theTranslator->trLegendDocs(); int s = legendDocs.find("<center>"); int e = legendDocs.find("</center>"); @@ -3459,7 +3257,11 @@ void writeGraphInfo(OutputList &ol) } FileDef fd("","graph_legend"); ol.generateDoc("graph_legend",1,&fd,0,legendDocs,FALSE,FALSE); + + // restore config settings stripCommentsStateRef = oldStripCommentsState; + createSubdirs = oldCreateSubdirs; + endFile(ol); ol.popGeneratorState(); } @@ -3692,7 +3494,6 @@ static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* if (gd->getSubGroups()->count()>0) { startIndexHierarchy(ol,level+1); - if (Config_getBool("SORT_GROUP_NAMES")) gd->sortSubGroups(); QListIterator<GroupDef> gli(*gd->getSubGroups()); GroupDef *subgd = 0; for (gli.toFirst();(subgd=gli.current());++gli) @@ -3726,10 +3527,6 @@ static void writeGroupHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex) ol.disable(OutputGenerator::Html); } startIndexHierarchy(ol,0); - if (Config_getBool("SORT_GROUP_NAMES")) - { - Doxygen::groupSDict->sort(); - } GroupSDict::Iterator gli(*Doxygen::groupSDict); GroupDef *gd; for (gli.toFirst();(gd=gli.current());++gli) diff --git a/src/index_xsd.h b/src/index_xsd.h deleted file mode 100644 index 2f5d0c5..0000000 --- a/src/index_xsd.h +++ /dev/null @@ -1,66 +0,0 @@ -"<?xml version='1.0' encoding='utf-8' ?>\n" -"<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n" -" <xsd:element name=\"doxygenindex\" type=\"DoxygenType\"/>\n" -"\n" -" <xsd:complexType name=\"DoxygenType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"compound\" type=\"CompoundType\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"version\" type=\"xsd:string\" use=\"required\"/>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"CompoundType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"name\" type=\"xsd:string\"/>\n" -" <xsd:element name=\"member\" type=\"MemberType\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"refid\" type=\"xsd:string\" use=\"required\"/>\n" -" <xsd:attribute name=\"kind\" type=\"CompoundKind\" use=\"required\"/>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"MemberType\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"name\" type=\"xsd:string\"/>\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"refid\" type=\"xsd:string\" use=\"required\"/>\n" -" <xsd:attribute name=\"kind\" type=\"MemberKind\" use=\"required\"/>\n" -" </xsd:complexType>\n" -" \n" -" <xsd:simpleType name=\"CompoundKind\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"class\"/>\n" -" <xsd:enumeration value=\"struct\"/>\n" -" <xsd:enumeration value=\"union\"/>\n" -" <xsd:enumeration value=\"interface\"/>\n" -" <xsd:enumeration value=\"protocol\"/>\n" -" <xsd:enumeration value=\"category\"/>\n" -" <xsd:enumeration value=\"exception\"/>\n" -" <xsd:enumeration value=\"file\"/>\n" -" <xsd:enumeration value=\"namespace\"/>\n" -" <xsd:enumeration value=\"group\"/>\n" -" <xsd:enumeration value=\"page\"/>\n" -" <xsd:enumeration value=\"example\"/>\n" -" <xsd:enumeration value=\"dir\"/>\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -" <xsd:simpleType name=\"MemberKind\">\n" -" <xsd:restriction base=\"xsd:string\">\n" -" <xsd:enumeration value=\"define\"/>\n" -" <xsd:enumeration value=\"property\"/>\n" -" <xsd:enumeration value=\"event\"/>\n" -" <xsd:enumeration value=\"variable\"/>\n" -" <xsd:enumeration value=\"typedef\"/>\n" -" <xsd:enumeration value=\"enum\"/>\n" -" <xsd:enumeration value=\"enumvalue\"/>\n" -" <xsd:enumeration value=\"function\"/>\n" -" <xsd:enumeration value=\"signal\"/>\n" -" <xsd:enumeration value=\"prototype\"/>\n" -" <xsd:enumeration value=\"friend\"/>\n" -" <xsd:enumeration value=\"dcop\"/>\n" -" <xsd:enumeration value=\"slot\"/>\n" -" </xsd:restriction>\n" -" </xsd:simpleType>\n" -"\n" -"</xsd:schema>\n" -"\n" diff --git a/src/jquery_fx_js.h b/src/jquery_fx_js.h deleted file mode 100644 index 7fd7f2e..0000000 --- a/src/jquery_fx_js.h +++ /dev/null @@ -1 +0,0 @@ -"(function(c){var a=c.scrollTo=function(f,e,d){c(window).scrollTo(f,e,d)};a.defaults={axis:\"xy\",duration:parseFloat(c.fn.jquery)>=1.3?0:1};a.window=function(d){return c(window)._scrollable()};c.fn._scrollable=function(){return this.map(function(){var e=this,d=!e.nodeName||c.inArray(e.nodeName.toLowerCase(),[\"iframe\",\"#document\",\"html\",\"body\"])!=-1;if(!d){return e}var f=(e.contentWindow||e).document||e.ownerDocument||e;return c.browser.safari||f.compatMode==\"BackCompat\"?f.body:f.documentElement})};c.fn.scrollTo=function(f,e,d){if(typeof e==\"object\"){d=e;e=0}if(typeof d==\"function\"){d={onAfter:d}}if(f==\"max\"){f=9000000000}d=c.extend({},a.defaults,d);e=e||d.speed||d.duration;d.queue=d.queue&&d.axis.length>1;if(d.queue){e/=2}d.offset=b(d.offset);d.over=b(d.over);return this._scrollable().each(function(){var l=this,j=c(l),k=f,i,g={},m=j.is(\"html,body\");switch(typeof k){case\"number\":case\"string\":if(/^([+-]=)?\\d+(\\.\\d+)?(px|%)?$/.test(k)){k=b(k);break}k=c(k,this);case\"object\":if(k.is||k.style){i=(k=c(k)).offset()}}c.each(d.axis.split(\"\"),function(q,r){var s=r==\"x\"?\"Left\":\"Top\",u=s.toLowerCase(),p=\"scroll\"+s,o=l[p],n=a.max(l,r);if(i){g[p]=i[u]+(m?0:o-j.offset()[u]);if(d.margin){g[p]-=parseInt(k.css(\"margin\"+s))||0;g[p]-=parseInt(k.css(\"border\"+s+\"Width\"))||0}g[p]+=d.offset[u]||0;if(d.over[u]){g[p]+=k[r==\"x\"?\"width\":\"height\"]()*d.over[u]}}else{var t=k[u];g[p]=t.slice&&t.slice(-1)==\"%\"?parseFloat(t)/100*n:t}if(/^\\d+$/.test(g[p])){g[p]=g[p]<=0?0:Math.min(g[p],n)}if(!q&&d.queue){if(o!=g[p]){h(d.onAfterFirst)}delete g[p]}});h(d.onAfter);function h(n){j.animate(g,e,d.easing,n&&function(){n.call(this,f,d)})}}).end()};a.max=function(j,i){var h=i==\"x\"?\"Width\":\"Height\",e=\"scroll\"+h;if(!c(j).is(\"html,body\")){return j[e]-c(j)[h.toLowerCase()]()}var g=\"client\"+h,f=j.ownerDocument.documentElement,d=j.ownerDocument.body;return Math.max(f[e],d[e])-Math.min(f[g],d[g])};function b(d){return typeof d==\"object\"?d:{top:d,left:d}}})(jQuery);\n" diff --git a/src/jquery_p1_js.h b/src/jquery_p1_js.h deleted file mode 100644 index 1effb45..0000000 --- a/src/jquery_p1_js.h +++ /dev/null @@ -1,18 +0,0 @@ -"/*!\n" -" * jQuery JavaScript Library v1.7.1\n" -" * http://jquery.com/\n" -" *\n" -" * Copyright 2011, John Resig\n" -" * Dual licensed under the MIT or GPL Version 2 licenses.\n" -" * http://jquery.org/license\n" -" *\n" -" * Includes Sizzle.js\n" -" * http://sizzlejs.com/\n" -" * Copyright 2011, The Dojo Foundation\n" -" * Released under the MIT, BSD, and GPL Licenses.\n" -" *\n" -" * Date: Mon Nov 21 21:11:03 2011 -0500\n" -" */\n" -"(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,bM=/\\S/,bI=/^\\s+/,bE=/\\s+$/,bA=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,bN=/^[\\],:{}\\s]*$/,bW=/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,bJ=/(?:^|:|,)(?:\\s*\\[)+/g,by=/(webkit)[ \\/]([\\w.]+)/,bR=/(opera)(?:.*version)?[ \\/]([\\w.]+)/,bQ=/(msie) ([\\w.]+)/,bS=/(mozilla)(?:.*? rv:([\\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+\"\").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0===\"body\"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0===\"string\"){if(b0.charAt(0)===\"<\"&&b0.charAt(b0.length-1)===\">\"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:\"\",jquery:\"1.7.1\",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3===\"find\"){b2.selector=this.selector+(this.selector?\" \":\"\")+b0}else{if(b3){b2.selector=this.selector+\".\"+b3+\"(\"+b0+\")\"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),\"slice\",bK.call(arguments).join(\",\"))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5===\"boolean\"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!==\"object\"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b4<b3;b4++){if((b9=arguments[b4])!=null){for(b2 in b9){b0=b5[b2];b1=b9[b2];if(b5===b1){continue}if(b8&&b1&&(bF.isPlainObject(b1)||(b6=bF.isArray(b1)))){if(b6){b6=false;b7=b0&&bF.isArray(b0)?b0:[]}else{b7=b0&&bF.isPlainObject(b0)?b0:{}}b5[b2]=bF.extend(b8,b7,b1)}else{if(b1!==L){b5[b2]=b1}}}}}return b5};bF.extend({noConflict:function(b0){if(bb.$===bF){bb.$=bH}if(b0&&bb.jQuery===bF){bb.jQuery=bU}return bF},isReady:false,readyWait:1,holdReady:function(b0){if(b0){bF.readyWait++}else{bF.ready(true)}},ready:function(b0){if((b0===true&&!--bF.readyWait)||(b0!==true&&!bF.isReady)){if(!av.body){return setTimeout(bF.ready,1)}bF.isReady=true;if(b0!==true&&--bF.readyWait>0){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger(\"ready\").off(\"ready\")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks(\"once memory\");if(av.readyState===\"complete\"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener(\"DOMContentLoaded\",e,false);bb.addEventListener(\"load\",bF.ready,false)}else{if(av.attachEvent){av.attachEvent(\"onreadystatechange\",e);bb.attachEvent(\"onload\",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)===\"function\"},isArray:Array.isArray||function(b0){return bF.type(b0)===\"array\"},isWindow:function(b0){return b0&&typeof b0===\"object\"&&\"setInterval\" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||\"object\"},isPlainObject:function(b2){if(!b2||bF.type(b2)!==\"object\"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,\"constructor\")&&!bG.call(b2.constructor.prototype,\"isPrototypeOf\")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!==\"string\"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,\"@\").replace(bP,\"]\").replace(bJ,\"\"))){return(new Function(\"return \"+b0))()}bF.error(\"Invalid JSON: \"+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,\"text/xml\")}else{b0=new ActiveXObject(\"Microsoft.XMLDOM\");b0.async=\"false\";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName(\"parsererror\").length){bF.error(\"Invalid XML: \"+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb[\"eval\"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,\"ms-\").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b4<b5;){if(b6.apply(b3[b4++],b2)===false){break}}}}else{if(b0){for(b1 in b3){if(b6.call(b3[b1],b1,b3[b1])===false){break}}}else{for(;b4<b5;){if(b6.call(b3[b4],b4,b3[b4++])===false){break}}}}return b3},trim:bO?function(b0){return b0==null?\"\":bO.call(b0)}:function(b0){return b0==null?\"\":b0.toString().replace(bI,\"\").replace(bE,\"\")},makeArray:function(b3,b1){var b0=b1||[];if(b3!=null){var b2=bF.type(b3);if(b3.length==null||b2===\"string\"||b2===\"function\"||b2===\"regexp\"||bF.isWindow(b3)){bz.call(b0,b3)}else{bF.merge(b0,b3)}}return b0},inArray:function(b2,b3,b1){var b0;if(b3){if(bv){return bv.call(b3,b2,b1)}b0=b3.length;b1=b1?b1<0?Math.max(0,b0+b1):b1:0;for(;b1<b0;b1++){if(b1 in b3&&b3[b1]===b2){return b1}}}return -1},merge:function(b4,b2){var b3=b4.length,b1=0;if(typeof b2.length===\"number\"){for(var b0=b2.length;b1<b0;b1++){b4[b3++]=b2[b1]}}else{while(b2[b1]!==L){b4[b3++]=b2[b1++]}}b4.length=b3;return b4},grep:function(b1,b6,b0){var b2=[],b5;b0=!!b0;for(var b3=0,b4=b1.length;b3<b4;b3++){b5=!!b6(b1[b3],b3);if(b0!==b5){b2.push(b1[b3])}}return b2},map:function(b0,b7,b8){var b5,b6,b4=[],b2=0,b1=b0.length,b3=b0 instanceof bF||b1!==L&&typeof b1===\"number\"&&((b1>0&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b2<b1;b2++){b5=b7(b0[b2],b2,b8);if(b5!=null){b4[b4.length]=b5}}}else{for(b6 in b0){b5=b7(b0[b6],b6,b8);if(b5!=null){b4[b4.length]=b5}}}return b4.concat.apply([],b4)},guid:1,proxy:function(b4,b3){if(typeof b3===\"string\"){var b2=b4[b3];b3=b4;b4=b2}if(!bF.isFunction(b4)){return L}var b0=bK.call(arguments,2),b1=function(){return b4.apply(b3,b0.concat(bK.call(arguments)))};b1.guid=b4.guid=b4.guid||b1.guid||bF.guid++;return b1},access:function(b0,b8,b6,b2,b5,b7){var b1=b0.length;if(typeof b8===\"object\"){for(var b3 in b8){bF.access(b0,b3,b8[b3],b2,b5,b6)}return b0}if(b6!==L){b2=!b7&&b2&&bF.isFunction(b6);for(var b4=0;b4<b1;b4++){b5(b0[b4],b8,b2?b6.call(b0[b4],b4,b5(b0[b4],b8)):b6,b7)}return b0}return b1?b5(b0[0],b8):L},now:function(){return(new Date()).getTime()},uaMatch:function(b1){b1=b1.toLowerCase();var b0=by.exec(b1)||bR.exec(b1)||bQ.exec(b1)||b1.indexOf(\"compatible\")<0&&bS.exec(b1)||[];return{browser:b0[1]||\"\",version:b0[2]||\"0\"}},sub:function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bF.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bF&&!(b4 instanceof b0)){b4=b0(b4)}return bF.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(av);return b0},browser:{}});bF.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"),function(b1,b0){bx[\"[object \"+b0+\"]\"]=b0.toLowerCase()});bV=bF.uaMatch(bX);if(bV.browser){bF.browser[bV.browser]=true;bF.browser.version=bV.version}if(bF.browser.webkit){bF.browser.safari=true}if(bM.test(\"\\xA0\")){bI=/^[\\s\\xA0]+/;bE=/[\\s\\xA0]+$/}bD=bF(av);if(av.addEventListener){e=function(){av.removeEventListener(\"DOMContentLoaded\",e,false);bF.ready()}}else{if(av.attachEvent){e=function(){if(av.readyState===\"complete\"){av.detachEvent(\"onreadystatechange\",e);bF.ready()}}}}function bw(){if(bF.isReady){return}try{av.documentElement.doScroll(\"left\")}catch(b0){setTimeout(bw,1);return}bF.ready()}return bF})();var a2={};function X(e){var bv=a2[e]={},bw,bx;e=e.split(/\\s+/);for(bw=0,bx=e.length;bw<bx;bw++){bv[e[bw]]=true}return bv}b.Callbacks=function(bw){bw=bw?(a2[bw]||X(bw)):{};var bB=[],bC=[],bx,by,bv,bz,bA,bE=function(bF){var bG,bJ,bI,bH,bK;for(bG=0,bJ=bF.length;bG<bJ;bG++){bI=bF[bG];bH=b.type(bI);if(bH===\"array\"){bE(bI)}else{if(bH===\"function\"){if(!bw.unique||!bD.has(bI)){bB.push(bI)}}}}},e=function(bG,bF){bF=bF||[];bx=!bw.memory||[bG,bF];by=true;bA=bv||0;bv=0;bz=bB.length;for(;bB&&bA<bz;bA++){if(bB[bA].apply(bG,bF)===false&&bw.stopOnFalse){bx=true;break}}by=false;if(bB){if(!bw.once){if(bC&&bC.length){bx=bC.shift();bD.fireWith(bx[0],bx[1])}}else{if(bx===true){bD.disable()}else{bB=[]}}}},bD={add:function(){if(bB){var bF=bB.length;bE(arguments);if(by){bz=bB.length}else{if(bx&&bx!==true){bv=bF;e(bx[0],bx[1])}}}return this},remove:function(){if(bB){var bF=arguments,bH=0,bI=bF.length;for(;bH<bI;bH++){for(var bG=0;bG<bB.length;bG++){if(bF[bH]===bB[bG]){if(by){if(bG<=bz){bz--;if(bG<=bA){bA--}}}bB.splice(bG--,1);if(bw.unique){break}}}}}return this},has:function(bG){if(bB){var bF=0,bH=bB.length;for(;bF<bH;bF++){if(bG===bB[bF]){return true}}}return false},empty:function(){bB=[];return this},disable:function(){bB=bC=bx=L;return this},disabled:function(){return !bB},lock:function(){bC=L;if(!bx||bx===true){bD.disable()}return this},locked:function(){return !bC},fireWith:function(bG,bF){if(bC){if(by){if(!bw.once){bC.push([bG,bF])}}else{if(!(bw.once&&bx)){e(bG,bF)}}}return this},fire:function(){bD.fireWith(this,arguments);return this},fired:function(){return !!bx}};return bD};var aJ=[].slice;b.extend({Deferred:function(by){var bx=b.Callbacks(\"once memory\"),bw=b.Callbacks(\"once memory\"),bv=b.Callbacks(\"memory\"),e=\"pending\",bA={resolve:bx,reject:bw,notify:bv},bC={done:bx.add,fail:bw.add,progress:bv.add,state:function(){return e},isResolved:bx.fired,isRejected:bw.fired,then:function(bE,bD,bF){bB.done(bE).fail(bD).progress(bF);return this},always:function(){bB.done.apply(bB,arguments).fail.apply(bB,arguments);return this},pipe:function(bF,bE,bD){return b.Deferred(function(bG){b.each({done:[bF,\"resolve\"],fail:[bE,\"reject\"],progress:[bD,\"notify\"]},function(bI,bL){var bH=bL[0],bK=bL[1],bJ;if(b.isFunction(bH)){bB[bI](function(){bJ=bH.apply(this,arguments);if(bJ&&b.isFunction(bJ.promise)){bJ.promise().then(bG.resolve,bG.reject,bG.notify)}else{bG[bK+\"With\"](this===bB?bG:this,[bJ])}})}else{bB[bI](bG[bK])}})}).promise()},promise:function(bE){if(bE==null){bE=bC}else{for(var bD in bC){bE[bD]=bC[bD]}}return bE}},bB=bC.promise({}),bz;for(bz in bA){bB[bz]=bA[bz].fire;bB[bz+\"With\"]=bA[bz].fireWith}bB.done(function(){e=\"resolved\"},bw.disable,bv.lock).fail(function(){e=\"rejected\"},bx.disable,bv.lock);if(by){by.call(bB,bB)}return bB},when:function(bA){var bx=aJ.call(arguments,0),bv=0,e=bx.length,bB=new Array(e),bw=e,by=e,bC=e<=1&&bA&&b.isFunction(bA.promise)?bA:b.Deferred(),bE=bC.promise();function bD(bF){return function(bG){bx[bF]=arguments.length>1?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv<e;bv++){if(bx[bv]&&bx[bv].promise&&b.isFunction(bx[bv].promise)){bx[bv].promise().then(bD(bv),bC.reject,bz(bv))\n" -"}else{--bw}}if(!bw){bC.resolveWith(bC,bx)}}else{if(bC!==bA){bC.resolveWith(bC,e?[bA]:[])}}return bE}});b.support=(function(){var bJ,bI,bF,bG,bx,bE,bA,bD,bz,bK,bB,by,bw,bv=av.createElement(\"div\"),bH=av.documentElement;bv.setAttribute(\"className\",\"t\");bv.innerHTML=\" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>\";bI=bv.getElementsByTagName(\"*\");bF=bv.getElementsByTagName(\"a\")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement(\"select\");bx=bG.appendChild(av.createElement(\"option\"));bE=bv.getElementsByTagName(\"input\")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName(\"tbody\").length,htmlSerialize:!!bv.getElementsByTagName(\"link\").length,style:/top/.test(bF.getAttribute(\"style\")),hrefNormalized:(bF.getAttribute(\"href\")===\"/a\"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value===\"on\"),optSelected:bx.selected,getSetAttribute:bv.className!==\"t\",enctype:!!av.createElement(\"form\").enctype,html5Clone:av.createElement(\"nav\").cloneNode(true).outerHTML!==\"<:nav></:nav>\",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent(\"onclick\",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent(\"onclick\")}bE=av.createElement(\"input\");bE.value=\"t\";bE.setAttribute(\"type\",\"radio\");bJ.radioValue=bE.value===\"t\";bE.setAttribute(\"checked\",\"checked\");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML=\"\";if(bb.getComputedStyle){bA=av.createElement(\"div\");bA.style.width=\"0\";bA.style.marginRight=\"0\";bv.style.width=\"2px\";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB=\"on\"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,\"return;\");bw=(typeof bv[bB]===\"function\")}bJ[by+\"Bubbles\"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName(\"body\")[0];if(!bQ){return}bL=1;bS=\"position:absolute;top:0;left:0;width:1px;height:1px;margin:0;\";bR=\"visibility:hidden;border:0;\";e=\"style='\"+bS+\"border:5px solid #000;padding:0;'\";bP=\"<div \"+e+\"><div></div></div><table \"+e+\" cellpadding='0' cellspacing='0'><tr><td></td></tr></table>\";bM=av.createElement(\"div\");bM.style.cssText=bR+\"width:0;height:0;position:static;top:0;margin-top:\"+bL+\"px\";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement(\"div\");bM.appendChild(bv);bv.innerHTML=\"<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>\";bz=bv.getElementsByTagName(\"td\");bw=(bz[0].offsetHeight===0);bz[0].style.display=\"\";bz[1].style.display=\"none\";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML=\"\";bv.style.width=bv.style.paddingLeft=\"1px\";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!==\"undefined\"){bv.style.display=\"inline\";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display=\"\";bv.innerHTML=\"<div style='width:4px;'></div>\";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position=\"fixed\";bV.style.top=\"20px\";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top=\"\";bU.style.overflow=\"hidden\";bU.style.position=\"relative\";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\\{.*\\}|\\[.*\\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:\"jQuery\"+(b.fn.jquery+Math.random()).replace(/\\D/g,\"\"),noData:{embed:true,object:\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv===\"string\",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv===\"events\";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv===\"object\"||typeof bv===\"function\"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(\" \")}}}for(bA=0,bz=bv.length;bA<bz;bA++){delete bB[bv[bA]]}if(!(by?S:b.isEmptyObject)(bB)){return}}}if(!by){delete e[bw].data;if(!S(e[bw])){return}}if(b.support.deleteExpando||!e.setInterval){delete e[bw]}else{e[bw]=null}if(bD){if(b.support.deleteExpando){delete bx[bC]}else{if(bx.removeAttribute){bx.removeAttribute(bC)}else{bx[bC]=null}}}},_data:function(bv,e,bw){return b.data(bv,e,bw,true)},acceptData:function(bv){if(bv.nodeName){var e=b.noData[bv.nodeName.toLowerCase()];if(e){return !(e===true||bv.getAttribute(\"classid\")!==e)}}return true}});b.fn.extend({data:function(by,bA){var bB,e,bw,bz=null;if(typeof by===\"undefined\"){if(this.length){bz=b.data(this[0]);if(this[0].nodeType===1&&!b._data(this[0],\"parsedAttrs\")){e=this[0].attributes;for(var bx=0,bv=e.length;bx<bv;bx++){bw=e[bx].name;if(bw.indexOf(\"data-\")===0){bw=b.camelCase(bw.substring(5));a5(this[0],bw,bz[bw])}}b._data(this[0],\"parsedAttrs\",true)}}return bz}else{if(typeof by===\"object\"){return this.each(function(){b.data(this,by)})}}bB=by.split(\".\");bB[1]=bB[1]?\".\"+bB[1]:\"\";if(bA===L){bz=this.triggerHandler(\"getData\"+bB[1]+\"!\",[bB[0]]);if(bz===L&&this.length){bz=b.data(this[0],by);bz=a5(this[0],by,bz)}return bz===L&&bB[1]?this.data(bB[0]):bz}else{return this.each(function(){var bC=b(this),bD=[bB[0],bA];bC.triggerHandler(\"setData\"+bB[1]+\"!\",bD);b.data(this,by,bA);bC.triggerHandler(\"changeData\"+bB[1]+\"!\",bD)})}},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a5(bx,bw,by){if(by===L&&bx.nodeType===1){var bv=\"data-\"+bw.replace(aA,\"-$1\").toLowerCase();by=bx.getAttribute(bv);if(typeof by===\"string\"){try{by=by===\"true\"?true:by===\"false\"?false:by===\"null\"?null:b.isNumeric(by)?parseFloat(by):aS.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e===\"data\"&&b.isEmptyObject(bv[e])){continue}if(e!==\"toJSON\"){return false}}return true}function bi(by,bx,bA){var bw=bx+\"defer\",bv=bx+\"queue\",e=bx+\"mark\",bz=b._data(by,bw);if(bz&&(bA===\"queue\"||!b._data(by,bv))&&(bA===\"mark\"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||\"fx\")+\"mark\";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||\"fx\";var e=bv+\"mark\",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bi(bx,bv,\"mark\")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||\"fx\")+\"queue\";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||\"fx\";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw===\"inprogress\"){bw=bv.shift()}if(bw){if(bx===\"fx\"){bv.unshift(\"inprogress\")}b._data(by,bx+\".run\",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+\"queue \"+bx+\".run\",true);bi(by,bx,\"queue\")}}});b.fn.extend({queue:function(e,bv){if(typeof e!==\"string\"){bv=e;e=\"fx\"}if(bv===L){return b.queue(this[0],e)}return this.each(function(){var bw=b.queue(this,e,bv);if(e===\"fx\"&&bw[0]!==\"inprogress\"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bv,e){bv=b.fx?b.fx.speeds[bv]||bv:bv;e=e||\"fx\";return this.queue(e,function(bx,bw){var by=setTimeout(bx,bv);bw.stop=function(){clearTimeout(by)}})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(bD,bw){if(typeof bD!==\"string\"){bw=bD;bD=L}bD=bD||\"fx\";var e=b.Deferred(),bv=this,by=bv.length,bB=1,bz=bD+\"defer\",bA=bD+\"queue\",bC=bD+\"mark\",bx;function bE(){if(!(--bB)){e.resolveWith(bv,[bv])}}while(by--){if((bx=b.data(bv[by],bz,L,true)||(b.data(bv[by],bA,L,true)||b.data(bv[by],bC,L,true))&&b.data(bv[by],bz,b.Callbacks(\"once memory\"),true))){bB++;bx.add(bE)}}bE();return e.promise()}});var aP=/[\\n\\t\\r]/g,af=/\\s+/,aU=/\\r/g,g=/^(?:button|input)$/i,D=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,ao=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,F=b.support.getSetAttribute,be,aY,aF;b.fn.extend({attr:function(e,bv){return b.access(this,e,bv,true,b.attr)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,e,bv,true,b.prop)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by===\"string\"){bA=by.split(af);for(bw=0,bv=this.length;bw<bv;bw++){bx=this[bw];if(bx.nodeType===1){if(!bx.className&&bA.length===1){bx.className=by}else{bz=\" \"+bx.className+\" \";for(bB=0,e=bA.length;bB<e;bB++){if(!~bz.indexOf(\" \"+bA[bB]+\" \")){bz+=bA[bB]+\" \"}}bx.className=b.trim(bz)}}}}return this},removeClass:function(bz){var bA,bw,bv,by,bx,bB,e;if(b.isFunction(bz)){return this.each(function(bC){b(this).removeClass(bz.call(this,bC,this.className))})}if((bz&&typeof bz===\"string\")||bz===L){bA=(bz||\"\").split(af);for(bw=0,bv=this.length;bw<bv;bw++){by=this[bw];if(by.nodeType===1&&by.className){if(bz){bx=(\" \"+by.className+\" \").replace(aP,\" \");for(bB=0,e=bA.length;bB<e;bB++){bx=bx.replace(\" \"+bA[bB]+\" \",\" \")}by.className=b.trim(bx)}else{by.className=\"\"}}}}return this},toggleClass:function(bx,bv){var bw=typeof bx,e=typeof bv===\"boolean\";if(b.isFunction(bx)){return this.each(function(by){b(this).toggleClass(bx.call(this,by,this.className,bv),bv)})}return this.each(function(){if(bw===\"string\"){var bA,bz=0,by=b(this),bB=bv,bC=bx.split(af);while((bA=bC[bz++])){bB=e?bB:!by.hasClass(bA);by[bB?\"addClass\":\"removeClass\"](bA)}}else{if(bw===\"undefined\"||bw===\"boolean\"){if(this.className){b._data(this,\"__className__\",this.className)}this.className=this.className||bx===false?\"\":b._data(this,\"__className__\")||\"\"}}})},hasClass:function(e){var bx=\" \"+e+\" \",bw=0,bv=this.length;for(;bw<bv;bw++){if(this[bw].nodeType===1&&(\" \"+this[bw].className+\" \").replace(aP,\" \").indexOf(bx)>-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&\"get\" in e&&(bv=e.get(bw,\"value\"))!==L){return bv}bv=bw.value;return typeof bv===\"string\"?bv.replace(aU,\"\"):bv==null?\"\":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=\"\"}else{if(typeof bB===\"number\"){bB+=\"\"}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?\"\":bC+\"\"})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!(\"set\" in e)||e.set(this,bB,\"value\")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type===\"select-one\";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv<bz;bv++){bx=bC[bv];if(bx.selected&&(b.support.optDisabled?!bx.disabled:bx.getAttribute(\"disabled\")===null)&&(!bx.parentNode.disabled||!b.nodeName(bx.parentNode,\"optgroup\"))){bA=b(bx).val();if(bw){return bA}bB.push(bA)}}if(bw&&!bB.length&&bC.length){return b(bC[by]).val()}return bB},set:function(bv,bw){var e=b.makeArray(bw);b(bv).find(\"option\").each(function(){this.selected=b.inArray(b(this).val(),e)>=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;\n" -"if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute===\"undefined\"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&\"set\" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,\"\"+bB);return bB}}}else{if(e&&\"get\" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw<e;bw++){bv=bA[bw];if(bv){by=b.propFix[bv]||bv;b.attr(bx,bv,\"\");bx.removeAttribute(F?bv:by);if(ao.test(bv)&&by in bx){bx[by]=false}}}}},attrHooks:{type:{set:function(e,bv){if(g.test(e.nodeName)&&e.parentNode){b.error(\"type property can't be changed\")}else{if(!b.support.radioValue&&bv===\"radio\"&&b.nodeName(e,\"input\")){var bw=e.value;e.setAttribute(\"type\",bv);if(bw){e.value=bw}return bv}}}},value:{get:function(bv,e){if(be&&b.nodeName(bv,\"button\")){return be.get(bv,e)}return e in bv?bv.value:null},set:function(bv,bw,e){if(be&&b.nodeName(bv,\"button\")){return be.set(bv,bw,e)}bv.value=bw}}},propFix:{tabindex:\"tabIndex\",readonly:\"readOnly\",\"for\":\"htmlFor\",\"class\":\"className\",maxlength:\"maxLength\",cellspacing:\"cellSpacing\",cellpadding:\"cellPadding\",rowspan:\"rowSpan\",colspan:\"colSpan\",usemap:\"useMap\",frameborder:\"frameBorder\",contenteditable:\"contentEditable\"},prop:function(bz,bx,bA){var bw,e,by,bv=bz.nodeType;if(!bz||bv===3||bv===8||bv===2){return}by=bv!==1||!b.isXMLDoc(bz);if(by){bx=b.propFix[bx]||bx;e=b.propHooks[bx]}if(bA!==L){if(e&&\"set\" in e&&(bw=e.set(bz,bA,bx))!==L){return bw}else{return(bz[bx]=bA)}}else{if(e&&\"get\" in e&&(bw=e.get(bz,bx))!==null){return bw}else{return bz[bx]}}},propHooks:{tabIndex:{get:function(bv){var e=bv.getAttributeNode(\"tabindex\");return e&&e.specified?parseInt(e.value,10):D.test(bv.nodeName)||l.test(bv.nodeName)&&bv.href?0:L}}}});b.attrHooks.tabindex=b.propHooks.tabIndex;aY={get:function(bv,e){var bx,bw=b.prop(bv,e);return bw===true||typeof bw!==\"boolean\"&&(bx=bv.getAttributeNode(e))&&bx.nodeValue!==false?e.toLowerCase():L},set:function(bv,bx,e){var bw;if(bx===false){b.removeAttr(bv,e)}else{bw=b.propFix[e]||e;if(bw in bv){bv[bw]=true}bv.setAttribute(e,e.toLowerCase())}return e}};if(!F){aF={name:true,id:true};be=b.valHooks.button={get:function(bw,bv){var e;e=bw.getAttributeNode(bv);return e&&(aF[bv]?e.nodeValue!==\"\":e.specified)?e.nodeValue:L},set:function(bw,bx,bv){var e=bw.getAttributeNode(bv);if(!e){e=av.createAttribute(bv);bw.setAttributeNode(e)}return(e.nodeValue=bx+\"\")}};b.attrHooks.tabindex.set=be.set;b.each([\"width\",\"height\"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{set:function(bw,bx){if(bx===\"\"){bw.setAttribute(e,\"auto\");return bx}}})});b.attrHooks.contenteditable={get:be.get,set:function(bv,bw,e){if(bw===\"\"){bw=\"false\"}be.set(bv,bw,e)}}}if(!b.support.hrefNormalized){b.each([\"href\",\"src\",\"width\",\"height\"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{get:function(bx){var bw=bx.getAttribute(e,2);return bw===null?L:bw}})})}if(!b.support.style){b.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||L},set:function(e,bv){return(e.style.cssText=\"\"+bv)}}}if(!b.support.optSelected){b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(bv){var e=bv.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}})}if(!b.support.enctype){b.propFix.enctype=\"encoding\"}if(!b.support.checkOn){b.each([\"radio\",\"checkbox\"],function(){b.valHooks[this]={get:function(e){return e.getAttribute(\"value\")===null?\"on\":e.value}}})}b.each([\"radio\",\"checkbox\"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,bv){if(b.isArray(bv)){return(e.checked=b.inArray(b(e).val(),bv)>=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\\.]*)?(?:\\.(.+))?$/,J=/\\bhover(\\.\\S+)?\\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||\"\").toLowerCase();bv[3]=bv[3]&&new RegExp(\"(?:^|\\\\s)\"+bv[3]+\"(?:\\\\s|$)\")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv[\"class\"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,\"mouseenter$1 mouseleave$1\")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!==\"undefined\"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(\" \");for(bI=0;bI<bC.length;bI++){bH=n.exec(bC[bI])||[];bF=bH[1];e=(bH[2]||\"\").split(\".\").sort();bE=b.event.special[bF]||{};bF=(by?bE.delegateType:bE.bindType)||bF;bE=b.event.special[bF]||{};bG=b.extend({type:bF,origType:bH[1],data:bA,handler:bJ,guid:bJ.guid,selector:by,quick:Y(by),namespace:e.join(\".\")},bv);bw=bK[bF];if(!bw){bw=bK[bF]=[];bw.delegateCount=0;if(!bE.setup||bE.setup.call(bx,bA,e,bB)===false){if(bx.addEventListener){bx.addEventListener(bF,bB,false)}else{if(bx.attachEvent){bx.attachEvent(\"on\"+bF,bB)}}}}if(bE.add){bE.add.call(bx,bG);if(!bG.handler.guid){bG.handler.guid=bJ.guid}}if(by){bw.splice(bw.delegateCount++,0,bG)}else{bw.push(bG)}b.event.global[bF]=true}bx=null},global:{},remove:function(bJ,bE,bv,bH,bB){var bI=b.hasData(bJ)&&b._data(bJ),bF,bx,bz,bL,bC,bA,bG,bw,by,bK,bD,e;if(!bI||!(bw=bI.events)){return}bE=b.trim(bt(bE||\"\")).split(\" \");for(bF=0;bF<bE.length;bF++){bx=n.exec(bE[bF])||[];bz=bL=bx[1];bC=bx[2];if(!bz){for(bz in bw){b.event.remove(bJ,bz+bE[bF],bv,bH,true)}continue}by=b.event.special[bz]||{};bz=(bH?by.delegateType:by.bindType)||bz;bD=bw[bz]||[];bA=bD.length;bC=bC?new RegExp(\"(^|\\\\.)\"+bC.split(\".\").sort().join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\"):null;for(bG=0;bG<bD.length;bG++){e=bD[bG];if((bB||bL===e.origType)&&(!bv||bv.guid===e.guid)&&(!bC||bC.test(e.namespace))&&(!bH||bH===e.selector||bH===\"**\"&&e.selector)){bD.splice(bG--,1);if(e.selector){bD.delegateCount--}if(by.remove){by.remove.call(bJ,e)}}}if(bD.length===0&&bA!==bD.length){if(!by.teardown||by.teardown.call(bJ,bC)===false){b.removeEvent(bJ,bz,bI.handle)}delete bw[bz]}}if(b.isEmptyObject(bw)){bK=bI.handle;if(bK){bK.elem=null}b.removeData(bJ,[\"events\",\"handle\"],true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(bv,bD,bA,bJ){if(bA&&(bA.nodeType===3||bA.nodeType===8)){return}var bG=bv.type||bv,bx=[],e,bw,bC,bH,bz,by,bF,bE,bB,bI;if(T.test(bG+b.event.triggered)){return}if(bG.indexOf(\"!\")>=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(\".\")>=0){bx=bG.split(\".\");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv===\"object\"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(\".\");bv.namespace_re=bv.namespace?new RegExp(\"(^|\\\\.)\"+bx.join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\"):null;by=bG.indexOf(\":\")<0?\"on\"+bG:\"\";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bC<bB.length&&!bv.isPropagationStopped();bC++){bH=bB[bC][0];bv.type=bB[bC][1];bE=(b._data(bH,\"events\")||{})[bv.type]&&b._data(bH,\"handle\");if(bE){bE.apply(bH,bD)}bE=by&&bH[by];if(bE&&b.acceptData(bH)&&bE.apply(bH,bD)===false){bv.preventDefault()}}bv.type=bG;if(!bJ&&!bv.isDefaultPrevented()){if((!bF._default||bF._default.apply(bA.ownerDocument,bD)===false)&&!(bG===\"click\"&&b.nodeName(bA,\"a\"))&&b.acceptData(bA)){if(by&&bA[bG]&&((bG!==\"focus\"&&bG!==\"blur\")||bv.target.offsetWidth!==0)&&!b.isWindow(bA)){bz=bA[by];if(bz){bA[by]=null}b.event.triggered=bG;bA[bG]();b.event.triggered=L;if(bz){bA[by]=bz}}}}return bv.result},dispatch:function(e){e=b.event.fix(e||bb.event);var bz=((b._data(this,\"events\")||{})[e.type]||[]),bA=bz.delegateCount,bG=[].slice.call(arguments,0),by=!e.exclusive&&!e.namespace,bH=[],bC,bB,bK,bx,bF,bE,bv,bD,bI,bw,bJ;bG[0]=e;e.delegateTarget=this;if(bA&&!e.target.disabled&&!(e.button&&e.type===\"click\")){bx=b(this);bx.context=this.ownerDocument||this;for(bK=e.target;bK!=this;bK=bK.parentNode||this){bE={};bD=[];bx[0]=bK;for(bC=0;bC<bA;bC++){bI=bz[bC];bw=bI.selector;if(bE[bw]===L){bE[bw]=(bI.quick?j(bK,bI.quick):bx.is(bw))}if(bE[bw]){bD.push(bI)}}if(bD.length){bH.push({elem:bK,matches:bD})}}}if(bz.length>bA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC<bH.length&&!e.isPropagationStopped();bC++){bv=bH[bC];e.currentTarget=bv.elem;for(bB=0;bB<bv.matches.length&&!e.isImmediatePropagationStopped();bB++){bI=bv.matches[bB];if(by||(!e.namespace&&!bI.namespace)||e.namespace_re&&e.namespace_re.test(bI.namespace)){e.data=bI.data;e.handleObj=bI;bF=((b.event.special[bI.origType]||{}).handle||bI.handler).apply(bv.elem,bG);if(bF!==L){e.result=bF;if(bF===false){e.preventDefault();e.stopPropagation()}}}}}return e.result},props:\"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(bv,e){if(bv.which==null){bv.which=e.charCode!=null?e.charCode:e.keyCode}return bv}},mouseHooks:{props:\"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(bx,bw){var by,bz,e,bv=bw.button,bA=bw.fromElement;if(bx.pageX==null&&bw.clientX!=null){by=bx.target.ownerDocument||av;bz=by.documentElement;e=by.body;bx.pageX=bw.clientX+(bz&&bz.scrollLeft||e&&e.scrollLeft||0)-(bz&&bz.clientLeft||e&&e.clientLeft||0);bx.pageY=bw.clientY+(bz&&bz.scrollTop||e&&e.scrollTop||0)-(bz&&bz.clientTop||e&&e.clientTop||0)}if(!bx.relatedTarget&&bA){bx.relatedTarget=bA===bx.target?bw.toElement:bA}if(!bx.which&&bv!==L){bx.which=(bv&1?1:(bv&2?3:(bv&4?2:0)))}return bx}},fix:function(bw){if(bw[b.expando]){return bw}var bv,bz,e=bw,bx=b.event.fixHooks[bw.type]||{},by=bx.props?this.props.concat(bx.props):this.props;bw=b.Event(e);for(bv=by.length;bv;){bz=by[--bv];bw[bz]=e[bz]}if(!bw.target){bw.target=e.srcElement||av}if(bw.target.nodeType===3){bw.target=bw.target.parentNode}if(bw.metaKey===L){bw.metaKey=bw.ctrlKey}return bx.filter?bx.filter(bw,e):bw},special:{ready:{setup:b.bindReady},load:{noBubble:true},focus:{delegateType:\"focusin\"},blur:{delegateType:\"focusout\"},beforeunload:{setup:function(bw,bv,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bv,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}},simulate:function(bw,by,bx,bv){var bz=b.extend(new b.Event(),bx,{type:bw,isSimulated:true,originalEvent:{}});if(bv){b.event.trigger(bz,null,by)}else{b.event.dispatch.call(by,bz)}if(bz.isDefaultPrevented()){bx.preventDefault()}}};b.event.handle=b.event.dispatch;b.removeEvent=av.removeEventListener?function(bv,e,bw){if(bv.removeEventListener){bv.removeEventListener(e,bw,false)}}:function(bv,e,bw){if(bv.detachEvent){bv.detachEvent(\"on\"+e,bw)}};b.Event=function(bv,e){if(!(this instanceof b.Event)){return new b.Event(bv,e)}if(bv&&bv.type){this.originalEvent=bv;this.type=bv.type;this.isDefaultPrevented=(bv.defaultPrevented||bv.returnValue===false||bv.getPreventDefault&&bv.getPreventDefault())?i:bk}else{this.type=bv}if(e){b.extend(this,e)}this.timeStamp=bv&&bv.timeStamp||b.now();this[b.expando]=true};function bk(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bv=this.originalEvent;if(!bv){return}if(bv.preventDefault){bv.preventDefault()}else{bv.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bv=this.originalEvent;if(!bv){return}if(bv.stopPropagation){bv.stopPropagation()}bv.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:bk,isPropagationStopped:bk,isImmediatePropagationStopped:bk};b.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},function(bv,e){b.event.special[bv]={delegateType:e,bindType:e,handle:function(bz){var bB=this,bA=bz.relatedTarget,by=bz.handleObj,bw=by.selector,bx;if(!bA||(bA!==bB&&!b.contains(bB,bA))){bz.type=by.origType;bx=by.handler.apply(this,arguments);bz.type=e}return bx}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(){if(b.nodeName(this,\"form\")){return false\n" diff --git a/src/jquery_p2_js.h b/src/jquery_p2_js.h deleted file mode 100644 index 7c905ef..0000000 --- a/src/jquery_p2_js.h +++ /dev/null @@ -1,10 +0,0 @@ -"}b.event.add(this,\"click._submit keypress._submit\",function(bx){var bw=bx.target,bv=b.nodeName(bw,\"input\")||b.nodeName(bw,\"button\")?bw.form:L;if(bv&&!bv._submit_attached){b.event.add(bv,\"submit._submit\",function(e){if(this.parentNode&&!e.isTrigger){b.event.simulate(\"submit\",this.parentNode,e,true)}});bv._submit_attached=true}})},teardown:function(){if(b.nodeName(this,\"form\")){return false}b.event.remove(this,\"._submit\")}}}if(!b.support.changeBubbles){b.event.special.change={setup:function(){if(bd.test(this.nodeName)){if(this.type===\"checkbox\"||this.type===\"radio\"){b.event.add(this,\"propertychange._change\",function(e){if(e.originalEvent.propertyName===\"checked\"){this._just_changed=true}});b.event.add(this,\"click._change\",function(e){if(this._just_changed&&!e.isTrigger){this._just_changed=false;b.event.simulate(\"change\",this,e,true)}})}return false}b.event.add(this,\"beforeactivate._change\",function(bw){var bv=bw.target;if(bd.test(bv.nodeName)&&!bv._change_attached){b.event.add(bv,\"change._change\",function(e){if(this.parentNode&&!e.isSimulated&&!e.isTrigger){b.event.simulate(\"change\",this.parentNode,e,true)}});bv._change_attached=true}})},handle:function(bv){var e=bv.target;if(this!==e||bv.isSimulated||bv.isTrigger||(e.type!==\"radio\"&&e.type!==\"checkbox\")){return bv.handleObj.handler.apply(this,arguments)}},teardown:function(){b.event.remove(this,\"._change\");return bd.test(this.nodeName)}}}if(!b.support.focusinBubbles){b.each({focus:\"focusin\",blur:\"focusout\"},function(bx,e){var bv=0,bw=function(by){b.event.simulate(e,by.target,b.event.fix(by),true)};b.event.special[e]={setup:function(){if(bv++===0){av.addEventListener(bx,bw,true)}},teardown:function(){if(--bv===0){av.removeEventListener(bx,bw,true)}}}})}b.fn.extend({on:function(bw,e,bz,by,bv){var bA,bx;if(typeof bw===\"object\"){if(typeof e!==\"string\"){bz=e;e=L}for(bx in bw){this.on(bx,e,bz,bw[bx],bv)}return this}if(bz==null&&by==null){by=e;bz=e=L}else{if(by==null){if(typeof e===\"string\"){by=bz;bz=L}else{by=bz;bz=e;e=L}}}if(by===false){by=bk}else{if(!by){return this}}if(bv===1){bA=by;by=function(bB){b().off(bB);return bA.apply(this,arguments)};by.guid=bA.guid||(bA.guid=b.guid++)}return this.each(function(){b.event.add(this,bw,by,bz,e)})},one:function(bv,e,bx,bw){return this.on.call(this,bv,e,bx,bw,1)},off:function(bw,e,by){if(bw&&bw.preventDefault&&bw.handleObj){var bv=bw.handleObj;b(bw.delegateTarget).off(bv.namespace?bv.type+\".\"+bv.namespace:bv.type,bv.selector,bv.handler);return this}if(typeof bw===\"object\"){for(var bx in bw){this.off(bx,e,bw[bx])}return this}if(e===false||typeof e===\"function\"){by=e;e=L}if(by===false){by=bk}return this.each(function(){b.event.remove(this,bw,by,e)})},bind:function(e,bw,bv){return this.on(e,null,bw,bv)},unbind:function(e,bv){return this.off(e,null,bv)},live:function(e,bw,bv){b(this.context).on(e,this.selector,bw,bv);return this},die:function(e,bv){b(this.context).off(e,this.selector||\"**\",bv);return this},delegate:function(e,bv,bx,bw){return this.on(bv,e,bx,bw)},undelegate:function(e,bv,bw){return arguments.length==1?this.off(e,\"**\"):this.off(bv,e,bw)},trigger:function(e,bv){return this.each(function(){b.event.trigger(e,bv,this)})},triggerHandler:function(e,bv){if(this[0]){return b.event.trigger(e,bv,this[0],true)}},toggle:function(bx){var bv=arguments,e=bx.guid||b.guid++,bw=0,by=function(bz){var bA=(b._data(this,\"lastToggle\"+bx.guid)||0)%bw;b._data(this,\"lastToggle\"+bx.guid,bA+1);bz.preventDefault();return bv[bA].apply(this,arguments)||false};by.guid=e;while(bw<bv.length){bv[bw++].guid=e}return this.click(by)},hover:function(e,bv){return this.mouseenter(e).mouseleave(bv||e)}});b.each((\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\").split(\" \"),function(bv,e){b.fn[e]=function(bx,bw){if(bw==null){bw=bx;bx=null}return arguments.length>0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}});\n" -"/*!\n" -" * Sizzle CSS Selector Engine\n" -" * Copyright 2011, The Dojo Foundation\n" -" * Released under the MIT, BSD, and GPL Licenses.\n" -" * More information: http://sizzlejs.com/\n" -" */\n" -"(function(){var bH=/((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,bC=\"sizcache\"+(Math.random()+\"\").replace(\".\",\"\"),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\\\/g,bO=/\\r\\n/g,bQ=/\\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!==\"string\"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec(\"\");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]===\"~\"||bW[0]===\"+\")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=\"\"}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)===\"[object Array]\"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e<bR.length;e++){if(bR[e]===bR[e-1]){bR.splice(e--,1)}}}}return bR};by.matches=function(e,bR){return by(e,null,null,bR)};by.matchesSelector=function(e,bR){return by(bR,null,null,[e]).length>0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS<bU;bS++){bV=bE.order[bS];if((bT=bE.leftMatch[bV].exec(bX))){bR=bT[1];bT.splice(1,1);if(bR.substr(bR.length-1)!==\"\\\\\"){bT[1]=(bT[1]||\"\").replace(bK,\"\");bW=bE.find[bV](bT,e,bY);if(bW!=null){bX=bX.replace(bE.match[bV],\"\");break}}}}if(!bW){bW=typeof e.getElementsByTagName!==\"undefined\"?e.getElementsByTagName(\"*\"):[]}return{set:bW,expr:bX}};by.filter=function(b1,b0,b4,bU){var bW,e,bZ,b6,b3,bR,bT,bV,b2,bS=b1,b5=[],bY=b0,bX=b0&&b0[0]&&by.isXML(b0[0]);while(b1&&b0.length){for(bZ in bE.filter){if((bW=bE.leftMatch[bZ].exec(b1))!=null&&bW[2]){bR=bE.filter[bZ];bT=bW[1];e=false;bW.splice(1,1);if(bT.substr(bT.length-1)===\"\\\\\"){continue}if(bY===b5){b5=[]}if(bE.preFilter[bZ]){bW=bE.preFilter[bZ](bW,bY,b4,b5,bU,bX);if(!bW){e=b6=true}else{if(bW===true){continue}}}if(bW){for(bV=0;(b3=bY[bV])!=null;bV++){if(b3){b6=bR(b3,bW,bV,bY);b2=bU^b6;if(b4&&b6!=null){if(b2){e=true}else{bY[bV]=false}}else{if(b2){b5.push(b3);e=true}}}}}if(b6!==L){if(!b4){bY=b5}b1=b1.replace(bE.match[bZ],\"\");if(!e){return[]}break}}}if(b1===bS){if(e==null){by.error(b1)}else{break}}bS=b1}return bY};by.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)};var bw=by.getText=function(bU){var bS,bT,e=bU.nodeType,bR=\"\";if(e){if(e===1||e===9){if(typeof bU.textContent===\"string\"){return bU.textContent}else{if(typeof bU.innerText===\"string\"){return bU.innerText.replace(bO,\"\")}else{for(bU=bU.firstChild;bU;bU=bU.nextSibling){bR+=bw(bU)}}}}else{if(e===3||e===4){return bU.nodeValue}}}else{for(bS=0;(bT=bU[bS]);bS++){if(bT.nodeType!==8){bR+=bw(bT)}}}return bR};var bE=by.selectors={order:[\"ID\",\"NAME\",\"TAG\"],match:{ID:/#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,CLASS:/\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,NAME:/\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,ATTR:/\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,TAG:/^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,PSEUDO:/:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/},leftMatch:{},attrMap:{\"class\":\"className\",\"for\":\"htmlFor\"},attrHandle:{href:function(e){return e.getAttribute(\"href\")},type:function(e){return e.getAttribute(\"type\")}},relative:{\"+\":function(bW,bR){var bT=typeof bR===\"string\",bV=bT&&!bQ.test(bR),bX=bT&&!bV;if(bV){bR=bR.toLowerCase()}for(var bS=0,e=bW.length,bU;bS<e;bS++){if((bU=bW[bS])){while((bU=bU.previousSibling)&&bU.nodeType!==1){}bW[bS]=bX||bU&&bU.nodeName.toLowerCase()===bR?bU||false:bU===bR}}if(bX){by.filter(bR,bW,true)}},\">\":function(bW,bR){var bV,bU=typeof bR===\"string\",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS<e;bS++){bV=bW[bS];if(bV){var bT=bV.parentNode;bW[bS]=bT.nodeName.toLowerCase()===bR?bT:false}}}else{for(;bS<e;bS++){bV=bW[bS];if(bV){bW[bS]=bU?bV.parentNode:bV.parentNode===bR}}if(bU){by.filter(bR,bW,true)}}},\"\":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR===\"string\"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e(\"parentNode\",bR,bS,bT,bU,bV)},\"~\":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR===\"string\"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e(\"previousSibling\",bR,bS,bT,bU,bV)}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!==\"undefined\"&&!bT){var e=bS.getElementById(bR[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bS,bV){if(typeof bV.getElementsByName!==\"undefined\"){var bR=[],bU=bV.getElementsByName(bS[1]);for(var bT=0,e=bU.length;bT<e;bT++){if(bU[bT].getAttribute(\"name\")===bS[1]){bR.push(bU[bT])}}return bR.length===0?null:bR}},TAG:function(e,bR){if(typeof bR.getElementsByTagName!==\"undefined\"){return bR.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bT,bR,bS,e,bW,bX){bT=\" \"+bT[1].replace(bK,\"\")+\" \";if(bX){return bT}for(var bU=0,bV;(bV=bR[bU])!=null;bU++){if(bV){if(bW^(bV.className&&(\" \"+bV.className+\" \").replace(/[\\t\\n\\r]/g,\" \").indexOf(bT)>=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,\"\")},TAG:function(bR,e){return bR[1].replace(bK,\"\").toLowerCase()},CHILD:function(e){if(e[1]===\"nth\"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\\+|\\s*/g,\"\");var bR=/(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(e[2]===\"even\"&&\"2n\"||e[2]===\"odd\"&&\"2n+1\"||!/\\D/.test(e[2])&&\"0n+\"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,\"\");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||\"\").replace(bK,\"\");if(bU[2]===\"~=\"){bU[4]=\" \"+bU[4]+\" \"}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]===\"not\"){if((bH.exec(bU[3])||\"\").length>1||/^\\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!==\"hidden\"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute(\"type\"),bR=bS.type;return bS.nodeName.toLowerCase()===\"input\"&&\"text\"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"radio\"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"checkbox\"===e.type},file:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"file\"===e.type},password:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"password\"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e===\"input\"||e===\"button\")&&\"submit\"===bR.type},image:function(e){return e.nodeName.toLowerCase()===\"input\"&&\"image\"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e===\"input\"||e===\"button\")&&\"reset\"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e===\"input\"&&\"button\"===bR.type||e===\"button\"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1\n" -"},lt:function(bS,bR,e){return bR<e[3]-0},gt:function(bS,bR,e){return bR>e[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e===\"contains\"){return(bS.textContent||bS.innerText||bw([bS])||\"\").indexOf(bX[3])>=0}else{if(e===\"not\"){var bT=bX[3];for(var bV=0,bU=bT.length;bV<bU;bV++){if(bT[bV]===bS){return false}}return true}else{by.error(e)}}}},CHILD:function(bS,bU){var bT,b0,bW,bZ,e,bV,bY,bX=bU[1],bR=bS;switch(bX){case\"only\":case\"first\":while((bR=bR.previousSibling)){if(bR.nodeType===1){return false}}if(bX===\"first\"){return true}bR=bS;case\"last\":while((bR=bR.nextSibling)){if(bR.nodeType===1){return false}}return true;case\"nth\":bT=bU[2];b0=bU[3];if(bT===1&&b0===0){return true}bW=bU[0];bZ=bS.parentNode;if(bZ&&(bZ[bC]!==bW||!bS.nodeIndex)){bV=0;for(bR=bZ.firstChild;bR;bR=bR.nextSibling){if(bR.nodeType===1){bR.nodeIndex=++bV}}bZ[bC]=bW}bY=bS.nodeIndex-b0;if(bT===0){return bY===0}else{return(bY%bT===0&&bY/bT>=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute(\"id\")===e},TAG:function(bR,e){return(e===\"*\"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(\" \"+(bR.className||bR.getAttribute(\"class\"))+\" \").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+\"\",bU=bT[2],bR=bT[4];return e==null?bU===\"!=\":!bU&&by.attr?e!=null:bU===\"=\"?bW===bR:bU===\"*=\"?bW.indexOf(bR)>=0:bU===\"~=\"?(\" \"+bW+\" \").indexOf(bR)>=0:!bR?bW&&e!==false:bU===\"!=\"?bW!==bR:bU===\"^=\"?bW.indexOf(bR)===0:bU===\"$=\"?bW.substr(bW.length-bR.length)===bR:bU===\"|=\"?bW===bR||bW.substr(0,bR.length+1)===bR+\"-\":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return\"\\\\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\\[]*\\])(?![^\\(]*\\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\\r|\\n)*?)/.source+bE.match[bz].source.replace(/\\\\(\\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)===\"[object Array]\"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length===\"number\"){for(var e=bU.length;bS<e;bS++){bR.push(bU[bS])}}else{for(;bU[bS];bS++){bR.push(bU[bS])}}}return bR}}var bJ,bG;if(av.documentElement.compareDocumentPosition){bJ=function(bR,e){if(bR===e){bB=true;return 0}if(!bR.compareDocumentPosition||!e.compareDocumentPosition){return bR.compareDocumentPosition?-1:1}return bR.compareDocumentPosition(e)&4?-1:1}}else{bJ=function(bY,bX){if(bY===bX){bB=true;return 0}else{if(bY.sourceIndex&&bX.sourceIndex){return bY.sourceIndex-bX.sourceIndex}}var bV,bR,bS=[],e=[],bU=bY.parentNode,bW=bX.parentNode,bZ=bU;if(bU===bW){return bG(bY,bX)}else{if(!bU){return -1}else{if(!bW){return 1}}}while(bZ){bS.unshift(bZ);bZ=bZ.parentNode}bZ=bW;while(bZ){e.unshift(bZ);bZ=bZ.parentNode}bV=bS.length;bR=e.length;for(var bT=0;bT<bV&&bT<bR;bT++){if(bS[bT]!==e[bT]){return bG(bS[bT],e[bT])}}return bT===bV?bG(bY,e[bT],-1):bG(bS[bT],bX,1)};bG=function(bR,e,bS){if(bR===e){return bS}var bT=bR.nextSibling;while(bT){if(bT===e){return -1}bT=bT.nextSibling}return 1}}(function(){var bR=av.createElement(\"div\"),bS=\"script\"+(new Date()).getTime(),e=av.documentElement;bR.innerHTML=\"<a name='\"+bS+\"'/>\";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!==\"undefined\"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!==\"undefined\"&&bT.getAttributeNode(\"id\").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!==\"undefined\"&&bV.getAttributeNode(\"id\");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement(\"div\");e.appendChild(av.createComment(\"\"));if(e.getElementsByTagName(\"*\").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]===\"*\"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML=\"<a href='#'></a>\";if(e.firstChild&&typeof e.firstChild.getAttribute!==\"undefined\"&&e.firstChild.getAttribute(\"href\")!==\"#\"){bE.attrHandle.href=function(bR){return bR.getAttribute(\"href\",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement(\"div\"),bS=\"__sizzle__\";bT.innerHTML=\"<p class='TEST'></p>\";if(bT.querySelectorAll&&bT.querySelectorAll(\".TEST\").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4===\"body\"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!==\"object\"){var bW=bV,bX=bV.getAttribute(\"id\"),bU=bX||bS,b6=bV.parentNode,b5=/^\\s*[+~]/.test(b4);if(!bX){bV.setAttribute(\"id\",bU)}else{bU=bU.replace(/'/g,\"\\\\$&\")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll(\"[id='\"+bU+\"'] \"+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute(\"id\")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement(\"div\"),\"div\"),bR=false;try{bS.call(av.documentElement,\"[test!='']:sizzle\")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g,\"='$1']\");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement(\"div\");e.innerHTML=\"<div class='test e'></div><div class='test'></div>\";if(!e.getElementsByClassName||e.getElementsByClassName(\"e\").length===0){return}e.lastChild.className=\"e\";if(e.getElementsByClassName(\"e\").length===1){return}bE.order.splice(1,0,\"CLASS\");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!==\"undefined\"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1&&!bY){e[bC]=bV;e.sizset=bT}if(e.nodeName.toLowerCase()===bW){bU=e;break}e=e[bR]}bZ[bT]=bU}}}function bN(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1){if(!bY){e[bC]=bV;e.sizset=bT}if(typeof bW!==\"string\"){if(e===bW){bU=true;break}}else{if(by.filter(bW,[e]).length>0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!==\"HTML\":false};var bM=function(bS,e,bW){var bV,bX=[],bU=\"\",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,\"\")}bS=bE.relative[bS]?bS+\"*\":bS;for(var bT=0,bR=bY.length;bT<bR;bT++){by(bS,bY[bT],bX,bW)}return by.filter(bU,bX)};by.attr=b.attr;by.selectors.attrMap={};b.find=by;b.expr=by.selectors;b.expr[\":\"]=b.expr.filters;b.unique=by.uniqueSort;b.text=by.getText;b.isXMLDoc=by.isXML;b.contains=by.contains})();var ab=/Until$/,aq=/^(?:parents|prevUntil|prevAll)/,a9=/,/,bp=/^.[^:#\\[\\.,]*$/,P=Array.prototype.slice,H=b.expr.match.POS,ay={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bw=this,by,bv;if(typeof e!==\"string\"){return b(e).filter(function(){for(by=0,bv=bw.length;by<bv;by++){if(b.contains(bw[by],this)){return true}}})}var bx=this.pushStack(\"\",\"find\",e),bA,bB,bz;for(by=0,bv=this.length;by<bv;by++){bA=bx.length;b.find(e,this[by],bx);if(by>0){for(bB=bA;bB<bx.length;bB++){for(bz=0;bz<bA;bz++){if(bx[bz]===bx[bB]){bx.splice(bB--,1);break}}}}}return bx},has:function(bv){var e=b(bv);return this.filter(function(){for(var bx=0,bw=e.length;bx<bw;bx++){if(b.contains(this,e[bx])){return true}}})},not:function(e){return this.pushStack(aG(this,e,false),\"not\",e)},filter:function(e){return this.pushStack(aG(this,e,true),\"filter\",e)},is:function(e){return !!e&&(typeof e===\"string\"?H.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw<by.length;bw++){if(b(bz).is(by[bw])){bv.push({selector:by[bw],elem:bz,level:bB})}}bz=bz.parentNode;bB++}return bv}var bA=H.test(by)||typeof by!==\"string\"?b(by,bx||this.context):0;for(bw=0,e=this.length;bw<e;bw++){bz=this[bw];while(bz){if(bA?bA.index(bz)>-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,\"closest\",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e===\"string\"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e===\"string\"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,\"parentNode\")},parentsUntil:function(bv,e,bw){return b.dir(bv,\"parentNode\",bw)},next:function(e){return b.nth(e,2,\"nextSibling\")},prev:function(e){return b.nth(e,2,\"previousSibling\")},nextAll:function(e){return b.dir(e,\"nextSibling\")},prevAll:function(e){return b.dir(e,\"previousSibling\")},nextUntil:function(bv,e,bw){return b.dir(bv,\"nextSibling\",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,\"previousSibling\",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,\"iframe\")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw===\"string\"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(\",\"))}});b.extend({filter:function(bw,e,bv){if(bv){bw=\":not(\"+bw+\")\"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw===\"string\"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split(\"|\"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR=\"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",ag=/ jQuery\\d+=\"(?:\\d+|null)\"/g,ar=/^\\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,d=/<([\\w:]+)/,w=/<tbody/i,W=/<|&#?\\w+;/,ae=/<(?:script|style)/i,O=/<(?:script|object|embed|option|style)/i,ah=new RegExp(\"<(?:\"+aR+\")\",\"i\"),o=/checked\\s*(?:[^=]|=\\s*.checked.)/i,bm=/\\/(java|ecma)script/i,aN=/^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,ax={option:[1,\"<select multiple='multiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],thead:[1,\"<table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],area:[1,\"<map>\",\"</map>\"],_default:[0,\"\",\"\"]},ac=a(av);\n" -"ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,\"div<div>\",\"</div>\"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!==\"object\"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,\"body\")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,\"before\",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,\"after\",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName(\"*\"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName(\"*\"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,\"\"):null}else{if(typeof bx===\"string\"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||[\"\",\"\"])[1].toLowerCase()]){bx=bx.replace(R,\"<$1></$2>\");try{for(var bw=0,bv=this.length;bw<bv;bw++){if(this[bw].nodeType===1){b.cleanData(this[bw].getElementsByTagName(\"*\"));this[bw].innerHTML=bx}}}catch(by){this.empty().append(bx)}}else{if(b.isFunction(bx)){this.each(function(bz){var e=b(this);e.html(bx.call(this,bz,e.html()))})}else{this.empty().append(bx)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bx){var bw=b(this),bv=bw.html();bw.replaceWith(e.call(this,bx,bv))})}if(typeof e!==\"string\"){e=b(e).detach()}return this.each(function(){var bw=this.nextSibling,bv=this.parentNode;b(this).remove();if(bw){b(bw).before(e)}else{b(bv).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),\"replaceWith\",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bB,bF,bE){var bx,by,bA,bD,bC=bB[0],bv=[];if(!b.support.checkClone&&arguments.length===3&&typeof bC===\"string\"&&o.test(bC)){return this.each(function(){b(this).domManip(bB,bF,bE,true)})}if(b.isFunction(bC)){return this.each(function(bH){var bG=b(this);bB[0]=bC.call(this,bH,bF?bG.html():L);bG.domManip(bB,bF,bE)})}if(this[0]){bD=bC&&bC.parentNode;if(b.support.parentNode&&bD&&bD.nodeType===11&&bD.childNodes.length===this.length){bx={fragment:bD}}else{bx=b.buildFragment(bB,this,bv)}bA=bx.fragment;if(bA.childNodes.length===1){by=bA=bA.firstChild}else{by=bA.firstChild}if(by){bF=bF&&b.nodeName(by,\"tr\");for(var bw=0,e=this.length,bz=e-1;bw<e;bw++){bE.call(bF?ba(this[bw],by):this[bw],bx.cacheable||(e>1&&bw<bz)?b.clone(bA,true,true):bA)}}if(bv.length){b.each(bv,bo)}}return this}});function ba(e,bv){return b.nodeName(e,\"table\")?(e.getElementsByTagName(\"tbody\")[0]||e.appendChild(e.ownerDocument.createElement(\"tbody\"))):e}function t(bB,bv){if(bv.nodeType!==1||!b.hasData(bB)){return}var by,bx,e,bA=b._data(bB),bz=b._data(bv,bA),bw=bA.events;if(bw){delete bz.handle;bz.events={};for(by in bw){for(bx=0,e=bw[by].length;bx<e;bx++){b.event.add(bv,by+(bw[by][bx].namespace?\".\":\"\")+bw[by][bx].namespace,bw[by][bx],bw[by][bx].data)}}}if(bz.data){bz.data=b.extend({},bz.data)}}function ai(bv,e){var bw;if(e.nodeType!==1){return}if(e.clearAttributes){e.clearAttributes()}if(e.mergeAttributes){e.mergeAttributes(bv)}bw=e.nodeName.toLowerCase();if(bw===\"object\"){e.outerHTML=bv.outerHTML}else{if(bw===\"input\"&&(bv.type===\"checkbox\"||bv.type===\"radio\")){if(bv.checked){e.defaultChecked=e.checked=bv.checked}if(e.value!==bv.value){e.value=bv.value}}else{if(bw===\"option\"){e.selected=bv.defaultSelected}else{if(bw===\"input\"||bw===\"textarea\"){e.defaultValue=bv.defaultValue}}}}e.removeAttribute(b.expando)}b.buildFragment=function(bz,bx,bv){var by,e,bw,bA,bB=bz[0];if(bx&&bx[0]){bA=bx[0].ownerDocument||bx[0]}if(!bA.createDocumentFragment){bA=av}if(bz.length===1&&typeof bB===\"string\"&&bB.length<512&&bA===av&&bB.charAt(0)===\"<\"&&!O.test(bB)&&(b.support.checkClone||!o.test(bB))&&(b.support.html5Clone||!ah.test(bB))){e=true;bw=b.fragments[bB];if(bw&&bw!==1){by=bw}}if(!by){by=bA.createDocumentFragment();b.clean(bz,bA,by,bv)}if(e){b.fragments[bB]=bw?by:1}return{fragment:by,cacheable:e}};b.fragments={};b.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,bv){b.fn[e]=function(bw){var bz=[],bC=b(bw),bB=this.length===1&&this[0].parentNode;if(bB&&bB.nodeType===11&&bB.childNodes.length===1&&bC.length===1){bC[bv](this[0]);return this}else{for(var bA=0,bx=bC.length;bA<bx;bA++){var by=(bA>0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!==\"undefined\"){return e.getElementsByTagName(\"*\")}else{if(typeof e.querySelectorAll!==\"undefined\"){return e.querySelectorAll(\"*\")}else{return[]}}}function az(e){if(e.type===\"checkbox\"||e.type===\"radio\"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||\"\").toLowerCase();if(bv===\"input\"){az(e)}else{if(bv!==\"script\"&&typeof e.getElementsByTagName!==\"undefined\"){b.grep(e.getElementsByTagName(\"input\"),az)}}}function al(e){var bv=av.createElement(\"div\");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test(\"<\"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement===\"undefined\"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz===\"number\"){bz+=\"\"}if(!bz){continue}if(typeof bz===\"string\"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,\"<$1></$2>\");var bK=(d.exec(bz)||[\"\",\"\"])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement(\"div\");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK===\"table\"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===\"<table>\"&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],\"tbody\")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)===\"number\"){for(bB=0;bB<bG;bB++){E(bz[bB])}}else{E(bz)}}if(bz.nodeType){bI.push(bz)}else{bI=b.merge(bI,bz)}}if(bH){bF=function(bL){return !bL.type||bm.test(bL.type)};for(bE=0;bI[bE];bE++){if(bA&&b.nodeName(bI[bE],\"script\")&&(!bI[bE].type||bI[bE].type.toLowerCase()===\"text/javascript\")){bA.push(bI[bE].parentNode?bI[bE].parentNode.removeChild(bI[bE]):bI[bE])}else{if(bI[bE].nodeType===1){var bJ=b.grep(bI[bE].getElementsByTagName(\"script\"),bF);bI.splice.apply(bI,[bE+1,0].concat(bJ))}bH.appendChild(bI[bE])}}}return bI},cleanData:function(bv){var by,bw,e=b.cache,bB=b.event.special,bA=b.support.deleteExpando;for(var bz=0,bx;(bx=bv[bz])!=null;bz++){if(bx.nodeName&&b.noData[bx.nodeName.toLowerCase()]){continue}bw=bx[b.expando];if(bw){by=e[bw];if(by&&by.events){for(var bC in by.events){if(bB[bC]){b.event.remove(bx,bC)}else{b.removeEvent(bx,bC,by.handle)}}if(by.handle){by.handle.elem=null}}if(bA){delete bx[b.expando]}else{if(bx.removeAttribute){bx.removeAttribute(b.expando)}}delete e[bw]}}}});function bo(e,bv){if(bv.src){b.ajax({url:bv.src,async:false,dataType:\"script\"})}else{b.globalEval((bv.text||bv.textContent||bv.innerHTML||\"\").replace(aN,\"/*$0*/\"))}if(bv.parentNode){bv.parentNode.removeChild(bv)}}var ak=/alpha\\([^)]*\\)/i,au=/opacity=([^)]*)/,z=/([A-Z]|^ms)/g,bc=/^-?\\d+(?:px)?$/i,bn=/^-?\\d/,I=/^([\\-+])=([\\-+.\\de]+)/,a7={position:\"absolute\",visibility:\"hidden\",display:\"block\"},an=[\"Left\",\"Right\"],a1=[\"Top\",\"Bottom\"],Z,aI,aX;b.fn.css=function(e,bv){if(arguments.length===2&&bv===L){return this}return b.access(this,e,bv,true,function(bx,bw,by){return by!==L?b.style(bx,bw,by):b.css(bx,bw)})};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,\"opacity\",\"opacity\");return e===\"\"?\"1\":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{\"float\":b.support.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC===\"string\"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC=\"number\"}if(bD==null||bC===\"number\"&&isNaN(bD)){return}if(bC===\"number\"&&!b.cssNumber[bz]){bD+=\"px\"}if(!bE||!(\"set\" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&\"get\" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx===\"cssFloat\"){bx=\"float\"}if(e&&\"get\" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(bx,bw,by){var e={};for(var bv in bw){e[bv]=bx.style[bv];bx.style[bv]=bw[bv]}by.call(bx);for(bv in bw){bx.style[bv]=e[bv]}}});b.curCSS=b.css;b.each([\"height\",\"width\"],function(bv,e){b.cssHooks[e]={get:function(by,bx,bw){var bz;if(bx){if(by.offsetWidth!==0){return p(by,e,bw)}else{b.swap(by,a7,function(){bz=p(by,e,bw)})}return bz}},set:function(bw,bx){if(bc.test(bx)){bx=parseFloat(bx);if(bx>=0){return bx+\"px\"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||\"\")?(parseFloat(RegExp.$1)/100)+\"\":e?\"1\":\"\"},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?\"alpha(opacity=\"+bz*100+\")\":\"\",bw=bv&&bv.filter||bx.filter||\"\";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,\"\"))===\"\"){bx.removeAttribute(\"filter\");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+\" \"+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:\"inline-block\"},function(){if(bv){e=Z(bw,\"margin-right\",\"marginRight\")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,\"-$1\").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===\"\"&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw===\"fontSize\"?\"1em\":(bv||0);bv=bx.pixelLeft+\"px\";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===\"\"?\"auto\":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw===\"width\"?by.offsetWidth:by.offsetHeight,bz=bw===\"width\"?an:a1,bx=0,e=bz.length;\n" diff --git a/src/jquery_p3_js.h b/src/jquery_p3_js.h deleted file mode 100644 index 880da7f..0000000 --- a/src/jquery_p3_js.h +++ /dev/null @@ -1,3 +0,0 @@ -"if(bA>0){if(bv!==\"border\"){for(;bx<e;bx++){if(!bv){bA-=parseFloat(b.css(by,\"padding\"+bz[bx]))||0}if(bv===\"margin\"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}else{bA-=parseFloat(b.css(by,\"border\"+bz[bx]+\"Width\"))||0}}}return bA+\"px\"}bA=Z(by,bw,bw);if(bA<0||bA==null){bA=by.style[bw]||0}bA=parseFloat(bA)||0;if(bv){for(;bx<e;bx++){bA+=parseFloat(b.css(by,\"padding\"+bz[bx]))||0;if(bv!==\"padding\"){bA+=parseFloat(b.css(by,\"border\"+bz[bx]+\"Width\"))||0}if(bv===\"margin\"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}}}return bA+\"px\"}if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,\"display\"))===\"none\")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}var k=/%20/g,ap=/\\[\\]$/,bs=/\\r?\\n/g,bq=/#.*$/,aD=/^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg,aZ=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aM=/^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,aQ=/^(?:GET|HEAD)$/,c=/^\\/\\//,M=/\\?/,a6=/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,q=/^(?:select|textarea)/i,h=/\\s+/,br=/([?&])_=[^&]*/,K=/^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=[\"*/\"]+[\"*\"];try{aE=bl.href}catch(aw){aE=av.createElement(\"a\");aE.href=\"\";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!==\"string\"){bA=by;by=\"*\"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\\+/.test(bv);if(bC){bv=bv.substr(1)||\"*\"}bB=e[bv]=e[bv]||[];bB[bC?\"unshift\":\"push\"](bA)}}}}function aW(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC===\"string\"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aW(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx[\"*\"]){bC=aW(bv,bE,bz,bD,\"*\",bx)}return bC}function am(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!==\"string\"&&A){return A.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(\" \");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx=\"GET\";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz===\"object\"){bz=b.param(bz,b.ajaxSettings.traditional);bx=\"POST\"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:\"html\",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b(\"<div>\").append(bD.replace(a6,\"\")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,\"\\r\\n\")}}):{name:bv.name,value:bw.replace(bs,\"\\r\\n\")}}).get()}});b.each(\"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split(\" \"),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each([\"get\",\"post\"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,\"script\")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,\"json\")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:\"GET\",contentType:\"application/x-www-form-urlencoded\",processData:true,async:true,accepts:{xml:\"application/xml, text/xml\",html:\"text/html\",text:\"text/plain\",json:\"application/json, text/javascript\",\"*\":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\"},converters:{\"* text\":bb.String,\"text html\":true,\"text json\":b.parseJSON,\"text xml\":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz===\"object\"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks(\"once memory\"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||\"abort\";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||\"\";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader(\"Last-Modified\"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader(\"Etag\"))){b.etag[bC]=b2}}if(bZ===304){bX=\"notmodified\";bT=true}else{try{b4=G(bD,bY);bX=\"success\";bT=true}catch(b1){bX=\"parsererror\";b3=b1}}}else{b3=bX;if(!bX||bZ){bX=\"error\";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=\"\"+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger(\"ajax\"+(bT?\"Success\":\"Error\"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger(\"ajaxComplete\",[bJ,bD]);if(!(--b.active)){b.event.trigger(\"ajaxStop\")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+\"\").replace(bq,\"\").replace(c,s[1]+\"//\");bD.dataTypes=b.trim(bD.dataType||\"*\").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]===\"http:\"?80:443))!=(s[3]||(s[1]===\"http:\"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!==\"string\"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger(\"ajaxStart\")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?\"&\":\"?\")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,\"$1_=\"+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?\"&\":\"?\")+\"_=\"+bv:\"\")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader(\"Content-Type\",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader(\"If-Modified-Since\",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader(\"If-None-Match\",b.etag[bC])}}bJ.setRequestHeader(\"Accept\",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!==\"*\"?\", \"+aV+\"; q=0.01\":\"\"):bD.accepts[\"*\"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,\"No Transport\")}else{bJ.readyState=1;if(bw){bG.trigger(\"ajaxSend\",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort(\"timeout\")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+\"=\"+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join(\"&\").replace(k,\"+\")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+\"[\"+(typeof bz===\"object\"||b.isArray(bz)?bA:\"\")+\"]\",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by===\"object\"){for(var e in by){v(bw+\"[\"+e+\"]\",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]===\"*\"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader(\"content-type\")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+\" \"+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE===\"string\"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC===\"*\"){bC=bx}else{if(bx!==\"*\"&&bx!==bC){by=bx+\" \"+bC;bF=bG[by]||bG[\"* \"+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(\" \");if(bB[0]===bx||bB[0]===\"*\"){e=bG[bB[1]+\" \"+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error(\"No conversion from \"+by.replace(\" \",\" to \"))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),u=/(\\=)\\?(&|$)|\\?\\?/i;b.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){return b.expando+\"_\"+(aC++)}});b.ajaxPrefilter(\"json jsonp\",function(bD,bA,bC){var bx=bD.contentType===\"application/x-www-form-urlencoded\"&&(typeof bD.data===\"string\");if(bD.dataTypes[0]===\"jsonp\"||bD.jsonp!==false&&(u.test(bD.url)||bx&&u.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bb[bw],e=bD.url,by=bD.data,bv=\"$1\"+bw+\"$2\";if(bD.jsonp!==false){e=e.replace(u,bv);if(bD.url===e){if(bx){by=by.replace(u,bv)}if(bD.data===by){e+=(/\\?/.test(e)?\"&\":\"?\")+bD.jsonp+\"=\"+bw}}}bD.url=e;bD.data=by;bb[bw]=function(bE){bB=[bE]};bC.always(function(){bb[bw]=bz;if(bB&&b.isFunction(bz)){bb[bw](bB[0])}});bD.converters[\"script json\"]=function(){if(!bB){b.error(bw+\" was not called\")}return bB[0]};bD.dataTypes[0]=\"json\";return\"script\"}});b.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/javascript|ecmascript/},converters:{\"text script\":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter(\"script\",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type=\"GET\";e.global=false}});b.ajaxTransport(\"script\",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName(\"head\")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement(\"script\");e.async=\"async\";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,\"success\")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var B=bb.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,y=0,N;function aL(){try{return new bb.XMLHttpRequest()}catch(bv){}}function aj(){try{return new bb.ActiveXObject(\"Microsoft.XMLHTTP\")}catch(bv){}}b.ajaxSettings.xhr=bb.ActiveXObject?function(){return !this.isLocal&&aL()||aj()}:aL;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&(\"withCredentials\" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB[\"X-Requested-With\"]){bB[\"X-Requested-With\"]=\"XMLHttpRequest\"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(B){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}bI.text=bA.responseText;try{bD=bA.statusText}catch(bJ){bD=\"\"}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++y;if(B){if(!N){N={};b(bb).unload(B)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)\n" -"}}}}})}var Q={},a8,m,aB=/^(?:toggle|show|hide)$/,aT=/^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,a3,aH=[[\"height\",\"marginTop\",\"marginBottom\",\"paddingTop\",\"paddingBottom\"],[\"width\",\"marginLeft\",\"marginRight\",\"paddingLeft\",\"paddingRight\"],[\"opacity\"]],a4;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a0(\"show\",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,\"olddisplay\")&&by===\"none\"){by=bw.style.display=\"\"}if(by===\"\"&&b.css(bw,\"display\")===\"none\"){b._data(bw,\"olddisplay\",x(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===\"\"||by===\"none\"){bw.style.display=b._data(bw,\"olddisplay\")||\"\"}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a0(\"hide\",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,\"display\");if(by!==\"none\"&&!b._data(bw,\"olddisplay\")){b._data(bw,\"olddisplay\",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display=\"none\"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw===\"boolean\";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(\":hidden\");b(this)[by?\"show\":\"hide\"]()})}else{this.animate(a0(\"toggle\",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(\":hidden\").css(\"opacity\",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bK=this.nodeType===1,bI=bK&&b(this).is(\":hidden\"),bB,bF,bD,bJ,bH,bC,bG,bL,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}bF=bz[bB];if(b.isArray(bF)){bE.animatedProperties[bB]=bF[1];bF=bz[bB]=bF[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||\"swing\"}if(bF===\"hide\"&&bI||bF===\"show\"&&!bI){return bE.complete.call(this)}if(bK&&(bB===\"height\"||bB===\"width\")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,\"display\")===\"inline\"&&b.css(this,\"float\")===\"none\"){if(!b.support.inlineBlockNeedsLayout||x(this.nodeName)===\"inline\"){this.style.display=\"inline-block\"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow=\"hidden\"}for(bD in bz){bJ=new b.fx(this,bE,bD);bF=bz[bD];if(aB.test(bF)){bA=b._data(this,\"toggle\"+bD)||(bF===\"toggle\"?bI?\"show\":\"hide\":0);if(bA){b._data(this,\"toggle\"+bD,bA===\"show\"?\"hide\":\"show\");bJ[bA]()}else{bJ[bF]()}}else{bH=aT.exec(bF);bC=bJ.cur();if(bH){bG=parseFloat(bH[2]);bL=bH[3]||(b.cssNumber[bD]?\"\":\"px\");if(bL!==\"px\"){b.style(this,bD,(bG||1)+bL);bC=((bG||1)/bJ.cur())*bC;b.style(this,bD,bC+bL)}if(bH[1]){bG=((bH[1]===\"-=\"?-1:1)*bG)+bC}bJ.custom(bC,bG,bL)}else{bJ.custom(bC,bF,\"\")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!==\"string\"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||\"fx\",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(\".run\")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+\".run\"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bh(){setTimeout(at,0);return(a4=b.now())}function at(){a4=L}function a0(bv,e){var bw={};b.each(aH.concat.apply([],aH.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a0(\"show\",1),slideUp:a0(\"hide\",1),slideToggle:a0(\"toggle\",1),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw===\"object\"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration===\"number\"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue=\"fx\"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(bw,bx,e,bv){return e+bv*bw},swing:function(bw,bx,e,bv){return((-Math.cos(bw*Math.PI)/2)+0.5)*bv+e}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv===\"auto\"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a4||bh();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?\"\":\"px\");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(e.options.hide&&b._data(e.elem,\"fxshow\"+e.prop)===L){b._data(e.elem,\"fxshow\"+e.prop,e.start)}};if(bv()&&b.timers.push(bv)&&!a3){a3=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,\"fxshow\"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop===\"width\"||this.prop===\"height\"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,\"fxshow\"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a4||bh(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each([\"\",\"X\",\"Y\"],function(bC,bD){bz.style[\"overflow\"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,\"fxshow\"+bA,true);b.removeData(bz,\"toggle\"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a3);a3=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,\"opacity\",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each([\"width\",\"height\"],function(e,bv){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function x(bx){if(!Q[bx]){var e=av.body,bv=b(\"<\"+bx+\">\").appendTo(e),bw=bv.css(\"display\");bv.remove();if(bw===\"none\"||bw===\"\"){if(!a8){a8=av.createElement(\"iframe\");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode===\"CSS1Compat\"?\"<!doctype html>\":\"\")+\"<html><body>\");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,\"display\");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if(\"getBoundingClientRect\" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position===\"fixed\"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!==\"visible\"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position===\"relative\"||e.position===\"static\"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position===\"fixed\"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,\"marginTop\"))||0;bv+=parseFloat(b.css(e,\"marginLeft\"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,\"position\");if(bB===\"static\"){bx.style.position=\"relative\"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,\"top\"),bE=b.css(bx,\"left\"),bF=(bB===\"absolute\"||bB===\"fixed\")&&b.inArray(\"auto\",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if(\"using\" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,\"marginTop\"))||0;bx.left-=parseFloat(b.css(bw,\"marginLeft\"))||0;e.top+=parseFloat(b.css(bv[0],\"borderTopWidth\"))||0;e.left+=parseFloat(b.css(bv[0],\"borderLeftWidth\"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,\"position\")===\"static\")){e=e.offsetParent}return e})}});b.each([\"Left\",\"Top\"],function(bv,e){var bw=\"scroll\"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?(\"pageXOffset\" in by)?by[bv?\"pageYOffset\":\"pageXOffset\"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each([\"Height\",\"Width\"],function(bv,e){var bw=e.toLowerCase();b.fn[\"inner\"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,\"padding\")):this[bw]():null};b.fn[\"outer\"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?\"margin\":\"border\")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement[\"client\"+e],bx=bA.document.body;return bA.document.compatMode===\"CSS1Compat\"&&bB||bx&&bx[\"client\"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement[\"client\"+e],bA.body[\"scroll\"+e],bA.documentElement[\"scroll\"+e],bA.body[\"offset\"+e],bA.documentElement[\"offset\"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz===\"string\"?bz:bz+\"px\")}}}}});bb.jQuery=bb.$=b;if(typeof define===\"function\"&&define.amd&&define.amd.jQuery){define(\"jquery\",[],function(){return b\n" -"})}})(window);\n" diff --git a/src/jquery_pt_js.h b/src/jquery_pt_js.h deleted file mode 100644 index 27ba1c2..0000000 --- a/src/jquery_pt_js.h +++ /dev/null @@ -1,8 +0,0 @@ -"/*!\n" -" PowerTip - v1.2.0 - 2013-04-03\n" -" http://stevenbenner.github.com/jquery-powertip/\n" -" Copyright (c) 2013 Steven Benner (http://stevenbenner.com/).\n" -" Released under MIT license.\n" -" https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt\n" -"*/\n" -"(function(a){if(typeof define===\"function\"&&define.amd){define([\"jquery\"],a)}else{a(jQuery)}}(function(k){var A=k(document),s=k(window),w=k(\"body\");var n=\"displayController\",e=\"hasActiveHover\",d=\"forcedOpen\",u=\"hasMouseMove\",f=\"mouseOnToPopup\",g=\"originalTitle\",y=\"powertip\",o=\"powertipjq\",l=\"powertiptarget\",E=180/Math.PI;var c={isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var p={none:0,top:1,bottom:2,left:4,right:8};k.fn.powerTip=function(F,N){if(!this.length){return this}if(k.type(F)===\"string\"&&k.powerTip[F]){return k.powerTip[F].call(this,this,N)}var O=k.extend({},k.fn.powerTip.defaults,F),G=new x(O);h();this.each(function M(){var R=k(this),Q=R.data(y),P=R.data(o),T=R.data(l),S;if(R.data(n)){k.powerTip.destroy(R)}S=R.attr(\"title\");if(!Q&&!T&&!P&&S){R.data(y,S);R.data(g,S);R.removeAttr(\"title\")}R.data(n,new t(R,O,G))});if(!O.manual){this.on({\"mouseenter.powertip\":function J(P){k.powerTip.show(this,P)},\"mouseleave.powertip\":function L(){k.powerTip.hide(this)},\"focus.powertip\":function K(){k.powerTip.show(this)},\"blur.powertip\":function H(){k.powerTip.hide(this,true)},\"keydown.powertip\":function I(P){if(P.keyCode===27){k.powerTip.hide(this,true)}}})}return this};k.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:\"powerTip\",intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:\"n\",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false};k.fn.powerTip.smartPlacementLists={n:[\"n\",\"ne\",\"nw\",\"s\"],e:[\"e\",\"ne\",\"se\",\"w\",\"nw\",\"sw\",\"n\",\"s\",\"e\"],s:[\"s\",\"se\",\"sw\",\"n\"],w:[\"w\",\"nw\",\"sw\",\"e\",\"ne\",\"se\",\"n\",\"s\",\"w\"],nw:[\"nw\",\"w\",\"sw\",\"n\",\"s\",\"se\",\"nw\"],ne:[\"ne\",\"e\",\"se\",\"n\",\"s\",\"sw\",\"ne\"],sw:[\"sw\",\"w\",\"nw\",\"s\",\"n\",\"ne\",\"sw\"],se:[\"se\",\"e\",\"ne\",\"s\",\"n\",\"nw\",\"se\"],\"nw-alt\":[\"nw-alt\",\"n\",\"ne-alt\",\"sw-alt\",\"s\",\"se-alt\",\"w\",\"e\"],\"ne-alt\":[\"ne-alt\",\"n\",\"nw-alt\",\"se-alt\",\"s\",\"sw-alt\",\"e\",\"w\"],\"sw-alt\":[\"sw-alt\",\"s\",\"se-alt\",\"nw-alt\",\"n\",\"ne-alt\",\"w\",\"e\"],\"se-alt\":[\"se-alt\",\"s\",\"sw-alt\",\"ne-alt\",\"n\",\"nw-alt\",\"e\",\"w\"]};k.powerTip={show:function z(F,G){if(G){i(G);c.previousX=G.pageX;c.previousY=G.pageY;k(F).data(n).show()}else{k(F).first().data(n).show(true,true)}return F},reposition:function r(F){k(F).first().data(n).resetPosition();return F},hide:function D(G,F){if(G){k(G).first().data(n).hide(F)}else{if(c.activeHover){c.activeHover.data(n).hide(true)}}return G},destroy:function C(G){k(G).off(\".powertip\").each(function F(){var I=k(this),H=[g,n,e,d];if(I.data(g)){I.attr(\"title\",I.data(g));H.push(y)}I.removeData(H)});return G}};k.powerTip.showTip=k.powerTip.show;k.powerTip.closeTip=k.powerTip.hide;function b(){var F=this;F.top=\"auto\";F.left=\"auto\";F.right=\"auto\";F.bottom=\"auto\";F.set=function(H,G){if(k.isNumeric(G)){F[H]=Math.round(G)}}}function t(K,N,F){var J=null;function L(P,Q){M();if(!K.data(e)){if(!P){c.tipOpenImminent=true;J=setTimeout(function O(){J=null;I()},N.intentPollInterval)}else{if(Q){K.data(d,true)}F.showTip(K)}}}function G(P){M();c.tipOpenImminent=false;if(K.data(e)){K.data(d,false);if(!P){c.delayInProgress=true;J=setTimeout(function O(){J=null;F.hideTip(K);c.delayInProgress=false},N.closeDelay)}else{F.hideTip(K)}}}function I(){var Q=Math.abs(c.previousX-c.currentX),O=Math.abs(c.previousY-c.currentY),P=Q+O;if(P<N.intentSensitivity){F.showTip(K)}else{c.previousX=c.currentX;c.previousY=c.currentY;L()}}function M(){J=clearTimeout(J);c.delayInProgress=false}function H(){F.resetPosition(K)}this.show=L;this.hide=G;this.cancel=M;this.resetPosition=H}function j(){function G(M,L,J,O,P){var K=L.split(\"-\")[0],N=new b(),I;if(q(M)){I=H(M,K)}else{I=F(M,K)}switch(L){case\"n\":N.set(\"left\",I.left-(J/2));N.set(\"bottom\",c.windowHeight-I.top+P);break;case\"e\":N.set(\"left\",I.left+P);N.set(\"top\",I.top-(O/2));break;case\"s\":N.set(\"left\",I.left-(J/2));N.set(\"top\",I.top+P);break;case\"w\":N.set(\"top\",I.top-(O/2));N.set(\"right\",c.windowWidth-I.left+P);break;case\"nw\":N.set(\"bottom\",c.windowHeight-I.top+P);N.set(\"right\",c.windowWidth-I.left-20);break;case\"nw-alt\":N.set(\"left\",I.left);N.set(\"bottom\",c.windowHeight-I.top+P);break;case\"ne\":N.set(\"left\",I.left-20);N.set(\"bottom\",c.windowHeight-I.top+P);break;case\"ne-alt\":N.set(\"bottom\",c.windowHeight-I.top+P);N.set(\"right\",c.windowWidth-I.left);break;case\"sw\":N.set(\"top\",I.top+P);N.set(\"right\",c.windowWidth-I.left-20);break;case\"sw-alt\":N.set(\"left\",I.left);N.set(\"top\",I.top+P);break;case\"se\":N.set(\"left\",I.left-20);N.set(\"top\",I.top+P);break;case\"se-alt\":N.set(\"top\",I.top+P);N.set(\"right\",c.windowWidth-I.left);break}return N}function F(K,J){var O=K.offset(),N=K.outerWidth(),I=K.outerHeight(),M,L;switch(J){case\"n\":M=O.left+N/2;L=O.top;break;case\"e\":M=O.left+N;L=O.top+I/2;break;case\"s\":M=O.left+N/2;L=O.top+I;break;case\"w\":M=O.left;L=O.top+I/2;break;case\"nw\":M=O.left;L=O.top;break;case\"ne\":M=O.left+N;L=O.top;break;case\"sw\":M=O.left;L=O.top+I;break;case\"se\":M=O.left+N;L=O.top+I;break}return{top:L,left:M}}function H(O,K){var S=O.closest(\"svg\")[0],N=O[0],W=S.createSVGPoint(),L=N.getBBox(),V=N.getScreenCTM(),M=L.width/2,Q=L.height/2,P=[],I=[\"nw\",\"n\",\"ne\",\"e\",\"se\",\"s\",\"sw\",\"w\"],U,X,R,T;function J(){P.push(W.matrixTransform(V))}W.x=L.x;W.y=L.y;J();W.x+=M;J();W.x+=M;J();W.y+=Q;J();W.y+=Q;J();W.x-=M;J();W.x-=M;J();W.y-=Q;J();if(P[0].y!==P[1].y||P[0].x!==P[7].x){X=Math.atan2(V.b,V.a)*E;R=Math.ceil(((X%360)-22.5)/45);if(R<1){R+=8}while(R--){I.push(I.shift())}}for(T=0;T<P.length;T++){if(I[T]===K){U=P[T];break}}return{top:U.y+c.scrollTop,left:U.x+c.scrollLeft}}this.compute=G}function x(Q){var P=new j(),O=k(\"#\"+Q.popupId);if(O.length===0){O=k(\"<div/>\",{id:Q.popupId});if(w.length===0){w=k(\"body\")}w.append(O)}if(Q.followMouse){if(!O.data(u)){A.on(\"mousemove\",M);s.on(\"scroll\",M);O.data(u,true)}}if(Q.mouseOnToPopup){O.on({mouseenter:function L(){if(O.data(f)){if(c.activeHover){c.activeHover.data(n).cancel()}}},mouseleave:function N(){if(c.activeHover){c.activeHover.data(n).hide()}}})}function I(S){S.data(e,true);O.queue(function R(T){H(S);T()})}function H(S){var U;if(!S.data(e)){return}if(c.isTipOpen){if(!c.isClosing){K(c.activeHover)}O.delay(100).queue(function R(V){H(S);V()});return}S.trigger(\"powerTipPreRender\");U=B(S);if(U){O.empty().append(U)}else{return}S.trigger(\"powerTipRender\");c.activeHover=S;c.isTipOpen=true;O.data(f,Q.mouseOnToPopup);if(!Q.followMouse){G(S);c.isFixedTipOpen=true}else{M()}O.fadeIn(Q.fadeInTime,function T(){if(!c.desyncTimeout){c.desyncTimeout=setInterval(J,500)}S.trigger(\"powerTipOpen\")})}function K(R){c.isClosing=true;c.activeHover=null;c.isTipOpen=false;c.desyncTimeout=clearInterval(c.desyncTimeout);R.data(e,false);R.data(d,false);O.fadeOut(Q.fadeOutTime,function S(){var T=new b();c.isClosing=false;c.isFixedTipOpen=false;O.removeClass();T.set(\"top\",c.currentY+Q.offset);T.set(\"left\",c.currentX+Q.offset);O.css(T);R.trigger(\"powerTipClose\")})}function M(){if(!c.isFixedTipOpen&&(c.isTipOpen||(c.tipOpenImminent&&O.data(u)))){var R=O.outerWidth(),V=O.outerHeight(),U=new b(),S,T;U.set(\"top\",c.currentY+Q.offset);U.set(\"left\",c.currentX+Q.offset);S=m(U,R,V);if(S!==p.none){T=a(S);if(T===1){if(S===p.right){U.set(\"left\",c.windowWidth-R)}else{if(S===p.bottom){U.set(\"top\",c.scrollTop+c.windowHeight-V)}}}else{U.set(\"left\",c.currentX-R-Q.offset);U.set(\"top\",c.currentY-V-Q.offset)}}O.css(U)}}function G(S){var R,T;if(Q.smartPlacement){R=k.fn.powerTip.smartPlacementLists[Q.placement];k.each(R,function(U,W){var V=m(F(S,W),O.outerWidth(),O.outerHeight());T=W;if(V===p.none){return false}})}else{F(S,Q.placement);T=Q.placement}O.addClass(T)}function F(U,T){var R=0,S,W,V=new b();V.set(\"top\",0);V.set(\"left\",0);O.css(V);do{S=O.outerWidth();W=O.outerHeight();V=P.compute(U,T,S,W,Q.offset);O.css(V)}while(++R<=5&&(S!==O.outerWidth()||W!==O.outerHeight()));return V}function J(){var R=false;if(c.isTipOpen&&!c.isClosing&&!c.delayInProgress){if(c.activeHover.data(e)===false||c.activeHover.is(\":disabled\")){R=true}else{if(!v(c.activeHover)&&!c.activeHover.is(\":focus\")&&!c.activeHover.data(d)){if(O.data(f)){if(!v(O)){R=true}}else{R=true}}}if(R){K(c.activeHover)}}}this.showTip=I;this.hideTip=K;this.resetPosition=G}function q(F){return window.SVGElement&&F[0] instanceof SVGElement}function h(){if(!c.mouseTrackingActive){c.mouseTrackingActive=true;k(function H(){c.scrollLeft=s.scrollLeft();c.scrollTop=s.scrollTop();c.windowWidth=s.width();c.windowHeight=s.height()});A.on(\"mousemove\",i);s.on({resize:function G(){c.windowWidth=s.width();c.windowHeight=s.height()},scroll:function F(){var I=s.scrollLeft(),J=s.scrollTop();if(I!==c.scrollLeft){c.currentX+=I-c.scrollLeft;c.scrollLeft=I}if(J!==c.scrollTop){c.currentY+=J-c.scrollTop;c.scrollTop=J}}})}}function i(F){c.currentX=F.pageX;c.currentY=F.pageY}function v(F){var H=F.offset(),J=F[0].getBoundingClientRect(),I=J.right-J.left,G=J.bottom-J.top;return c.currentX>=H.left&&c.currentX<=H.left+I&&c.currentY>=H.top&&c.currentY<=H.top+G}function B(I){var G=I.data(y),F=I.data(o),K=I.data(l),H,J;if(G){if(k.isFunction(G)){G=G.call(I[0])}J=G}else{if(F){if(k.isFunction(F)){F=F.call(I[0])}if(F.length>0){J=F.clone(true,true)}}else{if(K){H=k(\"#\"+K);if(H.length>0){J=H.html()}}}}return J}function m(M,L,K){var G=c.scrollTop,J=c.scrollLeft,I=G+c.windowHeight,F=J+c.windowWidth,H=p.none;if(M.top<G||Math.abs(M.bottom-c.windowHeight)-K<G){H|=p.top}if(M.top+K>I||Math.abs(M.bottom-c.windowHeight)>I){H|=p.bottom}if(M.left<J||M.right+L>F){H|=p.left}if(M.left+L>F||M.right<J){H|=p.right}return H}function a(G){var F=0;while(G){G&=G-1;F++}return F}}));\n" diff --git a/src/jquery_ui_js.h b/src/jquery_ui_js.h deleted file mode 100644 index c860682..0000000 --- a/src/jquery_ui_js.h +++ /dev/null @@ -1,40 +0,0 @@ -"/*!\n" -" * jQuery UI 1.8.18\n" -" *\n" -" * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n" -" * Dual licensed under the MIT or GPL Version 2 licenses.\n" -" * http://jquery.org/license\n" -" *\n" -" * http://docs.jquery.com/UI\n" -" */\n" -"(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:\"1.8.18\",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e===\"number\"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css(\"position\")))||(/absolute/).test(this.css(\"position\"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,\"position\",1))&&(/(auto|scroll)/).test(a.curCSS(this,\"overflow\",1)+a.curCSS(this,\"overflow-y\",1)+a.curCSS(this,\"overflow-x\",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,\"overflow\",1)+a.curCSS(this,\"overflow-y\",1)+a.curCSS(this,\"overflow-x\",1))}).eq(0)}return(/fixed/).test(this.css(\"position\"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css(\"zIndex\",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css(\"position\");if(e===\"absolute\"||e===\"relative\"||e===\"fixed\"){g=parseInt(f.css(\"zIndex\"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?\"selectstart\":\"mousedown\")+\".ui-disableSelection\",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(\".ui-disableSelection\")}});a.each([\"Width\",\"Height\"],function(g,e){var f=e===\"Width\"?[\"Left\",\"Right\"]:[\"Top\",\"Bottom\"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,\"padding\"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,\"border\"+this+\"Width\",true))||0}if(n){l-=parseFloat(a.curCSS(m,\"margin\"+this,true))||0}});return l}a.fn[\"inner\"+e]=function(i){if(i===d){return k[\"inner\"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+\"px\")})};a.fn[\"outer\"+e]=function(i,l){if(typeof i!==\"number\"){return k[\"outer\"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+\"px\")})}});function c(g,e){var j=g.nodeName.toLowerCase();if(\"area\"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!==\"map\"){return false}f=a(\"img[usemap=#\"+h+\"]\")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:\"a\"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,\"visibility\")===\"hidden\"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[\":\"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,\"tabindex\")))},tabbable:function(g){var e=a.attr(g,\"tabindex\"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement(\"div\"));f.offsetHeight;a.extend(f.style,{minHeight:\"100px\",height:\"auto\",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart=\"onselectstart\" in f;e.removeChild(f).style.display=\"none\"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h<j.length;h++){if(e.options[j[h][0]]){j[h][1].apply(e.element,f)}}}},contains:function(f,e){return document.compareDocumentPosition?f.compareDocumentPosition(e)&16:f!==e&&f.contains(e)},hasScroll:function(h,f){if(a(h).css(\"overflow\")===\"hidden\"){return false}var e=(f&&f===\"left\")?\"scrollLeft\":\"scrollTop\",g=false;if(h[e]>0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*!\n" -" * jQuery UI Widget 1.8.18\n" -" *\n" -" * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n" -" * Dual licensed under the MIT or GPL Version 2 licenses.\n" -" * http://jquery.org/license\n" -" *\n" -" * http://docs.jquery.com/UI/Widget\n" -" */\n" -"(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler(\"remove\")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b(\"*\",this).add([this]).each(function(){try{b(this).triggerHandler(\"remove\")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(\".\")[0],j;f=f.split(\".\")[1];j=g+\"-\"+f;if(!e){e=h;h=b.Widget}b.expr[\":\"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i===\"string\",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)===\"_\"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:\"widget\",widgetEventPrefix:\"\",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind(\"remove.\"+this.widgetName,function(){e.destroy()});this._create();this._trigger(\"create\");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind(\".\"+this.widgetName).removeData(this.widgetName);this.widget().unbind(\".\"+this.widgetName).removeAttr(\"aria-disabled\").removeClass(this.widgetBaseClass+\"-disabled ui-state-disabled\")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f===\"string\"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e===\"disabled\"){this.widget()[f?\"addClass\":\"removeClass\"](this.widgetBaseClass+\"-disabled ui-state-disabled\").attr(\"aria-disabled\",f)}return this},enable:function(){return this._setOption(\"disabled\",false)},disable:function(){return this._setOption(\"disabled\",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*!\n" -" * jQuery UI Mouse 1.8.18\n" -" *\n" -" * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n" -" * Dual licensed under the MIT or GPL Version 2 licenses.\n" -" * http://jquery.org/license\n" -" *\n" -" * http://docs.jquery.com/UI/Mouse\n" -" *\n" -" * Depends:\n" -" * jquery.ui.widget.js\n" -" */\n" -"(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget(\"ui.mouse\",{options:{cancel:\":input,option\",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind(\"mousedown.\"+this.widgetName,function(e){return d._mouseDown(e)}).bind(\"click.\"+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+\".preventClickEvent\")){b.removeData(e.target,d.widgetName+\".preventClickEvent\");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind(\".\"+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel==\"string\"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+\".preventClickEvent\")){b.removeData(f.target,this.widgetName+\".preventClickEvent\")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).bind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).unbind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+\".preventClickEvent\",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget(\"ui.resizable\",c.ui.mouse,{widgetEventPrefix:\"resize\",options:{alsoResize:false,animate:false,animateDuration:\"slow\",animateEasing:\"swing\",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:\"e,s,se\",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass(\"ui-resizable\");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||\"ui-resizable-helper\":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('<div class=\"ui-wrapper\" style=\"overflow: hidden;\"></div>').css({position:this.element.css(\"position\"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css(\"top\"),left:this.element.css(\"left\")}));this.element=this.element.parent().data(\"resizable\",this.element.data(\"resizable\"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css(\"marginLeft\"),marginTop:this.originalElement.css(\"marginTop\"),marginRight:this.originalElement.css(\"marginRight\"),marginBottom:this.originalElement.css(\"marginBottom\")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css(\"resize\");this.originalElement.css(\"resize\",\"none\");this._proportionallyResizeElements.push(this.originalElement.css({position:\"static\",zoom:1,display:\"block\"}));this.originalElement.css({margin:this.originalElement.css(\"margin\")});this._proportionallyResize()}this.handles=k.handles||(!c(\".ui-resizable-handle\",this.element).length?\"e,s,se\":{n:\".ui-resizable-n\",e:\".ui-resizable-e\",s:\".ui-resizable-s\",w:\".ui-resizable-w\",se:\".ui-resizable-se\",sw:\".ui-resizable-sw\",ne:\".ui-resizable-ne\",nw:\".ui-resizable-nw\"});if(this.handles.constructor==String){if(this.handles==\"all\"){this.handles=\"n,e,s,w,se,sw,ne,nw\"}var l=this.handles.split(\",\");this.handles={};for(var g=0;g<l.length;g++){var j=c.trim(l[g]),e=\"ui-resizable-\"+j;var h=c('<div class=\"ui-resizable-handle '+e+'\"></div>');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if(\"se\"==j){h.addClass(\"ui-icon ui-icon-gripsmall-diagonal-se\")}this.handles[j]=\".ui-resizable-\"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=[\"padding\",/ne|nw|n/.test(n)?\"Top\":/se|sw|s/.test(n)?\"Bottom\":/^e$/.test(n)?\"Right\":\"Left\"].join(\"\");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(\".ui-resizable-handle\",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:\"se\"}});if(k.autoHide){this._handles.hide();c(this.element).addClass(\"ui-resizable-autohide\").hover(function(){if(k.disabled){return}c(this).removeClass(\"ui-resizable-autohide\");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass(\"ui-resizable-autohide\");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass(\"ui-resizable ui-resizable-disabled ui-resizable-resizing\").removeData(\"resizable\").unbind(\".resizable\").find(\".ui-resizable-handle\").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css(\"position\"),width:f.outerWidth(),height:f.outerHeight(),top:f.css(\"top\"),left:f.css(\"left\")})).remove()}this.originalElement.css(\"resize\",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(\".ui-draggable\")||(/absolute/).test(e.css(\"position\"))){e.css({position:\"absolute\",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css(\"left\")),h=b(this.helper.css(\"top\"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio==\"number\")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(\".ui-resizable-\"+this.axis).css(\"cursor\");c(\"body\").css(\"cursor\",i==\"auto\"?this.axis+\"-resize\":i);e.addClass(\"ui-resizable-resizing\");this._propagate(\"start\",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate(\"resize\",e);h.css({top:this.position.top+\"px\",left:this.position.left+\"px\",width:this.size.width+\"px\",height:this.size.height+\"px\"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger(\"resize\",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],\"left\")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css(\"left\"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css(\"top\"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c(\"body\").css(\"cursor\",\"auto\");this.element.removeClass(\"ui-resizable-resizing\");this._propagate(\"stop\",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(h<e.maxWidth){e.maxWidth=h}if(k<e.maxHeight){e.maxHeight=k}}this._vBoundaries=e},_updateCache:function(e){var f=this.options;this.offset=this.helper.offset();if(a(e.left)){this.position.left=e.left}if(a(e.top)){this.position.top=e.top}if(a(e.height)){this.size.height=e.height}if(a(e.width)){this.size.width=e.width}},_updateRatio:function(h,g){var i=this.options,j=this.position,f=this.size,e=this.axis;if(a(h.height)){h.width=(h.height*this.aspectRatio)}else{if(a(h.width)){h.height=(h.width/this.aspectRatio)}}if(e==\"sw\"){h.left=j.left+(f.width-h.width);h.top=null}if(e==\"nw\"){h.top=j.top+(f.height-h.height);h.left=j.left+(f.width-h.width)}return h},_respectSize:function(l,g){var j=this.helper,i=this._vBoundaries,r=this._aspectRatio||g.shiftKey,q=this.axis,t=a(l.width)&&i.maxWidth&&(i.maxWidth<l.width),m=a(l.height)&&i.maxHeight&&(i.maxHeight<l.height),h=a(l.width)&&i.minWidth&&(i.minWidth>l.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f<this._proportionallyResizeElements.length;f++){var h=this._proportionallyResizeElements[f];if(!this.borderDif){var e=[h.css(\"borderTopWidth\"),h.css(\"borderRightWidth\"),h.css(\"borderBottomWidth\"),h.css(\"borderLeftWidth\")],j=[h.css(\"paddingTop\"),h.css(\"paddingRight\"),h.css(\"paddingBottom\"),h.css(\"paddingLeft\")];this.borderDif=c.map(e,function(l,n){var m=parseInt(l,10)||0,o=parseInt(j[n],10)||0;return m+o})}if(c.browser.msie&&!(!(c(g).is(\":hidden\")||c(g).parents(\":hidden\").length))){continue}h.css({height:(g.height()-this.borderDif[0]-this.borderDif[2])||0,width:(g.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var f=this.element,i=this.options;this.elementOffset=f.offset();if(this._helper){this.helper=this.helper||c('<div style=\"overflow:hidden;\"></div>');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:\"absolute\",left:this.elementOffset.left-g+\"px\",top:this.elementOffset.top-g+\"px\",zIndex:++i.zIndex});this.helper.appendTo(\"body\").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!=\"resize\"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:\"1.8.18\"});c.ui.plugin.add(\"resizable\",\"alsoResize\",{start:function(f,g){var e=c(this).data(\"resizable\"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data(\"resizable-alsoresize\",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css(\"left\"),10),top:parseInt(k.css(\"top\"),10)})})};if(typeof(i.alsoResize)==\"object\"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data(\"resizable\"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data(\"resizable-alsoresize\"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?[\"width\",\"height\"]:[\"width\",\"height\",\"top\",\"left\"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)==\"object\"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData(\"resizable-alsoresize\")}});c.ui.plugin.add(\"resizable\",\"animate\",{stop:function(i,n){var p=c(this).data(\"resizable\"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],\"left\")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css(\"left\"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css(\"top\"),10)+(p.position.top-p.originalPosition.top))||null;\n" -"p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css(\"width\"),10),height:parseInt(p.element.css(\"height\"),10),top:parseInt(p.element.css(\"top\"),10),left:parseInt(p.element.css(\"left\"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate(\"resize\",i)}})}});c.ui.plugin.add(\"resizable\",\"containment\",{start:function(f,r){var t=c(this).data(\"resizable\"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c([\"Top\",\"Right\",\"Left\",\"Bottom\"]).each(function(p,o){i[p]=b(n.css(\"padding\"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,\"left\")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data(\"resizable\"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css(\"position\"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css(\"position\"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data(\"resizable\"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css(\"position\"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css(\"position\"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add(\"resizable\",\"ghost\",{start:function(g,h){var e=c(this).data(\"resizable\"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:\"block\",position:\"relative\",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass(\"ui-resizable-ghost\").addClass(typeof i.ghost==\"string\"?i.ghost:\"\");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data(\"resizable\"),h=e.options;if(e.ghost){e.ghost.css({position:\"relative\",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data(\"resizable\"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add(\"resizable\",\"grid\",{resize:function(e,m){var p=c(this).data(\"resizable\"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid==\"number\"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*!\n" -" * jQuery hashchange event - v1.3 - 7/21/2010\n" -" * http://benalman.com/projects/jquery-hashchange-plugin/\n" -" * \n" -" * Copyright (c) 2010 \"Cowboy\" Ben Alman\n" -" * Dual licensed under the MIT and GPL licenses.\n" -" * http://benalman.com/about/license/\n" -" */\n" -"(function($,e,b){var c=\"hashchange\",h=document,f,g=$.event.special,i=h.documentMode,d=\"on\"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return\"#\"+j.replace(/^[^#]*#?(.*)$/,\"$1\")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,\"\")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex=\"-1\" title=\"empty\"/>').hide().one(\"load\",function(){r||l(a());n()}).attr(\"src\",r||\"javascript:0\").insertAfter(\"body\")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName===\"title\"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain=\"'+t+'\"<\\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);\n" diff --git a/src/lang_cfg.h b/src/lang_cfg.h index 72305af..769696c 100644 --- a/src/lang_cfg.h +++ b/src/lang_cfg.h @@ -1,40 +1,42 @@ -#define LANG_NL -#define LANG_SV +#define LANG_AM +#define LANG_AR +#define LANG_BR +#define LANG_CA +#define LANG_CN #define LANG_CZ -#define LANG_FR -#define LANG_ID -#define LANG_IT #define LANG_DE -#define LANG_JP -#define LANG_JE +#define LANG_DK +#define LANG_EN +#define LANG_EO #define LANG_ES +#define LANG_FA #define LANG_FI -#define LANG_RU +#define LANG_FR +#define LANG_GR #define LANG_HR -#define LANG_PL -#define LANG_PT #define LANG_HU -#define LANG_KR +#define LANG_ID +#define LANG_IT +#define LANG_JE +#define LANG_JP #define LANG_KE +#define LANG_KR +#define LANG_LT +#define LANG_LV +#define LANG_MK +#define LANG_NL +#define LANG_NO +#define LANG_PL +#define LANG_PT #define LANG_RO +#define LANG_RU +#define LANG_SC #define LANG_SI -#define LANG_CN -#define LANG_NO -#define LANG_MK -#define LANG_BR -#define LANG_DK #define LANG_SK -#define LANG_UA -#define LANG_GR -#define LANG_TW #define LANG_SR -#define LANG_CA -#define LANG_LT -#define LANG_ZA -#define LANG_AR -#define LANG_FA -#define LANG_SC -#define LANG_VI +#define LANG_SV #define LANG_TR -#define LANG_EO -#define LANG_AM +#define LANG_TW +#define LANG_UA +#define LANG_VI +#define LANG_ZA diff --git a/src/lang_cfg.py b/src/lang_cfg.py new file mode 100644 index 0000000..9ba1319 --- /dev/null +++ b/src/lang_cfg.py @@ -0,0 +1,8 @@ +import sys + +if (len(sys.argv) > 0): + if (sys.argv[1] == "ENONLY"): + print "#define ENGLISH_ONLY" + else: + for x in xrange(1, len(sys.argv)): + print "#define LANG_%s"%(sys.argv[x]) diff --git a/src/language.cpp b/src/language.cpp index eb88455..c993323 100644 --- a/src/language.cpp +++ b/src/language.cpp @@ -354,9 +354,9 @@ bool setTranslator(const char *langName) } #endif #ifdef LANG_SC - else if (L_EQUAL("serbian-cyrilic")) + else if (L_EQUAL("serbian-cyrillic") || L_EQUAL("serbiancyr")) /* serbiancyr for consistency with older versions */ { - theTranslator=new TranslatorSerbian; + theTranslator=new TranslatorSerbianCyrillic; } #endif #ifdef LANG_CA diff --git a/src/languages.py b/src/languages.py new file mode 100755 index 0000000..0005e88 --- /dev/null +++ b/src/languages.py @@ -0,0 +1,106 @@ +# +# This file is an aid to generated the Languages rules file. +# usage: +# python languages.py > ..\winbuild\Languages.rules +# +import os +import re + +files = [f for f in os.listdir('.') if re.match(r'translator_[a-z][a-z]\.h', f)] +new_list = [] +for f in files: + new_list.append([f,(os.path.splitext(f)[0]).replace("translator_","").upper()]) + +# +# generating file is lang_cfg.py +# the rules file has to output lang_cfg.h +# +print """\ +<?xml version="1.0" encoding="utf-8"?> +<VisualStudioToolFile + Name="languages" + Version="8.00" + > + <Rules> + <CustomBuildRule + Name="Languages" + DisplayName="Settings" + CommandLine="python $(InputPath) [AllOptions] [AdditionalOptions] > $(InputDir)../src/$(InputName).h" + Outputs="$(InputDir)../src/$(InputName).h" + FileExtensions="*.py" + AdditionalDependencies="" + ExecutionDescription="Executing languages ..." + ShowOnlyRuleProperties="false" + > + <Properties> + <EnumProperty + Name="EnglishOnly" + DisplayName="Use English Only" + Description="Use English Only" + DefaultValue="0" + > + <Values> + <EnumValue + Value="0" + Switch="" + DisplayName="Don't use English Only" + /> + <EnumValue + Value="1" + Switch="ENONLY" + DisplayName="Use English Only" + /> + </Values> + </EnumProperty> +""" +# +# generate loop, English is mandatory (so cannot be chosen) +# +for f in new_list: + if (f[1] != "EN"): + # search for the language description + fil = open(f[0], 'r') + tmp = "" + for line in fil: + if "idLanguage" in line: + tmp = line + if "}" in line: + break + elif (tmp != ""): + tmp += line + if "}" in line: + break + + tmp = tmp.replace("\n","") + l = re.sub('[^"]*"([^"]*)".*','\\1',tmp) + l1 = l.replace("-","") + # capatalize first letter + l = l.title() + print """\ + <EnumProperty + Name="%s" + DisplayName="Use %s" + Description="Use %s" + DefaultValue="1" + > + <Values> + <EnumValue + Value="0" + Switch="" + DisplayName="Don't use %s" + /> + <EnumValue + Value="1" + Switch="%s" + DisplayName="Use %s" + /> + </Values> + </EnumProperty> + """ % (l1, l, l, l, f[1], l) + +print """\ + </Properties> + </CustomBuildRule> + </Rules> +</VisualStudioToolFile> +""" diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index cdcf8b4..91064a3 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -27,6 +27,7 @@ #include "message.h" #include "parserintf.h" #include "msc.h" +#include "dia.h" #include "cite.h" #include "filedef.h" #include "config.h" @@ -1255,6 +1256,18 @@ void LatexDocVisitor::visitPost(DocMscFile *df) if (m_hide) return; endMscFile(df->hasCaption()); } + +void LatexDocVisitor::visitPre(DocDiaFile *df) +{ + if (m_hide) return; + startDiaFile(df->file(),df->width(),df->height(),df->hasCaption()); +} + +void LatexDocVisitor::visitPost(DocDiaFile *df) +{ + if (m_hide) return; + endDiaFile(df->hasCaption()); +} void LatexDocVisitor::visitPre(DocLink *lnk) { if (m_hide) return; @@ -1296,15 +1309,25 @@ void LatexDocVisitor::visitPost(DocRef *ref) } } -void LatexDocVisitor::visitPre(DocSecRefItem *) +void LatexDocVisitor::visitPre(DocSecRefItem *ref) { if (m_hide) return; m_t << "\\item \\contentsline{section}{"; + static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS"); + if (pdfHyperlinks) + { + m_t << "\\hyperlink{" << ref->file() << "_" << ref->anchor() << "}{" ; + } } void LatexDocVisitor::visitPost(DocSecRefItem *ref) { if (m_hide) return; + static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS"); + if (pdfHyperlinks) + { + m_t << "}"; + } m_t << "}{\\ref{" << ref->file() << "_" << ref->anchor() << "}}{}" << endl; } @@ -1492,6 +1515,7 @@ void LatexDocVisitor::visitPost(DocParamList *pl) void LatexDocVisitor::visitPre(DocXRefItem *x) { if (m_hide) return; + if (x->title().isEmpty()) return; m_t << "\\begin{DoxyRefDesc}{"; filter(x->title()); m_t << "}" << endl; @@ -1511,9 +1535,10 @@ void LatexDocVisitor::visitPre(DocXRefItem *x) m_t << "}]"; } -void LatexDocVisitor::visitPost(DocXRefItem *) +void LatexDocVisitor::visitPost(DocXRefItem *x) { if (m_hide) return; + if (x->title().isEmpty()) return; m_t << "\\end{DoxyRefDesc}" << endl; } @@ -1567,6 +1592,16 @@ void LatexDocVisitor::visitPost(DocVhdlFlow *) if (m_hide) return; } +void LatexDocVisitor::visitPre(DocParBlock *) +{ + if (m_hide) return; +} + +void LatexDocVisitor::visitPost(DocParBlock *) +{ + if (m_hide) return; +} + void LatexDocVisitor::filter(const char *str) { filterLatexString(m_t,str,m_insideTabbing,m_insidePre,m_insideItem); @@ -1793,3 +1828,94 @@ void LatexDocVisitor::writeMscFile(const QCString &baseName) m_t << "\\end{DoxyImageNoCaption}\n"; } +void LatexDocVisitor::startDiaFile(const QCString &fileName, + const QCString &width, + const QCString &height, + bool hasCaption + ) +{ + QCString baseName=fileName; + int i; + if ((i=baseName.findRev('/'))!=-1) + { + baseName=baseName.right(baseName.length()-i-1); + } + if ((i=baseName.find('.'))!=-1) + { + baseName=baseName.left(i); + } + baseName.prepend("dia_"); + + QCString outDir = Config_getString("LATEX_OUTPUT"); + writeDiaGraphFromFile(fileName,outDir,baseName,DIA_EPS); + if (hasCaption) + { + m_t << "\n\\begin{DoxyImage}\n"; + } + else + { + m_t << "\n\\begin{DoxyImageNoCaption}\n" + " \\mbox{"; + } + m_t << "\\includegraphics"; + if (!width.isEmpty()) + { + m_t << "[width=" << width << "]"; + } + else if (!height.isEmpty()) + { + m_t << "[height=" << height << "]"; + } + else + { + m_t << "[width=\\textwidth,height=\\textheight/2,keepaspectratio=true]"; + } + m_t << "{" << baseName; + //if (Config_getBool("USE_PDFLATEX")) + //{ + // m_t << ".pdf"; + //} + //else + //{ + // m_t << ".eps"; + //} + m_t << "}"; + + if (hasCaption) + { + m_t << "\n\\caption{"; + } +} + +void LatexDocVisitor::endDiaFile(bool hasCaption) +{ + if (m_hide) return; + m_t << "}\n"; // end caption or mbox + if (hasCaption) + { + m_t << "\\end{DoxyImage}\n"; + } + else + { + m_t << "\\end{DoxyImageNoCaption}\n"; + } +} + + +void LatexDocVisitor::writeDiaFile(const QCString &baseName) +{ + QCString shortName = baseName; + int i; + if ((i=shortName.findRev('/'))!=-1) + { + shortName=shortName.right(shortName.length()-i-1); + } + QCString outDir = Config_getString("LATEX_OUTPUT"); + writeDiaGraphFromFile(baseName+".dia",outDir,shortName,DIA_EPS); + m_t << "\n\\begin{DoxyImageNoCaption}" + " \\mbox{\\includegraphics"; + m_t << "{" << shortName << "}"; + m_t << "}\n"; // end mbox + m_t << "\\end{DoxyImageNoCaption}\n"; +} + diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h index 3fea33c..4073b7f 100644 --- a/src/latexdocvisitor.h +++ b/src/latexdocvisitor.h @@ -110,6 +110,8 @@ class LatexDocVisitor : public DocVisitor void visitPost(DocDotFile *); void visitPre(DocMscFile *); void visitPost(DocMscFile *); + void visitPre(DocDiaFile *); + void visitPost(DocDiaFile *); void visitPre(DocLink *lnk); void visitPost(DocLink *); void visitPre(DocRef *ref); @@ -134,6 +136,8 @@ class LatexDocVisitor : public DocVisitor void visitPost(DocHtmlBlockQuote *); void visitPre(DocVhdlFlow *); void visitPost(DocVhdlFlow *); + void visitPre(DocParBlock *); + void visitPost(DocParBlock *); private: @@ -168,6 +172,11 @@ class LatexDocVisitor : public DocVisitor void endMscFile(bool hasCaption); void writeMscFile(const QCString &fileName); + void startDiaFile(const QCString &fileName,const QCString &width, + const QCString &height, bool hasCaption); + void endDiaFile(bool hasCaption); + void writeDiaFile(const QCString &fileName); + void pushEnabled(); void popEnabled(); diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 49f06fe..e473e79 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -38,7 +38,7 @@ #include "filename.h" static const char doxygenLatexStyle[] = -#include "doxygen_sty.h" +#include "doxygen.sty.h" ; //static QCString filterTitle(const char *s) @@ -126,7 +126,7 @@ static void writeLatexMakefile() } t << "\techo \"Rerunning latex....\"" << endl << "\t" << latex_command << " refman.tex" << endl - << "\tlatex_count=5 ; \\" << endl + << "\tlatex_count=8 ; \\" << endl << "\twhile egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\\" << endl << "\t do \\" << endl << "\t echo \"Rerunning latex....\" ;\\" << endl @@ -154,7 +154,7 @@ static void writeLatexMakefile() t << "\tpdflatex refman" << endl; } t << "\tpdflatex refman" << endl - << "\tlatex_count=5 ; \\" << endl + << "\tlatex_count=8 ; \\" << endl << "\twhile egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\\" << endl << "\t do \\" << endl << "\t echo \"Rerunning latex....\" ;\\" << endl @@ -199,7 +199,7 @@ static void writeMakeBat() t << latex_command << " refman.tex\n"; } t << "setlocal enabledelayedexpansion\n"; - t << "set count=5\n"; + t << "set count=8\n"; t << ":repeat\n"; t << "set content=X\n"; t << "for /F \"tokens=*\" %%T in ( 'findstr /C:\"Rerun LaTeX\" refman.log' ) do set content=\"%%~T\"\n"; @@ -231,7 +231,7 @@ static void writeMakeBat() t << "echo ----\n"; t << "pdflatex refman\n\n"; t << "setlocal enabledelayedexpansion\n"; - t << "set count=5\n"; + t << "set count=8\n"; t << ":repeat\n"; t << "set content=X\n"; t << "for /F \"tokens=*\" %%T in ( 'findstr /C:\"Rerun LaTeX\" refman.log' ) do set content=\"%%~T\"\n"; @@ -525,10 +525,15 @@ static void writeDefaultFooter(FTextStream &t) Doxygen::citeDict->writeLatexBibliography(t); // Index + QCString unit; + if (Config_getBool("COMPACT_LATEX")) + unit = "section"; + else + unit = "chapter"; t << "% Index\n" "\\newpage\n" "\\phantomsection\n" - "\\addcontentsline{toc}{part}{" << theTranslator->trRTFGeneralIndex() << "}\n" + "\\addcontentsline{toc}{" << unit << "}{" << theTranslator->trRTFGeneralIndex() << "}\n" "\\printindex\n" "\n" "\\end{document}\n"; diff --git a/src/layout.cpp b/src/layout.cpp index 010c850..bc00745 100644 --- a/src/layout.cpp +++ b/src/layout.cpp @@ -33,7 +33,7 @@ #include <qtextstream.h> static const char layout_default[] = -#include "layout_default.h" +#include "layout_default.xml.h" ; #define ADD_OPTION(langId,text) "|"+QCString().setNum(langId)+"="+text diff --git a/src/libdoxycfg.t.in b/src/libdoxycfg.t.in index 270d090..3a2ce0a 100644 --- a/src/libdoxycfg.t.in +++ b/src/libdoxycfg.t.in @@ -18,6 +18,7 @@ LEX = %%FLEX%% YACC = %%BISON%% +PYTHON = %%PYTHON%% #${ sub GenerateDep { @@ -48,5 +49,5 @@ sub GenerateDep { $(LEX) -PconfigYY -t config.l >config.cpp configoptions.cpp: config.xml configgen.py - python configgen.py -cpp config.xml >configoptions.cpp + $(PYTHON) configgen.py -cpp config.xml >configoptions.cpp diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in index c4e79da..b230b2f 100644 --- a/src/libdoxygen.pro.in +++ b/src/libdoxygen.pro.in @@ -17,6 +17,7 @@ TEMPLATE = libdoxygen.t CONFIG = console warn_on staticlib $extraopts HEADERS = arguments.h \ + bib2xhtml.pl.h \ bufstr.h \ cite.h \ clangparser.h \ @@ -26,9 +27,10 @@ HEADERS = arguments.h \ code.h \ commentcnv.h \ commentscan.h \ - compound_xsd.h \ + compound.xsd.h \ condparser.h \ config.h \ + context.h \ constexp.h \ cppvalue.h \ debug.h \ @@ -45,20 +47,20 @@ HEADERS = arguments.h \ docvisitor.h \ dot.h \ doxygen.h \ - doxygen_bst.h \ - doxygen_css.h \ - doxygen_sty.h \ + doxygen.bst.h \ + doxygen.css.h \ + doxygen.sty.h \ eclipsehelp.h \ entry.h \ example.h \ filedef.h \ filename.h \ - footer_html.h \ + footer.html.h \ formula.h \ ftextstream.h \ ftvhelp.h \ groupdef.h \ - header_html.h \ + header.html.h \ htags.h \ htmlattrib.h \ htmldocvisitor.h \ @@ -66,20 +68,20 @@ HEADERS = arguments.h \ htmlhelp.h \ image.h \ index.h \ - index_xsd.h \ - jquery_p1_js.h \ - jquery_p2_js.h \ - jquery_p3_js.h \ - jquery_ui_js.h \ - jquery_fx_js.h \ - jquery_pt_js.h \ - svgpan_js.h \ - dynsections_js.h \ + index.xsd.h \ + jquery_p1.js.h \ + jquery_p2.js.h \ + jquery_p3.js.h \ + jquery_ui.js.h \ + jquery_fx.js.h \ + jquery_pt.js.h \ + svgpan.js.h \ + dynsections.js.h \ language.h \ latexdocvisitor.h \ latexgen.h \ layout.h \ - layout_default.h \ + layout_default.xml.h \ logos.h \ mandocvisitor.h \ mangen.h \ @@ -92,9 +94,10 @@ HEADERS = arguments.h \ membername.h \ message.h \ msc.h \ + dia.h \ namespacedef.h \ - navtree_css.h \ - navtree_js.h \ + navtree.css.h \ + navtree.js.h \ objcache.h \ outputgen.h \ outputlist.h \ @@ -111,63 +114,27 @@ HEADERS = arguments.h \ qhp.h \ qhpxmlwriter.h \ reflist.h \ - resize_js.h \ + resize.js.h \ rtfdocvisitor.h \ rtfgen.h \ rtfstyle.h \ scanner.h \ searchindex.h \ - search_css.h \ - search_js.h \ - extsearch_js.h \ - search_functions_php.h \ - search_opensearch_php.h \ + search.css.h \ + search.js.h \ + extsearch.js.h \ + search_functions.php.h \ + search_opensearch.php.h \ section.h \ sortdict.h \ store.h \ tagreader.h \ tclscanner.h \ + template.h \ textdocvisitor.h \ tooltip.h \ translator.h \ translator_adapter.h \ - translator_am.h \ - translator_br.h \ - translator_ca.h \ - translator_cn.h \ - translator_cz.h \ - translator_de.h \ - translator_dk.h \ - translator_en.h \ - translator_es.h \ - translator_fi.h \ - translator_fr.h \ - translator_gr.h \ - translator_hr.h \ - translator_hu.h \ - translator_id.h \ - translator_it.h \ - translator_je.h \ - translator_jp.h \ - translator_ke.h \ - translator_kr.h \ - translator_nl.h \ - translator_no.h \ - translator_mk.h \ - translator_pl.h \ - translator_pt.h \ - translator_ro.h \ - translator_ru.h \ - translator_se.h \ - translator_si.h \ - translator_sk.h \ - translator_sr.h \ - translator_tw.h \ - translator_ua.h \ - translator_vi.h \ - translator_za.h \ - types.h \ - unistd.h \ util.h \ version.h \ vhdlcode.h \ @@ -179,7 +146,7 @@ HEADERS = arguments.h \ docbookgen.h SOURCES = arguments.cpp \ - ce_lex.cpp \ + constexp.cpp \ ce_parse.cpp \ cite.cpp \ clangparser.cpp \ @@ -190,6 +157,7 @@ SOURCES = arguments.cpp \ commentcnv.cpp \ commentscan.cpp \ condparser.cpp \ + context.cpp \ cppvalue.cpp \ dbusxmlscanner.cpp \ debug.cpp \ @@ -238,6 +206,7 @@ SOURCES = arguments.cpp \ membername.cpp \ message.cpp \ msc.cpp \ + dia.cpp \ namespacedef.cpp \ objcache.cpp \ outputgen.cpp \ @@ -258,6 +227,7 @@ SOURCES = arguments.cpp \ store.cpp \ tagreader.cpp \ tclscanner.cpp \ + template.cpp \ textdocvisitor.cpp \ tooltip.cpp \ util.cpp \ @@ -273,8 +243,8 @@ SOURCES = arguments.cpp \ win32:TMAKE_CXXFLAGS += -DQT_NODLL win32-msvc:TMAKE_CXXFLAGS += -Zm200 -win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti -linux-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti +win32-g++:TMAKE_CXXFLAGS += -fno-exceptions +linux-g++:TMAKE_CXXFLAGS += -fno-exceptions INCLUDEPATH += ../qtools #INCLUDEPATH += ../libpng INCLUDEPATH += ../libmd5 diff --git a/src/libdoxygen.t.in b/src/libdoxygen.t.in index 959fd69..f131f70 100644 --- a/src/libdoxygen.t.in +++ b/src/libdoxygen.t.in @@ -18,7 +18,9 @@ LEX = %%FLEX%% YACC = %%BISON%% -INCBUFSIZE = $(PERL) increasebuffer.pl +PYTHON = %%PYTHON%% +PERL = %%PERL%% +INCBUFSIZE = $(PYTHON) increasebuffer.py #${ sub GenerateDep { @@ -41,155 +43,176 @@ sub GenerateDep { } chop $text; } +sub GenerateLex { + my($name,$caseOpt) = @_; + $text = "\t\$(LEX) "; + if ($caseOpt) { + $text .= "-i "; + } + $text .= "-P".$name."YY -t ".$name.".l | \$(INCBUFSIZE) >".$name.".cpp"; +} #$} #################### #$ GenerateDep("scanner.cpp","scanner.l"); - $(LEX) -PscanYY -t scanner.l | $(INCBUFSIZE) >scanner.cpp +#$ GenerateLex("scanner",0); #$ GenerateDep("code.cpp","code.l"); - $(LEX) -PcodeYY -t code.l | $(INCBUFSIZE) >code.cpp +#$ GenerateLex("code",0); #$ GenerateDep("pyscanner.cpp","pyscanner.l"); - $(LEX) -PpyscanYY -t pyscanner.l | $(INCBUFSIZE) >pyscanner.cpp +#$ GenerateLex("pyscanner",0); #$ GenerateDep("pycode.cpp","pycode.l"); - $(LEX) -PpycodeYY -t pycode.l | $(INCBUFSIZE) >pycode.cpp +#$ GenerateLex("pycode",0); #$ GenerateDep("fortranscanner.cpp","fortranscanner.l"); - $(LEX) -i -PfscanYY -t fortranscanner.l | $(INCBUFSIZE) >fortranscanner.cpp +#$ GenerateLex("fortranscanner",1); #$ GenerateDep("fortrancode.cpp","fortrancode.l"); - $(LEX) -i -PfcodeYY -t fortrancode.l | $(INCBUFSIZE) >fortrancode.cpp +#$ GenerateLex("fortrancode",1); #$ GenerateDep("vhdlcode.cpp","vhdlcode.l"); - $(LEX) -i -PvhdlcodeYY -t vhdlcode.l | $(INCBUFSIZE) >vhdlcode.cpp +#$ GenerateLex("vhdlcode",1); #$ GenerateDep("tclscanner.cpp","tclscanner.l"); - $(LEX) -i -PtclscanYY -t tclscanner.l | $(INCBUFSIZE) >tclscanner.cpp +#$ GenerateLex("tclscanner",1); #$ GenerateDep("pre.cpp","pre.l"); - $(LEX) -PpreYY -t pre.l | $(INCBUFSIZE) >pre.cpp +#$ GenerateLex("pre",0); #$ GenerateDep("declinfo.cpp","declinfo.l"); - $(LEX) -PdeclinfoYY -t declinfo.l | $(INCBUFSIZE) >declinfo.cpp +#$ GenerateLex("declinfo",0); #$ GenerateDep("defargs.cpp","defargs.l"); - $(LEX) -PdefargsYY -t defargs.l | $(INCBUFSIZE) >defargs.cpp +#$ GenerateLex("defargs",0); #$ GenerateDep("doctokenizer.cpp","doctokenizer.l"); - $(LEX) -PdoctokenizerYY -t doctokenizer.l | $(INCBUFSIZE) >doctokenizer.cpp +#$ GenerateLex("doctokenizer",0); #$ GenerateDep("commentcnv.cpp","commentcnv.l"); - $(LEX) -PcommentcnvYY -t commentcnv.l | $(INCBUFSIZE) >commentcnv.cpp +#$ GenerateLex("commentcnv",0); #$ GenerateDep("commentscan.cpp","commentscan.l"); - $(LEX) -PcommentScanYY -t commentscan.l | $(INCBUFSIZE) >commentscan.cpp +#$ GenerateLex("commentscan",0); -#$ GenerateDep("ce_lex.cpp","constexp.l","ce_parse.h"); - $(LEX) -PcppExpYY -t constexp.l | $(INCBUFSIZE) >ce_lex.cpp +#$ GenerateDep("constexp.cpp","constexp.l","ce_parse.h"); +#$ GenerateLex("constexp",0); #$ GenerateDep("ce_parse.cpp","constexp.y"); - $(YACC) -l -p cppExpYY constexp.y -o ce_parse.cpp + $(YACC) -l -p constexpYY constexp.y -o ce_parse.cpp #$ GenerateDep("ce_parse.h","constexp.y"); - $(YACC) -l -d -p cppExpYY constexp.y -o ce_parse.c + $(YACC) -l -d -p ce_parsexpYY constexp.y -o ce_parse.c -rm ce_parse.c #$ GenerateDep("vhdlscanner.cpp","vhdlscanner.l","vhdlparser.h"); - $(LEX) -i -PvhdlScanYY -t vhdlscanner.l | $(INCBUFSIZE) >vhdlscanner.cpp +#$ GenerateLex("vhdlscanner",1); #$ GenerateDep("vhdlparser.cpp","vhdlparser.y"); - $(YACC) -l -p vhdlScanYY vhdlparser.y -o vhdlparser.cpp + $(YACC) -l -p vhdlscannerYY vhdlparser.y -o vhdlparser.cpp #$ GenerateDep("vhdlparser.h","vhdlparser.y"); - $(YACC) -l -d -p vhdlScanYY vhdlparser.y -o vhdlparser.c + $(YACC) -l -d -p vhdlscannerYY vhdlparser.y -o vhdlparser.c -rm vhdlparser.c -#$ GenerateDep("layout.cpp","layout_default.h"); +#$ GenerateDep("layout.cpp","layout_default.xml.h"); + +TO_C_CMD=$(PYTHON) to_c_cmd.py < $< > $@ + +cite.cpp: doxygen.bst.h bib2xhtml.pl.h + +ftvhelp.cpp: navtree.js.h resize.js.h navtree.css.h + +htmlgen.cpp: header.html.h footer.html.h doxygen.css.h search_functions.php.h \ + search_opensearch.php.h search.css.h jquery_p1.js.h jquery_p2.js.h \ + jquery_p3.js.h jquery_ui.js.h jquery_fx.js.h jquery_pt.js.h \ + svgpan.js.h dynsections.js.h extsearch.js.h + +layout.cpp: layout_default.xml.h -TO_C_CMD=sed -e "s/\\\\/\\\\\\\\/g" -e "s/\"/\\\\\"/g" -e "s/^/\"/g" -e "s/$$/\\\\n\"/g" +xmlgen.cpp: index.xsd.h compound.xsd.h -index_xsd.h: index.xsd - cat index.xsd | $(TO_C_CMD) >index_xsd.h +latexgen.cpp: doxygen.sty.h -compound_xsd.h: compound.xsd - cat compound.xsd | $(TO_C_CMD) >compound_xsd.h +searchindex.cpp: search.js.h -layout_default.h: layout_default.xml - cat layout_default.xml | $(TO_C_CMD) >layout_default.h +index.xsd.h: index.xsd + $(TO_C_CMD) -header_html.h: header.html - cat header.html | $(TO_C_CMD) >header_html.h +compound.xsd.h: compound.xsd + $(TO_C_CMD) -footer_html.h: footer.html - cat footer.html | $(TO_C_CMD) >footer_html.h +layout_default.xml.h: layout_default.xml + $(TO_C_CMD) -search_functions_php.h: search_functions.php - cat search_functions.php | $(TO_C_CMD) >search_functions_php.h +header.html.h: header.html + $(TO_C_CMD) -search_opensearch_php.h: search_opensearch.php - cat search_opensearch.php | $(TO_C_CMD) >search_opensearch_php.h +footer.html.h: footer.html + $(TO_C_CMD) -search_js.h: search.js - cat search.js | $(TO_C_CMD) >search_js.h +search_functions.php.h: search_functions.php + $(TO_C_CMD) -search_css.h: search.css - cat search.css | $(TO_C_CMD) >search_css.h +search_opensearch.php.h: search_opensearch.php + $(TO_C_CMD) -extsearch_js.h: extsearch.js - cat extsearch.js | $(TO_C_CMD) >extsearch_js.h +search.js.h: search.js + $(TO_C_CMD) -doxygen_css.h: doxygen.css - cat doxygen.css | $(TO_C_CMD) >doxygen_css.h +search.css.h: search.css + $(TO_C_CMD) -doxygen_sty.h: doxygen.sty - cat doxygen.sty | $(TO_C_CMD) >doxygen_sty.h +extsearch.js.h: extsearch.js + $(TO_C_CMD) -navtree_js.h: navtree.js - cat navtree.js | $(TO_C_CMD) >navtree_js.h +doxygen.css.h: doxygen.css + $(TO_C_CMD) -navindex_js.h: navindex.js - cat navindex.js | $(TO_C_CMD) >navindex_js.h +doxygen.sty.h: doxygen.sty + $(TO_C_CMD) -resize_js.h: resize.js - cat resize.js | $(TO_C_CMD) >resize_js.h -jquery_p1_js.h: jquery_p1.js - cat jquery_p1.js | $(TO_C_CMD) >jquery_p1_js.h +navtree.js.h: navtree.js + $(TO_C_CMD) -jquery_p2_js.h: jquery_p2.js - cat jquery_p2.js | $(TO_C_CMD) >jquery_p2_js.h +resize.js.h: resize.js + $(TO_C_CMD) -jquery_p3_js.h: jquery_p3.js - cat jquery_p3.js | $(TO_C_CMD) >jquery_p3_js.h +jquery_p1.js.h: jquery_p1.js + $(TO_C_CMD) -jquery_p4_js.h: jquery_p4.js - cat jquery_p4.js | $(TO_C_CMD) >jquery_p4_js.h +jquery_p2.js.h: jquery_p2.js + $(TO_C_CMD) -jquery_ui_js.h: jquery_ui.js - cat jquery_ui.js | $(TO_C_CMD) >jquery_ui_js.h +jquery_p3.js.h: jquery_p3.js + $(TO_C_CMD) -jquery_fx_js.h: jquery_fx.js - cat jquery_fx.js | $(TO_C_CMD) >jquery_fx_js.h +jquery_ui.js.h: jquery_ui.js + $(TO_C_CMD) -jquery_pt_js.h: jquery_pt.js - cat jquery_pt.js | $(TO_C_CMD) >jquery_pt_js.h +jquery_fx.js.h: jquery_fx.js + $(TO_C_CMD) -navtree_css.h: navtree.css - cat navtree.css | $(TO_C_CMD) >navtree_css.h +jquery_pt.js.h: jquery_pt.js + $(TO_C_CMD) -svgpan_js.h: svgpan.js - cat svgpan.js | $(TO_C_CMD) >svgpan_js.h +navtree.css.h: navtree.css + $(TO_C_CMD) -dynsections_js.h: dynsections.js - cat dynsections.js | $(TO_C_CMD) >dynsections_js.h +svgpan.js.h: svgpan.js + $(TO_C_CMD) -doxygen_bst.h: doxygen.bst - cat doxygen.bst | $(TO_C_CMD) >doxygen_bst.h +dynsections.js.h: dynsections.js + $(TO_C_CMD) -bib2xhtml.h: bib2xhtml.pl - cat bib2xhtml.pl | $(TO_C_CMD) >bib2xhtml.h +doxygen.bst.h: doxygen.bst + $(TO_C_CMD) +bib2xhtml.pl.h: bib2xhtml.pl + $(TO_C_CMD) +version.cpp: ../configure + $(PYTHON) version.py diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index 18f93bb..729f3d4 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -775,6 +775,13 @@ void ManDocVisitor::visitPost(DocMscFile *) { } +void ManDocVisitor::visitPre(DocDiaFile *) +{ +} + +void ManDocVisitor::visitPost(DocDiaFile *) +{ +} void ManDocVisitor::visitPre(DocLink *) { @@ -926,6 +933,7 @@ void ManDocVisitor::visitPost(DocParamList *pl) void ManDocVisitor::visitPre(DocXRefItem *x) { if (m_hide) return; + if (x->title().isEmpty()) return; if (!m_firstCol) { m_t << endl; @@ -937,9 +945,10 @@ void ManDocVisitor::visitPre(DocXRefItem *x) m_t << ".RS 4" << endl; } -void ManDocVisitor::visitPost(DocXRefItem *) +void ManDocVisitor::visitPost(DocXRefItem *x) { if (m_hide) return; + if (x->title().isEmpty()) return; if (!m_firstCol) m_t << endl; m_t << ".RE" << endl; m_t << ".PP" << endl; @@ -1002,6 +1011,14 @@ void ManDocVisitor::visitPost(DocVhdlFlow *) { } +void ManDocVisitor::visitPre(DocParBlock *) +{ +} + +void ManDocVisitor::visitPost(DocParBlock *) +{ +} + void ManDocVisitor::filter(const char *str) { diff --git a/src/mandocvisitor.h b/src/mandocvisitor.h index cc4e85f..7012152 100644 --- a/src/mandocvisitor.h +++ b/src/mandocvisitor.h @@ -107,6 +107,8 @@ class ManDocVisitor : public DocVisitor void visitPost(DocDotFile *); void visitPre(DocMscFile *); void visitPost(DocMscFile *); + void visitPre(DocDiaFile *); + void visitPost(DocDiaFile *); void visitPre(DocLink *lnk); void visitPost(DocLink *); void visitPre(DocRef *ref); @@ -133,6 +135,8 @@ class ManDocVisitor : public DocVisitor void visitPost(DocHtmlBlockQuote *); void visitPre(DocVhdlFlow *); void visitPost(DocVhdlFlow *); + void visitPre(DocParBlock *); + void visitPost(DocParBlock *); private: diff --git a/src/markdown.cpp b/src/markdown.cpp index 63d6cfc..ac824f4 100644 --- a/src/markdown.cpp +++ b/src/markdown.cpp @@ -850,9 +850,15 @@ static int processLink(GrowBuf &out,const char *data,int,int size) } else { - if (link.find("@ref ")!=-1 || link.find("\\ref ")!=-1) + SrcLangExt lang = getLanguageFromFileName(link); + int lp=-1; + if ((lp=link.find("@ref "))!=-1 || (lp=link.find("\\ref "))!=-1 || lang==SrcLangExt_Markdown) // assume doxygen symbol link { + if (lp==-1) // link to markdown page + { + out.addStr("@ref "); + } out.addStr(link); out.addStr(" \""); if (explicitTitle && !title.isEmpty()) @@ -1968,6 +1974,9 @@ static QCString processBlocks(const QCString &s,int indent) end++; } +#if 0 // commented out, since starting with a comment block is probably a usage error + // see also http://stackoverflow.com/q/20478611/784672 + // special case when the documentation starts with a code block // since the first line is skipped when looking for a code block later on. if (end>codeBlockIndent && isCodeBlock(data,0,end,blockIndent)) @@ -1976,6 +1985,7 @@ static QCString processBlocks(const QCString &s,int indent) end=i+1; pi=-1; } +#endif // process each line while (i<size) @@ -2249,6 +2259,15 @@ QCString processMarkdown(const QCString &fileName,Entry *e,const QCString &input //--------------------------------------------------------------------------- +QCString markdownFileNameToId(const QCString &fileName) +{ + QCString baseFn = stripFromPath(QFileInfo(fileName).absFilePath().utf8()); + int i = baseFn.findRev('.'); + if (i!=-1) baseFn = baseFn.left(i); + QCString baseName = substitute(substitute(baseFn," ","_"),"/","_"); + return "md_"+baseName; +} + void MarkdownFileParser::parseInput(const char *fileName, const char *fileBuf, Entry *root, @@ -2270,17 +2289,16 @@ void MarkdownFileParser::parseInput(const char *fileName, QCString docs = output.data(); QCString id; QCString title=extractPageTitle(docs,id).stripWhiteSpace(); - //g_correctSectionLevel = !title.isEmpty(); - QCString baseFn = stripFromPath(QFileInfo(fileName).absFilePath().utf8()); - int i = baseFn.findRev('.'); - if (i!=-1) baseFn = baseFn.left(i); QCString titleFn = QFileInfo(fileName).baseName().utf8(); QCString fn = QFileInfo(fileName).fileName().utf8(); - QCString baseName = substitute(substitute(baseFn," ","_"),"/","_"); static QCString mdfileAsMainPage = Config_getString("USE_MDFILE_AS_MAINPAGE"); - if (id.isEmpty()) id = "md_"+baseName; + if (id.isEmpty()) id = markdownFileNameToId(fileName); if (title.isEmpty()) title = titleFn; - if (fn==mdfileAsMainPage) + if (!mdfileAsMainPage.isEmpty() && + (fn==mdfileAsMainPage || // name reference + QFileInfo(fileName).absFilePath()== + QFileInfo(mdfileAsMainPage).absFilePath()) // file reference with path + ) { docs.prepend("@mainpage\n"); } @@ -2347,7 +2365,8 @@ void MarkdownFileParser::parseCode(CodeOutputInterface &codeOutIntf, bool inlineFragment, MemberDef *memberDef, bool showLineNumbers, - Definition *searchCtx + Definition *searchCtx, + bool collectXRefs ) { ParserInterface *pIntf = Doxygen::parserManager->getParser("*.cpp"); @@ -2355,7 +2374,8 @@ void MarkdownFileParser::parseCode(CodeOutputInterface &codeOutIntf, { pIntf->parseCode( codeOutIntf,scopeName,input,lang,isExampleBlock,exampleName, - fileDef,startLine,endLine,inlineFragment,memberDef,showLineNumbers,searchCtx); + fileDef,startLine,endLine,inlineFragment,memberDef,showLineNumbers, + searchCtx,collectXRefs); } } diff --git a/src/markdown.h b/src/markdown.h index daabc33..d3a845e 100644 --- a/src/markdown.h +++ b/src/markdown.h @@ -23,6 +23,7 @@ class Entry; /** processes string \a s and converts markdown into doxygen/html commands. */ QCString processMarkdown(const QCString &fileName,Entry *e,const QCString &s); +QCString markdownFileNameToId(const QCString &fileName); class MarkdownFileParser : public ParserInterface { @@ -48,7 +49,8 @@ class MarkdownFileParser : public ParserInterface bool inlineFragment=FALSE, MemberDef *memberDef=0, bool showLineNumbers=TRUE, - Definition *searchCtx=0 + Definition *searchCtx=0, + bool collectXRefs=TRUE ); void resetCodeParserState(); void parsePrototype(const char *text); diff --git a/src/memberdef.cpp b/src/memberdef.cpp index d9b9ce9..4d7ea9f 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -3,8 +3,8 @@ * Copyright (C) 1997-2013 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * @@ -71,9 +71,9 @@ static QCString addTemplateNames(const QCString &s,const QCString &n,const QCStr if (s.length()==j || (s.at(j)!='<' && !isId(s.at(j)))) { // add template names //printf("Adding %s+%s\n",clRealName.data(),t.data()); - result+=clRealName+t; + result+=clRealName+t; } - else + else { // template names already present //printf("Adding %s\n",clRealName.data()); result+=clRealName; @@ -116,19 +116,18 @@ static QCString addTemplateNames(const QCString &s,const QCString &n,const QCStr // --- leave writeDefArgumentList with return value FALSE // ol.endMemberDocName // ol.endMemberDoc(hasArgs=FALSE); -// +// static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, const QCString & /*scopeName*/,MemberDef *md) { - ArgumentList *defArgList=(md->isDocsForDefinition()) ? + ArgumentList *defArgList=(md->isDocsForDefinition()) ? md->argumentList() : md->declArgumentList(); //printf("writeDefArgumentList `%s' isDocsForDefinition()=%d\n",md->name().data(),md->isDocsForDefinition()); - if (defArgList==0 || md->isProperty()) + if (defArgList==0 || md->isProperty()) { return FALSE; // member has no function like argument list } - if (!md->isDefine()) ol.docify(" "); // simple argument list for tcl if (md->getLanguage()==SrcLangExt_Tcl) @@ -140,7 +139,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, ol.startParameterType(TRUE,0); ol.endParameterType(); ol.startParameterName(FALSE); - while (a) + while (a) { if (a->defval.isEmpty()) { @@ -156,6 +155,8 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, return TRUE; } + if (!md->isDefine()) ol.docify(" "); + //printf("writeDefArgList(%d)\n",defArgList->count()); ol.pushGeneratorState(); //ol.disableAllBut(OutputGenerator::Html); @@ -167,7 +168,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, if (latexOn) ol.enable(OutputGenerator::Latex); ol.endMemberDocName(); - ol.startParameterList(!md->isObjCMethod()); + ol.startParameterList(!md->isObjCMethod()); } ol.enableAll(); ol.disable(OutputGenerator::Html); @@ -194,7 +195,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, } else if (cd->templateArguments()) { - cName=tempArgListToString(cd->templateArguments()); + cName=tempArgListToString(cd->templateArguments()); //printf("2. cName=%s\n",cName.data()); } else // no template specifier @@ -209,7 +210,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, bool isDefine = md->isDefine(); while (a) { - if (isDefine || first) + if (isDefine || first) { ol.startParameterType(first,0); paramTypeStarted=TRUE; @@ -224,7 +225,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, int wp=a->type.find(res); // use the following to put the function pointer type before the name - bool hasFuncPtrType=FALSE; + bool hasFuncPtrType=FALSE; if (!a->attrib.isEmpty() && !md->isObjCMethod()) // argument has an IDL attribute { @@ -251,7 +252,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, } if (!isDefine) { - if (paramTypeStarted) + if (paramTypeStarted) { ol.endParameterType(); paramTypeStarted=FALSE; @@ -260,10 +261,10 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, } if (hasFuncPtrType) { - ol.docify(a->type.mid(wp,vp-wp)); + ol.docify(a->type.mid(wp,vp-wp)); } - if (!a->name.isEmpty() || (a->name.isEmpty() && a->type=="...")) // argument has a name - { + if (!a->name.isEmpty() || a->type=="...") // argument has a name + { //if (!hasFuncPtrType) //{ // ol.docify(" "); @@ -284,7 +285,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, { ol.docify(a->array); } - if (hasFuncPtrType) // write the part of the argument type + if (hasFuncPtrType) // write the part of the argument type // that comes after the name { linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(), @@ -297,15 +298,15 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, ol.docify(" = "); ol.startTypewriter(); - linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md,n,FALSE,TRUE,TRUE); + linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md,n,FALSE,TRUE,TRUE); ol.endTypewriter(); } a=defArgList->next(); - if (a) + if (a) { if (!md->isObjCMethod()) ol.docify(", "); // there are more arguments - if (!isDefine) + if (!isDefine) { QCString key; if (md->isObjCMethod() && a->attrib.length()>=2) @@ -316,7 +317,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, if (key!=",") key+=":"; // for normal keywords add colon } ol.endParameterName(FALSE,FALSE,!md->isObjCMethod()); - if (paramTypeStarted) + if (paramTypeStarted) { ol.endParameterType(); } @@ -360,7 +361,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, md, // self defArgList->trailingReturnType, // text FALSE // autoBreak - ); + ); } return TRUE; @@ -370,12 +371,13 @@ static void writeExceptionListImpl( OutputList &ol, ClassDef *cd, MemberDef *md, QCString const& exception) { // this is ordinary exception spec - there must be a '(' + //printf("exception='%s'\n",exception.data()); int index = exception.find('('); - if (-1!=index) + if (index!=-1) { ol.exceptionEntry(exception.left(index),false); ++index; // paren in second column so skip it here - for (int comma = exception.find(',', index); -1!=comma; ) + for (int comma = exception.find(',', index); comma!=-1; ) { ++comma; // include comma linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md, @@ -385,21 +387,20 @@ static void writeExceptionListImpl( comma = exception.find(',', index); } int close = exception.find(')', index); - if (-1!=close) + if (close!=-1) { QCString type=removeRedundantWhiteSpace(exception.mid(index,close-index)); linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md,type); ol.exceptionEntry(0,true); } else - warn(md->getDefFileName(),md->getDefLine(), - "missing ) in exception list on member %s",qPrint(md->name())); + { + warn(md->getDefFileName(),md->getDefLine(), + "missing ) in exception list on member %s",qPrint(md->name())); + } } - else + else // Java Exception { - // fallback - is it possible to get here? - warn(md->getDefFileName(),md->getDefLine(), - "missing ( in exception list on member %s",qPrint(md->name())); ol.docify(" "); linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md,exception); } @@ -441,34 +442,13 @@ static void writeTemplatePrefix(OutputList &ol,ArgumentList *al) { ol.docify(" = "); ol.docify(a->defval); - } + } a=al->next(); if (a) ol.docify(", "); } ol.docify("> "); } -QCString extractDirection(QCString &docs) -{ - QRegExp re("\\[[^\\]]+\\]"); // [...] - int l=0; - if (re.match(docs,0,&l)==0) - { - int inPos = docs.find("in", 1,FALSE); - int outPos = docs.find("out",1,FALSE); - bool input = inPos!=-1 && inPos<l; - bool output = outPos!=-1 && outPos<l; - if (input || output) // in,out attributes - { - docs = docs.mid(l); // strip attributes - if (input && output) return "[in,out]"; - else if (input) return "[in]"; - else if (output) return "[out]"; - } - } - return QCString(); -} - //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- @@ -484,16 +464,16 @@ class MemberDefImpl const ArgumentList *al ); - ClassDef *classDef; // member of or related to - FileDef *fileDef; // member of file definition + ClassDef *classDef; // member of or related to + FileDef *fileDef; // member of file definition NamespaceDef *nspace; // the namespace this member is in. MemberDef *enumScope; // the enclosing scope, if this is an enum field - bool livesInsideEnum; + bool livesInsideEnum; MemberDef *annEnumType; // the anonymous enum that is the type of this member MemberList *enumFields; // enumeration fields - MemberDef *redefines; // the members that this member redefines + MemberDef *redefines; // the members that this member redefines MemberList *redefinedBy; // the list of members that redefine this one MemberDef *memDef; // member definition for this declaration @@ -523,7 +503,7 @@ class MemberDefImpl uint64 memSpec; // The specifiers present for this member MemberType mtype; // returns the kind of member - int maxInitLines; // when the initializer will be displayed + int maxInitLines; // when the initializer will be displayed int userInitLines; // result of explicit \hideinitializer or \showinitializer MemberDef *annMemb; @@ -533,13 +513,13 @@ class MemberDefImpl ArgumentList *tArgList; // template argument list of function template ArgumentList *typeConstraints; // type constraints for template parameters MemberDef *templateMaster; - QList<ArgumentList> *defTmpArgLists; // lists of template argument lists + QList<ArgumentList> *defTmpArgLists; // lists of template argument lists // (for template functions in nested template classes) ClassDef *cachedAnonymousType; // if the member has an anonymous compound // as its type then this is computed by - // getClassDefOfAnonymousType() and - // cached here. + // getClassDefOfAnonymousType() and + // cached here. SDict<MemberList> *classSectionSDict; // not accessible MemberDef *groupAlias; // Member containing the definition @@ -555,7 +535,7 @@ class MemberDefImpl ClassDef *cachedTypedefValue; QCString cachedTypedefTemplSpec; QCString cachedResolvedType; - + // inbody documentation //int inbodyLine; //QCString inbodyFile; @@ -568,7 +548,7 @@ class MemberDefImpl QCString explicitOutputFileBase; // objective-c - bool implOnly; // function found in implementation but not + bool implOnly; // function found in implementation but not // in the interface bool hasDocumentedParams; bool hasDocumentedReturnType; @@ -578,7 +558,7 @@ class MemberDefImpl bool proto; // is it a prototype; bool docEnumValues; // is an enum with documented enum values. bool annScope; // member is part of an annoymous scope - bool annUsed; + bool annUsed; bool hasCallGraph; bool hasCallerGraph; bool explExt; // member was explicitly declared external @@ -743,10 +723,10 @@ void MemberDefImpl::init(Definition *def, * \c Normal, \c Virtual, \c Pure. * \param s A boolean that is true iff the member is static. * \param r The relationship between the class and the member. - * \param mt The kind of member. See #MemberType for a list of + * \param mt The kind of member. See #MemberType for a list of * all types. * \param tal The template arguments of this member. - * \param al The arguments of this member. This is a structured form of + * \param al The arguments of this member. This is a structured form of * the string past as argument \a a. */ @@ -788,7 +768,7 @@ MemberDef *MemberDef::deepCopy() const result->m_impl->defTmpArgLists=0; result->m_impl->classSectionSDict=0; result->m_impl->declArgList=0; - // replace pointers owned by the object by deep copies + // replace pointers owned by the object by deep copies if (m_impl->redefinedBy) { MemberListIterator mli(*m_impl->redefinedBy); @@ -809,7 +789,7 @@ MemberDef *MemberDef::deepCopy() const } if (m_impl->enumFields) { - MemberListIterator mli(*m_impl->redefinedBy); + MemberListIterator mli(*m_impl->enumFields); MemberDef *md; for (mli.toFirst();(md=mli.current());++mli) { @@ -861,8 +841,8 @@ void MemberDef::moveTo(Definition *scope) { m_impl->nspace = (NamespaceDef*)scope; } - m_isLinkableCached = 0; - m_isConstructorCached = 0; + m_isLinkableCached = 0; + m_isConstructorCached = 0; } @@ -874,8 +854,8 @@ MemberDef::~MemberDef() m_impl=0; } -void MemberDef::setReimplements(MemberDef *md) -{ +void MemberDef::setReimplements(MemberDef *md) +{ m_impl->redefines = md; } @@ -886,20 +866,20 @@ void MemberDef::insertReimplementedBy(MemberDef *md) m_impl->templateMaster->insertReimplementedBy(md); } if (m_impl->redefinedBy==0) m_impl->redefinedBy = new MemberList(MemberListType_redefinedBy); - if (m_impl->redefinedBy->findRef(md)==-1) + if (m_impl->redefinedBy->findRef(md)==-1) { m_impl->redefinedBy->inSort(md); } } -MemberDef *MemberDef::reimplements() const -{ - return m_impl->redefines; +MemberDef *MemberDef::reimplements() const +{ + return m_impl->redefines; } -MemberList *MemberDef::reimplementedBy() const -{ - return m_impl->redefinedBy; +MemberList *MemberDef::reimplementedBy() const +{ + return m_impl->redefinedBy; } bool MemberDef::isReimplementedBy(ClassDef *cd) const @@ -934,7 +914,7 @@ bool MemberDef::addExample(const char *anchor,const char *nameStr, { //printf("%s::addExample(%s,%s,%s)\n",name().data(),anchor,nameStr,file); if (m_impl->exampleSDict==0) m_impl->exampleSDict = new ExampleSDict; - if (m_impl->exampleSDict->find(nameStr)==0) + if (m_impl->exampleSDict->find(nameStr)==0) { //printf("Add reference to example %s to member %s\n",nameStr,name.data()); Example *e=new Example; @@ -944,12 +924,12 @@ bool MemberDef::addExample(const char *anchor,const char *nameStr, m_impl->exampleSDict->inSort(nameStr,e); return TRUE; } - return FALSE; + return FALSE; } bool MemberDef::hasExamples() { - if (m_impl->exampleSDict==0) + if (m_impl->exampleSDict==0) return FALSE; else return m_impl->exampleSDict->count()>0; @@ -986,7 +966,7 @@ QCString MemberDef::getOutputFileBase() const { baseName=m_impl->fileDef->getOutputFileBase(); } - + if (baseName.isEmpty()) { warn(getDefFileName(),getDefLine(), @@ -1048,7 +1028,7 @@ QCString MemberDef::anchor() const { result.prepend(m_impl->enumScope->anchor()); } - if (m_impl->group) + if (m_impl->group) { if (m_impl->groupMember) { @@ -1067,7 +1047,7 @@ void MemberDef::_computeLinkableInProject() static bool extractStatic = Config_getBool("EXTRACT_STATIC"); m_isLinkableCached = 2; // linkable //printf("MemberDef::isLinkableInProject(name=%s)\n",name().data()); - if (isHidden()) + if (isHidden()) { //printf("is hidden\n"); m_isLinkableCached = 1; @@ -1079,51 +1059,51 @@ void MemberDef::_computeLinkableInProject() m_isLinkableCached = m_impl->templateMaster->isLinkableInProject() ? 2 : 1; return; } - if (name().isEmpty() || name().at(0)=='@') + if (name().isEmpty() || name().at(0)=='@') { //printf("name invalid\n"); m_isLinkableCached = 1; // not a valid or a dummy name return; } - if (!hasDocumentation() && !isReference()) + if (!hasDocumentation() && !isReference()) { //printf("no docs or reference\n"); m_isLinkableCached = 1; // no documentation return; } - if (m_impl->group && !m_impl->group->isLinkableInProject()) + if (m_impl->group && !m_impl->group->isLinkableInProject()) { //printf("group but group not linkable!\n"); m_isLinkableCached = 1; // group but group not linkable return; } - if (!m_impl->group && m_impl->classDef && !m_impl->classDef->isLinkableInProject()) + if (!m_impl->group && m_impl->classDef && !m_impl->classDef->isLinkableInProject()) { //printf("in a class but class not linkable!\n"); m_isLinkableCached = 1; // in class but class not linkable return; } - if (!m_impl->group && m_impl->nspace && !m_impl->related && !m_impl->nspace->isLinkableInProject()) + if (!m_impl->group && m_impl->nspace && !m_impl->related && !m_impl->nspace->isLinkableInProject()) { //printf("in a namespace but namespace not linkable!\n"); m_isLinkableCached = 1; // in namespace but namespace not linkable return; } - if (!m_impl->group && !m_impl->nspace && - !m_impl->related && !m_impl->classDef && - m_impl->fileDef && !m_impl->fileDef->isLinkableInProject()) + if (!m_impl->group && !m_impl->nspace && + !m_impl->related && !m_impl->classDef && + m_impl->fileDef && !m_impl->fileDef->isLinkableInProject()) { //printf("in a file but file not linkable!\n"); m_isLinkableCached = 1; // in file (and not in namespace) but file not linkable return; } - if (!protectionLevelVisible(m_impl->prot) && m_impl->mtype!=MemberType_Friend) + if (!protectionLevelVisible(m_impl->prot) && m_impl->mtype!=MemberType_Friend) { //printf("private and invisible!\n"); m_isLinkableCached = 1; // hidden due to protection return; } - if (m_impl->stat && m_impl->classDef==0 && !extractStatic) + if (m_impl->stat && m_impl->classDef==0 && !extractStatic) { //printf("static and invisible!\n"); m_isLinkableCached = 1; // hidden due to staticness @@ -1203,11 +1183,11 @@ void MemberDef::writeLink(OutputList &ol,ClassDef *,NamespaceDef *, { n.prepend(m_impl->enumScope->displayName()+sep); } - if (m_impl->classDef && gd && !isRelated()) + if (m_impl->classDef && gd && !isRelated()) { n.prepend(m_impl->classDef->displayName()+sep); } - else if (m_impl->nspace && (gd || fd)) + else if (m_impl->nspace && (gd || fd)) { n.prepend(m_impl->nspace->displayName()+sep); } @@ -1243,12 +1223,12 @@ void MemberDef::writeLink(OutputList &ol,ClassDef *,NamespaceDef *, /*! If this member has an anonymous class/struct/union as its type, then * this method will return the ClassDef that describes this return type. */ -ClassDef *MemberDef::getClassDefOfAnonymousType() +ClassDef *MemberDef::getClassDefOfAnonymousType() { if (m_impl->cachedAnonymousType) return m_impl->cachedAnonymousType; QCString cname; - if (getClassDef()!=0) + if (getClassDef()!=0) { cname=getClassDef()->name().copy(); } @@ -1277,7 +1257,7 @@ ClassDef *MemberDef::getClassDefOfAnonymousType() QCString annName = ltype.mid(il,ir-il); // if inside a class or namespace try to prepend the scope name - if (!cname.isEmpty() && annName.left(cname.length()+2)!=cname+"::") + if (!cname.isEmpty() && annName.left(cname.length()+2)!=cname+"::") { QCString ts=stripAnonymousNamespaceScope(cname+"::"+annName); annoClassDef=getClass(ts); @@ -1292,7 +1272,7 @@ ClassDef *MemberDef::getClassDefOfAnonymousType() m_impl->cachedAnonymousType = annoClassDef; return annoClassDef; } - + /*! This methods returns TRUE iff the brief section (also known as * declaration section) is visible in the documentation. */ @@ -1313,51 +1293,51 @@ bool MemberDef::isBriefSectionVisible() const MemberGroupInfo *info = Doxygen::memGrpInfoDict[m_impl->grpId]; //printf("name=%s m_impl->grpId=%d info=%p\n",name().data(),m_impl->grpId,info); //QCString *pMemGrp = Doxygen::memberDocDict[grpId]; - bool hasDocs = hasDocumentation() || + bool hasDocs = hasDocumentation() || // part of a documented member group (m_impl->grpId!=-1 && info && !(info->doc.isEmpty() && info->header.isEmpty())); - // only include static members with file/namespace scope if + // only include static members with file/namespace scope if // explicitly enabled in the config file - bool visibleIfStatic = !(getClassDef()==0 && - isStatic() && + bool visibleIfStatic = !(getClassDef()==0 && + isStatic() && !extractStatic ); - // only include members is the are documented or + // only include members is the are documented or // HIDE_UNDOC_MEMBERS is NO in the config file - bool visibleIfDocumented = (!hideUndocMembers || - hasDocs || + bool visibleIfDocumented = (!hideUndocMembers || + hasDocs || isDocumentedFriendClass() ); - // hide members with no detailed description and brief descriptions + // hide members with no detailed description and brief descriptions // explicitly disabled. - bool visibleIfEnabled = !(hideUndocMembers && + bool visibleIfEnabled = !(hideUndocMembers && documentation().isEmpty() && - !briefMemberDesc && + !briefMemberDesc && !repeatBrief ); // Hide friend (class|struct|union) declarations if HIDE_FRIEND_COMPOUNDS is true bool visibleIfFriendCompound = !(hideFriendCompounds && isFriend() && - (m_impl->type=="friend class" || + (m_impl->type=="friend class" || m_impl->type=="friend struct" || m_impl->type=="friend union" ) ); - + // only include members that are non-private unless EXTRACT_PRIVATE is // set to YES or the member is part of a group - bool visibleIfPrivate = (protectionLevelVisible(protection()) || + bool visibleIfPrivate = (protectionLevelVisible(protection()) || m_impl->mtype==MemberType_Friend ); - + // hide member if it overrides a member in a superclass and has no // documentation of its own - //bool visibleIfDocVirtual = !reimplements() || - // !Config_getBool("INHERIT_DOCS") || + //bool visibleIfDocVirtual = !reimplements() || + // !Config_getBool("INHERIT_DOCS") || // hasDocs; // true if this member is a constructor or destructor @@ -1380,20 +1360,47 @@ bool MemberDef::isBriefSectionVisible() const // visibleIfStatic,visibleIfDocumented, // visibleIfEnabled,visibleIfPrivate,visibleIfNotDefaultCDTor, // visibleIfFriendCompound,!m_impl->annScope); - - bool visible = visibleIfStatic && visibleIfDocumented && + + bool visible = visibleIfStatic && visibleIfDocumented && visibleIfEnabled && visibleIfPrivate && - /*visibleIfDocVirtual &&*/ visibleIfNotDefaultCDTor && - visibleIfFriendCompound && + /*visibleIfDocVirtual &&*/ visibleIfNotDefaultCDTor && + visibleIfFriendCompound && !m_impl->annScope && !isHidden(); //printf("MemberDef::isBriefSectionVisible() %d\n",visible); return visible; } +QCString MemberDef::getDeclType() const +{ + QCString ltype(m_impl->type); + if (m_impl->mtype==MemberType_Typedef) + { + ltype.prepend("typedef "); + } + if (isAlias()) + { + ltype="using"; + } + // strip `friend' keyword from ltype + ltype.stripPrefix("friend "); + if (ltype=="@") // rename type from enum values + { + ltype=""; + } + else + { + if (isObjCMethod()) + { + ltype.prepend("("); + ltype.append(")"); + } + } + return ltype; +} void MemberDef::writeDeclaration(OutputList &ol, ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd, - bool inGroup, const DefType compoundType, + bool inGroup, const DefType compoundType, ClassDef *inheritedFrom,const char *inheritId) { //printf("%s MemberDef::writeDeclaration() inGroup=%d\n",qualifiedName().data(),inGroup); @@ -1402,9 +1409,6 @@ void MemberDef::writeDeclaration(OutputList &ol, // are explicitly grouped. if (!inGroup && m_impl->mtype==MemberType_EnumValue) return; - // hide members whose brief section should not be visible - //if (!isBriefSectionVisible()) return; - Definition *d=0; ASSERT (cd!=0 || nd!=0 || fd!=0 || gd!=0); // member should belong to something if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd; @@ -1414,14 +1418,6 @@ void MemberDef::writeDeclaration(OutputList &ol, QCString cname = d->name(); QCString cdname = d->displayName(); QCString cfname = getOutputFileBase(); - //QCString osname = cname; - // in case of class members that are put in a group the name of the outerscope - // differs from the cname. - //if (getOuterScope()) osname=getOuterScope()->name(); - - //HtmlHelp *htmlHelp=0; - //bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP"); - //if (hasHtmlHelp) htmlHelp = HtmlHelp::getInstance(); // search for the last anonymous scope in the member type ClassDef *annoClassDef=getClassDefOfAnonymousType(); @@ -1431,22 +1427,34 @@ void MemberDef::writeDeclaration(OutputList &ol, // start a new member declaration bool isAnonymous = annoClassDef || m_impl->annMemb || m_impl->annEnumType; ///printf("startMemberItem for %s\n",name().data()); - ol.startMemberItem(anchor(), + ol.startMemberItem(anchor(), isAnonymous ? 1 : m_impl->tArgList ? 3 : 0, inheritId ); // If there is no detailed description we need to write the anchor here. bool detailsVisible = isDetailedSectionLinkable(); - if (!detailsVisible && !m_impl->annMemb) + if (!detailsVisible) { - QCString doxyName=name().copy(); - if (!cname.isEmpty()) + QCString doxyArgs=argsString(); + if (m_impl->annMemb) { - doxyName.prepend(cdname+getLanguageSpecificSeparator(getLanguage())); + QCString doxyName=m_impl->annMemb->name(); + if (!cname.isEmpty()) + { + doxyName.prepend(cdname+getLanguageSpecificSeparator(getLanguage())); + } + ol.startDoxyAnchor(cfname,cname,m_impl->annMemb->anchor(),doxyName,doxyArgs); + } + else + { + QCString doxyName=name(); + if (!cname.isEmpty()) + { + doxyName.prepend(cdname+getLanguageSpecificSeparator(getLanguage())); + } + ol.startDoxyAnchor(cfname,cname,anchor(),doxyName,doxyArgs); } - QCString doxyArgs=argsString(); - ol.startDoxyAnchor(cfname,cname,anchor(),doxyName,doxyArgs); ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); @@ -1458,7 +1466,7 @@ void MemberDef::writeDeclaration(OutputList &ol, if (annoClassDef || m_impl->annMemb) { int j; - for (j=0;j<s_indentLevel;j++) + for (j=0;j<s_indentLevel;j++) { ol.writeNonBreakableSpace(3); } @@ -1499,16 +1507,16 @@ void MemberDef::writeDeclaration(OutputList &ol, //printf(">>>>>>>>>>>>>> startMemberItem(2)\n"); ol.startMemberItem(anchor(),2,inheritId); int j; - for (j=0;j< s_indentLevel-1;j++) + for (j=0;j< s_indentLevel-1;j++) { ol.writeNonBreakableSpace(3); } QCString varName=ltype.right(ltype.length()-ir).stripWhiteSpace(); //printf(">>>>>> indDepth=%d ltype=`%s' varName=`%s'\n",indDepth,ltype.data(),varName.data()); ol.docify("}"); - if (varName.isEmpty() && (name().isEmpty() || name().at(0)=='@')) + if (varName.isEmpty() && (name().isEmpty() || name().at(0)=='@')) { - ol.docify(";"); + ol.docify(";"); } endAnonScopeNeeded=TRUE; } @@ -1522,10 +1530,10 @@ void MemberDef::writeDeclaration(OutputList &ol, this, // self ltype.left(i), // text TRUE // autoBreak - ); + ); getAnonymousEnumType()->writeEnumDeclaration(ol,cd,nd,fd,gd,compoundType); //ol+=*getAnonymousEnumType()->enumDecl(); - linkifyText(TextGeneratorOLImpl(ol),d,m_impl->fileDef,this,ltype.right(ltype.length()-i-l),TRUE); + linkifyText(TextGeneratorOLImpl(ol),d,m_impl->fileDef,this,ltype.right(ltype.length()-i-l),TRUE); } else { @@ -1536,7 +1544,7 @@ void MemberDef::writeDeclaration(OutputList &ol, this, // self ltype, // text TRUE // autoBreak - ); + ); } } } @@ -1565,12 +1573,12 @@ void MemberDef::writeDeclaration(OutputList &ol, ol.disable(OutputGenerator::Html); } if (!ltype.isEmpty()) ol.docify(" "); - if (htmlOn) + if (htmlOn) { ol.enable(OutputGenerator::Html); } - if (m_impl->annMemb) + if (m_impl->annMemb) { ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); @@ -1583,7 +1591,7 @@ void MemberDef::writeDeclaration(OutputList &ol, } // *** write name - if (!name().isEmpty() && name().at(0)!='@') // hide anonymous stuff + if (!name().isEmpty() && name().at(0)!='@') // hide anonymous stuff { //printf("Member name=`%s gd=%p md->groupDef=%p inGroup=%d isLinkable()=%d\n",name().data(),gd,getGroupDef(),inGroup,isLinkable()); if (!(name().isEmpty() || name().at(0)=='@') && // name valid @@ -1608,27 +1616,27 @@ void MemberDef::writeDeclaration(OutputList &ol, { //printf("writeLink %s->%d\n",name.data(),hasDocumentation()); ClassDef *rcd = cd; - if (isReference() && m_impl->classDef) rcd = m_impl->classDef; + if (isReference() && m_impl->classDef) rcd = m_impl->classDef; writeLink(ol,rcd,nd,fd,gd); } } else if (isDocumentedFriendClass()) - // if the member is an undocumented friend declaration for some class, + // if the member is an undocumented friend declaration for some class, // then maybe we can link to the class { writeLink(ol,getClass(name()),0,0,0); } else - // there is a brief member description and brief member + // there is a brief member description and brief member // descriptions are enabled or there is no detailed description. { - if (m_impl->annMemb) + if (m_impl->annMemb) { m_impl->annMemb->setAnonymousUsed(); setAnonymousUsed(); } ClassDef *rcd = cd; - if (isReference() && m_impl->classDef) rcd = m_impl->classDef; + if (isReference() && m_impl->classDef) rcd = m_impl->classDef; writeLink(ol,rcd,nd,fd,gd,TRUE); } } @@ -1654,7 +1662,7 @@ void MemberDef::writeDeclaration(OutputList &ol, } // *** write arguments - if (argsString() && !isObjCMethod()) + if (argsString() && !isObjCMethod()) { if (!isDefine()) ol.writeString(" "); linkifyText(TextGeneratorOLImpl(ol), // out @@ -1678,20 +1686,20 @@ void MemberDef::writeDeclaration(OutputList &ol, // *** write bitfields if (!m_impl->bitfields.isEmpty()) // add bitfields { - linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),this,m_impl->bitfields.simplifyWhiteSpace()); + linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),this,m_impl->bitfields); } else if (hasOneLineInitializer() //!init.isEmpty() && initLines==0 && // one line initializer //((maxInitLines>0 && userInitLines==-1) || userInitLines>0) // enabled by default or explicitly ) // add initializer { - if (!isDefine()) + if (!isDefine()) { - //ol.writeString(" = "); - ol.writeString(" "); + //ol.writeString(" = "); + ol.writeString(" "); linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),this,m_impl->initializer.simplifyWhiteSpace()); } - else + else { ol.writeNonBreakableSpace(3); linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),this,m_impl->initializer); @@ -1699,7 +1707,7 @@ void MemberDef::writeDeclaration(OutputList &ol, } else if (isAlias()) // using template alias { - ol.writeString(" = "); + ol.writeString(" = "); linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),this,m_impl->type); } @@ -1758,14 +1766,14 @@ void MemberDef::writeDeclaration(OutputList &ol, //printf("endMember %s annoClassDef=%p annEnumType=%p\n", // name().data(),annoClassDef,annEnumType); ol.endMemberItem(); - if (endAnonScopeNeeded) + if (endAnonScopeNeeded) { ol.endAnonTypeScope(--s_indentLevel); } // write brief description - if (!briefDescription().isEmpty() && - Config_getBool("BRIEF_MEMBER_DESC") + if (!briefDescription().isEmpty() && + Config_getBool("BRIEF_MEMBER_DESC") /* && !annMemb */ ) { @@ -1777,7 +1785,7 @@ void MemberDef::writeDeclaration(OutputList &ol, { ol.startMemberDescription(anchor(),inheritId); ol.writeDoc(rootNode,getOuterScope()?getOuterScope():d,this); - if (detailsVisible) + if (detailsVisible) { ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); @@ -1812,8 +1820,8 @@ void MemberDef::writeDeclaration(OutputList &ol, warnIfUndocumented(); } -bool MemberDef::isDetailedSectionLinkable() const -{ +bool MemberDef::isDetailedSectionLinkable() const +{ static bool extractAll = Config_getBool("EXTRACT_ALL"); static bool alwaysDetailedSec = Config_getBool("ALWAYS_DETAILED_SEC"); static bool repeatBrief = Config_getBool("REPEAT_BRIEF"); @@ -1822,27 +1830,27 @@ bool MemberDef::isDetailedSectionLinkable() const static bool extractStatic = Config_getBool("EXTRACT_STATIC"); // the member has details documentation for any of the following reasons - bool docFilter = + bool docFilter = // treat everything as documented - extractAll || + extractAll || // has detailed docs - !documentation().isEmpty() || + !documentation().isEmpty() || // has inbody docs !inbodyDocumentation().isEmpty() || // is an enum with values that are documented - (m_impl->mtype==MemberType_Enumeration && m_impl->docEnumValues) || + (m_impl->mtype==MemberType_Enumeration && m_impl->docEnumValues) || // is documented enum value - (m_impl->mtype==MemberType_EnumValue && !briefDescription().isEmpty()) || + (m_impl->mtype==MemberType_EnumValue && !briefDescription().isEmpty()) || // has brief description that is part of the detailed description (!briefDescription().isEmpty() && // has brief docs (alwaysDetailedSec && // they are visible in (repeatBrief || // detailed section or !briefMemberDesc // they are explicitly not ) // shown in brief section - ) + ) ) || // has a multi-line initialization block - //(initLines>0 && initLines<maxInitLines) || + //(initLines>0 && initLines<maxInitLines) || (hasMultiLineInitializer() && !hideUndocMembers) || // has one or more documented arguments (m_impl->defArgList!=0 && m_impl->defArgList->hasDocumentation()) || @@ -1850,11 +1858,11 @@ bool MemberDef::isDetailedSectionLinkable() const (m_impl->memSpec & (Entry::Attribute|Entry::Property)) || // has user comments Doxygen::userComments - ; - + ; + // this is not a global static or global statics should be extracted - bool staticFilter = getClassDef()!=0 || !isStatic() || extractStatic; - + bool staticFilter = getClassDef()!=0 || !isStatic() || extractStatic; + // only include members that are non-private unless EXTRACT_PRIVATE is // set to YES or the member is part of a group bool privateFilter = protectionLevelVisible(protection()) || m_impl->mtype==MemberType_Friend; @@ -1868,29 +1876,29 @@ bool MemberDef::isDetailedSectionLinkable() const // is true bool friendCompoundFilter = !(Config_getBool("HIDE_FRIEND_COMPOUNDS") && isFriend() && - (m_impl->type=="friend class" || + (m_impl->type=="friend class" || m_impl->type=="friend struct" || m_impl->type=="friend union" ) ); - - + + bool result = ((docFilter && staticFilter && privateFilter && friendCompoundFilter && !isHidden())); //printf("%s::isDetailedSectionLinkable: %d\n",name().data(),result); return result; } -bool MemberDef::isDetailedSectionVisible(bool inGroup,bool inFile) const -{ +bool MemberDef::isDetailedSectionVisible(bool inGroup,bool inFile) const +{ static bool separateMemPages = Config_getBool("SEPARATE_MEMBER_PAGES"); static bool inlineSimpleStructs = Config_getBool("INLINE_SIMPLE_STRUCTS"); static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS"); - bool groupFilter = getGroupDef()==0 || inGroup || separateMemPages; + bool groupFilter = getGroupDef()==0 || inGroup || separateMemPages; bool fileFilter = getNamespaceDef()==0 || !inFile; - bool simpleFilter = !hideUndocMembers && inlineSimpleStructs && + bool simpleFilter = !hideUndocMembers && inlineSimpleStructs && getClassDef()!=0 && getClassDef()->isSimple(); - bool visible = isDetailedSectionLinkable() && groupFilter && fileFilter && + bool visible = isDetailedSectionLinkable() && groupFilter && fileFilter && !isReference(); bool result = visible || simpleFilter; //printf("%s::isDetailedSectionVisble: %d groupFilter=%d fileFilter=%d\n", @@ -1898,19 +1906,19 @@ bool MemberDef::isDetailedSectionVisible(bool inGroup,bool inFile) const return result; } -void MemberDef::_getLabels(QStrList &sl,Definition *container) const +void MemberDef::getLabels(QStrList &sl,Definition *container) const { static bool inlineInfo = Config_getBool("INLINE_INFO"); Specifier lvirt=virtualness(); if ((!isObjCMethod() || isOptional() || isRequired()) && (protection()!=Public || lvirt!=Normal || - isFriend() || isRelated() || + isFriend() || isRelated() || (isInline() && inlineInfo) || isSignal() || isSlot() || - isStatic() || + isStatic() || (m_impl->classDef && m_impl->classDef!=container && container->definitionType()==TypeClass) || - (m_impl->memSpec & ~Entry::Inline)!=0 + (m_impl->memSpec & ~Entry::Inline)!=0 ) ) { @@ -1991,11 +1999,11 @@ void MemberDef::_getLabels(QStrList &sl,Definition *container) const sl.append("implementation"); } } - if (m_impl->classDef && - container->definitionType()==TypeClass && + if (m_impl->classDef && + container->definitionType()==TypeClass && m_impl->classDef!=container && !isRelated() - ) + ) { sl.append("inherited"); } @@ -2010,7 +2018,7 @@ void MemberDef::_getLabels(QStrList &sl,Definition *container) const void MemberDef::_writeCallGraph(OutputList &ol) { // write call graph - if ((m_impl->hasCallGraph || Config_getBool("CALL_GRAPH")) + if ((m_impl->hasCallGraph || Config_getBool("CALL_GRAPH")) && (isFunction() || isSlot() || isSignal()) && Config_getBool("HAVE_DOT") ) { @@ -2027,7 +2035,7 @@ void MemberDef::_writeCallGraph(OutputList &ol) ol.startCallGraph(); ol.parseText(theTranslator->trCallGraph()); ol.endCallGraph(callGraph); - ol.endParagraph(); + ol.endParagraph(); ol.enableAll(); } } @@ -2035,7 +2043,7 @@ void MemberDef::_writeCallGraph(OutputList &ol) void MemberDef::_writeCallerGraph(OutputList &ol) { - if ((m_impl->hasCallerGraph || Config_getBool("CALLER_GRAPH")) + if ((m_impl->hasCallerGraph || Config_getBool("CALLER_GRAPH")) && (isFunction() || isSlot() || isSignal()) && Config_getBool("HAVE_DOT") ) { @@ -2068,7 +2076,7 @@ void MemberDef::_writeReimplements(OutputList &ol) if (bcd->isLinkable()) { ol.startParagraph(); - QCString reimplFromLine; + QCString reimplFromLine; if (bmd->virtualness()!=Pure && bcd->compoundType()!=ClassDef::Interface) { reimplFromLine = theTranslator->trReimplementedFromList(1); @@ -2090,7 +2098,7 @@ void MemberDef::_writeReimplements(OutputList &ol) //ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(), // bmd->anchor(),bcd->name()); - if ( bmd->isLinkableInProject() ) + if ( bmd->isLinkableInProject() ) { writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor()); } @@ -2130,7 +2138,7 @@ void MemberDef::_writeReimplementedBy(OutputList &ol) { // count the members that directly inherit from md and for // which the member and class are visible in the docs. - if ( bmd->isLinkable() && bcd->isLinkable() ) + if ( bmd->isLinkable() && bcd->isLinkable() ) { count++; } @@ -2164,7 +2172,7 @@ void MemberDef::_writeReimplementedBy(OutputList &ol) // find the entryIndex-th documented entry in the inheritance list. for (mli.toLast();(bmd=mli.current()) && (bcd=bmd->getClassDef());--mli) { - if ( bmd->isLinkable() && bcd->isLinkable()) + if ( bmd->isLinkable() && bcd->isLinkable()) { if (count==entryIndex) break; count++; @@ -2178,14 +2186,14 @@ void MemberDef::_writeReimplementedBy(OutputList &ol) ol.writeObjectLink(bmd->getReference(),bmd->getOutputFileBase(), bmd->anchor(),bcd->displayName()); - if (bmd->isLinkableInProject() ) + if (bmd->isLinkableInProject() ) { writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor()); } } ++mli; index=newIndex+matchLen; - } + } ol.parseText(reimplInLine.right(reimplInLine.length()-index)); ol.endParagraph(); } @@ -2213,7 +2221,7 @@ void MemberDef::_writeCategoryRelation(OutputList &ol) { if (m_impl->category) { - // this member is in a normal class and implements method categoryRelation from category + // this member is in a normal class and implements method categoryRelation from category // so link to method 'categoryRelation' with 'provided by category 'category' text. text = theTranslator->trProvidedByCategory(); name = m_impl->category->displayName(); @@ -2322,19 +2330,19 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container, bool hasDetails = !fmd->documentation().isEmpty(); if (hasBrief) - { + { ol.generateDoc(fmd->briefFile(),fmd->briefLine(), getOuterScope()?getOuterScope():container, fmd,fmd->briefDescription(),TRUE,FALSE); } // FIXME:PARA - //if (!fmd->briefDescription().isEmpty() && + //if (!fmd->briefDescription().isEmpty() && // !fmd->documentation().isEmpty()) //{ // ol.newParagraph(); //} if (hasDetails) - { + { ol.generateDoc(fmd->docFile(),fmd->docLine(), getOuterScope()?getOuterScope():container, fmd,fmd->documentation()+"\n",TRUE,FALSE); @@ -2344,17 +2352,136 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container, fmd=fmdl->next(); } } - if (!first) - { - //ol.endItemList(); + if (!first) + { + //ol.endItemList(); ol.endDescTable(); //ol.endDescForItem(); //ol.endSimpleSect(); - //ol.writeChar('\n'); + //ol.writeChar('\n'); + } + } +} + +QCString MemberDef::displayDefinition() const +{ + QCString ldef = definition(); + QCString title = name(); + if (isEnumerate()) + { + if (title.at(0)=='@') + { + ldef = title = "anonymous enum"; + if (!m_impl->enumBaseType.isEmpty()) + { + ldef+=" : "+m_impl->enumBaseType; + } + } + else + { + ldef.prepend("enum "); } } + else if (isEnumValue()) + { + if (ldef.at(0)=='@') + { + ldef=ldef.mid(2); + } + } + static QRegExp r("@[0-9]+"); + int l,i=r.match(ldef,0,&l); + if (i!=-1) // replace anonymous parts with { ... } + { + int si=ldef.find(' '),pi,ei=i+l; + if (si==-1) si=0; + while ((pi=r.match(ldef,i+l,&l))!=-1) + { + i=pi; + ei=i+l; + } + int ni=ldef.find("::",si); + if (ni>=ei) ei=ni+2; + ldef = ldef.left(si) + " { ... } " + ldef.right(ldef.length()-ei); + } + ClassDef *cd=getClassDef(); + if (cd && cd->isObjectiveC()) + { + // strip scope name + int ep = ldef.find("::"); + if (ep!=-1) + { + int sp=ldef.findRev(' ',ep); + if (sp!=-1) + { + ldef=ldef.left(sp+1)+ldef.mid(ep+2); + } + } + // strip keywords + int dp = ldef.find(':'); + if (dp!=-1) + { + ldef=ldef.left(dp+1); + } + l=ldef.length(); + //printf("start >%s<\n",ldef.data()); + i=l-1; + while (i>=0 && (isId(ldef.at(i)) || ldef.at(i)==':')) i--; + while (i>=0 && isspace((uchar)ldef.at(i))) i--; + if (i>0) + { + // insert braches around the type + QCString tmp("("+ldef.left(i+1)+")"+ldef.mid(i+1)); + ldef=tmp; + } + //printf("end >%s< i=%d\n",ldef.data(),i); + if (isStatic()) ldef.prepend("+ "); else ldef.prepend("- "); + } + SrcLangExt lang = getLanguage(); + QCString sep = getLanguageSpecificSeparator(lang,TRUE); + return substitute(ldef,"::",sep); } +void MemberDef::_writeGroupInclude(OutputList &ol,bool inGroup) +{ + // only write out the include file if this is not part of a class or file + // definition + static bool showGroupedMembInc = Config_getBool("SHOW_GROUPED_MEMB_INC"); + FileDef *fd = getFileDef(); + QCString nm; + if (fd) nm = getFileDef()->docName(); + if (inGroup && fd && showGroupedMembInc && !nm.isEmpty()) + { + ol.startParagraph(); + ol.startTypewriter(); + SrcLangExt lang = getLanguage(); + bool isIDLorJava = lang==SrcLangExt_IDL || lang==SrcLangExt_Java; + if (isIDLorJava) + { + ol.docify("import "); + } + else + { + ol.docify("#include "); + } + + if (isIDLorJava) ol.docify("\""); else ol.docify("<"); + + if (fd && fd->isLinkable()) + { + ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),fd->anchor(),nm); + } + else + { + ol.docify(nm); + } + + if (isIDLorJava) ol.docify("\""); else ol.docify(">"); + + ol.endTypewriter(); + ol.endParagraph(); + } +} /*! Writes the "detailed documentation" section of this member to * all active output formats. @@ -2372,8 +2499,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, bool inFile = container->definitionType()==Definition::TypeFile; bool hasDocs = isDetailedSectionVisible(inGroup,inFile); - //printf("MemberDef::writeDocumentation(): name=`%s' hasDocs=`%d' containerType=%d inGroup=%d\n", - // name().data(),hasDocs,container->definitionType(),inGroup); + //printf("MemberDef::writeDocumentation(): name=`%s' hasDocs=`%d' containerType=%d inGroup=%d sectionLinkable=%d\n", + // name().data(),hasDocs,container->definitionType(),inGroup,isDetailedSectionLinkable()); if ( !hasDocs ) return; if (isEnumValue() && !showEnumValues) return; @@ -2415,7 +2542,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, QCString ldef = definition(); QCString title = name(); //printf("member `%s' def=`%s'\n",name().data(),ldef.data()); - if (isEnumerate()) + if (isEnumerate()) { if (title.at(0)=='@') { @@ -2446,7 +2573,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, bool htmlEndLabelTable=FALSE; QStrList sl; - _getLabels(sl,container); + getLabels(sl,container); if ((isVariable() || isTypedef()) && (i=r.match(ldef,0,&l))!=-1) { @@ -2463,7 +2590,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),this,ldef.left(i)); vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef(),definitionType()); linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),this,ldef.right(ldef.length()-i-l)); - + found=TRUE; } } @@ -2475,7 +2602,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, // search for the last anonymous compound name in the definition int si=ldef.find(' '),pi,ei=i+l; if (si==-1) si=0; - while ((pi=r.match(ldef,i+l,&l))!=-1) + while ((pi=r.match(ldef,i+l,&l))!=-1) { i=pi; ei=i+l; @@ -2500,7 +2627,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, { bool first=TRUE; SrcLangExt lang = getLanguage(); - if (m_impl->defTmpArgLists && lang==SrcLangExt_Cpp) + if (m_impl->defTmpArgLists && lang==SrcLangExt_Cpp) // definition has explicit template parameter declarations { QListIterator<ArgumentList> ali(*m_impl->defTmpArgLists); @@ -2563,7 +2690,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, { // strip scope name int ep = ldef.find("::"); - if (ep!=-1) + if (ep!=-1) { int sp=ldef.findRev(' ',ep); if (sp!=-1) @@ -2609,14 +2736,14 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, if (hasOneLineInitializer()) // add initializer { - if (!isDefine()) + if (!isDefine()) { - //ol.docify(" = "); - ol.docify(" "); + //ol.docify(" = "); + ol.docify(" "); QCString init = m_impl->initializer.simplifyWhiteSpace(); linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),this,init); } - else + else { ol.writeNonBreakableSpace(3); linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),this,m_impl->initializer); @@ -2645,7 +2772,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, } ol.popGeneratorState(); - if (hasParameterList) + if (hasParameterList) { ol.endParameterList(); ol.endMemberDoc(TRUE); @@ -2684,6 +2811,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ol.endDoxyAnchor(cfname,memAnchor); ol.startIndent(); + _writeGroupInclude(ol,inGroup); + /* write multi-line initializer (if any) */ if (hasMultiLineInitializer() //initLines>0 && ((initLines<maxInitLines && userInitLines==-1) // implicitly enabled @@ -2717,12 +2846,12 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, } /* write brief description */ - if (!brief.isEmpty() && - (Config_getBool("REPEAT_BRIEF") || + if (!brief.isEmpty() && + (Config_getBool("REPEAT_BRIEF") || !Config_getBool("BRIEF_MEMBER_DESC") - ) - ) - { + ) + ) + { ol.startParagraph(); ol.generateDoc(briefFile(),briefLine(), getOuterScope()?getOuterScope():container,this, @@ -2731,11 +2860,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, } /* write detailed description */ - if (!detailed.isEmpty() || + if (!detailed.isEmpty() || !inbodyDocumentation().isEmpty()) - { + { // write vhdl inline code with or without option INLINE_SOURCE - if (optVhdl && VhdlDocGen::isMisc(this)) + if (optVhdl && VhdlDocGen::isMisc(this)) { VhdlDocGen::writeSource(this,ol,cname); return; @@ -2744,7 +2873,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, { ol.generateDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,detailed+"\n",TRUE,FALSE); } - + if (!inbodyDocumentation().isEmpty()) { ol.generateDoc(inbodyFile(),inbodyLine(), @@ -2763,7 +2892,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, //printf("***** defArgList=%p name=%s docs=%s hasDocs=%d\n", - // defArgList, + // defArgList, // defArgList?defArgList->hasDocumentation():-1); if (docArgList!=0 && docArgList->hasDocumentation()) { @@ -2818,7 +2947,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ol.endIndent(); // enable LaTeX again - //if (Config_getBool("EXTRACT_ALL") && !hasDocs) ol.enable(OutputGenerator::Latex); + //if (Config_getBool("EXTRACT_ALL") && !hasDocs) ol.enable(OutputGenerator::Latex); ol.popGeneratorState(); //------------------------------------------------ @@ -2864,7 +2993,7 @@ static QCString simplifyTypeForTable(const QCString &s) } #if 0 -/** Returns the type definition corresponding to a member's return type. +/** Returns the type definition corresponding to a member's return type. * @param[in] scope The scope in which to search for the class definition. * @param[in] type The string representing the member's return type. * @param[in] lang The programming language in which the class is defined. @@ -2887,7 +3016,7 @@ static Definition *getClassFromType(Definition *scope,const QCString &type,SrcLa cd = getResolvedClass(scope,0,name+templSpec,&md); } cd = getResolvedClass(scope,0,name); - if (cd) + if (cd) { start=i; length=l; @@ -2965,20 +3094,20 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container) this, // self ts, // text TRUE // autoBreak - ); + ); } ol.endDoxyAnchor(cfname,memAnchor); ol.endInlineMemberType(); ol.startInlineMemberName(); ol.docify(doxyName); - if (isVariable() && argsString() && !isObjCMethod()) + if (isVariable() && argsString() && !isObjCMethod()) { linkifyText(TextGeneratorOLImpl(ol),getOuterScope(),getBodyDef(),this,argsString()); } if (!m_impl->bitfields.isEmpty()) // add bitfields { - linkifyText(TextGeneratorOLImpl(ol),getOuterScope(),getBodyDef(),this,m_impl->bitfields.simplifyWhiteSpace()); + linkifyText(TextGeneratorOLImpl(ol),getOuterScope(),getBodyDef(),this,m_impl->bitfields); } ol.endInlineMemberName(); @@ -2988,12 +3117,8 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container) QCString detailed = documentation(); /* write brief description */ - if (!brief.isEmpty() && - (Config_getBool("REPEAT_BRIEF") || - !Config_getBool("BRIEF_MEMBER_DESC") - ) - ) - { + if (!brief.isEmpty()) + { ol.generateDoc(briefFile(),briefLine(), getOuterScope()?getOuterScope():container,this, brief,FALSE,FALSE,0,TRUE,FALSE); @@ -3001,11 +3126,11 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container) /* write detailed description */ if (!detailed.isEmpty()) - { + { ol.generateDoc(docFile(),docLine(), getOuterScope()?getOuterScope():container,this, detailed+"\n",FALSE,FALSE,0,FALSE,FALSE); - + } ol.endInlineMemberDoc(); @@ -3019,7 +3144,7 @@ QCString MemberDef::memberTypeName() const case MemberType_Function: return "function"; case MemberType_Variable: return "variable"; case MemberType_Typedef: return "typedef"; - case MemberType_Enumeration: return "enumeration"; + case MemberType_Enumeration: return "enumeration"; case MemberType_EnumValue: return "enumvalue"; case MemberType_Signal: return "signal"; case MemberType_Slot: return "slot"; @@ -3042,10 +3167,10 @@ void MemberDef::warnIfUndocumented() GroupDef *gd = getGroupDef(); Definition *d=0; const char *t=0; - if (cd) - t="class", d=cd; - else if (nd) - t="namespace", d=nd; + if (cd) + t="class", d=cd; + else if (nd) + t="namespace", d=nd; else if (gd) t="group", d=gd; else @@ -3057,7 +3182,7 @@ void MemberDef::warnIfUndocumented() // d->isLinkable(),isLinkable(),isDocumentedFriendClass(), // name().data(),prot); if ((!hasUserDocumentation() && !extractAll) && - !isFriendClass() && + !isFriendClass() && name().find('@')==-1 && d && d->name().find('@')==-1 && protectionLevelVisible(m_impl->prot) && !isReference() @@ -3072,8 +3197,8 @@ void MemberDef::warnIfUndocumented() bool MemberDef::isFriendClass() const { - return (isFriend() && - (m_impl->type=="friend class" || m_impl->type=="friend struct" || + return (isFriend() && + (m_impl->type=="friend class" || m_impl->type=="friend struct" || m_impl->type=="friend union")); } @@ -3084,12 +3209,12 @@ bool MemberDef::isDocumentedFriendClass() const int i=baseName.find('<'); if (i!=-1) baseName=baseName.left(i); return (isFriendClass() && - (fcd=getClass(baseName)) && fcd->isLinkable()); + (fcd=getClass(baseName)) && fcd->isLinkable()); } bool MemberDef::hasDocumentation() const -{ - return Definition::hasDocumentation() || +{ + return Definition::hasDocumentation() || (m_impl->mtype==MemberType_Enumeration && m_impl->docEnumValues) || // has enum values (m_impl->defArgList!=0 && m_impl->defArgList->hasDocumentation()); // has doc arguments } @@ -3108,10 +3233,10 @@ void MemberDef::setMemberGroup(MemberGroup *grp) m_impl->memberGroup = grp; } -bool MemberDef::visibleMemberGroup(bool hideNoHeader) -{ - return m_impl->memberGroup!=0 && - (!hideNoHeader || m_impl->memberGroup->header()!="[NOHEADER]"); +bool MemberDef::visibleMemberGroup(bool hideNoHeader) +{ + return m_impl->memberGroup!=0 && + (!hideNoHeader || m_impl->memberGroup->header()!="[NOHEADER]"); } QCString MemberDef::getScopeString() const @@ -3156,17 +3281,17 @@ void MemberDef::setAnchor() // twice, which is silly, but we keep it this way for backward // compatibility. - // include number of template arguments as well, + // include number of template arguments as well, // to distinguish between two template // specializations that only differ in the template parameters. - if (m_impl->tArgList) + if (m_impl->tArgList) { char buf[20]; qsnprintf(buf,20,"%d:",m_impl->tArgList->count()); buf[19]='\0'; memAnchor.prepend(buf); } - + // convert to md5 hash uchar md5_sig[16]; QCString sigStr(33); @@ -3187,12 +3312,12 @@ void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri, m_impl->groupStartLine=startLine; m_impl->groupHasDocs=hasDocs; m_impl->groupMember=member; - m_isLinkableCached = 0; + m_isLinkableCached = 0; } -void MemberDef::setEnumScope(MemberDef *md,bool livesInsideEnum) -{ - m_impl->enumScope=md; +void MemberDef::setEnumScope(MemberDef *md,bool livesInsideEnum) +{ + m_impl->enumScope=md; m_impl->livesInsideEnum=livesInsideEnum; if (md->getGroupDef()) { @@ -3201,22 +3326,22 @@ void MemberDef::setEnumScope(MemberDef *md,bool livesInsideEnum) m_impl->groupFileName=md->getGroupFileName(); m_impl->groupStartLine=md->getGroupStartLine(); m_impl->groupHasDocs=md->getGroupHasDocs(); - m_isLinkableCached = 0; + m_isLinkableCached = 0; } } -void MemberDef::setMemberClass(ClassDef *cd) -{ - m_impl->classDef=cd; - m_isLinkableCached = 0; - m_isConstructorCached = 0; - setOuterScope(cd); +void MemberDef::setMemberClass(ClassDef *cd) +{ + m_impl->classDef=cd; + m_isLinkableCached = 0; + m_isConstructorCached = 0; + setOuterScope(cd); } -void MemberDef::setNamespace(NamespaceDef *nd) -{ - m_impl->nspace=nd; - setOuterScope(nd); +void MemberDef::setNamespace(NamespaceDef *nd) +{ + m_impl->nspace=nd; + setOuterScope(nd); } MemberDef *MemberDef::createTemplateInstanceMember( @@ -3235,7 +3360,7 @@ MemberDef *MemberDef::createTemplateInstanceMember( { arg->type = substituteTemplateArgumentsInString(arg->type,formalArgs,actualArgs); } - actualArgList->trailingReturnType = + actualArgList->trailingReturnType = substituteTemplateArgumentsInString(actualArgList->trailingReturnType,formalArgs,actualArgs); } @@ -3247,9 +3372,9 @@ MemberDef *MemberDef::createTemplateInstanceMember( MemberDef *imd = new MemberDef( getDefFileName(),getDefLine(),getDefColumn(), - substituteTemplateArgumentsInString(m_impl->type,formalArgs,actualArgs), - methodName, - substituteTemplateArgumentsInString(m_impl->args,formalArgs,actualArgs), + substituteTemplateArgumentsInString(m_impl->type,formalArgs,actualArgs), + methodName, + substituteTemplateArgumentsInString(m_impl->args,formalArgs,actualArgs), m_impl->exception, m_impl->prot, m_impl->virt, m_impl->stat, m_impl->related, m_impl->mtype, 0, 0 ); @@ -3261,7 +3386,7 @@ MemberDef *MemberDef::createTemplateInstanceMember( // TODO: init other member variables (if needed). // TODO: reimplemented info - return imd; + return imd; } bool MemberDef::hasOneLineInitializer() const @@ -3277,15 +3402,15 @@ bool MemberDef::hasMultiLineInitializer() const { //printf("initLines=%d userInitLines=%d maxInitLines=%d\n", // initLines,userInitLines,maxInitLines); - return m_impl->initLines>0 && + return m_impl->initLines>0 && ((m_impl->initLines<m_impl->maxInitLines && m_impl->userInitLines==-1) // implicitly enabled || m_impl->initLines<m_impl->userInitLines // explicitly enabled ); } -void MemberDef::setInitializer(const char *initializer) -{ - m_impl->initializer=initializer; +void MemberDef::setInitializer(const char *initializer) +{ + m_impl->initializer=initializer; int l=m_impl->initializer.length(); int p=l-1; while (p>=0 && isspace((uchar)m_impl->initializer.at(p))) p--; @@ -3299,12 +3424,12 @@ void MemberDef::addListReference(Definition *) static bool optimizeOutputForC = Config_getBool("OPTIMIZE_OUTPUT_FOR_C"); //static bool hideScopeNames = Config_getBool("HIDE_SCOPE_NAMES"); //static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); - //static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); + //static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); SrcLangExt lang = getLanguage(); visited=TRUE; if (!isLinkableInProject()) return; QCString memLabel; - if (optimizeOutputForC) + if (optimizeOutputForC) { memLabel=theTranslator->trGlobal(TRUE,TRUE); } @@ -3318,11 +3443,11 @@ void MemberDef::addListReference(Definition *) } QCString memName = name(); Definition *pd=getOuterScope(); - QCString pdName = pd->definitionType()==Definition::TypeClass ? + QCString pdName = pd->definitionType()==Definition::TypeClass ? ((ClassDef*)pd)->displayName() : pd->name(); QCString sep = getLanguageSpecificSeparator(lang,TRUE); QCString memArgs; - if (!isRelated() + if (!isRelated() /* && commented out as a result of bug 597016 ( (!hideScopeNames && // there is a scope @@ -3338,7 +3463,7 @@ void MemberDef::addListReference(Definition *) { memName = "[" + pd->name() + " " + name() + "]"; } - else + else { if (pd!=Doxygen::globalScope) memName.prepend(pdName+sep); memArgs = argsString(); @@ -3354,19 +3479,19 @@ void MemberDef::addListReference(Definition *) } } -MemberList *MemberDef::getSectionList(Definition *d) const -{ +MemberList *MemberDef::getSectionList(Definition *d) const +{ char key[20]; sprintf(key,"%p",d); return (d!=0 && m_impl->classSectionSDict) ? m_impl->classSectionSDict->find(key) : 0; } -void MemberDef::setSectionList(Definition *d, MemberList *sl) -{ +void MemberDef::setSectionList(Definition *d, MemberList *sl) +{ //printf("MemberDef::setSectionList(%p,%p) name=%s\n",d,sl,name().data()); char key[20]; sprintf(key,"%p",d); - if (m_impl->classSectionSDict==0) + if (m_impl->classSectionSDict==0) { m_impl->classSectionSDict = new SDict<MemberList>(7); } @@ -3375,7 +3500,7 @@ void MemberDef::setSectionList(Definition *d, MemberList *sl) Specifier MemberDef::virtualness(int count) const { - if (count>25) + if (count>25) { warn(getDefFileName(),getDefLine(), "Internal inconsistency: recursion detected in overload relation for member %s!" @@ -3394,7 +3519,7 @@ Specifier MemberDef::virtualness(int count) const } void MemberDef::_writeTagData(const DefType compoundType) -{ +{ unsigned typeMask = 1 << compoundType; if ((m_impl->tagDataWritten) & typeMask) return; // member already written for this type if (m_impl->mtype==MemberType_EnumValue && m_impl->enumScope && @@ -3426,13 +3551,13 @@ void MemberDef::_writeTagData(const DefType compoundType) Doxygen::tagFile << "\" protection=\""; if (m_impl->prot==Protected) Doxygen::tagFile << "protected"; else if (m_impl->prot==Package) Doxygen::tagFile << "package"; - else /* Private */ Doxygen::tagFile << "private"; + else /* Private */ Doxygen::tagFile << "private"; } if (m_impl->virt!=Normal) { Doxygen::tagFile << "\" virtualness=\""; if (m_impl->virt==Virtual) Doxygen::tagFile << "virtual"; - else /* Pure */ Doxygen::tagFile << "pure"; + else /* Pure */ Doxygen::tagFile << "pure"; } if (isStatic()) { @@ -3463,11 +3588,11 @@ void MemberDef::_writeTagData(const DefType compoundType) Doxygen::tagFile << " <enumvalue file=\"" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension); Doxygen::tagFile << "\" anchor=\"" << convertToXML(fmd->anchor()); QCString idStr = fmd->id(); - if (!idStr.isEmpty()) + if (!idStr.isEmpty()) { Doxygen::tagFile << "\" clangid=\"" << convertToXML(idStr); } - Doxygen::tagFile << "\">" << convertToXML(fmd->name()) << "</enumvalue>" << endl; + Doxygen::tagFile << "\">" << convertToXML(fmd->name()) << "</enumvalue>" << endl; } } } @@ -3482,7 +3607,7 @@ void MemberDef::_writeTagData(const DefType compoundType) void MemberDef::_computeIsConstructor() { m_isConstructorCached=1; // FALSE - if (m_impl->classDef) + if (m_impl->classDef) { if (m_impl->isDMember) // for D { @@ -3490,11 +3615,11 @@ void MemberDef::_computeIsConstructor() return; } else if (getLanguage()==SrcLangExt_PHP) // for PHP - { + { m_isConstructorCached = name()=="__construct" ? 2 : 1; return; } - else if (name()=="__init__" && + else if (name()=="__init__" && getLanguage()==SrcLangExt_Python) // for Python { m_isConstructorCached = 2; // TRUE @@ -3522,8 +3647,8 @@ void MemberDef::_computeIsConstructor() } } -bool MemberDef::isConstructor() const -{ +bool MemberDef::isConstructor() const +{ if (m_isConstructorCached==0) { MemberDef *that = (MemberDef*)this; @@ -3542,14 +3667,14 @@ void MemberDef::_computeIsDestructor() isDestructor = name()=="~this"; } else if (getLanguage()==SrcLangExt_PHP) // for PHP - { + { isDestructor = name()=="__destruct"; } else if (getLanguage()==SrcLangExt_Tcl) // for Tcl - { + { isDestructor = name()=="destructor"; } - else if (name()=="__del__" && + else if (name()=="__del__" && getLanguage()==SrcLangExt_Python) // for Python { isDestructor=TRUE; @@ -3558,13 +3683,13 @@ void MemberDef::_computeIsDestructor() { isDestructor = (name().find('~')!=-1 || name().find('!')!=-1) // The ! is for C++/CLI - && name().find("operator")==-1; + && name().find("operator")==-1; } m_isDestructorCached = isDestructor ? 2 : 1; } bool MemberDef::isDestructor() const -{ +{ if (m_isDestructorCached==0) { MemberDef *that=(MemberDef*)this; @@ -3575,7 +3700,7 @@ bool MemberDef::isDestructor() const } void MemberDef::writeEnumDeclaration(OutputList &typeDecl, - ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd, + ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd, const DefType compoundType) { int enumMemCount=0; @@ -3591,7 +3716,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl, fmd=fmdl->next(); } } - if (numVisibleEnumValues==0 && !isBriefSectionVisible()) + if (numVisibleEnumValues==0 && !isBriefSectionVisible()) { return; } @@ -3642,7 +3767,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl, typeDecl.pushGeneratorState(); typeDecl.disableAllBut(OutputGenerator::Html); typeDecl.enable(OutputGenerator::Latex); - typeDecl.lineBreak(); + typeDecl.lineBreak(); typeDecl.disable(OutputGenerator::Latex); typeDecl.writeString("  "); typeDecl.popGeneratorState(); @@ -3669,7 +3794,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl, bool prevVisible = fmdVisible; fmd=fmdl->next(); - if (fmd && (fmdVisible=fmd->isBriefSectionVisible())) + if (fmd && (fmdVisible=fmd->isBriefSectionVisible())) { typeDecl.writeString(", "); } @@ -3685,7 +3810,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl, { typeDecl.pushGeneratorState(); typeDecl.disableAllBut(OutputGenerator::Html); - typeDecl.lineBreak(); + typeDecl.lineBreak(); typeDecl.popGeneratorState(); } } @@ -3693,8 +3818,8 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl, } } -void MemberDef::setArgumentList(ArgumentList *al) -{ +void MemberDef::setArgumentList(ArgumentList *al) +{ if (m_impl->defArgList) delete m_impl->defArgList; m_impl->defArgList = al; } @@ -3732,25 +3857,25 @@ void MemberDef::setAccessorType(ClassDef *cd,const char *t) void MemberDef::findSectionsInDocumentation() { - docFindSections(documentation(),this,0,docFile()); + docFindSections(documentation(),this,0,docFile()); } -void MemberDef::enableCallGraph(bool e) -{ - m_impl->hasCallGraph=e; +void MemberDef::enableCallGraph(bool e) +{ + m_impl->hasCallGraph=e; if (e) Doxygen::parseSourcesNeeded = TRUE; } -void MemberDef::enableCallerGraph(bool e) -{ - m_impl->hasCallerGraph=e; +void MemberDef::enableCallerGraph(bool e) +{ + m_impl->hasCallerGraph=e; if (e) Doxygen::parseSourcesNeeded = TRUE; } #if 0 bool MemberDef::protectionVisible() const { - return m_impl->prot==Public || + return m_impl->prot==Public || (m_impl->prot==Private && Config_getBool("EXTRACT_PRIVATE")) || (m_impl->prot==Protected && Config_getBool("EXTRACT_PROTECTED")) || (m_impl->prot==Package && Config_getBool("EXTRACT_PACKAGE")); @@ -3771,13 +3896,13 @@ void MemberDef::setInbodyDocumentation(const char *docs, bool MemberDef::isObjCMethod() const { if (m_impl->classDef && m_impl->classDef->isObjectiveC() && isFunction()) return TRUE; - return FALSE; + return FALSE; } bool MemberDef::isObjCProperty() const { if (m_impl->classDef && m_impl->classDef->isObjectiveC() && isProperty()) return TRUE; - return FALSE; + return FALSE; } QCString MemberDef::qualifiedName() const @@ -3801,7 +3926,7 @@ QCString MemberDef::qualifiedName() const else { return Definition::qualifiedName(); - } + } } void MemberDef::setTagInfo(TagInfo *ti) @@ -3833,12 +3958,12 @@ QCString MemberDef::objCMethodName(bool localLink,bool showStatic) const } const char *MemberDef::declaration() const -{ - return m_impl->decl; +{ + return m_impl->decl; } const char *MemberDef::definition() const -{ +{ return m_impl->def; } @@ -3848,133 +3973,133 @@ const char *MemberDef::extraTypeChars() const } const char *MemberDef::typeString() const -{ - return m_impl->type; +{ + return m_impl->type; } const char *MemberDef::argsString() const -{ - return m_impl->args; +{ + return m_impl->args; } const char *MemberDef::excpString() const -{ - return m_impl->exception; +{ + return m_impl->exception; } const char *MemberDef::bitfieldString() const -{ - return m_impl->bitfields; +{ + return m_impl->bitfields; } const QCString &MemberDef::initializer() const -{ - return m_impl->initializer; +{ + return m_impl->initializer; } int MemberDef::initializerLines() const -{ - return m_impl->initLines; +{ + return m_impl->initLines; } uint64 MemberDef::getMemberSpecifiers() const -{ - return m_impl->memSpec; +{ + return m_impl->memSpec; } ClassDef *MemberDef::getClassDef() const -{ - return m_impl->classDef; +{ + return m_impl->classDef; } FileDef *MemberDef::getFileDef() const -{ - return m_impl->fileDef; +{ + return m_impl->fileDef; } NamespaceDef* MemberDef::getNamespaceDef() const -{ - return m_impl->nspace; +{ + return m_impl->nspace; } const char *MemberDef::getReadAccessor() const -{ - return m_impl->read; +{ + return m_impl->read; } const char *MemberDef::getWriteAccessor() const -{ - return m_impl->write; +{ + return m_impl->write; } GroupDef *MemberDef::getGroupDef() const -{ - return m_impl->group; +{ + return m_impl->group; } Grouping::GroupPri_t MemberDef::getGroupPri() const -{ - return m_impl->grouppri; +{ + return m_impl->grouppri; } const char *MemberDef::getGroupFileName() const -{ - return m_impl->groupFileName; +{ + return m_impl->groupFileName; } int MemberDef::getGroupStartLine() const -{ - return m_impl->groupStartLine; +{ + return m_impl->groupStartLine; } bool MemberDef::getGroupHasDocs() const -{ - return m_impl->groupHasDocs; +{ + return m_impl->groupHasDocs; } Protection MemberDef::protection() const -{ - return m_impl->prot; +{ + return m_impl->prot; } MemberType MemberDef::memberType() const -{ - return m_impl->mtype; +{ + return m_impl->mtype; } bool MemberDef::isSignal() const -{ - return m_impl->mtype==MemberType_Signal; +{ + return m_impl->mtype==MemberType_Signal; } bool MemberDef::isSlot() const -{ - return m_impl->mtype==MemberType_Slot; +{ + return m_impl->mtype==MemberType_Slot; } bool MemberDef::isVariable() const -{ - return m_impl->mtype==MemberType_Variable; +{ + return m_impl->mtype==MemberType_Variable; } bool MemberDef::isEnumerate() const -{ - return m_impl->mtype==MemberType_Enumeration; +{ + return m_impl->mtype==MemberType_Enumeration; } bool MemberDef::isEnumValue() const -{ - return m_impl->mtype==MemberType_EnumValue; +{ + return m_impl->mtype==MemberType_EnumValue; } bool MemberDef::isTypedef() const -{ - return m_impl->mtype==MemberType_Typedef; +{ + return m_impl->mtype==MemberType_Typedef; } bool MemberDef::isFunction() const -{ - return m_impl->mtype==MemberType_Function; +{ + return m_impl->mtype==MemberType_Function; } bool MemberDef::isFunctionPtr() const @@ -3983,175 +4108,175 @@ bool MemberDef::isFunctionPtr() const } bool MemberDef::isDefine() const -{ - return m_impl->mtype==MemberType_Define; +{ + return m_impl->mtype==MemberType_Define; } bool MemberDef::isFriend() const -{ - return m_impl->mtype==MemberType_Friend; +{ + return m_impl->mtype==MemberType_Friend; } bool MemberDef::isDCOP() const -{ - return m_impl->mtype==MemberType_DCOP; +{ + return m_impl->mtype==MemberType_DCOP; } bool MemberDef::isProperty() const -{ - return m_impl->mtype==MemberType_Property; +{ + return m_impl->mtype==MemberType_Property; } bool MemberDef::isEvent() const -{ - return m_impl->mtype==MemberType_Event; +{ + return m_impl->mtype==MemberType_Event; } bool MemberDef::isRelated() const -{ +{ return m_impl->related == Related; } bool MemberDef::isForeign() const -{ - return m_impl->related == Foreign; +{ + return m_impl->related == Foreign; } bool MemberDef::isStatic() const -{ - return m_impl->stat; +{ + return m_impl->stat; } bool MemberDef::isInline() const -{ - return (m_impl->memSpec&Entry::Inline)!=0; +{ + return (m_impl->memSpec&Entry::Inline)!=0; } bool MemberDef::isExplicit() const -{ - return (m_impl->memSpec&Entry::Explicit)!=0; +{ + return (m_impl->memSpec&Entry::Explicit)!=0; } bool MemberDef::isMutable() const -{ - return (m_impl->memSpec&Entry::Mutable)!=0; +{ + return (m_impl->memSpec&Entry::Mutable)!=0; } bool MemberDef::isGettable() const -{ - return (m_impl->memSpec&Entry::Gettable)!=0; +{ + return (m_impl->memSpec&Entry::Gettable)!=0; } bool MemberDef::isSettable() const -{ - return (m_impl->memSpec&Entry::Settable)!=0; +{ + return (m_impl->memSpec&Entry::Settable)!=0; } bool MemberDef::isAddable() const -{ - return (m_impl->memSpec&Entry::Addable)!=0; +{ + return (m_impl->memSpec&Entry::Addable)!=0; } bool MemberDef::isRemovable() const -{ - return (m_impl->memSpec&Entry::Removable)!=0; +{ + return (m_impl->memSpec&Entry::Removable)!=0; } bool MemberDef::isRaisable() const -{ - return (m_impl->memSpec&Entry::Raisable)!=0; +{ + return (m_impl->memSpec&Entry::Raisable)!=0; } bool MemberDef::isReadable() const -{ - return (m_impl->memSpec&Entry::Readable)!=0; +{ + return (m_impl->memSpec&Entry::Readable)!=0; } bool MemberDef::isWritable() const -{ - return (m_impl->memSpec&Entry::Writable)!=0; +{ + return (m_impl->memSpec&Entry::Writable)!=0; } bool MemberDef::isFinal() const -{ - return (m_impl->memSpec&Entry::Final)!=0; +{ + return (m_impl->memSpec&Entry::Final)!=0; } bool MemberDef::isNew() const -{ - return (m_impl->memSpec&Entry::New)!=0; +{ + return (m_impl->memSpec&Entry::New)!=0; } bool MemberDef::isSealed() const -{ - return (m_impl->memSpec&Entry::Sealed)!=0; +{ + return (m_impl->memSpec&Entry::Sealed)!=0; } bool MemberDef::isOverride() const -{ - return (m_impl->memSpec&Entry::Override)!=0; +{ + return (m_impl->memSpec&Entry::Override)!=0; } bool MemberDef::isInitonly() const -{ - return (m_impl->memSpec&Entry::Initonly)!=0; +{ + return (m_impl->memSpec&Entry::Initonly)!=0; } bool MemberDef::isAbstract() const -{ - return (m_impl->memSpec&Entry::Abstract)!=0; +{ + return (m_impl->memSpec&Entry::Abstract)!=0; } bool MemberDef::isOptional() const -{ - return (m_impl->memSpec&Entry::Optional)!=0; +{ + return (m_impl->memSpec&Entry::Optional)!=0; } bool MemberDef::isRequired() const -{ - return (m_impl->memSpec&Entry::Required)!=0; +{ + return (m_impl->memSpec&Entry::Required)!=0; } bool MemberDef::isNonAtomic() const -{ - return (m_impl->memSpec&Entry::NonAtomic)!=0; +{ + return (m_impl->memSpec&Entry::NonAtomic)!=0; } bool MemberDef::isCopy() const -{ - return (m_impl->memSpec&Entry::Copy)!=0; +{ + return (m_impl->memSpec&Entry::Copy)!=0; } bool MemberDef::isAssign() const -{ - return (m_impl->memSpec&Entry::Assign)!=0; +{ + return (m_impl->memSpec&Entry::Assign)!=0; } bool MemberDef::isRetain() const -{ - return (m_impl->memSpec&Entry::Retain)!=0; +{ + return (m_impl->memSpec&Entry::Retain)!=0; } bool MemberDef::isWeak() const { - return (m_impl->memSpec&Entry::Weak)!=0; + return (m_impl->memSpec&Entry::Weak)!=0; } bool MemberDef::isStrong() const { - return (m_impl->memSpec&Entry::Strong)!=0; + return (m_impl->memSpec&Entry::Strong)!=0; } bool MemberDef::isStrongEnumValue() const { return m_impl->mtype==MemberType_EnumValue && - m_impl->enumScope && + m_impl->enumScope && m_impl->enumScope->isStrong(); } bool MemberDef::isUnretained() const { - return (m_impl->memSpec&Entry::Unretained)!=0; + return (m_impl->memSpec&Entry::Unretained)!=0; } bool MemberDef::isAlias() const @@ -4226,356 +4351,361 @@ bool MemberDef::isPublished() const bool MemberDef::isImplementation() const -{ - return m_impl->implOnly; +{ + return m_impl->implOnly; } bool MemberDef::isExternal() const -{ - return m_impl->explExt; +{ + return m_impl->explExt; } bool MemberDef::isTemplateSpecialization() const -{ - return m_impl->tspec; +{ + return m_impl->tspec; } bool MemberDef::hasDocumentedParams() const -{ - return m_impl->hasDocumentedParams; +{ + return m_impl->hasDocumentedParams; } bool MemberDef::hasDocumentedReturnType() const -{ - return m_impl->hasDocumentedReturnType; +{ + return m_impl->hasDocumentedReturnType; } bool MemberDef::showInCallGraph() const { - return isFunction() || - isSlot() || + return isFunction() || + isSlot() || isConstructor() || - isDestructor() || + isDestructor() || isObjCMethod(); } ClassDef *MemberDef::relatedAlso() const -{ - return m_impl->relatedAlso; +{ + return m_impl->relatedAlso; } bool MemberDef::hasDocumentedEnumValues() const -{ - return m_impl->docEnumValues; +{ + return m_impl->docEnumValues; } MemberDef *MemberDef::getAnonymousEnumType() const -{ - return m_impl->annEnumType; +{ + return m_impl->annEnumType; } bool MemberDef::isDocsForDefinition() const -{ - return m_impl->docsForDefinition; +{ + return m_impl->docsForDefinition; } MemberDef *MemberDef::getEnumScope() const -{ - return m_impl->enumScope; +{ + return m_impl->enumScope; } MemberList *MemberDef::enumFieldList() const -{ - return m_impl->enumFields; +{ + return m_impl->enumFields; } ExampleSDict *MemberDef::getExamples() const -{ - return m_impl->exampleSDict; +{ + return m_impl->exampleSDict; } bool MemberDef::isPrototype() const -{ - return m_impl->proto; +{ + return m_impl->proto; } ArgumentList *MemberDef::argumentList() const -{ - return m_impl->defArgList; +{ + return m_impl->defArgList; } ArgumentList *MemberDef::declArgumentList() const -{ - return m_impl->declArgList; +{ + return m_impl->declArgList; } ArgumentList *MemberDef::templateArguments() const -{ - return m_impl->tArgList; +{ + return m_impl->tArgList; } QList<ArgumentList> *MemberDef::definitionTemplateParameterLists() const -{ - return m_impl->defTmpArgLists; +{ + return m_impl->defTmpArgLists; } int MemberDef::getMemberGroupId() const -{ - return m_impl->grpId; +{ + return m_impl->grpId; } MemberGroup *MemberDef::getMemberGroup() const -{ - return m_impl->memberGroup; +{ + return m_impl->memberGroup; } bool MemberDef::fromAnonymousScope() const -{ - return m_impl->annScope; +{ + return m_impl->annScope; } bool MemberDef::anonymousDeclShown() const -{ - return m_impl->annUsed; +{ + return m_impl->annUsed; } -void MemberDef::setAnonymousUsed() +void MemberDef::setAnonymousUsed() { m_impl->annUsed = TRUE; } bool MemberDef::hasCallGraph() const -{ - return m_impl->hasCallGraph; +{ + return m_impl->hasCallGraph; } bool MemberDef::hasCallerGraph() const -{ - return m_impl->hasCallerGraph; +{ + return m_impl->hasCallerGraph; } MemberDef *MemberDef::templateMaster() const -{ - return m_impl->templateMaster; +{ + return m_impl->templateMaster; } bool MemberDef::isTypedefValCached() const -{ - return m_impl->isTypedefValCached; +{ + return m_impl->isTypedefValCached; } ClassDef *MemberDef::getCachedTypedefVal() const -{ - return m_impl->cachedTypedefValue; +{ + return m_impl->cachedTypedefValue; } QCString MemberDef::getCachedTypedefTemplSpec() const -{ - return m_impl->cachedTypedefTemplSpec; +{ + return m_impl->cachedTypedefTemplSpec; } QCString MemberDef::getCachedResolvedTypedef() const -{ +{ //printf("MemberDef::getCachedResolvedTypedef()=%s m_impl=%p\n",m_impl->cachedResolvedType.data(),m_impl); - return m_impl->cachedResolvedType; + return m_impl->cachedResolvedType; } MemberDef *MemberDef::memberDefinition() const -{ - return m_impl->memDef; +{ + return m_impl->memDef; } MemberDef *MemberDef::memberDeclaration() const -{ - return m_impl->memDec; +{ + return m_impl->memDec; } MemberDef *MemberDef::inheritsDocsFrom() const -{ - return m_impl->docProvider; +{ + return m_impl->docProvider; } MemberDef *MemberDef::getGroupAlias() const -{ - return m_impl->groupAlias; +{ + return m_impl->groupAlias; } void MemberDef::setMemberType(MemberType t) -{ - m_impl->mtype=t; +{ + m_impl->mtype=t; m_isLinkableCached = 0; } void MemberDef::setDefinition(const char *d) -{ - m_impl->def=d; +{ + m_impl->def=d; } void MemberDef::setFileDef(FileDef *fd) -{ - m_impl->fileDef=fd; +{ + m_impl->fileDef=fd; m_isLinkableCached = 0; m_isConstructorCached = 0; m_isDestructorCached = 0; } void MemberDef::setProtection(Protection p) -{ - m_impl->prot=p; +{ + m_impl->prot=p; m_isLinkableCached = 0; } void MemberDef::setMemberSpecifiers(uint64 s) -{ - m_impl->memSpec=s; +{ + m_impl->memSpec=s; } void MemberDef::mergeMemberSpecifiers(uint64 s) -{ - m_impl->memSpec|=s; +{ + m_impl->memSpec|=s; } void MemberDef::setBitfields(const char *s) -{ - m_impl->bitfields = s; +{ + m_impl->bitfields = QCString(s).simplifyWhiteSpace(); } void MemberDef::setMaxInitLines(int lines) -{ +{ if (lines!=-1) { - m_impl->userInitLines=lines; + m_impl->userInitLines=lines; } } void MemberDef::setExplicitExternal(bool b) -{ - m_impl->explExt=b; +{ + m_impl->explExt=b; } void MemberDef::setReadAccessor(const char *r) -{ - m_impl->read=r; +{ + m_impl->read=r; } void MemberDef::setWriteAccessor(const char *w) -{ - m_impl->write=w; +{ + m_impl->write=w; } void MemberDef::setTemplateSpecialization(bool b) -{ - m_impl->tspec=b; +{ + m_impl->tspec=b; } void MemberDef::makeRelated() -{ - m_impl->related = Related; +{ + m_impl->related = Related; m_isLinkableCached = 0; } void MemberDef::makeForeign() -{ - m_impl->related = Foreign; +{ + m_impl->related = Foreign; m_isLinkableCached = 0; } void MemberDef::setHasDocumentedParams(bool b) -{ - m_impl->hasDocumentedParams = b; +{ + m_impl->hasDocumentedParams = b; } void MemberDef::setHasDocumentedReturnType(bool b) -{ - m_impl->hasDocumentedReturnType = b; +{ + m_impl->hasDocumentedReturnType = b; } void MemberDef::setInheritsDocsFrom(MemberDef *md) -{ - m_impl->docProvider = md; +{ + m_impl->docProvider = md; } void MemberDef::setArgsString(const char *as) -{ - m_impl->args = as; +{ + m_impl->args = as; } void MemberDef::setRelatedAlso(ClassDef *cd) -{ - m_impl->relatedAlso=cd; +{ + m_impl->relatedAlso=cd; } void MemberDef::setEnumClassScope(ClassDef *cd) -{ - m_impl->classDef = cd; - m_isLinkableCached = 0; - m_isConstructorCached = 0; +{ + m_impl->classDef = cd; + m_isLinkableCached = 0; + m_isConstructorCached = 0; } void MemberDef::setDocumentedEnumValues(bool value) -{ - m_impl->docEnumValues=value; +{ + m_impl->docEnumValues=value; } void MemberDef::setAnonymousEnumType(MemberDef *md) -{ - m_impl->annEnumType = md; +{ + m_impl->annEnumType = md; } void MemberDef::setPrototype(bool p) -{ - m_impl->proto=p; +{ + m_impl->proto=p; } void MemberDef::setMemberGroupId(int id) -{ - m_impl->grpId=id; +{ + m_impl->grpId=id; } void MemberDef::makeImplementationDetail() -{ - m_impl->implOnly=TRUE; +{ + m_impl->implOnly=TRUE; } void MemberDef::setFromAnonymousScope(bool b) -{ - m_impl->annScope=b; +{ + m_impl->annScope=b; } void MemberDef::setFromAnonymousMember(MemberDef *m) -{ - m_impl->annMemb=m; +{ + m_impl->annMemb=m; +} + +MemberDef *MemberDef::fromAnonymousMember() const +{ + return m_impl->annMemb; } void MemberDef::setTemplateMaster(MemberDef *mt) -{ - m_impl->templateMaster=mt; - m_isLinkableCached = 0; +{ + m_impl->templateMaster=mt; + m_isLinkableCached = 0; } void MemberDef::setDocsForDefinition(bool b) -{ - m_impl->docsForDefinition = b; +{ + m_impl->docsForDefinition = b; } void MemberDef::setGroupAlias(MemberDef *md) -{ - m_impl->groupAlias = md; +{ + m_impl->groupAlias = md; } void MemberDef::invalidateTypedefValCache() -{ - m_impl->isTypedefValCached=FALSE; +{ + m_impl->isTypedefValCached=FALSE; } void MemberDef::setMemberDefinition(MemberDef *md) -{ - m_impl->memDef=md; +{ + m_impl->memDef=md; } void MemberDef::setMemberDeclaration(MemberDef *md) -{ - m_impl->memDec=md; +{ + m_impl->memDec=md; } ClassDef *MemberDef::category() const @@ -4611,9 +4741,9 @@ QCString MemberDef::enumBaseType() const void MemberDef::cacheTypedefVal(ClassDef*val, const QCString & templSpec, const QCString &resolvedType) { - m_impl->isTypedefValCached=TRUE; - m_impl->cachedTypedefValue=val; - m_impl->cachedTypedefTemplSpec=templSpec; + m_impl->isTypedefValCached=TRUE; + m_impl->cachedTypedefValue=val; + m_impl->cachedTypedefTemplSpec=templSpec; m_impl->cachedResolvedType=resolvedType; //printf("MemberDef::cacheTypedefVal=%s m_impl=%p\n",m_impl->cachedResolvedType.data(),m_impl); } @@ -4669,9 +4799,9 @@ void MemberDef::invalidateCachedArgumentTypes() //---------------- -QCString MemberDef::displayName(bool) const -{ - return Definition::name(); +QCString MemberDef::displayName(bool) const +{ + return Definition::name(); } void MemberDef::_addToSearchIndex() @@ -4855,3 +4985,33 @@ void combineDeclarationAndDefinition(MemberDef *mdec,MemberDef *mdef) } } +QCString MemberDef::briefDescription(bool abbr) const +{ + if (m_impl->templateMaster) + { + return m_impl->templateMaster->briefDescription(abbr); + } + else + { + return Definition::briefDescription(abbr); + } +} + +QCString MemberDef::documentation() const +{ + if (m_impl->templateMaster) + { + return m_impl->templateMaster->documentation(); + } + else + { + return Definition::documentation(); + } +} + +const ArgumentList *MemberDef::typeConstraints() const +{ + return m_impl->typeConstraints; +} + + diff --git a/src/memberdef.h b/src/memberdef.h index fc2bb44..47912b8 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -75,6 +75,7 @@ class MemberDef : public Definition int initializerLines() const; uint64 getMemberSpecifiers() const; MemberList *getSectionList(Definition *d) const; + QCString displayDefinition() const; // scope query members ClassDef *getClassDef() const; @@ -216,6 +217,7 @@ class MemberDef : public Definition bool fromAnonymousScope() const; bool anonymousDeclShown() const; + MemberDef *fromAnonymousMember() const; // callgraph related members bool hasCallGraph() const; @@ -241,6 +243,16 @@ class MemberDef : public Definition MemberDef *categoryRelation() const; QCString displayName(bool=TRUE) const; + QCString getDeclType() const; + void getLabels(QStrList &sl,Definition *container) const; + + const ArgumentList *typeConstraints() const; + + // overrules + QCString documentation() const; + QCString briefDescription(bool abbr=FALSE) const; + + //----------------------------------------------------------------------------------- // ---- setters ----- @@ -383,7 +395,7 @@ class MemberDef : public Definition void _computeLinkableInProject(); void _computeIsConstructor(); void _computeIsDestructor(); - void _getLabels(QStrList &sl,Definition *container) const; + void _writeGroupInclude(OutputList &ol,bool inGroup); void _writeCallGraph(OutputList &ol); void _writeCallerGraph(OutputList &ol); void _writeReimplements(OutputList &ol); diff --git a/src/membergroup.h b/src/membergroup.h index 64a521b..c5a2d0c 100644 --- a/src/membergroup.h +++ b/src/membergroup.h @@ -61,8 +61,8 @@ class MemberGroup MemberListType lt, ClassDef *inheritedFrom,const QCString &inheritId); - QCString documentation() { return doc; } - bool allMembersInSameSection() { return inSameSection; } + QCString documentation() const { return doc; } + bool allMembersInSameSection() const { return inSameSection; } void addToDeclarationSection(); int countDecMembers(GroupDef *gd=0); int countDocMembers(); diff --git a/src/memberlist.cpp b/src/memberlist.cpp index 68edabc..101293a 100644 --- a/src/memberlist.cpp +++ b/src/memberlist.cpp @@ -489,6 +489,7 @@ void MemberList::writePlainDeclarations(OutputList &ol, * @param inheritedFrom if not 0, the list is shown inside the * given class as inherited members, parameter cd points to the * class containing the members. + * @param lt Type of list that is inherited from. */ void MemberList::writeDeclarations(OutputList &ol, ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd, @@ -878,7 +879,7 @@ void MemberList::setNeedsSorting(bool b) m_needsSorting = b; } -QCString MemberList::listTypeAsString(MemberListType type) const +QCString MemberList::listTypeAsString(MemberListType type) { switch(type) { diff --git a/src/memberlist.h b/src/memberlist.h index 7241258..9dfa104 100644 --- a/src/memberlist.h +++ b/src/memberlist.h @@ -36,7 +36,7 @@ class MemberList : public QList<MemberDef> MemberList(MemberListType lt); ~MemberList(); MemberListType listType() const { return m_listType; } - QCString listTypeAsString(MemberListType type) const; + static QCString listTypeAsString(MemberListType type); bool insert(uint index,const MemberDef *md); void inSort(const MemberDef *md); void append(const MemberDef *md); diff --git a/src/message.cpp b/src/message.cpp index 7c9c02b..dd3549a 100644 --- a/src/message.cpp +++ b/src/message.cpp @@ -1,12 +1,10 @@ /****************************************************************************** * - * - * * Copyright (C) 1997-2013 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * @@ -211,3 +209,30 @@ void err(const char *fmt, ...) vfprintf(warnFile, (QCString(error_str) + fmt).data(), args); va_end(args); } + +void printlex(int dbg, bool enter, const char *lexName, const char *fileName) +{ + const char *enter_txt = "entering"; + const char *enter_txt_uc = "Entering"; + + if (!enter) + { + enter_txt = "finished"; + enter_txt_uc = "Finished"; + } + + if (dbg) + { + if (fileName) + fprintf(stderr,"--%s lexical analyzer: %s (for: %s)\n",enter_txt, lexName, fileName); + else + fprintf(stderr,"--%s lexical analyzer: %s\n",enter_txt, lexName); + } + else + { + if (fileName) + Debug::print(Debug::Lex,0,"%s lexical analyzer: %s (for: %s)\n",enter_txt_uc, lexName, fileName); + else + Debug::print(Debug::Lex,0,"%s lexical analyzer: %s\n",enter_txt_uc, lexName); + } +} diff --git a/src/message.h b/src/message.h index e01b8be..b7bdfe4 100644 --- a/src/message.h +++ b/src/message.h @@ -29,4 +29,5 @@ extern void warn_uncond(const char *fmt, ...); extern void err(const char *fmt, ...); void initWarningFormat(); +extern void printlex(int dbg, bool enter, const char *lexName, const char *fileName); #endif diff --git a/src/msc.cpp b/src/msc.cpp index 91b1d05..3592e76 100644 --- a/src/msc.cpp +++ b/src/msc.cpp @@ -22,13 +22,13 @@ #include "docparser.h" #include "doxygen.h" #include "util.h" +#include "ftextstream.h" -#include <qtextstream.h> #include <qdir.h> static const int maxCmdLine = 40960; -static bool convertMapFile(QTextStream &t,const char *mapName,const QCString relPath, +static bool convertMapFile(FTextStream &t,const char *mapName,const QCString relPath, const QCString &context) { QFile f(mapName); @@ -103,15 +103,22 @@ void writeMscGraphFromFile(const char *inFile,const char *outDir, QCString mscExe = Config_getString("MSCGEN_PATH")+"mscgen"+portable_commandExtension(); QCString mscArgs; QCString extension; - if (format==MSC_BITMAP) + switch (format) { - mscArgs+="-T png"; - extension=".png"; - } - else if (format==MSC_EPS) - { - mscArgs+="-T eps"; - extension=".eps"; + case MSC_BITMAP: + mscArgs+="-T png"; + extension=".png"; + break; + case MSC_EPS: + mscArgs+="-T eps"; + extension=".eps"; + break; + case MSC_SVG: + mscArgs+="-T svg"; + extension=".svg"; + break; + default: + goto error; // I am not very fond of goto statements, but when in Rome... } mscArgs+=" -i \""; mscArgs+=inFile; @@ -175,8 +182,8 @@ QCString getMscImageMapFromFile(const QCString& inFile, const QCString& outDir, } portable_sysTimerStop(); - QString result; - QTextOStream tmpout(&result); + QGString result; + FTextStream tmpout(&result); convertMapFile(tmpout, outFile, relPath, context); QDir().remove(outFile); @@ -188,11 +195,28 @@ void writeMscImageMapFromFile(FTextStream &t,const QCString &inFile, const QCString &outDir, const QCString &relPath, const QCString &baseName, - const QCString &context) + const QCString &context, + MscOutputFormat format + ) { QCString mapName = baseName+".map"; QCString mapFile = inFile+".map"; - t << "<img src=\"" << relPath << baseName << ".png\" alt=\"" + t << "<img src=\"" << relPath << baseName << "."; + switch (format) + { + case MSC_BITMAP: + t << "png"; + break; + case MSC_EPS: + t << "eps"; + break; + case MSC_SVG: + t << "svg"; + break; + default: + t << "unknown"; + } + t << "\" alt=\"" << baseName << "\" border=\"0\" usemap=\"#" << mapName << "\"/>" << endl; QCString imap = getMscImageMapFromFile(inFile,outDir,relPath,context); t << "<map name=\"" << mapName << "\" id=\"" << mapName << "\">" << imap << "</map>" << endl; @@ -21,7 +21,7 @@ class QCString; class FTextStream; -enum MscOutputFormat { MSC_BITMAP , MSC_EPS }; +enum MscOutputFormat { MSC_BITMAP , MSC_EPS, MSC_SVG }; void writeMscGraphFromFile(const char *inFile,const char *outDir, const char *outFile,MscOutputFormat format); @@ -31,7 +31,9 @@ QCString getMscImageMapFromFile(const QCString& inFile, const QCString& outDir, void writeMscImageMapFromFile(FTextStream &t,const QCString &inFile, const QCString &outDir, const QCString &relPath, - const QCString &baseName, const QCString &context); + const QCString &baseName, const QCString &context, + MscOutputFormat format + ); #endif diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index ee1568e..d00d845 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -115,14 +115,15 @@ void NamespaceDef::findSectionsInDocumentation() } } -void NamespaceDef::insertUsedFile(const char *f) +void NamespaceDef::insertUsedFile(FileDef *fd) { - if (files.find(f)==-1) + if (fd==0) return; + if (files.find(fd)==-1) { if (Config_getBool("SORT_MEMBER_DOCS")) - files.inSort(f); + files.inSort(fd); else - files.append(f); + files.append(fd); } } @@ -429,7 +430,7 @@ void NamespaceDef::writeSummaryLinks(OutputList &ol) MemberList * ml = getMemberList(lmd->type); if (ml && ml->declVisible()) { - ol.writeSummaryLink(0,ml->listTypeAsString(ml->listType()),lmd->title(lang),first); + ol.writeSummaryLink(0,MemberList::listTypeAsString(ml->listType()),lmd->title(lang),first); first=FALSE; } } @@ -460,27 +461,8 @@ void NamespaceDef::writeDocumentation(OutputList &ol) static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); //static bool outputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); //static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); - SrcLangExt lang = getLanguage(); - QCString pageTitle; - if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp) - { - pageTitle = theTranslator->trPackage(displayName()); - } - else if (lang==SrcLangExt_Fortran) - { - pageTitle = theTranslator->trModuleReference(displayName()); - } - else if (lang==SrcLangExt_IDL) - { - pageTitle = isConstantGroup() - ? theTranslator->trConstantGroupReference(displayName()) - : theTranslator->trModuleReference(displayName()); - } - else - { - pageTitle = theTranslator->trNamespaceReference(displayName()); - } + QCString pageTitle = title(); startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_NamespaceVisible,!generateTreeView); if (!generateTreeView) @@ -522,6 +504,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol) //---------------------------------------- start flexible part ------------------------------- + SrcLangExt lang = getLanguage(); QListIterator<LayoutDocEntry> eli( LayoutDocManager::instance().docEntries(LayoutDocManager::Namespace)); LayoutDocEntry *lde; @@ -908,7 +891,7 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title, { if (nd->isConstantGroup()) { - err("Internal inconsistency: constant group but not IDL?"); + err("Internal inconsistency: constant group but not IDL?\n"); } found=TRUE; break; @@ -953,7 +936,7 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title, } else { - err("Internal inconsistency: namespace in IDL not module or cg"); + err("Internal inconsistency: namespace in IDL not module or cg\n"); } } ol.insertMemberAlign(); @@ -1096,3 +1079,27 @@ MemberDef * NamespaceDef::getMemberByName(const QCString &n) const return md; } +QCString NamespaceDef::title() const +{ + SrcLangExt lang = getLanguage(); + QCString pageTitle; + if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp) + { + pageTitle = theTranslator->trPackage(displayName()); + } + else if (lang==SrcLangExt_Fortran) + { + pageTitle = theTranslator->trModuleReference(displayName()); + } + else if (lang==SrcLangExt_IDL) + { + pageTitle = isConstantGroup() + ? theTranslator->trConstantGroupReference(displayName()) + : theTranslator->trModuleReference(displayName()); + } + else + { + pageTitle = theTranslator->trNamespaceReference(displayName()); + } + return pageTitle; +} diff --git a/src/namespacedef.h b/src/namespacedef.h index ff64107..2037d23 100644 --- a/src/namespacedef.h +++ b/src/namespacedef.h @@ -22,6 +22,7 @@ #include <qdict.h> #include "sortdict.h" #include "definition.h" +#include "filedef.h" class MemberList; class ClassDef; @@ -45,7 +46,7 @@ class NamespaceDef : public Definition DefType definitionType() const { return TypeNamespace; } QCString getOutputFileBase() const; QCString anchor() const { return QCString(); } - void insertUsedFile(const char *fname); + void insertUsedFile(FileDef *fd); void writeDocumentation(OutputList &ol); void writeMemberPages(OutputList &ol); @@ -92,6 +93,8 @@ class NamespaceDef : public Definition /*! Returns the namespaces contained in this namespace */ NamespaceSDict *getNamespaceSDict() const { return namespaceSDict; } + QCString title() const; + bool visited; private: @@ -115,7 +118,7 @@ class NamespaceDef : public Definition void addNamespaceAttributes(OutputList &ol); QCString fileName; - QStrList files; + FileList files; NamespaceSDict *usingDirList; SDict<Definition> *usingDeclList; diff --git a/src/navtree.js b/src/navtree.js index ed2565a..1d739b2 100644 --- a/src/navtree.js +++ b/src/navtree.js @@ -106,7 +106,7 @@ function createIndent(o,domNode,node,level) span.style.display = 'inline-block'; span.style.width = 16*(level+1)+'px'; span.style.height = '22px'; - span.innerHTML = ' '; + span.innerHTML = ' '; domNode.appendChild(span); } } diff --git a/src/navtree_css.h b/src/navtree_css.h deleted file mode 100644 index 6e42061..0000000 --- a/src/navtree_css.h +++ /dev/null @@ -1,143 +0,0 @@ -"#nav-tree .children_ul {\n" -" margin:0;\n" -" padding:4px;\n" -"}\n" -"\n" -"#nav-tree ul {\n" -" list-style:none outside none;\n" -" margin:0px;\n" -" padding:0px;\n" -"}\n" -"\n" -"#nav-tree li {\n" -" white-space:nowrap;\n" -" margin:0px;\n" -" padding:0px;\n" -"}\n" -"\n" -"#nav-tree .plus {\n" -" margin:0px;\n" -"}\n" -"\n" -"#nav-tree .selected {\n" -" background-image: url('tab_a.png');\n" -" background-repeat:repeat-x;\n" -" color: #fff;\n" -" text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);\n" -"}\n" -"\n" -"#nav-tree img {\n" -" margin:0px;\n" -" padding:0px;\n" -" border:0px;\n" -" vertical-align: middle;\n" -"}\n" -"\n" -"#nav-tree a {\n" -" text-decoration:none;\n" -" padding:0px;\n" -" margin:0px;\n" -" outline:none;\n" -"}\n" -"\n" -"#nav-tree .label {\n" -" margin:0px;\n" -" padding:0px;\n" -" font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;\n" -"}\n" -"\n" -"#nav-tree .label a {\n" -" padding:2px;\n" -"}\n" -"\n" -"#nav-tree .selected a {\n" -" text-decoration:none;\n" -" color:#fff;\n" -"}\n" -"\n" -"#nav-tree .children_ul {\n" -" margin:0px;\n" -" padding:0px;\n" -"}\n" -"\n" -"#nav-tree .item {\n" -" margin:0px;\n" -" padding:0px;\n" -"}\n" -"\n" -"#nav-tree {\n" -" padding: 0px 0px;\n" -" background-color: #FAFAFF; \n" -" font-size:14px;\n" -" overflow:auto;\n" -"}\n" -"\n" -"#doc-content {\n" -" overflow:auto;\n" -" display:block;\n" -" padding:0px;\n" -" margin:0px;\n" -" -webkit-overflow-scrolling : touch; /* iOS 5+ */\n" -"}\n" -"\n" -"#side-nav {\n" -" padding:0 6px 0 0;\n" -" margin: 0px;\n" -" display:block;\n" -" position: absolute;\n" -" left: 0px;\n" -" width: $width;\n" -"}\n" -"\n" -".ui-resizable .ui-resizable-handle {\n" -" display:block;\n" -"}\n" -"\n" -".ui-resizable-e {\n" -" background:url(\"ftv2splitbar.png\") repeat scroll right center transparent;\n" -" cursor:e-resize;\n" -" height:100%;\n" -" right:0;\n" -" top:0;\n" -" width:6px;\n" -"}\n" -"\n" -".ui-resizable-handle {\n" -" display:none;\n" -" font-size:0.1px;\n" -" position:absolute;\n" -" z-index:1;\n" -"}\n" -"\n" -"#nav-tree-contents {\n" -" margin: 6px 0px 0px 0px;\n" -"}\n" -"\n" -"#nav-tree {\n" -" background-image:url('nav_h.png');\n" -" background-repeat:repeat-x;\n" -" background-color: ##FA;\n" -" -webkit-overflow-scrolling : touch; /* iOS 5+ */\n" -"}\n" -"\n" -"#nav-sync {\n" -" position:absolute;\n" -" top:5px;\n" -" right:24px;\n" -" z-index:0;\n" -"}\n" -"\n" -"#nav-sync img {\n" -" opacity:0.3;\n" -"}\n" -"\n" -"#nav-sync img:hover {\n" -" opacity:0.9;\n" -"}\n" -"\n" -"@media print\n" -"{\n" -" #nav-tree { display: none; }\n" -" div.ui-resizable-handle { display: none; position: relative; }\n" -"}\n" -"\n" diff --git a/src/navtree_js.h b/src/navtree_js.h deleted file mode 100644 index bd03629..0000000 --- a/src/navtree_js.h +++ /dev/null @@ -1,515 +0,0 @@ -"var SYNCONMSG = 'click to disable panel synchronisation';\n" -"var SYNCOFFMSG = 'click to enable panel synchronisation';\n" -"var navTreeSubIndices = new Array();\n" -"\n" -"function getData(varName)\n" -"{\n" -" var i = varName.lastIndexOf('/');\n" -" var n = i>=0 ? varName.substring(i+1) : varName;\n" -" return eval(n.replace(/\\-/g,'_'));\n" -"}\n" -"\n" -"function stripPath(uri)\n" -"{\n" -" return uri.substring(uri.lastIndexOf('/')+1);\n" -"}\n" -"\n" -"function stripPath2(uri)\n" -"{\n" -" var i = uri.lastIndexOf('/');\n" -" var s = uri.substring(i+1);\n" -" var m = uri.substring(0,i+1).match(/\\/d\\w\\/d\\w\\w\\/$/);\n" -" return m ? uri.substring(i-6) : s;\n" -"}\n" -"\n" -"function localStorageSupported()\n" -"{\n" -" try {\n" -" return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem;\n" -" }\n" -" catch(e) {\n" -" return false;\n" -" }\n" -"}\n" -"\n" -"\n" -"function storeLink(link)\n" -"{\n" -" if (!$(\"#nav-sync\").hasClass('sync') && localStorageSupported()) {\n" -" window.localStorage.setItem('navpath',link);\n" -" }\n" -"}\n" -"\n" -"function deleteLink()\n" -"{\n" -" if (localStorageSupported()) {\n" -" window.localStorage.setItem('navpath','');\n" -" } \n" -"}\n" -"\n" -"function cachedLink()\n" -"{\n" -" if (localStorageSupported()) {\n" -" return window.localStorage.getItem('navpath');\n" -" } else {\n" -" return '';\n" -" }\n" -"}\n" -"\n" -"function getScript(scriptName,func,show)\n" -"{\n" -" var head = document.getElementsByTagName(\"head\")[0]; \n" -" var script = document.createElement('script');\n" -" script.id = scriptName;\n" -" script.type = 'text/javascript';\n" -" script.onload = func; \n" -" script.src = scriptName+'.js'; \n" -" if ($.browser.msie && $.browser.version<=8) { \n" -" // script.onload does not work with older versions of IE\n" -" script.onreadystatechange = function() {\n" -" if (script.readyState=='complete' || script.readyState=='loaded') { \n" -" func(); if (show) showRoot(); \n" -" }\n" -" }\n" -" }\n" -" head.appendChild(script); \n" -"}\n" -"\n" -"function createIndent(o,domNode,node,level)\n" -"{\n" -" var level=-1;\n" -" var n = node;\n" -" while (n.parentNode) { level++; n=n.parentNode; }\n" -" if (node.childrenData) {\n" -" var imgNode = document.createElement(\"img\");\n" -" imgNode.style.paddingLeft=(16*level).toString()+'px';\n" -" imgNode.width = 16;\n" -" imgNode.height = 22;\n" -" imgNode.border = 0;\n" -" node.plus_img = imgNode;\n" -" node.expandToggle = document.createElement(\"a\");\n" -" node.expandToggle.href = \"javascript:void(0)\";\n" -" node.expandToggle.onclick = function() {\n" -" if (node.expanded) {\n" -" $(node.getChildrenUL()).slideUp(\"fast\");\n" -" node.plus_img.src = node.relpath+\"ftv2pnode.png\";\n" -" node.expanded = false;\n" -" } else {\n" -" expandNode(o, node, false, false);\n" -" }\n" -" }\n" -" node.expandToggle.appendChild(imgNode);\n" -" domNode.appendChild(node.expandToggle);\n" -" imgNode.src = node.relpath+\"ftv2pnode.png\";\n" -" } else {\n" -" var span = document.createElement(\"span\");\n" -" span.style.display = 'inline-block';\n" -" span.style.width = 16*(level+1)+'px';\n" -" span.style.height = '22px';\n" -" span.innerHTML = ' ';\n" -" domNode.appendChild(span);\n" -" } \n" -"}\n" -"\n" -"var animationInProgress = false;\n" -"\n" -"function gotoAnchor(anchor,aname,updateLocation)\n" -"{\n" -" var pos, docContent = $('#doc-content');\n" -" if (anchor.parent().attr('class')=='memItemLeft' ||\n" -" anchor.parent().attr('class')=='fieldtype' ||\n" -" anchor.parent().is(':header')) \n" -" {\n" -" pos = anchor.parent().position().top;\n" -" } else if (anchor.position()) {\n" -" pos = anchor.position().top;\n" -" }\n" -" if (pos) {\n" -" var dist = Math.abs(Math.min(\n" -" pos-docContent.offset().top,\n" -" docContent[0].scrollHeight-\n" -" docContent.height()-docContent.scrollTop()));\n" -" animationInProgress=true;\n" -" docContent.animate({\n" -" scrollTop: pos + docContent.scrollTop() - docContent.offset().top\n" -" },Math.max(50,Math.min(500,dist)),function(){\n" -" if (updateLocation) window.location.href=aname;\n" -" animationInProgress=false;\n" -" });\n" -" }\n" -"}\n" -"\n" -"function newNode(o, po, text, link, childrenData, lastNode)\n" -"{\n" -" var node = new Object();\n" -" node.children = Array();\n" -" node.childrenData = childrenData;\n" -" node.depth = po.depth + 1;\n" -" node.relpath = po.relpath;\n" -" node.isLast = lastNode;\n" -"\n" -" node.li = document.createElement(\"li\");\n" -" po.getChildrenUL().appendChild(node.li);\n" -" node.parentNode = po;\n" -"\n" -" node.itemDiv = document.createElement(\"div\");\n" -" node.itemDiv.className = \"item\";\n" -"\n" -" node.labelSpan = document.createElement(\"span\");\n" -" node.labelSpan.className = \"label\";\n" -"\n" -" createIndent(o,node.itemDiv,node,0);\n" -" node.itemDiv.appendChild(node.labelSpan);\n" -" node.li.appendChild(node.itemDiv);\n" -"\n" -" var a = document.createElement(\"a\");\n" -" node.labelSpan.appendChild(a);\n" -" node.label = document.createTextNode(text);\n" -" node.expanded = false;\n" -" a.appendChild(node.label);\n" -" if (link) {\n" -" var url;\n" -" if (link.substring(0,1)=='^') {\n" -" url = link.substring(1);\n" -" link = url;\n" -" } else {\n" -" url = node.relpath+link;\n" -" }\n" -" a.className = stripPath(link.replace('#',':'));\n" -" if (link.indexOf('#')!=-1) {\n" -" var aname = '#'+link.split('#')[1];\n" -" var srcPage = stripPath($(location).attr('pathname'));\n" -" var targetPage = stripPath(link.split('#')[0]);\n" -" a.href = srcPage!=targetPage ? url : \"javascript:void(0)\"; \n" -" a.onclick = function(){\n" -" storeLink(link);\n" -" if (!$(a).parent().parent().hasClass('selected'))\n" -" {\n" -" $('.item').removeClass('selected');\n" -" $('.item').removeAttr('id');\n" -" $(a).parent().parent().addClass('selected');\n" -" $(a).parent().parent().attr('id','selected');\n" -" }\n" -" var anchor = $(aname);\n" -" gotoAnchor(anchor,aname,true);\n" -" };\n" -" } else {\n" -" a.href = url;\n" -" a.onclick = function() { storeLink(link); }\n" -" }\n" -" } else {\n" -" if (childrenData != null) \n" -" {\n" -" a.className = \"nolink\";\n" -" a.href = \"javascript:void(0)\";\n" -" a.onclick = node.expandToggle.onclick;\n" -" }\n" -" }\n" -"\n" -" node.childrenUL = null;\n" -" node.getChildrenUL = function() {\n" -" if (!node.childrenUL) {\n" -" node.childrenUL = document.createElement(\"ul\");\n" -" node.childrenUL.className = \"children_ul\";\n" -" node.childrenUL.style.display = \"none\";\n" -" node.li.appendChild(node.childrenUL);\n" -" }\n" -" return node.childrenUL;\n" -" };\n" -"\n" -" return node;\n" -"}\n" -"\n" -"function showRoot()\n" -"{\n" -" var headerHeight = $(\"#top\").height();\n" -" var footerHeight = $(\"#nav-path\").height();\n" -" var windowHeight = $(window).height() - headerHeight - footerHeight;\n" -" (function (){ // retry until we can scroll to the selected item\n" -" try {\n" -" var navtree=$('#nav-tree');\n" -" navtree.scrollTo('#selected',0,{offset:-windowHeight/2});\n" -" } catch (err) {\n" -" setTimeout(arguments.callee, 0);\n" -" }\n" -" })();\n" -"}\n" -"\n" -"function expandNode(o, node, imm, showRoot)\n" -"{\n" -" if (node.childrenData && !node.expanded) {\n" -" if (typeof(node.childrenData)==='string') {\n" -" var varName = node.childrenData;\n" -" getScript(node.relpath+varName,function(){\n" -" node.childrenData = getData(varName);\n" -" expandNode(o, node, imm, showRoot);\n" -" }, showRoot);\n" -" } else {\n" -" if (!node.childrenVisited) {\n" -" getNode(o, node);\n" -" } if (imm || ($.browser.msie && $.browser.version>8)) { \n" -" // somehow slideDown jumps to the start of tree for IE9 :-(\n" -" $(node.getChildrenUL()).show();\n" -" } else {\n" -" $(node.getChildrenUL()).slideDown(\"fast\");\n" -" }\n" -" if (node.isLast) {\n" -" node.plus_img.src = node.relpath+\"ftv2mlastnode.png\";\n" -" } else {\n" -" node.plus_img.src = node.relpath+\"ftv2mnode.png\";\n" -" }\n" -" node.expanded = true;\n" -" }\n" -" }\n" -"}\n" -"\n" -"function glowEffect(n,duration)\n" -"{\n" -" n.addClass('glow').delay(duration).queue(function(next){\n" -" $(this).removeClass('glow');next();\n" -" });\n" -"}\n" -"\n" -"function highlightAnchor()\n" -"{\n" -" var aname = $(location).attr('hash');\n" -" var anchor = $(aname);\n" -" if (anchor.parent().attr('class')=='memItemLeft'){\n" -" var rows = $('.memberdecls tr[class$=\"'+\n" -" window.location.hash.substring(1)+'\"]');\n" -" glowEffect(rows.children(),300); // member without details\n" -" } else if (anchor.parents().slice(2).prop('tagName')=='TR') {\n" -" glowEffect(anchor.parents('div.memitem'),1000); // enum value\n" -" } else if (anchor.parent().attr('class')=='fieldtype'){\n" -" glowEffect(anchor.parent().parent(),1000); // struct field\n" -" } else if (anchor.parent().is(\":header\")) {\n" -" glowEffect(anchor.parent(),1000); // section header\n" -" } else {\n" -" glowEffect(anchor.next(),1000); // normal member\n" -" }\n" -" gotoAnchor(anchor,aname,false);\n" -"}\n" -"\n" -"function selectAndHighlight(hash,n)\n" -"{\n" -" var a;\n" -" if (hash) {\n" -" var link=stripPath($(location).attr('pathname'))+':'+hash.substring(1);\n" -" a=$('.item a[class$=\"'+link+'\"]');\n" -" }\n" -" if (a && a.length) {\n" -" a.parent().parent().addClass('selected');\n" -" a.parent().parent().attr('id','selected');\n" -" highlightAnchor();\n" -" } else if (n) {\n" -" $(n.itemDiv).addClass('selected');\n" -" $(n.itemDiv).attr('id','selected');\n" -" }\n" -" if ($('#nav-tree-contents .item:first').hasClass('selected')) {\n" -" $('#nav-sync').css('top','30px');\n" -" } else {\n" -" $('#nav-sync').css('top','5px');\n" -" }\n" -" showRoot();\n" -"}\n" -"\n" -"function showNode(o, node, index, hash)\n" -"{\n" -" if (node && node.childrenData) {\n" -" if (typeof(node.childrenData)==='string') {\n" -" var varName = node.childrenData;\n" -" getScript(node.relpath+varName,function(){\n" -" node.childrenData = getData(varName);\n" -" showNode(o,node,index,hash);\n" -" },true);\n" -" } else {\n" -" if (!node.childrenVisited) {\n" -" getNode(o, node);\n" -" }\n" -" $(node.getChildrenUL()).css({'display':'block'});\n" -" if (node.isLast) {\n" -" node.plus_img.src = node.relpath+\"ftv2mlastnode.png\";\n" -" } else {\n" -" node.plus_img.src = node.relpath+\"ftv2mnode.png\";\n" -" }\n" -" node.expanded = true;\n" -" var n = node.children[o.breadcrumbs[index]];\n" -" if (index+1<o.breadcrumbs.length) {\n" -" showNode(o,n,index+1,hash);\n" -" } else {\n" -" if (typeof(n.childrenData)==='string') {\n" -" var varName = n.childrenData;\n" -" getScript(n.relpath+varName,function(){\n" -" n.childrenData = getData(varName);\n" -" node.expanded=false;\n" -" showNode(o,node,index,hash); // retry with child node expanded\n" -" },true);\n" -" } else {\n" -" var rootBase = stripPath(o.toroot.replace(/\\..+$/, ''));\n" -" if (rootBase==\"index\" || rootBase==\"pages\" || rootBase==\"search\") {\n" -" expandNode(o, n, true, true);\n" -" }\n" -" selectAndHighlight(hash,n);\n" -" }\n" -" }\n" -" }\n" -" } else {\n" -" selectAndHighlight(hash);\n" -" }\n" -"}\n" -"\n" -"function removeToInsertLater(element) {\n" -" var parentNode = element.parentNode;\n" -" var nextSibling = element.nextSibling;\n" -" parentNode.removeChild(element);\n" -" return function() {\n" -" if (nextSibling) {\n" -" parentNode.insertBefore(element, nextSibling);\n" -" } else {\n" -" parentNode.appendChild(element);\n" -" }\n" -" };\n" -"}\n" -"\n" -"function getNode(o, po)\n" -"{\n" -" var insertFunction = removeToInsertLater(po.li);\n" -" po.childrenVisited = true;\n" -" var l = po.childrenData.length-1;\n" -" for (var i in po.childrenData) {\n" -" var nodeData = po.childrenData[i];\n" -" po.children[i] = newNode(o, po, nodeData[0], nodeData[1], nodeData[2],\n" -" i==l);\n" -" }\n" -" insertFunction();\n" -"}\n" -"\n" -"function gotoNode(o,subIndex,root,hash,relpath)\n" -"{\n" -" var nti = navTreeSubIndices[subIndex][root+hash];\n" -" o.breadcrumbs = $.extend(true, [], nti ? nti : navTreeSubIndices[subIndex][root]);\n" -" if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index\n" -" navTo(o,NAVTREE[0][1],\"\",relpath);\n" -" $('.item').removeClass('selected');\n" -" $('.item').removeAttr('id');\n" -" }\n" -" if (o.breadcrumbs) {\n" -" o.breadcrumbs.unshift(0); // add 0 for root node\n" -" showNode(o, o.node, 0, hash);\n" -" }\n" -"}\n" -"\n" -"function navTo(o,root,hash,relpath)\n" -"{\n" -" var link = cachedLink();\n" -" if (link) {\n" -" var parts = link.split('#');\n" -" root = parts[0];\n" -" if (parts.length>1) hash = '#'+parts[1];\n" -" else hash='';\n" -" }\n" -" if (hash.match(/^#l\\d+$/)) {\n" -" var anchor=$('a[name='+hash.substring(1)+']');\n" -" glowEffect(anchor.parent(),1000); // line number\n" -" hash=''; // strip line number anchors\n" -" //root=root.replace(/_source\\./,'.'); // source link to doc link\n" -" }\n" -" var url=root+hash;\n" -" var i=-1;\n" -" while (NAVTREEINDEX[i+1]<=url) i++;\n" -" if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index\n" -" if (navTreeSubIndices[i]) {\n" -" gotoNode(o,i,root,hash,relpath)\n" -" } else {\n" -" getScript(relpath+'navtreeindex'+i,function(){\n" -" navTreeSubIndices[i] = eval('NAVTREEINDEX'+i);\n" -" if (navTreeSubIndices[i]) {\n" -" gotoNode(o,i,root,hash,relpath);\n" -" }\n" -" },true);\n" -" }\n" -"}\n" -"\n" -"function showSyncOff(n,relpath)\n" -"{\n" -" n.html('<img src=\"'+relpath+'sync_off.png\" title=\"'+SYNCOFFMSG+'\"/>');\n" -"}\n" -"\n" -"function showSyncOn(n,relpath)\n" -"{\n" -" n.html('<img src=\"'+relpath+'sync_on.png\" title=\"'+SYNCONMSG+'\"/>');\n" -"}\n" -"\n" -"function toggleSyncButton(relpath)\n" -"{\n" -" var navSync = $('#nav-sync');\n" -" if (navSync.hasClass('sync')) {\n" -" navSync.removeClass('sync');\n" -" showSyncOff(navSync,relpath);\n" -" storeLink(stripPath2($(location).attr('pathname'))+$(location).attr('hash'));\n" -" } else {\n" -" navSync.addClass('sync');\n" -" showSyncOn(navSync,relpath);\n" -" deleteLink();\n" -" }\n" -"}\n" -"\n" -"function initNavTree(toroot,relpath)\n" -"{\n" -" var o = new Object();\n" -" o.toroot = toroot;\n" -" o.node = new Object();\n" -" o.node.li = document.getElementById(\"nav-tree-contents\");\n" -" o.node.childrenData = NAVTREE;\n" -" o.node.children = new Array();\n" -" o.node.childrenUL = document.createElement(\"ul\");\n" -" o.node.getChildrenUL = function() { return o.node.childrenUL; };\n" -" o.node.li.appendChild(o.node.childrenUL);\n" -" o.node.depth = 0;\n" -" o.node.relpath = relpath;\n" -" o.node.expanded = false;\n" -" o.node.isLast = true;\n" -" o.node.plus_img = document.createElement(\"img\");\n" -" o.node.plus_img.src = relpath+\"ftv2pnode.png\";\n" -" o.node.plus_img.width = 16;\n" -" o.node.plus_img.height = 22;\n" -"\n" -" if (localStorageSupported()) {\n" -" var navSync = $('#nav-sync');\n" -" if (cachedLink()) {\n" -" showSyncOff(navSync,relpath);\n" -" navSync.removeClass('sync');\n" -" } else {\n" -" showSyncOn(navSync,relpath);\n" -" }\n" -" navSync.click(function(){ toggleSyncButton(relpath); });\n" -" }\n" -"\n" -" $(window).load(function(){\n" -" navTo(o,toroot,window.location.hash,relpath);\n" -" showRoot();\n" -" });\n" -"\n" -" $(window).bind('hashchange', function(){\n" -" if (window.location.hash && window.location.hash.length>1){\n" -" var a;\n" -" if ($(location).attr('hash')){\n" -" var clslink=stripPath($(location).attr('pathname'))+':'+\n" -" $(location).attr('hash').substring(1);\n" -" a=$('.item a[class$=\"'+clslink+'\"]');\n" -" }\n" -" if (a==null || !$(a).parent().parent().hasClass('selected')){\n" -" $('.item').removeClass('selected');\n" -" $('.item').removeAttr('id');\n" -" }\n" -" var link=stripPath2($(location).attr('pathname'));\n" -" navTo(o,link,$(location).attr('hash'),relpath);\n" -" } else if (!animationInProgress) {\n" -" $('#doc-content').scrollTop(0);\n" -" $('.item').removeClass('selected');\n" -" $('.item').removeAttr('id');\n" -" navTo(o,toroot,window.location.hash,relpath);\n" -" }\n" -" })\n" -"}\n" -"\n" diff --git a/src/pagedef.cpp b/src/pagedef.cpp index 0133be1..3c9e1b6 100644 --- a/src/pagedef.cpp +++ b/src/pagedef.cpp @@ -61,10 +61,10 @@ QCString PageDef::getOutputFileBase() const return m_fileName; } -void PageDef::setFileName(const char *name) +void PageDef::setFileName(const char *name,bool dontEscape) { static bool shortNames = Config_getBool("SHORT_NAMES"); - if (shortNames) + if (shortNames && !dontEscape) { m_fileName = convertNameToFile(name); } diff --git a/src/pagedef.h b/src/pagedef.h index f0e96c2..141c03b 100644 --- a/src/pagedef.h +++ b/src/pagedef.h @@ -32,7 +32,7 @@ class PageDef : public Definition ~PageDef(); // setters - void setFileName(const char *name); + void setFileName(const char *name,bool dontEscape); void setShowToc(bool b); // getters @@ -70,7 +70,6 @@ class PageDef : public Definition void writePageDocumentation(OutputList &ol); QCString m_fileName; QCString m_title; - GroupDef *m_inGroup; PageSDict *m_subPageDict; // list of pages in the group Definition *m_pageScope; int m_nestingLevel; diff --git a/src/parserintf.h b/src/parserintf.h index 40c82dc..d474d8f 100644 --- a/src/parserintf.h +++ b/src/parserintf.h @@ -98,6 +98,7 @@ class ParserInterface * @param[in] showLineNumbers if set to TRUE and also fileDef is not 0, * line numbers will be added to the source fragement * @param[in] searchCtx context under which search data has to be stored. + * @param[in] collectXRefs collect cross-reference relations. */ virtual void parseCode(CodeOutputInterface &codeOutIntf, const char *scopeName, @@ -111,7 +112,8 @@ class ParserInterface bool inlineFragment=FALSE, MemberDef *memberDef=0, bool showLineNumbers=TRUE, - Definition *searchCtx=0 + Definition *searchCtx=0, + bool collectXRefs=TRUE ) = 0; /** Resets the state of the code parser. diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 9257df0..5537438 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -364,6 +364,8 @@ public: void visitPost(DocDotFile *); void visitPre(DocMscFile *); void visitPost(DocMscFile *); + void visitPre(DocDiaFile *); + void visitPost(DocDiaFile *); void visitPre(DocLink *); void visitPost(DocLink *); void visitPre(DocRef *); @@ -390,6 +392,8 @@ public: void visitPost(DocHtmlBlockQuote *); void visitPre(DocVhdlFlow *); void visitPost(DocVhdlFlow *); + void visitPre(DocParBlock *); + void visitPost(DocParBlock *); private: @@ -1207,6 +1211,20 @@ void PerlModDocVisitor::visitPost(DocMscFile *) #endif } +void PerlModDocVisitor::visitPre(DocDiaFile *) +{ +#if 0 + m_output.add("<diafile name=\""); m_output.add(df->file()); m_output.add("\">"); +#endif +} + +void PerlModDocVisitor::visitPost(DocDiaFile *) +{ +#if 0 + m_output.add("</diafile>"); +#endif +} + void PerlModDocVisitor::visitPre(DocLink *lnk) { @@ -1331,7 +1349,7 @@ void PerlModDocVisitor::visitPost(DocParamList *) .closeHash(); } -void PerlModDocVisitor::visitPre(DocXRefItem *) +void PerlModDocVisitor::visitPre(DocXRefItem *x) { #if 0 m_output.add("<xrefsect id=\""); @@ -1342,12 +1360,14 @@ void PerlModDocVisitor::visitPre(DocXRefItem *) m_output.add("</xreftitle>"); m_output.add("<xrefdescription>"); #endif + if (x->title().isEmpty()) return; openItem("xrefitem"); openSubBlock("content"); } -void PerlModDocVisitor::visitPost(DocXRefItem *) +void PerlModDocVisitor::visitPost(DocXRefItem *x) { + if (x->title().isEmpty()) return; closeSubBlock(); closeItem(); #if 0 @@ -1405,6 +1425,15 @@ void PerlModDocVisitor::visitPost(DocVhdlFlow *) { } +void PerlModDocVisitor::visitPre(DocParBlock *) +{ +} + +void PerlModDocVisitor::visitPost(DocParBlock *) +{ +} + + static void addTemplateArgumentList(ArgumentList *al,PerlModOutput &output,const char *) { QCString indentStr; diff --git a/src/portable.cpp b/src/portable.cpp index 7b78439..258c50f 100644 --- a/src/portable.cpp +++ b/src/portable.cpp @@ -84,7 +84,11 @@ int portable_system(const char *command,const char *args,bool commandHasConsole) #else // Other Unices just use fork pid = fork(); - if (pid==-1) return -1; + if (pid==-1) + { + perror("fork error"); + return -1; + } if (pid==0) { const char * argv[4]; @@ -510,6 +510,20 @@ static FileState *checkAndOpenFile(const QCString &fileName,bool &alreadyInclude static FileState *findFile(const char *fileName,bool localInclude,bool &alreadyIncluded) { //printf("** findFile(%s,%d) g_yyFileName=%s\n",fileName,localInclude,g_yyFileName.data()); + if (portable_isAbsolutePath(fileName)) + { + FileState *fs = checkAndOpenFile(fileName,alreadyIncluded); + if (fs) + { + setFileName(fileName); + g_yyLineNr=1; + return fs; + } + else if (alreadyIncluded) + { + return 0; + } + } if (localInclude && !g_yyFileName.isEmpty()) { QFileInfo fi(g_yyFileName); @@ -1337,7 +1351,7 @@ bool computeExpression(const QCString &expr) e = removeIdsAndMarkers(e); if (e.isEmpty()) return FALSE; //printf("parsing `%s'\n",e.data()); - return parseCppExpression(g_yyFileName,g_yyLineNr,e); + return parseconstexp(g_yyFileName,g_yyLineNr,e); } /*! expands the macro definition in \a name @@ -1769,8 +1783,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) } BEGIN(CopyLine); } -<Start>^{B}*[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]+{B}*"("[^\(\)\n]*"("[^\)\n]*")"[^\)\n]*")"{B}*\n | // function list macro with one (...) argument, e.g. for K_GLOBAL_STATIC_WITH_ARGS -<Start>^{B}*[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]+{B}*"("[^\)\n]*")"{B}*\n { // function like macro +<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\(\)\n]*"("[^\)\n]*")"[^\)\n]*")"{B}*\n | // function list macro with one (...) argument, e.g. for K_GLOBAL_STATIC_WITH_ARGS +<Start>^{B}*[_A-Z][_A-Z0-9]+{B}*"("[^\)\n]*")"{B}*\n { // function like macro static bool skipFuncMacros = Config_getBool("SKIP_FUNCTION_MACROS"); QCString name(yytext); name=name.left(name.find('(')).stripWhiteSpace(); @@ -2955,6 +2969,7 @@ void cleanUpPreprocessor() void preprocessFile(const char *fileName,BufStr &input,BufStr &output) { + printlex(yy_flex_debug, TRUE, __FILE__, fileName); uint orgOffset=output.curPos(); //printf("##########################\n%s\n####################\n", // input.data()); @@ -3163,6 +3178,7 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output) } } DefineManager::instance().endContext(); + printlex(yy_flex_debug, FALSE, __FILE__, fileName); } void preFreeScanner() diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h index dc28d26..37929fc 100644 --- a/src/printdocvisitor.h +++ b/src/printdocvisitor.h @@ -597,6 +597,16 @@ class PrintDocVisitor : public DocVisitor indent_post(); printf("</mscfile>\n"); } + void visitPre(DocDiaFile *df) + { + indent_pre(); + printf("<diafile src=\"%s\">\n",df->name().data()); + } + void visitPost(DocDiaFile *) + { + indent_post(); + printf("</diafile>\n"); + } void visitPre(DocLink *lnk) { indent_pre(); @@ -761,6 +771,16 @@ class PrintDocVisitor : public DocVisitor indent_post(); printf("</vhdlflow>\n"); } + void visitPre(DocParBlock *) + { + indent_pre(); + printf("<parblock>\n"); + } + void visitPost(DocParBlock *) + { + indent_post(); + printf("</parblock>\n"); + } private: // helper functions diff --git a/src/pycode.h b/src/pycode.h index bdaef55..6382975 100644 --- a/src/pycode.h +++ b/src/pycode.h @@ -36,7 +36,8 @@ class Definition; extern void parsePythonCode(CodeOutputInterface &,const char *,const QCString &, bool ,const char *,FileDef *fd, int startLine,int endLine,bool inlineFragment, - MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx); + MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx, + bool collectXRefs); extern void resetPythonCodeParserState(); #endif diff --git a/src/pycode.l b/src/pycode.l index 36d8d35..8512711 100644 --- a/src/pycode.l +++ b/src/pycode.l @@ -62,6 +62,7 @@ static int g_inputPosition; //!< read offset during parsing static const char * g_currentFontClass; static bool g_needsTermination; static Definition *g_searchCtx; +static bool g_collectXRefs; static int g_inputLines; //!< number of line in the code fragment static int g_yyLineNr; //!< current line number static FileDef * g_sourceFileDef; @@ -493,35 +494,6 @@ static void codifyLines(char *text) } } -#if 0 -static QCString fileLocation() -{ - QCString result = g_sourceFileDef?g_sourceFileDef->absFilePath():QCString("[unknown]"); - result+=":"+QCString().setNum(g_yyLineNr); - result+=":"+QCString().setNum(1); - return result; -} - -static void addDocCrossReference(MemberDef *src,MemberDef *dst) -{ - static bool referencedByRelation = Config_getBool("REFERENCED_BY_RELATION"); - static bool callerGraph = Config_getBool("CALLER_GRAPH"); - static bool referencesRelation = Config_getBool("REFERENCES_RELATION"); - static bool callGraph = Config_getBool("CALL_GRAPH"); - if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types - //printf("addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data()); - if ((referencedByRelation || callerGraph) && (src->isFunction() || src->isSlot())) - { - dst->addSourceReferencedBy(src,fileLocation()); - } - if ((referencesRelation || callGraph) && (src->isFunction() || src->isSlot())) - { - src->addSourceReferences(dst,fileLocation()); - } -} -#endif - - static bool getLinkInScope(const QCString &c, // scope const QCString &m, // member @@ -553,7 +525,7 @@ static bool getLinkInScope(const QCString &c, // scope // g_currentDefinition,g_currentMemberDef); if (g_currentDefinition && g_currentMemberDef && - md!=g_currentMemberDef) + md!=g_currentMemberDef && g_collectXRefs) { addDocCrossReference(g_currentMemberDef,md); } @@ -652,7 +624,8 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName, Definition *d = md->getOuterScope()==Doxygen::globalScope ? md->getBodyDef() : md->getOuterScope(); if (md->getGroupDef()) d = md->getGroupDef(); - if (d && d->isLinkable() && md->isLinkable() && g_currentMemberDef) + if (d && d->isLinkable() && md->isLinkable() && + g_currentMemberDef && g_collectXRefs) { addDocCrossReference(g_currentMemberDef,md); } @@ -678,7 +651,8 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName, Definition *d = md->getOuterScope()==Doxygen::globalScope ? md->getBodyDef() : md->getOuterScope(); if (md->getGroupDef()) d = md->getGroupDef(); - if (d && d->isLinkable() && md->isLinkable() && g_currentMemberDef) + if (d && d->isLinkable() && md->isLinkable() && + g_currentMemberDef && g_collectXRefs) { addDocCrossReference(g_currentMemberDef,md); } @@ -700,7 +674,8 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName, Definition *d = md->getOuterScope()==Doxygen::globalScope ? md->getBodyDef() : md->getOuterScope(); if (md->getGroupDef()) d = md->getGroupDef(); - if (d && d->isLinkable() && md->isLinkable() && g_currentMemberDef) + if (d && d->isLinkable() && md->isLinkable() && + g_currentMemberDef && g_collectXRefs) { addDocCrossReference(g_currentMemberDef,md); } @@ -773,7 +748,7 @@ static bool findMemberLink(CodeOutputInterface &ol,Definition *sym,const char *s ClassDef *thisCd = (ClassDef *)g_currentDefinition; if (sym->definitionType()==Definition::TypeMember) { - if (g_currentMemberDef) + if (g_currentMemberDef && g_collectXRefs) { addDocCrossReference(g_currentMemberDef,(MemberDef*)sym); } @@ -860,8 +835,8 @@ B [ \t]* NEWLINE \n DIGIT [0-9] -LETTER [A-Za-z] -NONEMPTY [A-Za-z0-9_] +LETTER [A-Za-z\x80-\xFF] +NONEMPTY [A-Za-z0-9_\x80-\xFF] EXPCHAR [#(){}\[\],:.%/\\=`*~|&<>!;+-] NONEMPTYEXP [^ \t\n:] PARAMNONEMPTY [^ \t\n():] @@ -1452,13 +1427,14 @@ static void adjustScopesAndSuites(unsigned indentLength) void parsePythonCode(CodeOutputInterface &od,const char * /*className*/, const QCString &s,bool exBlock, const char *exName, FileDef *fd,int startLine,int endLine,bool /*inlineFragment*/, - MemberDef *,bool,Definition *searchCtx) + MemberDef *,bool,Definition *searchCtx,bool collectXRefs) { //printf("***parseCode()\n"); //-------------------------------------- if (s.isEmpty()) return; + printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL); TooltipManager::instance()->clearTooltips(); g_code = &od; g_inputString = s; @@ -1466,6 +1442,7 @@ void parsePythonCode(CodeOutputInterface &od,const char * /*className*/, g_currentFontClass = 0; g_needsTermination = FALSE; g_searchCtx=searchCtx; + g_collectXRefs=collectXRefs; if (endLine!=-1) g_inputLines = endLine+1; else @@ -1518,6 +1495,7 @@ void parsePythonCode(CodeOutputInterface &od,const char * /*className*/, delete g_sourceFileDef; g_sourceFileDef=0; } + printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL); return; } diff --git a/src/pyscanner.h b/src/pyscanner.h index 5cc69d9..4b99706 100644 --- a/src/pyscanner.h +++ b/src/pyscanner.h @@ -55,7 +55,8 @@ class PythonLanguageScanner : public ParserInterface bool inlineFragment=FALSE, MemberDef *memberDef=0, bool showLineNumbers=TRUE, - Definition *searchCtx=0 + Definition *searchCtx=0, + bool collectXrefs=TRUE ); void resetCodeParserState(); void parsePrototype(const char *text); diff --git a/src/pyscanner.l b/src/pyscanner.l index 69523d2..671d330 100644 --- a/src/pyscanner.l +++ b/src/pyscanner.l @@ -461,8 +461,8 @@ OCTNUMBER "0"[0-7]+[lL]? NUMBER {DIGIT}+[lLjJ]? INTNUMBER {HEXNUMBER}|{OCTNUMBER}|{NUMBER} FLOATNUMBER {DIGIT}+"."{DIGIT}+([eE][+\-]?{DIGIT}+)?[jJ]? -LETTER [A-Za-z] -NONEMPTY [A-Za-z0-9_] +LETTER [A-Za-z\x80-\xFF] +NONEMPTY [A-Za-z0-9_\x80-\xFF] EXPCHAR [#(){}\[\],:.%/\\=`*~|&<>!;+-] NONEMPTYEXP [^ \t\n:] PARAMNONEMPTY [^ \t\n():] @@ -1510,7 +1510,7 @@ static void parseCompounds(Entry *rt) // init scanner state inputString = ce->program; inputPosition = 0; - pyscanYYrestart( pyscanYYin ) ; + pyscannerYYrestart( pyscannerYYin ) ; if (ce->section&Entry::COMPOUND_MASK) { current_root = ce ; @@ -1531,7 +1531,7 @@ static void parseCompounds(Entry *rt) groupEnterCompound(yyFileName,yyLineNr,ce->name); - pyscanYYlex() ; + pyscannerYYlex() ; g_lexInit=TRUE; delete current; current=0; ce->program.resize(0); @@ -1600,9 +1600,9 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt) current->reset(); initEntry(); - pyscanYYrestart( pyscanYYin ); + pyscannerYYrestart( pyscannerYYin ); BEGIN( Search ); - pyscanYYlex(); + pyscannerYYlex(); g_lexInit=TRUE; groupLeaveFile(yyFileName,yyLineNr); @@ -1637,18 +1637,18 @@ static void parsePrototype(const QCString &text) // save scanner state orgState = YY_CURRENT_BUFFER; - yy_switch_to_buffer(yy_create_buffer(pyscanYYin, YY_BUF_SIZE)); + yy_switch_to_buffer(yy_create_buffer(pyscannerYYin, YY_BUF_SIZE)); orgInputString = inputString; orgInputPosition = inputPosition; // set new string inputString = text; inputPosition = 0; - pyscanYYrestart( pyscanYYin ); + pyscannerYYrestart( pyscannerYYin ); BEGIN( FunctionDec ); - pyscanYYlex(); + pyscannerYYlex(); g_lexInit=TRUE; current->name = current->name.stripWhiteSpace(); @@ -1672,7 +1672,7 @@ void pyscanFreeScanner() #if defined(YY_FLEX_SUBMINOR_VERSION) if (g_lexInit) { - pyscanYYlex_destroy(); + pyscannerYYlex_destroy(); } #endif } @@ -1686,7 +1686,9 @@ void PythonLanguageScanner::parseInput(const char *fileName, QStrList & /*filesInSameTranslationUnit*/) { g_thisParser = this; + printlex(yy_flex_debug, TRUE, __FILE__, fileName); ::parseMain(fileName,fileBuf,root); + printlex(yy_flex_debug, FALSE, __FILE__, fileName); // May print the AST for debugging purposes // printAST(global_root); @@ -1709,12 +1711,13 @@ void PythonLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf, bool inlineFragment, MemberDef *memberDef, bool showLineNumbers, - Definition *searchCtx + Definition *searchCtx, + bool collectXRefs ) { ::parsePythonCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName, fileDef,startLine,endLine,inlineFragment,memberDef, - showLineNumbers,searchCtx); + showLineNumbers,searchCtx,collectXRefs); } void PythonLanguageScanner::parsePrototype(const char *text) diff --git a/src/resize.js b/src/resize.js index a80dece..304fcb6 100644 --- a/src/resize.js +++ b/src/resize.js @@ -77,15 +77,19 @@ function initResizable() var _preventDefault = function(evt) { evt.preventDefault(); }; $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); $(document).bind('touchmove',function(e){ - try { - var target = e.target; - while (target) { - if ($(target).css('-webkit-overflow-scrolling')=='touch') return; - target = target.parentNode; + var device = navigator.userAgent.toLowerCase(); + var ios = device.match(/(iphone|ipod|ipad)/); + if (ios) { + try { + var target = e.target; + while (target) { + if ($(target).css('-webkit-overflow-scrolling')=='touch') return; + target = target.parentNode; + } + e.preventDefault(); + } catch(err) { + e.preventDefault(); } - e.preventDefault(); - } catch(err) { - e.preventDefault(); } }); } diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index 9489145..7c2fef8 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -29,6 +29,7 @@ #include <qfileinfo.h> #include "parserintf.h" #include "msc.h" +#include "dia.h" #include "filedef.h" #include "config.h" @@ -324,7 +325,7 @@ void RTFDocVisitor::visit(DocURL *u) { m_t << "{\\field " "{\\*\\fldinst " - "{ HYPERLINK \\\\l \""; + "{ HYPERLINK \""; if (u->isEmail()) m_t << "mailto:"; m_t << u->url(); m_t << "\" }" @@ -1129,7 +1130,7 @@ void RTFDocVisitor::visitPre(DocHRef *href) { m_t << "{\\field " "{\\*\\fldinst " - "{ HYPERLINK \\\\l \"" << href->url() << "\" " + "{ HYPERLINK \"" << href->url() << "\" " "}{}" "}" "{\\fldrslt " @@ -1245,6 +1246,22 @@ void RTFDocVisitor::visitPost(DocMscFile *) popEnabled(); } +void RTFDocVisitor::visitPre(DocDiaFile *df) +{ + DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocDiaFile)}\n"); + writeDiaFile(df->file()); + + // hide caption since it is not supported at the moment + pushEnabled(); + m_hide=TRUE; +} + +void RTFDocVisitor::visitPost(DocDiaFile *) +{ + DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocDiaFile)}\n"); + popEnabled(); +} + void RTFDocVisitor::visitPre(DocLink *lnk) { if (m_hide) return; @@ -1562,6 +1579,7 @@ void RTFDocVisitor::visitPost(DocParamList *pl) void RTFDocVisitor::visitPre(DocXRefItem *x) { if (m_hide) return; + if (x->title().isEmpty()) return; bool anonymousEnum = x->file()=="@"; DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocXRefItem)}\n"); m_t << "{"; // start param list @@ -1607,9 +1625,10 @@ void RTFDocVisitor::visitPre(DocXRefItem *x) m_lastIsPara=FALSE; } -void RTFDocVisitor::visitPost(DocXRefItem *) +void RTFDocVisitor::visitPost(DocXRefItem *x) { if (m_hide) return; + if (x->title().isEmpty()) return; DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocXRefItem)}\n"); m_t << "\\par" << endl; decIndentLevel(); @@ -1686,6 +1705,16 @@ void RTFDocVisitor::visitPost(DocVhdlFlow *) if (m_hide) return; } +void RTFDocVisitor::visitPre(DocParBlock *) +{ + if (m_hide) return; +} + +void RTFDocVisitor::visitPost(DocParBlock *) +{ + if (m_hide) return; +} + //static char* getMultiByte(int c) //{ @@ -1836,3 +1865,23 @@ void RTFDocVisitor::writeMscFile(const QCString &fileName) m_lastIsPara=TRUE; } +void RTFDocVisitor::writeDiaFile(const QCString &fileName) +{ + QCString baseName=fileName; + int i; + if ((i=baseName.findRev('/'))!=-1) + { + baseName=baseName.right(baseName.length()-i-1); + } + QCString outDir = Config_getString("RTF_OUTPUT"); + writeDiaGraphFromFile(fileName+".dia",outDir,baseName,DIA_BITMAP); + if (!m_lastIsPara) m_t << "\\par" << endl; + m_t << "{" << endl; + m_t << rtf_Style_Reset; + m_t << "\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \""; + m_t << baseName << ".png"; + m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; + m_t << "}" << endl; + m_lastIsPara=TRUE; +} + diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h index eb841e5..9572b73 100644 --- a/src/rtfdocvisitor.h +++ b/src/rtfdocvisitor.h @@ -107,6 +107,8 @@ class RTFDocVisitor : public DocVisitor void visitPost(DocDotFile *); void visitPre(DocMscFile *); void visitPost(DocMscFile *); + void visitPre(DocDiaFile *); + void visitPost(DocDiaFile *); void visitPre(DocLink *); void visitPost(DocLink *); void visitPre(DocRef *ref); @@ -131,6 +133,8 @@ class RTFDocVisitor : public DocVisitor void visitPost(DocHtmlBlockQuote *); void visitPre(DocVhdlFlow *); void visitPost(DocVhdlFlow *); + void visitPre(DocParBlock *); + void visitPost(DocParBlock *); private: @@ -150,6 +154,7 @@ class RTFDocVisitor : public DocVisitor void popEnabled(); void writeDotFile(const QCString &fileName); void writeMscFile(const QCString &fileName); + void writeDiaFile(const QCString &fileName); //-------------------------------------- // state variables diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index 9a7dbee..d8c34ee 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -1049,7 +1049,7 @@ void RTFGenerator::startHtmlLink(const char *url) if (Config_getBool("RTF_HYPERLINKS")) { - t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \""; + t << "{\\field {\\*\\fldinst { HYPERLINK \""; t << url; t << "\" }{}"; t << "}{\\fldrslt {\\cs37\\ul\\cf2 "; diff --git a/src/scanner.h b/src/scanner.h index f26accb..767fea0 100644 --- a/src/scanner.h +++ b/src/scanner.h @@ -50,7 +50,8 @@ class CLanguageScanner : public ParserInterface bool inlineFragment=FALSE, MemberDef *memberDef=0, bool showLineNumbers=TRUE, - Definition *searchCtx=0 + Definition *searchCtx=0, + bool collectXRefs=TRUE ); void resetCodeParserState(); void parsePrototype(const char *text); diff --git a/src/scanner.l b/src/scanner.l index 40f653a..bbe90a3 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -191,6 +191,7 @@ static QCString g_delimiter; static int g_column; static int g_fencedSize=0; +static bool g_nestedComment=0; //----------------------------------------------------------------------------- @@ -1175,13 +1176,27 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } */ <ObjCParams>"(" { - BEGIN( ObjCParamType ); - } -<ObjCParamType>[^)]* { - current->argList->getLast()->type=QCString(yytext).stripWhiteSpace(); - } + roundCount=0; + current->argList->getLast()->type.resize(0); + BEGIN( ObjCParamType ); + } +<ObjCParamType>"(" { + roundCount++; + current->argList->getLast()->type+=yytext; + } <ObjCParamType>")"/{B}* { - BEGIN( ObjCParams ); + if (roundCount<=0) + { + BEGIN( ObjCParams ); + } + else + { + current->argList->getLast()->type+=yytext; + roundCount--; + } + } +<ObjCParamType>[^()]* { + current->argList->getLast()->type+=QCString(yytext).stripWhiteSpace(); } <ObjCMethod,ObjCParams>";" { // end of method declaration if (current->argList->getLast() && current->argList->getLast()->type.isEmpty()) @@ -1192,7 +1207,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) //printf("argList=%s\n",current->args.data()); unput(';'); BEGIN( Function ); - } + } <ObjCMethod,ObjCParams>(";"{BN}+)?"{" { // start of a method body lineCount(); //printf("Type=%s Name=%s args=%s\n", @@ -1354,7 +1369,14 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) if (!insidePHP) { current->type += " abstract "; - current->virt = Pure; + if (!insideJava) + { + current->virt = Pure; + } + else + { + current->spec|=Entry::Abstract; + } } else { @@ -1597,9 +1619,20 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) <FindMembers>"@class" | // for Objective C class declarations <FindMembers>{B}*{TYPEDEFPREFIX}"class{" | <FindMembers>{B}*{TYPEDEFPREFIX}"class"{BN}+ { - isTypedef=((QCString)yytext).find("typedef")!=-1; + QCString decl = yytext; + isTypedef=decl.find("typedef")!=-1; + bool isConst=decl.find("const")!=-1; + bool isVolatile=decl.find("volatile")!=-1; current->section = Entry::CLASS_SEC; addType( current ) ; + if (isConst) + { + current->type += " const"; + } + else if (isVolatile) + { + current->type += " volatile"; + } current->type += " class" ; current->fileName = yyFileName; current->startLine = yyLineNr; @@ -1688,13 +1721,24 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } <FindMembers>{B}*{TYPEDEFPREFIX}"struct{" | <FindMembers>{B}*{TYPEDEFPREFIX}"struct"/{BN}+ { - isTypedef=((QCString)yytext).find("typedef")!=-1; + QCString decl = yytext; + isTypedef=decl.find("typedef")!=-1; + bool isConst=decl.find("const")!=-1; + bool isVolatile=decl.find("volatile")!=-1; current->section = Entry::CLASS_SEC ; current->spec = Entry::Struct | (current->spec & Entry::Published); // preserve UNO IDL // bug 582676: can be a struct nested in an interface so keep insideObjC state //current->objc = insideObjC = FALSE; addType( current ) ; + if (isConst) + { + current->type += " const"; + } + else if (isVolatile) + { + current->type += " volatile"; + } current->type += " struct" ; current->fileName = yyFileName; current->startLine = yyLineNr; @@ -1751,12 +1795,23 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } <FindMembers>{B}*{TYPEDEFPREFIX}"union{" | <FindMembers>{B}*{TYPEDEFPREFIX}"union"{BN}+ { - isTypedef=((QCString)yytext).find("typedef")!=-1; + QCString decl=yytext; + isTypedef=decl.find("typedef")!=-1; + bool isConst=decl.find("const")!=-1; + bool isVolatile=decl.find("volatile")!=-1; current->section = Entry::CLASS_SEC; current->spec = Entry::Union; // bug 582676: can be a struct nested in an interface so keep insideObjC state //current->objc = insideObjC = FALSE; addType( current ) ; + if (isConst) + { + current->type += " const"; + } + else if (isVolatile) + { + current->type += " volatile"; + } current->type += " union" ; current->fileName = yyFileName; current->startLine = yyLineNr; @@ -2847,7 +2902,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN(lastRawStringContext); } } -<RawGString>[^)]+ { +<RawGString>[^)\n]+ { *pCopyRawGString+=yytext; } <RawGString>. { @@ -3218,7 +3273,10 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) *pCopyCurlyGString+=yytext; } } -<GCopyCurly>[^"'{}\/\n]+ { +<GCopyCurly>[^"'{}\/\n,]+ { + *pCopyCurlyGString+=yytext; + } +<GCopyCurly>[,]+ { *pCopyCurlyGString+=yytext; } <GCopyCurly>"/" { *pCopyCurlyGString+=yytext; } @@ -4403,6 +4461,13 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) else BEGIN( lastCopyArgContext ); } +<CopyArgSharp>"(" { + *copyArgString+=*yytext; + fullArgString+=*yytext; + argRoundCount=0; + lastCopyArgContext = YY_START; + BEGIN( CopyArgRound ); + } <CopyArgSharp>"<" { argSharpCount++; //printf("argSharpCount++=%d copy\n",argSharpCount); @@ -4921,6 +4986,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) //addToBody(yytext); ++curlyCount ; } +<SkipCurly>"}"/{BN}*("/*!"|"/**"|"//!"|"///")"<!--" | /* see bug710917 */ <SkipCurly>"}" { //addToBody(yytext); if( curlyCount ) @@ -4929,22 +4995,6 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } else { -#if 0 - if (!Config_getBool("HIDE_IN_BODY_DOCS") && - !current->doc.isEmpty()) - { - // copy documentation found inside the body - // to the previous item - if (previous->inbodyLine==-1) - { - previous->inbodyLine = current->docLine; - previous->inbodyFile = current->docFile; - } - //printf("*** inbodyDocs+=%s\n",current->doc.data()); - previous->inbodyDocs += current->doc; - current->doc.resize(0); - } -#endif if (current->sli && previous) // copy special list items { QListIterator<ListItemInfo> li(*current->sli); @@ -5742,21 +5792,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) *specName += *yytext; if (roundCount==0 && --sharpCount<=0) { - if (1 /*!insideCS*/) - { - baseName+=*specName; - } - else - { - if (current->tArgLists==0) - { - current->tArgLists = new QList<ArgumentList>; - current->tArgLists->setAutoDelete(TRUE); - } - ArgumentList *al = new ArgumentList; - current->tArgLists->append(al); - stringToArgumentList(*specName,al); - } + baseName+=removeRedundantWhiteSpace(*specName); BEGIN(lastSkipSharpContext); } } @@ -6155,23 +6191,27 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) docBlockName.at(1)='}'; } g_fencedSize=0; + g_nestedComment=FALSE; BEGIN(DocCopyBlock); } <DocBlock>"<"{PRE}">" { docBlock+=yytext; docBlockName="<pre>"; g_fencedSize=0; + g_nestedComment=FALSE; BEGIN(DocCopyBlock); } <DocBlock>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"dot"|"code")/[^a-z_A-Z0-9] { // verbatim command (which could contain nested comments!) docBlock+=yytext; docBlockName=&yytext[1]; g_fencedSize=0; + g_nestedComment=FALSE; BEGIN(DocCopyBlock); } <DocBlock>"~~~"[~]* { docBlock+=yytext; g_fencedSize=yyleng; + g_nestedComment=FALSE; BEGIN(DocCopyBlock); } <DocBlock>{B}*"<code>" { @@ -6179,6 +6219,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) { docBlock+=yytext; docBlockName="<code>"; + g_nestedComment=FALSE; BEGIN(DocCopyBlock); } else @@ -6240,12 +6281,32 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) docBlock+=indent; } } -<DocCopyBlock>^{B}*+"*"/{BN}* { // start of a comment line +<DocCopyBlock>^{B}*"*"+/{BN}+"*"{BN}* { // start of a comment line with two *'s + if (docBlockName=="code") + { + QCString indent; + indent.fill(' ',computeIndent(yytext,0)); + docBlock+=indent; + } + else + { + REJECT; + } + } +<DocCopyBlock>^{B}*"*"+/{BN}* { // start of a comment line with one * if (docBlockName=="code") { QCString indent; - indent.fill(' ',computeIndent(yytext,0)-1); - docBlock+=indent+"*"; + if (g_nestedComment) // keep * it is part of the code + { + indent.fill(' ',computeIndent(yytext,-1)); + docBlock+=indent+"*"; + } + else // remove * it is part of the comment block + { + indent.fill(' ',computeIndent(yytext,0)); + docBlock+=indent; + } } else { @@ -6263,6 +6324,14 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) docBlock+=yytext; } <DocCopyBlock>"/*"|"*/"|"//" { + if (yytext[1]=='*') + { + g_nestedComment=TRUE; + } + else if (yytext[0]=='*') + { + g_nestedComment=FALSE; + } docBlock+=yytext; } <DocCopyBlock>\n { // newline @@ -6563,7 +6632,7 @@ static void parseCompounds(Entry *rt) g_column=0; inputString = ce->program; inputPosition = 0; - scanYYrestart( scanYYin ) ; + scannerYYrestart( scannerYYin ) ; if (ce->section==Entry::ENUM_SEC || (ce->spec&Entry::Enum)) BEGIN( FindFields ) ; else @@ -6633,7 +6702,7 @@ static void parseCompounds(Entry *rt) //memberGroupInside.resize(0); groupEnterCompound(yyFileName,yyLineNr,ce->name); - scanYYlex() ; + scannerYYlex() ; g_lexInit=TRUE; //forceEndGroup(); @@ -6710,7 +6779,7 @@ static void parseMain(const char *fileName, } current->reset(); initEntry(); - scanYYrestart( scanYYin ); + scannerYYrestart( scannerYYin ); if ( insidePHP ) { BEGIN( FindMembersPHP ); @@ -6720,7 +6789,7 @@ static void parseMain(const char *fileName, BEGIN( FindMembers ); } - scanYYlex(); + scannerYYlex(); g_lexInit=TRUE; if (YY_START==Comment) @@ -6774,7 +6843,7 @@ static void parsePrototype(const QCString &text) // save scanner state orgState = YY_CURRENT_BUFFER; - yy_switch_to_buffer(yy_create_buffer(scanYYin, YY_BUF_SIZE)); + yy_switch_to_buffer(yy_create_buffer(scannerYYin, YY_BUF_SIZE)); orgInputString = inputString; orgInputPosition = inputPosition; @@ -6782,9 +6851,9 @@ static void parsePrototype(const QCString &text) inputString = text; inputPosition = 0; g_column = 0; - scanYYrestart( scanYYin ); + scannerYYrestart( scannerYYin ); BEGIN(Prototype); - scanYYlex(); + scannerYYlex(); g_lexInit=TRUE; current->name = current->name.stripWhiteSpace(); @@ -6806,7 +6875,7 @@ void scanFreeScanner() #if defined(YY_FLEX_SUBMINOR_VERSION) if (g_lexInit) { - scanYYlex_destroy(); + scannerYYlex_destroy(); } #endif } @@ -6845,8 +6914,13 @@ void CLanguageScanner::parseInput(const char *fileName, QStrList & filesInSameTranslationUnit) { g_thisParser = this; + + printlex(yy_flex_debug, TRUE, __FILE__, fileName); + ::parseMain(fileName,fileBuf,root, sameTranslationUnit,filesInSameTranslationUnit); + + printlex(yy_flex_debug, FALSE, __FILE__, fileName); } void CLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, @@ -6861,12 +6935,13 @@ void CLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, bool inlineFragment, MemberDef *memberDef, bool showLineNumbers, - Definition *searchCtx + Definition *searchCtx, + bool collectXRefs ) { ::parseCCode(codeOutIntf,scopeName,input,lang,isExampleBlock,exampleName, fileDef,startLine,endLine,inlineFragment,memberDef, - showLineNumbers,searchCtx); + showLineNumbers,searchCtx,collectXRefs); } bool CLanguageScanner::needsPreprocessing(const QCString &extension) diff --git a/src/search.js b/src/search.js index 3ed3f90..10cee88 100644 --- a/src/search.js +++ b/src/search.js @@ -5,7 +5,7 @@ function convertToId(search) { var c = search.charAt(i); var cn = c.charCodeAt(0); - if (c.match(/[a-z0-9]/)) + if (c.match(/[a-z0-9\u0080-\uFFFF]/)) { result+=c; } @@ -310,22 +310,20 @@ function SearchBox(name, resultsPath, inFrame, label) var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); var code = searchValue.toLowerCase().charCodeAt(0); - var hexCode; - if (code<16) + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair { - hexCode="0"+code.toString(16); - } - else - { - hexCode=code.toString(16); + idxChar = searchValue.substr(0, 2); } var resultsPage; var resultsPageWithSearch; var hasResultsPage; - if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1') + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + var hexCode=idx.toString(16); resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; resultsPageWithSearch = resultsPage+'?'+escape(searchValue); hasResultsPage = true; diff --git a/src/search_css.h b/src/search_css.h deleted file mode 100644 index 48c4df9..0000000 --- a/src/search_css.h +++ /dev/null @@ -1,271 +0,0 @@ -"/*---------------- Search Box */\n" -"\n" -"#FSearchBox {\n" -" float: left;\n" -"}\n" -"\n" -"#MSearchBox {\n" -" white-space : nowrap;\n" -" position: absolute;\n" -" float: none;\n" -" display: inline;\n" -" margin-top: 8px;\n" -" right: 0px;\n" -" width: 170px;\n" -" z-index: 102;\n" -" background-color: white;\n" -"}\n" -"\n" -"#MSearchBox .left\n" -"{\n" -" display:block;\n" -" position:absolute;\n" -" left:10px;\n" -" width:20px;\n" -" height:19px;\n" -" background:url('search_l.png') no-repeat;\n" -" background-position:right;\n" -"}\n" -"\n" -"#MSearchSelect {\n" -" display:block;\n" -" position:absolute;\n" -" width:20px;\n" -" height:19px;\n" -"}\n" -"\n" -".left #MSearchSelect {\n" -" left:4px;\n" -"}\n" -"\n" -".right #MSearchSelect {\n" -" right:5px;\n" -"}\n" -"\n" -"#MSearchField {\n" -" display:block;\n" -" position:absolute;\n" -" height:19px;\n" -" background:url('search_m.png') repeat-x;\n" -" border:none;\n" -" width:111px;\n" -" margin-left:20px;\n" -" padding-left:4px;\n" -" color: #909090;\n" -" outline: none;\n" -" font: 9pt Arial, Verdana, sans-serif;\n" -"}\n" -"\n" -"#FSearchBox #MSearchField {\n" -" margin-left:15px;\n" -"}\n" -"\n" -"#MSearchBox .right {\n" -" display:block;\n" -" position:absolute;\n" -" right:10px;\n" -" top:0px;\n" -" width:20px;\n" -" height:19px;\n" -" background:url('search_r.png') no-repeat;\n" -" background-position:left;\n" -"}\n" -"\n" -"#MSearchClose {\n" -" display: none;\n" -" position: absolute;\n" -" top: 4px;\n" -" background : none;\n" -" border: none;\n" -" margin: 0px 4px 0px 0px;\n" -" padding: 0px 0px;\n" -" outline: none;\n" -"}\n" -"\n" -".left #MSearchClose {\n" -" left: 6px;\n" -"}\n" -"\n" -".right #MSearchClose {\n" -" right: 2px;\n" -"}\n" -"\n" -".MSearchBoxActive #MSearchField {\n" -" color: #000000;\n" -"}\n" -"\n" -"/*---------------- Search filter selection */\n" -"\n" -"#MSearchSelectWindow {\n" -" display: none;\n" -" position: absolute;\n" -" left: 0; top: 0;\n" -" border: 1px solid ##A0;\n" -" background-color: ##FA;\n" -" z-index: 1;\n" -" padding-top: 4px;\n" -" padding-bottom: 4px;\n" -" -moz-border-radius: 4px;\n" -" -webkit-border-top-left-radius: 4px;\n" -" -webkit-border-top-right-radius: 4px;\n" -" -webkit-border-bottom-left-radius: 4px;\n" -" -webkit-border-bottom-right-radius: 4px;\n" -" -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n" -"}\n" -"\n" -".SelectItem {\n" -" font: 8pt Arial, Verdana, sans-serif;\n" -" padding-left: 2px;\n" -" padding-right: 12px;\n" -" border: 0px;\n" -"}\n" -"\n" -"span.SelectionMark {\n" -" margin-right: 4px;\n" -" font-family: monospace;\n" -" outline-style: none;\n" -" text-decoration: none;\n" -"}\n" -"\n" -"a.SelectItem {\n" -" display: block;\n" -" outline-style: none;\n" -" color: #000000; \n" -" text-decoration: none;\n" -" padding-left: 6px;\n" -" padding-right: 12px;\n" -"}\n" -"\n" -"a.SelectItem:focus,\n" -"a.SelectItem:active {\n" -" color: #000000; \n" -" outline-style: none;\n" -" text-decoration: none;\n" -"}\n" -"\n" -"a.SelectItem:hover {\n" -" color: #FFFFFF;\n" -" background-color: ##50;\n" -" outline-style: none;\n" -" text-decoration: none;\n" -" cursor: pointer;\n" -" display: block;\n" -"}\n" -"\n" -"/*---------------- Search results window */\n" -"\n" -"iframe#MSearchResults {\n" -" width: 60ex;\n" -" height: 15em;\n" -"}\n" -"\n" -"#MSearchResultsWindow {\n" -" display: none;\n" -" position: absolute;\n" -" left: 0; top: 0;\n" -" border: 1px solid #000;\n" -" background-color: ##F0;\n" -"}\n" -"\n" -"/* ----------------------------------- */\n" -"\n" -"\n" -"#SRIndex {\n" -" clear:both; \n" -" padding-bottom: 15px;\n" -"}\n" -"\n" -".SREntry {\n" -" font-size: 10pt;\n" -" padding-left: 1ex;\n" -"}\n" -"\n" -".SRPage .SREntry {\n" -" font-size: 8pt;\n" -" padding: 1px 5px;\n" -"}\n" -"\n" -"body.SRPage {\n" -" margin: 5px 2px;\n" -"}\n" -"\n" -".SRChildren {\n" -" padding-left: 3ex; padding-bottom: .5em \n" -"}\n" -"\n" -".SRPage .SRChildren {\n" -" display: none;\n" -"}\n" -"\n" -".SRSymbol {\n" -" font-weight: bold; \n" -" color: ##58;\n" -" font-family: Arial, Verdana, sans-serif;\n" -" text-decoration: none;\n" -" outline: none;\n" -"}\n" -"\n" -"a.SRScope {\n" -" display: block;\n" -" color: ##58; \n" -" font-family: Arial, Verdana, sans-serif;\n" -" text-decoration: none;\n" -" outline: none;\n" -"}\n" -"\n" -"a.SRSymbol:focus, a.SRSymbol:active,\n" -"a.SRScope:focus, a.SRScope:active {\n" -" text-decoration: underline;\n" -"}\n" -"\n" -"span.SRScope {\n" -" padding-left: 4px;\n" -"}\n" -"\n" -".SRPage .SRStatus {\n" -" padding: 2px 5px;\n" -" font-size: 8pt;\n" -" font-style: italic;\n" -"}\n" -"\n" -".SRResult {\n" -" display: none;\n" -"}\n" -"\n" -"DIV.searchresults {\n" -" margin-left: 10px;\n" -" margin-right: 10px;\n" -"}\n" -"\n" -"/*---------------- External search page results */\n" -"\n" -".searchresult {\n" -" background-color: ##F2;\n" -"}\n" -"\n" -".pages b {\n" -" color: white;\n" -" padding: 5px 5px 3px 5px;\n" -" background-image: url(\"../tab_a.png\");\n" -" background-repeat: repeat-x;\n" -" text-shadow: 0 1px 1px #000000;\n" -"}\n" -"\n" -".pages {\n" -" line-height: 17px;\n" -" margin-left: 4px;\n" -" text-decoration: none;\n" -"}\n" -"\n" -".hl {\n" -" font-weight: bold;\n" -"}\n" -"\n" -"#searchresults {\n" -" margin-bottom: 20px;\n" -"}\n" -"\n" -".searchpages {\n" -" margin-top: 10px;\n" -"}\n" -"\n" diff --git a/src/search_functions.php b/src/search_functions.php index acd7f3c..5ad2e5d 100644 --- a/src/search_functions.php +++ b/src/search_functions.php @@ -358,7 +358,7 @@ function main() $sorted = run_query($query); // Now output the HTML stuff... // End the HTML form - end_form(preg_replace("/[^a-zA-Z0-9\-\_\.]/i", " ", $query )); + end_form(preg_replace("/[^a-zA-Z0-9\-\_\.\x80-\xFF]/i", " ", $query )); // report results to the user report_results($sorted); end_page(); diff --git a/src/search_functions_php.h b/src/search_functions_php.h deleted file mode 100644 index b09c259..0000000 --- a/src/search_functions_php.h +++ /dev/null @@ -1,366 +0,0 @@ -"<script language=\"PHP\">\n" -"require_once \"search-config.php\";\n" -"\n" -"function end_form($value)\n" -"{\n" -" global $config;\n" -" global $translator;\n" -" if ($config['DISABLE_INDEX'] == false)\n" -" {\n" -" echo \" <input type=\\\"text\\\" id=\\\"MSearchField\\\" name=\\\"query\\\" value=\\\"$value\\\" size=\\\"20\\\" accesskey=\\\"S\\\" onfocus=\\\"searchBox.OnSearchFieldFocus(true)\\\" onblur=\\\"searchBox.OnSearchFieldFocus(false)\\\"/>\\n </form>\\n </div><div class=\\\"right\\\"></div>\\n </div>\\n </li>\\n </ul>\\n </div>\\n</div>\\n\";\n" -" }\n" -" if ($config['GENERATE_TREEVIEW'])\n" -" {\n" -" echo $translator['split_bar'];\n" -" }\n" -"}\n" -"\n" -"function end_page()\n" -"{\n" -" echo \"</body></html>\";\n" -"}\n" -"\n" -"function search_results()\n" -"{\n" -" global $translator;\n" -" return $translator['search_results_title'];\n" -"}\n" -"\n" -"function matches_text($num)\n" -"{\n" -" global $translator;\n" -" $string = $translator['search_results'][($num>2)?2:$num];\n" -" // The eval is used so that translator strings can contain $num.\n" -" eval(\"\\$result = \\\"$string\\\";\");\n" -" return $result;\n" -"}\n" -"\n" -"function report_matches()\n" -"{\n" -" global $translator;\n" -" return $translator['search_matches'];\n" -"}\n" -"\n" -"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" -" // Simple hashing that allows for substring search\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 the hash key\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" -" $totalHi=0;\n" -" $totalFreqHi=0;\n" -" $totalFreqLo=0;\n" -" for ($count=$start;$count<sizeof($statsList);$count++)\n" -" {\n" -" $statInfo = &$statsList[$count];\n" -" $multiplier = 1;\n" -" // whole word matches have a double weight\n" -" if ($statInfo[\"full\"]) $multiplier=2;\n" -" fseek($file,$statInfo[\"index\"]); \n" -" $numDocs = readInt($file);\n" -" $docInfo = array();\n" -" // read docs info + occurrence frequency of the word\n" -" for ($i=0;$i<$numDocs;$i++)\n" -" {\n" -" $idx=readInt($file); \n" -" $freq=readInt($file); \n" -" $docInfo[$i]=array(\"idx\" => $idx,\n" -" \"freq\" => $freq>>1,\n" -" \"rank\" => 0.0,\n" -" \"hi\" => $freq&1\n" -" );\n" -" if ($freq&1) // word occurs in high priority doc\n" -" {\n" -" $totalHi++;\n" -" $totalFreqHi+=$freq*$multiplier;\n" -" }\n" -" else // word occurs in low priority doc\n" -" {\n" -" $totalFreqLo+=$freq*$multiplier;\n" -" }\n" -" }\n" -" // read name and 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" -" $totalFreq=($totalHi+1)*$totalFreqLo + $totalFreqHi;\n" -" for ($count=$start;$count<sizeof($statsList);$count++)\n" -" {\n" -" $statInfo = &$statsList[$count];\n" -" $multiplier = 1;\n" -" // whole word matches have a double weight\n" -" if ($statInfo[\"full\"]) $multiplier=2;\n" -" for ($i=0;$i<sizeof($statInfo[\"docs\"]);$i++)\n" -" {\n" -" $docInfo = &$statInfo[\"docs\"];\n" -" // compute frequency rank of the word in each doc\n" -" $freq=$docInfo[$i][\"freq\"];\n" -" if ($docInfo[$i][\"hi\"])\n" -" {\n" -" $statInfo[\"docs\"][$i][\"rank\"]=\n" -" (float)($freq*$multiplier+$totalFreqLo)/$totalFreq;\n" -" }\n" -" else\n" -" {\n" -" $statInfo[\"docs\"][$i][\"rank\"]=\n" -" (float)($freq*$multiplier)/$totalFreq;\n" -" }\n" -" }\n" -" }\n" -" }\n" -" }\n" -" return $statsList;\n" -"}\n" -"\n" -"function combine_results($results,&$docs)\n" -"{\n" -" foreach ($results as $wordInfo)\n" -" {\n" -" $docsList = &$wordInfo[\"docs\"];\n" -" foreach ($docsList as $di)\n" -" {\n" -" $key=$di[\"url\"];\n" -" $rank=$di[\"rank\"];\n" -" if (isset($docs[$key]))\n" -" {\n" -" $docs[$key][\"rank\"]+=$rank;\n" -" }\n" -" else\n" -" {\n" -" $docs[$key] = array(\"url\"=>$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 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" -" if ($a[\"rank\"] == $b[\"rank\"]) \n" -" {\n" -" return 0;\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 \"<div class=\\\"header\\\">\";\n" -" echo \" <div class=\\\"headertitle\\\">\\n\";\n" -" echo \" <h1>\".search_results().\"</h1>\\n\";\n" -" echo \" </div>\\n\";\n" -" echo \"</div>\\n\";\n" -" echo \"<div class=\\\"searchresults\\\">\\n\";\n" -" echo \"<table cellspacing=\\\"2\\\">\\n\";\n" -" $numDocs = sizeof($docs);\n" -" if ($numDocs==0)\n" -" {\n" -" echo \" <tr>\\n\";\n" -" echo \" <td colspan=\\\"2\\\">\".matches_text(0).\"</td>\\n\";\n" -" echo \" </tr>\\n\";\n" -" }\n" -" else\n" -" {\n" -" echo \" <tr>\\n\";\n" -" echo \" <td colspan=\\\"2\\\">\".matches_text($numDocs);\n" -" echo \"\\n\";\n" -" echo \" </td>\\n\";\n" -" echo \" </tr>\\n\";\n" -" $num=1;\n" -" foreach ($docs as $doc)\n" -" {\n" -" echo \" <tr>\\n\";\n" -" echo \" <td align=\\\"right\\\">$num.</td>\";\n" -" echo \"<td><a class=\\\"el\\\" href=\\\"\".$doc[\"url\"].\"\\\">\".$doc[\"name\"].\"</a></td>\\n\";\n" -" echo \" <tr>\\n\";\n" -" echo \" <td></td><td class=\\\"tiny\\\">\".report_matches().\" \";\n" -" foreach ($doc[\"words\"] as $wordInfo)\n" -" {\n" -" $word = $wordInfo[\"word\"];\n" -" $matchRight = substr($wordInfo[\"match\"],strlen($word));\n" -" echo \"<b>$word</b>$matchRight(\".$wordInfo[\"freq\"].\") \";\n" -" }\n" -" echo \" </td>\\n\";\n" -" echo \" </tr>\\n\";\n" -" $num++;\n" -" }\n" -" }\n" -" echo \"</table>\\n\";\n" -" echo \"</div>\\n\";\n" -"}\n" -"\n" -"function run_query($query)\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/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" -" $results = array();\n" -" $requiredWords = array();\n" -" $forbiddenWords = array();\n" -" $foundWords = array();\n" -" $word=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,strtolower($word),$results);\n" -" }\n" -" $word=strtok(\" \");\n" -" }\n" -" fclose($file);\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" -" // sort the results based on rank\n" -" $sorted = array();\n" -" sort_results($filteredDocs,$sorted);\n" -" return $sorted;\n" -"}\n" -"\n" -"function main()\n" -"{\n" -" $query = \"\";\n" -" if (array_key_exists(\"query\", $_GET))\n" -" {\n" -" $query=$_GET[\"query\"];\n" -" }\n" -" $sorted = run_query($query);\n" -" // Now output the HTML stuff...\n" -" // End the HTML form\n" -" end_form(preg_replace(\"/[^a-zA-Z0-9\\-\\_\\.]/i\", \" \", $query ));\n" -" // report results to the user\n" -" report_results($sorted);\n" -" end_page();\n" -"}\n" -"</script>\n" diff --git a/src/search_js.h b/src/search_js.h deleted file mode 100644 index 985d03c..0000000 --- a/src/search_js.h +++ /dev/null @@ -1,778 +0,0 @@ -"function convertToId(search)\n" -"{\n" -" var result = '';\n" -" for (i=0;i<search.length;i++)\n" -" {\n" -" var c = search.charAt(i);\n" -" var cn = c.charCodeAt(0);\n" -" if (c.match(/[a-z0-9]/))\n" -" {\n" -" result+=c;\n" -" }\n" -" else if (cn<16) \n" -" {\n" -" result+=\"_0\"+cn.toString(16);\n" -" }\n" -" else \n" -" {\n" -" result+=\"_\"+cn.toString(16);\n" -" }\n" -" }\n" -" return result;\n" -"}\n" -"\n" -"function getXPos(item)\n" -"{\n" -" var x = 0;\n" -" if (item.offsetWidth)\n" -" {\n" -" while (item && item!=document.body)\n" -" {\n" -" x += item.offsetLeft;\n" -" item = item.offsetParent;\n" -" }\n" -" }\n" -" return x;\n" -"}\n" -"\n" -"function getYPos(item)\n" -"{\n" -" var y = 0;\n" -" if (item.offsetWidth)\n" -" {\n" -" while (item && item!=document.body)\n" -" {\n" -" y += item.offsetTop;\n" -" item = item.offsetParent;\n" -" }\n" -" }\n" -" return y;\n" -"}\n" -"\n" -"/* A class handling everything associated with the search panel.\n" -"\n" -" Parameters:\n" -" name - The name of the global variable that will be \n" -" storing this instance. Is needed to be able to set timeouts.\n" -" resultPath - path to use for external files\n" -"*/\n" -"function SearchBox(name, resultsPath, inFrame, label)\n" -"{\n" -" if (!name || !resultsPath) { alert(\"Missing parameters to SearchBox.\"); }\n" -" \n" -" // ---------- Instance variables\n" -" this.name = name;\n" -" this.resultsPath = resultsPath;\n" -" this.keyTimeout = 0;\n" -" this.keyTimeoutLength = 500;\n" -" this.closeSelectionTimeout = 300;\n" -" this.lastSearchValue = \"\";\n" -" this.lastResultsPage = \"\";\n" -" this.hideTimeout = 0;\n" -" this.searchIndex = 0;\n" -" this.searchActive = false;\n" -" this.insideFrame = inFrame;\n" -" this.searchLabel = label;\n" -"\n" -" // ----------- DOM Elements\n" -"\n" -" this.DOMSearchField = function()\n" -" { return document.getElementById(\"MSearchField\"); }\n" -"\n" -" this.DOMSearchSelect = function()\n" -" { return document.getElementById(\"MSearchSelect\"); }\n" -"\n" -" this.DOMSearchSelectWindow = function()\n" -" { return document.getElementById(\"MSearchSelectWindow\"); }\n" -"\n" -" this.DOMPopupSearchResults = function()\n" -" { return document.getElementById(\"MSearchResults\"); }\n" -"\n" -" this.DOMPopupSearchResultsWindow = function()\n" -" { return document.getElementById(\"MSearchResultsWindow\"); }\n" -"\n" -" this.DOMSearchClose = function()\n" -" { return document.getElementById(\"MSearchClose\"); }\n" -"\n" -" this.DOMSearchBox = function()\n" -" { return document.getElementById(\"MSearchBox\"); }\n" -"\n" -" // ------------ Event Handlers\n" -"\n" -" // Called when focus is added or removed from the search field.\n" -" this.OnSearchFieldFocus = function(isActive)\n" -" {\n" -" this.Activate(isActive);\n" -" }\n" -"\n" -" this.OnSearchSelectShow = function()\n" -" {\n" -" var searchSelectWindow = this.DOMSearchSelectWindow();\n" -" var searchField = this.DOMSearchSelect();\n" -"\n" -" if (this.insideFrame)\n" -" {\n" -" var left = getXPos(searchField);\n" -" var top = getYPos(searchField);\n" -" left += searchField.offsetWidth + 6;\n" -" top += searchField.offsetHeight;\n" -"\n" -" // show search selection popup\n" -" searchSelectWindow.style.display='block';\n" -" left -= searchSelectWindow.offsetWidth;\n" -" searchSelectWindow.style.left = left + 'px';\n" -" searchSelectWindow.style.top = top + 'px';\n" -" }\n" -" else\n" -" {\n" -" var left = getXPos(searchField);\n" -" var top = getYPos(searchField);\n" -" top += searchField.offsetHeight;\n" -"\n" -" // show search selection popup\n" -" searchSelectWindow.style.display='block';\n" -" searchSelectWindow.style.left = left + 'px';\n" -" searchSelectWindow.style.top = top + 'px';\n" -" }\n" -"\n" -" // stop selection hide timer\n" -" if (this.hideTimeout) \n" -" {\n" -" clearTimeout(this.hideTimeout);\n" -" this.hideTimeout=0;\n" -" }\n" -" return false; // to avoid \"image drag\" default event\n" -" }\n" -"\n" -" this.OnSearchSelectHide = function()\n" -" {\n" -" this.hideTimeout = setTimeout(this.name +\".CloseSelectionWindow()\",\n" -" this.closeSelectionTimeout);\n" -" }\n" -"\n" -" // Called when the content of the search field is changed.\n" -" this.OnSearchFieldChange = function(evt)\n" -" {\n" -" if (this.keyTimeout) // kill running timer\n" -" {\n" -" clearTimeout(this.keyTimeout);\n" -" this.keyTimeout = 0;\n" -" }\n" -"\n" -" var e = (evt) ? evt : window.event; // for IE\n" -" if (e.keyCode==40 || e.keyCode==13)\n" -" {\n" -" if (e.shiftKey==1)\n" -" {\n" -" this.OnSearchSelectShow();\n" -" var win=this.DOMSearchSelectWindow(); \n" -" for (i=0;i<win.childNodes.length;i++)\n" -" {\n" -" var child = win.childNodes[i]; // get span within a\n" -" if (child.className=='SelectItem')\n" -" {\n" -" child.focus();\n" -" return;\n" -" }\n" -" }\n" -" return;\n" -" }\n" -" else if (window.frames.MSearchResults.searchResults)\n" -" {\n" -" var elem = window.frames.MSearchResults.searchResults.NavNext(0);\n" -" if (elem) elem.focus();\n" -" }\n" -" }\n" -" else if (e.keyCode==27) // Escape out of the search field\n" -" {\n" -" this.DOMSearchField().blur();\n" -" this.DOMPopupSearchResultsWindow().style.display = 'none';\n" -" this.DOMSearchClose().style.display = 'none';\n" -" this.lastSearchValue = '';\n" -" this.Activate(false);\n" -" return;\n" -" }\n" -"\n" -" // strip whitespaces\n" -" var searchValue = this.DOMSearchField().value.replace(/ +/g, \"\");\n" -"\n" -" if (searchValue != this.lastSearchValue) // search value has changed\n" -" {\n" -" if (searchValue != \"\") // non-empty search\n" -" {\n" -" // set timer for search update\n" -" this.keyTimeout = setTimeout(this.name + '.Search()',\n" -" this.keyTimeoutLength);\n" -" }\n" -" else // empty search field\n" -" {\n" -" this.DOMPopupSearchResultsWindow().style.display = 'none';\n" -" this.DOMSearchClose().style.display = 'none';\n" -" this.lastSearchValue = '';\n" -" }\n" -" }\n" -" }\n" -"\n" -" this.SelectItemCount = function(id)\n" -" {\n" -" var count=0;\n" -" var win=this.DOMSearchSelectWindow(); \n" -" for (i=0;i<win.childNodes.length;i++)\n" -" {\n" -" var child = win.childNodes[i]; // get span within a\n" -" if (child.className=='SelectItem')\n" -" {\n" -" count++;\n" -" }\n" -" }\n" -" return count;\n" -" }\n" -"\n" -" this.SelectItemSet = function(id)\n" -" {\n" -" var i,j=0;\n" -" var win=this.DOMSearchSelectWindow(); \n" -" for (i=0;i<win.childNodes.length;i++)\n" -" {\n" -" var child = win.childNodes[i]; // get span within a\n" -" if (child.className=='SelectItem')\n" -" {\n" -" var node = child.firstChild;\n" -" if (j==id)\n" -" {\n" -" node.innerHTML='•';\n" -" }\n" -" else\n" -" {\n" -" node.innerHTML=' ';\n" -" }\n" -" j++;\n" -" }\n" -" }\n" -" }\n" -"\n" -" // Called when an search filter selection is made.\n" -" // set item with index id as the active item\n" -" this.OnSelectItem = function(id)\n" -" {\n" -" this.searchIndex = id;\n" -" this.SelectItemSet(id);\n" -" var searchValue = this.DOMSearchField().value.replace(/ +/g, \"\");\n" -" if (searchValue!=\"\" && this.searchActive) // something was found -> do a search\n" -" {\n" -" this.Search();\n" -" }\n" -" }\n" -"\n" -" this.OnSearchSelectKey = function(evt)\n" -" {\n" -" var e = (evt) ? evt : window.event; // for IE\n" -" if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down\n" -" {\n" -" this.searchIndex++;\n" -" this.OnSelectItem(this.searchIndex);\n" -" }\n" -" else if (e.keyCode==38 && this.searchIndex>0) // Up\n" -" {\n" -" this.searchIndex--;\n" -" this.OnSelectItem(this.searchIndex);\n" -" }\n" -" else if (e.keyCode==13 || e.keyCode==27)\n" -" {\n" -" this.OnSelectItem(this.searchIndex);\n" -" this.CloseSelectionWindow();\n" -" this.DOMSearchField().focus();\n" -" }\n" -" return false;\n" -" }\n" -"\n" -" // --------- Actions\n" -"\n" -" // Closes the results window.\n" -" this.CloseResultsWindow = function()\n" -" {\n" -" this.DOMPopupSearchResultsWindow().style.display = 'none';\n" -" this.DOMSearchClose().style.display = 'none';\n" -" this.Activate(false);\n" -" }\n" -"\n" -" this.CloseSelectionWindow = function()\n" -" {\n" -" this.DOMSearchSelectWindow().style.display = 'none';\n" -" }\n" -"\n" -" // Performs a search.\n" -" this.Search = function()\n" -" {\n" -" this.keyTimeout = 0;\n" -"\n" -" // strip leading whitespace\n" -" var searchValue = this.DOMSearchField().value.replace(/^ +/, \"\");\n" -"\n" -" var code = searchValue.toLowerCase().charCodeAt(0);\n" -" var hexCode;\n" -" if (code<16) \n" -" {\n" -" hexCode=\"0\"+code.toString(16);\n" -" }\n" -" else \n" -" {\n" -" hexCode=code.toString(16);\n" -" }\n" -"\n" -" var resultsPage;\n" -" var resultsPageWithSearch;\n" -" var hasResultsPage;\n" -"\n" -" if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1')\n" -" {\n" -" resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';\n" -" resultsPageWithSearch = resultsPage+'?'+escape(searchValue);\n" -" hasResultsPage = true;\n" -" }\n" -" else // nothing available for this search term\n" -" {\n" -" resultsPage = this.resultsPath + '/nomatches.html';\n" -" resultsPageWithSearch = resultsPage;\n" -" hasResultsPage = false;\n" -" }\n" -"\n" -" window.frames.MSearchResults.location = resultsPageWithSearch; \n" -" var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();\n" -"\n" -" if (domPopupSearchResultsWindow.style.display!='block')\n" -" {\n" -" var domSearchBox = this.DOMSearchBox();\n" -" this.DOMSearchClose().style.display = 'inline';\n" -" if (this.insideFrame)\n" -" {\n" -" var domPopupSearchResults = this.DOMPopupSearchResults();\n" -" domPopupSearchResultsWindow.style.position = 'relative';\n" -" domPopupSearchResultsWindow.style.display = 'block';\n" -" var width = document.body.clientWidth - 8; // the -8 is for IE :-(\n" -" domPopupSearchResultsWindow.style.width = width + 'px';\n" -" domPopupSearchResults.style.width = width + 'px';\n" -" }\n" -" else\n" -" {\n" -" var domPopupSearchResults = this.DOMPopupSearchResults();\n" -" var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;\n" -" var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;\n" -" domPopupSearchResultsWindow.style.display = 'block';\n" -" left -= domPopupSearchResults.offsetWidth;\n" -" domPopupSearchResultsWindow.style.top = top + 'px';\n" -" domPopupSearchResultsWindow.style.left = left + 'px';\n" -" }\n" -" }\n" -"\n" -" this.lastSearchValue = searchValue;\n" -" this.lastResultsPage = resultsPage;\n" -" }\n" -"\n" -" // -------- Activation Functions\n" -"\n" -" // Activates or deactivates the search panel, resetting things to \n" -" // their default values if necessary. \n" -" this.Activate = function(isActive)\n" -" {\n" -" if (isActive || // open it\n" -" this.DOMPopupSearchResultsWindow().style.display == 'block' \n" -" )\n" -" {\n" -" this.DOMSearchBox().className = 'MSearchBoxActive';\n" -"\n" -" var searchField = this.DOMSearchField();\n" -"\n" -" if (searchField.value == this.searchLabel) // clear \"Search\" term upon entry\n" -" { \n" -" searchField.value = ''; \n" -" this.searchActive = true;\n" -" }\n" -" }\n" -" else if (!isActive) // directly remove the panel\n" -" {\n" -" this.DOMSearchBox().className = 'MSearchBoxInactive';\n" -" this.DOMSearchField().value = this.searchLabel;\n" -" this.searchActive = false;\n" -" this.lastSearchValue = ''\n" -" this.lastResultsPage = '';\n" -" }\n" -" }\n" -"}\n" -"\n" -"// -----------------------------------------------------------------------\n" -"\n" -"// The class that handles everything on the search results page.\n" -"function SearchResults(name)\n" -"{\n" -" // The number of matches from the last run of <Search()>.\n" -" this.lastMatchCount = 0;\n" -" this.lastKey = 0;\n" -" this.repeatOn = false;\n" -"\n" -" // Toggles the visibility of the passed element ID.\n" -" this.FindChildElement = function(id)\n" -" {\n" -" var parentElement = document.getElementById(id);\n" -" var element = parentElement.firstChild;\n" -"\n" -" while (element && element!=parentElement)\n" -" {\n" -" if (element.nodeName == 'DIV' && element.className == 'SRChildren')\n" -" {\n" -" return element;\n" -" }\n" -"\n" -" if (element.nodeName == 'DIV' && element.hasChildNodes())\n" -" { \n" -" element = element.firstChild; \n" -" }\n" -" else if (element.nextSibling)\n" -" { \n" -" element = element.nextSibling; \n" -" }\n" -" else\n" -" {\n" -" do\n" -" {\n" -" element = element.parentNode;\n" -" }\n" -" while (element && element!=parentElement && !element.nextSibling);\n" -"\n" -" if (element && element!=parentElement)\n" -" { \n" -" element = element.nextSibling; \n" -" }\n" -" }\n" -" }\n" -" }\n" -"\n" -" this.Toggle = function(id)\n" -" {\n" -" var element = this.FindChildElement(id);\n" -" if (element)\n" -" {\n" -" if (element.style.display == 'block')\n" -" {\n" -" element.style.display = 'none';\n" -" }\n" -" else\n" -" {\n" -" element.style.display = 'block';\n" -" }\n" -" }\n" -" }\n" -"\n" -" // Searches for the passed string. If there is no parameter,\n" -" // it takes it from the URL query.\n" -" //\n" -" // Always returns true, since other documents may try to call it\n" -" // and that may or may not be possible.\n" -" this.Search = function(search)\n" -" {\n" -" if (!search) // get search word from URL\n" -" {\n" -" search = window.location.search;\n" -" search = search.substring(1); // Remove the leading '?'\n" -" search = unescape(search);\n" -" }\n" -"\n" -" search = search.replace(/^ +/, \"\"); // strip leading spaces\n" -" search = search.replace(/ +$/, \"\"); // strip trailing spaces\n" -" search = search.toLowerCase();\n" -" search = convertToId(search);\n" -"\n" -" var resultRows = document.getElementsByTagName(\"div\");\n" -" var matches = 0;\n" -"\n" -" var i = 0;\n" -" while (i < resultRows.length)\n" -" {\n" -" var row = resultRows.item(i);\n" -" if (row.className == \"SRResult\")\n" -" {\n" -" var rowMatchName = row.id.toLowerCase();\n" -" rowMatchName = rowMatchName.replace(/^sr\\d*_/, ''); // strip 'sr123_'\n" -"\n" -" if (search.length<=rowMatchName.length && \n" -" rowMatchName.substr(0, search.length)==search)\n" -" {\n" -" row.style.display = 'block';\n" -" matches++;\n" -" }\n" -" else\n" -" {\n" -" row.style.display = 'none';\n" -" }\n" -" }\n" -" i++;\n" -" }\n" -" document.getElementById(\"Searching\").style.display='none';\n" -" if (matches == 0) // no results\n" -" {\n" -" document.getElementById(\"NoMatches\").style.display='block';\n" -" }\n" -" else // at least one result\n" -" {\n" -" document.getElementById(\"NoMatches\").style.display='none';\n" -" }\n" -" this.lastMatchCount = matches;\n" -" return true;\n" -" }\n" -"\n" -" // return the first item with index index or higher that is visible\n" -" this.NavNext = function(index)\n" -" {\n" -" var focusItem;\n" -" while (1)\n" -" {\n" -" var focusName = 'Item'+index;\n" -" focusItem = document.getElementById(focusName);\n" -" if (focusItem && focusItem.parentNode.parentNode.style.display=='block')\n" -" {\n" -" break;\n" -" }\n" -" else if (!focusItem) // last element\n" -" {\n" -" break;\n" -" }\n" -" focusItem=null;\n" -" index++;\n" -" }\n" -" return focusItem;\n" -" }\n" -"\n" -" this.NavPrev = function(index)\n" -" {\n" -" var focusItem;\n" -" while (1)\n" -" {\n" -" var focusName = 'Item'+index;\n" -" focusItem = document.getElementById(focusName);\n" -" if (focusItem && focusItem.parentNode.parentNode.style.display=='block')\n" -" {\n" -" break;\n" -" }\n" -" else if (!focusItem) // last element\n" -" {\n" -" break;\n" -" }\n" -" focusItem=null;\n" -" index--;\n" -" }\n" -" return focusItem;\n" -" }\n" -"\n" -" this.ProcessKeys = function(e)\n" -" {\n" -" if (e.type == \"keydown\") \n" -" {\n" -" this.repeatOn = false;\n" -" this.lastKey = e.keyCode;\n" -" }\n" -" else if (e.type == \"keypress\")\n" -" {\n" -" if (!this.repeatOn)\n" -" {\n" -" if (this.lastKey) this.repeatOn = true;\n" -" return false; // ignore first keypress after keydown\n" -" }\n" -" }\n" -" else if (e.type == \"keyup\")\n" -" {\n" -" this.lastKey = 0;\n" -" this.repeatOn = false;\n" -" }\n" -" return this.lastKey!=0;\n" -" }\n" -"\n" -" this.Nav = function(evt,itemIndex) \n" -" {\n" -" var e = (evt) ? evt : window.event; // for IE\n" -" if (e.keyCode==13) return true;\n" -" if (!this.ProcessKeys(e)) return false;\n" -"\n" -" if (this.lastKey==38) // Up\n" -" {\n" -" var newIndex = itemIndex-1;\n" -" var focusItem = this.NavPrev(newIndex);\n" -" if (focusItem)\n" -" {\n" -" var child = this.FindChildElement(focusItem.parentNode.parentNode.id);\n" -" if (child && child.style.display == 'block') // children visible\n" -" { \n" -" var n=0;\n" -" var tmpElem;\n" -" while (1) // search for last child\n" -" {\n" -" tmpElem = document.getElementById('Item'+newIndex+'_c'+n);\n" -" if (tmpElem)\n" -" {\n" -" focusItem = tmpElem;\n" -" }\n" -" else // found it!\n" -" {\n" -" break;\n" -" }\n" -" n++;\n" -" }\n" -" }\n" -" }\n" -" if (focusItem)\n" -" {\n" -" focusItem.focus();\n" -" }\n" -" else // return focus to search field\n" -" {\n" -" parent.document.getElementById(\"MSearchField\").focus();\n" -" }\n" -" }\n" -" else if (this.lastKey==40) // Down\n" -" {\n" -" var newIndex = itemIndex+1;\n" -" var focusItem;\n" -" var item = document.getElementById('Item'+itemIndex);\n" -" var elem = this.FindChildElement(item.parentNode.parentNode.id);\n" -" if (elem && elem.style.display == 'block') // children visible\n" -" {\n" -" focusItem = document.getElementById('Item'+itemIndex+'_c0');\n" -" }\n" -" if (!focusItem) focusItem = this.NavNext(newIndex);\n" -" if (focusItem) focusItem.focus();\n" -" }\n" -" else if (this.lastKey==39) // Right\n" -" {\n" -" var item = document.getElementById('Item'+itemIndex);\n" -" var elem = this.FindChildElement(item.parentNode.parentNode.id);\n" -" if (elem) elem.style.display = 'block';\n" -" }\n" -" else if (this.lastKey==37) // Left\n" -" {\n" -" var item = document.getElementById('Item'+itemIndex);\n" -" var elem = this.FindChildElement(item.parentNode.parentNode.id);\n" -" if (elem) elem.style.display = 'none';\n" -" }\n" -" else if (this.lastKey==27) // Escape\n" -" {\n" -" parent.searchBox.CloseResultsWindow();\n" -" parent.document.getElementById(\"MSearchField\").focus();\n" -" }\n" -" else if (this.lastKey==13) // Enter\n" -" {\n" -" return true;\n" -" }\n" -" return false;\n" -" }\n" -"\n" -" this.NavChild = function(evt,itemIndex,childIndex)\n" -" {\n" -" var e = (evt) ? evt : window.event; // for IE\n" -" if (e.keyCode==13) return true;\n" -" if (!this.ProcessKeys(e)) return false;\n" -"\n" -" if (this.lastKey==38) // Up\n" -" {\n" -" if (childIndex>0)\n" -" {\n" -" var newIndex = childIndex-1;\n" -" document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();\n" -" }\n" -" else // already at first child, jump to parent\n" -" {\n" -" document.getElementById('Item'+itemIndex).focus();\n" -" }\n" -" }\n" -" else if (this.lastKey==40) // Down\n" -" {\n" -" var newIndex = childIndex+1;\n" -" var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);\n" -" if (!elem) // last child, jump to parent next parent\n" -" {\n" -" elem = this.NavNext(itemIndex+1);\n" -" }\n" -" if (elem)\n" -" {\n" -" elem.focus();\n" -" } \n" -" }\n" -" else if (this.lastKey==27) // Escape\n" -" {\n" -" parent.searchBox.CloseResultsWindow();\n" -" parent.document.getElementById(\"MSearchField\").focus();\n" -" }\n" -" else if (this.lastKey==13) // Enter\n" -" {\n" -" return true;\n" -" }\n" -" return false;\n" -" }\n" -"}\n" -"\n" -"function setKeyActions(elem,action)\n" -"{\n" -" elem.setAttribute('onkeydown',action);\n" -" elem.setAttribute('onkeypress',action);\n" -" elem.setAttribute('onkeyup',action);\n" -"}\n" -"\n" -"function setClassAttr(elem,attr)\n" -"{\n" -" elem.setAttribute('class',attr);\n" -" elem.setAttribute('className',attr);\n" -"}\n" -"\n" -"function createResults()\n" -"{\n" -" var results = document.getElementById(\"SRResults\");\n" -" for (var e=0; e<searchData.length; e++)\n" -" {\n" -" var id = searchData[e][0];\n" -" var srResult = document.createElement('div');\n" -" srResult.setAttribute('id','SR_'+id);\n" -" setClassAttr(srResult,'SRResult');\n" -" var srEntry = document.createElement('div');\n" -" setClassAttr(srEntry,'SREntry');\n" -" var srLink = document.createElement('a');\n" -" srLink.setAttribute('id','Item'+e);\n" -" setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');\n" -" setClassAttr(srLink,'SRSymbol');\n" -" srLink.innerHTML = searchData[e][1][0];\n" -" srEntry.appendChild(srLink);\n" -" if (searchData[e][1].length==2) // single result\n" -" {\n" -" srLink.setAttribute('href',searchData[e][1][1][0]);\n" -" if (searchData[e][1][1][1])\n" -" {\n" -" srLink.setAttribute('target','_parent');\n" -" }\n" -" var srScope = document.createElement('span');\n" -" setClassAttr(srScope,'SRScope');\n" -" srScope.innerHTML = searchData[e][1][1][2];\n" -" srEntry.appendChild(srScope);\n" -" }\n" -" else // multiple results\n" -" {\n" -" srLink.setAttribute('href','javascript:searchResults.Toggle(\"SR_'+id+'\")');\n" -" var srChildren = document.createElement('div');\n" -" setClassAttr(srChildren,'SRChildren');\n" -" for (var c=0; c<searchData[e][1].length-1; c++)\n" -" {\n" -" var srChild = document.createElement('a');\n" -" srChild.setAttribute('id','Item'+e+'_c'+c);\n" -" setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');\n" -" setClassAttr(srChild,'SRScope');\n" -" srChild.setAttribute('href',searchData[e][1][c+1][0]);\n" -" if (searchData[e][1][c+1][1])\n" -" {\n" -" srChild.setAttribute('target','_parent');\n" -" }\n" -" srChild.innerHTML = searchData[e][1][c+1][2];\n" -" srChildren.appendChild(srChild);\n" -" }\n" -" srEntry.appendChild(srChildren);\n" -" }\n" -" srResult.appendChild(srEntry);\n" -" results.appendChild(srResult);\n" -" }\n" -"}\n" -"\n" diff --git a/src/search_opensearch_php.h b/src/search_opensearch_php.h deleted file mode 100644 index b1e9529..0000000 --- a/src/search_opensearch_php.h +++ /dev/null @@ -1,127 +0,0 @@ -"<script language=\"PHP\">\n" -"require \"search-functions.php\";\n" -"\n" -"$mode = array_key_exists('v', $_GET)?$_GET['v']:\"\";\n" -"$query = array_key_exists('query', $_GET)?$_GET['query']:\"\";\n" -"\n" -"$query_results = run_query($query);\n" -"\n" -"switch ($mode)\n" -"{\n" -" case \"opensearch.xml\":\n" -" opensearch_description();\n" -" break;\n" -" case \"json\":\n" -" opensearch_json_results($query, $query_results);\n" -" break;\n" -" case \"xml\":\n" -" opensearch_xml_results($query, $query_results);\n" -" break;\n" -" default:\n" -" invalid_format($query, $query_results);\n" -" break;\n" -"}\n" -"\n" -"function opensearch_description()\n" -"{\n" -" global $config;\n" -" global $translator;\n" -"\n" -" $shortname = $translator['search'].\" \".$config['PROJECT_NAME'];\n" -" $link = \"http://\".$_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME']);\n" -" header(\"Content-Type: application/xml\");\n" -" echo <<<END_OPENSEARCH\n" -"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" -"<OpenSearchDescription xmlns=\"http://a9.com/-/spec/opensearch/1.1/\">\n" -"<ShortName>$shortname</ShortName>\n" -"<Description>Doxygen Search</Description>\n" -"<InputEncoding>UTF-8</InputEncoding>\n" -"<!--\n" -"<Image height=\"16\" width=\"16\" type=\"image/x-icon\">\n" -"http://dev.squello.com/doc/html/favicon.ico</Image>\n" -"-->\n" -"<Url type=\"text/html\" method=\"GET\"\n" -"template=\"$link/search.php?query={searchTerms}\" />\n" -"<Url type=\"application/x-suggestions+json\" method=\"GET\"\n" -"template=\"$link/search-opensearch.php?v=json&query={searchTerms}\" />\n" -"<Url type=\"application/x-suggestions+xml\" method=\"GET\"\n" -"template=\"$link/search-opensearch.php?v=xml&query={searchTerms}\" />\n" -"</OpenSearchDescription>\n" -"END_OPENSEARCH;\n" -"}\n" -"\n" -"function opensearch_xml_results($query, array $results)\n" -"{\n" -" // Much as I hate copy'n'paste code re-use, this is for testing;\n" -" // I expect a richer version to come soon.\n" -" // Although I hate that IE does this richer than FF more...\n" -" $qs_results = array();\n" -" foreach ($results as $i => $val)\n" -" {\n" -" foreach ($val['words'] as $j => $word)\n" -" {\n" -" if (array_key_exists($word, $qs_results))\n" -" $qs_results[$word['match']]++;\n" -" else\n" -" $qs_results[$word['match']] = 1;\n" -" }\n" -" }\n" -" $result = <<<END_FRAG\n" -"<?xml version=\"1.0\"?>\n" -"<SearchSuggestion xmlns=\"http://schemas.microsoft.com/Search/2008/suggestions\">\n" -"<Query>$query</Query>\n" -"<Section>\n" -"END_FRAG;\n" -" foreach ($qs_results as $word => $count)\n" -" {\n" -" $result .= <<<END_FRAG\n" -"<Item>\n" -"<Text>$word</Text>\n" -"<Description>$count results</Description>\n" -"</Item>\n" -"END_FRAG;\n" -" }\n" -" $result .= <<<END_FRAG\n" -"</Section>\n" -"</SearchSuggestion>\n" -"END_FRAG;\n" -" echo $result;\n" -"}\n" -"\n" -"function opensearch_json_results($query, array $results)\n" -"{\n" -" $qs_results = array();\n" -" foreach ($results as $i => $val)\n" -" {\n" -" foreach ($val['words'] as $j => $word)\n" -" {\n" -" if (array_key_exists($word, $qs_results))\n" -" $qs_results[$word['match']]++;\n" -" else\n" -" $qs_results[$word['match']] = 1;\n" -" }\n" -" }\n" -" $result = '[\"'.$query.'\", [';\n" -" $json_words = \"\";\n" -" $json_descriptions = \"\";\n" -" $i = 0;\n" -" foreach ($qs_results as $word => $count)\n" -" {\n" -" if ($i != 0)\n" -" {\n" -" $json_words .= \", \";\n" -" $json_descriptions .= \", \";\n" -" }\n" -" $json_words .= '\"'.$word.'\"';\n" -" $json_descriptions .= '\"'.$count.' result'.($count==1?'':'s').'\"';\n" -" $i++;\n" -" }\n" -" print \"[\\\"$query\\\", [$json_words],[$json_descriptions]]\";\n" -"}\n" -"\n" -"function invalid_format($query, array $results)\n" -"{\n" -" print \"Search results for '$query':\\n\\n\";\n" -" print_r($results);\n" -"}\n" -"</script>\n" diff --git a/src/searchindex.cpp b/src/searchindex.cpp index 0380b33..f023e4d 100644 --- a/src/searchindex.cpp +++ b/src/searchindex.cpp @@ -584,11 +584,9 @@ void SearchIndexExternal::write(const char *fileName) #include "message.h" static const char search_script[]= -#include "search_js.h" +#include "search.js.h" ; -#define MEMBER_INDEX_ENTRIES 256 - #define SEARCH_INDEX_ALL 0 #define SEARCH_INDEX_CLASSES 1 #define SEARCH_INDEX_NAMESPACES 2 @@ -606,21 +604,31 @@ static const char search_script[]= #define SEARCH_INDEX_PAGES 14 #define NUM_SEARCH_INDICES 15 -class SearchIndexList : public SDict< QList<Definition> > +class SearchDefinitionList : public QList<Definition> +{ + public: + SearchDefinitionList(uint letter) : m_letter(letter) {} + uint letter() const { return m_letter; } + private: + uint m_letter; +}; + +class SearchIndexList : public SDict< SearchDefinitionList > { public: - SearchIndexList(int size=17) : SDict< QList<Definition> >(size,FALSE) + typedef Definition ElementType; + SearchIndexList(uint letter) : SDict<SearchDefinitionList>(17,FALSE), m_letter(letter) { setAutoDelete(TRUE); } ~SearchIndexList() {} void append(Definition *d) { - QList<Definition> *l = find(d->name()); + SearchDefinitionList *l = find(d->name()); if (l==0) { - l=new QList<Definition>; - SDict< QList<Definition> >::append(d->name(),l); + l=new SearchDefinitionList(m_letter); + SDict<SearchDefinitionList>::append(d->name(),l); } l->append(d); } @@ -632,10 +640,13 @@ class SearchIndexList : public SDict< QList<Definition> > QCString n2 = md2->first()->localName(); return qstricmp(n1.data(),n2.data()); } + uint letter() const { return m_letter; } + private: + uint m_letter; }; static void addMemberToSearchIndex( - SearchIndexList symbols[NUM_SEARCH_INDICES][MEMBER_INDEX_ENTRIES], + LetterToIndexMap<SearchIndexList> symbols[NUM_SEARCH_INDICES], int symbolCount[NUM_SEARCH_INDICES], MemberDef *md) { @@ -653,58 +664,57 @@ static void addMemberToSearchIndex( ) { QCString n = md->name(); - uchar charCode = (uchar)n.at(0); - uint letter = charCode<128 ? tolower(charCode) : charCode; if (!n.isEmpty()) { + uint letter = getUtf8CodeToLower(n,0); bool isFriendToHide = hideFriendCompounds && (QCString(md->typeString())=="friend class" || QCString(md->typeString())=="friend struct" || QCString(md->typeString())=="friend union"); if (!(md->isFriend() && isFriendToHide)) { - symbols[SEARCH_INDEX_ALL][letter].append(md); + symbols[SEARCH_INDEX_ALL].append(letter,md); symbolCount[SEARCH_INDEX_ALL]++; } if (md->isFunction() || md->isSlot() || md->isSignal()) { - symbols[SEARCH_INDEX_FUNCTIONS][letter].append(md); + symbols[SEARCH_INDEX_FUNCTIONS].append(letter,md); symbolCount[SEARCH_INDEX_FUNCTIONS]++; } else if (md->isVariable()) { - symbols[SEARCH_INDEX_VARIABLES][letter].append(md); + symbols[SEARCH_INDEX_VARIABLES].append(letter,md); symbolCount[SEARCH_INDEX_VARIABLES]++; } else if (md->isTypedef()) { - symbols[SEARCH_INDEX_TYPEDEFS][letter].append(md); + symbols[SEARCH_INDEX_TYPEDEFS].append(letter,md); symbolCount[SEARCH_INDEX_TYPEDEFS]++; } else if (md->isEnumerate()) { - symbols[SEARCH_INDEX_ENUMS][letter].append(md); + symbols[SEARCH_INDEX_ENUMS].append(letter,md); symbolCount[SEARCH_INDEX_ENUMS]++; } else if (md->isEnumValue()) { - symbols[SEARCH_INDEX_ENUMVALUES][letter].append(md); + symbols[SEARCH_INDEX_ENUMVALUES].append(letter,md); symbolCount[SEARCH_INDEX_ENUMVALUES]++; } else if (md->isProperty()) { - symbols[SEARCH_INDEX_PROPERTIES][letter].append(md); + symbols[SEARCH_INDEX_PROPERTIES].append(letter,md); symbolCount[SEARCH_INDEX_PROPERTIES]++; } else if (md->isEvent()) { - symbols[SEARCH_INDEX_EVENTS][letter].append(md); + symbols[SEARCH_INDEX_EVENTS].append(letter,md); symbolCount[SEARCH_INDEX_EVENTS]++; } else if (md->isRelated() || md->isForeign() || (md->isFriend() && !isFriendToHide)) { - symbols[SEARCH_INDEX_RELATED][letter].append(md); + symbols[SEARCH_INDEX_RELATED].append(letter,md); symbolCount[SEARCH_INDEX_RELATED]++; } } @@ -716,47 +726,48 @@ static void addMemberToSearchIndex( ) { QCString n = md->name(); - uchar charCode = (uchar)n.at(0); - uint letter = charCode<128 ? tolower(charCode) : charCode; if (!n.isEmpty()) { - symbols[SEARCH_INDEX_ALL][letter].append(md); + uint letter = getUtf8CodeToLower(n,0); + symbols[SEARCH_INDEX_ALL].append(letter,md); symbolCount[SEARCH_INDEX_ALL]++; if (md->isFunction()) { - symbols[SEARCH_INDEX_FUNCTIONS][letter].append(md); + symbols[SEARCH_INDEX_FUNCTIONS].append(letter,md); symbolCount[SEARCH_INDEX_FUNCTIONS]++; } else if (md->isVariable()) { - symbols[SEARCH_INDEX_VARIABLES][letter].append(md); + symbols[SEARCH_INDEX_VARIABLES].append(letter,md); symbolCount[SEARCH_INDEX_VARIABLES]++; } else if (md->isTypedef()) { - symbols[SEARCH_INDEX_TYPEDEFS][letter].append(md); + symbols[SEARCH_INDEX_TYPEDEFS].append(letter,md); symbolCount[SEARCH_INDEX_TYPEDEFS]++; } else if (md->isEnumerate()) { - symbols[SEARCH_INDEX_ENUMS][letter].append(md); + symbols[SEARCH_INDEX_ENUMS].append(letter,md); symbolCount[SEARCH_INDEX_ENUMS]++; } else if (md->isEnumValue()) { - symbols[SEARCH_INDEX_ENUMVALUES][letter].append(md); + symbols[SEARCH_INDEX_ENUMVALUES].append(letter,md); symbolCount[SEARCH_INDEX_ENUMVALUES]++; } else if (md->isDefine()) { - symbols[SEARCH_INDEX_DEFINES][letter].append(md); + symbols[SEARCH_INDEX_DEFINES].append(letter,md); symbolCount[SEARCH_INDEX_DEFINES]++; } } } } +// see also function convertToId() in search.js, which should match in +// behaviour static QCString searchId(const QCString &s) { int c; @@ -765,11 +776,15 @@ static QCString searchId(const QCString &s) for (i=0;i<s.length();i++) { c=s.at(i); - if ((c>='0' && c<='9') || (c>='A' && c<='Z') || (c>='a' && c<='z')) + if (c>0x7f || c<0) // part of multibyte character + { + result+=(char)c; + } + else if (isalnum(c)) // simply alpha numerical character { result+=(char)tolower(c); } - else + else // other 'unprintable' characters { char val[4]; sprintf(val,"_%02x",(uchar)c); @@ -780,7 +795,7 @@ static QCString searchId(const QCString &s) } static int g_searchIndexCount[NUM_SEARCH_INDICES]; -static SearchIndexList g_searchIndexSymbols[NUM_SEARCH_INDICES][MEMBER_INDEX_ENTRIES]; +static LetterToIndexMap<SearchIndexList> g_searchIndexSymbols[NUM_SEARCH_INDICES]; static const char *g_searchIndexName[NUM_SEARCH_INDICES] = { "all", @@ -834,12 +849,11 @@ void writeJavascriptSearchIndex() ClassDef *cd; for (;(cd=cli.current());++cli) { - uchar charCode = (uchar)cd->localName().at(0); - uint letter = charCode<128 ? tolower(charCode) : charCode; + uint letter = getUtf8CodeToLower(cd->localName(),0); if (cd->isLinkable() && isId(letter)) { - g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(cd); - g_searchIndexSymbols[SEARCH_INDEX_CLASSES][letter].append(cd); + g_searchIndexSymbols[SEARCH_INDEX_ALL].append(letter,cd); + g_searchIndexSymbols[SEARCH_INDEX_CLASSES].append(letter,cd); g_searchIndexCount[SEARCH_INDEX_ALL]++; g_searchIndexCount[SEARCH_INDEX_CLASSES]++; } @@ -850,12 +864,11 @@ void writeJavascriptSearchIndex() NamespaceDef *nd; for (;(nd=nli.current());++nli) { - uchar charCode = (uchar)nd->name().at(0); - uint letter = charCode<128 ? tolower(charCode) : charCode; + uint letter = getUtf8CodeToLower(nd->name(),0); if (nd->isLinkable() && isId(letter)) { - g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(nd); - g_searchIndexSymbols[SEARCH_INDEX_NAMESPACES][letter].append(nd); + g_searchIndexSymbols[SEARCH_INDEX_ALL].append(letter,nd); + g_searchIndexSymbols[SEARCH_INDEX_NAMESPACES].append(letter,nd); g_searchIndexCount[SEARCH_INDEX_ALL]++; g_searchIndexCount[SEARCH_INDEX_NAMESPACES]++; } @@ -870,12 +883,11 @@ void writeJavascriptSearchIndex() FileDef *fd; for (;(fd=fni.current());++fni) { - uchar charCode = (uchar)fd->name().at(0); - uint letter = charCode<128 ? tolower(charCode) : charCode; + uint letter = getUtf8CodeToLower(fd->name(),0); if (fd->isLinkable() && isId(letter)) { - g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(fd); - g_searchIndexSymbols[SEARCH_INDEX_FILES][letter].append(fd); + g_searchIndexSymbols[SEARCH_INDEX_ALL].append(letter,fd); + g_searchIndexSymbols[SEARCH_INDEX_FILES].append(letter,fd); g_searchIndexCount[SEARCH_INDEX_ALL]++; g_searchIndexCount[SEARCH_INDEX_FILES]++; } @@ -930,8 +942,8 @@ void writeJavascriptSearchIndex() uint letter = charCode<128 ? tolower(charCode) : charCode; if (isId(letter)) { - g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(gd); - g_searchIndexSymbols[SEARCH_INDEX_GROUPS][letter].append(gd); + g_searchIndexSymbols[SEARCH_INDEX_ALL].append(letter,gd); + g_searchIndexSymbols[SEARCH_INDEX_GROUPS].append(letter,gd); g_searchIndexCount[SEARCH_INDEX_ALL]++; g_searchIndexCount[SEARCH_INDEX_GROUPS]++; } @@ -953,8 +965,8 @@ void writeJavascriptSearchIndex() uint letter = charCode<128 ? tolower(charCode) : charCode; if (isId(letter)) { - g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(pd); - g_searchIndexSymbols[SEARCH_INDEX_PAGES][letter].append(pd); + g_searchIndexSymbols[SEARCH_INDEX_ALL].append(letter,pd); + g_searchIndexSymbols[SEARCH_INDEX_PAGES].append(letter,pd); g_searchIndexCount[SEARCH_INDEX_ALL]++; g_searchIndexCount[SEARCH_INDEX_PAGES]++; } @@ -970,8 +982,8 @@ void writeJavascriptSearchIndex() uint letter = charCode<128 ? tolower(charCode) : charCode; if (isId(letter)) { - g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(Doxygen::mainPage); - g_searchIndexSymbols[SEARCH_INDEX_PAGES][letter].append(Doxygen::mainPage); + g_searchIndexSymbols[SEARCH_INDEX_ALL].append(letter,Doxygen::mainPage); + g_searchIndexSymbols[SEARCH_INDEX_PAGES].append(letter,Doxygen::mainPage); g_searchIndexCount[SEARCH_INDEX_ALL]++; g_searchIndexCount[SEARCH_INDEX_PAGES]++; } @@ -979,122 +991,181 @@ void writeJavascriptSearchIndex() } // sort all lists - int i,p; + int i; for (i=0;i<NUM_SEARCH_INDICES;i++) { - for (p=0;p<MEMBER_INDEX_ENTRIES;p++) + SIntDict<SearchIndexList>::Iterator it(g_searchIndexSymbols[i]); + SearchIndexList *sl; + for (it.toFirst();(sl=it.current());++it) { - if (g_searchIndexSymbols[i][p].count()>0) - { - g_searchIndexSymbols[i][p].sort(); - } + sl->sort(); } } // write index files QCString searchDirName = Config_getString("HTML_OUTPUT")+"/search"; - for (i=0;i<NUM_SEARCH_INDICES;i++) + for (i=0;i<NUM_SEARCH_INDICES;i++) // for each index { - for (p=0;p<MEMBER_INDEX_ENTRIES;p++) + SIntDict<SearchIndexList>::Iterator it(g_searchIndexSymbols[i]); + SearchIndexList *sl; + int p=0; + for (it.toFirst();(sl=it.current());++it,++p) // for each letter { - if (g_searchIndexSymbols[i][p].count()>0) - { - QCString baseName; - baseName.sprintf("%s_%02x",g_searchIndexName[i],p); + QCString baseName; + baseName.sprintf("%s_%x",g_searchIndexName[i],p); - QCString fileName = searchDirName + "/"+baseName+".html"; - QCString dataFileName = searchDirName + "/"+baseName+".js"; + QCString fileName = searchDirName + "/"+baseName+".html"; + QCString dataFileName = searchDirName + "/"+baseName+".js"; - QFile outFile(fileName); - QFile dataOutFile(dataFileName); - if (outFile.open(IO_WriteOnly) && dataOutFile.open(IO_WriteOnly)) + QFile outFile(fileName); + QFile dataOutFile(dataFileName); + if (outFile.open(IO_WriteOnly) && dataOutFile.open(IO_WriteOnly)) + { + { + FTextStream t(&outFile); + + t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"" + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl; + t << "<html><head><title></title>" << endl; + t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>" << endl; + t << "<meta name=\"generator\" content=\"Doxygen " << versionString << "\">" << endl; + t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>" << endl; + t << "<script type=\"text/javascript\" src=\"" << baseName << ".js\"></script>" << endl; + t << "<script type=\"text/javascript\" src=\"search.js\"></script>" << endl; + t << "</head>" << endl; + t << "<body class=\"SRPage\">" << endl; + t << "<div id=\"SRIndex\">" << endl; + t << "<div class=\"SRStatus\" id=\"Loading\">" << theTranslator->trLoading() << "</div>" << endl; + t << "<div id=\"SRResults\"></div>" << endl; // here the results will be inserted + t << "<script type=\"text/javascript\"><!--" << endl; + t << "createResults();" << endl; // this function will insert the results + t << "--></script>" << endl; + t << "<div class=\"SRStatus\" id=\"Searching\">" + << theTranslator->trSearching() << "</div>" << endl; + t << "<div class=\"SRStatus\" id=\"NoMatches\">" + << theTranslator->trNoMatches() << "</div>" << endl; + + t << "<script type=\"text/javascript\"><!--" << endl; + t << "document.getElementById(\"Loading\").style.display=\"none\";" << endl; + t << "document.getElementById(\"NoMatches\").style.display=\"none\";" << endl; + t << "var searchResults = new SearchResults(\"searchResults\");" << endl; + t << "searchResults.Search();" << endl; + t << "--></script>" << endl; + t << "</div>" << endl; // SRIndex + t << "</body>" << endl; + t << "</html>" << endl; + } + FTextStream ti(&dataOutFile); + + ti << "var searchData=" << endl; + // format + // searchData[] = array of items + // searchData[x][0] = id + // searchData[x][1] = [ name + child1 + child2 + .. ] + // searchData[x][1][0] = name as shown + // searchData[x][1][y+1] = info for child y + // searchData[x][1][y+1][0] = url + // searchData[x][1][y+1][1] = 1 => target="_parent" + // searchData[x][1][y+1][2] = scope + + ti << "[" << endl; + bool firstEntry=TRUE; + + SDict<SearchDefinitionList>::Iterator li(*sl); + SearchDefinitionList *dl; + int itemCount=0; + for (li.toFirst();(dl=li.current());++li) { + Definition *d = dl->first(); + QCString id = d->localName(); + + if (!firstEntry) + { + ti << "," << endl; + } + firstEntry=FALSE; + + QCString dispName = d->localName(); + if (d->definitionType()==Definition::TypeGroup) { - FTextStream t(&outFile); - - t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"" - " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl; - t << "<html><head><title></title>" << endl; - t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>" << endl; - t << "<meta name=\"generator\" content=\"Doxygen " << versionString << "\">" << endl; - t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>" << endl; - t << "<script type=\"text/javascript\" src=\"" << baseName << ".js\"></script>" << endl; - t << "<script type=\"text/javascript\" src=\"search.js\"></script>" << endl; - t << "</head>" << endl; - t << "<body class=\"SRPage\">" << endl; - t << "<div id=\"SRIndex\">" << endl; - t << "<div class=\"SRStatus\" id=\"Loading\">" << theTranslator->trLoading() << "</div>" << endl; - t << "<div id=\"SRResults\"></div>" << endl; // here the results will be inserted - t << "<script type=\"text/javascript\"><!--" << endl; - t << "createResults();" << endl; // this function will insert the results - t << "--></script>" << endl; - t << "<div class=\"SRStatus\" id=\"Searching\">" - << theTranslator->trSearching() << "</div>" << endl; - t << "<div class=\"SRStatus\" id=\"NoMatches\">" - << theTranslator->trNoMatches() << "</div>" << endl; - - t << "<script type=\"text/javascript\"><!--" << endl; - t << "document.getElementById(\"Loading\").style.display=\"none\";" << endl; - t << "document.getElementById(\"NoMatches\").style.display=\"none\";" << endl; - t << "var searchResults = new SearchResults(\"searchResults\");" << endl; - t << "searchResults.Search();" << endl; - t << "--></script>" << endl; - t << "</div>" << endl; // SRIndex - t << "</body>" << endl; - t << "</html>" << endl; + dispName = ((GroupDef*)d)->groupTitle(); } - FTextStream ti(&dataOutFile); - - ti << "var searchData=" << endl; - // format - // searchData[] = array of items - // searchData[x][0] = id - // searchData[x][1] = [ name + child1 + child2 + .. ] - // searchData[x][1][0] = name as shown - // searchData[x][1][y+1] = info for child y - // searchData[x][1][y+1][0] = url - // searchData[x][1][y+1][1] = 1 => target="_parent" - // searchData[x][1][y+1][2] = scope - - ti << "[" << endl; - bool firstEntry=TRUE; - - SDict<QList<Definition> >::Iterator li(g_searchIndexSymbols[i][p]); - QList<Definition> *dl; - int itemCount=0; - for (li.toFirst();(dl=li.current());++li) + else if (d->definitionType()==Definition::TypePage) { - Definition *d = dl->first(); - QCString id = d->localName(); + dispName = ((PageDef*)d)->title(); + } + ti << " ['" << searchId(dispName) << "',['" + << convertToXML(dispName) << "',["; - if (!firstEntry) + if (dl->count()==1) // item with a unique name + { + MemberDef *md = 0; + bool isMemberDef = d->definitionType()==Definition::TypeMember; + if (isMemberDef) md = (MemberDef*)d; + QCString anchor = d->anchor(); + + ti << "'" << externalRef("../",d->getReference(),TRUE) + << d->getOutputFileBase() << Doxygen::htmlFileExtension; + if (!anchor.isEmpty()) { - ti << "," << endl; + ti << "#" << anchor; } - firstEntry=FALSE; + ti << "',"; - QCString dispName = d->localName(); - if (d->definitionType()==Definition::TypeGroup) + static bool extLinksInWindow = Config_getBool("EXT_LINKS_IN_WINDOW"); + if (!extLinksInWindow || d->getReference().isEmpty()) { - dispName = ((GroupDef*)d)->groupTitle(); + ti << "1,"; } - else if (d->definitionType()==Definition::TypePage) + else { - dispName = ((PageDef*)d)->title(); + ti << "0,"; } - ti << " ['" << searchId(dispName) << "',['" - << convertToXML(dispName) << "',["; - if (dl->count()==1) // item with a unique name + if (d->getOuterScope()!=Doxygen::globalScope) + { + ti << "'" << convertToXML(d->getOuterScope()->name()) << "'"; + } + else if (md) + { + FileDef *fd = md->getBodyDef(); + if (fd==0) fd = md->getFileDef(); + if (fd) + { + ti << "'" << convertToXML(fd->localName()) << "'"; + } + } + else + { + ti << "''"; + } + ti << "]]"; + } + else // multiple items with the same name + { + QListIterator<Definition> di(*dl); + bool overloadedFunction = FALSE; + Definition *prevScope = 0; + int childCount=0; + for (di.toFirst();(d=di.current());) { - MemberDef *md = 0; + ++di; + Definition *scope = d->getOuterScope(); + Definition *next = di.current(); + Definition *nextScope = 0; + MemberDef *md = 0; bool isMemberDef = d->definitionType()==Definition::TypeMember; if (isMemberDef) md = (MemberDef*)d; + if (next) nextScope = next->getOuterScope(); QCString anchor = d->anchor(); + if (childCount>0) + { + ti << "],["; + } ti << "'" << externalRef("../",d->getReference(),TRUE) - << d->getOutputFileBase() << Doxygen::htmlFileExtension; + << d->getOutputFileBase() << Doxygen::htmlFileExtension; if (!anchor.isEmpty()) { ti << "#" << anchor; @@ -1110,147 +1181,87 @@ void writeJavascriptSearchIndex() { ti << "0,"; } - - if (d->getOuterScope()!=Doxygen::globalScope) + bool found=FALSE; + overloadedFunction = ((prevScope!=0 && scope==prevScope) || + (scope && scope==nextScope) + ) && md && + (md->isFunction() || md->isSlot()); + QCString prefix; + if (md) prefix=convertToXML(md->localName()); + if (overloadedFunction) // overloaded member function { - ti << "'" << convertToXML(d->getOuterScope()->name()) << "'"; + prefix+=convertToXML(md->argsString()); + // show argument list to disambiguate overloaded functions } - else if (md) + else if (md) // unique member function { - FileDef *fd = md->getBodyDef(); - if (fd==0) fd = md->getFileDef(); - if (fd) - { - ti << "'" << convertToXML(fd->localName()) << "'"; - } + prefix+="()"; // only to show it is a function } - else + QCString name; + if (d->definitionType()==Definition::TypeClass) { - ti << "''"; + name = convertToXML(((ClassDef*)d)->displayName()); + found = TRUE; } - ti << "]]"; - } - else // multiple items with the same name - { - QListIterator<Definition> di(*dl); - bool overloadedFunction = FALSE; - Definition *prevScope = 0; - int childCount=0; - for (di.toFirst();(d=di.current());) + else if (d->definitionType()==Definition::TypeNamespace) { - ++di; - Definition *scope = d->getOuterScope(); - Definition *next = di.current(); - Definition *nextScope = 0; - MemberDef *md = 0; - bool isMemberDef = d->definitionType()==Definition::TypeMember; - if (isMemberDef) md = (MemberDef*)d; - if (next) nextScope = next->getOuterScope(); - QCString anchor = d->anchor(); - - if (childCount>0) - { - ti << "],["; - } - ti << "'" << externalRef("../",d->getReference(),TRUE) - << d->getOutputFileBase() << Doxygen::htmlFileExtension; - if (!anchor.isEmpty()) - { - ti << "#" << anchor; - } - ti << "',"; - - static bool extLinksInWindow = Config_getBool("EXT_LINKS_IN_WINDOW"); - if (!extLinksInWindow || d->getReference().isEmpty()) - { - ti << "1,"; - } - else - { - ti << "0,"; - } - bool found=FALSE; - overloadedFunction = ((prevScope!=0 && scope==prevScope) || - (scope && scope==nextScope) - ) && md && - (md->isFunction() || md->isSlot()); - QCString prefix; - if (md) prefix=convertToXML(md->localName()); - if (overloadedFunction) // overloaded member function - { - prefix+=convertToXML(md->argsString()); - // show argument list to disambiguate overloaded functions - } - else if (md) // unique member function - { - prefix+="()"; // only to show it is a function - } - QCString name; - if (d->definitionType()==Definition::TypeClass) - { - name = convertToXML(((ClassDef*)d)->displayName()); - found = TRUE; - } - else if (d->definitionType()==Definition::TypeNamespace) - { - name = convertToXML(((NamespaceDef*)d)->displayName()); - found = TRUE; - } - else if (scope==0 || scope==Doxygen::globalScope) // in global scope + name = convertToXML(((NamespaceDef*)d)->displayName()); + found = TRUE; + } + else if (scope==0 || scope==Doxygen::globalScope) // in global scope + { + if (md) { - if (md) + FileDef *fd = md->getBodyDef(); + if (fd==0) fd = md->getFileDef(); + if (fd) { - FileDef *fd = md->getBodyDef(); - if (fd==0) fd = md->getFileDef(); - if (fd) - { - if (!prefix.isEmpty()) prefix+=": "; - name = prefix + convertToXML(fd->localName()); - found = TRUE; - } + if (!prefix.isEmpty()) prefix+=": "; + name = prefix + convertToXML(fd->localName()); + found = TRUE; } } - else if (md && (md->getClassDef() || md->getNamespaceDef())) - // member in class or namespace scope - { - SrcLangExt lang = md->getLanguage(); - name = convertToXML(d->getOuterScope()->qualifiedName()) - + getLanguageSpecificSeparator(lang) + prefix; - found = TRUE; - } - else if (scope) // some thing else? -> show scope - { - name = prefix + convertToXML(scope->name()); - found = TRUE; - } - if (!found) // fallback - { - name = prefix + "("+theTranslator->trGlobalNamespace()+")"; - } - - ti << "'" << name << "'"; - - prevScope = scope; - childCount++; + } + else if (md && (md->getClassDef() || md->getNamespaceDef())) + // member in class or namespace scope + { + SrcLangExt lang = md->getLanguage(); + name = convertToXML(d->getOuterScope()->qualifiedName()) + + getLanguageSpecificSeparator(lang) + prefix; + found = TRUE; + } + else if (scope) // some thing else? -> show scope + { + name = prefix + convertToXML(scope->name()); + found = TRUE; + } + if (!found) // fallback + { + name = prefix + "("+theTranslator->trGlobalNamespace()+")"; } - ti << "]]"; - } - ti << "]"; - itemCount++; - } - if (!firstEntry) - { - ti << endl; - } + ti << "'" << name << "'"; - ti << "];" << endl; + prevScope = scope; + childCount++; + } + ti << "]]"; + } + ti << "]"; + itemCount++; } - else + if (!firstEntry) { - err("Failed to open file '%s' for writing...\n",fileName.data()); + ti << endl; } + + ti << "];" << endl; + + } + else + { + err("Failed to open file '%s' for writing...\n",fileName.data()); } } } @@ -1275,9 +1286,12 @@ void writeJavascriptSearchIndex() { if (!first) t << "," << endl; t << " " << j << ": \""; - for (p=0;p<MEMBER_INDEX_ENTRIES;p++) + + SIntDict<SearchIndexList>::Iterator it(g_searchIndexSymbols[i]); + SearchIndexList *sl; + for (it.toFirst();(sl=it.current());++it) // for each letter { - t << (g_searchIndexSymbols[i][p].count()>0 ? "1" : "0"); + t << QString( QChar( sl->letter() ) ).utf8(); } t << "\""; first=FALSE; diff --git a/src/settings.py b/src/settings.py new file mode 100755 index 0000000..af24e7b --- /dev/null +++ b/src/settings.py @@ -0,0 +1,28 @@ +# + +import sys + +f_sqlite3 = sys.argv[1] +f_libclang = sys.argv[2] + +f1 = open('../src/settings.h','w') +f1.write("#ifndef SETTINGS_H\n") +f1.write("#define SETTINGS_H\n") +f1.write("\n") +if (f_sqlite3 != "NO"): + f1.write("#define USE_SQLITE3 1\n") +else: + f1.write("#define USE_SQLITE3 0\n") + +if (f_libclang != "NO"): + f1.write("#define USE_LIBCLANG 1\n") +else: + f1.write("#define USE_LIBCLANG 0\n") + +f1.write("\n") +f1.write("#define IS_SUPPORTED(x) \\\n") +f1.write(" ((USE_SQLITE3 && strcmp(\"USE_SQLITE3\",(x))==0) || \\\n") +f1.write(" (USE_LIBCLANG && strcmp(\"USE_LIBCLANG\",(x))==0) || \\\n") +f1.write(" 0)\n") +f1.write("\n") +f1.write("#endif\n") diff --git a/src/sortdict.h b/src/sortdict.h index 14a221b..e111075 100644 --- a/src/sortdict.h +++ b/src/sortdict.h @@ -108,7 +108,7 @@ class SDict * \param caseSensitive indicated whether the keys should be sorted * in a case sensitive way. */ - SDict(int size,bool caseSensitive=TRUE) : m_sizeIndex(0) + SDict(int size=17,bool caseSensitive=TRUE) : m_sizeIndex(0) { m_list = new SList<T>(this); #if AUTORESIZE @@ -454,7 +454,7 @@ class SIntDict * \param size The size of the dictionary. Should be a prime number for * best distribution of elements. */ - SIntDict(int size) : m_sizeIndex(0) + SIntDict(int size=17) : m_sizeIndex(0) { m_list = new SIntList<T>(this); #if AUTORESIZE @@ -636,7 +636,7 @@ class SIntDict { return m_li->current(); } - + /*! Moves the iterator to the next element. * \return the new "current" element, or zero if the iterator was * already pointing at the last element. @@ -659,6 +659,76 @@ class SIntDict QListIterator<T> *m_li; }; + class IteratorDict; // first forward declare + friend class IteratorDict; // then make it a friend + /*! Simple iterator for SDict. It iterates over the dictionary elements + * in an unsorted way, but does provide information about the element's key. + */ + class IteratorDict + { + public: + /*! Create an iterator given the dictionary. */ + IteratorDict(const SIntDict<T> &dict) + { + m_di = new QIntDictIterator<T>(*dict.m_dict); + } + + /*! Destroys the dictionary */ + virtual ~IteratorDict() + { + delete m_di; + } + + /*! Set the iterator to the first element in the list. + * \return The first compound, or zero if the list was empty. + */ + T *toFirst() const + { + return m_di->toFirst(); + } + + /*! Set the iterator to the last element in the list. + * \return The first compound, or zero if the list was empty. + */ + T *toLast() const + { + return m_di->toLast(); + } + + /*! Returns the current compound */ + T *current() const + { + return m_di->current(); + } + + /*! Returns the current key */ + int currentKey() const + { + return m_di->currentKey(); + } + + /*! Moves the iterator to the next element. + * \return the new "current" element, or zero if the iterator was + * already pointing at the last element. + */ + T *operator++() + { + return m_di->operator++(); + } + + /*! Moves the iterator to the previous element. + * \return the new "current" element, or zero if the iterator was + * already pointing at the first element. + */ + T *operator--() + { + return m_di->operator--(); + } + + private: + QDictIterator<T> *m_di; + }; + }; #endif diff --git a/src/svgpan_js.h b/src/svgpan_js.h deleted file mode 100644 index ac996da..0000000 --- a/src/svgpan_js.h +++ /dev/null @@ -1,319 +0,0 @@ -"/**\n" -" * The code below is based on SVGPan Library 1.2 and was modified for doxygen\n" -" * to support both zooming and panning via the mouse and via embedded bottons.\n" -" *\n" -" * This code is licensed under the following BSD license:\n" -" *\n" -" * Copyright 2009-2010 Andrea Leofreddi <a.leofreddi@itcharm.com>. All rights reserved.\n" -" * \n" -" * Redistribution and use in source and binary forms, with or without modification, are\n" -" * permitted provided that the following conditions are met:\n" -" * \n" -" * 1. Redistributions of source code must retain the above copyright notice, this list of\n" -" * conditions and the following disclaimer.\n" -" * \n" -" * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n" -" * of conditions and the following disclaimer in the documentation and/or other materials\n" -" * provided with the distribution.\n" -" * \n" -" * THIS SOFTWARE IS PROVIDED BY Andrea Leofreddi ``AS IS'' AND ANY EXPRESS OR IMPLIED\n" -" * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n" -" * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Andrea Leofreddi OR\n" -" * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n" -" * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n" -" * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n" -" * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n" -" * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n" -" * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" -" * \n" -" * The views and conclusions contained in the software and documentation are those of the\n" -" * authors and should not be interpreted as representing official policies, either expressed\n" -" * or implied, of Andrea Leofreddi.\n" -" */\n" -"\n" -"var root = document.documentElement;\n" -"var state = 'none';\n" -"var stateOrigin;\n" -"var stateTf = root.createSVGMatrix();\n" -"var cursorGrab = ' url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAlQTFRFAAAA////////c3ilYwAAAAN0Uk5T//8A18oNQQAAAD1JREFUeNp0zlEKACAIA9Bt9z90bZBZkQj29qFBEuBOzQHSnWTTyckEfqUuZgFvslH4ch3qLCO/Kr8cAgwATw4Ax6XRCcoAAAAASUVORK5CYII=\"), move';\n" -"var zoomSteps = 10;\n" -"var zoomInFactor;\n" -"var zoomOutFactor;\n" -"var windowWidth;\n" -"var windowHeight;\n" -"var svgDoc;\n" -"var minZoom;\n" -"var maxZoom;\n" -"if (!window) window=this;\n" -"\n" -"/**\n" -" * Show the graph in the middle of the view, scaled to fit \n" -" */\n" -"function show()\n" -"{\n" -" if (window.innerHeight) // Firefox\n" -" {\n" -" windowWidth = window.innerWidth;\n" -" windowHeight = window.innerHeight;\n" -" }\n" -" else if (document.documentElement.clientWidth) // Chrome/Safari\n" -" {\n" -" windowWidth = document.documentElement.clientWidth\n" -" windowHeight = document.documentElement.clientHeight\n" -" }\n" -" if (!windowWidth || !windowHeight) // failsafe\n" -" {\n" -" windowWidth = 800;\n" -" windowHeight = 600;\n" -" }\n" -" minZoom = Math.min(Math.min(viewHeight,windowHeight)/viewHeight,Math.min(viewWidth,windowWidth)/viewWidth);\n" -" maxZoom = minZoom+1.5;\n" -" zoomInFactor = Math.pow(maxZoom/minZoom,1.0/zoomSteps);\n" -" zoomOutFactor = 1.0/zoomInFactor;\n" -"\n" -" var g = svgDoc.getElementById('viewport');\n" -" try\n" -" {\n" -" var bb = g.getBBox(); // this can throw an exception if css { display: none }\n" -" var tx = (windowWidth-viewWidth*minZoom+8)/(2*minZoom);\n" -" var ty = viewHeight+(windowHeight-viewHeight*minZoom)/(2*minZoom);\n" -" var a = 'scale('+minZoom+') rotate(0) translate('+tx+' '+ty+')';\n" -" g.setAttribute('transform',a);\n" -" }\n" -" catch(e) {}\n" -"}\n" -"\n" -"/**\n" -" * Register handlers\n" -" */\n" -"function init(evt) \n" -"{\n" -" svgDoc = evt.target.ownerDocument;\n" -" if (top.window && top.window.registerShow) // register show function in html doc for dynamic sections\n" -" {\n" -" top.window.registerShow(sectionId,show);\n" -" }\n" -" show();\n" -"\n" -" setAttributes(root, {\n" -" \"onmousedown\" : \"handleMouseDown(evt)\",\n" -" \"onmousemove\" : \"handleMouseMove(evt)\",\n" -" \"onmouseup\" : \"handleMouseUp(evt)\"\n" -" });\n" -"\n" -" if (window.addEventListener)\n" -" {\n" -" if (navigator.userAgent.toLowerCase().indexOf('webkit') >= 0 || \n" -" navigator.userAgent.toLowerCase().indexOf(\"opera\") >= 0 || \n" -" navigator.appVersion.indexOf(\"MSIE\") != -1)\n" -" {\n" -" window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari/IE9\n" -" }\n" -" else\n" -" {\n" -" window.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others\n" -" }\n" -" }\n" -"}\n" -"\n" -"window.onresize=function()\n" -"{\n" -" if (svgDoc) { show(); }\n" -"}\n" -"\n" -"/**\n" -" * Instance an SVGPoint object with given event coordinates.\n" -" */\n" -"function getEventPoint(evt) \n" -"{\n" -" var p = root.createSVGPoint();\n" -" p.x = evt.clientX;\n" -" p.y = evt.clientY;\n" -" return p;\n" -"}\n" -"\n" -"/**\n" -" * Sets the current transform matrix of an element.\n" -" */\n" -"function setCTM(element, matrix) \n" -"{\n" -" var s = \"matrix(\" + matrix.a + \",\" + matrix.b + \",\" + matrix.c + \",\" + matrix.d + \",\" + matrix.e + \",\" + matrix.f + \")\";\n" -" element.setAttribute(\"transform\", s);\n" -"}\n" -"\n" -"/**\n" -" * Sets attributes of an element.\n" -" */\n" -"function setAttributes(element, attributes)\n" -"{\n" -" for (i in attributes)\n" -" element.setAttributeNS(null, i, attributes[i]);\n" -"}\n" -"\n" -"function doZoom(g,point,zoomFactor)\n" -"{\n" -" var p = point.matrixTransform(g.getCTM().inverse());\n" -" var k = root.createSVGMatrix().translate(p.x, p.y).scale(zoomFactor).translate(-p.x, -p.y);\n" -" var n = g.getCTM().multiply(k);\n" -" var s = Math.max(n.a,n.d);\n" -" if (s>maxZoom) n=n.translate(p.x,p.y).scale(maxZoom/s).translate(-p.x,-p.y);\n" -" else if (s<minZoom) n=n.translate(p.x,p.y).scale(minZoom/s).translate(-p.x,-p.y);\n" -" setCTM(g, n);\n" -" stateTf = stateTf.multiply(n.inverse());\n" -"}\n" -"\n" -"/**\n" -" * Handle mouse move event.\n" -" */\n" -"function handleMouseWheel(evt) \n" -"{\n" -" if (!evt) evt = window.evt;\n" -" if (!evt.shiftKey) return; // only zoom when shift is pressed\n" -" if (evt.preventDefault) evt.preventDefault();\n" -" evt.returnValue = false;\n" -"\n" -" if (state!='pan')\n" -" {\n" -" var delta;\n" -" if (evt.wheelDelta)\n" -" {\n" -" delta = evt.wheelDelta / 7200; // Opera/Chrome/IE9/Safari\n" -" }\n" -" else\n" -" {\n" -" delta = evt.detail / -180; // Mozilla\n" -" }\n" -" var svgDoc = evt.target.ownerDocument;\n" -" var g = svgDoc.getElementById(\"viewport\");\n" -" var p = getEventPoint(evt);\n" -" doZoom(g,p,1+delta);\n" -" }\n" -"}\n" -"\n" -"/**\n" -" * Handle mouse move event.\n" -" */\n" -"function handleMouseMove(evt) \n" -"{\n" -" if(evt.preventDefault)\n" -" evt.preventDefault();\n" -"\n" -" evt.returnValue = false;\n" -"\n" -" var g = svgDoc.getElementById(\"viewport\");\n" -"\n" -" if (state == 'pan') \n" -" {\n" -" // Pan mode\n" -" var p = getEventPoint(evt).matrixTransform(stateTf);\n" -" setCTM(g,stateTf.inverse().translate(p.x - stateOrigin.x, p.y - stateOrigin.y));\n" -" } \n" -"}\n" -"\n" -"/**\n" -" * Handle click event.\n" -" */\n" -"function handleMouseDown(evt) \n" -"{\n" -" if(evt.preventDefault)\n" -" evt.preventDefault();\n" -" evt.returnValue = false;\n" -" var g = svgDoc.getElementById(\"viewport\");\n" -" state = 'pan';\n" -" stateTf = g.getCTM().inverse();\n" -" stateOrigin = getEventPoint(evt).matrixTransform(stateTf);\n" -" g.style.cursor = cursorGrab;\n" -"}\n" -"\n" -"/**\n" -" * Handle mouse button release event.\n" -" */\n" -"function handleMouseUp(evt) \n" -"{\n" -" if (evt.preventDefault) evt.preventDefault();\n" -" evt.returnValue = false;\n" -" var g = svgDoc.getElementById(\"viewport\");\n" -" g.style.cursor = \"default\";\n" -" // Quit pan mode\n" -" state = '';\n" -"}\n" -"\n" -"/**\n" -" * Dumps a matrix to a string (useful for debug).\n" -" */\n" -"function dumpMatrix(matrix) \n" -"{\n" -" var s = \"[ \" + matrix.a + \", \" + matrix.c + \", \" + matrix.e + \"\\n \" + matrix.b + \", \" + matrix.d + \", \" + matrix.f + \"\\n 0, 0, 1 ]\";\n" -" return s;\n" -"}\n" -"\n" -"/**\n" -" * Handler for pan buttons\n" -" */\n" -"function handlePan(x,y)\n" -"{\n" -" var g = svgDoc.getElementById(\"viewport\");\n" -" setCTM(g,g.getCTM().translate(x*20/minZoom,y*20/minZoom));\n" -"}\n" -"\n" -"/**\n" -" * Handle reset button\n" -" */\n" -"function handleReset()\n" -"{\n" -" show();\n" -"}\n" -"\n" -"/**\n" -" * Handler for zoom buttons\n" -" */\n" -"function handleZoom(evt,direction)\n" -"{\n" -" var g = svgDoc.getElementById(\"viewport\");\n" -" var factor = direction=='in' ? zoomInFactor : zoomOutFactor;\n" -" var m = g.getCTM();\n" -" var p = root.createSVGPoint();\n" -" p.x = windowWidth/2;\n" -" p.y = windowHeight/2;\n" -" doZoom(g,p,factor);\n" -"}\n" -"\n" -"function serializeXmlNode(xmlNode) \n" -"{\n" -" if (typeof window.XMLSerializer != \"undefined\") {\n" -" return (new window.XMLSerializer()).serializeToString(xmlNode);\n" -" } else if (typeof xmlNode.xml != \"undefined\") {\n" -" return xmlNode.xml;\n" -" }\n" -" return \"\";\n" -"}\n" -"\n" -"/** \n" -" * Handler for print function\n" -" */\n" -"function handlePrint(evt)\n" -"{\n" -" evt.returnValue = false;\n" -" var g = svgDoc.getElementById(\"graph\");\n" -" var xs = serializeXmlNode(g);\n" -" try {\n" -" var w = window.open('about:blank','_blank','width='+windowWidth+',height='+windowHeight+\n" -" ',toolbar=0,status=0,menubar=0,scrollbars=0,resizable=0,location=0,directories=0');\n" -" var d = w.document;\n" -" d.write('<html xmlns=\"http://www.w3.org/1999/xhtml\" '+\n" -" 'xmlns:svg=\"http://www.w3.org/2000/svg\" '+\n" -" 'xmlns:xlink=\"http://www.w3.org/1999/xlink\">');\n" -" d.write('<head><title>Print SVG</title></head>');\n" -" d.write('<body style=\"margin: 0px; padding: 0px;\" onload=\"window.print();\">');\n" -" d.write('<div id=\"svg\" style=\"width:'+windowWidth+'px; height:'+windowHeight+'px;\">'+xs+'</div>');\n" -" d.write('</body>');\n" -" d.write('</html>');\n" -" d.close();\n" -" } catch(e) {\n" -" alert('Failed to open popup window needed for printing!\\n'+e.message);\n" -" }\n" -"}\n" -"\n" -"\n" -"\n" -"\n" diff --git a/src/tclscanner.h b/src/tclscanner.h index 7cd93b9..02627b4 100644 --- a/src/tclscanner.h +++ b/src/tclscanner.h @@ -49,7 +49,8 @@ class TclLanguageScanner : public ParserInterface bool inlineFragment=FALSE, MemberDef *memberDef=0, bool showLineNumbers=TRUE, - Definition *searchCtx=0 + Definition *searchCtx=0, + bool collectXRefs=TRUE ); void resetCodeParserState(); void parsePrototype(const char *text); diff --git a/src/tclscanner.l b/src/tclscanner.l index 2129bf0..1fd20cd 100644 --- a/src/tclscanner.l +++ b/src/tclscanner.l @@ -127,7 +127,7 @@ int TclFindElement( goto done; } - if (*p == '{') + if (*p == '{') /* } to keep vi happy */ { openBraces = 1; p++; @@ -2503,7 +2503,7 @@ static void tcl_parse(const QCString ns, const QCString cls) tcl.ns.insert("::",myEntry); tcl.entry_current = tcl_entry_new(); - tclscanYYrestart( tclscanYYin ); + tclscannerYYrestart( tclscannerYYin ); BEGIN( TOP ); yylineno=1; myScan = new tcl_scan; @@ -2518,7 +2518,7 @@ static void tcl_parse(const QCString ns, const QCString cls) tcl.entry_inside = tcl.entry_file; myScan->entry_scan = tcl.entry_inside; tcl.scan.insert(0,myScan); - tclscanYYlex(); + tclscannerYYlex(); tcl.scan.clear(); tcl.ns.clear(); tcl.cl.clear(); @@ -2541,6 +2541,7 @@ tcl_inf("%s\n",fileName); tcl.input_string = input; if (tcl.input_string.length()<1) return; + printlex(yy_flex_debug, TRUE, __FILE__, fileName); msg("Parsing %s...\n",fileName); groupEnterFile(fileName,yylineno); @@ -2554,6 +2555,7 @@ tcl_inf("%s\n",fileName); groupLeaveFile(tcl.file_name,yylineno); root->program.resize(0); myFile.close(); + printlex(yy_flex_debug, FALSE, __FILE__, fileName); } //! Parse file and codify. @@ -2569,7 +2571,8 @@ void TclLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, bool inlineFragment, MemberDef *memberDef, bool showLineNumbers, - Definition *searchCtx + Definition *searchCtx, + bool collectXRefs ) { (void)scopeName; @@ -2579,8 +2582,10 @@ void TclLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, (void)endLine; (void)inlineFragment; (void)searchCtx; + (void)collectXRefs; if (input.length()<1) return; + printlex(yy_flex_debug, TRUE, __FILE__, fileDef ? fileDef->fileName().data(): NULL); tcl.input_string = input; QCString myNs=""; @@ -2653,6 +2658,7 @@ tcl_inf("%s (%d,%d) %d %d\n",myStr.ascii(),startLine,endLine,isExampleBlock,inli tcl.cl.clear(); tcl.fn.clear(); tcl.entry.clear(); + printlex(yy_flex_debug, FALSE, __FILE__, fileDef ? fileDef->fileName().data(): NULL); } bool TclLanguageScanner::needsPreprocessing(const QCString &extension) diff --git a/src/template.cpp b/src/template.cpp new file mode 100644 index 0000000..8144afd --- /dev/null +++ b/src/template.cpp @@ -0,0 +1,3407 @@ +#include "template.h" + +#include <stdio.h> +#include <stdarg.h> + +#include <qlist.h> +#include <qarray.h> +#include <qdict.h> +#include <qstrlist.h> +#include <qvaluelist.h> +#include <qstack.h> +#include <qfile.h> +#include <qregexp.h> + +#include "sortdict.h" +#include "ftextstream.h" +#include "message.h" +#include "util.h" + +#define ENABLE_TRACING 0 + +#if ENABLE_TRACING +#define TRACE(x) printf x +#else +#define TRACE(x) +#endif + +class TemplateToken; + +//------------------------------------------------------------------- + +static QValueList<QCString> split(const QCString &str,const QCString &sep,bool allowEmptyEntries=FALSE,bool cleanup=TRUE) +{ + QValueList<QCString> lst; + + int j = 0; + int i = str.find( sep, j ); + + while (i!=-1) + { + if ( str.mid(j,i-j).length() > 0 ) + { + if (cleanup) + { + lst.append(str.mid(j,i-j).stripWhiteSpace()); + } + else + { + lst.append(str.mid(j,i-j)); + } + } + else if (allowEmptyEntries) + { + lst.append(""); + } + j = i + sep.length(); + i = str.find(sep,j); + } + + int l = str.length() - 1; + if (str.mid(j,l-j+1).length()>0) + { + if (cleanup) + { + lst.append(str.mid(j,l-j+1).stripWhiteSpace()); + } + else + { + lst.append(str.mid(j,l-j+1)); + } + } + else if (allowEmptyEntries) + { + lst.append(""); + } + + return lst; +} + +//---------------------------------------------------------------------------- + +#if ENABLE_TRACING +static QCString replace(const char *s,char csrc,char cdst) +{ + QCString result = s; + for (char *p=result.data();*p;p++) + { + if (*p==csrc) *p=cdst; + } + return result; +} +#endif + +//- TemplateVariant implementation ------------------------------------------- + +/** @brief Private data of a template variant object */ +class TemplateVariant::Private +{ + public: + Private() : raw(FALSE) {} + Type type; + int intVal; + QCString strVal; + bool boolVal; + const TemplateStructIntf *strukt; + const TemplateListIntf *list; + Delegate delegate; + bool raw; +}; + +TemplateVariant::TemplateVariant() +{ + p = new Private; + p->type=None; +} + +TemplateVariant::TemplateVariant(bool b) +{ + p = new Private; + p->type = Bool; + p->boolVal = b; +} + +TemplateVariant::TemplateVariant(int v) +{ + p = new Private; + p->type = Integer; + p->intVal = v; +} + +TemplateVariant::TemplateVariant(const char *s,bool raw) +{ + p = new Private; + p->type = String; + p->strVal = s; + p->raw = raw; +} + +TemplateVariant::TemplateVariant(const QCString &s,bool raw) +{ + p = new Private; + p->type = String; + p->strVal = s; + p->raw = raw; +} + +TemplateVariant::TemplateVariant(const TemplateStructIntf *s) +{ + p = new Private; + p->type = Struct; + p->strukt = s; } + +TemplateVariant::TemplateVariant(const TemplateListIntf *l) +{ + p = new Private; + p->type = List; + p->list = l; +} + +TemplateVariant::TemplateVariant(const TemplateVariant::Delegate &delegate) +{ + p = new Private; + p->type = Function; + p->delegate = delegate; +} + +TemplateVariant::~TemplateVariant() +{ + delete p; +} + +TemplateVariant::TemplateVariant(const TemplateVariant &v) +{ + p = new Private; + p->type = v.p->type; + p->raw = v.p->raw; + switch (p->type) + { + case None: break; + case Bool: p->boolVal = v.p->boolVal; break; + case Integer: p->intVal = v.p->intVal; break; + case String: p->strVal = v.p->strVal; break; + case Struct: p->strukt = v.p->strukt; break; + case List: p->list = v.p->list; break; + case Function: p->delegate= v.p->delegate;break; + } +} + +TemplateVariant &TemplateVariant::operator=(const TemplateVariant &v) +{ + p->type = v.p->type; + p->raw = v.p->raw; + switch (p->type) + { + case None: break; + case Bool: p->boolVal = v.p->boolVal; break; + case Integer: p->intVal = v.p->intVal; break; + case String: p->strVal = v.p->strVal; break; + case Struct: p->strukt = v.p->strukt; break; + case List: p->list = v.p->list; break; + case Function: p->delegate= v.p->delegate;break; + } + return *this; +} + +QCString TemplateVariant::toString() const +{ + QCString result; + switch (p->type) + { + case None: + break; + case Bool: + result=p->boolVal ? "true" : "false"; + break; + case Integer: + result=QCString().setNum(p->intVal); + break; + case String: + result=p->strVal; + break; + case Struct: + result="[struct]"; + break; + case List: + result="[list]"; + break; + case Function: + result="[function]"; + break; + } + return result; +} + +bool TemplateVariant::toBool() const +{ + bool result=FALSE; + switch (p->type) + { + case None: + break; + case Bool: + result = p->boolVal; + break; + case Integer: + result = p->intVal!=0; + break; + case String: + result = !p->strVal.isEmpty(); // && p->strVal!="false" && p->strVal!="0"; + break; + case Struct: + result = TRUE; + break; + case List: + result = p->list->count()!=0; + break; + case Function: + result = FALSE; + break; + } + return result; +} + +int TemplateVariant::toInt() const +{ + int result=0; + switch (p->type) + { + case None: + break; + case Bool: + result = p->boolVal ? 1 : 0; + break; + case Integer: + result = p->intVal; + break; + case String: + result = p->strVal.toInt(); + break; + case Struct: + break; + case List: + result = p->list->count(); + break; + case Function: + result = 0; + break; + } + return result; +} + +const TemplateStructIntf *TemplateVariant::toStruct() const +{ + return p->type==Struct ? p->strukt : 0; +} + +const TemplateListIntf *TemplateVariant::toList() const +{ + return p->type==List ? p->list : 0; +} + +TemplateVariant TemplateVariant::call(const QValueList<TemplateVariant> &args) +{ + if (p->type==Function) return p->delegate(args); + return TemplateVariant(); +} + +bool TemplateVariant::operator==(TemplateVariant &other) +{ + if (p->type==None) + { + return FALSE; + } + if (p->type==TemplateVariant::List && other.p->type==TemplateVariant::List) + { + return p->list==other.p->list; // TODO: improve me + } + else if (p->type==TemplateVariant::Struct && other.p->type==TemplateVariant::Struct) + { + return p->strukt==other.p->strukt; // TODO: improve me + } + else + { + return toString()==other.toString(); + } +} + +TemplateVariant::Type TemplateVariant::type() const +{ + return p->type; +} + +bool TemplateVariant::isValid() const +{ + return p->type!=None; +} + +void TemplateVariant::setRaw(bool b) +{ + p->raw = b; +} + +bool TemplateVariant::raw() const +{ + return p->raw; +} + +//- Template struct implementation -------------------------------------------- + + +/** @brief Private data of a template struct object */ +class TemplateStruct::Private +{ + public: + Private() : fields(17) + { fields.setAutoDelete(TRUE); } + QDict<TemplateVariant> fields; +}; + +TemplateStruct::TemplateStruct() +{ + p = new Private; +} + +TemplateStruct::~TemplateStruct() +{ + delete p; +} + +void TemplateStruct::set(const char *name,const TemplateVariant &v) +{ + TemplateVariant *pv = p->fields.find(name); + if (pv) // change existing field + { + *pv = v; + } + else // insert new field + { + p->fields.insert(name,new TemplateVariant(v)); + } +} + +TemplateVariant TemplateStruct::get(const char *name) const +{ + TemplateVariant *v = p->fields.find(name); + return v ? *v : TemplateVariant(); +} + +//- Template list implementation ---------------------------------------------- + + +/** @brief Private data of a template list object */ +class TemplateList::Private +{ + public: + Private() : index(-1) {} + QValueList<TemplateVariant> elems; + int index; +}; + + +TemplateList::TemplateList() +{ + p = new Private; +} + +TemplateList::~TemplateList() +{ + delete p; +} + +int TemplateList::count() const +{ + return p->elems.count(); +} + +void TemplateList::append(const TemplateVariant &v) +{ + p->elems.append(v); +} + +// iterator support +class TemplateListConstIterator : public TemplateListIntf::ConstIterator +{ + public: + TemplateListConstIterator(const TemplateList &l) : m_list(l) { m_index=-1; } + virtual ~TemplateListConstIterator() {} + virtual void toFirst() + { + m_it = m_list.p->elems.begin(); + m_index=0; + } + virtual void toLast() + { + m_it = m_list.p->elems.fromLast(); + m_index=m_list.count()-1; + } + virtual void toNext() + { + if (m_it!=m_list.p->elems.end()) + { + ++m_it; + ++m_index; + } + } + virtual void toPrev() + { + if (m_index>0) + { + --m_it; + --m_index; + } + else + { + m_index=-1; + } + } + virtual bool current(TemplateVariant &v) const + { + if (m_index<0 || m_it==m_list.p->elems.end()) + { + v = TemplateVariant(); + return FALSE; + } + else + { + v = *m_it; + return TRUE; + } + } + private: + const TemplateList &m_list; + QValueList<TemplateVariant>::ConstIterator m_it; + int m_index; +}; + +TemplateListIntf::ConstIterator *TemplateList::createIterator() const +{ + return new TemplateListConstIterator(*this); +} + +TemplateVariant TemplateList::at(int index) const +{ + if (index>=0 && index<(int)p->elems.count()) + { + return p->elems[index]; + } + else + { + return TemplateVariant(); + } +} + +//- Operator types ------------------------------------------------------------ + +/** @brief Class representing operators that can appear in template expressions */ +class Operator +{ + public: + /* Operator precedence (low to high) + or + and + not + in + ==, !=, <, >, <=, >= + | + : + , + */ + enum Type + { + Or, And, Not, In, Equal, NotEqual, Less, Greater, LessEqual, + GreaterEqual, Filter, Colon, Comma, Last + }; + + static const char *toString(Type op) + { + switch(op) + { + case Or: return "or"; + case And: return "and"; + case Not: return "not"; + case In: return "in"; + case Equal: return "=="; + case NotEqual: return "!="; + case Less: return "<"; + case Greater: return ">"; + case LessEqual: return "<="; + case GreaterEqual: return ">="; + case Filter: return "|"; + case Colon: return ":"; + case Comma: return ","; + case Last: return "?"; + } + return "?"; + } +}; + +//----------------------------------------------------------------------------- + +class TemplateNodeBlock; + +/** @brief Class holding stacks of blocks available in the context */ +class TemplateBlockContext +{ + public: + TemplateBlockContext(); + TemplateNodeBlock *get(const QCString &name) const; + TemplateNodeBlock *pop(const QCString &name) const; + void add(TemplateNodeBlock *block); + void add(TemplateBlockContext *ctx); + void push(TemplateNodeBlock *block); + void clear(); + private: + QDict< QList<TemplateNodeBlock> > m_blocks; +}; + + +/** @brief Internal class representing the implementation of a template + * context */ +class TemplateContextImpl : public TemplateContext +{ + public: + TemplateContextImpl(); + virtual ~TemplateContextImpl(); + + // TemplateContext methods + void push(); + void pop(); + void set(const char *name,const TemplateVariant &v); + TemplateVariant get(const QCString &name) const; + const TemplateVariant *getRef(const QCString &name) const; + void setOutputDirectory(const QCString &dir) + { m_outputDir = dir; } + void setEscapeIntf(TemplateEscapeIntf *intf) + { m_escapeIntf = intf; } + void setSpacelessIntf(TemplateSpacelessIntf *intf) + { m_spacelessIntf = intf; } + + // internal methods + TemplateBlockContext *blockContext(); + TemplateVariant getPrimary(const QCString &name) const; + void setLocation(const QCString &templateName,int line) + { m_templateName=templateName; m_line=line; } + QCString templateName() const { return m_templateName; } + int line() const { return m_line; } + QCString outputDirectory() const { return m_outputDir; } + TemplateEscapeIntf *escapeIntf() const { return m_escapeIntf; } + TemplateSpacelessIntf *spacelessIntf() const { return m_spacelessIntf; } + void enableSpaceless(bool b) { m_spacelessEnabled=b; } + bool spacelessEnabled() const { return m_spacelessEnabled && m_spacelessIntf; } + + private: + QCString m_templateName; + int m_line; + QCString m_outputDir; + QList< QDict<TemplateVariant> > m_contextStack; + TemplateBlockContext m_blockContext; + TemplateEscapeIntf *m_escapeIntf; + TemplateSpacelessIntf *m_spacelessIntf; + bool m_spacelessEnabled; +}; + +//----------------------------------------------------------------------------- + +/** @brief The implementation of the "add" filter */ +class FilterAdd +{ + public: + static int variantIntValue(const TemplateVariant &v,bool &isInt) + { + isInt = v.type()==TemplateVariant::Integer; + if (!isInt && v.type()==TemplateVariant::String) + { + return v.toString().toInt(&isInt); + } + return isInt ? v.toInt() : 0; + } + static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &arg) + { + if (!v.isValid()) + { + return arg; + } + bool lhsIsInt; + int lhsValue = variantIntValue(v,lhsIsInt); + bool rhsIsInt; + int rhsValue = variantIntValue(arg,rhsIsInt); + if (lhsIsInt && rhsIsInt) + { + return lhsValue+rhsValue; + } + else if (v.type()==TemplateVariant::String && arg.type()==TemplateVariant::String) + { + return TemplateVariant(v.toString() + arg.toString()); + } + else + { + return v; + } + } +}; + +//----------------------------------------------------------------------------- + +/** @brief The implementation of the "prepend" filter */ +class FilterPrepend +{ + public: + static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &arg) + { + if (v.type()==TemplateVariant::String && arg.type()==TemplateVariant::String) + { + return TemplateVariant(arg.toString() + v.toString()); + } + else + { + return v; + } + } +}; + +//-------------------------------------------------------------------- + +/** @brief The implementation of the "length" filter */ +class FilterLength +{ + public: + static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) + { + if (!v.isValid()) + { + return TemplateVariant(); + } + if (v.type()==TemplateVariant::List) + { + return TemplateVariant(v.toList()->count()); + } + else if (v.type()==TemplateVariant::String) + { + return TemplateVariant((int)v.toString().length()); + } + else + { + return TemplateVariant(); + } + } +}; + +//-------------------------------------------------------------------- + +/** @brief The implementation of the "default" filter */ +class FilterDefault +{ + public: + static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &arg) + { + if (!v.isValid()) + { + return arg; + } + else if (v.type()==TemplateVariant::String && v.toString().isEmpty()) + { + return arg; + } + else + { + return v; + } + } +}; + +//-------------------------------------------------------------------- + +/** @brief The implementation of the "default" filter */ +class FilterStripPath +{ + public: + static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) + { + if (!v.isValid() || v.type()!=TemplateVariant::String) + { + return v; + } + QCString result = v.toString(); + int i=result.findRev('/'); + if (i!=-1) + { + result=result.mid(i+1); + } + i=result.findRev('\\'); + if (i!=-1) + { + result=result.mid(i+1); + } + return result; + } +}; + +//-------------------------------------------------------------------- + +/** @brief The implementation of the "default" filter */ +class FilterNoWrap +{ + public: + static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) + { + if (!v.isValid() || v.type()!=TemplateVariant::String) + { + return v; + } + QCString s = v.toString(); + return substitute(s," "," "); + } +}; + +//-------------------------------------------------------------------- + +/** @brief The implementation of the "divisibleby" filter */ +class FilterDivisibleBy +{ + public: + static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &n) + { + if (!v.isValid() || !n.isValid()) + { + return TemplateVariant(); + } + if (v.type()==TemplateVariant::Integer && n.type()==TemplateVariant::Integer) + { + return TemplateVariant((v.toInt()%n.toInt())==0); + } + else + { + return TemplateVariant(); + } + } +}; + + +//-------------------------------------------------------------------- + +/** @brief Factory singleton for registering and creating filters */ +class TemplateFilterFactory +{ + public: + typedef TemplateVariant (FilterFunction)(const TemplateVariant &v,const TemplateVariant &arg); + + static TemplateFilterFactory *instance() + { + static TemplateFilterFactory *instance = 0; + if (instance==0) instance = new TemplateFilterFactory; + return instance; + } + + TemplateVariant apply(const QCString &name,const TemplateVariant &v,const TemplateVariant &arg, bool &ok) + { + FilterFunction *func = (FilterFunction*)m_registry.find(name); + if (func) + { + ok=TRUE; + return (*func)(v,arg); + } + else + { + ok=FALSE; + return v; + } + } + + void registerFilter(const QCString &name,FilterFunction *func) + { + m_registry.insert(name,(void*)func); + } + + /** @brief Helper class for registering a filter function */ + template<class T> class AutoRegister + { + public: + AutoRegister<T>(const QCString &key) + { + TemplateFilterFactory::instance()->registerFilter(key,&T::apply); + } + }; + + private: + QDict<void> m_registry; +}; + +// register a handlers for each filter we support +static TemplateFilterFactory::AutoRegister<FilterAdd> fAdd("add"); +static TemplateFilterFactory::AutoRegister<FilterAdd> fAppend("append"); +static TemplateFilterFactory::AutoRegister<FilterLength> fLength("length"); +static TemplateFilterFactory::AutoRegister<FilterNoWrap> fNoWrap("nowrap"); +static TemplateFilterFactory::AutoRegister<FilterDefault> fDefault("default"); +static TemplateFilterFactory::AutoRegister<FilterPrepend> fPrepend("prepend"); +static TemplateFilterFactory::AutoRegister<FilterStripPath> fStripPath("stripPath"); +static TemplateFilterFactory::AutoRegister<FilterDivisibleBy> fDivisibleBy("divisibleby"); + +//-------------------------------------------------------------------- + +/** @brief Base class for all nodes in the abstract syntax tree of an + * expression. + */ +class ExprAst +{ + public: + virtual ~ExprAst() {} + virtual TemplateVariant resolve(TemplateContext *) { return TemplateVariant(); } +}; + +/** @brief Class representing a number in the AST */ +class ExprAstNumber : public ExprAst +{ + public: + ExprAstNumber(int num) : m_number(num) + { TRACE(("ExprAstNumber(%d)\n",num)); } + int number() const { return m_number; } + virtual TemplateVariant resolve(TemplateContext *) { return TemplateVariant(m_number); } + private: + int m_number; +}; + +/** @brief Class representing a variable in the AST */ +class ExprAstVariable : public ExprAst +{ + public: + ExprAstVariable(const char *name) : m_name(name) + { TRACE(("ExprAstVariable(%s)\n",name)); } + const QCString &name() const { return m_name; } + virtual TemplateVariant resolve(TemplateContext *c) + { + TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c); + TemplateVariant v = c->get(m_name); + if (!v.isValid()) + { + warn(ci->templateName(),ci->line(),"undefined variable '%s' in expression",m_name.data()); + } + return v; + } + private: + QCString m_name; +}; + +class ExprAstFunctionVariable : public ExprAst +{ + public: + ExprAstFunctionVariable(ExprAst *var,const QList<ExprAst> &args) + : m_var(var), m_args(args) + { TRACE(("ExprAstFunctionVariable(%s)\n",var->name().data())); + m_args.setAutoDelete(TRUE); + } + virtual TemplateVariant resolve(TemplateContext *c) + { + QValueList<TemplateVariant> args; + for (uint i=0;i<m_args.count();i++) + { + TemplateVariant v = m_args.at(i)->resolve(c); + args.append(v); + } + TemplateVariant v = m_var->resolve(c); + if (v.type()==TemplateVariant::Function) + { + v = v.call(args); + } + return v; + } + private: + ExprAst *m_var; + QList<ExprAst> m_args; +}; + +/** @brief Class representing a filter in the AST */ +class ExprAstFilter : public ExprAst +{ + public: + ExprAstFilter(const char *name,ExprAst *arg) : m_name(name), m_arg(arg) + { TRACE(("ExprAstFilter(%s)\n",name)); } + ~ExprAstFilter() { delete m_arg; } + const QCString &name() const { return m_name; } + TemplateVariant apply(const TemplateVariant &v,TemplateContext *c) + { + TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c); + TRACE(("Applying filter '%s' to '%s' (type=%d)\n",m_name.data(),v.toString().data(),v.type())); + TemplateVariant arg; + if (m_arg) arg = m_arg->resolve(c); + bool ok; + TemplateVariant result = TemplateFilterFactory::instance()->apply(m_name,v,arg,ok); + if (!ok) + { + warn(ci->templateName(),ci->line(),"unknown filter '%s'",m_name.data()); + } + return result; + } + private: + QCString m_name; + ExprAst *m_arg; +}; + +/** @brief Class representing a filter applied to an expression in the AST */ +class ExprAstFilterAppl : public ExprAst +{ + public: + ExprAstFilterAppl(ExprAst *expr,ExprAstFilter *filter) + : m_expr(expr), m_filter(filter) + { TRACE(("ExprAstFilterAppl\n")); } + ~ExprAstFilterAppl() { delete m_expr; delete m_filter; } + virtual TemplateVariant resolve(TemplateContext *c) + { + return m_filter->apply(m_expr->resolve(c),c); + } + private: + ExprAst *m_expr; + ExprAstFilter *m_filter; +}; + +/** @brief Class representing a string literal in the AST */ +class ExprAstLiteral : public ExprAst +{ + public: + ExprAstLiteral(const char *lit) : m_literal(lit) + { TRACE(("ExprAstLiteral(%s)\n",lit)); } + const QCString &literal() const { return m_literal; } + virtual TemplateVariant resolve(TemplateContext *) { return TemplateVariant(m_literal); } + private: + QCString m_literal; +}; + +/** @brief Class representing a negation (not) operator in the AST */ +class ExprAstNegate : public ExprAst +{ + public: + ExprAstNegate(ExprAst *expr) : m_expr(expr) + { TRACE(("ExprAstNegate\n")); } + ~ExprAstNegate() { delete m_expr; } + virtual TemplateVariant resolve(TemplateContext *c) + { return TemplateVariant(!m_expr->resolve(c).toBool()); } + private: + ExprAst *m_expr; +}; + +/** @brief Class representing a binary operator in the AST */ +class ExprAstBinary : public ExprAst +{ + public: + ExprAstBinary(Operator::Type op,ExprAst *lhs,ExprAst *rhs) + : m_operator(op), m_lhs(lhs), m_rhs(rhs) + { TRACE(("ExprAstBinary %s\n",Operator::toString(op))); } + ~ExprAstBinary() { delete m_lhs; delete m_rhs; } + virtual TemplateVariant resolve(TemplateContext *c) + { + TemplateVariant lhs = m_lhs->resolve(c); + TemplateVariant rhs = m_rhs ? m_rhs->resolve(c) : TemplateVariant(); + switch(m_operator) + { + case Operator::Or: + return TemplateVariant(lhs.toBool() || rhs.toBool()); + case Operator::And: + return TemplateVariant(lhs.toBool() && rhs.toBool()); + case Operator::Equal: + return TemplateVariant(lhs == rhs); + case Operator::NotEqual: + return TemplateVariant(!(lhs == rhs)); + case Operator::Less: + if (lhs.type()==TemplateVariant::String && rhs.type()==TemplateVariant::String) + { + return lhs.toString()<rhs.toString(); + } + else + { + return lhs.toInt()<rhs.toInt(); + } + case Operator::Greater: + if (lhs.type()==TemplateVariant::String && rhs.type()==TemplateVariant::String) + { + return !(lhs.toString()<rhs.toString()); + } + else + { + return lhs.toInt()>rhs.toInt(); + } + case Operator::LessEqual: + if (lhs.type()==TemplateVariant::String && rhs.type()==TemplateVariant::String) + { + return lhs.toString()==rhs.toString() || lhs.toString()<rhs.toString(); + } + else + { + return lhs.toInt()<=rhs.toInt(); + } + case Operator::GreaterEqual: + if (lhs.type()==TemplateVariant::String && rhs.type()==TemplateVariant::String) + { + return lhs.toString()==rhs.toString() || !(lhs.toString()<rhs.toString()); + } + else + { + return lhs.toInt()>=rhs.toInt(); + } + default: + return TemplateVariant(); + } + } + private: + Operator::Type m_operator; + ExprAst *m_lhs; + ExprAst *m_rhs; +}; + +//-------------------------------------------------------------------- + +/** @brief Recursive decent parser for Django style template expressions. + */ +class ExpressionParser +{ + public: + ExpressionParser(const QCString &templateName,int line) + : m_templateName(templateName), m_line(line), m_tokenStream(0) + { + } + virtual ~ExpressionParser() + { + } + + ExprAst *parse(const char *expr) + { + if (expr==0) return 0; + m_tokenStream = expr; + getNextToken(); + return parseOrExpression(); + } + + ExprAst *parsePrimary(const char *expr) + { + if (expr==0) return 0; + m_tokenStream = expr; + getNextToken(); + return parsePrimaryExpression(); + } + + ExprAst *parseVariable(const char *varExpr) + { + if (varExpr==0) return 0; + m_tokenStream = varExpr; + getNextToken(); + return parseFilteredVariable(); + } + + private: + + /** @brief Class representing a token within an expression. */ + class ExprToken + { + public: + ExprToken() : type(Unknown), num(-1), op(Operator::Or) + { + } + enum Type + { + Unknown, Operator, Number, Identifier, Literal + }; + + Type type; + int num; + QCString id; + Operator::Type op; + }; + + ExprAst *parseOrExpression() + { + TRACE(("{parseOrExpression(%s)\n",m_tokenStream)); + ExprAst *lhs = parseAndExpression(); + if (lhs) + { + while (m_curToken.type==ExprToken::Operator && + m_curToken.op==Operator::Or) + { + getNextToken(); + ExprAst *rhs = parseAndExpression(); + lhs = new ExprAstBinary(Operator::Or,lhs,rhs); + } + } + TRACE(("}parseOrExpression(%s)\n",m_tokenStream)); + return lhs; + } + + ExprAst *parseAndExpression() + { + TRACE(("{parseAndExpression(%s)\n",m_tokenStream)); + ExprAst *lhs = parseNotExpression(); + if (lhs) + { + while (m_curToken.type==ExprToken::Operator && + m_curToken.op==Operator::And) + { + getNextToken(); + ExprAst *rhs = parseNotExpression(); + lhs = new ExprAstBinary(Operator::And,lhs,rhs); + } + } + TRACE(("}parseAndExpression(%s)\n",m_tokenStream)); + return lhs; + } + + ExprAst *parseNotExpression() + { + TRACE(("{parseNotExpression(%s)\n",m_tokenStream)); + ExprAst *result=0; + if (m_curToken.type==ExprToken::Operator && + m_curToken.op==Operator::Not) + { + getNextToken(); + ExprAst *expr = parseCompareExpression(); + if (expr==0) + { + warn(m_templateName,m_line,"argument missing for not operator"); + return 0; + } + result = new ExprAstNegate(expr); + } + else + { + result = parseCompareExpression(); + } + TRACE(("}parseNotExpression(%s)\n",m_tokenStream)); + return result; + } + + ExprAst *parseCompareExpression() + { + TRACE(("{parseCompareExpression(%s)\n",m_tokenStream)); + ExprAst *lhs = parsePrimaryExpression(); + if (lhs) + { + Operator::Type op = m_curToken.op; + if (m_curToken.type==ExprToken::Operator && + (op==Operator::Less || + op==Operator::Greater || + op==Operator::Equal || + op==Operator::NotEqual || + op==Operator::LessEqual || + op==Operator::GreaterEqual + ) + ) + { + getNextToken(); + ExprAst *rhs = parseNotExpression(); + lhs = new ExprAstBinary(op,lhs,rhs); + } + } + TRACE(("}parseCompareExpression(%s)\n",m_tokenStream)); + return lhs; + } + + ExprAst *parsePrimaryExpression() + { + TRACE(("{parsePrimary(%s)\n",m_tokenStream)); + ExprAst *result=0; + switch (m_curToken.type) + { + case ExprToken::Number: + result = parseNumber(); + break; + case ExprToken::Identifier: + result = parseFilteredVariable(); + break; + case ExprToken::Literal: + result = parseLiteral(); + break; + default: + if (m_curToken.type==ExprToken::Operator) + { + warn(m_templateName,m_line,"unexpected operator '%s' in expression", + Operator::toString(m_curToken.op)); + } + else + { + warn(m_templateName,m_line,"unexpected token in expression"); + } + } + TRACE(("}parsePrimary(%s)\n",m_tokenStream)); + return result; + } + + ExprAst *parseNumber() + { + TRACE(("{parseNumber(%d)\n",m_curToken.num)); + ExprAst *num = new ExprAstNumber(m_curToken.num); + getNextToken(); + TRACE(("}parseNumber()\n")); + return num; + } + + ExprAst *parseIdentifier() + { + TRACE(("{parseIdentifier(%s)\n",m_curToken.id.data())); + ExprAst *id = new ExprAstVariable(m_curToken.id); + getNextToken(); + TRACE(("}parseIdentifier()\n")); + return id; + } + + ExprAst *parseLiteral() + { + TRACE(("{parseLiteral(%s)\n",m_curToken.id.data())); + ExprAst *lit = new ExprAstLiteral(m_curToken.id); + getNextToken(); + TRACE(("}parseLiteral()\n")); + return lit; + } + + ExprAst *parseIdentifierOptionalArgs() + { + TRACE(("{parseIdentifierOptionalArgs(%s)\n",m_curToken.id.data())); + ExprAst *expr = parseIdentifier(); + if (expr) + { + if (m_curToken.type==ExprToken::Operator && + m_curToken.op==Operator::Colon) + { + getNextToken(); + ExprAst *argExpr = parsePrimaryExpression(); + QList<ExprAst> args; + args.append(argExpr); + while (m_curToken.type==ExprToken::Operator && + m_curToken.op==Operator::Comma) + { + getNextToken(); + argExpr = parsePrimaryExpression(); + args.append(argExpr); + } + expr = new ExprAstFunctionVariable(expr,args); + } + } + TRACE(("}parseIdentifierOptionalArgs()\n")); + return expr; + } + + ExprAst *parseFilteredVariable() + { + TRACE(("{parseFilteredVariable()\n")); + ExprAst *expr = parseIdentifierOptionalArgs(); + if (expr) + { + while (m_curToken.type==ExprToken::Operator && + m_curToken.op==Operator::Filter) + { + getNextToken(); + ExprAstFilter *filter = parseFilter(); + if (!filter) break; + expr = new ExprAstFilterAppl(expr,filter); + } + } + TRACE(("}parseFilteredVariable()\n")); + return expr; + } + + ExprAstFilter *parseFilter() + { + TRACE(("{parseFilter(%s)\n",m_curToken.id.data())); + QCString filterName = m_curToken.id; + getNextToken(); + ExprAst *argExpr=0; + if (m_curToken.type==ExprToken::Operator && + m_curToken.op==Operator::Colon) + { + getNextToken(); + argExpr = parsePrimaryExpression(); + } + ExprAstFilter *filter = new ExprAstFilter(filterName,argExpr); + TRACE(("}parseFilter()\n")); + return filter; + } + + + bool getNextToken() + { + const char *p = m_tokenStream; + char s[2]; + s[1]=0; + if (p==0 || *p=='\0') return FALSE; + while (*p==' ') p++; // skip over spaces + char c=*p; + if (strncmp(p,"not ",4)==0) + { + m_curToken.type = ExprToken::Operator; + m_curToken.op = Operator::Not; + p+=4; + } + else if (strncmp(p,"and ",4)==0) + { + m_curToken.type = ExprToken::Operator; + m_curToken.op = Operator::And; + p+=4; + } + else if (strncmp(p,"or ",3)==0) + { + m_curToken.type = ExprToken::Operator; + m_curToken.op = Operator::Or; + p+=3; + } + else if (c=='=' && *(p+1)=='=') + { + m_curToken.type = ExprToken::Operator; + m_curToken.op = Operator::Equal; + p+=2; + } + else if (c=='!' && *(p+1)=='=') + { + m_curToken.type = ExprToken::Operator; + m_curToken.op = Operator::NotEqual; + p+=2; + } + else if (c=='<' && *(p+1)=='=') + { + m_curToken.type = ExprToken::Operator; + m_curToken.op = Operator::LessEqual; + p+=2; + } + else if (c=='>' && *(p+1)=='=') + { + m_curToken.type = ExprToken::Operator; + m_curToken.op = Operator::GreaterEqual; + p+=2; + } + else if (c=='<') + { + m_curToken.type = ExprToken::Operator; + m_curToken.op = Operator::Less; + p++; + } + else if (c=='>') + { + m_curToken.type = ExprToken::Operator; + m_curToken.op = Operator::Greater; + p++; + } + else if (c=='|') + { + m_curToken.type = ExprToken::Operator; + m_curToken.op = Operator::Filter; + p++; + } + else if (c==':') + { + m_curToken.type = ExprToken::Operator; + m_curToken.op = Operator::Colon; + p++; + } + else if (c==',') + { + m_curToken.type = ExprToken::Operator; + m_curToken.op = Operator::Comma; + p++; + } + else if ((c=='-' && *(p+1)>='0' && *(p+1)<='9') || (c>='0' && c<='9')) + { + m_curToken.type = ExprToken::Number; + const char *np = p; + if (c=='-') np++; + m_curToken.num = 0; + while (*np>='0' && *np<='9') + { + m_curToken.num*=10; + m_curToken.num+=*np-'0'; + np++; + } + if (c=='-') m_curToken.num=-m_curToken.num; + p=np; + } + else if (c=='_' || (c>='a' && c<='z') || (c>='A' && c<='Z')) + { + m_curToken.type = ExprToken::Identifier; + s[0]=c; + m_curToken.id = s; + p++; + while ((c=*p) && + (c=='_' || c=='.' || + (c>='a' && c<='z') || + (c>='A' && c<='Z') || + (c>='0' && c<='9')) + ) + { + s[0]=c; + m_curToken.id+=s; + p++; + } + if (m_curToken.id=="True") // treat true literal as numerical 1 + { + m_curToken.type = ExprToken::Number; + m_curToken.num = 1; + } + else if (m_curToken.id=="False") // treat false literal as numerical 0 + { + m_curToken.type = ExprToken::Number; + m_curToken.num = 0; + } + } + else if (c=='"' || c=='\'') + { + m_curToken.type = ExprToken::Literal; + m_curToken.id.resize(0); + p++; + char tokenChar = c; + char cp=0; + while ((c=*p) && (c!=tokenChar || (c==tokenChar && cp=='\\'))) + { + s[0]=c; + if (c!='\\' || cp=='\\') // don't add escapes + { + m_curToken.id+=s; + } + cp=c; + p++; + } + if (*p==tokenChar) p++; + } + else + { + m_curToken.type = ExprToken::Unknown; + char s[2]; + s[0]=c; + s[1]=0; + warn(m_templateName,m_line,"Found unknown token %s while parsing %s",s,m_tokenStream); + m_curToken.id = s; + p++; + } + //TRACE(("token type=%d op=%d num=%d id=%s\n", + // m_curToken.type,m_curToken.op,m_curToken.num,m_curToken.id.data())); + + m_tokenStream = p; + return TRUE; + } + + ExprToken m_curToken; + QCString m_templateName; + int m_line; + const char *m_tokenStream; +}; + +//---------------------------------------------------------- + +/** @brief Base class of all nodes in a template's AST */ +class TemplateNode +{ + public: + TemplateNode(TemplateNode *parent) : m_parent(parent) {} + virtual ~TemplateNode() {} + + virtual void render(FTextStream &ts, TemplateContext *c) = 0; + + TemplateNode *parent() { return m_parent; } + + private: + TemplateNode *m_parent; +}; + +//---------------------------------------------------------- + +/** @brief Parser for templates */ +class TemplateParser +{ + public: + TemplateParser(const QCString &templateName,QList<TemplateToken> &tokens); + void parse(TemplateNode *parent,int line,const QStrList &stopAt, + QList<TemplateNode> &nodes); + bool hasNextToken() const; + TemplateToken *takeNextToken(); + void removeNextToken(); + void prependToken(const TemplateToken *token); + const TemplateToken *currentToken() const; + QCString templateName() const { return m_templateName; } + private: + QCString m_templateName; + QList<TemplateToken> &m_tokens; +}; + +//---------------------------------------------------------- + +/** @brief Class representing a lexical token in a template */ +class TemplateToken +{ + public: + enum Type { Text, Variable, Block }; + TemplateToken(Type t,const char *d,int l) : type(t), data(d), line(l) {} + Type type; + QCString data; + int line; +}; + +//---------------------------------------------------------- + +/** @brief Class representing a list of AST nodes in a template */ +class TemplateNodeList : public QList<TemplateNode> +{ + public: + TemplateNodeList() + { + setAutoDelete(TRUE); + } + void render(FTextStream &ts,TemplateContext *c) + { + TRACE(("{TemplateNodeList::render\n")); + QListIterator<TemplateNode> it(*this); + TemplateNode *tn=0; + for (it.toFirst();(tn=it.current());++it) + { + tn->render(ts,c); + } + TRACE(("}TemplateNodeList::render\n")); + } +}; + +//---------------------------------------------------------- + +/** @brief Internal class representing the implementation of a template */ +class TemplateImpl : public TemplateNode, public Template +{ + public: + TemplateImpl(TemplateEngine *e,const QCString &name,const QCString &data); + ~TemplateImpl() {} + void render(FTextStream &ts, TemplateContext *c); + + TemplateEngine *engine() const { return m_engine; } + TemplateBlockContext *blockContext() { return &m_blockContext; } + + private: + QCString m_name; + TemplateNodeList m_nodes; + TemplateEngine *m_engine; + TemplateBlockContext m_blockContext; +}; + +//---------------------------------------------------------- + + +TemplateContextImpl::TemplateContextImpl() + : m_templateName("<unknown>"), m_line(1), m_escapeIntf(0), + m_spacelessIntf(0), m_spacelessEnabled(FALSE) +{ + m_contextStack.setAutoDelete(TRUE); + push(); +} + +TemplateContextImpl::~TemplateContextImpl() +{ + pop(); +} + +void TemplateContextImpl::set(const char *name,const TemplateVariant &v) +{ + TemplateVariant *pv = m_contextStack.first()->find(name); + if (pv) + { + m_contextStack.first()->remove(name); + } + m_contextStack.first()->insert(name,new TemplateVariant(v)); +} + +TemplateVariant TemplateContextImpl::get(const QCString &name) const +{ + int i=name.find('.'); + if (i==-1) // simple name + { + return getPrimary(name); + } + else // obj.prop + { + TemplateVariant v; + QCString objName = name.left(i); + v = getPrimary(objName); + QCString propName = name.mid(i+1); + while (!propName.isEmpty()) + { + //printf("getPrimary(%s) type=%d:%s\n",objName.data(),v.type(),v.toString().data()); + if (v.type()==TemplateVariant::Struct) + { + i = propName.find("."); + int l = i==-1 ? propName.length() : i; + v = v.toStruct()->get(propName.left(l)); + if (!v.isValid()) + { + warn(m_templateName,m_line,"requesting non-existing property '%s' for object '%s'",propName.left(l).data(),objName.data()); + } + if (i!=-1) + { + objName = propName.left(i); + propName = propName.mid(i+1); + } + else + { + propName.resize(0); + } + } + else if (v.type()==TemplateVariant::List) + { + i = propName.find("."); + int l = i==-1 ? propName.length() : i; + bool b; + int index = propName.left(l).toInt(&b); + if (b) + { + v = v.toList()->at(index); + } + else + { + warn(m_templateName,m_line,"list index '%s' is not valid",propName.data()); + break; + } + if (i!=-1) + { + propName = propName.mid(i+1); + } + else + { + propName.resize(0); + } + } + else + { + warn(m_templateName,m_line,"using . on an object '%s' is not an struct or list",objName.data()); + return TemplateVariant(); + } + } while (i!=-1); + return v; + } +} + +const TemplateVariant *TemplateContextImpl::getRef(const QCString &name) const +{ + QListIterator< QDict<TemplateVariant> > it(m_contextStack); + QDict<TemplateVariant> *dict; + for (it.toFirst();(dict=it.current());++it) + { + TemplateVariant *v = dict->find(name); + if (v) return v; + } + return 0; // not found +} + +TemplateVariant TemplateContextImpl::getPrimary(const QCString &name) const +{ + const TemplateVariant *v = getRef(name); + return v ? *v : TemplateVariant(); +} + +void TemplateContextImpl::push() +{ + QDict<TemplateVariant> *dict = new QDict<TemplateVariant>; + dict->setAutoDelete(TRUE); + m_contextStack.prepend(dict); +} + +void TemplateContextImpl::pop() +{ + if (!m_contextStack.removeFirst()) + { + warn(m_templateName,m_line,"pop() called on empty context stack!\n"); + } +} + +TemplateBlockContext *TemplateContextImpl::blockContext() +{ + return &m_blockContext; +} + +//---------------------------------------------------------- + +/** @brief Class representing a piece of plain text in a template */ +class TemplateNodeText : public TemplateNode +{ + public: + TemplateNodeText(TemplateParser *,TemplateNode *parent,int,const QCString &data) + : TemplateNode(parent), m_data(data) + { + TRACE(("TemplateNodeText('%s')\n",replace(data,'\n',' ').data())); + } + + void render(FTextStream &ts, TemplateContext *c) + { + //printf("TemplateNodeText::render(%s)\n",m_data.data()); + TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c); + if (ci->spacelessEnabled()) + { + ts << ci->spacelessIntf()->remove(m_data); + } + else + { + ts << m_data; + } + } + private: + QCString m_data; +}; + +//---------------------------------------------------------- + +/** @brief Class representing a variable in a template */ +class TemplateNodeVariable : public TemplateNode +{ + public: + TemplateNodeVariable(TemplateParser *parser,TemplateNode *parent,int line,const QCString &var) + : TemplateNode(parent), m_templateName(parser->templateName()), m_line(line) + { + TRACE(("TemplateNodeVariable(%s)\n",var.data())); + ExpressionParser expParser(m_templateName,line); + m_var = expParser.parseVariable(var); + } + ~TemplateNodeVariable() + { + delete m_var; + } + + void render(FTextStream &ts, TemplateContext *c) + { + TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c); + ci->setLocation(m_templateName,m_line); + TemplateVariant v = m_var->resolve(c); + if (v.type()==TemplateVariant::Function) + { + v = v.call(QValueList<TemplateVariant>()); + } + //printf("TemplateNodeVariable::render(%s) raw=%d\n",value.data(),v.raw()); + if (ci->escapeIntf() && !v.raw()) + { + ts << ci->escapeIntf()->escape(v.toString()); + } + else + { + ts << v.toString(); + } + } + + private: + QCString m_templateName; + int m_line; + ExprAst *m_var; + QList<ExprAst> m_args; +}; + +//---------------------------------------------------------- + +/** @brief Helper class for creating template AST tag nodes and returning + * the template for a given node. + */ +template<class T> class TemplateNodeCreator : public TemplateNode +{ + public: + TemplateNodeCreator(TemplateParser *parser,TemplateNode *parent,int line) + : TemplateNode(parent), m_templateName(parser->templateName()), m_line(line) {} + static TemplateNode *createInstance(TemplateParser *parser, + TemplateNode *parent, + int line, + const QCString &data) + { + return new T(parser,parent,line,data); + } + TemplateImpl *getTemplate() + { + TemplateNode *root = this; + while (root && root->parent()) + { + root = root->parent(); + } + return dynamic_cast<TemplateImpl*>(root); + } + protected: + QCString m_templateName; + int m_line; +}; + +//---------------------------------------------------------- + +/** @brief Class representing an 'if' tag in a template */ +class TemplateNodeIf : public TemplateNodeCreator<TemplateNodeIf> +{ + public: + TemplateNodeIf(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) : + TemplateNodeCreator<TemplateNodeIf>(parser,parent,line) + { + TRACE(("{TemplateNodeIf(%s)\n",data.data())); + if (data.isEmpty()) + { + warn(m_templateName,line,"missing argument for if tag"); + } + QStrList stopAt; + stopAt.append("endif"); + stopAt.append("else"); + parser->parse(this,line,stopAt,m_trueNodes); + TemplateToken *tok = parser->takeNextToken(); + ExpressionParser ex(parser->templateName(),line); + m_guardAst = ex.parse(data); + + if (tok && tok->data=="else") + { + stopAt.removeLast(); + parser->parse(this,line,stopAt,m_falseNodes); + parser->removeNextToken(); // skip over endif + } + delete tok; + TRACE(("}TemplateNodeIf(%s)\n",data.data())); + } + ~TemplateNodeIf() + { + delete m_guardAst; + } + + void render(FTextStream &ts, TemplateContext *c) + { + dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line); + //printf("TemplateNodeIf::render #trueNodes=%d #falseNodes=%d\n",m_trueNodes.count(),m_falseNodes.count()); + if (m_guardAst) + { + TemplateVariant guardValue = m_guardAst->resolve(c); + if (guardValue.toBool()) // guard is true, render corresponding nodes + { + m_trueNodes.render(ts,c); + } + else // guard is false, render corresponding nodes + { + m_falseNodes.render(ts,c); + } + } + } + private: + ExprAst *m_guardAst; + TemplateNodeList m_trueNodes; + TemplateNodeList m_falseNodes; +}; + +//---------------------------------------------------------- +/** @brief Class representing a 'for' tag in a template */ +class TemplateNodeRepeat : public TemplateNodeCreator<TemplateNodeRepeat> +{ + public: + TemplateNodeRepeat(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) + : TemplateNodeCreator<TemplateNodeRepeat>(parser,parent,line) + { + TRACE(("{TemplateNodeRepeat(%s)\n",data.data())); + ExpressionParser expParser(parser->templateName(),line); + m_expr = expParser.parseVariable(data); + QStrList stopAt; + stopAt.append("endrepeat"); + parser->parse(this,line,stopAt,m_repeatNodes); + parser->removeNextToken(); // skip over endrepeat + TRACE(("}TemplateNodeRepeat(%s)\n",data.data())); + } + ~TemplateNodeRepeat() + { + delete m_expr; + } + void render(FTextStream &ts, TemplateContext *c) + { + dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line); + TemplateVariant v; + if (m_expr && (v=m_expr->resolve(c)).type()==TemplateVariant::Integer) + { + int i, n = v.toInt(); + for (i=0;i<n;i++) + { + TemplateStruct s; + s.set("counter0", (int)i); + s.set("counter", (int)(i+1)); + s.set("revcounter", (int)(n-i)); + s.set("revcounter0", (int)(n-i-1)); + s.set("first",i==0); + s.set("last", i==n-1); + c->set("repeatloop",&s); + // render all items for this iteration of the loop + m_repeatNodes.render(ts,c); + } + } + else // simple type... + { + warn(m_templateName,m_line,"for requires a variable of list type!"); + } + } + private: + TemplateNodeList m_repeatNodes; + ExprAst *m_expr; +}; + +//---------------------------------------------------------- + +/** @brief Class representing a 'for' tag in a template */ +class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor> +{ + public: + TemplateNodeFor(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) + : TemplateNodeCreator<TemplateNodeFor>(parser,parent,line) + { + TRACE(("{TemplateNodeFor(%s)\n",data.data())); + QCString exprStr; + int i = data.find(" in "); + if (i==-1) + { + if (data.right(3)==" in") + { + warn(m_templateName,line,"for is missing container after 'in' keyword"); + } + else if (data=="in") + { + warn(m_templateName,line,"for needs at least one iterator variable"); + } + else + { + warn(m_templateName,line,"for is missing 'in' keyword"); + } + } + else + { + m_vars = split(data.left(i),","); + if (m_vars.count()==0) + { + warn(m_templateName,line,"for needs at least one iterator variable"); + } + + int j = data.find(" reversed",i); + m_reversed = (j!=-1); + + if (j==-1) j=data.length(); + if (j>i+4) + { + exprStr = data.mid(i+4,j-i-4); // skip over " in " part + } + if (exprStr.isEmpty()) + { + warn(m_templateName,line,"for is missing container after 'in' keyword"); + } + } + ExpressionParser expParser(parser->templateName(),line); + m_expr = expParser.parseVariable(exprStr); + + QStrList stopAt; + stopAt.append("endfor"); + stopAt.append("empty"); + parser->parse(this,line,stopAt,m_loopNodes); + TemplateToken *tok = parser->takeNextToken(); + if (tok && tok->data=="empty") + { + stopAt.removeLast(); + parser->parse(this,line,stopAt,m_emptyNodes); + parser->removeNextToken(); // skip over endfor + } + delete tok; + TRACE(("}TemplateNodeFor(%s)\n",data.data())); + } + + ~TemplateNodeFor() + { + delete m_expr; + } + + void render(FTextStream &ts, TemplateContext *c) + { + dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line); + //printf("TemplateNodeFor::render #loopNodes=%d #emptyNodes=%d\n", + // m_loopNodes.count(),m_emptyNodes.count()); + if (m_expr) + { + TemplateVariant v = m_expr->resolve(c); + const TemplateListIntf *list = v.toList(); + if (list) + { + uint listSize = list->count(); + if (listSize==0) // empty for loop + { + m_emptyNodes.render(ts,c); + return; + } + c->push(); + //int index = m_reversed ? list.count() : 0; + TemplateVariant v; + const TemplateVariant *parentLoop = c->getRef("forloop"); + uint index = m_reversed ? listSize-1 : 0; + TemplateListIntf::ConstIterator *it = list->createIterator(); + for (m_reversed ? it->toLast() : it->toFirst(); + (it->current(v)); + m_reversed ? it->toPrev() : it->toNext()) + { + TemplateStruct s; + s.set("counter0", (int)index); + s.set("counter", (int)(index+1)); + s.set("revcounter", (int)(listSize-index)); + s.set("revcounter0", (int)(listSize-index-1)); + s.set("first",index==0); + s.set("last", index==listSize-1); + s.set("parentloop",parentLoop ? *parentLoop : TemplateVariant()); + c->set("forloop",&s); + + // add variables for this loop to the context + //obj->addVariableToContext(index,m_vars,c); + uint vi=0; + if (m_vars.count()==1) // loop variable represents an item + { + c->set(m_vars[vi++],v); + } + else if (m_vars.count()>1 && v.type()==TemplateVariant::Struct) + // loop variables represent elements in a list item + { + for (uint i=0;i<m_vars.count();i++,vi++) + { + c->set(m_vars[vi],v.toStruct()->get(m_vars[vi])); + } + } + for (;vi<m_vars.count();vi++) + { + c->set(m_vars[vi],TemplateVariant()); + } + + // render all items for this iteration of the loop + m_loopNodes.render(ts,c); + + if (m_reversed) index--; else index++; + } + c->pop(); + delete it; + } + else // simple type... + { + warn(m_templateName,m_line,"for requires a variable of list type!"); + } + } + } + + private: + bool m_reversed; + ExprAst *m_expr; + QValueList<QCString> m_vars; + TemplateNodeList m_loopNodes; + TemplateNodeList m_emptyNodes; +}; + +//---------------------------------------------------------- + +/** @brief Class representing an 'markers' tag in a template */ +class TemplateNodeMsg : public TemplateNodeCreator<TemplateNodeMsg> +{ + public: + TemplateNodeMsg(TemplateParser *parser,TemplateNode *parent,int line,const QCString &) + : TemplateNodeCreator<TemplateNodeMsg>(parser,parent,line) + { + TRACE(("{TemplateNodeMsg()\n")); + QStrList stopAt; + stopAt.append("endmsg"); + parser->parse(this,line,stopAt,m_nodes); + parser->removeNextToken(); // skip over endmarkers + TRACE(("}TemplateNodeMsg()\n")); + } + void render(FTextStream &, TemplateContext *c) + { + TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c); + TemplateEscapeIntf *escIntf = ci->escapeIntf(); + ci->setEscapeIntf(0); // avoid escaping things we send to standard out + bool enable = ci->spacelessEnabled(); + ci->enableSpaceless(FALSE); + FTextStream ts(stdout); + m_nodes.render(ts,c); + ts << endl; + ci->setEscapeIntf(escIntf); + ci->enableSpaceless(enable); + } + private: + TemplateNodeList m_nodes; +}; + + +//---------------------------------------------------------- + +/** @brief Class representing a 'block' tag in a template */ +class TemplateNodeBlock : public TemplateNodeCreator<TemplateNodeBlock> +{ + public: + TemplateNodeBlock(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) + : TemplateNodeCreator<TemplateNodeBlock>(parser,parent,line) + { + TRACE(("{TemplateNodeBlock(%s)\n",data.data())); + m_blockName = data; + if (m_blockName.isEmpty()) + { + warn(parser->templateName(),line,"block tag without name"); + } + QStrList stopAt; + stopAt.append("endblock"); + parser->parse(this,line,stopAt,m_nodes); + parser->removeNextToken(); // skip over endblock + TRACE(("}TemplateNodeBlock(%s)\n",data.data())); + } + + void render(FTextStream &ts, TemplateContext *c) + { + TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c); + ci->setLocation(m_templateName,m_line); + TemplateImpl *t = getTemplate(); + if (t) + { + // remove block from the context, so block.super can work + TemplateNodeBlock *nb = ci->blockContext()->pop(m_blockName); + if (nb) // block is overruled + { + ci->push(); + QGString super; + FTextStream ss(&super); + // get super block of block nb + TemplateNodeBlock *sb = ci->blockContext()->get(m_blockName); + if (sb && sb!=nb && sb!=this) // nb and sb both overrule this block + { + sb->render(ss,c); // render parent of nb to string + } + else if (nb!=this) // only nb overrules this block + { + m_nodes.render(ss,c); // render parent of nb to string + } + // add 'block.super' variable to allow access to parent block content + TemplateStruct superBlock; + superBlock.set("super",TemplateVariant(super.data(),TRUE)); + ci->set("block",&superBlock); + // render the overruled block contents + nb->m_nodes.render(ts,c); + ci->pop(); + // re-add block to the context + ci->blockContext()->push(nb); + } + else // block has no overrule + { + m_nodes.render(ts,c); + } + } + } + + QCString name() const + { + return m_blockName; + } + + private: + QCString m_blockName; + TemplateNodeList m_nodes; +}; + +//---------------------------------------------------------- + +/** @brief Class representing a 'extend' tag in a template */ +class TemplateNodeExtend : public TemplateNodeCreator<TemplateNodeExtend> +{ + public: + TemplateNodeExtend(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) + : TemplateNodeCreator<TemplateNodeExtend>(parser,parent,line) + { + TRACE(("{TemplateNodeExtend(%s)\n",data.data())); + ExpressionParser ep(m_templateName,line); + if (data.isEmpty()) + { + warn(m_templateName,line,"extend tag is missing template file argument"); + } + m_extendExpr = ep.parsePrimary(data); + QStrList stopAt; + parser->parse(this,line,stopAt,m_nodes); + TRACE(("}TemplateNodeExtend(%s)\n",data.data())); + } + ~TemplateNodeExtend() + { + delete m_extendExpr; + } + + void render(FTextStream &ts, TemplateContext *c) + { + dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line); + if (m_extendExpr==0) return; + + QCString extendFile = m_extendExpr->resolve(c).toString(); + if (extendFile.isEmpty()) + { + warn(m_templateName,m_line,"invalid parameter for extend command"); + } + + // goto root of tree (template node) + TemplateImpl *t = getTemplate(); + if (t) + { + Template *bt = t->engine()->loadByName(extendFile); + TemplateImpl *baseTemplate = bt ? dynamic_cast<TemplateImpl*>(bt) : 0; + if (baseTemplate) + { + // fill block context + TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c); + TemplateBlockContext *bc = ci->blockContext(); + + // add overruling blocks to the context + QListIterator<TemplateNode> li(m_nodes); + TemplateNode *n; + for (li.toFirst();(n=li.current());++li) + { + TemplateNodeBlock *nb = dynamic_cast<TemplateNodeBlock*>(n); + if (nb) + { + bc->add(nb); + } + TemplateNodeMsg *msg = dynamic_cast<TemplateNodeMsg*>(n); + if (msg) + { + msg->render(ts,c); + } + } + + // render the base template with the given context + baseTemplate->render(ts,c); + + // clean up + bc->clear(); + //delete baseTemplate; + } + else + { + warn(m_templateName,m_line,"failed to load template %s for extend",extendFile.data()); + } + } + } + + private: + ExprAst *m_extendExpr; + TemplateNodeList m_nodes; +}; + +/** @brief Class representing an 'include' tag in a template */ +class TemplateNodeInclude : public TemplateNodeCreator<TemplateNodeInclude> +{ + public: + TemplateNodeInclude(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) + : TemplateNodeCreator<TemplateNodeInclude>(parser,parent,line) + { + TRACE(("TemplateNodeInclude(%s)\n",data.data())); + ExpressionParser ep(m_templateName,line); + if (data.isEmpty()) + { + warn(m_templateName,line,"include tag is missing template file argument"); + } + m_includeExpr = ep.parsePrimary(data); + } + ~TemplateNodeInclude() + { + delete m_includeExpr; + } + void render(FTextStream &ts, TemplateContext *c) + { + dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line); + if (m_includeExpr) + { + QCString includeFile = m_includeExpr->resolve(c).toString(); + if (includeFile.isEmpty()) + { + warn(m_templateName,m_line,"invalid parameter for include command\n"); + } + else + { + TemplateImpl *t = getTemplate(); + if (t) + { + Template *it = t->engine()->loadByName(includeFile); + TemplateImpl *incTemplate = it ? dynamic_cast<TemplateImpl*>(it) : 0; + if (incTemplate) + { + incTemplate->render(ts,c); + } + else + { + warn(m_templateName,m_line,"failed to load template '%s' for include",includeFile.data()?includeFile.data():""); + } + } + } + } + } + + private: + ExprAst *m_includeExpr; +}; + +//---------------------------------------------------------- + +/** @brief Class representing an 'create' tag in a template */ +class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate> +{ + public: + TemplateNodeCreate(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) + : TemplateNodeCreator<TemplateNodeCreate>(parser,parent,line) + { + TRACE(("TemplateNodeCreate(%s)\n",data.data())); + ExpressionParser ep(m_templateName,line); + if (data.isEmpty()) + { + warn(m_templateName,line,"create tag is missing arguments"); + } + int i = data.find(" from "); + if (i==-1) + { + if (data.right(3)==" from") + { + warn(m_templateName,line,"create is missing template name after 'from' keyword"); + } + else if (data=="from") + { + warn(m_templateName,line,"create needs a file name and a template name"); + } + else + { + warn(m_templateName,line,"create is missing 'from' keyword"); + } + } + else + { + ExpressionParser ep(m_templateName,line); + m_fileExpr = ep.parsePrimary(data.left(i).stripWhiteSpace()); + m_templateExpr = ep.parsePrimary(data.mid(i+6).stripWhiteSpace()); + } + } + ~TemplateNodeCreate() + { + delete m_templateExpr; + delete m_fileExpr; + } + void render(FTextStream &, TemplateContext *c) + { + TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c); + ci->setLocation(m_templateName,m_line); + if (m_templateExpr && m_fileExpr) + { + QCString templateFile = m_templateExpr->resolve(c).toString(); + QCString outputFile = m_fileExpr->resolve(c).toString(); + if (templateFile.isEmpty()) + { + warn(m_templateName,m_line,"empty template name parameter for create command\n"); + } + else if (outputFile.isEmpty()) + { + warn(m_templateName,m_line,"empty file name parameter for create command\n"); + } + else + { + TemplateImpl *t = getTemplate(); + if (t) + { + Template *ct = t->engine()->loadByName(templateFile); + TemplateImpl *createTemplate = ct ? dynamic_cast<TemplateImpl*>(ct) : 0; + if (createTemplate) + { + if (!ci->outputDirectory().isEmpty()) + { + outputFile.prepend(ci->outputDirectory()+"/"); + } + QFile f(outputFile); + if (f.open(IO_WriteOnly)) + { + FTextStream ts(&f); + createTemplate->render(ts,c); + //delete createTemplate; + } + else + { + warn(m_templateName,m_line,"failed to open output file '%s' for create command",outputFile.data()); + } + } + else + { + warn(m_templateName,m_line,"failed to load template '%s' for include",templateFile.data()); + } + } + } + } + } + + private: + ExprAst *m_templateExpr; + ExprAst *m_fileExpr; +}; + +//---------------------------------------------------------- + +/** @brief Class representing an 'tree' tag in a template */ +class TemplateNodeTree : public TemplateNodeCreator<TemplateNodeTree> +{ + struct TreeContext + { + TreeContext(TemplateNodeTree *o,const TemplateListIntf *l,TemplateContext *c) + : object(o), list(l), templateCtx(c) {} + TemplateNodeTree *object; + const TemplateListIntf *list; + TemplateContext *templateCtx; + }; + public: + TemplateNodeTree(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) + : TemplateNodeCreator<TemplateNodeTree>(parser,parent,line) + { + TRACE(("{TemplateNodeTree(%s)\n",data.data())); + ExpressionParser ep(m_templateName,line); + if (data.isEmpty()) + { + warn(m_templateName,line,"recursetree tag is missing data argument"); + } + m_treeExpr = ep.parsePrimary(data); + QStrList stopAt; + stopAt.append("endrecursetree"); + parser->parse(this,line,stopAt,m_treeNodes); + parser->removeNextToken(); // skip over endrecursetree + TRACE(("}TemplateNodeTree(%s)\n",data.data())); + } + ~TemplateNodeTree() + { + delete m_treeExpr; + } + static TemplateVariant renderChildrenStub(const void *ctx, const QValueList<TemplateVariant> &) + { + return TemplateVariant(((TreeContext*)ctx)->object-> + renderChildren((const TreeContext*)ctx),TRUE); + } + QCString renderChildren(const TreeContext *ctx) + { + //printf("TemplateNodeTree::renderChildren(%d)\n",ctx->list->count()); + // render all children of node to a string and return it + QGString result; + FTextStream ss(&result); + TemplateContext *c = ctx->templateCtx; + c->push(); + TemplateVariant node; + TemplateListIntf::ConstIterator *it = ctx->list->createIterator(); + for (it->toFirst();(it->current(node));it->toNext()) + { + c->set("node",node); + bool hasChildren=FALSE; + const TemplateStructIntf *ns = node.toStruct(); + if (ns) // node is a struct + { + TemplateVariant v = ns->get("children"); + if (v.isValid()) // with a field 'children' + { + const TemplateListIntf *list = v.toList(); + if (list && list->count()>0) // non-empty list + { + TreeContext childCtx(this,list,ctx->templateCtx); +// TemplateVariant children(&childCtx,renderChildrenStub); + TemplateVariant children(TemplateVariant::Delegate::fromFunction(&childCtx,renderChildrenStub)); + children.setRaw(TRUE); + c->set("children",children); + m_treeNodes.render(ss,c); + hasChildren=TRUE; + } + } + } + if (!hasChildren) + { + c->set("children",TemplateVariant("")); // provide default + m_treeNodes.render(ss,c); + } + } + c->pop(); + return result.data(); + } + void render(FTextStream &ts, TemplateContext *c) + { + //printf("TemplateNodeTree::render()\n"); + TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c); + ci->setLocation(m_templateName,m_line); + TemplateVariant v = m_treeExpr->resolve(c); + const TemplateListIntf *list = v.toList(); + if (list) + { + TreeContext ctx(this,list,c); + ts << renderChildren(&ctx); + } + else + { + warn(m_templateName,m_line,"recursetree's argument should be a list type"); + } + } + + private: + ExprAst *m_treeExpr; + TemplateNodeList m_treeNodes; +}; + +//---------------------------------------------------------- + +/** @brief Class representing an 'with' tag in a template */ +class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith> +{ + struct Mapping + { + Mapping(const QCString &n,ExprAst *e) : name(n), value(e) {} + ~Mapping() { delete value; } + QCString name; + ExprAst *value; + }; + public: + TemplateNodeWith(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) + : TemplateNodeCreator<TemplateNodeWith>(parser,parent,line) + { + TRACE(("{TemplateNodeWith(%s)\n",data.data())); + m_args.setAutoDelete(TRUE); + ExpressionParser expParser(parser->templateName(),line); + QValueList<QCString> args = split(data," "); + QValueListIterator<QCString> it = args.begin(); + while (it!=args.end()) + { + QCString arg = *it; + int j=arg.find('='); + if (j>0) + { + ExprAst *expr = expParser.parsePrimary(arg.mid(j+1)); + if (expr) + { + m_args.append(new Mapping(arg.left(j),expr)); + } + } + else + { + warn(parser->templateName(),line,"invalid argument '%s' for with tag",arg.data()); + } + ++it; + } + QStrList stopAt; + stopAt.append("endwith"); + parser->parse(this,line,stopAt,m_nodes); + parser->removeNextToken(); // skip over endwith + TRACE(("}TemplateNodeWith(%s)\n",data.data())); + } + ~TemplateNodeWith() + { + } + void render(FTextStream &ts, TemplateContext *c) + { + TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c); + c->push(); + QListIterator<Mapping> it(m_args); + Mapping *mapping; + for (it.toFirst();(mapping=it.current());++it) + { + TemplateVariant value = mapping->value->resolve(c); + ci->set(mapping->name,value); + } + m_nodes.render(ts,c); + c->pop(); + } + private: + TemplateNodeList m_nodes; + QList<Mapping> m_args; +}; + +//---------------------------------------------------------- + +/** @brief Class representing an 'set' tag in a template */ +class TemplateNodeCycle : public TemplateNodeCreator<TemplateNodeCycle> +{ + public: + TemplateNodeCycle(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) + : TemplateNodeCreator<TemplateNodeCycle>(parser,parent,line) + { + TRACE(("{TemplateNodeCycle(%s)\n",data.data())); + m_args.setAutoDelete(TRUE); + m_index=0; + ExpressionParser expParser(parser->templateName(),line); + QValueList<QCString> args = split(data," "); + QValueListIterator<QCString> it = args.begin(); + while (it!=args.end()) + { + ExprAst *expr = expParser.parsePrimary(*it); + if (expr) + { + m_args.append(expr); + } + ++it; + } + if (m_args.count()<2) + { + warn(parser->templateName(),line,"expected at least two arguments for cycle command, got %d",m_args.count()); + } + TRACE(("}TemplateNodeCycle(%s)\n",data.data())); + } + void render(FTextStream &ts, TemplateContext *c) + { + TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c); + if (m_index<m_args.count()) + { + TemplateVariant v = m_args.at(m_index)->resolve(c); + if (v.type()==TemplateVariant::Function) + { + v = v.call(QValueList<TemplateVariant>()); + } + if (ci->escapeIntf() && !v.raw()) + { + ts << ci->escapeIntf()->escape(v.toString()); + } + else + { + ts << v.toString(); + } + } + if (++m_index==m_args.count()) // wrap around + { + m_index=0; + } + } + private: + uint m_index; + QList<ExprAst> m_args; +}; + +//---------------------------------------------------------- + +/** @brief Class representing an 'set' tag in a template */ +class TemplateNodeSet : public TemplateNodeCreator<TemplateNodeSet> +{ + struct Mapping + { + Mapping(const QCString &n,ExprAst *e) : name(n), value(e) {} + ~Mapping() { delete value; } + QCString name; + ExprAst *value; + }; + public: + TemplateNodeSet(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) + : TemplateNodeCreator<TemplateNodeSet>(parser,parent,line) + { + TRACE(("{TemplateNodeSet(%s)\n",data.data())); + m_args.setAutoDelete(TRUE); + ExpressionParser expParser(parser->templateName(),line); + QValueList<QCString> args = split(data," "); + QValueListIterator<QCString> it = args.begin(); + while (it!=args.end()) + { + QCString arg = *it; + int j=arg.find('='); + if (j>0) + { + ExprAst *expr = expParser.parsePrimary(arg.mid(j+1)); + if (expr) + { + m_args.append(new Mapping(arg.left(j),expr)); + } + } + else + { + warn(parser->templateName(),line,"invalid argument '%s' for with tag",arg.data()); + } + ++it; + } + TRACE(("}TemplateNodeSet(%s)\n",data.data())); + } + void render(FTextStream &, TemplateContext *c) + { + TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c); + QListIterator<Mapping> it(m_args); + Mapping *mapping; + for (it.toFirst();(mapping=it.current());++it) + { + TemplateVariant value = mapping->value->resolve(c); + ci->set(mapping->name,value); + } + } + private: + QList<Mapping> m_args; +}; + +//---------------------------------------------------------- + +/** @brief Class representing an 'spaceless' tag in a template */ +class TemplateNodeSpaceless : public TemplateNodeCreator<TemplateNodeSpaceless> +{ + public: + TemplateNodeSpaceless(TemplateParser *parser,TemplateNode *parent,int line,const QCString &) + : TemplateNodeCreator<TemplateNodeSpaceless>(parser,parent,line) + { + TRACE(("{TemplateNodeSpaceless()\n")); + QStrList stopAt; + stopAt.append("endspaceless"); + parser->parse(this,line,stopAt,m_nodes); + parser->removeNextToken(); // skip over endwith + TRACE(("}TemplateNodeSpaceless()\n")); + } + void render(FTextStream &ts, TemplateContext *c) + { + TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c); + bool wasSpaceless = ci->spacelessEnabled(); + ci->enableSpaceless(TRUE); + m_nodes.render(ts,c); + ci->enableSpaceless(wasSpaceless); + } + private: + TemplateNodeList m_nodes; +}; + +//---------------------------------------------------------- + +/** @brief Class representing an 'markers' tag in a template */ +class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers> +{ + public: + TemplateNodeMarkers(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) + : TemplateNodeCreator<TemplateNodeMarkers>(parser,parent,line) + { + TRACE(("{TemplateNodeMarkers(%s)\n",data.data())); + int i = data.find(" in "); + int w = data.find(" with "); + if (i==-1 || w==-1 || w<i) + { + warn(m_templateName,line,"markers tag as wrong format. Expected: markers <var> in <list> with <string_with_markers>"); + } + else + { + ExpressionParser expParser(parser->templateName(),line); + m_var = data.left(i); + m_listExpr = expParser.parseVariable(data.mid(i+4,w-i-4)); + m_patternExpr = expParser.parseVariable(data.right(data.length()-w-6)); + } + QStrList stopAt; + stopAt.append("endmarkers"); + parser->parse(this,line,stopAt,m_nodes); + parser->removeNextToken(); // skip over endmarkers + TRACE(("}TemplateNodeMarkers(%s)\n",data.data())); + } + void render(FTextStream &ts, TemplateContext *c) + { + TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c); + ci->setLocation(m_templateName,m_line); + if (!m_var.isEmpty() && m_listExpr && m_patternExpr) + { + TemplateVariant v = m_listExpr->resolve(c); + const TemplateListIntf *list = v.toList(); + TemplateVariant patternStr = m_patternExpr->resolve(c); + if (list) + { + if (patternStr.type()==TemplateVariant::String) + { + TemplateListIntf::ConstIterator *it = list->createIterator(); + c->push(); + QCString str = patternStr.toString(); + QRegExp marker("@[0-9]+"); // pattern for a marker, i.e. @0, @1 ... @12, etc + int index=0,newIndex,matchLen; + while ((newIndex=marker.match(str,index,&matchLen))!=-1) + { + ts << str.mid(index,newIndex-index); // write text before marker + bool ok; + uint entryIndex = str.mid(newIndex+1,matchLen-1).toUInt(&ok); // get marker id + TemplateVariant var; + uint i=0; + // search for list element at position id + for (it->toFirst(); (it->current(var)) && i<entryIndex; it->toNext(),i++) {} + if (ok && i==entryIndex) // found element + { + TemplateStruct s; + s.set("id",(int)i); + c->set("markers",&s); + c->set(m_var,var); // define local variable to hold element of list type + bool wasSpaceless = ci->spacelessEnabled(); + ci->enableSpaceless(TRUE); + m_nodes.render(ts,c); + ci->enableSpaceless(wasSpaceless); + } + else if (!ok) + { + warn(m_templateName,m_line,"markers pattern string has invalid markers '%s'",str.data()); + } + else if (i<entryIndex) + { + warn(m_templateName,m_line,"markers list does not an element for marker position %d",i); + } + index=newIndex+matchLen; // set index just after marker + } + ts << str.right(str.length()-index); // write text after last marker + c->pop(); + } + else + { + warn(m_templateName,m_line,"markers requires a parameter of string type after 'with'!"); + } + } + else + { + warn(m_templateName,m_line,"markers requires a parameter of list type after 'in'!"); + } + } + } + private: + TemplateNodeList m_nodes; + QCString m_var; + ExprAst *m_listExpr; + ExprAst *m_patternExpr; +}; + +//---------------------------------------------------------- + +/** @brief Factory class for creating tag AST nodes found in a template */ +class TemplateNodeFactory +{ + public: + typedef TemplateNode *(*CreateFunc)(TemplateParser *parser, + TemplateNode *parent, + int line, + const QCString &data); + + static TemplateNodeFactory *instance() + { + static TemplateNodeFactory *instance = 0; + if (instance==0) instance = new TemplateNodeFactory; + return instance; + } + + TemplateNode *create(const QCString &name, + TemplateParser *parser, + TemplateNode *parent, + int line, + const QCString &data) + { + if (m_registry.find(name)==0) return 0; + return ((CreateFunc)m_registry[name])(parser,parent,line,data); + } + + void registerTemplateNode(const QCString &name,CreateFunc func) + { + m_registry.insert(name,(void*)func); + } + + /** @brief Helper class for registering a template AST node */ + template<class T> class AutoRegister + { + public: + AutoRegister<T>(const QCString &key) + { + TemplateNodeFactory::instance()->registerTemplateNode(key,T::createInstance); + } + }; + + private: + QDict<void> m_registry; +}; + +// register a handler for each start tag we support +static TemplateNodeFactory::AutoRegister<TemplateNodeIf> autoRefIf("if"); +static TemplateNodeFactory::AutoRegister<TemplateNodeFor> autoRefFor("for"); +static TemplateNodeFactory::AutoRegister<TemplateNodeMsg> autoRefMsg("msg"); +static TemplateNodeFactory::AutoRegister<TemplateNodeSet> autoRefSet("set"); +static TemplateNodeFactory::AutoRegister<TemplateNodeTree> autoRefTree("recursetree"); +static TemplateNodeFactory::AutoRegister<TemplateNodeWith> autoRefWith("with"); +static TemplateNodeFactory::AutoRegister<TemplateNodeBlock> autoRefBlock("block"); +static TemplateNodeFactory::AutoRegister<TemplateNodeCycle> autoRefCycle("cycle"); +static TemplateNodeFactory::AutoRegister<TemplateNodeExtend> autoRefExtend("extend"); +static TemplateNodeFactory::AutoRegister<TemplateNodeCreate> autoRefCreate("create"); +static TemplateNodeFactory::AutoRegister<TemplateNodeRepeat> autoRefRepeat("repeat"); +static TemplateNodeFactory::AutoRegister<TemplateNodeInclude> autoRefInclude("include"); +static TemplateNodeFactory::AutoRegister<TemplateNodeMarkers> autoRefMarkers("markers"); +static TemplateNodeFactory::AutoRegister<TemplateNodeSpaceless> autoRefSpaceless("spaceless"); + +//---------------------------------------------------------- + +TemplateBlockContext::TemplateBlockContext() : m_blocks(257) +{ + m_blocks.setAutoDelete(TRUE); +} + +TemplateNodeBlock *TemplateBlockContext::get(const QCString &name) const +{ + QList<TemplateNodeBlock> *list = m_blocks.find(name); + if (list==0 || list->count()==0) + { + return 0; + } + else + { + return list->getLast(); + } +} + +TemplateNodeBlock *TemplateBlockContext::pop(const QCString &name) const +{ + QList<TemplateNodeBlock> *list = m_blocks.find(name); + if (list==0 || list->count()==0) + { + return 0; + } + else + { + return list->take(list->count()-1); + } +} + +void TemplateBlockContext::add(TemplateNodeBlock *block) +{ + QList<TemplateNodeBlock> *list = m_blocks.find(block->name()); + if (list==0) + { + list = new QList<TemplateNodeBlock>; + m_blocks.insert(block->name(),list); + } + list->prepend(block); +} + +void TemplateBlockContext::add(TemplateBlockContext *ctx) +{ + QDictIterator< QList<TemplateNodeBlock> > di(ctx->m_blocks); + QList<TemplateNodeBlock> *list; + for (di.toFirst();(list=di.current());++di) + { + QListIterator<TemplateNodeBlock> li(*list); + TemplateNodeBlock *nb; + for (li.toFirst();(nb=li.current());++li) + { + add(nb); + } + } +} + +void TemplateBlockContext::clear() +{ + m_blocks.clear(); +} + +void TemplateBlockContext::push(TemplateNodeBlock *block) +{ + QList<TemplateNodeBlock> *list = m_blocks.find(block->name()); + if (list==0) + { + list = new QList<TemplateNodeBlock>; + m_blocks.insert(block->name(),list); + } + list->append(block); +} + + +//---------------------------------------------------------- + +/** @brief Lexer class for turning a template into a list of tokens */ +class TemplateLexer +{ + public: + TemplateLexer(const QCString &fileName,const QCString &data); + void tokenize(QList<TemplateToken> &tokens); + private: + void addToken(QList<TemplateToken> &tokens, + const char *data,int line,int startPos,int endPos, + TemplateToken::Type type); + void reset(); + QCString m_fileName; + QCString m_data; +}; + +TemplateLexer::TemplateLexer(const QCString &fileName,const QCString &data) : + m_fileName(fileName), m_data(data) +{ +} + +void TemplateLexer::tokenize(QList<TemplateToken> &tokens) +{ + enum LexerStates + { + StateText, + StateBeginTemplate, + StateTag, + StateEndTag, + StateComment, + StateEndComment, + StateMaybeVar, + StateVariable, + StateEndVariable + }; + + const char *p=m_data.data(); + int state=StateText; + int pos=0; + int lastTokenPos=0; + int startLinePos=0; + bool emptyOutputLine=TRUE; + int line=1; + char c; + int markStartPos=-1; + for (;(c=*p);p++,pos++) + { + switch (state) + { + case StateText: + if (c=='{') // {{ or {% or {# or something else + { + state=StateBeginTemplate; + } + else if (c!=' ' && c!='\t' && c!='\n') // non-whitepace text + { + emptyOutputLine=FALSE; + } + break; + case StateBeginTemplate: + switch (c) + { + case '%': // {% + state=StateTag; + markStartPos=pos-1; + break; + case '#': // {# + state=StateComment; + markStartPos=pos-1; + break; + case '{': // {{ + state=StateMaybeVar; + markStartPos=pos-1; + break; + default: + state=StateText; + emptyOutputLine=FALSE; + break; + } + break; + case StateTag: + if (c=='\n') + { + warn(m_fileName,line,"unexpected new line inside {%%...%%} block"); + } + else if (c=='%') // %} or something else + { + state=StateEndTag; + } + break; + case StateEndTag: + if (c=='}') // %} + { + // found tag! + state=StateText; + addToken(tokens,m_data.data(),line,lastTokenPos, + emptyOutputLine ? startLinePos : markStartPos, + TemplateToken::Text); + addToken(tokens,m_data.data(),line,markStartPos+2, + pos-1,TemplateToken::Block); + lastTokenPos = pos+1; + } + else // something else + { + if (c=='\n') + { + warn(m_fileName,line,"unexpected new line inside {%%...%%} block"); + } + state=StateTag; + } + break; + case StateComment: + if (c=='\n') + { + warn(m_fileName,line,"unexpected new line inside {#...#} block"); + } + else if (c=='#') // #} or something else + { + state=StateEndComment; + } + break; + case StateEndComment: + if (c=='}') // #} + { + // found comment tag! + state=StateText; + addToken(tokens,m_data.data(),line,lastTokenPos, + emptyOutputLine ? startLinePos : markStartPos, + TemplateToken::Text); + lastTokenPos = pos+1; + } + else // something else + { + if (c=='\n') + { + warn(m_fileName,line,"unexpected new line inside {#...#} block"); + } + state=StateComment; + } + break; + case StateMaybeVar: + switch (c) + { + case '#': // {{# + state=StateComment; + markStartPos=pos-1; + break; + case '%': // {{% + state=StateTag; + markStartPos=pos-1; + break; + default: // {{ + state=StateVariable; + break; + } + break; + case StateVariable: + if (c=='\n') + { + warn(m_fileName,line,"unexpected new line inside {{...}} block"); + } + else if (c=='}') // }} or something else + { + state=StateEndVariable; + } + break; + case StateEndVariable: + if (c=='}') // }} + { + // found variable tag! + state=StateText; + addToken(tokens,m_data.data(),line,lastTokenPos, + emptyOutputLine ? startLinePos : markStartPos, + TemplateToken::Text); + addToken(tokens,m_data.data(),line,markStartPos+2, + pos-1,TemplateToken::Variable); + lastTokenPos = pos+1; + } + else // something else + { + if (c=='\n') + { + warn(m_fileName,line,"unexpected new line inside {{...}} block"); + } + state=StateVariable; + } + break; + } + if (c=='\n') // new line + { + state=StateText; + startLinePos=pos+1; + // if the current line only contain commands and whitespace, + // then skip it in the output by moving lastTokenPos + if (markStartPos!=-1 && emptyOutputLine) lastTokenPos = startLinePos; + // reset markers + markStartPos=-1; + line++; + emptyOutputLine=TRUE; + } + } + if (lastTokenPos<pos) + { + addToken(tokens,m_data.data(),line, + lastTokenPos,pos, + TemplateToken::Text); + } +} + +void TemplateLexer::addToken(QList<TemplateToken> &tokens, + const char *data,int line, + int startPos,int endPos, + TemplateToken::Type type) +{ + if (startPos<endPos) + { + int len = endPos-startPos+1; + QCString text(len+1); + qstrncpy(text.data(),data+startPos,len); + text[len]='\0'; + if (type!=TemplateToken::Text) text = text.stripWhiteSpace(); + tokens.append(new TemplateToken(type,text,line)); + } +} + +//---------------------------------------------------------- + +TemplateParser::TemplateParser(const QCString &templateName, + QList<TemplateToken> &tokens) : + m_templateName(templateName), m_tokens(tokens) +{ +} + +void TemplateParser::parse( + TemplateNode *parent,int line,const QStrList &stopAt, + QList<TemplateNode> &nodes) +{ + TRACE(("{TemplateParser::parse\n")); + // process the tokens. Build node list + while (hasNextToken()) + { + TemplateToken *tok = takeNextToken(); + //printf("%p:Token type=%d data='%s' line=%d\n", + // parent,tok->type,tok->data.data(),tok->line); + switch(tok->type) + { + case TemplateToken::Text: + nodes.append(new TemplateNodeText(this,parent,tok->line,tok->data)); + break; + case TemplateToken::Variable: + nodes.append(new TemplateNodeVariable(this,parent,tok->line,tok->data)); + break; + case TemplateToken::Block: + { + QCString command = tok->data; + int sep = command.find(' '); + if (sep!=-1) + { + command=command.left(sep); + } + if (stopAt.contains(command)) + { + prependToken(tok); + TRACE(("}TemplateParser::parse: stop\n")); + return; + } + QCString arg; + if (sep!=-1) + { + arg = tok->data.mid(sep+1); + } + TemplateNode *node = TemplateNodeFactory::instance()-> + create(command,this,parent,tok->line,arg); + if (node) + { + nodes.append(node); + } + else if (command=="empty" || command=="else" || + command=="endif" || command=="endfor" || + command=="endblock" || command=="endwith" || + command=="endrecursetree" || command=="endspaceless" || + command=="endmarkers" || command=="endmsg" || + command=="endrepeat") + { + warn(m_templateName,tok->line,"Found tag '%s' without matching start tag",command.data()); + } + else + { + warn(m_templateName,tok->line,"Unknown tag '%s'",command.data()); + } + } + break; + } + delete tok; + } + if (!stopAt.isEmpty()) + { + QStrListIterator it(stopAt); + const char *s; + QCString options; + for (it.toFirst();(s=it.current());++it) + { + if (!options.isEmpty()) options+=", "; + options+=s; + } + warn(m_templateName,line,"Unclosed tag in template, expected one of: %s", + options.data()); + } + TRACE(("}TemplateParser::parse: last token\n")); +} + +bool TemplateParser::hasNextToken() const +{ + return !m_tokens.isEmpty(); +} + +TemplateToken *TemplateParser::takeNextToken() +{ + return m_tokens.take(0); +} + +const TemplateToken *TemplateParser::currentToken() const +{ + return m_tokens.first(); +}; + +void TemplateParser::removeNextToken() +{ + m_tokens.removeFirst(); +} + +void TemplateParser::prependToken(const TemplateToken *token) +{ + m_tokens.prepend(token); +} + + + +//---------------------------------------------------------- + + +TemplateImpl::TemplateImpl(TemplateEngine *engine,const QCString &name,const QCString &data) + : TemplateNode(0) +{ + m_name = name; + m_engine = engine; + TemplateLexer lexer(name,data); + QList<TemplateToken> tokens; + tokens.setAutoDelete(TRUE); + lexer.tokenize(tokens); + TemplateParser parser(name,tokens); + parser.parse(this,1,QStrList(),m_nodes); +} + +void TemplateImpl::render(FTextStream &ts, TemplateContext *c) +{ + if (!m_nodes.isEmpty()) + { + TemplateNodeExtend *ne = dynamic_cast<TemplateNodeExtend*>(m_nodes.getFirst()); + if (ne==0) // normal template, add blocks to block context + { + TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c); + TemplateBlockContext *bc = ci->blockContext(); + QListIterator<TemplateNode> li(m_nodes); + TemplateNode *n; + for (li.toFirst();(n=li.current());++li) + { + TemplateNodeBlock *nb = dynamic_cast<TemplateNodeBlock*>(n); + if (nb) + { + bc->add(nb); + } + } + } + m_nodes.render(ts,c); + } +} + +//---------------------------------------------------------- + +/** @brief Private data of the template engine */ +class TemplateEngine::Private +{ + public: + Private(TemplateEngine *engine) : m_templateCache(17), m_engine(engine) + { m_templateCache.setAutoDelete(TRUE); } + Template *loadByName(const QCString &fileName) const + { + Template *templ = m_templateCache.find(fileName); + if (templ==0) + { + QFile f(fileName); + if (f.open(IO_ReadOnly)) + { + uint size=f.size(); + char *data = new char[size+1]; + if (data) + { + data[size]=0; + if (f.readBlock(data,f.size())) + { + templ = new TemplateImpl(m_engine,fileName,data); + m_templateCache.insert(fileName,templ); + } + delete[] data; + } + } + else + { + err("Cound not open template file %s\n",fileName.data()); + } + } + return templ; + } + + private: + mutable QDict<Template> m_templateCache; + TemplateEngine *m_engine; +}; + +TemplateEngine::TemplateEngine() +{ + p = new Private(this); +} + +TemplateEngine::~TemplateEngine() +{ + delete p; +} + +TemplateContext *TemplateEngine::createContext() const +{ + return new TemplateContextImpl; +} + +Template *TemplateEngine::loadByName(const QCString &fileName) +{ + return p->loadByName(fileName); +} + diff --git a/src/template.h b/src/template.h new file mode 100644 index 0000000..9e3b106 --- /dev/null +++ b/src/template.h @@ -0,0 +1,460 @@ +#ifndef TEMPLATE_H +#define TEMPLATE_H + +#include <qcstring.h> +#include <qvaluelist.h> + +class FTextStream; + +class TemplateListIntf; +class TemplateStructIntf; +class TemplateEngine; + +/** @defgroup template_api Template API + * + * This is the API for a + * <a href="https://docs.djangoproject.com/en/1.6/topics/templates/">Django</a> + * compatible template system written in C++. + * It is somewhat inspired by Stephen Kelly's + * <a href="http://www.gitorious.org/grantlee/pages/Home">Grantlee</a>. + * + * A template is simply a text file. + * A template contains \b variables, which get replaced with values when the + * template is evaluated, and \b tags, which control the logic of the template. + * + * Variables look like this: `{{ variable }}` + * When the template engine encounters a variable, it evaluates that variable and + * replaces it with the result. Variable names consist of any combination of + * alphanumeric characters and the underscore ("_"). + * Use a dot (.) to access attributes of a structured variable. + * + * One can modify variables for display by using \b filters, for example: + * `{{ value|default:"nothing" }}` + * + * Tags look like this: `{% tag %}`. Tags are more complex than variables: + * Some create text in the output, some control flow by performing loops or logic, + * and some load external information into the template to be used by later variables. + * + * To comment-out part of a line in a template, use the comment syntax: + * `{# comment text #}`. + * + * Supported Django tags: + * - `for ... empty ... endfor` + * - `if ... else ... endif` + * - `block ... endblock` + * - `extend` + * - `include` + * - `with ... endwith` + * - `spaceless ... endspaceless` + * - `cycle` + * + * Extension tags: + * - `create` which instantiates a template and writes the result to a file. + * The syntax is `{% create 'filename' from 'template' %}`. + * - `recursetree` + * - `markers` + * - `msg` ... `endmsg` + * - `set` + * + * Supported Django filters: + * - `default` + * - `length` + * - `add` + * - `divisibleby` + * + * Extension filters: + * - `stripPath` + * - `nowrap` + * - `prepend` + * - `append` + * + * @{ + */ + +/** @brief Variant type which can hold one value of a fixed set of types. */ +class TemplateVariant +{ + public: + /** @brief Helper class to create a delegate that can store a function/method call. */ + class Delegate + { + public: + /** Callback type to use when creating a delegate from a function. */ + typedef TemplateVariant (*StubType)(const void *obj, const QValueList<TemplateVariant> &args); + + Delegate() : m_objectPtr(0) , m_stubPtr(0) {} + + /** Creates a delegate given an object. The method to call is passed as a template parameter */ + template <class T, TemplateVariant (T::*TMethod)(const QValueList<TemplateVariant> &) const> + static Delegate fromMethod(const T* objectPtr) + { + Delegate d; + d.m_objectPtr = objectPtr; + d.m_stubPtr = &methodStub<T, TMethod>; + return d; + } + /** Creates a delegate given an object, and a plain function. */ + static Delegate fromFunction(const void *obj,StubType func) + { + Delegate d; + d.m_objectPtr = obj; + d.m_stubPtr = func; + return d; + } + + /** Invokes the function/method stored in the delegate */ + TemplateVariant operator()(const QValueList<TemplateVariant> &args) const + { + return (*m_stubPtr)(m_objectPtr, args); + } + + private: + const void* m_objectPtr; + StubType m_stubPtr; + + template <class T, TemplateVariant (T::*TMethod)(const QValueList<TemplateVariant> &) const> + static TemplateVariant methodStub(const void* objectPtr, const QValueList<TemplateVariant> &args) + { + T* p = (T*)(objectPtr); + return (p->*TMethod)(args); + } + }; + + /** Types of data that can be stored in a TemplateVariant */ + enum Type { None, Bool, Integer, String, Struct, List, Function }; + + /** Returns the type of the value stored in the variant */ + Type type() const; + + /** Returns TRUE if the variant holds a valid value, or FALSE otherwise */ + bool isValid() const; + + /** Constructs an invalid variant. */ + TemplateVariant(); + + /** Constructs a new variant with a boolean value \a b. */ + explicit TemplateVariant(bool b); + + /** Constructs a new variant with a integer value \a v. */ + TemplateVariant(int v); + + /** Constructs a new variant with a string value \a s. */ + TemplateVariant(const char *s,bool raw=FALSE); + + /** Constructs a new variant with a string value \a s. */ + TemplateVariant(const QCString &s,bool raw=FALSE); + + /** Constructs a new variant with a struct value \a s. + * @note. Only a pointer to the struct is stored. The caller + * is responsible to manage the memory for the struct object. + */ + TemplateVariant(const TemplateStructIntf *s); + + /** Constructs a new variant with a list value \a l. + * @note. Only a pointer to the struct is stored. The caller + * is responsible to manage the memory for the list object. + */ + TemplateVariant(const TemplateListIntf *l); + + /** Constructs a new variant which represents a method call + * @param[in] delegate Delegate object to invoke when + * calling call() on this variant. + * @note Use TemplateVariant::Delegate::fromMethod() and + * TemplateVariant::Delegate::fromFunction() to create + * Delegate objects. + */ + TemplateVariant(const Delegate &delegate); + + /** Destroys the Variant object */ + ~TemplateVariant(); + + /** Constructs a copy of the variant, \a v, + * passed as the argument to this constructor. + */ + TemplateVariant(const TemplateVariant &v); + + /** Assigns the value of the variant \a v to this variant. */ + TemplateVariant &operator=(const TemplateVariant &v); + + /** Compares this QVariant with v and returns true if they are equal; + * otherwise returns false. + */ + bool operator==(TemplateVariant &other); + + /** Returns the variant as a string. */ + QCString toString() const; + + /** Returns the variant as a boolean. */ + bool toBool() const; + + /** Returns the variant as an integer. */ + int toInt() const; + + /** Returns the pointer to list referenced by this variant + * or 0 if this variant does not have list type. + */ + const TemplateListIntf *toList() const; + + /** Returns the pointer to struct referenced by this variant + * or 0 if this variant does not have struct type. + */ + const TemplateStructIntf *toStruct() const; + + /** Return the result of apply this function with \a args. + * Returns an empty string if the variant type is not a function. + */ + TemplateVariant call(const QValueList<TemplateVariant> &args); + + /** Sets whether or not the value of the Variant should be + * escaped or written as-is (raw). + * @param[in] b TRUE means write as-is, FALSE means apply escaping. + */ + void setRaw(bool b); + + /** Returns whether or not the value of the Value is raw. + * @see setRaw() + */ + bool raw() const; + + private: + class Private; + Private *p; +}; + +//------------------------------------------------------------------------ + +/** @brief Abstract read-only interface for a context value of type list. + * @note The values of the list are TemplateVariants. + */ +class TemplateListIntf +{ + public: + /** @brief Abstract interface for a iterator of a list. */ + class ConstIterator + { + public: + /** Destructor for the iterator */ + virtual ~ConstIterator() {} + /** Moves iterator to the first element in the list */ + virtual void toFirst() = 0; + /** Moves iterator to the last element in the list */ + virtual void toLast() = 0; + /** Moves iterator to the next element in the list */ + virtual void toNext() = 0; + /** Moves iterator to the previous element in the list */ + virtual void toPrev() = 0; + /* Returns TRUE if the iterator points to a valid element + * in the list, or FALSE otherwise. + * If TRUE is returned, the value pointed to be the + * iterator is assigned to \a v. + */ + virtual bool current(TemplateVariant &v) const = 0; + }; + + /** Destroys the list */ + virtual ~TemplateListIntf() {} + + /** Returns the number of elements in the list */ + virtual int count() const = 0; + + /** Returns the element at index position \a index. */ + virtual TemplateVariant at(int index) const = 0; + + /** Creates a new iterator for this list. + * @note the user should call delete on the returned pointer. + */ + virtual TemplateListIntf::ConstIterator *createIterator() const = 0; +}; + +/** @brief Default implementation of a context value of type list. */ +class TemplateList : public TemplateListIntf +{ + public: + /** Creates a list */ + TemplateList(); + /** Destroys the list */ + ~TemplateList(); + + // TemplateListIntf methods + virtual int count() const; + virtual TemplateVariant at(int index) const; + virtual TemplateListIntf::ConstIterator *createIterator() const; + + /** Appends element \a v to the end of the list */ + virtual void append(const TemplateVariant &v); + + private: + friend class TemplateListConstIterator; + class Private; + Private *p; +}; + +//------------------------------------------------------------------------ + +/** @brief Abstract interface for a context value of type struct. */ +class TemplateStructIntf +{ + public: + /** Destroys the struct */ + virtual ~TemplateStructIntf() {} + + /** Gets the value for a field name. + * @param[in] name The name of the field. + */ + virtual TemplateVariant get(const char *name) const = 0; +}; + + +/** @brief Default implementation of a context value of type struct. */ +class TemplateStruct : public TemplateStructIntf +{ + public: + /** Creates a struct */ + TemplateStruct(); + /** Destroys the struct */ + virtual ~TemplateStruct(); + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + + /** Sets the value the field of a struct + * @param[in] name The name of the field. + * @param[in] v The value to set. + */ + virtual void set(const char *name,const TemplateVariant &v); + + private: + class Private; + Private *p; +}; + +//------------------------------------------------------------------------ + +/** @brief Interface used to escape characters in a string */ +class TemplateEscapeIntf +{ + public: + /** Returns the \a input after escaping certain characters */ + virtual QCString escape(const QCString &input) = 0; +}; + +//------------------------------------------------------------------------ + +/** @brief Interface used to remove redundant spaces inside a spaceless block */ +class TemplateSpacelessIntf +{ + public: + /** Returns the \a input after removing redundant whitespace */ + virtual QCString remove(const QCString &input) = 0; +}; + +//------------------------------------------------------------------------ + +/** @brief Abstract interface for a template context. + * + * A Context consists of a stack of dictionaries. + * A dictionary consists of a mapping of string keys onto TemplateVariant values. + * A key is searched starting with the dictionary at the top of the stack + * and searching downwards until it is found. The stack is used to create + * local scopes. + * @note This object must be created by TemplateEngine + */ +class TemplateContext +{ + public: + virtual ~TemplateContext() {} + + /** Push a new scope on the stack. */ + virtual void push() = 0; + + /** Pop the current scope from the stack. */ + virtual void pop() = 0; + + /** Sets a value in the current scope. + * @param[in] name The name of the value; the key in the dictionary. + * @param[in] v The value associated with the key. + * @note When a given key is already present, + * its value will be replaced by \a v + */ + virtual void set(const char *name,const TemplateVariant &v) = 0; + + /** Gets the value for a given key + * @param[in] name The name of key. + * @returns The value, which can be an invalid variant in case the + * key was not found. + */ + virtual TemplateVariant get(const QCString &name) const = 0; + + /** Returns a pointer to the value corresponding to a given key. + * @param[in] name The name of key. + * @returns A pointer to the value, or 0 in case the key was not found. + */ + virtual const TemplateVariant *getRef(const QCString &name) const = 0; + + /** When files are create (i.e. by {% create ... %}) they written + * to the directory \a dir. + */ + virtual void setOutputDirectory(const QCString &dir) = 0; + + /** Sets the interface that will be used for escaping the result + * of variable expansion before writing it to the output. + */ + virtual void setEscapeIntf(TemplateEscapeIntf *intf) = 0; + + /** Sets the interface that will be used inside a spaceless block + * to remove any redundant whitespace. + */ + virtual void setSpacelessIntf(TemplateSpacelessIntf *intf) = 0; +}; + +//------------------------------------------------------------------------ + +/** @brief Abstract interface for a template. + * @note Must be created by TemplateEngine + */ +class Template +{ + public: + /** Destructor */ + virtual ~Template() {} + + /** Renders a template instance to a stream. + * @param[in] ts The text stream to write the results to. + * @param[in] c The context containing data that can be used + * when instantiating the template. + */ + virtual void render(FTextStream &ts,TemplateContext *c) = 0; +}; + +//------------------------------------------------------------------------ + +/** @brief Engine to create templates and template contexts. */ +class TemplateEngine +{ + public: + /** Create a template engine. */ + TemplateEngine(); + + /** Destroys the template engine. */ + ~TemplateEngine(); + + /** Creates a new context that can be using to render a template. + * @see Template::render() + */ + TemplateContext *createContext() const; + + /** Creates a new template whole contents are in a file. + * @param[in] fileName The name of the file containing the + * template data + * @return the new template, the caller will be the owner. + */ + Template *loadByName(const QCString &fileName); + + private: + class Private; + Private *p; +}; + +/** @} */ + +#endif diff --git a/src/textdocvisitor.h b/src/textdocvisitor.h index 81fd9e8..9045d21 100644 --- a/src/textdocvisitor.h +++ b/src/textdocvisitor.h @@ -106,6 +106,8 @@ class TextDocVisitor : public DocVisitor void visitPre(DocMscFile *) {} void visitPost(DocMscFile *) {} + void visitPre(DocDiaFile *) {} + void visitPost(DocDiaFile *) {} void visitPre(DocLink *) {} void visitPost(DocLink *) {} void visitPre(DocRef *) {} @@ -130,6 +132,8 @@ class TextDocVisitor : public DocVisitor void visitPost(DocHtmlBlockQuote *) {} void visitPre(DocVhdlFlow *) {} void visitPost(DocVhdlFlow *) {} + void visitPre(DocParBlock *) {} + void visitPost(DocParBlock *) {} private: diff --git a/src/to_c_cmd.py b/src/to_c_cmd.py new file mode 100755 index 0000000..52785f1 --- /dev/null +++ b/src/to_c_cmd.py @@ -0,0 +1,8 @@ +# place " at begin of each line +# escape existing '\' and '"' +# remove \n at the end of the line (sometimes the last line does not have a \n +# so we cannot do a replacement with some other text) +# place an escaped \n and " at the end of each line +import sys +for line in sys.stdin: + sys.stdout.write('"' + line.replace('\\','\\\\').replace('"','\\"').replace('\n','') + '\\n"\n') diff --git a/src/translator_br.h b/src/translator_br.h index b136f59..f9dba84 100644 --- a/src/translator_br.h +++ b/src/translator_br.h @@ -49,7 +49,7 @@ class TranslatorBrazilian : public TranslatorAdapter_1_8_0 */ virtual QCString idLanguage() { - return "brazil"; + return "brazilian"; } /*! Used to get the command(s) for the language support. This method diff --git a/src/translator_en.h b/src/translator_en.h index cb933df..0535b6b 100644 --- a/src/translator_en.h +++ b/src/translator_en.h @@ -1825,7 +1825,7 @@ class TranslatorEnglish : public Translator /*! Header for the page with bibliographic citations */ virtual QCString trCiteReferences() - { return "Bibliographic References"; } + { return "Bibliography"; } /*! Text for copyright paragraph */ virtual QCString trCopyright() diff --git a/src/translator_fa.h b/src/translator_fa.h index b9bbe14..bcc0572 100644 --- a/src/translator_fa.h +++ b/src/translator_fa.h @@ -35,7 +35,7 @@ #define TRANSLATOR_FA_H #define HtmlRightToLeft QCString("<div dir=\"rtl\">") -#define HtmlLeftToRight QCString("<div dir=\"rtl\">") +#define HtmlLeftToRight QCString("<div dir=\"ltr\">") #define HtmlDivEnd QCString("</div>") diff --git a/src/translator_fr.h b/src/translator_fr.h index 45ff252..28468e7 100644 --- a/src/translator_fr.h +++ b/src/translator_fr.h @@ -1076,9 +1076,8 @@ class TranslatorFrench : public Translator " Used *m_usedClass;\n" "};\n" "\\endcode\n" - "Si la valeur 240 est attribuĂŠe au tag \\c MAX_DOT_GRAPH_HEIGHT " - "du fichier de configuration, cela gĂŠnèrera le graphe suivant :" - "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n" + "Cela aboutira au graphe suivant :" + "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center></p>\n" "<p>\n" "Les rectangles du graphe ci-dessus ont la signification suivante :\n" "<ul>\n" @@ -1870,7 +1869,7 @@ class TranslatorFrench : public Translator static const char *days[] = { "Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche" }; static const char *months[] = { "Janvier","FĂŠvrier","Mars","Avril","Mai","Juin","Juillet","AoĂťt","Septembre","Octobre","Novembre","DĂŠcembre" }; QCString sdate; - sdate.sprintf("%s %s %d %d",days[dayOfWeek-1],months[month-1],day,year); + sdate.sprintf("%s %d %s %d",days[dayOfWeek-1],day,months[month-1],year); if (includeTime) { QCString stime; @@ -1903,37 +1902,37 @@ class TranslatorFrench : public Translator /*! Detail level selector shown for hierarchical indices */ virtual QCString trDetailLevel() - { return "detail level"; } + { return "Niveau de dĂŠtails"; } /*! Section header for list of template parameters */ virtual QCString trTemplateParameters() - { return "Template Parameters"; } + { return "Paramètres du template"; } /*! Used in dot graph when UML_LOOK is enabled and there are many fields */ virtual QCString trAndMore(const QCString &number) - { return "and "+number+" more..."; } + { return "et "+number+" de plus..."; } /*! Used file list for a Java enum */ virtual QCString trEnumGeneratedFromFiles(bool single) - { QCString result = "The documentation for this enum was generated from the following file"; - if (!single) result += "s"; - result+=":"; + { QCString result = "La documentation pour cette ĂŠnumĂŠration a ĂŠtĂŠ gĂŠnĂŠrĂŠe Ă partir "; + if (!single) result += "du fichier suivant"; else result += "des fichiers suivants"; + result+=" :"; return result; } /*! Header of a Java enum page (Java enums are represented as classes). */ virtual QCString trEnumReference(const char *name) - { return QCString(name)+" Enum Reference"; } + { return QCString(name)+" RĂŠfĂŠrence de l'ĂŠnumĂŠration"; } /*! Used for a section containing inherited members */ virtual QCString trInheritedFrom(const char *members,const char *what) - { return QCString(members)+" inherited from "+what; } + { return QCString(members)+" hĂŠritĂŠs de "+what; } /*! Header of the sections with inherited members specific for the * base class(es) */ virtual QCString trAdditionalInheritedMembers() - { return "Additional Inherited Members"; } + { return "Membres hĂŠritĂŠs additionnels"; } ////////////////////////////////////////////////////////////////////////// // new since 1.8.2 @@ -1945,8 +1944,8 @@ class TranslatorFrench : public Translator */ virtual QCString trPanelSynchronisationTooltip(bool enable) { - QCString opt = enable ? "enable" : "disable"; - return "click to "+opt+" panel synchronisation"; + QCString opt = enable ? "activer" : "dĂŠsactiver"; + return "cliquez pour "+opt+" la synchronisation du panel"; } /*! Used in a method of an Objective-C class that is declared in a @@ -1955,7 +1954,7 @@ class TranslatorFrench : public Translator */ virtual QCString trProvidedByCategory() { - return "Provided by category @1."; + return "DĂŠclarĂŠe dans la catĂŠgorie @1."; } /*! Used in a method of an Objective-C category that extends a class. @@ -1964,7 +1963,7 @@ class TranslatorFrench : public Translator */ virtual QCString trExtendsClass() { - return "Extends class @1."; + return "DĂŠrive la classe @1."; } /*! Used as the header of a list of class methods in Objective-C. @@ -1972,7 +1971,7 @@ class TranslatorFrench : public Translator */ virtual QCString trClassMethods() { - return "Class Methods"; + return "MĂŠthodes de classe"; } /*! Used as the header of a list of instance methods in Objective-C. @@ -1980,14 +1979,14 @@ class TranslatorFrench : public Translator */ virtual QCString trInstanceMethods() { - return "Instance Methods"; + return "MĂŠthodes d'instance"; } /*! Used as the header of the member functions of an Objective-C class. */ virtual QCString trMethodDocumentation() { - return "Method Documentation"; + return "Documentation des mĂŠthodes"; } /*! Used as the title of the design overview picture created for the @@ -1995,7 +1994,7 @@ class TranslatorFrench : public Translator */ virtual QCString trDesignOverview() { - return "Design Overview"; + return "Vue d'ensemble"; } ////////////////////////////////////////////////////////////////////////// @@ -2004,53 +2003,53 @@ class TranslatorFrench : public Translator /** old style UNO IDL services: implemented interfaces */ virtual QCString trInterfaces() - { return "Exported Interfaces"; } + { return "Interfaces exportĂŠes"; } /** old style UNO IDL services: inherited services */ virtual QCString trServices() - { return "Included Services"; } + { return "Services inclus"; } /** UNO IDL constant groups */ virtual QCString trConstantGroups() - { return "Constant Groups"; } + { return "Groupes constants"; } /** UNO IDL constant groups */ virtual QCString trConstantGroupReference(const char *namespaceName) { - QCString result=namespaceName; - result+=" Constant Group Reference"; + QCString result="RĂŠfĂŠrence du groupe constant "; + result+=namespaceName; return result; } /** UNO IDL service page title */ virtual QCString trServiceReference(const char *sName) { - QCString result=(QCString)sName; - result+=" Service Reference"; + QCString result="RĂŠfĂŠrence du service "; + result+=(QCString)sName; return result; } /** UNO IDL singleton page title */ virtual QCString trSingletonReference(const char *sName) { - QCString result=(QCString)sName; - result+=" Singleton Reference"; + QCString result="RĂŠfĂŠrence du singleton "; + result+=(QCString)sName; return result; } /** UNO IDL service page */ virtual QCString trServiceGeneratedFromFiles(bool single) { // single is true implies a single file - QCString result=(QCString)"The documentation for this service " - "was generated from the following file"; - if (single) result+=":"; else result+="s:"; + QCString result=(QCString)"La documentation pour ce service " + "a ĂŠtĂŠ gĂŠnĂŠrĂŠe par "; + if (single) result+="le fichier suivant :"; else result+="les fichiers suivants :"; return result; } /** UNO IDL singleton page */ virtual QCString trSingletonGeneratedFromFiles(bool single) { // single is true implies a single file - QCString result=(QCString)"The documentation for this singleton " - "was generated from the following file"; - if (single) result+=":"; else result+="s:"; + QCString result=(QCString)"La documentation pour ce singleton " + "a ĂŠtĂŠ gĂŠnĂŠrĂŠe par "; + if (single) result+="le fichier suivant :"; else result+="les fichiers suivants :"; return result; } @@ -2058,4 +2057,4 @@ class TranslatorFrench : public Translator }; -#endif +#endif
\ No newline at end of file diff --git a/src/translator_jp.h b/src/translator_jp.h index 22b9cd7..febf353 100644 --- a/src/translator_jp.h +++ b/src/translator_jp.h @@ -22,17 +22,54 @@ * First Translation * by Kenji Nagamatsu * 1.2.12) - * Update and Shift-Jis(_WIN32) + * Update and Shift-Jis(_WIN32) -> converted UTF-8 at version 1.8.5 * by Ryunosuke Sato (30-Dec-2001) * 1.5.8) * Translation for 1.5.8. * by Hiroki Iseri (18-Feb-2009) + * 1.8.5) + * Translation Added for 1.8.4 and revised + * by Suzumizaki-Kimitaka (30-Aug-2013) */ - +/* +Messages for translators written in Japanese: +1.8.5 ă¸ăŽčż˝ĺ ăŤăăăŁăŚéĺťăŽçżťč¨łč
ä¸ĺă¸ăŽéŁçľĄă芌ăżăă¨ăăă +äşčšăă(Hiroki Iseri)ăăăăăĄăźăŤăŽăčżäşăăăă ăăžăăă +ăăŽéćăăŚăăă ăăéĺťăŽçľçˇŻăŤăăăžăă¨ĺ˝ćéŁçľĄĺŻč˝ă ăŁăćšă
㯠+ćăŁăŚĺžćĽč¨łăăćšĺ¤čż˝ĺ ăăŚć§ăăŞăć¨ă襨ćăăăŚăăă¨ăŽăă¨ă§ăă +Doxygen ăŽéçşăŽćšă§ăăăăŻăăă§ăăźăăăăďźăżăăăŞćăă ăŁăăăă§ă + +äşčšăăăĺć§ăŽčŚč§Łă§ăç§(é´čŚĺ˛=Suzumizaki-Kimitaka)ă +äťĺžăăŽçżťč¨łăŤé˘ăăçśăăăăăăŻé常ăŤćŞăăă¨ăăă§ăăŽă§ +ĺ°ćĽăŽčż˝ĺ 訳ăťć˘ĺ訳ćščŻăŻčăăăă¨ăŞăé˛ăăŚăăŁăŚăăăŽă§ăŻ +ăŞăăă¨ćăăžăăçĄčŤä˝ćĽăŽčĄçŞăăăăŽăŻä¸çľć¸ă§ăăŽă§çžĺ¨é˛čĄĺ˝˘ă§ +ć´ťçşăŤć´ć°ăăŚăăćšăăăŞăăăŽç°ĄĺăŞç˘şčŞ(MLă¨ăGită¨ă)ăăăăŽă +ăăă§ăăăăăăăă§ăĺśçśčĄçŞăăăä¸éă荌ăăŚç¸äşăŤčŞżć´ăăžăăăă + +ĺ˝é˘ăŞăăăă§ăă訳čŞăŽé¸ćă§ĺ§ĺŠăŤăŞăăă¨ăăăăăăăăžăăă +ăăŽă¨ă㯠gettext ăĺŠç¨ăăăăăŞăăăăä˝ăŁăŚ doxygen ăŽéçşăŤ +éŠç¨ăćąăăăŽăä¸çŞă§ăŻăŞăăăŞă¨ćăăžăă + +1.6.0䝼ĺăŽć˘ĺăŽč¨łăŤă¤ăăŚăĺ¤ĺ°ĺźăăžăăă +çšăŤ structure ăć§é ä˝ă§ăŻăŞăć§ćă¨ăăŚăăăŽăŻăăăžăă§ăăăŽă§ă +ăťăăC++ ă§ăŽĺŠç¨ĺćă§ćšĺ¤ăăă¨ăăăăăăžăăăăăăäťăŽč¨čŞă§ +ĺéĄăŽăăă§ăăăăćć°ćăăŚçłă訳ăŞăă§ăăç¸ĺżăŤĺ俎ćŁăăĄăăŁăŚ +ć§ăăžăăă + +ăăŽé doc/maintainers.txt ă俎ćŁăăŚăă python doc/translator.py ă +ĺŽčĄăăçšăŤă注ćä¸ăăăç§ăŽă¨ăă㍠search é´čŚĺ˛ĺéŤ ă¨ć¸ăăăŽăŻ +ĺĺ§ĺĺăăžăčăăăăŞăă¨ăăăŽă大ĺćă§ăăŽă§ăăĄăăă注ćă + +"芳解"ăŽčŞăĺłăăăăă¨ćăĺăăŻăăăžăăăăăăăŽç¨ĺşŚăŤăŻć¸ăă¨ă +ćč¨ăăăŚăŞăăăŠä˝żăăăŚăĺä˝ăćťăĺ¤ăćłĺŽĺ
ăŞăŽăćłĺŽĺ¤ăŞăŽă +ăăăăăŽăŻăĄăłăă§ĺ°ăăăăŞăă§ăăă + +(2013-08-30, é´čŚĺ˛ĺéŤ) +*/ #ifndef TRANSLATOR_JP_H #define TRANSLATOR_JP_H -class TranslatorJapanese : public TranslatorAdapter_1_6_0 +class TranslatorJapanese : public Translator { public: virtual QCString idLanguage() @@ -45,57 +82,57 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! used in the compound documentation before a list of related functions. */ virtual QCString trRelatedFunctions() - { return "é˘éŁăăé˘ć°"; } + { return "é˘éŁé˘ć°"; } /*! subscript for the related functions. */ virtual QCString trRelatedSubscript() - { return "ďźăăăăŻăĄă˝ăăă§ăŞăăă¨ăŤćł¨ćďź"; } + { return "ďźăăăăŻăĄă˝ăăă§ăŻăăăžăăďź"; } /*! header that is put before the detailed description of files, classes and namespaces. */ virtual QCString trDetailedDescription() - { return "誏ć"; } + { return "芳解"; } /*! header that is put before the list of typedefs. */ virtual QCString trMemberTypedefDocumentation() - { return "ĺĺŽçžŠ"; } + { return "ĺĺŽçžŠăĄăłă芳解"; } /*! header that is put before the list of enumerations. */ virtual QCString trMemberEnumerationDocumentation() - { return "ĺćĺ"; } + { return "ĺćĺăĄăłă芳解"; } /*! header that is put before the list of member functions. */ virtual QCString trMemberFunctionDocumentation() { - if( Config_getBool("OPTIMIZE_OUTPUT_JAVA")) - { - return "ăĄă˝ăă"; - } - else - { - return "é˘ć°"; - } - } + if( Config_getBool("OPTIMIZE_OUTPUT_JAVA")) + { + return "ăĄă˝ăă芳解"; + } + else + { + return "é˘ć°čŠłč§Ł"; + } + } /*! header that is put before the list of member attributes. */ virtual QCString trMemberDataDocumentation() { if( Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) - { - return "ć§é ä˝"; - } + { + return "ăăŁăźăŤă芳解"; + } else - { - return "ĺ¤ć°"; - } + { + return "ăĄăłă芳解"; + } } /*! this is the text of a link put after brief descriptions. */ - virtual QCString trMore() - { return "[芳細]"; } + virtual QCString trMore() + { return "[芳解]"; } /*! put in the class documentation */ virtual QCString trListOfAllMembers() - { return "ăăšăŚăŽăĄăłăä¸čŚ§"; } + { return "ĺ
¨ăĄăłăä¸čŚ§"; } /*! used as the title of the "list of all members" page of a class */ virtual QCString trMemberList() @@ -103,33 +140,35 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! this is the first part of a sentence that is followed by a class name */ virtual QCString trThisIsTheListOfAllMembers() - { return "ăăăŻĺ
¨ăĄăłăăŽä¸čŚ§ă§ăă"; } + { return "çśćżăĄăłăăĺŤă "; } + /* trIncludingInheritedMembers ăŤçśăăăăŤĺŽçžŠăăă㨠*/ /*! this is the remainder of the sentence after the class name */ virtual QCString trIncludingInheritedMembers() - { return "çśćżăĄăłăăĺŤăă§ăăžăă"; } + { return " ăŽĺ
¨ăĄăłăä¸čŚ§ă§ăă"; } + /* trThisIsTheListOfAllMembers ăăçśăăăăŤĺŽçžŠăăă㨠*/ /*! this is put at the author sections at the bottom of man pages. * parameter s is name of the project name. */ virtual QCString trGeneratedAutomatically(const char *s) - { QCString result; - if (s) result=(QCString)s+"ăŽ"; - result+="ă˝ăźăšăă Doxygen ăŤăăçćăăžăăă"; + { QCString result = "Doxygen ăŤăă"; + if (s) result=(QCString)" "+s+"ăŽ"; + result+="ă˝ăźăšăłăźăăăć˝ĺşăăžăăă"; return result; } /*! put after an enum name in the list of all members */ virtual QCString trEnumName() - { return "Enum"; } + { return "ĺćĺ"; } /*! put after an enum value in the list of all members */ virtual QCString trEnumValue() - { return "Enum ĺ¤"; } + { return "ĺćĺ¤"; } /*! put after an undocumented member in the list of all members */ virtual QCString trDefinedIn() - { return "揥ă§ĺŽçžŠăăăŚăăžăă"; } + { return "ĺŽçžŠĺ ´ć: "; } // quick reference sections @@ -147,55 +186,51 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 virtual QCString trCompoundList() { if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) - { - return "ăăźăżć§é "; - } + { + return "ăăźăżć§é "; + } else - { - return "ć§ć"; - } + { + return "ăŻăŠăšä¸čŚ§"; + } } /*! This is put above each page as a link to the list of documented files */ virtual QCString trFileList() { return "ăăĄă¤ăŤä¸čŚ§"; } - /*! This is put above each page as a link to the list of all verbatim headers */ - virtual QCString trHeaderFiles() - { return "ăăăăăĄă¤ăŤ"; } - /*! This is put above each page as a link to all members of compounds. */ virtual QCString trCompoundMembers() { if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) - { - return "ăăźăżăăŁăźăŤă"; - } + { + return "ăăźăżăăŁăźăŤă"; + } else - { - return "ć§ćăĄăłă"; - } + { + return "ăŻăŠăšăĄăłă"; + } } /*! This is put above each page as a link to all members of files. */ virtual QCString trFileMembers() { if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) - { - return "ă°ăăźăăŤ"; - } + { + return "大ĺĺ税"; + } else - { - return "ăăĄă¤ăŤăĄăłă"; - } + { + return "ăăĄă¤ăŤăĄăłă"; + } } /*! This is put above each page as a link to all related pages. */ virtual QCString trRelatedPages() - { return "é˘éŁăăźă¸"; } + { return "荸ć
ĺ ą"; } /*! This is put above each page as a link to all examples. */ virtual QCString trExamples() - { return "äž"; } + { return "ĺ税äž"; } /*! This is put above each page as a link to the search engine. */ virtual QCString trSearch() @@ -203,93 +238,127 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! This is an introduction to the class hierarchy. */ virtual QCString trClassHierarchyDescription() - { return "ăăŽçśćżä¸čŚ§ăŻăăăžăăŤăŻă˝ăźăăăăŚăăžăăă" - "ĺŽĺ
¨ăŤă˘ăŤăăĄăăăé ă§ă˝ăźăăăăŚăŻăăžăăă"; + { + return "ăŻăŠăšé幤ä¸čŚ§ă§ăă大éćăŤćĺ珌ĺˇé ă§ä¸ŚăšăăăŚăăžăă"; } /*! This is an introduction to the list with all files. */ - virtual QCString trFileListDescription(bool /*extractAll*/) + virtual QCString trFileListDescription(bool extractAll) { - QCString result="ăăăŻ"; - result+="ăăĄă¤ăŤä¸čŚ§ă§ăă"; - return result; + /* ćŚčŚăă¤ăăŚăăăŽăŻčŚăă°ăăăăŽă§ççĽ */ + /* extractAll ă㨠EXTRACT_ALL ăŻăăšăŚăŽčŠłč§Łăĺĺ¨ăăăă¨ă + ĺŽéăŽćçĄă庌ĺ¤čŚăăŚăŚăźăśăźăäżč¨źăăč¨ĺŽăŞăŽă§ + 芳解ăăŞăăă°ăăŽé˘ć°ăčżăćĺĺăŻĺ˝çśăŤççžă辡ăăă + */ + if (extractAll) + { + return "ăăĄă¤ăŤä¸čŚ§ă§ăă"; + } + return "芳解ăäťăăăăŚăăăăĄă¤ăŤăŽä¸čŚ§ă§ăă"; } + /*! This is an introduction to the annotated compound list. */ virtual QCString trCompoundListDescription() { + /* ćŚčŚăă¤ăăŚăăăŽăŻčŚăă°ăăăăŽă§ççĽ */ if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) - { - return "ăăźăżć§é ăŽčŞŹćă§ăă"; - } + { + return "ăăźăżć§é ä¸čŚ§ă§ăă"; + } else - { - return "ăŻăŠăšăć§é ä˝ăĺ
ąç¨ä˝ăă¤ăłăżăă§ăźăšăŽčŞŹćă§ăă"; - } + { + return "ăŻăŠăšăťć§é ä˝ăťĺ
ąç¨ä˝ăťă¤ăłăżăźăă§ăźăšăŽä¸čŚ§ă§ăă"; + } } /*! This is an introduction to the page with all class members. */ virtual QCString trCompoundMembersDescription(bool extractAll) { - QCString result="ăăăŻ"; - if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) - { - result+="ăăŁăźăŤăăŽä¸čŚ§ă§ăăăă"; - if (extractAll) result+="ăĺąăăŚăăć§é ä˝/ĺ
ąç¨ä˝"; - } + const bool forC = Config_getBool("OPTIMIZE_OUTPUT_FOR_C"); + QCString result; + if (forC) + { + result = "ć§é ä˝ăťĺ
ąç¨ä˝ăŽ"; + } + if (extractAll) + { + result += "ĺ
¨"; + } + else + { + result += "芳解ăă"; + } + if (forC) + { + result += "ăăŁăźăŤă"; + } + else + { + result += "ăŻăŠăšăĄăłă"; + } + if (!extractAll && !forC) + { + result += "ăŽ"; + } + result += "ä¸čŚ§ă§ăă"; + if (!extractAll) + { + if (forC) + { + result+="ĺăăŁăźăŤă芳解"; + } + else + { + result+="ĺăŻăŠăšăĄăłă芳解"; + } + } else - { - result+="ăŻăŠăšăĄăłăăŽä¸čŚ§ă§ăăăăă"; - if (extractAll) result+="ăĺąăăŚăăăŻăŠăš"; - } - result+="ăŽčŞŹćă¸ăŞăłăŻăăŚăăžăă"; + { + if (forC) + { + result+="ĺăăŁăźăŤăăĺąăăć§é ä˝ăťĺ
ąç¨ä˝"; + } + else + { + result+="ĺăĄăłăăĺąăăăŻăŠăš"; + } + } + result += "ă¸ăŽăŞăłăŻăăăăžăă"; return result; } /*! This is an introduction to the page with all file members. */ virtual QCString trFileMembersDescription(bool /*extractAll*/) { - QCString result="ăăăŻ"; + QCString result; if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) - { - result+="é˘ć°ăĺ¤ć°ăăăŻăăEnumăTypedef ăŽ"; - } + { + result+="é˘ć°ăťĺ¤ć°ăťăăŻăăťĺćăťĺĺŽçžŠ"; + } else - { - result+="ăăĄă¤ăŤăĄăłăăŽ"; - } - result+="ä¸čŚ§ă§ăăăăăăăĺąăăŚăăăăĄă¤ăŤăŽčŞŹćă¸ăŞăłăŻăăŚăăžăă"; + { + result+="ăăĄă¤ăŤç´ä¸ăŽăĄăłă"; + } + result+="ä¸čŚ§ă§ăăĺă
芳解ăăăă°ăăă¸ăŞăłăŻăăŚăăžăă"; return result; } - /*! This is an introduction to the page with the list of all header files. */ - virtual QCString trHeaderFilesDescription() - { return "APIăć§ćăăăăăăăĄă¤ăŤă§ăă"; } - /*! This is an introduction to the page with the list of all examples */ virtual QCString trExamplesDescription() - { return "ăăšăŚăŽäžăŽä¸čŚ§ă§ăă"; } + { return "ĺ税äžăŽä¸čŚ§ă§ăă"; } /*! This is an introduction to the page with the list of related pages */ virtual QCString trRelatedPagesDescription() - { return "é˘éŁăăźă¸ăŽä¸čŚ§ă§ăă"; } + { return "荸ć
ĺ ąăŽä¸čŚ§ă§ăă"; } /*! This is an introduction to the page with the list of class/file groups */ virtual QCString trModulesDescription() - { return "ăăšăŚăŽă˘ă¸ăĽăźăŤăŽä¸čŚ§ă§ăă"; } - - /*! This sentences is used in the annotated class/file lists if no brief - * description is given. - */ - virtual QCString trNoDescriptionAvailable() - { return "ăăăĽăĄăłăăč¨čż°ăăăŚăăžăăă"; } - - // index titles (the project name is prepended for these) - + { return "ĺ
¨ă˘ă¸ăĽăźăŤăŽä¸čŚ§ă§ăă"; } /*! This is used in HTML as the title of index.html. */ virtual QCString trDocumentation() - { return "ăăăĽăĄăłă"; } + { return "芳解"; } /*! This is used in LaTeX as the title of the chapter with the * index of all groups. @@ -309,13 +378,13 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 virtual QCString trCompoundIndex() { if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) - { - return "ăăźăżć§é ç´˘ĺź"; - } + { + return "ăăźăżć§é ç´˘ĺź"; + } else - { - return "ć§ćç´˘ĺź"; - } + { + return "ăŻăŠăšç´˘ĺź"; + } } /*! This is used in LaTeX as the title of the chapter with the @@ -328,7 +397,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 * the documentation of all groups. */ virtual QCString trModuleDocumentation() - { return "ă˘ă¸ăĽăźăŤ"; } + { return "ă˘ă¸ăĽăźăŤčŠłč§Ł"; } /*! This is used in LaTeX as the title of the chapter containing * the documentation of all classes, structs and unions. @@ -336,32 +405,32 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 virtual QCString trClassDocumentation() { if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) - { - return "ăăźăżć§é "; - } + { + return "ăăźăżć§é 芳解"; + } else - { - return "ăŻăŠăš"; - } + { + return "ăŻăŠăščŠłč§Ł"; + } } /*! This is used in LaTeX as the title of the chapter containing * the documentation of all files. */ virtual QCString trFileDocumentation() - { return "ăăĄă¤ăŤ"; } + { return "ăăĄă¤ăŤčŠłč§Ł"; } /*! This is used in LaTeX as the title of the chapter containing * the documentation of all examples. */ virtual QCString trExampleDocumentation() - { return "äž"; } + { return "ĺäžčŠłč§Ł"; } /*! This is used in LaTeX as the title of the chapter containing * the documentation of all related pages. */ virtual QCString trPageDocumentation() - { return "ăăźă¸"; } + { return "ăăźă¸čŠłč§Ł"; } /*! This is used in LaTeX as the title of the document */ virtual QCString trReferenceManual() @@ -401,36 +470,36 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 * list of (global) variables */ virtual QCString trEnumerationValues() - { return "ĺćĺăŽĺ¤"; } + { return "ĺćĺ¤"; } /*! This is used in the documentation of a file before the list of * documentation blocks for defines */ virtual QCString trDefineDocumentation() - { return "ăăŻăĺŽçžŠ"; } + { return "ăăŻăĺŽçžŠčŠłč§Ł"; } /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for typedefs */ virtual QCString trTypedefDocumentation() - { return "ĺĺŽçžŠ"; } + { return "ĺĺŽçžŠčŠłč§Ł"; } /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for enumeration types */ virtual QCString trEnumerationTypeDocumentation() - { return "ĺćĺ"; } + { return "ĺćĺ芳解"; } /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for functions */ virtual QCString trFunctionDocumentation() - { return "é˘ć°"; } + { return "é˘ć°čŠłč§Ł"; } /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for variables */ virtual QCString trVariableDocumentation() - { return "ĺ¤ć°"; } + { return "ĺ¤ć°čŠłč§Ł"; } /*! This is used in the documentation of a file/namespace/group before * the list of links to documented compounds @@ -438,48 +507,39 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 virtual QCString trCompounds() { if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) - { - return "ăăźăżć§é "; - } + { + return "ăăźăżć§é "; + } else - { - return "ć§ć"; - } + { + return "ăŻăŠăš"; + } } /*! This is used in the standard footer of each page and indicates when * the page was generated */ virtual QCString trGeneratedAt(const char *date,const char *projName) { - QCString result; - if (projName) result+=(QCString)projName+"ăŤĺŻžăăŚ"; - result+=(QCString)date+"ăŤçćăăăžăăă"; + QCString result = (QCString)date+"ä˝ć"; + if (projName) result+=(QCString)" - " + projName; + result+=" / ć§ć: "; return result; } /*! this text is put before a class diagram */ virtual QCString trClassDiagram(const char *clName) { - return (QCString)clName+"ăŤĺŻžăăçśćżă°ăŠă"; + return (QCString)clName+" ăŽçśćżé˘äżĺł"; } /*! this text is generated when the \\internal command is used. */ virtual QCString trForInternalUseOnly() - { return "ĺ
é¨ä˝żç¨ăŽăżă"; } - - /*! this text is generated when the \\reimp command is used. */ - virtual QCString trReimplementedForInternalReasons() - { return "ĺ
é¨çăŞççąăŤăăĺĺŽčŁ
ăăăžăăăăAPIăŤăŻĺ˝ąéżăăžăăă"; - } + { return "ĺ
é¨ĺŚçç¨ă§ăă"; } /*! this text is generated when the \\warning command is used. */ virtual QCString trWarning() { return "čŚĺ"; } - /*! this text is generated when the \\bug command is used. */ - virtual QCString trBugsAndLimitations() - { return "ăă°ă¨ĺśé"; } - /*! this text is generated when the \\version command is used. */ virtual QCString trVersion() { return "ăăźă¸ă§ăł"; } @@ -506,7 +566,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! this text is used in the title page of a LaTeX document. */ virtual QCString trGeneratedBy() - { return "ä˝ćďź"; } + { return "ć§çŻ:"; } ////////////////////////////////////////////////////////////////////////// // new since 0.49-990307 @@ -514,12 +574,16 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! used as the title of page containing all the index of all namespaces. */ virtual QCString trNamespaceList() - { return "ăăźă ăšăăźăšä¸čŚ§"; } + { return "ĺĺ犺éä¸čŚ§"; } /*! used as an introduction to the namespace list */ - virtual QCString trNamespaceListDescription(bool /*extractAll*/) + virtual QCString trNamespaceListDescription(bool extractAll) { - return "ăăźă ăšăăźăšăŽä¸čŚ§ă§ăă"; + if (extractAll) + { + return "ĺ
¨ĺĺ犺éăŽä¸čŚ§ă§ăă"; + } + return "芳解ăäťăăĺĺ犺éăŽä¸čŚ§ă§ăă"; } /*! used in the class documentation as a header before the list of all @@ -536,7 +600,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 * related classes */ virtual QCString trRelatedFunctionDocumentation() - { return "ăăŹăłăă¨é˘éŁăăé˘ć°"; } + { return "ăăŹăłăă¨é˘éŁé˘ć°ăŽčŠłč§Ł"; } ////////////////////////////////////////////////////////////////////////// // new since 0.49-990425 @@ -547,58 +611,57 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 ClassDef::CompoundType compType, bool isTemplate) { - QCString result=""; + QCString result=(QCString)clName+" "; switch(compType) { - case ClassDef::Class: result+="ăŻăŠăš "; break; - case ClassDef::Struct: result+="ć§é ä˝ "; break; - case ClassDef::Union: result+="ĺ
ąç¨ä˝ "; break; - case ClassDef::Interface: result+="ă¤ăłăżăă§ăźăš "; break; - case ClassDef::Protocol: result+="ăăăăłăŤ "; break; - case ClassDef::Category: result+="ăŤăă´ăŞ "; break; - case ClassDef::Exception: result+="äžĺ¤ "; break; + case ClassDef::Class: result+="ăŻăŠăš"; break; + case ClassDef::Struct: result+="ć§é ä˝"; break; + case ClassDef::Union: result+="ĺ
ąç¨ä˝"; break; + case ClassDef::Interface: result+="ă¤ăłăżăă§ăźăš"; break; + case ClassDef::Protocol: result+="ăăăăłăŤ"; break; + case ClassDef::Category: result+="ăŤăă´ăŞ"; break; + case ClassDef::Exception: result+="äžĺ¤"; break; default: break; } - if (isTemplate) result+="ăăłăăŹăźă "; - result+=(QCString)clName; + if (isTemplate) result+="ăăłăăŹăźă"; return result; } /*! used as the title of the HTML page of a file */ virtual QCString trFileReference(const char *fileName) { - QCString result=""+(QCString)fileName; + QCString result=(QCString)fileName+" ăăĄă¤ăŤ"; return result; } /*! used as the title of the HTML page of a namespace */ virtual QCString trNamespaceReference(const char *namespaceName) { - QCString result="ăăźă ăšăăźăš "+(QCString)namespaceName; + QCString result=(QCString)namespaceName+" ĺĺ犺é"; return result; } /* these are for the member sections of a class, struct or union */ virtual QCString trPublicMembers() - { return "Public ăĄă˝ăă"; } + { return "ĺ
ŹéăĄăłăé˘ć°"; } virtual QCString trPublicSlots() - { return "Public ăšăăă"; } + { return "ĺ
Źéăšăăă"; } virtual QCString trSignals() { return "ăˇă°ăăŤ"; } virtual QCString trStaticPublicMembers() - { return "Static Public ăĄă˝ăă"; } + { return "éçĺ
ŹéăĄăłăé˘ć°"; } virtual QCString trProtectedMembers() - { return "Protected ăĄă˝ăă"; } + { return "éĺŽĺ
ŹéăĄăłăé˘ć°"; } virtual QCString trProtectedSlots() - { return "Protected ăšăăă"; } + { return "éĺŽĺ
Źéăšăăă"; } virtual QCString trStaticProtectedMembers() - { return "Static Protected ăĄă˝ăă"; } + { return "éçéĺŽĺ
ŹéăĄăłăé˘ć°"; } virtual QCString trPrivateMembers() - { return "Private ăĄă˝ăă"; } + { return "éĺ
ŹéăĄăłăé˘ć°"; } virtual QCString trPrivateSlots() - { return "Private ăšăăă"; } + { return "éĺ
Źéăšăăă"; } virtual QCString trStaticPrivateMembers() - { return "Static Private ăĄă˝ăă"; } + { return "éçéĺ
ŹéăĄăłăé˘ć°"; } /*! this function is used to produce a comma-separated list of items. * use generateMarker(i) to indicate where item i should be put. @@ -616,12 +679,15 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 if (i!=numEntries-1) // not the last entry, so we need a separator { - if (i<numEntries-2) // not the fore last entry - result+=", "; - else // the fore last entry - result+=", 㨠"; + result+=", "; } } + if ( result.length() > 60 ) + { + QCString countStr; + countStr.sprintf(" (č¨%dé
çŽ)", numEntries); + result += countStr; + } return result; } @@ -646,7 +712,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 */ virtual QCString trReimplementedFromList(int numEntries) { - return trWriteList(numEntries)+"ăĺĺŽçžŠăăŚăăžăă"; + return trWriteList(numEntries)+"ăĺĺŽčŁ
ăăŚăăžăă"; } /*! used in member documentation blocks to produce a list of @@ -654,22 +720,26 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 */ virtual QCString trReimplementedInList(int numEntries) { - return trWriteList(numEntries)+"ă§ĺĺŽçžŠăăăŚăăžăă"; + return trWriteList(numEntries)+"ă§ĺĺŽčŁ
ăăăŚăăžăă"; } /*! This is put above each page as a link to all members of namespaces. */ virtual QCString trNamespaceMembers() - { return "ăăźă ăšăăźăšăĄăłă"; } + { return "ĺĺ犺éăĄăłă"; } /*! This is an introduction to the page with all namespace members */ virtual QCString trNamespaceMemberDescription(bool extractAll) { - QCString result="ăăăŻ"; - result+="ăăźă ăšăăźăšăŽä¸čŚ§ă§ăăăăăă"; + QCString result="ăăăŻ"; + result+="ĺĺ犺éăŽä¸čŚ§ă§ăăăăăă"; if (extractAll) - result+="ăŽăăźă ăšăăźăš"; + { + result+="ăŽĺĺ犺é"; + } else - result+="ăĺąăăŚăăăăźă ăšăăźăš"; + { + result+="ăĺąăăŚăăĺĺ犺é"; + } result+="ă¸ăŞăłăŻăăŚăăžăă"; return result; } @@ -677,13 +747,13 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 * index of all namespaces. */ virtual QCString trNamespaceIndex() - { return "ăăźă ăšăăźăšç´˘ĺź"; } + { return "ĺĺ犺éç´˘ĺź"; } /*! This is used in LaTeX as the title of the chapter containing * the documentation of all namespaces. */ virtual QCString trNamespaceDocumentation() - { return "ăăźă ăšăăźăš"; } + { return "ĺĺ犺é芳解"; } ////////////////////////////////////////////////////////////////////////// // new since 0.49-990522 @@ -693,7 +763,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 * namespaces in a file. */ virtual QCString trNamespaces() - { return "ăăźă ăšăăźăš"; } + { return "ĺĺ犺é"; } ////////////////////////////////////////////////////////////////////////// // new since 0.49-990728 @@ -703,7 +773,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 * followed by a list of files that were used to generate the page. */ virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType, - bool) + bool /*single*/) { // here s is one of " Class", " Struct" or " Union" // single is true implies a single file QCString result=(QCString)"ăăŽ"; @@ -718,7 +788,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 case ClassDef::Exception: result+="äžĺ¤"; break; default: break; } - result+="ăŽčŞŹćăŻćŹĄăŽăăĄă¤ăŤăăçćăăăžăă:"; + result+="芳解ăŻćŹĄăŽăăĄă¤ăŤăăć˝ĺşăăăžăă:"; return result; } @@ -733,7 +803,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! This is in the (quick) index as a link to the main page (index.html) */ virtual QCString trMainPage() - { return "ăĄă¤ăłăăźă¸"; } + { return "çˇĺćŚčŚ"; } /*! This is used in references to page that are put in the LaTeX * documentation. It should be an abbreviation of the word page. @@ -745,17 +815,13 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 // new since 0.49-991003 ////////////////////////////////////////////////////////////////////////// - virtual QCString trSources() - { - return "ă˝ăźăš"; - } virtual QCString trDefinedAtLineInSourceFile() { - return " @1 ㎠@0 čĄă§ĺŽçžŠăăăŚăăžăă"; + return " @1 ㎠@0 čĄçŽăŤĺŽçžŠăăăăžăă"; } virtual QCString trDefinedInSourceFile() { - return " @0 ă§ĺŽçžŠăăăŚăăžăă"; + return " @0 ăŤĺŽçžŠăăăăžăă"; } ////////////////////////////////////////////////////////////////////////// @@ -766,35 +832,31 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 { return "éć¨ĺĽ¨"; } - -////////////////////////////////////////////////////////////////////////// -// new since 1.1.0 -////////////////////////////////////////////////////////////////////////// - + /*! this text is put before a collaboration diagram */ virtual QCString trCollaborationDiagram(const char *clName) { - return (QCString)clName+"ăŽăłăŠăăŹăźăˇă§ăłĺł"; + return (QCString)clName+" éŁćşĺł"; } /*! this text is put before an include dependency graph */ virtual QCString trInclDepGraph(const char *fName) { - return (QCString)fName+"ăŽă¤ăłăŻăŤăźăäžĺé˘äżĺł"; + return (QCString)fName+" ăŽäžĺĺ
é˘äżĺł:"; } /*! header that is put before the list of constructor/destructors. */ virtual QCString trConstructorDocumentation() { - return "ăłăłăšăăŠăŻăżă¨ăăšăăŠăŻăż"; + return "ć§çŻĺă¨č§Łä˝ĺ"; } /*! Used in the file documentation to point to the corresponding sources. */ virtual QCString trGotoSourceCode() { - return "ă˝ăźăšăłăźăăčŚăă"; + return "[ă˝ăźăšăłăźă]"; } /*! Used in the file sources to point to the corresponding documentation. */ virtual QCString trGotoDocumentation() { - return "誏ćăčŚăă"; + return "[芳解]"; } /*! Text for the \\pre command */ virtual QCString trPrecondition() @@ -827,17 +889,16 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 } virtual QCString trGotoGraphicalHierarchy() { - return "ăŻăŠăšé幤ĺłăčŚăă"; + return "[ăŻăŠăšé幤ĺł]"; } virtual QCString trGotoTextualHierarchy() { - return "ăŻăŠăšé幤ĺłăčŚăă"; + return "[ăŻăŠăšé幤襨]"; } virtual QCString trPageIndex() { return "ăăźă¸ç´˘ĺź"; } - ////////////////////////////////////////////////////////////////////////// // new since 1.1.0 ////////////////////////////////////////////////////////////////////////// @@ -848,46 +909,46 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 } virtual QCString trPublicTypes() { - return "Public ĺ"; + return "ĺ
Źéĺ"; } virtual QCString trPublicAttribs() { if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) - { - return "ĺ¤ć°"; - } + { + return "ăăŁăźăŤă"; + } else - { - return "Public ĺ¤ć°"; - } + { + return "ĺ
Źéĺ¤ć°éĄ"; + } } virtual QCString trStaticPublicAttribs() { - return "Static Public ĺ¤ć°"; + return "éçĺ
Źéĺ¤ć°éĄ"; } virtual QCString trProtectedTypes() { - return "Protected ĺ"; + return "éĺŽĺ
Źéĺ"; } virtual QCString trProtectedAttribs() { - return "Protected ĺ¤ć°"; + return "éĺŽĺ
Źéĺ¤ć°éĄ"; } virtual QCString trStaticProtectedAttribs() { - return "Static Protected ĺ¤ć°"; + return "éçéĺŽĺ
Źéĺ¤ć°éĄ"; } virtual QCString trPrivateTypes() { - return "Private ĺ"; + return "éĺ
Źéĺ"; } virtual QCString trPrivateAttribs() { - return "Private ĺ¤ć°"; + return "éĺ
Źéĺ¤ć°éĄ"; } virtual QCString trStaticPrivateAttribs() { - return "Static Private ĺ¤ć°"; + return "éçéĺ
Źéĺ¤ć°éĄ"; } ////////////////////////////////////////////////////////////////////////// @@ -897,12 +958,12 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! Used as a marker that is put before a todo item */ virtual QCString trTodo() { - return "TODO"; + return "todo"; } /*! Used as the header of the todo list */ virtual QCString trTodoList() { - return "TODOä¸čŚ§"; + return "todoä¸čŚ§"; } ////////////////////////////////////////////////////////////////////////// @@ -915,7 +976,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 } virtual QCString trRemarks() { - return "ćčŚ"; + return "注é"; } virtual QCString trAttention() { @@ -923,8 +984,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 } virtual QCString trInclByDepGraph() { - return "ăăŽă°ăŠăăŻăăŠăŽăăĄă¤ăŤăăç´ćĽăéćĽçăŤ" - "ă¤ăłăŻăŤăźăăăăŚăăăă示ăăŚăăžăă"; + return "袍äžĺé˘äżĺł:"; } virtual QCString trSince() { @@ -944,25 +1004,24 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 virtual QCString trLegendDocs() { return - "ăăŽăăźă¸ă§ăŻădoxygen ă§çćăăăă°ăŠăăăŠăŽăăăŤăżăăăăăă" - "誏ćăăžăă<p>\n" - "揥ăŽäžăčăăŚăżăžăă\n" + "Doxygen ăçćăăă°ăŠăăčŞăżćšăŤă¤ăăŚă<p>\n" + "揥ăŽăłăźăäžăă茧ăă ăăă\n" "\\code\n" - "/*! ççĽăăăŚčŚăăŞăăŻăŠăš */\n" + "/*! ĺ
¨ä˝ăŽĺ¤§ăăăŽé˘äżă§čŚăăŞăăŞăăŻăŠăšă§ăă */\n" "class Invisible { };\n\n" - "/*! ççĽăăăăŻăŠăš(çśćżé˘äżăŻé ăăăŚăă) */\n" + "/*! 襨示ăĺăć¨ăŚăăăăŻăŠăš(InvisibleăŻăŠăšăŽĺăčŚăăžăă) */\n" "class Truncated : public Invisible { };\n\n" - "/* doxygen ăłăĄăłăăŤăăăăăĽăĄăłăăăŞăăŻăŠăš */\n" + "/* Doxygen ç¨ăŽăłăĄăłăăłăźăăăŞăăŻăŠăš */\n" "class Undocumented { };\n\n" - "/*! public ă§çśćżăăăăŻăŠăš */\n" + "/*! ĺ
ŹéçśćżăăăŚăăăŻăŠăš */\n" "class PublicBase : public Truncated { };\n\n" "/*! A template class */\n" "template<class T> class Templ { };\n\n" - "/*! protected ă§çśćżăăăăŻăŠăš */\n" + "/*! éĺŽĺ
Źéă§çśćżăăăŚăăăŻăŠăš */\n" "class ProtectedBase { };\n\n" - "/*! private ă§çśćżăăăăŻăŠăš */\n" + "/*! éĺ
ŹéçśćżăăăŚăăăŻăŠăš */\n" "class PrivateBase { };\n\n" - "/*! çśćżăăăăŻăŠăšă§ä˝żăăăŚăăăŻăŠăš */\n" + "/*! Inherited ăŻăŠăšĺ
ă§ä˝żăăăŚăăăŻăŠăš */\n" "class Used { };\n\n" "/*! č¤ć°ăŽăŻăŠăšăçśćżăăŚăăä¸ä˝ăŻăŠăš */\n" "class Inherited : public PublicBase,\n" @@ -975,28 +1034,28 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 " Used *m_usedClass;\n" "};\n" "\\endcode\n" - "č¨ĺŽăăĄă¤ăŤä¸ă§ăăżă° \\c MAX_DOT_GRAPH_HEIGHT ă 200 ăŤăťăăăăă" - "ĺ ´ĺă揥ăŽăăăŞă°ăŠăă¨ăŞăăžăă" + "\\c MAX_DOT_GRAPH_" /* ăăăăăĄăăĺăŁăŚăăăŽăŻ doc/translator.py ăŽć¤ĺşĺéżăŽăă */ + "HEIGHT ăżă°ăŤ 200 ăä¸ăăč¨ĺŽăăĄă¤ăŤ" + "ă使ăă¨ă揥ăŽăăăŞă°ăŠăă¨ăŞăăžăă" "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n" "<p>\n" - "ä¸ăŽă°ăŠăĺ
ăŽăăăŻăšăŤăŻćŹĄăŽăăăŞćĺłăăăăžăă\n" + "ă°ăŠăĺ
ăŽçŠĺ˝˘ăŻć§é ä˝ăăŻăŠăšă襨ăăŚăăžăăč˛ăŽćĺłăŻćŹĄăŽéăă§ăă\n" "<ul>\n" - "<li>éťăĺĄăă¤ăśăăăăăăŻăšăŻăăăŽă°ăŠăăŤĺŻžĺżăăć§é ä˝ăăŻăŠăšă" - "襨ăăžăă\n" - "<li>éťć ăŽăăăŻăšăŻăăăĽăĄăłăăăăć§é ä˝ăăŻăŠăšă襨ăăžăă\n" - "<li>ç°č˛ăŽć ăŽăăăŻăšăŻăăăĽăĄăłăăăŞăć§é ä˝ăăŻăŠăšă襨ăăžăă\n" - "<li>辤ć ăŽăăăŻăšăŻăăăĽăĄăłăăăăć§é ä˝ăăŻăŠăšă襨ăăžăăă" - "ćĺŽăăăăľă¤ăşăŤĺăžăăŞăăăăŤçśćżăťĺ
ĺŤé˘äżăăăšăŚĺłç¤şăă" - "ăă¨ăă§ăăŞăăŁăăă¨ă示ăăžăă" + "<li>ä¸ăéťăĺĄăăăĺč§ăŻăĺłă注çŽăăŚăă辡çšă§ăă</li>\n" + "<li>éťć ăŻčŠłč§Łăăăăă¨ă示ăăŚăăžăă</li>\n" + "<li>ç°č˛ć ă§ç¤şăăăăŻăŠăšçăŤăŻčŠłč§Łăăăăžăăă</li>\n" + "<li>辤ć ă§ç¤şăăăăăŽăŻčŠłč§Łăćă¤ăŻăŠăšă§ăăă" + "ćĺŽăăă大ăăăŤĺăžăăŞăăă¨ăăä¸é¨ăŽçśćżăťĺ
ĺŤé˘äżă" + "ççĽăăăŚăăăă¨ă襨ăăžăă</li>\n" "</ul>\n" - "ç˘ĺ°ăŤăŻćŹĄăŽăăăŞćĺłăăăăžăă\n" + "<p>ç˘ĺ°ăŽćĺłăŻćŹĄăŽéăă§ăă</p>\n" "<ul>\n" - "<li>éăç˘ĺ°ăŻäşă¤ăŽăŻăŠăšé㎠public çśćżé˘äżă示ăăžăă\n" - "<li>çˇăŽç˘ĺ°ăŻ protected çśćżé˘äżă示ăăžăă\n" - "<li>辤ăŽç˘ĺ°ăŻ private çśćżé˘äżă示ăăžăă\n" - "<li>ç´ŤăŽç ´çˇç˘ĺ°ăŻăăăŽăŻăŠăšăäťăŽăŻăŠăšăŤĺŤăžăăŚăăăă" - "ĺŠç¨ăăăŚăăăă¨ă示ăăžăăăžăăç˘ĺ°ăćăăŚăăăŻăŠăšăć§é ä˝ă" - "ăŠăŽĺ¤ć°ă§ă˘ăŻăťăšă§ăăăăç˘ĺ°ăŽăŠăăŤă¨ăăŚç¤şăăŚăăžăă\n" + "<li>éăç˘ĺ°ăŻäşă¤ăŽăŻăŠăšéăŽĺ
Źéçśćżé˘äżă示ăăžăă</li>\n" + "<li>çˇăŽç˘ĺ°ăŻéĺŽĺ
ŹéăŽçśćżé˘äżă示ăăžăă</li>\n" + "<li>辤ăŽç˘ĺ°ăŻéĺ
ŹéăŽçśćżé˘äżă示ăăžăă</li>\n" + "<li>ç´ŤăŽç ´çˇç˘ĺ°ăŻăăăŽăŻăŠăšăäťăŽăŻăŠăšăŤĺŤăžăăŚăăăă" + "ĺŠç¨ăăăŚăăăă¨ă示ăăžăăăžăăç˘ĺ°ăŽăŠăăŤăŻç˘ăŽĺ
ăŤăăăŻăŠăšçă" + "ă˘ăŻăťăšăăŚăăç˘ăŽć šćŹăŽăĄăłăă襨ăăŚăăžăă</li>\n" "</ul>\n"; } /*! text for the link to the legend page */ @@ -1032,7 +1091,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! Used as a section header for IDL property documentation */ virtual QCString trPropertyDocumentation() { - return "ăăăăăŁ"; + return "ăăăăăŁčŠłč§Ł"; } @@ -1040,27 +1099,22 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 // new since 1.2.4 ////////////////////////////////////////////////////////////////////////// - /*! Used for Java interfaces in the summary section of Java packages */ - virtual QCString trInterfaces() - { - return "ă¤ăłăżăźăă§ăźăš"; - } /*! Used for Java classes in the summary section of Java packages */ virtual QCString trClasses() { if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) - { - return "ăăźăżć§é "; - } + { + return "ăăźăżć§é "; + } else - { - return "ăŻăŠăš"; - } + { + return "ăŻăŠăš"; + } } /*! Used as the title of a Java package */ virtual QCString trPackage(const char *name) { - return (QCString)"ăăăąăźă¸ "+name; + return (QCString)name+" ăăăąăźă¸"; } /*! Title of the package index page */ virtual QCString trPackageList() @@ -1070,19 +1124,15 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! The description of the package index page */ virtual QCString trPackageListDescription() { - return "ăăăŻăăăąăźă¸ä¸čŚ§ă§ăă"; + return "ăăăąăźă¸ä¸čŚ§ă§ăă"; } /*! The link name in the Quick links header for each page */ virtual QCString trPackages() { return "ăăăąăźă¸"; } - /*! Used as a chapter title for Latex & RTF output */ - virtual QCString trPackageDocumentation() - { - return "ăăăąăźă¸"; - } - /*! Text shown before a multi-line define */ + + /*! Text shown before a multi-line define */ virtual QCString trDefineValue() { return "ĺ¤:"; @@ -1177,7 +1227,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 */ virtual QCString trNamespace(bool /*first_capital*/, bool /*singular*/) { - return "ăăźă ăšăăźăš"; + return "ĺĺ犺é"; } /*! This is used for translation of the word that will possibly @@ -1211,18 +1261,9 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 * be followed by a single name or by a list of names * of the category. */ - virtual QCString trField(bool /*first_capital*/, bool /*singular*/) - { - return "ăăŁăźăŤă"; - } - - /*! This is used for translation of the word that will possibly - * be followed by a single name or by a list of names - * of the category. - */ virtual QCString trGlobal(bool /*first_capital*/, bool /*singular*/) { - return "ă°ăăźăăŤ"; + return "大ĺĺ税"; } ////////////////////////////////////////////////////////////////////////// @@ -1233,7 +1274,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 * for the author section in man pages. */ virtual QCString trAuthor(bool /*first_capital*/, bool /*singular*/) { - return "ä˝č
"; + return "čč
"; } ////////////////////////////////////////////////////////////////////////// @@ -1304,7 +1345,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! Header used for the documentation section of a class' events. */ virtual QCString trEventDocumentation() { - return "ă¤ăăłă"; + return "ă¤ăăłă芳解"; } ////////////////////////////////////////////////////////////////////////// @@ -1329,7 +1370,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 */ virtual QCString trStaticPackageMembers() { - return "ăšăżăăŁăăŻé˘ć°"; + return "éçé˘ć°"; } /*! Used as a heading for a list of Java class variables with package * scope. @@ -1343,7 +1384,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 */ virtual QCString trStaticPackageAttribs() { - return "ăšăżăăŁăăŻĺ¤ć°"; + return "éçĺ¤ć°"; } ////////////////////////////////////////////////////////////////////////// @@ -1360,7 +1401,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! Put in front of the call graph for a function. */ virtual QCString trCallGraph() { - return "é˘ć°ăŽĺźăłĺşăă°ăŠă:"; + return "ĺźăłĺşăé˘äżĺł:"; } ////////////////////////////////////////////////////////////////////////// @@ -1386,16 +1427,16 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 { if (numDocuments==0) { - return "ĺ
ĽĺăăăćĄäťśăŤăăăăăăăăĽăĄăłăăăăăžăăă§ăă."; + return "ĺ
ĽĺćĄäťśăćşăăćć¸ăăăăžăăă"; } else if (numDocuments==1) { - return "ĺ
ĽĺăăăćĄäťśăŤăăăăăăăăĽăĄăłăă <b>1</b> äťśăżă¤ăăăžăă."; + return "ĺ
ĽĺćĄäťśăćşăăćć¸ă <b>1</b> äťśăăăžăă."; } else { - return "ĺ
ĽĺăăăćĄäťśăŤăăăăăăăăĽăĄăłăă <b>$num</b> äťśăżă¤ăăăžăă. " - "ćăä¸č´ăăŚăăăăŽăă襨示ăăăžă."; + return "ĺ
ĽĺćĄäťśăćşăăćć¸ă <b>$num</b> äťśăăăžăă. " + "ä¸č´ĺşŚăŽéŤăăăŽăă襨示ăăăžă."; } } /*! This string is put before the list of matched words, for each search @@ -1403,7 +1444,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 */ virtual QCString trSearchMatches() { - return "ăăăăăĺčŞ:"; + return "ç
§ĺčŞ:"; } ////////////////////////////////////////////////////////////////////////// @@ -1431,7 +1472,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 * of the directories. */ virtual QCString trDirDocumentation() - { return "ăăŁăŹăŻăăŞć§ć"; } + { return "ăăŁăŹăŻăăŞčŠłč§Ł"; } /*! This is used as the title of the directory index and also in the * Quick links of an HTML page, to link to the directory hierarchy. @@ -1482,15 +1523,14 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! This is used to introduce a caller (or called-by) graph */ virtual QCString trCallerGraph() { - // return "Here is the caller graph for this function:"; - return "ĺźĺşăă°ăŠă:"; + return "袍ĺźăłĺşăé˘äżĺł:"; } /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for enumeration values */ virtual QCString trEnumerationValueDocumentation() - { return "ĺćĺ"; } + { return "ĺćĺ芳解"; } ////////////////////////////////////////////////////////////////////////// @@ -1499,11 +1539,11 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! header that is put before the list of member subprograms (Fortran). */ virtual QCString trMemberFunctionDocumentationFortran() - { return "é˘ć°/ăľăăŤăźăăł"; } + { return "ăĄăłăé˘ć°/ăľăăŤăźăăłčŠłč§Ł"; } /*! This is put above each page as a link to the list of annotated data types (Fortran). */ virtual QCString trCompoundListFortran() - { return "ăăźăżĺ"; } + { return "ăăźăżĺä¸čŚ§"; } /*! This is put above each page as a link to all members of compounds (Fortran). */ virtual QCString trCompoundMembersFortran() @@ -1511,19 +1551,19 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! This is an introduction to the annotated compound list (Fortran). */ virtual QCString trCompoundListDescriptionFortran() - { return "ăăăŻăăźăżĺăŽä¸čŚ§ă§ă"; } + { return "ăăăŻăăźăżĺăŽä¸čŚ§ă§ă:"; } /*! This is an introduction to the page with all data types (Fortran). */ virtual QCString trCompoundMembersDescriptionFortran(bool extractAll) { - QCString result="ăăăŻ"; - result+="ăăŁăźăŤăăŽä¸čŚ§ă§ăăăăăă"; - if (extractAll) - { - result+="ăĺąăăŚăăăăźăżĺ"; - } - result+="ăŽčŞŹćă¸ăŞăłăŻăăŚăăžăă"; - return result; + QCString result="ăăăŻ"; + result+="ăăŁăźăŤăăŽä¸čŚ§ă§ăăăăăă"; + if (extractAll) + { + result+="ăĺąăăŚăăăăźăżĺ"; + } + result+="ăŽčŠłč§Łă¸ăŞăłăŻăăŚăăžăă"; + return result; } /*! This is used in LaTeX as the title of the chapter with the @@ -1536,7 +1576,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 * the documentation of all data types (Fortran). */ virtual QCString trTypeDocumentation() - { return "ăăźăżĺ"; } + { return "ăăźăżĺ芳解"; } /*! This is used in the documentation of a file as a header before the * list of (global) subprograms (Fortran). @@ -1549,7 +1589,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 * of documentation blocks for subprograms (Fortran) */ virtual QCString trSubprogramDocumentation() - { return "é˘ć°/ăľăăŤăźăăł"; } + { return "é˘ć°/ăľăăŤăźăăłčŠłč§Ł"; } /*! This is used in the documentation of a file/namespace/group before * the list of links to documented compounds (Fortran) @@ -1564,9 +1604,16 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 /*! used as an introduction to the modules list (Fortran) */ virtual QCString trModulesListDescription(bool extractAll) { - QCString result="ăăăŻ"; - if (!extractAll) result+="çćăăă"; - result+="ă˘ă¸ăĽăźăŤä¸čŚ§ă§ă"; + QCString result; + if (!extractAll) + { + result+="芳解ăč¨ăăăŚăă"; + } + else + { + result+="ĺ
¨"; + } + result+="ă˘ă¸ăĽăźăŤăŽä¸čŚ§ă§ă"; return result; } @@ -1611,7 +1658,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 { result+="ĺąăăŚăăă˘ă¸ăĽăźăŤ"; } - result+="ăŽčŞŹćă¸ăŞăłăŻăăŚăăžăă"; + result+="ăŽčŠłč§Łă¸ăŞăłăŻăăŚăăžăă"; return result; } @@ -1636,11 +1683,11 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 bool /*single*/) { // here s is one of " Module", " Struct" or " Union" // single is true implies a single file - QCString result=""; + QCString result="揥ăŽăăĄă¤ăŤăă"; switch(compType) { case ClassDef::Class: result+="ă˘ă¸ăĽăźăŤ"; break; - case ClassDef::Struct: result+="TYPE"; break; + case ClassDef::Struct: result+="ĺ"; break; case ClassDef::Union: result+="ĺ
ąç¨ä˝"; break; case ClassDef::Interface: result+="ă¤ăłăżăźăă§ăźăš"; break; case ClassDef::Protocol: result+="ăăăăłăŤ"; break; @@ -1648,7 +1695,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 case ClassDef::Exception: result+="äžĺ¤"; break; default: break; } - result+="ăŽčŞŹćăŻćŹĄăŽăăĄă¤ăŤăăçćăăăžăă:"; + result+="ăŽčŠłč§Łăć˝ĺşăăăžăă:"; return result; } /*! This is used for translation of the word that will possibly @@ -1657,7 +1704,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 */ virtual QCString trType(bool /*first_capital*/, bool /*singular*/) { - QCString result = "TYPE"; + QCString result = "ĺ"; return result; } /*! This is used for translation of the word that will possibly @@ -1676,6 +1723,258 @@ class TranslatorJapanese : public TranslatorAdapter_1_6_0 return "ĺĺśç´"; } +////////////////////////////////////////////////////////////////////////// +// new since 1.6.0 (mainly for the new search engine) +////////////////////////////////////////////////////////////////////////// + + /*! directory relation for \a name */ + virtual QCString trDirRelation(const char *name) + { + return QCString(name)+" é˘äż"; + } + + /*! Loading message shown when loading search results */ + virtual QCString trLoading() + { + return "čŞăżĺăä¸âŚ"; + } + + /*! Label used for search results in the global namespace */ + virtual QCString trGlobalNamespace() + { + return "大ĺĺĺ犺é"; + } + + /*! Message shown while searching */ + virtual QCString trSearching() + { + return "ć¤ç´˘ä¸âŚ"; + } + + /*! Text shown when no search results are found */ + virtual QCString trNoMatches() + { + return "ä¸č´ăăćĺĺăčŚă¤ăăăăžăă"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.6.3 (missing items for the directory pages) +////////////////////////////////////////////////////////////////////////// + + /*! when clicking a directory dependency label, a page with a + * table is shown. The heading for the first column mentions the + * source file that has a relation to another file. + */ + virtual QCString trFileIn(const char *name) + { + return (QCString)name+"ăŤăăăăĄă¤ăŤ"; + } + + /*! when clicking a directory dependency label, a page with a + * table is shown. The heading for the second column mentions the + * destination file that is included. + */ + virtual QCString trIncludesFileIn(const char *name) + { + return (QCString)name+"ăŤăăăăĄă¤ăŤă include ăăŚăă"; + } + + /** Compiles a date string. + * @param year Year in 4 digits + * @param month Month of the year: 1=January + * @param day Day of the Month: 1..31 + * @param dayOfWeek Day of the week: 1=Monday..7=Sunday + * @param hour Hour of the day: 0..23 + * @param minutes Minutes in the hour: 0..59 + * @param seconds Seconds within the minute: 0..59 + * @param includeTime Include time in the result string? + */ + virtual QCString trDateTime(int year,int month,int day,int dayOfWeek, + int hour,int minutes,int seconds, + bool includeTime) + { + static const char *days[] = { "ć", "çŤ", "ć°´", "ć¨", "é", "ĺ", "ćĽ" }; + QCString sdate; + sdate.sprintf("%.4dĺš´%.2dć%.2dćĽ(%s)",year,month,day,days[dayOfWeek-1]); + if (includeTime) + { + QCString stime; + stime.sprintf(" %.2dć%.2dĺ%.2dç§",hour,minutes,seconds); + sdate+=stime; + } + return sdate; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.7.5 +////////////////////////////////////////////////////////////////////////// + + /*! Header for the page with bibliographic citations */ + virtual QCString trCiteReferences() + { return "ć¸čŞĺç
§"; } + + /*! Text for copyright paragraph */ + virtual QCString trCopyright() + { return "čä˝ć¨Šćć"; } + + /*! Header for the graph showing the directory dependencies */ + virtual QCString trDirDepGraph(const char *name) + { return QCString(name)+" ăŽăăŁăŹăŻăăŞäžĺé˘äżĺł"; } + +////////////////////////////////////////////////////////////////////////// +// new since 1.8.0 +////////////////////////////////////////////////////////////////////////// + + /*! Detail level selector shown for hierarchical indices */ + virtual QCString trDetailLevel() + { return "襨示é幤"; } + + /*! Section header for list of template parameters */ + virtual QCString trTemplateParameters() + { return "ăăłăăŹăźăĺźć°"; } + + /*! Used in dot graph when UML_LOOK is enabled and there are many fields */ + virtual QCString trAndMore(const QCString &number) + { return "ăťă "+number+" äťśâŚ"; } + + /*! Used file list for a Java enum */ + virtual QCString trEnumGeneratedFromFiles(bool) + { + return "揥ăŽăăĄă¤ăŤăăăăŽĺćăŤă¤ăăŚăŽčŠłč§Łăć˝ĺşăăžăă:"; + } + + /*! Header of a Java enum page (Java enums are represented as classes). */ + virtual QCString trEnumReference(const char *name) + { return QCString("ĺć ")+name+" 芳解"; } + + /*! Used for a section containing inherited members */ + virtual QCString trInheritedFrom(const char *members,const char *what) + { return QCString("ĺşĺşăŻăŠăš ")+what+" ăŤĺąăăçśćż"+members; } + + /*! Header of the sections with inherited members specific for the + * base class(es) + */ + virtual QCString trAdditionalInheritedMembers() + { return "ăăŽäťăŽçśćżăĄăłă"; } + +////////////////////////////////////////////////////////////////////////// +// new since 1.8.2 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a tooltip for the toggle button that appears in the + * navigation tree in the HTML output when GENERATE_TREEVIEW is + * enabled. This tooltip explains the meaning of the button. + */ + virtual QCString trPanelSynchronisationTooltip(bool enable) + { + + QCString opt = enable ? "ćĺš" : "çĄĺš"; + return "ăŻăŞăăŻă§ĺć襨示ă"+opt+"ăŤăŞăăžă"; + } + + /*! Used in a method of an Objective-C class that is declared in a + * a category. Note that the @1 marker is required and is replaced + * by a link. + */ + virtual QCString trProvidedByCategory() + { + return "@1 ăŤăă´ăŞăźăăćäžăăăŚăăžăă"; + } + + /*! Used in a method of an Objective-C category that extends a class. + * Note that the @1 marker is required and is replaced by a link to + * the class method. + */ + virtual QCString trExtendsClass() + { + return "@1 ăćĄĺźľăăŚăăžăă"; + } + + /*! Used as the header of a list of class methods in Objective-C. + * These are similar to static public member functions in C++. + */ + virtual QCString trClassMethods() + { + return "ăŻăŠăšăĄă˝ăă"; + } + + /*! Used as the header of a list of instance methods in Objective-C. + * These are similar to public member functions in C++. + */ + virtual QCString trInstanceMethods() + { + return "ĺŽä˝ăĄă˝ăă"; + } + + /*! Used as the header of the member functions of an Objective-C class. + */ + virtual QCString trMethodDocumentation() + { + return "ăĄă˝ăă芳解"; + } + + /*! Used as the title of the design overview picture created for the + * VHDL output. + */ + virtual QCString trDesignOverview() + { + return "ăăśă¤ăłćŚčŚł"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.8.4 +////////////////////////////////////////////////////////////////////////// + + /** old style UNO IDL services: implemented interfaces */ + virtual QCString trInterfaces() + { return "ĺŽčŁ
ăăăă¤ăłăżăźăăŠăźăš"; } + + /** old style UNO IDL services: inherited services */ + virtual QCString trServices() + { return "çśćżăăăăľăźăăš"; } + + /** UNO IDL constant groups */ + virtual QCString trConstantGroups() + { return "ĺŽć°ă°ăŤăźă"; } + + /** UNO IDL constant groups */ + virtual QCString trConstantGroupReference(const char *namespaceName) + { + QCString result=namespaceName; + result+=" ĺŽć°ă°ăŤăźă芳解"; + return result; + } + /** UNO IDL service page title */ + virtual QCString trServiceReference(const char *sName) + { + QCString result=(QCString)sName; + result+=" ăľăźăăščŠłč§Ł"; + return result; + } + /** UNO IDL singleton page title */ + virtual QCString trSingletonReference(const char *sName) + { + QCString result=(QCString)sName; + result+=" Singleton 芳解"; + return result; + } + /** UNO IDL service page */ + virtual QCString trServiceGeneratedFromFiles(bool /*single*/) + { + // single is true implies a single file + return "揥ăŽăăĄă¤ăŤăăăăŽăľăźăăšăŤă¤ăăŚ" + "ăŽčŠłč§Łăć˝ĺşăăžăă:"; + } + /** UNO IDL singleton page */ + virtual QCString trSingletonGeneratedFromFiles(bool /*single*/) + { + // single is true implies a single file + return "揥ăŽăăĄă¤ăŤăăă㎠Singleton ăŤă¤ăăŚ" + "ăŽčŠłč§Łăć˝ĺşăăžăă:"; + } + +////////////////////////////////////////////////////////////////////////// + }; #endif diff --git a/src/translator_lv.h b/src/translator_lv.h index 4460946..054310c 100644 --- a/src/translator_lv.h +++ b/src/translator_lv.h @@ -48,7 +48,7 @@ * Last Doxygen version covered : 1.8.2 */ -class TranslatorLatvian : public Translator +class TranslatorLatvian : public TranslatorAdapter_1_8_4 { public: @@ -602,6 +602,7 @@ class TranslatorLatvian : public Translator case ClassDef::Protocol: result+=" protokola"; break; case ClassDef::Category: result+=" kategorijas"; break; case ClassDef::Exception: result+=" izĹÄmuma"; break; + default: break; } if (isTemplate) result+=" veidnes"; result+=" apraksts"; @@ -760,6 +761,7 @@ class TranslatorLatvian : public Translator case ClassDef::Protocol: result+=" protokola"; break; case ClassDef::Category: result+="s kategorijas"; break; case ClassDef::Exception: result+=" izĹÄmuma"; break; + default: break; } result+=" dokumentÄcijas tika ÄŁenerÄta no ĹĄÄda fail"; if (single) result+="a:"; else result+="iem:"; @@ -1636,6 +1638,7 @@ class TranslatorLatvian : public Translator case ClassDef::Protocol: result+=" protokola"; break; case ClassDef::Category: result+=" kategorijas"; break; case ClassDef::Exception: result+=" izĹÄmuma"; break; + default: break; } if (isTemplate) result+=" sagataves"; result+=" atsauce"; @@ -1704,6 +1707,7 @@ class TranslatorLatvian : public Translator case ClassDef::Protocol: result+="im protokolam"; break; case ClassDef::Category: result+="ai kategorijai"; break; case ClassDef::Exception: result+="im izĹÄmumam"; break; + default: break; } result+=" tika ÄŁenerÄta no fail"; if (single) result+="a:"; else result+="iem:"; diff --git a/src/translator_mk.h b/src/translator_mk.h index 15da8e1..b753756 100644 --- a/src/translator_mk.h +++ b/src/translator_mk.h @@ -16,7 +16,7 @@ */ // Тranslated by Slave Jovanovski <slavejovanovski@yahoo.com> // -// The cyrilic strings were entered using Macedonian language support in +// The cyrillic strings were entered using Macedonian language support in // Windows. The editor used was Eclipse 3.2. The file was saved in UTF-8. // // Updates: diff --git a/src/translator_ro.h b/src/translator_ro.h index 86240c1..9bbadeb 100644 --- a/src/translator_ro.h +++ b/src/translator_ro.h @@ -1899,7 +1899,7 @@ class TranslatorRomanian : public Translator virtual QCString trPanelSynchronisationTooltip(bool enable) { QCString opt = enable ? "activa" : "dezactiva"; - return "apasÄ 'click' pentru a "+opt+" sincronizarea panourilor"; + return "apasÄ click pentru a "+opt+" sincronizarea panourilor"; } /*! Used in a method of an Objective-C class that is declared in a diff --git a/src/translator_ru.h b/src/translator_ru.h index 7bd40f1..07aa63b 100644 --- a/src/translator_ru.h +++ b/src/translator_ru.h @@ -26,7 +26,7 @@ #ifndef TRANSLATOR_RU_H #define TRANSLATOR_RU_H -class TranslatorRussian : public TranslatorAdapter_1_7_5 +class TranslatorRussian : public Translator { public: /*! Used for identification of the language. */ @@ -1794,6 +1794,181 @@ class TranslatorRussian : public TranslatorAdapter_1_7_5 } return sdate; } + +/////////////////////////////////////////////////////////////////////// +// new since 1.7.5 +/////////////////////////////////////////////////////////////////////// + + /*! Header for the page with bibliographic citations */ + virtual QCString trCiteReferences() + { return "ĐийНиОгŃĐ°ŃиŃĐľŃкио ŃŃŃНки"; } + + /*! Text for copyright paragraph */ + virtual QCString trCopyright() + { return "ĐвŃĐžŃŃŃвО"; } + + /*! Header for the graph showing the directory dependencies */ + virtual QCString trDirDepGraph(const char *name) + { return QCString("ĐиŃокŃĐžŃĐ¸Ń ĐłŃĐ°ŃĐ° СавиŃиПОŃŃоК ")+name+":"; } + +/////////////////////////////////////////////////////////////////////// +// new since 1.8.0 +/////////////////////////////////////////////////////////////////////// + + /*! Detail level selector shown for hierarchical indices */ + virtual QCString trDetailLevel() + { return "ŃŃĐžĐ˛ĐľĐ˝Ń Đ´ĐľŃаНиСаŃии"; } + + /*! Section header for list of template parameters */ + virtual QCString trTemplateParameters() + { return "ĐĐ°ŃаПоŃŃŃ ŃайНОна"; } + + /*! Used in dot graph when UML_LOOK is enabled and there are many fields */ + virtual QCString trAndMore(const QCString &number) + { return "и "+number+" йОНŃŃĐľ..."; } + + /*! Used file list for a Java enum */ + virtual QCString trEnumGeneratedFromFiles(bool single) + { QCString result = "ĐОкŃПонŃĐ°ŃĐ¸Ń Đ´ĐťŃ ŃŃОгО поŃĐľŃиŃĐťĐľĐ˝Đ¸Ń ŃгоноŃĐľŃиŃОвана иС ŃаКН"; + if (!single) result += "Ов"; + result+="Đ°:"; + return result; + } + + /*! Header of a Java enum page (Java enums are represented as classes). */ + virtual QCString trEnumReference(const char *name) + { return QCString(name)+" ĐĄŃŃНки на поŃĐľŃиŃНонио"; } + + /*! Used for a section containing inherited members */ + virtual QCString trInheritedFrom(const char *members,const char *what) + { return QCString(members)+" ŃнаŃНодОваннŃĐľ ĐžŃ "+what; } + + /*! Header of the sections with inherited members specific for the + * base class(es) + */ + virtual QCString trAdditionalInheritedMembers() + { return "ĐОпОНниŃоНŃĐ˝ŃĐľ ŃнаŃНодОваннŃĐľ ŃНонŃ"; } + +/////////////////////////////////////////////////////////////////////// +// new since 1.8.2 +/////////////////////////////////////////////////////////////////////// + + /*! Used as a tooltip for the toggle button that appears in the + * navigation tree in the HTML output when GENERATE_TREEVIEW is + * enabled. This tooltip explains the meaning of the button. + */ + virtual QCString trPanelSynchronisationTooltip(bool enable) + { + QCString opt = enable ? "вкНŃŃиŃŃ" : "вŃкНŃŃиŃŃ"; + return "наМПиŃĐľ на "+opt+" Đ´ĐťŃ ŃинŃ
ŃОниСаŃии паноНоК"; + } + + /*! Used in a method of an Objective-C class that is declared in a + * a category. Note that the @1 marker is required and is replaced + * by a link. + */ + virtual QCString trProvidedByCategory() + { + return "ĐĐž ĐłŃŃппаП @1."; + } + + /*! Used in a method of an Objective-C category that extends a class. + * Note that the @1 marker is required and is replaced by a link to + * the class method. + */ + virtual QCString trExtendsClass() + { + return "Đ Đ°ŃŃиŃŃĐľŃ ĐşĐťĐ°ŃŃ @1."; + } + + /*! Used as the header of a list of class methods in Objective-C. + * These are similar to static public member functions in C++. + */ + virtual QCString trClassMethods() + { + return "ĐĐľŃĐžĐ´Ń ĐşĐťĐ°ŃŃĐ°"; + } + + /*! Used as the header of a list of instance methods in Objective-C. + * These are similar to public member functions in C++. + */ + virtual QCString trInstanceMethods() + { + return "ĐĐľŃĐžĐ´Ń ŃкСоПпНŃŃĐ°"; + } + + /*! Used as the header of the member functions of an Objective-C class. + */ + virtual QCString trMethodDocumentation() + { + return "ĐОкŃПонŃĐ°ŃĐ¸Ń ĐźĐľŃОда"; + } + + /*! Used as the title of the design overview picture created for the + * VHDL output. + */ + virtual QCString trDesignOverview() + { + return "ĐĐąĐˇĐžŃ Đ´Đ¸ĐˇĐ°ĐšĐ˝Đ°"; + } + +/////////////////////////////////////////////////////////////////////// +// new since 1.8.4 +/////////////////////////////////////////////////////////////////////// + + /** old style UNO IDL services: implemented interfaces */ + virtual QCString trInterfaces() + { return "ĐĐşŃпОŃŃиŃŃоПŃĐľ инŃĐľŃŃоКŃŃ"; } + + /** old style UNO IDL services: inherited services */ + virtual QCString trServices() + { return "ĐкНŃŃŃннŃĐľ ŃĐľŃвиŃŃ"; } + + /** UNO IDL constant groups */ + virtual QCString trConstantGroups() + { return "ĐĐžŃŃĐžŃннŃĐľ ĐłŃŃппŃ"; } + + /** UNO IDL constant groups */ + virtual QCString trConstantGroupReference(const char *namespaceName) + { + QCString result=namespaceName; + result+=" ĐĄŃŃНка на пОŃŃĐžŃннŃŃ ĐłŃŃппŃ"; + return result; + } + /** UNO IDL service page title */ + virtual QCString trServiceReference(const char *sName) + { + QCString result=(QCString)sName; + result+=" ĐĄŃŃНка на ŃĐľŃвиŃ"; + return result; + } + /** UNO IDL singleton page title */ + virtual QCString trSingletonReference(const char *sName) + { + QCString result=(QCString)sName; + result+=" ĐĄŃŃНка на ОдинОŃĐşŃ"; + return result; + } + /** UNO IDL service page */ + virtual QCString trServiceGeneratedFromFiles(bool single) + { + // single is true implies a single file + QCString result=(QCString)"ĐОкŃПонŃĐ°ŃĐ¸Ń Đ´ĐťŃ ŃŃОгО ŃĐľŃвиŃĐ° " + "ŃгоноŃиŃОванна иС ŃНодŃŃŃогО ŃаКН"; + if (single) result+="Đ°:"; else result+="Ов:"; + return result; + } + /** UNO IDL singleton page */ + virtual QCString trSingletonGeneratedFromFiles(bool single) + { + // single is true implies a single file + QCString result=(QCString)"ĐОкŃПонŃĐ°ŃĐ¸Ń ĐżĐž ŃŃĐžĐźŃ ĐžĐ´Đ¸Đ˝ĐžŃко " + "ŃгоноŃиŃОванна иС ŃНодŃŃŃогО ŃаКН"; + if (single) result+="Đ°:"; else result+="Ов:"; + return result; + } + +/////////////////////////////////////////////////////////////////////// }; #endif diff --git a/src/translator_sc.h b/src/translator_sc.h index 37519d2..af2d7df 100644 --- a/src/translator_sc.h +++ b/src/translator_sc.h @@ -40,7 +40,7 @@ Translator class (by the local maintainer) when the localized translator is made up-to-date again. */ -class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0 +class TranslatorSerbianCyrillic : public TranslatorAdapter_1_6_0 { public: @@ -53,7 +53,7 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0 * the identification used in language.cpp. */ virtual QCString idLanguage() - { return "serbiancyr"; } + { return "serbian-cyrillic"; } /*! Used to get the LaTeX command(s) for the language support. * This method should return string with commands that switch diff --git a/src/util.cpp b/src/util.cpp index 58214bd..545cd43 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -218,6 +218,7 @@ QCString stripAnonymousNamespaceScope(const QCString &s) { int i,p=0,l; QCString newScope; + int sl = s.length(); while ((i=getScopeFragment(s,p,&l))!=-1) { //printf("Scope fragment %s\n",s.mid(i,l).data()); @@ -229,10 +230,10 @@ QCString stripAnonymousNamespaceScope(const QCString &s) newScope+=s.mid(i,l); } } - else + else if (i<sl) { if (!newScope.isEmpty()) newScope+="::"; - newScope+=s.right(s.length()-i); + newScope+=s.right(sl-i); goto done; } p=i+l; @@ -1652,7 +1653,9 @@ static const char virtualScope[] = { 'v', 'i', 'r', 't', 'u', 'a', 'l', ':' }; QCString removeRedundantWhiteSpace(const QCString &s) { static bool cliSupport = Config_getBool("CPP_CLI_SUPPORT"); - if (s.isEmpty()) return s; + static bool vhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); + + if (s.isEmpty() || vhdl) return s; static GrowBuf growBuf; //int resultLen = 1024; //int resultPos = 0; @@ -1870,7 +1873,8 @@ int findParameterList(const QString &name) } else { - return bracePos; + int bp = bracePos>0 ? name.findRev('(',bracePos-1) : -1; + return bp==-1 ? bracePos : bp; } } } while (pos!=-1); @@ -4304,7 +4308,27 @@ bool getDefs(const QCString &scName, //printf("found %d candidate members\n",members.count()); if (members.count()>0) // at least one match { - md=members.last(); + if (currentFile) + { + //printf("multiple results; pick one from file:%s\n", currentFile->name().data()); + md = members.first(); + while (md) + { + if (md->getFileDef() && md->getFileDef()->name() == currentFile->name()) + { + break; // found match in the current file + } + md=members.next(); + } + if (!md) // member not in the current file + { + md=members.last(); + } + } + else + { + md=members.last(); + } } if (md && (md->getEnumScope()==0 || !md->getEnumScope()->isStrong())) // found a matching global member, that is not a scoped enum value (or uniquely matches) @@ -4410,7 +4434,7 @@ bool resolveRef(/* in */ const char *scName, QCString tsName = name; //bool memberScopeFirst = tsName.find('#')!=-1; QCString fullName = substitute(tsName,"#","::"); - if (fullName.find("anonymous_namespace{")==-1 && fullName.find('<')==-1) + if (fullName.find("anonymous_namespace{")==-1) { fullName = removeRedundantWhiteSpace(substitute(fullName,".","::")); } @@ -5053,6 +5077,34 @@ static void initBaseClassHierarchy(BaseClassList *bcl) cd->visited=FALSE; } } +//---------------------------------------------------------------------------- + +bool classHasVisibleChildren(ClassDef *cd) +{ + BaseClassList *bcl; + + if (cd->getLanguage()==SrcLangExt_VHDL) // reverse baseClass/subClass relation + { + if (cd->baseClasses()==0) return FALSE; + bcl=cd->baseClasses(); + } + else + { + if (cd->subClasses()==0) return FALSE; + bcl=cd->subClasses(); + } + + BaseClassListIterator bcli(*bcl); + for ( ; bcli.current() ; ++bcli) + { + if (bcli.current()->classDef->isVisibleInHierarchy()) + { + return TRUE; + } + } + return FALSE; +} + //---------------------------------------------------------------------------- @@ -5860,29 +5912,29 @@ int extractClassNameFromType(const QCString &type,int &pos,QCString &name,QCStri static const QRegExp re_ftn("[a-z_A-Z\\x80-\\xFF][()=_a-z_A-Z0-9:\\x80-\\xFF]*"); QRegExp re; - if (lang == SrcLangExt_Fortran) + name.resize(0); + templSpec.resize(0); + int i,l; + int typeLen=type.length(); + if (typeLen>0) { - if (type.at(pos)==',') return -1; - if (type.left(4).lower()=="type") + if (lang == SrcLangExt_Fortran) { - re = re_norm; + if (type.at(pos)==',') return -1; + if (type.left(4).lower()=="type") + { + re = re_norm; + } + else + { + re = re_ftn; + } } else { - re = re_ftn; + re = re_norm; } - } - else - { - re = re_norm; - } - name.resize(0); - templSpec.resize(0); - int i,l; - int typeLen=type.length(); - if (typeLen>0) - { if ((i=re.match(type,pos,&l))!=-1) // for each class name in the type { int ts=i+l; @@ -6293,11 +6345,11 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle, if (tagInfo) { pd->setReference(tagInfo->tagName); - pd->setFileName(tagInfo->fileName); + pd->setFileName(tagInfo->fileName,TRUE); } else { - pd->setFileName(convertNameToFile(pd->name(),FALSE,TRUE)); + pd->setFileName(convertNameToFile(pd->name(),FALSE,TRUE),FALSE); } //printf("Appending page `%s'\n",baseName.data()); @@ -6437,7 +6489,7 @@ void filterLatexString(FTextStream &t,const char *str, case '}': t << "\\}"; break; case '<': t << "$<$"; break; case '>': t << "$>$"; break; - case '|': t << "$|$"; break; + case '|': t << "$\\vert$"; break; case '~': t << "$\\sim$"; break; case '[': if (Config_getBool("PDF_HYPERLINKS") || insideItem) t << "\\mbox{[}"; @@ -6963,7 +7015,7 @@ QCString parseCommentAsText(const Definition *scope,const MemberDef *md, static QDict<void> aliasesProcessed; -static QCString expandAliasRec(const QCString s); +static QCString expandAliasRec(const QCString s,bool allowRecursion=FALSE); struct Marker { @@ -7085,7 +7137,7 @@ static QCString replaceAliasArguments(const QCString &aliasValue,const QCString //printf("part before marker %d: '%s'\n",i,aliasValue.mid(p,m->pos-p).data()); if (m->number>0 && m->number<=(int)args.count()) // valid number { - result+=*args.at(m->number-1); + result+=expandAliasRec(*args.at(m->number-1),TRUE); //printf("marker index=%d pos=%d number=%d size=%d replacement %s\n",i,m->pos,m->number,m->size, // args.at(m->number-1)->data()); } @@ -7093,7 +7145,7 @@ static QCString replaceAliasArguments(const QCString &aliasValue,const QCString } result+=aliasValue.right(l-p); // append remainder //printf("string after replacement of markers: '%s'\n",result.data()); - + // expand the result again result = substitute(result,"\\{","{"); result = substitute(result,"\\}","}"); @@ -7124,7 +7176,7 @@ static QCString escapeCommas(const QCString &s) return result.data(); } -static QCString expandAliasRec(const QCString s) +static QCString expandAliasRec(const QCString s,bool allowRecursion) { QCString result; static QRegExp cmdPat("[\\\\@][a-z_A-Z][a-z_A-Z0-9]*"); @@ -7157,10 +7209,10 @@ static QCString expandAliasRec(const QCString s) } //printf("Found command s='%s' cmd='%s' numArgs=%d args='%s' aliasText=%s\n", // s.data(),cmd.data(),numArgs,args.data(),aliasText?aliasText->data():"<none>"); - if (aliasesProcessed.find(cmd)==0 && aliasText) // expand the alias + if ((allowRecursion || aliasesProcessed.find(cmd)==0) && aliasText) // expand the alias { //printf("is an alias!\n"); - aliasesProcessed.insert(cmd,(void *)0x8); + if (!allowRecursion) aliasesProcessed.insert(cmd,(void *)0x8); QCString val = *aliasText; if (hasArgs) { @@ -7169,7 +7221,7 @@ static QCString expandAliasRec(const QCString s) // aliasText->data(),val.data(),args.data()); } result+=expandAliasRec(val); - aliasesProcessed.remove(cmd); + if (!allowRecursion) aliasesProcessed.remove(cmd); p=i+l; if (hasArgs) p+=argsLen+2; } @@ -7682,6 +7734,7 @@ QCString extractBlock(const QCString text,const QCString marker) p=i+1; } l1=p; + int lp=i; if (found) { while ((i=text.find('\n',p))!=-1) @@ -7692,10 +7745,15 @@ QCString extractBlock(const QCString text,const QCString marker) break; } p=i+1; + lp=i; } } + if (l2==-1) // marker at last line without newline (see bug706874) + { + l2=lp; + } //printf("text=[%s]\n",text.mid(l1,l2-l1).data()); - return text.mid(l1,l2-l1); + return l2>l1 ? text.mid(l1,l2-l1) : QCString(); } /** Returns a string representation of \a lang. */ @@ -7890,3 +7948,326 @@ void addDocCrossReference(MemberDef *src,MemberDef *dst) } } +//-------------------------------------------------------------------------------------- + +/*! @brief Get one unicode character as an unsigned integer from utf-8 string + * + * @param s utf-8 encoded string + * @param idx byte position of given string \a s. + * @return the unicode codepoint, 0 - MAX_UNICODE_CODEPOINT + * @see getNextUtf8OrToLower() + * @see getNextUtf8OrToUpper() + */ +uint getUtf8Code( const QCString& s, int idx ) +{ + const int length = s.length(); + if (idx >= length) { return 0; } + const uint c0 = (uchar)s.at(idx); + if ( c0 < 0xC2 || c0 >= 0xF8 ) // 1 byte character + { + return c0; + } + if (idx+1 >= length) { return 0; } + const uint c1 = ((uchar)s.at(idx+1)) & 0x3f; + if ( c0 < 0xE0 ) // 2 byte character + { + return ((c0 & 0x1f) << 6) | c1; + } + if (idx+2 >= length) { return 0; } + const uint c2 = ((uchar)s.at(idx+2)) & 0x3f; + if ( c0 < 0xF0 ) // 3 byte character + { + return ((c0 & 0x0f) << 12) | (c1 << 6) | c2; + } + if (idx+3 >= length) { return 0; } + // 4 byte character + const uint c3 = ((uchar)s.at(idx+3)) & 0x3f; + return ((c0 & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3; +} + + +/*! @brief Returns one unicode character as an unsigned integer + * from utf-8 string, making the character lower case if it was upper case. + * + * @param s utf-8 encoded string + * @param idx byte position of given string \a s. + * @return the unicode codepoint, 0 - MAX_UNICODE_CODEPOINT, excludes 'A'-'Z' + * @see getNextUtf8Code() +*/ +uint getUtf8CodeToLower( const QCString& s, int idx ) +{ + const uint v = getUtf8Code( s, idx ); + return v < 0x7f ? tolower( v ) : v; +} + + +/*! @brief Returns one unicode character as ian unsigned interger + * from utf-8 string, making the character upper case if it was lower case. + * + * @param s utf-8 encoded string + * @param idx byte position of given string \a s. + * @return the unicode codepoint, 0 - MAX_UNICODE_CODEPOINT, excludes 'A'-'Z' + * @see getNextUtf8Code() + */ +uint getUtf8CodeToUpper( const QCString& s, int idx ) +{ + const uint v = getUtf8Code( s, idx ); + return v < 0x7f ? toupper( v ) : v; +} + +//-------------------------------------------------------------------------------------- + +bool namespaceHasVisibleChild(NamespaceDef *nd,bool includeClasses) +{ + if (nd->getNamespaceSDict()) + { + NamespaceSDict::Iterator cnli(*nd->getNamespaceSDict()); + NamespaceDef *cnd; + for (cnli.toFirst();(cnd=cnli.current());++cnli) + { + if (cnd->isLinkable() && cnd->localName().find('@')==-1) + { + return TRUE; + } + else if (namespaceHasVisibleChild(cnd,includeClasses)) + { + return TRUE; + } + } + } + if (includeClasses && nd->getClassSDict()) + { + ClassSDict::Iterator cli(*nd->getClassSDict()); + ClassDef *cd; + for (;(cd=cli.current());++cli) + { + if (cd->isLinkableInProject() && cd->templateMaster()==0) + { + return TRUE; + } + } + } + return FALSE; +} + +//---------------------------------------------------------------------------- + +bool classVisibleInIndex(ClassDef *cd) +{ + static bool allExternals = Config_getBool("ALLEXTERNALS"); + return (allExternals && cd->isLinkable()) || cd->isLinkableInProject(); +} + +//---------------------------------------------------------------------------- + +QCString extractDirection(QCString &docs) +{ + QRegExp re("\\[[^\\]]+\\]"); // [...] + int l=0; + if (re.match(docs,0,&l)==0) + { + int inPos = docs.find("in", 1,FALSE); + int outPos = docs.find("out",1,FALSE); + bool input = inPos!=-1 && inPos<l; + bool output = outPos!=-1 && outPos<l; + if (input || output) // in,out attributes + { + docs = docs.mid(l); // strip attributes + if (input && output) return "[in,out]"; + else if (input) return "[in]"; + else if (output) return "[out]"; + } + } + return QCString(); +} + +//----------------------------------------------------------- + +/** Computes for a given list type \a inListType, which are the + * the corresponding list type(s) in the base class that are to be + * added to this list. + * + * So for public inheritance, the mapping is 1-1, so outListType1=inListType + * Private members are to be hidden completely. + * + * For protected inheritance, both protected and public members of the + * base class should be joined in the protected member section. + * + * For private inheritance, both protected and public members of the + * base class should be joined in the private member section. + */ +void convertProtectionLevel( + MemberListType inListType, + Protection inProt, + int *outListType1, + int *outListType2 + ) +{ + static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); + // default representing 1-1 mapping + *outListType1=inListType; + *outListType2=-1; + if (inProt==Public) + { + switch (inListType) // in the private section of the derived class, + // the private section of the base class should not + // be visible + { + case MemberListType_priMethods: + case MemberListType_priStaticMethods: + case MemberListType_priSlots: + case MemberListType_priAttribs: + case MemberListType_priStaticAttribs: + case MemberListType_priTypes: + *outListType1=-1; + *outListType2=-1; + break; + default: + break; + } + } + else if (inProt==Protected) // Protected inheritance + { + switch (inListType) // in the protected section of the derived class, + // both the public and protected members are shown + // as protected + { + case MemberListType_pubMethods: + case MemberListType_pubStaticMethods: + case MemberListType_pubSlots: + case MemberListType_pubAttribs: + case MemberListType_pubStaticAttribs: + case MemberListType_pubTypes: + case MemberListType_priMethods: + case MemberListType_priStaticMethods: + case MemberListType_priSlots: + case MemberListType_priAttribs: + case MemberListType_priStaticAttribs: + case MemberListType_priTypes: + *outListType1=-1; + *outListType2=-1; + break; + + case MemberListType_proMethods: + *outListType2=MemberListType_pubMethods; + break; + case MemberListType_proStaticMethods: + *outListType2=MemberListType_pubStaticMethods; + break; + case MemberListType_proSlots: + *outListType2=MemberListType_pubSlots; + break; + case MemberListType_proAttribs: + *outListType2=MemberListType_pubAttribs; + break; + case MemberListType_proStaticAttribs: + *outListType2=MemberListType_pubStaticAttribs; + break; + case MemberListType_proTypes: + *outListType2=MemberListType_pubTypes; + break; + default: + break; + } + } + else if (inProt==Private) + { + switch (inListType) // in the private section of the derived class, + // both the public and protected members are shown + // as private + { + case MemberListType_pubMethods: + case MemberListType_pubStaticMethods: + case MemberListType_pubSlots: + case MemberListType_pubAttribs: + case MemberListType_pubStaticAttribs: + case MemberListType_pubTypes: + case MemberListType_proMethods: + case MemberListType_proStaticMethods: + case MemberListType_proSlots: + case MemberListType_proAttribs: + case MemberListType_proStaticAttribs: + case MemberListType_proTypes: + *outListType1=-1; + *outListType2=-1; + break; + + case MemberListType_priMethods: + if (extractPrivate) + { + *outListType1=MemberListType_pubMethods; + *outListType2=MemberListType_proMethods; + } + else + { + *outListType1=-1; + *outListType2=-1; + } + break; + case MemberListType_priStaticMethods: + if (extractPrivate) + { + *outListType1=MemberListType_pubStaticMethods; + *outListType2=MemberListType_proStaticMethods; + } + else + { + *outListType1=-1; + *outListType2=-1; + } + break; + case MemberListType_priSlots: + if (extractPrivate) + { + *outListType1=MemberListType_pubSlots; + *outListType1=MemberListType_proSlots; + } + else + { + *outListType1=-1; + *outListType2=-1; + } + break; + case MemberListType_priAttribs: + if (extractPrivate) + { + *outListType1=MemberListType_pubAttribs; + *outListType2=MemberListType_proAttribs; + } + else + { + *outListType1=-1; + *outListType2=-1; + } + break; + case MemberListType_priStaticAttribs: + if (extractPrivate) + { + *outListType1=MemberListType_pubStaticAttribs; + *outListType2=MemberListType_proStaticAttribs; + } + else + { + *outListType1=-1; + *outListType2=-1; + } + break; + case MemberListType_priTypes: + if (extractPrivate) + { + *outListType1=MemberListType_pubTypes; + *outListType2=MemberListType_proTypes; + } + else + { + *outListType1=-1; + *outListType2=-1; + } + break; + default: + break; + } + } + //printf("convertProtectionLevel(type=%d prot=%d): %d,%d\n", + // inListType,inProt,*outListType1,*outListType2); +} @@ -25,6 +25,7 @@ #include <qlist.h> #include <ctype.h> #include "types.h" +#include "sortdict.h" //-------------------------------------------------------------------- @@ -87,6 +88,33 @@ class TextGeneratorOLImpl : public TextGeneratorIntf //-------------------------------------------------------------------- +/** @brief maps a unicode character code to a list of T::ElementType's + */ +template<class T> +class LetterToIndexMap : public SIntDict<T> +{ + public: + LetterToIndexMap() { SIntDict<T>::setAutoDelete(TRUE); } + int compareItems(QCollection::Item item1, QCollection::Item item2) + { + T *l1=(T *)item1; + T *l2=(T *)item2; + return (int)l1->letter()-(int)l2->letter(); + } + void append(uint letter,typename T::ElementType *elem) + { + T *l = SIntDict<T>::find((int)letter); + if (l==0) + { + l = new T(letter); + SIntDict<T>::inSort((int)letter,l); + } + l->append(elem); + } +}; + +//-------------------------------------------------------------------- + QCString langToString(SrcLangExt lang); QCString getLanguageSpecificSeparator(SrcLangExt lang,bool classScope=FALSE); @@ -229,6 +257,9 @@ QCString replaceAnonymousScopes(const QCString &s,const char *replacement=0); void initClassHierarchy(ClassSDict *cl); bool hasVisibleRoot(BaseClassList *bcl); +bool classHasVisibleChildren(ClassDef *cd); +bool namespaceHasVisibleChild(NamespaceDef *nd,bool includeClasses); +bool classVisibleInIndex(ClassDef *cd); int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level=0); Protection classInheritedProtectionLevel(ClassDef *cd,ClassDef *bcd,Protection prot=Public,int level=0); @@ -411,5 +442,18 @@ bool fileVisibleInIndex(FileDef *fd,bool &genSourceFile); void addDocCrossReference(MemberDef *src,MemberDef *dst); +uint getUtf8Code( const QCString& s, int idx ); +uint getUtf8CodeToLower( const QCString& s, int idx ); +uint getUtf8CodeToUpper( const QCString& s, int idx ); + +QCString extractDirection(QCString &docs); + +void convertProtectionLevel( + MemberListType inListType, + Protection inProt, + int *outListType1, + int *outListType2 + ); + #endif diff --git a/src/version.py b/src/version.py new file mode 100755 index 0000000..c53303d --- /dev/null +++ b/src/version.py @@ -0,0 +1,57 @@ +# + +# script to read the version information from `../configure` +# relevant lines are starting with: +# `doxygen_version_major` +# `doxygen_version_minor` +# `doxygen_version_revision` +# `doxygen_version_mmn` +# the collected information is written to: `../VERSION` and `../src/version.cpp` +# +import sys +# +# set 'default' values +# +major = 0 +minor = 0 +revision = 0 +mnt = 'NO' +# +# open input file +# read file and get relevant information +# close +# +f = open('../configure', 'r') +for line in f: + # check if line can match (saves 3 comparisons) + if (line.startswith('doxygen_version')): + if (line.startswith('doxygen_version_major')): + major = line.replace('doxygen_version_major=','') + elif (line.startswith('doxygen_version_minor')): + minor = line.replace('doxygen_version_minor=','') + elif (line.startswith('doxygen_version_revision')): + revision = line.replace('doxygen_version_revision=','') + elif (line.startswith('doxygen_version_mmn')): + mnt = line.replace('doxygen_version_mmn=','') +f.close() + +# strip superfluous '\n` +major = major.replace('\n','') +minor = minor.replace('\n','') +revision = revision.replace('\n','') +mnt = mnt.replace('\n','') +# +# open output files +# write relevant infomation +# close files +# +f1 = open('../VERSION','w') +f2 = open('../src/version.cpp','w') +if (mnt == 'NO'): + f1.write(major + '.' + minor + '.' + revision) + f2.write('char versionString[]="' + major + '.' + minor + '.' + revision + '";') +else: + f1.write(major + '.' + minor + '.' + revision + '-' + mnt) + f2.write('char versionString[]="' + major + '.' + minor + '.' + revision + '-' + mnt + '";') +f1.close() +f2.close() diff --git a/src/vhdlcode.h b/src/vhdlcode.h index dab2624..e21ddea 100644 --- a/src/vhdlcode.h +++ b/src/vhdlcode.h @@ -8,7 +8,8 @@ class MemberDef; void parseVhdlCode(CodeOutputInterface &,const char *,const QCString &, bool ,const char *,FileDef *fd, int startLine,int endLine,bool inlineFragment, - MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx); + MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx, + bool collectXRefs); void resetVhdlCodeParserState(); void codeFreeVhdlScanner(); diff --git a/src/vhdlcode.l b/src/vhdlcode.l index 11da962..94ba3c0 100644 --- a/src/vhdlcode.l +++ b/src/vhdlcode.l @@ -1512,10 +1512,12 @@ void resetVhdlCodeParserState() void parseVhdlCode(CodeOutputInterface &od,const char *className,const QCString &s, bool /*exBlock*/, const char *exName,FileDef *fd, int startLine,int endLine,bool inlineFragment, - MemberDef *memberDef,bool,Definition *searchCtx) + MemberDef *memberDef,bool,Definition *searchCtx, + bool /* collectXRefs */) { //printf("***parseCode() exBlock=%d exName=%s fd=%p\n",exBlock,exName,fd); if (s.isEmpty()) return; + printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL); TooltipManager::instance()->clearTooltips(); if (memberDef) { @@ -1598,6 +1600,7 @@ void parseVhdlCode(CodeOutputInterface &od,const char *className,const QCString g_sourceFileDef=0; } g_startCode=FALSE; + printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL); } void codeFreeVhdlScanner() diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp index a9af81a..aa0207a 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -2019,9 +2019,9 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, /*VHDL CHANGE */ bool bRec,bUnit; QCString ltype(mdef->typeString()); - ltype=ltype.replace(reg," "); + // ltype=ltype.replace(reg," "); QCString largs(mdef->argsString()); - largs=largs.replace(reg," "); + // largs=largs.replace(reg," "); mdef->setType(ltype.data()); mdef->setArgsString(largs.data()); //ClassDef * plo=mdef->getClassDef(); diff --git a/src/vhdlparser.y b/src/vhdlparser.y index 3d3cc64..4e4e675 100644 --- a/src/vhdlparser.y +++ b/src/vhdlparser.y @@ -121,8 +121,8 @@ static int parse_sec=0; //---------------------------- functions -------------------------------------------------------------------------------- -int vhdlScanYYlex (); -void vhdlScanYYerror (char const *); +int vhdlscannerYYlex (); +void vhdlscannerYYerror (char const *); static void addVhdlType(const QCString &name,int startLine, int section,uint64 spec, @@ -382,14 +382,14 @@ t_ToolDir %type<qstr> sel_wavefrms_1 sel_wavefrms_2 gen_stat1 block_declarative_part end_stats inout_stat %type<qstr> selected_signal_assignment comp_inst_stat %type<qstr> conditional_signal_assignment selected_variable_assignment conditional_variable_assignment - %type<qstr> subprog_decltve_item subprog_body_3 subprog_body_1 procs_stat1_2 + %type<qstr> subprog_decltve_item subprog_body_3 subprog_body_1 procs_stat1_2 gen_assoc %debug // for debugging set yydebug=1 %initial-action { yydebug=0; } -%expect 2 +%expect 3 // minimum bison version //%required "2.2" @@ -875,13 +875,18 @@ association_list: t_LeftParen association_element association_list_1 t_RightPa association_list_1: /* empty */ { $$=""; } association_list_1: association_list_1 association_list_2 { $$=$1+" "+$2; } association_list_2: t_Comma association_element { $$=", "+$2; } +// VHDL '93 range_constraint ::= range range +gen_association_list : gen_assoc gen_assoc { $$=$1+$2;} + +gen_association_list : gen_assoc { $$=$1; } -gen_association_list : t_LeftParen gen_association_element gen_association_list_1 t_RightParen +gen_assoc: t_LeftParen gen_association_element gen_association_list_1 t_RightParen { - QCString str="( "+$2+$3; - str.append(" )"); + QCString str="("+$2+$3; + str.append(")"); $$=str; } + gen_association_list: t_LeftParen error t_RightParen { $$=""; } gen_association_list: t_LeftParen t_OPEN t_RightParen { $$=" ( open ) "; } @@ -1073,7 +1078,7 @@ type_decl: t_TYPE t_Identifier type_decl_1 t_Semicolon type_decl: t_TYPE error t_Semicolon { $$=""; } type_decl_1: /* empty */ { $$=""; } -type_decl_1: t_IS type_definition { $$=" is "+$2; } +type_decl_1: t_IS type_definition { $$=" "+$2; } type_definition: enumeration_type_definition { $$=$1; } type_definition: range_constraint { $$=$1; } @@ -1443,7 +1448,7 @@ mark_comp: dot_name { $$=$1; } comp_1: t_LeftParen t_Identifier t_RightParen { $$="("+$2+")"; } -vcomp_stat: t_CONFIGURATION { $$="configurátion";yyLineNr=s_str.iLine; } +vcomp_stat: t_CONFIGURATION { $$="configuration";yyLineNr=s_str.iLine; } vcomp_stat: t_ENTITY { $$="entity";yyLineNr=s_str.iLine; } vcomp_stat: t_COMPONENT { $$="component";yyLineNr=s_str.iLine; } @@ -2261,9 +2266,9 @@ tool_directive: t_ToolDir %% extern FILE* yyout; -extern YYSTYPE vhdlScanYYlval; +extern YYSTYPE vhdlscannerYYlval; -void vhdlScanYYerror(const char* /*str*/) +void vhdlscannerYYerror(const char* /*str*/) { // fprintf(stderr,"\n<---error at line %d : [ %s] in file : %s ---->",s_str.yyLineNr,s_str.qstr.data(),s_str.fileName); // exit(0); @@ -2271,7 +2276,7 @@ void vhdlScanYYerror(const char* /*str*/) void vhdlParse() { - vhdlScanYYparse(); + vhdlscannerYYparse(); } struct VhdlContainer* getVhdlCont() @@ -2541,10 +2546,10 @@ static void addVhdlType(const QCString &name,int startLine,int section, if (current->args.isEmpty()) { current->args=args; - current->args.replace(reg,"%"); // insert dummy chars because wihte spaces are removed +// current->args.replace(reg,"%"); // insert dummy chars because wihte spaces are removed } current->type=type; - current->type.replace(reg,"%"); // insert dummy chars because white spaces are removed +// current->type.replace(reg,"%"); // insert dummy chars because white spaces are removed current->protection=prot; if (!lastCompound && (section==Entry::VARIABLE_SEC) && (spec == VhdlDocGen::USE || spec == VhdlDocGen::LIBRARY) ) diff --git a/src/vhdlscanner.h b/src/vhdlscanner.h index 6ad8316..1d799d0 100644 --- a/src/vhdlscanner.h +++ b/src/vhdlscanner.h @@ -68,7 +68,8 @@ class VHDLLanguageScanner : public ParserInterface bool inlineFragment=FALSE, MemberDef *memberDef=0, bool showLineNumbers=TRUE, - Definition *searchCtx=0 + Definition *searchCtx=0, + bool collectXRefs=TRUE ); void resetCodeParserState(); void parsePrototype(const char *text); diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l index fb0dcb7..716c0c0 100644 --- a/src/vhdlscanner.l +++ b/src/vhdlscanner.l @@ -112,7 +112,7 @@ static struct } str_doc; #define YY_NEVER_INTERACTIVE 1 -#define YY_USER_ACTION num_chars += (int)vhdlScanYYleng; +#define YY_USER_ACTION num_chars += (int)vhdlscannerYYleng; #define MAX_KEYWORD_LEN 20 @@ -280,7 +280,7 @@ static int find_keyword(char *s) // update current line static void lineCount() { - for (const char* c=vhdlScanYYtext ; *c ; ++c ) + for (const char* c=vhdlscannerYYtext ; *c ; ++c ) { yyLineNr += (*c == '\n') ; } @@ -344,10 +344,10 @@ static bool isConstraintFile(const QCString &fileName,const QCString &ext) //static void resetScanner(const char* s,MyParserVhdl* parse); #undef YY_INPUT -#define YY_INPUT(buf,result,max_size) result=vhdlScanYYread(buf,max_size); +#define YY_INPUT(buf,result,max_size) result=vhdlscannerYYread(buf,max_size); -static int vhdlScanYYread(char *buf,int max_size) +static int vhdlscannerYYread(char *buf,int max_size) { int c=0; while ( c < max_size && inputVhdlString.at(inputPosition) ) @@ -437,14 +437,14 @@ BR [ \t\n\r] {letter}(_?{letter_or_digit})*|{extended_character} { - int itoken=find_keyword(vhdlScanYYtext); + int itoken=find_keyword(vhdlscannerYYtext); - // fprintf(stderr,"\n <<<< search tok: %s %d %d>>>\n",vhdlScanYYtext,itoken,yyLineNr); + // fprintf(stderr,"\n <<<< search tok: %s %d %d>>>\n",vhdlscannerYYtext,itoken,yyLineNr); // tokens in vhdlparser.hpp 258..412 if (itoken>200 && itoken<500 && prevToken!=t_END) { - // printf("\n <<<< insert tok: %s %d %d>>>\n",vhdlScanYYtext,itoken,yyLineNr); + // printf("\n <<<< insert tok: %s %d %d>>>\n",vhdlscannerYYtext,itoken,yyLineNr); lineIndex[itoken]=yyLineNr; } @@ -462,7 +462,7 @@ BR [ \t\n\r] prevToken=itoken; - yycont->qstr=vhdlScanYYtext; + yycont->qstr=vhdlscannerYYtext; yycont->yyLineNr=yyLineNr; if (itoken== -1) { @@ -476,13 +476,13 @@ BR [ \t\n\r] } ({decimal_literal})|({base}#{based_integer}(\.{based_integer})?#({exponent})?)|({base}:{based_integer}(\.{based_integer})?:({exponent})?) { - yycont->qstr=vhdlScanYYtext; + yycont->qstr=vhdlscannerYYtext; return ( t_ABSTRLIST ); } '({graphic_character}|\"|\%)' { - QCString q(vhdlScanYYtext); - yycont->qstr=vhdlScanYYtext; + QCString q(vhdlscannerYYtext); + yycont->qstr=vhdlscannerYYtext; if (q=="'('") // std_logic'('1') ? { @@ -502,19 +502,19 @@ BR [ \t\n\r] } (\"({graphic_character}|(\"\")|\%)*\")|(\%({graphic_character}|(\%\%)|\")*\%) { - yycont->qstr=vhdlScanYYtext; + yycont->qstr=vhdlscannerYYtext; yycont->iLine=yyLineNr; return ( t_STRING ); } {base_specifier}(\"{extended_digit}(_?{extended_digit})*\"|\%{extended_digit}(_?{extended_digit})*\%) { - yycont->qstr=vhdlScanYYtext; + yycont->qstr=vhdlscannerYYtext; yycont->iLine=yyLineNr; return ( t_DIGIT ); } {vhdl2008tooldir} { - yycont->qstr=vhdlScanYYtext; + yycont->qstr=vhdlscannerYYtext; yycont->iLine=yyLineNr; return(t_ToolDir); } @@ -526,7 +526,7 @@ BR [ \t\n\r] <*>"--"[^\n]* { /* comment */ - QCString qcs(vhdlScanYYtext); + QCString qcs(vhdlscannerYYtext); // vhdl comment ? if (qcs.stripPrefix("--!")) { @@ -545,7 +545,7 @@ BR [ \t\n\r] <*>{BR}*"--!"[^{}\n]*[^\n]*\n/{B}*"--!" { // multi line comment if (iDocLine==-1) iDocLine=yyLineNr; - QCString qc(vhdlScanYYtext); + QCString qc(vhdlscannerYYtext); int len=qc.contains('\n')+yyLineNr-1; if (YY_START!=Comment) // Start of the comment block { @@ -555,7 +555,7 @@ BR [ \t\n\r] if(!checkMultiComment(qc,len)) { - strComment+=vhdlScanYYtext; + strComment+=vhdlscannerYYtext; } lineCount(); BEGIN(Comment); @@ -563,7 +563,7 @@ BR [ \t\n\r] <Comment>^{B}*"--!"[^\n]* { if (iDocLine==-1) iDocLine=yyLineNr; - strComment+=vhdlScanYYtext; + strComment+=vhdlscannerYYtext; int index=strComment.find("\\code"); if (index>0) { @@ -591,14 +591,14 @@ BR [ \t\n\r] handleCommentBlock(strComment,FALSE); } strComment.resize(0);; - unput(*vhdlScanYYtext); + unput(*vhdlscannerYYtext); doxComment=FALSE; BEGIN(g_lastCommentContext); } <*>"--!"[^\n]* { // one line comment if (iDocLine==-1) iDocLine=yyLineNr; - QCString qcs(vhdlScanYYtext); + QCString qcs(vhdlscannerYYtext); bool isEndCode=qcs.contains("\\endcode"); @@ -630,7 +630,7 @@ BR [ \t\n\r] } <*>"/*" { - strComment+=vhdlScanYYtext; + strComment+=vhdlscannerYYtext; if (yy_hold_char=='!') // found comment starting with "/*!" { doxComment=TRUE; @@ -639,7 +639,7 @@ BR [ \t\n\r] } <Vhdl2008Comment>[^*]*[*]+ { - QCString tt(vhdlScanYYtext); + QCString tt(vhdlscannerYYtext); int len=tt.length(); yyLineNr+=tt.contains('\n'); @@ -712,7 +712,7 @@ void vhdlscanFreeScanner() #if defined(YY_FLEX_SUBMINOR_VERSION) if (g_lexInit) { - vhdlScanYYlex_destroy(); + vhdlscannerYYlex_destroy(); } #endif } @@ -735,7 +735,7 @@ void VHDLLanguageScanner::parsePrototype(const char *text) // do parsing //int VhdlParser::doLex() //{ -// int token=vhdlScanYYlex(); +// int token=vhdlscannerYYlex(); // //fprintf(stderr,"\ntoken: %d at line: %d",token,yyLineNr); // return token; //} @@ -763,6 +763,7 @@ void VHDLLanguageScanner::parseInput(const char *fileName, VhdlDocGen::parseUCF(fileBuf,root,yyFileName,TRUE); return; } + printlex(yy_flex_debug, TRUE, __FILE__, fileName); ::parserInit(); yycont=getVhdlCont(); @@ -775,7 +776,7 @@ void VHDLLanguageScanner::parseInput(const char *fileName, inputFile.setName(fileName); if (g_lexInit) { - vhdlScanYYrestart( vhdlScanYYin ); + vhdlscannerYYrestart( vhdlscannerYYin ); } g_lexInit=TRUE; g_thisParser=this; @@ -791,6 +792,7 @@ void VHDLLanguageScanner::parseInput(const char *fileName, free(lineIndex); inputFile.close(); mapLibPackage(root); + printlex(yy_flex_debug, FALSE, __FILE__, fileName); } void VHDLLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf, @@ -805,12 +807,13 @@ void VHDLLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf, bool inlineFragment, MemberDef *memberDef, bool showLineNumbers, - Definition *searchCtx + Definition *searchCtx, + bool collectXRefs ) { ::parseVhdlCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName, fileDef,startLine,endLine,inlineFragment,memberDef, - showLineNumbers,searchCtx); + showLineNumbers,searchCtx,collectXRefs); } /* diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index d9b5df9..8df1acf 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -836,6 +836,19 @@ void XmlDocVisitor::visitPost(DocMscFile *) if (m_hide) return; m_t << "</mscfile>" << endl; } + +void XmlDocVisitor::visitPre(DocDiaFile *df) +{ + if (m_hide) return; + m_t << "<diafile name=\"" << df->file() << "\">"; +} + +void XmlDocVisitor::visitPost(DocDiaFile *) +{ + if (m_hide) return; + m_t << "</diafile>" << endl; +} + void XmlDocVisitor::visitPre(DocLink *lnk) { if (m_hide) return; @@ -999,6 +1012,7 @@ void XmlDocVisitor::visitPost(DocParamList *) void XmlDocVisitor::visitPre(DocXRefItem *x) { if (m_hide) return; + if (x->title().isEmpty()) return; m_t << "<xrefsect id=\""; m_t << x->file() << "_1" << x->anchor(); m_t << "\">"; @@ -1008,9 +1022,10 @@ void XmlDocVisitor::visitPre(DocXRefItem *x) m_t << "<xrefdescription>"; } -void XmlDocVisitor::visitPost(DocXRefItem *) +void XmlDocVisitor::visitPost(DocXRefItem *x) { if (m_hide) return; + if (x->title().isEmpty()) return; m_t << "</xrefdescription>"; m_t << "</xrefsect>"; } @@ -1068,6 +1083,19 @@ void XmlDocVisitor::visitPost(DocVhdlFlow *) { } +void XmlDocVisitor::visitPre(DocParBlock *) +{ + if (m_hide) return; + m_t << "<parblock>"; +} + +void XmlDocVisitor::visitPost(DocParBlock *) +{ + if (m_hide) return; + m_t << "</parblock>"; +} + + void XmlDocVisitor::filter(const char *str) { m_t << convertToXML(str); diff --git a/src/xmldocvisitor.h b/src/xmldocvisitor.h index 42290cc..6dc189c 100644 --- a/src/xmldocvisitor.h +++ b/src/xmldocvisitor.h @@ -109,6 +109,8 @@ class XmlDocVisitor : public DocVisitor void visitPre(DocMscFile *); void visitPost(DocMscFile *); + void visitPre(DocDiaFile *); + void visitPost(DocDiaFile *); void visitPre(DocLink *); void visitPost(DocLink *); void visitPre(DocRef *); @@ -135,6 +137,8 @@ class XmlDocVisitor : public DocVisitor void visitPost(DocHtmlBlockQuote *); void visitPre(DocVhdlFlow *); void visitPost(DocVhdlFlow *); + void visitPre(DocParBlock *); + void visitPost(DocParBlock *); private: diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index 9caa935..570901f 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -56,13 +56,13 @@ //------------------ static const char index_xsd[] = -#include "index_xsd.h" +#include "index.xsd.h" ; //------------------ // static const char compound_xsd[] = -#include "compound_xsd.h" +#include "compound.xsd.h" ; //------------------ |