Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
doxverilog
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
doxverilog
Commits
b6550378
Commit
b6550378
authored
Jun 29, 2011
by
Dimitri van Heesch
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Release-1.7.4-20110629
parent
de297f6d
Changes
31
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
31 changed files
with
524 additions
and
303 deletions
+524
-303
INSTALL
INSTALL
+2
-2
README
README
+2
-2
configure
configure
+1
-1
config.doc
doc/config.doc
+14
-10
starting.doc
doc/starting.doc
+1
-1
Doxyfile
qtools/Doxyfile
+13
-7
commentcnv.l
src/commentcnv.l
+30
-4
config.xml
src/config.xml
+16
-14
configoptions.cpp
src/configoptions.cpp
+9
-12
dot.cpp
src/dot.cpp
+59
-28
dot.h
src/dot.h
+12
-8
doxygen.cpp
src/doxygen.cpp
+2
-0
doxygen.css
src/doxygen.css
+30
-1
doxygen_css.h
src/doxygen_css.h
+30
-1
fortranscanner.l
src/fortranscanner.l
+66
-16
htmlgen.cpp
src/htmlgen.cpp
+63
-90
htmlgen.h
src/htmlgen.h
+3
-3
latexdocvisitor.cpp
src/latexdocvisitor.cpp
+4
-2
latexgen.cpp
src/latexgen.cpp
+9
-5
latexgen.h
src/latexgen.h
+3
-3
layout.cpp
src/layout.cpp
+4
-2
mangen.h
src/mangen.h
+3
-3
outputgen.cpp
src/outputgen.cpp
+3
-2
qhp.cpp
src/qhp.cpp
+5
-0
rtfgen.cpp
src/rtfgen.cpp
+7
-1
rtfgen.h
src/rtfgen.h
+4
-4
scanner.l
src/scanner.l
+1
-1
search.js
src/search.js
+2
-2
search_js.h
src/search_js.h
+2
-2
svgpan.js
src/svgpan.js
+62
-38
svgpan_js.h
src/svgpan_js.h
+62
-38
No files found.
INSTALL
View file @
b6550378
DOXYGEN Version 1.7.4-201106
06
DOXYGEN Version 1.7.4-201106
29
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (
06
June 2011)
Dimitri van Heesch (
29
June 2011)
README
View file @
b6550378
DOXYGEN Version 1.7.4_201106
06
DOXYGEN Version 1.7.4_201106
29
Please read INSTALL for compilation instructions.
...
...
@@ -26,4 +26,4 @@ forum.
Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (
06
June 2011)
Dimitri van Heesch (dimitri@stack.nl) (
29
June 2011)
configure
View file @
b6550378
...
...
@@ -20,7 +20,7 @@ doxygen_version_minor=7
doxygen_version_revision
=
4
#NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
doxygen_version_mmn
=
201106
06
doxygen_version_mmn
=
201106
29
bin_dirs
=
`
echo
$PATH
|
sed
-e
"s/:/ /g"
`
...
...
doc/config.doc
View file @
b6550378
...
...
@@ -2282,14 +2282,13 @@ install and use dot, since it yields more powerful graphs.
\anchor cfg_dot_fontname
<dt>\c DOT_FONTNAME <dd>
\addindex DOT_FONTNAME
By default doxygen will write a font called \c FreeSans.ttf to the output
directory and reference it in all dot files that doxygen generates. This
font does not include all possible unicode characters however, so when you need
these (or just want a differently looking font) you can specify the font name
By default doxygen will use the Helvetica font for all dot files that
doxygen generates.
When you want a differently looking font you can specify the font name
using \c DOT_FONTNAME. You need to make sure dot is able to find the font,
which can be done by putting it in a standard location or by setting the
\c DOTFONTPATH environment variable or by setting \c DOT_FONTPATH to the
directory
containing the font.
\c DOTFONTPATH environment variable or by setting \c DOT_FONTPATH to the
directory containing the font.
\anchor cfg_dot_fontsize
<dt>\c DOT_FONTSIZE <dd>
...
...
@@ -2422,13 +2421,18 @@ The default size is 10pt.
The
\
c
DOT_IMAGE_FORMAT
tag
can
be
used
to
set
the
image
format
of
the
images
generated
by
dot
.
Possible
values
are
svg
,
png
,
jpg
,
or
gif
.
If
left
blank
png
will
be
used
.
\
note
If
you
choose
\
c
svg
you
need
to
set
HTML_FILE_EXTENSION
to
xhtml
in
order
to
make
the
SVG
files
visible
in
IE
9
+
(
other
browsers
do
not
have
this
requirement
).
\
anchor
cfg_interactive_svg
<
dt
>\
c
INTERACTIVE_SVG
If
DOT_IMAGE_FORMAT
is
set
to
svg
,
then
this
option
can
be
set
to
YES
to
enable
generation
of
interactive
SVG
images
that
allow
zooming
and
panning
.
Note
that
this
requires
a
modern
browser
.
For
Internet
Explorer
you
will
need
at
least
version
9.
Note
that
this
requires
a
modern
browser
other
than
Internet
Explorer
.
Tested
and
working
are
Firefox
,
Chrome
,
Safari
,
and
Opera
.
\
note
For
IE
9
+
you
need
to
set
\
c
HTML_FILE_EXTENSION
to
xhtml
in
order
to
make
the
SVG
files
visible
.
Older
versions
of
IE
do
not
have
SVG
support
.
\
anchor
cfg_dot_path
<
dt
>\
c
DOT_PATH
<
dd
>
...
...
doc/starting.doc
View file @
b6550378
...
...
@@ -204,7 +204,7 @@ In this case the \c Makefile will only contain a target to build
\addindex RTF
Doxygen combines the RTF output to a single file called refman.rtf. This
file is optimized for importing into the Microsoft Word. Certain information
is encoded using
field
. To show the actual value you need to
is encoded using
so called fields
. To show the actual value you need to
select all (Edit - select all) and then toggle fields (right click and select
the option from the drop down menu).
...
...
qtools/Doxyfile
View file @
b6550378
# Doxyfile 1.7.
2
# Doxyfile 1.7.
4
#---------------------------------------------------------------------------
# Project related configuration options
...
...
@@ -6,6 +6,8 @@
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = Qtools
PROJECT_NUMBER =
PROJECT_BRIEF =
PROJECT_LOGO =
OUTPUT_DIRECTORY = ../qtools_docs
CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English
...
...
@@ -36,6 +38,7 @@ SIP_SUPPORT = NO
IDL_PROPERTY_SUPPORT = YES
DISTRIBUTE_GROUP_DOC = NO
SUBGROUPING = YES
INLINE_GROUPED_CLASSES = NO
TYPEDEF_HIDES_STRUCT = NO
SYMBOL_CACHE_SIZE = 0
#---------------------------------------------------------------------------
...
...
@@ -128,16 +131,17 @@ IGNORE_PREFIX = Q
#---------------------------------------------------------------------------
GENERATE_HTML = YES
HTML_OUTPUT =
HTML_FILE_EXTENSION = .html
HTML_FILE_EXTENSION = .
x
html
HTML_HEADER =
HTML_FOOTER =
HTML_STYLESHEET =
HTML_EXTRA_FILES =
HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80
HTML_TIMESTAMP = YES
HTML_ALIGN_MEMBERS = YES
HTML_DYNAMIC_SECTIONS =
NO
HTML_DYNAMIC_SECTIONS =
YES
GENERATE_DOCSET = YES
DOCSET_FEEDNAME = "Doxygen generated docs"
DOCSET_BUNDLE_ID = org.doxygen.Project
...
...
@@ -171,7 +175,7 @@ FORMULA_TRANSPARENT = YES
USE_MATHJAX = NO
MATHJAX_RELPATH = http://www.mathjax.org/mathjax
SEARCHENGINE = YES
SERVER_BASED_SEARCH =
YES
SERVER_BASED_SEARCH =
NO
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
...
...
@@ -183,6 +187,7 @@ COMPACT_LATEX = NO
PAPER_TYPE = a4wide
EXTRA_PACKAGES =
LATEX_HEADER =
LATEX_FOOTER =
PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
LATEX_BATCHMODE = NO
...
...
@@ -249,9 +254,9 @@ PERL_PATH = /usr/bin/perl
CLASS_DIAGRAMS = NO
MSCGEN_PATH =
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT =
NO
HAVE_DOT =
YES
DOT_NUM_THREADS = 0
DOT_FONTNAME =
FreeSans.ttf
DOT_FONTNAME =
DOT_FONTSIZE = 10
DOT_FONTPATH =
CLASS_GRAPH = YES
...
...
@@ -265,7 +270,8 @@ CALL_GRAPH = NO
CALLER_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = png
DOT_IMAGE_FORMAT = svg
INTERACTIVE_SVG = YES
DOT_PATH =
DOTFILE_DIRS =
MSCFILE_DIRS =
...
...
src/commentcnv.l
View file @
b6550378
...
...
@@ -64,6 +64,8 @@ static QCString g_blockName;
static int g_lastCommentContext;
static bool g_inSpecialComment;
static bool g_inRoseComment;
static int g_stringContext;
static int g_charContext;
static int g_javaBlock;
static bool g_specialComment;
...
...
@@ -310,10 +312,12 @@ void replaceComment(int offset);
}
<Scan>"\"" { /* start of a string */
copyToOutput(yytext,yyleng);
g_stringContext = YY_START;
BEGIN(SkipString);
}
<Scan>' {
copyToOutput(yytext,yyleng);
g_charContext = YY_START;
BEGIN(SkipChar);
}
<Scan>\n { /* new line */
...
...
@@ -506,7 +510,7 @@ void replaceComment(int offset);
}
<SkipString>"\"" { /* end of string */
copyToOutput(yytext,yyleng);
BEGIN(
Scan
);
BEGIN(
g_stringContext
);
}
<SkipString>. { /* any other string character */
copyToOutput(yytext,yyleng);
...
...
@@ -519,7 +523,7 @@ void replaceComment(int offset);
}
<SkipChar>' { /* end of character literal */
copyToOutput(yytext,yyleng);
BEGIN(
Scan
);
BEGIN(
g_charContext
);
}
<SkipChar>. { /* any other string character */
copyToOutput(yytext,yyleng);
...
...
@@ -528,10 +532,10 @@ void replaceComment(int offset);
copyToOutput(yytext,yyleng);
}
<CComment>[^\\!@*\n{
]*
{ /* anything that is not a '*' or command */
<CComment>[^\\!@*\n{
\"]*
{ /* anything that is not a '*' or command */
copyToOutput(yytext,yyleng);
}
<CComment>"*"+[^*/\\@\n
]*
{ /* stars without slashes */
<CComment>"*"+[^*/\\@\n
{\"]*
{ /* stars without slashes */
copyToOutput(yytext,yyleng);
}
<CComment>"\"\"\"" { /* end of Python docstring */
...
...
@@ -593,6 +597,16 @@ void replaceComment(int offset);
BEGIN(Scan);
}
}
<CComment>"'" {
g_charContext = YY_START;
copyToOutput(yytext,yyleng);
BEGIN(SkipChar);
}
<CComment>"\"" {
g_stringContext = YY_START;
copyToOutput(yytext,yyleng);
BEGIN(SkipString);
}
<CComment>. {
copyToOutput(yytext,yyleng);
}
...
...
@@ -734,6 +748,18 @@ void replaceComment(int offset);
}
<ReadAliasArgs>^[ \t]*"//"[/!]/[^\n]+ { // skip leading special comments (see bug 618079)
}
<ReadAliasArgs>"*/" { // oops, end of comment in the middle of an alias?
if (g_lang==SrcLangExt_Python)
{
REJECT;
}
else // abort the alias, restart scanning
{
copyToOutput(g_aliasString,g_aliasString.length());
copyToOutput(yytext,yyleng);
BEGIN(Scan);
}
}
<ReadAliasArgs>[^{}\n\\\*]+ {
g_aliasString+=yytext;
g_lastEscaped=FALSE;
...
...
src/config.xml
View file @
b6550378
...
...
@@ -1405,23 +1405,21 @@ explicitly to a value larger than 0 to get control over the balance
between CPU load and processing speed.
'
defval=
'0'
minval=
'0'
maxval=
'32'
/>
<option
type=
'string'
id=
'DOT_FONTNAME'
format=
'string'
docs=
'
By default doxygen will write a font called Helvetica to the output
directory and reference it in all dot files that doxygen generates.
When you want a differently looking font you can specify the font name
using DOT_FONTNAME. You need to make sure dot is able to find the font,
which can be done by putting it in a standard location or by setting the
DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
containing the font.
By default doxygen will use the Helvetica font for all dot files that
doxygen generates. When you want a differently looking font you can specify
the font name using DOT_FONTNAME. You need to make sure dot is able to find
the font, which can be done by putting it in a standard location or by setting
the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
directory containing the font.
'
defval=
'Helvetica'
depends=
'HAVE_DOT'
/>
<option
type=
'int'
id=
'DOT_FONTSIZE'
docs=
'
The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
The default size is 10pt.
'
minval=
'4'
maxval=
'24'
defval=
'10'
depends=
'HAVE_DOT'
/>
<option
type=
'string'
id=
'DOT_FONTPATH'
format=
'string'
docs=
'
By default doxygen will tell dot to use the output directory to look for the
FreeSans.ttf font (which doxygen will put there itself). If you specify a
different font using DOT_FONTNAME you can set the path where dot
can find it using this tag.
By default doxygen will tell dot to use the Helvetica font.
If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
set the path where dot can find it.
'
defval=
''
depends=
'HAVE_DOT'
/>
<option
type=
'bool'
id=
'CLASS_GRAPH'
docs=
'
If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
...
...
@@ -1487,7 +1485,9 @@ relations between the files in the directories.
<option
type=
'enum'
id=
'DOT_IMAGE_FORMAT'
defval=
'png'
docs=
'
The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
generated by dot. Possible values are svg, png, jpg, or gif.
If left blank png will be used.
If left blank png will be used. If you choose svg you need to set
HTML_FILE_EXTENSION to xhtml in order to make the SVG files
visible in IE 9+ (other browsers do not have this requirement).
'
depends=
'HAVE_DOT'
>
<value
name=
'png'
/>
<value
name=
'jpg'
/>
...
...
@@ -1497,8 +1497,10 @@ If left blank png will be used.
<option
type=
'bool'
id=
'INTERACTIVE_SVG'
doc=
'
If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
enable generation of interactive SVG images that allow zooming and panning.
Note that this requires a modern browser. For Internet Explorer you will need
at least version 9.
Note that this requires a modern browser other than Internet Explorer.
Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
visible. Older versions of IE do not have SVG support.
'
defval=
'0'
depends=
'HAVE_DOT'
/>
<option
type=
'string'
id=
'DOT_PATH'
format=
'dir'
docs=
'
The tag DOT_PATH can be used to specify the path where the dot tool can be
...
...
src/configoptions.cpp
View file @
b6550378
...
...
@@ -2123,13 +2123,11 @@ void addConfigOptions(Config *cfg)
//----
cs
=
cfg
->
addString
(
"DOT_FONTNAME"
,
"By default doxygen will write a font called Helvetica to the output
\n
"
"directory and reference it in all dot files that doxygen generates.
\n
"
"When you want a differently looking font you can specify the font name
\n
"
"using DOT_FONTNAME. You need to make sure dot is able to find the font,
\n
"
"which can be done by putting it in a standard location or by setting the
\n
"
"DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
\n
"
"containing the font."
"By default doxygen will use the Helvetica font for all dot files that doxygen generates. When you want a differently looking font you can specify
\n
"
"the font name using DOT_FONTNAME. You need to make sure dot is able to find
\n
"
"the font, which can be done by putting it in a standard location or by setting
\n
"
"the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
\n
"
"directory containing the font."
);
cs
->
setDefaultValue
(
"Helvetica"
);
cs
->
addDependency
(
"HAVE_DOT"
);
...
...
@@ -2144,10 +2142,8 @@ void addConfigOptions(Config *cfg)
//----
cs
=
cfg
->
addString
(
"DOT_FONTPATH"
,
"By default doxygen will tell dot to use the output directory to look for the
\n
"
"FreeSans.ttf font (which doxygen will put there itself). If you specify a
\n
"
"different font using DOT_FONTNAME you can set the path where dot
\n
"
"can find it using this tag."
"By default doxygen will tell dot to use the Helvetica font.
\n
"
"If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to set the path where dot can find it."
);
cs
->
addDependency
(
"HAVE_DOT"
);
//----
...
...
@@ -2260,7 +2256,8 @@ void addConfigOptions(Config *cfg)
"DOT_IMAGE_FORMAT"
,
"The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
\n
"
"generated by dot. Possible values are svg, png, jpg, or gif.
\n
"
"If left blank png will be used."
,
"If left blank png will be used. If you choose svg you need to set
\n
"
"HTML_FILE_EXTENSION to xhtml in order to make the SVG files visible in IE 9+ (other browsers do not have this requirement)."
,
"png"
);
ce
->
addValue
(
"png"
);
...
...
src/dot.cpp
View file @
b6550378
This diff is collapsed.
Click to expand it.
src/dot.h
View file @
b6550378
...
...
@@ -166,7 +166,7 @@ class DotClassGraph
bool
isTooBig
()
const
;
QCString
writeGraph
(
FTextStream
&
t
,
GraphOutputFormat
f
,
const
char
*
path
,
const
char
*
fileName
,
const
char
*
relPath
,
bool
TBRank
=
TRUE
,
bool
imageMap
=
TRUE
)
const
;
bool
TBRank
=
TRUE
,
bool
imageMap
=
TRUE
,
int
graphId
=-
1
)
const
;
void
writeXML
(
FTextStream
&
t
);
void
writeDEF
(
FTextStream
&
t
);
...
...
@@ -196,7 +196,7 @@ class DotInclDepGraph
~
DotInclDepGraph
();
QCString
writeGraph
(
FTextStream
&
t
,
GraphOutputFormat
f
,
const
char
*
path
,
const
char
*
fileName
,
const
char
*
relPath
,
bool
writeImageMap
=
TRUE
)
const
;
bool
writeImageMap
=
TRUE
,
int
graphId
=-
1
)
const
;
bool
isTrivial
()
const
;
bool
isTooBig
()
const
;
QCString
diskName
()
const
;
...
...
@@ -223,7 +223,8 @@ class DotCallGraph
~
DotCallGraph
();
QCString
writeGraph
(
FTextStream
&
t
,
GraphOutputFormat
f
,
const
char
*
path
,
const
char
*
fileName
,
const
char
*
relPath
,
bool
writeImageMap
=
TRUE
)
const
;
const
char
*
relPath
,
bool
writeImageMap
=
TRUE
,
int
graphId
=-
1
)
const
;
void
buildGraph
(
DotNode
*
n
,
MemberDef
*
md
,
int
distance
);
bool
isTrivial
()
const
;
bool
isTooBig
()
const
;
...
...
@@ -253,7 +254,8 @@ class DotDirDeps
const
char
*
path
,
const
char
*
fileName
,
const
char
*
relPath
,
bool
writeImageMap
=
TRUE
)
const
;
bool
writeImageMap
=
TRUE
,
int
graphId
=-
1
)
const
;
private
:
DirDef
*
m_dir
;
};
...
...
@@ -299,7 +301,7 @@ class DotGroupCollaboration
~
DotGroupCollaboration
();
QCString
writeGraph
(
FTextStream
&
t
,
GraphOutputFormat
format
,
const
char
*
path
,
const
char
*
fileName
,
const
char
*
relPath
,
bool
writeImageMap
=
TRUE
)
const
;
bool
writeImageMap
=
TRUE
,
int
graphId
=-
1
)
const
;
void
buildGraph
(
GroupDef
*
gd
);
bool
isTrivial
()
const
;
private
:
...
...
@@ -368,13 +370,15 @@ class DotFilePatcher
QCString
context
;
QCString
label
;
bool
zoomable
;
int
graphId
;
};
DotFilePatcher
(
const
char
*
patchFile
);
int
addMap
(
const
QCString
&
mapFile
,
const
QCString
&
relPath
,
bool
urlOnly
,
const
QCString
&
context
,
const
QCString
&
label
);
int
addFigure
(
const
QCString
&
baseName
,
const
QCString
&
figureName
,
bool
heightCheck
);
int
addSVGConversion
(
const
QCString
&
relPath
,
bool
urlOnly
,
const
QCString
&
context
,
bool
zoomable
);
int
addSVGConversion
(
const
QCString
&
relPath
,
bool
urlOnly
,
const
QCString
&
context
,
bool
zoomable
,
int
graphId
);
int
addSVGObject
(
const
QCString
&
baseName
,
const
QCString
&
figureName
,
const
QCString
&
relPath
);
bool
run
();
...
...
@@ -421,7 +425,7 @@ class DotManager
int
addFigure
(
const
QCString
&
file
,
const
QCString
&
baseName
,
const
QCString
&
figureName
,
bool
heightCheck
);
int
addSVGConversion
(
const
QCString
&
file
,
const
QCString
&
relPath
,
bool
urlOnly
,
const
QCString
&
context
,
bool
zoomable
);
bool
urlOnly
,
const
QCString
&
context
,
bool
zoomable
,
int
graphId
);
int
addSVGObject
(
const
QCString
&
file
,
const
QCString
&
baseName
,
const
QCString
&
figureNAme
,
const
QCString
&
relPath
);
bool
run
();
...
...
@@ -445,7 +449,7 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir,
void
writeDotImageMapFromFile
(
FTextStream
&
t
,
const
QCString
&
inFile
,
const
QCString
&
outDir
,
const
QCString
&
relPath
,
const
QCString
&
baseName
,
const
QCString
&
context
);
const
QCString
&
context
,
int
graphId
=-
1
);
void
writeDotDirDepGraph
(
FTextStream
&
t
,
DirDef
*
dd
);
...
...
src/doxygen.cpp
View file @
b6550378
...
...
@@ -9261,6 +9261,8 @@ extern void commentScanTest();
void
initDoxygen
()
{
const
char
*
lang
=
portable_getenv
(
"LC_ALL"
);
if
(
lang
)
portable_setenv
(
"LANG"
,
lang
);
setlocale
(
LC_ALL
,
""
);
setlocale
(
LC_CTYPE
,
"C"
);
// to get isspace(0xA0)==0, needed for UTF-8
setlocale
(
LC_NUMERIC
,
"C"
);
...
...
src/doxygen.css
View file @
b6550378
...
...
@@ -181,7 +181,7 @@ div.groupText {
}
body
{
background
:
white
;
background
-color
:
white
;
color
:
black
;
margin
:
0
;
}
...
...
@@ -846,3 +846,32 @@ div.zoom
border
:
1px
solid
#
#A0
;
}
@media
print
{
#top
{
display
:
none
;
}
#side-nav
{
display
:
none
;
}
#nav-path
{
display
:
none
;
}
body
{
overflow
:
visible
;
}
h1
,
h2
,
h3
,
h4
,
h5
,
h6
{
page-break-after
:
avoid
;
}
.summary
{
display
:
none
;
}
.memitem
{
page-break-inside
:
avoid
;
}
#doc-content
{
margin-left
:
0
!important
;
height
:
auto
!important
;
width
:
auto
!important
;
overflow
:
inherit
;
display
:
inline
;
}
pre
.fragment
{
overflow
:
visible
;
text-wrap
:
unrestricted
;
white-space
:
-moz-pre-wrap
;
/* Moz */
white-space
:
-pre-wrap
;
/* Opera 4-6 */
white-space
:
-o-pre-wrap
;
/* Opera 7 */
white-space
:
pre-wrap
;
/* CSS3 */
word-wrap
:
break-word
;
/* IE 5.5+ */
}
}
src/doxygen_css.h
View file @
b6550378
...
...
@@ -181,7 +181,7 @@
"}
\n
"
"
\n
"
"body {
\n
"
" background: white;
\n
"
" background
-color
: white;
\n
"
" color: black;
\n
"
" margin: 0;
\n
"
"}
\n
"
...
...
@@ -846,3 +846,32 @@
" border: 1px solid ##A0;
\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
"
" pre.fragment
\n
"
" {
\n
"
" overflow: visible;
\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
"
" }
\n
"
"}
\n
"
"
\n
"
src/fortranscanner.l
View file @
b6550378
...
...
@@ -748,19 +748,66 @@ private {
addCurrentEntry();
}
else if (!argType.isEmpty())
{ // de
k
laration of parameter list: add type for corr. parameter
{ // de
c
laration of parameter list: add type for corr. parameter
parameter = getParameter(argName);
if (parameter) {
if (parameter)
{
v_type= V_PARAMETER;
if (!argType.isNull())
parameter->type=argType.stripWhiteSpace();
if (!docBlock.isNull())
{
if (!argType.isNull()) parameter->type=argType.stripWhiteSpace();
if (!docBlock.isNull())
{
parameter->docs += "\n";
parameter->docs += docBlock;
}
}
// save, it may be function return type
if (parameter)
{
modifiers[current_root][name.lower()].type = argType;
}
else
{
if ((current_root->name.lower() == argName.lower()) ||
(modifiers[current_root->parent()][current_root->name.lower()].returnName == argName.lower()))
{
int strt = current_root->type.find("function");
QString lft;
QString rght;
if (strt != -1)
{
lft = "";
rght = "";
if (strt != 0) lft = current_root->type.left(strt).stripWhiteSpace();
if ((current_root->type.length() - strt - strlen("function"))!= 0)
{
rght = current_root->type.right(current_root->type.length() - strt - strlen("function")).stripWhiteSpace();
}
current_root->type = lft;
if (rght.length() > 0)
{
if (current_root->type.length() > 0) current_root->type += " ";
current_root->type += rght;
}
if (argType.stripWhiteSpace().length() > 0)
{
if (current_root->type.length() > 0) current_root->type += " ";
current_root->type += argType.stripWhiteSpace();
}
if (current_root->type.length() > 0) current_root->type += " ";
current_root->type += "function";
}
else
{
current_root->type += " " + argType.stripWhiteSpace();
}
current_root->type = current_root->type.stripWhiteSpace();
modifiers[current_root][name.lower()].type = current_root->type;
}
else
{
modifiers[current_root][name.lower()].type = argType;
}
}
// any accumulated doc for argument should be emptied,
// because it is handled other way and this doc can be
// unexpectedly passed to the next member.
...
...
@@ -784,12 +831,12 @@ private {
BEGIN(Initialization);
}
<Variable>"\n" { currentModifiers = SymbolModifiers();
yy_pop_state(); // end variable de
k
laration list
yy_pop_state(); // end variable de
c
laration list
newLine();
docBlock.resize(0);
}
<Variable>";".*"\n" { currentModifiers = SymbolModifiers();
yy_pop_state(); // end variable de
k
laration list
yy_pop_state(); // end variable de
c
laration list
docBlock.resize(0);
inputStringSemi =(const char*)(yytext+1);
pushBuffer(inputStringSemi);
...
...
@@ -856,12 +903,15 @@ private {
<SubprogPrefix>{BS}{SUBPROG}{BS_} {
// Fortran subroutine or function found
addSubprogram(yytext);
result=yytext;
result=result.stripWhiteSpace();
addSubprogram(result);
BEGIN(Subprog);
}
<Start,ModuleBody,SubprogBody,InterfaceBody,ModuleBodyContains,SubprogBodyContains>^{BS}({PREFIX}{BS_})?{SUBPROG}{BS_} {
// Fortran subroutine or function found
v_type = V_IGNORE;
if (ifType == IF_ABSTRACT || ifType == IF_SPECIFIC)
{
addInterface("$interface$", ifType);
...
...
@@ -1820,7 +1870,8 @@ static void addSubprogram(const char *text)
//fprintf(stderr,"1=========> got subprog, type: %s\n",text);
current->section = Entry::FUNCTION_SEC ;
QCString subtype = text; subtype=subtype.lower().stripWhiteSpace();
if (!current->type) current->type = subtype;
current->type += " " + subtype;
current->type = current->type.stripWhiteSpace();
current->fileName = yyFileName;
current->bodyLine = yyLineNr; // used for source reference
current->startLine = -1; // ??? what is startLine for?
...
...
@@ -2062,8 +2113,7 @@ void FortranLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
bool FortranLanguageScanner::needsPreprocessing(const QCString &extension)
{
return !(extension==".f"||extension==".f90"||
extension==".f95"||extension==".f03");
return extension!=extension.lower(); // use preprocessor only for upper case extensions
}
void FortranLanguageScanner::resetCodeParserState()
{
...
...
src/htmlgen.cpp
View file @
b6550378
...
...
@@ -1109,6 +1109,58 @@ void HtmlGenerator::init()
t
<<
svgpan_script
;
}
}
if
(
Config_getBool
(
"HTML_DYNAMIC_SECTIONS"
))
{
QFile
f
(
dname
+
"/dynsections.js"
);
if
(
f
.
open
(
IO_WriteOnly
))
{
FTextStream
t
(
&
f
);
t
<<
"var showTriggers = new Array();
\n
"
"
\n
"
"function registerShow(sectId,showFunc) {
\n
"
" showTriggers[sectId] = showFunc;
\n
"
"}
\n
"
"
\n
"
"function hasClass(ele,cls) {
\n
"
" return ele.className.match(new RegExp('(
\\\\
s|^)'+cls+'(
\\\\
s|$)'));
\n
"
"}
\n
"
"
\n
"
"function addClass(ele,cls) {
\n
"
" if (!this.hasClass(ele,cls)) ele.className +=
\"
\"
+cls;
\n
"
"}
\n
"
"
\n
"
"function removeClass(ele,cls) {
\n
"
" if (hasClass(ele,cls)) {
\n
"
" var reg = new RegExp('(
\\\\
s|^)'+cls+'(
\\\\
s|$)');
\n
"
" ele.className=ele.className.replace(reg,' ');
\n
"
" }
\n
"
"}
\n
"
"
\n
"
"function toggleVisibility(linkObj) {
\n
"
" var base = linkObj.getAttribute('id');
\n
"
" var summary = document.getElementById(base + '-summary');
\n
"
" var content = document.getElementById(base + '-content');
\n
"
" var trigger = document.getElementById(base + '-trigger');
\n
"
" if ( hasClass(linkObj,'closed') ) {
\n
"
" summary.style.display = 'none';
\n
"
" content.style.display = 'block';
\n
"
" trigger.src = trigger.src.substring(0,trigger.src.length-10)+'open.png';
\n
"
" removeClass(linkObj,'closed');
\n
"
" addClass(linkObj,'opened');
\n
"
" if (showTriggers[base]) { showTriggers[base](); }
\n
"
" } else if ( hasClass(linkObj,'opened') ) {
\n
"
" summary.style.display = 'block';
\n
"
" content.style.display = 'none';
\n
"
" trigger.src = trigger.src.substring(0,trigger.src.length-8)+'closed.png';
\n
"
" removeClass(linkObj,'opened');
\n
"
" addClass(linkObj,'closed');
\n
"
" }
\n
"
" return false;
\n
"
"}
\n
"
;
}
}
}
/// Additional initialization after indices have been created
...
...
@@ -1352,87 +1404,8 @@ static void generateDynamicSections(FTextStream &t,const QCString &relPath)
{
if
(
Config_getBool
(
"HTML_DYNAMIC_SECTIONS"
))
{
t
<<
#if 0
"<script type=\"text/javascript\">\n"
"<!--\n"
"function changeDisplayState (e){\n"
" var num=this.id.replace(/[^[0-9]/g,'');\n"
" var button=this.firstChild;\n"
" var sectionDiv=document.getElementById('dynsection'+num);\n"
" if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){\n"
" sectionDiv.style.display='block';\n"
" button.src='" << relPath << "open.png';\n"
" }else{\n"
" sectionDiv.style.display='none';\n"
" button.src='" << relPath << "closed.png';\n"
" }\n"
"}\n"
"function initDynSections(){\n"
" var divs=document.getElementsByTagName('div');\n"
" var sectionCounter=1;\n"
" for(var i=0;i<divs.length-1;i++){\n"
" if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){\n"
" var header=divs[i];\n"
" var section=divs[i+1];\n"
" var button=header.firstChild;\n"
" if (button!='IMG'){\n"
" divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);\n"
" button=document.createElement('img');\n"
" divs[i].insertBefore(button,divs[i].firstChild);\n"
" }\n"
" header.style.cursor='pointer';\n"
" header.onclick=changeDisplayState;\n"
" header.id='dynheader'+sectionCounter;\n"
" button.src='" << relPath << "closed.png';\n"
" section.id='dynsection'+sectionCounter;\n"
" section.style.display='none';\n"
" section.style.marginLeft='14px';\n"
" sectionCounter++;\n"
" }\n"
" }\n"
"}\n"
"window.onload = initDynSections;\n"
"-->\n"
"</script>\n";
#endif
"<script type=
\"
text/javascript
\"
>
\n
"
"function hasClass(ele,cls) {
\n
"
" return ele.className.match(new RegExp('(
\\\\
s|^)'+cls+'(
\\\\
s|$)'));
\n
"
"}
\n
"
"
\n
"
"function addClass(ele,cls) {
\n
"
" if (!this.hasClass(ele,cls)) ele.className +=
\"
\"
+cls;
\n
"
"}
\n
"
"
\n
"
"function removeClass(ele,cls) {
\n
"
" if (hasClass(ele,cls)) {
\n
"
" var reg = new RegExp('(
\\\\
s|^)'+cls+'(
\\\\
s|$)');
\n
"
" ele.className=ele.className.replace(reg,' ');
\n
"
" }
\n
"
"}
\n
"
"
\n
"
"function toggleVisibility(linkObj) {
\n
"
" var base = linkObj.getAttribute('id');
\n
"
" var summary = document.getElementById(base + '-summary');
\n
"
" var content = document.getElementById(base + '-content');
\n
"
" var trigger = document.getElementById(base + '-trigger');
\n
"
" if ( hasClass(linkObj,'closed') ) {
\n
"
" summary.style.display = 'none';
\n
"
" content.style.display = 'block';
\n
"
" trigger.src = '"
<<
relPath
<<
"open.png';
\n
"
" removeClass(linkObj,'closed');
\n
"
" addClass(linkObj,'opened');
\n
"
" } else if ( hasClass(linkObj,'opened') ) {
\n
"
" summary.style.display = 'block';
\n
"
" content.style.display = 'none';
\n
"
" trigger.src = '"
<<
relPath
<<
"closed.png';
\n
"
" removeClass(linkObj,'opened');
\n
"
" addClass(linkObj,'closed');
\n
"
" }
\n
"
" return false;
\n
"
"}
\n
"
"</script>
\n
"
;
t
<<
"<script type=
\"
text/javascript
\"
src=
\"
"
<<
relPath
<<
"dynsections.js
\"
></script>
\n
"
;
}
}
...
...
@@ -1478,10 +1451,10 @@ void HtmlGenerator::startFile(const char *name,const char *,
static
bool
searchEngine
=
Config_getBool
(
"SEARCHENGINE"
);
if
(
searchEngine
/*&& !generateTreeView*/
)
{
t
<<
"<script type=
\"
text/javascript
\"
>
<!--
\n
"
;
t
<<
"<script type=
\"
text/javascript
\"
>
\n
"
;
t
<<
"var searchBox = new SearchBox(
\"
searchBox
\"
,
\"
"
<<
relPath
<<
"search
\"
,false,'"
<<
theTranslator
->
trSearch
()
<<
"');
\n
"
;
t
<<
"
-->
</script>
\n
"
;
t
<<
"</script>
\n
"
;
}
generateDynamicSections
(
t
,
relPath
);
m_sectionCount
=
0
;
...
...
@@ -2408,7 +2381,7 @@ void HtmlGenerator::endDotGraph(const DotClassGraph &g)
endSectionSummary
(
t
);
startSectionContent
(
t
,
m_sectionCount
);
g
.
writeGraph
(
t
,
BITMAP
,
dir
,
fileName
,
relPath
);
g
.
writeGraph
(
t
,
BITMAP
,
dir
,
fileName
,
relPath
,
TRUE
,
TRUE
,
m_sectionCount
);
if
(
Config_getBool
(
"GENERATE_LEGEND"
))
{
t
<<
"<center><span class=
\"
legend
\"
>["
;
...
...
@@ -2434,7 +2407,7 @@ void HtmlGenerator::endInclDepGraph(const DotInclDepGraph &g)
endSectionSummary
(
t
);
startSectionContent
(
t
,
m_sectionCount
);
g
.
writeGraph
(
t
,
BITMAP
,
dir
,
fileName
,
relPath
);
g
.
writeGraph
(
t
,
BITMAP
,
dir
,
fileName
,
relPath
,
TRUE
,
m_sectionCount
);
endSectionContent
(
t
);
m_sectionCount
++
;
...
...
@@ -2452,7 +2425,7 @@ void HtmlGenerator::endGroupCollaboration(const DotGroupCollaboration &g)
endSectionSummary
(
t
);
startSectionContent
(
t
,
m_sectionCount
);
g
.
writeGraph
(
t
,
BITMAP
,
dir
,
fileName
,
relPath
);
g
.
writeGraph
(
t
,
BITMAP
,
dir
,
fileName
,
relPath
,
TRUE
,
m_sectionCount
);
endSectionContent
(
t
);
m_sectionCount
++
;
...
...
@@ -2470,7 +2443,7 @@ void HtmlGenerator::endCallGraph(const DotCallGraph &g)
endSectionSummary
(
t
);
startSectionContent
(
t
,
m_sectionCount
);
g
.
writeGraph
(
t
,
BITMAP
,
dir
,
fileName
,
relPath
);
g
.
writeGraph
(
t
,
BITMAP
,
dir
,
fileName
,
relPath
,
TRUE
,
m_sectionCount
);
endSectionContent
(
t
);
m_sectionCount
++
;
...
...
@@ -2488,7 +2461,7 @@ void HtmlGenerator::endDirDepGraph(const DotDirDeps &g)
endSectionSummary
(
t
);
startSectionContent
(
t
,
m_sectionCount
);
g
.
writeGraph
(
t
,
BITMAP
,
dir
,
fileName
,
relPath
);
g
.
writeGraph
(
t
,
BITMAP
,
dir
,
fileName
,
relPath
,
TRUE
,
m_sectionCount
);
endSectionContent
(
t
);
m_sectionCount
++
;
...
...
@@ -2971,10 +2944,10 @@ void HtmlGenerator::writeSearchPage()
static
bool
searchEngine
=
Config_getBool
(
"SEARCHENGINE"
);
if
(
searchEngine
/* && !generateTreeView*/
)
{
t
<<
"<script type=
\"
text/javascript
\"
>
<!--
\n
"
;
t
<<
"<script type=
\"
text/javascript
\"
>
\n
"
;
t
<<
"var searchBox = new SearchBox(
\"
searchBox
\"
,
\"
"
<<
"search
\"
,false,'"
<<
theTranslator
->
trSearch
()
<<
"');
\n
"
;
t
<<
"
-->
</script>
\n
"
;
t
<<
"</script>
\n
"
;
}
t
<<
"<div id=
\"
top
\"
>"
<<
endl
;
writeTitleArea
(
t
,
""
,
projectName
,
projectBrief
,
projectNumber
,
projectLogo
);
...
...
src/htmlgen.h
View file @
b6550378
...
...
@@ -46,9 +46,9 @@ class HtmlGenerator : public OutputGenerator
void
enable
()
{
if
(
genStack
->
top
())
active
=*
genStack
->
top
();
else
active
=
TRUE
;
}
void
disable
()
{
active
=
FALSE
;
}
void
enableIf
(
OutputType
o
)
{
if
(
o
==
Html
)
active
=
TRUE
;
}
void
disableIf
(
OutputType
o
)
{
if
(
o
==
Html
)
active
=
FALSE
;
}
void
disableIfNot
(
OutputType
o
)
{
if
(
o
!=
Html
)
active
=
FALSE
;
}
void
enableIf
(
OutputType
o
)
{
if
(
o
==
Html
)
enable
()
;
}
void
disableIf
(
OutputType
o
)
{
if
(
o
==
Html
)
disable
()
;
}
void
disableIfNot
(
OutputType
o
)
{
if
(
o
!=
Html
)
disable
()
;
}
bool
isEnabled
(
OutputType
o
)
{
return
(
o
==
Html
&&
active
);
}
OutputGenerator
*
get
(
OutputType
o
)
{
return
(
o
==
Html
)
?
this
:
0
;
}
...
...
src/latexdocvisitor.cpp
View file @
b6550378
...
...
@@ -1304,7 +1304,9 @@ void LatexDocVisitor::visitPost(DocParamList *pl)
void
LatexDocVisitor
::
visitPre
(
DocXRefItem
*
x
)
{
if
(
m_hide
)
return
;
m_t
<<
"
\\
begin{Desc}"
<<
endl
;
m_t
<<
"
\\
begin{DoxyRefDesc}{"
;
filter
(
x
->
title
());
m_t
<<
"}"
<<
endl
;
bool
anonymousEnum
=
x
->
file
()
==
"@"
;
m_t
<<
"
\\
item["
;
if
(
Config_getBool
(
"PDF_HYPERLINKS"
)
&&
!
anonymousEnum
)
...
...
@@ -1324,7 +1326,7 @@ void LatexDocVisitor::visitPre(DocXRefItem *x)
void
LatexDocVisitor
::
visitPost
(
DocXRefItem
*
)
{
if
(
m_hide
)
return
;
m_t
<<
"
\\
end{Desc}"
<<
endl
;
m_t
<<
"
\\
end{D
oxyRefD
esc}"
<<
endl
;
}
void
LatexDocVisitor
::
visitPre
(
DocInternalRef
*
ref
)
...
...
src/latexgen.cpp
View file @
b6550378
...
...
@@ -325,7 +325,6 @@ static void writeDefaultStyleSheetPart1(FTextStream &t)
"
\\
RequirePackage{longtable}
\n
"
"
\\
RequirePackage{verbatim}
\n
"
"
\\
RequirePackage{ifthen}
\n
"
"
\\
RequirePackage{settobox}
\n
"
"
\\
RequirePackage[table]{xcolor}
\n\n
"
;
t
<<
"% Use helvetica font instead of times roman
\n
"
...
...
@@ -773,25 +772,30 @@ static void writeDefaultStyleSheetPart3(FTextStream &t)
t
<<
"
\\
newlength{
\\
xreflength}
\n
"
;
t
<<
"
\\
newcommand{
\\
xreflabel}[1]{%
\n
"
;
t
<<
"
\\
sbox{
\\
xrefbox}{#1}%
\n
"
;
t
<<
"
\\
set
toboxwidth{
\\
xreflength}{
\\
xrefbox}%
\n
"
;
t
<<
"
\\
set
length{
\\
xreflength}{
\\
wd
\\
xrefbox}%
\n
"
;
t
<<
"
\\
ifthenelse{
\\
xreflength>
\\
labelwidth}{%
\n
"
;
t
<<
"
\\
begin{minipage}{
\\
textwidth}%
\n
"
;
t
<<
"
\\
setlength{
\\
parindent}{0pt}%
\n
"
;
t
<<
"
\\
hangindent=
25pt
\\
bfseries #1
\\
vspace{
\\
itemsep}%
\n
"
;
t
<<
"
\\
hangindent=
15pt
\\
bfseries #1
\\
vspace{1.2
\\
itemsep}%
\n
"
;
t
<<
"
\\
end{minipage}%
\n
"
;
t
<<
" }{%
\n
"
;
t
<<
"
\\
parbox[b]{
\\
labelwidth}{
\\
makebox[0pt][l]{
\\
textbf{#1}}}%
\n
"
;
t
<<
" }}%
\n
"
;
t
<<
"
\\
newenvironment{DoxyRefList}{%
\n
"
;
t
<<
"
\\
begin{list}{}{%
\n
"
;
t
<<
"
\\
setlength{
\\
labelwidth}{
75
pt}%
\n
"
;
t
<<
"
\\
setlength{
\\
labelwidth}{
10
pt}%
\n
"
;
t
<<
"
\\
setlength{
\\
leftmargin}{
\\
labelwidth}%
\n
"
;
t
<<
"
\\
addtolength{
\\
leftmargin}{
\\
labelsep}%
\n
"
;
t
<<
"
\\
renewcommand{
\\
makelabel}{
\\
xreflabel}%
\n
"
;
t
<<
" }%
\n
"
;
t
<<
" }%
\n
"
;
t
<<
"{
\\
end{list}}
\n
"
;
t
<<
"
\\
newenvironment{DoxyRefDesc}[1]
\n
"
;
t
<<
"{
\\
begin{list}{}{%
\n
"
;
t
<<
"
\\
renewcommand
\\
makelabel[1]{
\\
textbf{##1}}
\n
"
;
t
<<
"
\\
settowidth
\\
labelwidth{
\\
makelabel{#1}}
\n
"
;
t
<<
"
\\
setlength
\\
leftmargin{
\\
labelwidth+
\\
labelsep}}}
\n
"
;
t
<<
"{
\\
end{list}}
\n
"
;
t
<<
"
\\
newenvironment{Indent}
\n
"
;
t
<<
" {
\\
begin{list}{}{
\\
setlength{
\\
leftmargin}{0.5cm}}
\n
"
;
t
<<
"
\\
item[]
\\
ignorespaces}
\n
"
;
...
...
src/latexgen.h
View file @
b6550378
...
...
@@ -38,9 +38,9 @@ class LatexGenerator : public OutputGenerator
void
enable
()
{
if
(
genStack
->
top
())
active
=*
genStack
->
top
();
else
active
=
TRUE
;
}
void
disable
()
{
active
=
FALSE
;
}
void
enableIf
(
OutputType
o
)
{
if
(
o
==
Latex
)
active
=
TRUE
;
}
void
disableIf
(
OutputType
o
)
{
if
(
o
==
Latex
)
active
=
FALSE
;
}
void
disableIfNot
(
OutputType
o
)
{
if
(
o
!=
Latex
)
active
=
FALSE
;
}
void
enableIf
(
OutputType
o
)
{
if
(
o
==
Latex
)
enable
()
;
}
void
disableIf
(
OutputType
o
)
{
if
(
o
==
Latex
)
disable
()
;
}
void
disableIfNot
(
OutputType
o
)
{
if
(
o
!=
Latex
)
disable
()
;
}
bool
isEnabled
(
OutputType
o
)
{
return
(
o
==
Latex
&&
active
);
}
OutputGenerator
*
get
(
OutputType
o
)
{
return
(
o
==
Latex
)
?
this
:
0
;
}
...
...
src/layout.cpp
View file @
b6550378
...
...
@@ -511,10 +511,12 @@ class LayoutParser : public QXmlDefaultHandler
MemberList
::
docTypedefMembers
,
theTranslator
->
trTypedefDocumentation
()));
m_sHandler
.
insert
(
"file/memberdef/enums"
,
new
StartElementHandlerMember
(
this
,
&
LayoutParser
::
startMemberDefEntry
,
MemberList
::
docEnumMembers
,
theTranslator
->
trEnumerationTypeDocumentation
()));
MemberList
::
docEnumMembers
,
theTranslator
->
trEnumerationTypeDocumentation
()));
m_sHandler
.
insert
(
"file/memberdef/functions"
,
new
StartElementHandlerMember
(
this
,
&
LayoutParser
::
startMemberDefEntry
,
MemberList
::
docFuncMembers
,
theTranslator
->
trFunctionDocumentation
()));
MemberList
::
docFuncMembers
,
fortranOpt
?
theTranslator
->
trSubprogramDocumentation
()
:
theTranslator
->
trFunctionDocumentation
()));
m_sHandler
.
insert
(
"file/memberdef/variables"
,
new
StartElementHandlerMember
(
this
,
&
LayoutParser
::
startMemberDefEntry
,
MemberList
::
docVarMembers
,
theTranslator
->
trVariableDocumentation
()));
...
...
src/mangen.h
View file @
b6550378
...
...
@@ -34,9 +34,9 @@ class ManGenerator : public OutputGenerator
void
enable
()
{
if
(
genStack
->
top
())
active
=*
genStack
->
top
();
else
active
=
TRUE
;
}
void
disable
()
{
active
=
FALSE
;
}
void
enableIf
(
OutputType
o
)
{
if
(
o
==
Man
)
active
=
TRUE
;
}
void
disableIf
(
OutputType
o
)
{
if
(
o
==
Man
)
active
=
FALSE
;
}
void
disableIfNot
(
OutputType
o
)
{
if
(
o
!=
Man
)
active
=
FALSE
;
}
void
enableIf
(
OutputType
o
)
{
if
(
o
==
Man
)
enable
();
}
void
disableIf
(
OutputType
o
)
{
if
(
o
==
Man
)
disable
()
;
}
void
disableIfNot
(
OutputType
o
)
{
if
(
o
!=
Man
)
disable
()
;
}
bool
isEnabled
(
OutputType
o
)
{
return
(
o
==
Man
&&
active
);
}
OutputGenerator
*
get
(
OutputType
o
)
{
return
(
o
==
Man
)
?
this
:
0
;
}
...
...
src/outputgen.cpp
View file @
b6550378
...
...
@@ -58,6 +58,7 @@ void OutputGenerator::startPlainFile(const char *name)
void
OutputGenerator
::
endPlainFile
()
{
t
.
unsetDevice
();
delete
file
;
file
=
0
;
fileName
.
resize
(
0
);
...
...
@@ -66,12 +67,12 @@ void OutputGenerator::endPlainFile()
void
OutputGenerator
::
pushGeneratorState
()
{
genStack
->
push
(
new
bool
(
isEnabled
()));
//printf("%p:pushGeneratorState(%d)
\n",this,genStack->count
());
//printf("%p:pushGeneratorState(%d)
enabled=%d\n",this,genStack->count(),isEnabled
());
}
void
OutputGenerator
::
popGeneratorState
()
{
//printf("%p:popGeneratorState(%d)
\n",this,genStack->count
());
//printf("%p:popGeneratorState(%d)
enabled=%d\n",this,genStack->count(),isEnabled
());
bool
*
lb
=
genStack
->
pop
();
ASSERT
(
lb
!=
0
);
if
(
lb
==
0
)
return
;
// for some robustness against superfluous \endhtmlonly commands.
...
...
src/qhp.cpp
View file @
b6550378
...
...
@@ -33,6 +33,7 @@ static QCString makeFileName(const char * withoutExtension)
static
QCString
makeRef
(
const
char
*
withoutExtension
,
const
char
*
anchor
)
{
//printf("QHP::makeRef(%s,%s)\n",withoutExtension,anchor);
if
(
!
withoutExtension
)
return
QCString
();
QCString
result
=
makeFileName
(
withoutExtension
);
if
(
!
anchor
)
return
result
;
...
...
@@ -191,6 +192,10 @@ void Qhp::addIndexItem(Definition *context,MemberDef *md,
const
char
*
word
)
{
(
void
)
word
;
//printf("addIndexItem(%s %s %s\n",
// context?context->name().data():"<none>",
// md?md->name().data():"<none>",
// word);
if
(
md
)
// member
{
...
...
src/rtfgen.cpp
View file @
b6550378
...
...
@@ -2652,13 +2652,19 @@ void RTFGenerator::endParamList()
void
RTFGenerator
::
startParameterType
(
bool
first
,
const
char
*
key
)
{
DBG_RTF
(
t
<<
"{
\\
comment (startParameter
List
)}"
<<
endl
)
DBG_RTF
(
t
<<
"{
\\
comment (startParameter
Type
)}"
<<
endl
)
if
(
!
first
&&
key
)
{
t
<<
" "
<<
key
<<
" "
;
}
}
void
RTFGenerator
::
endParameterType
()
{
DBG_RTF
(
t
<<
"{
\\
comment (endParameterType)}"
<<
endl
)
t
<<
" "
;
}
void
RTFGenerator
::
printDoc
(
DocNode
*
n
,
const
char
*
langExt
)
{
RTFDocVisitor
*
visitor
=
new
RTFDocVisitor
(
t
,
*
this
,
langExt
);
...
...
src/rtfgen.h
View file @
b6550378
...
...
@@ -34,9 +34,9 @@ class RTFGenerator : public OutputGenerator
void
enable
()
{
if
(
genStack
->
top
())
active
=*
genStack
->
top
();
else
active
=
TRUE
;
}
void
disable
()
{
active
=
FALSE
;
}
void
enableIf
(
OutputType
o
)
{
if
(
o
==
RTF
)
active
=
TRUE
;
}
void
disableIf
(
OutputType
o
)
{
if
(
o
==
RTF
)
active
=
FALSE
;
}
void
disableIfNot
(
OutputType
o
)
{
if
(
o
!=
RTF
)
active
=
FALSE
;
}
void
enableIf
(
OutputType
o
)
{
if
(
o
==
RTF
)
enable
()
;
}
void
disableIf
(
OutputType
o
)
{
if
(
o
==
RTF
)
disable
()
;
}
void
disableIfNot
(
OutputType
o
)
{
if
(
o
!=
RTF
)
disable
()
;
}
bool
isEnabled
(
OutputType
o
)
{
return
(
o
==
RTF
&&
active
);
}
OutputGenerator
*
get
(
OutputType
o
)
{
return
(
o
==
RTF
)
?
this
:
0
;
}
...
...
@@ -219,7 +219,7 @@ class RTFGenerator : public OutputGenerator
void
startMemberDocName
(
bool
)
{}
void
endMemberDocName
()
{}
void
startParameterType
(
bool
,
const
char
*
);
void
endParameterType
()
{}
void
endParameterType
()
;
void
startParameterName
(
bool
)
{}
void
endParameterName
(
bool
,
bool
,
bool
)
{}
void
startParameterList
(
bool
)
{}
...
...
src/scanner.l
View file @
b6550378
...
...
@@ -5064,7 +5064,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
new BaseInfo(baseName,baseProt,baseVirt)
);
}
if ((current->spec &
Entry::Interface
) ||
if ((current->spec &
(Entry::Interface|Entry::Struct)
) ||
insideJava || insidePHP || insideCS ||
insideD || insideObjC)
{
...
...
src/search.js
View file @
b6550378
...
...
@@ -240,7 +240,7 @@ function SearchBox(name, resultsPath, inFrame, label)
var
node
=
child
.
firstChild
;
if
(
j
==
id
)
{
node
.
innerHTML
=
'&
bull
;'
;
node
.
innerHTML
=
'&
#8226
;'
;
}
else
{
...
...
@@ -337,7 +337,7 @@ function SearchBox(name, resultsPath, inFrame, label)
hasResultsPage
=
false
;
}
window
.
frames
.
MSearchResults
.
location
.
href
=
resultsPageWithSearch
;
window
.
frames
.
MSearchResults
.
location
=
resultsPageWithSearch
;
var
domPopupSearchResultsWindow
=
this
.
DOMPopupSearchResultsWindow
();
if
(
domPopupSearchResultsWindow
.
style
.
display
!=
'block'
)
...
...
src/search_js.h
View file @
b6550378
...
...
@@ -240,7 +240,7 @@
" var node = child.firstChild;
\n
"
" if (j==id)
\n
"
" {
\n
"
" node.innerHTML='&
bull
;';
\n
"
" node.innerHTML='&
#8226
;';
\n
"
" }
\n
"
" else
\n
"
" {
\n
"
...
...
@@ -337,7 +337,7 @@
" hasResultsPage = false;
\n
"
" }
\n
"
"
\n
"
" window.frames.MSearchResults.location
.href
= resultsPageWithSearch;
\n
"
" window.frames.MSearchResults.location = resultsPageWithSearch;
\n
"
" var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
\n
"
"
\n
"
" if (domPopupSearchResultsWindow.style.display!='block')
\n
"
...
...
src/svgpan.js
View file @
b6550378
/**
* The code below is based on SVGPan Library 1.2 and was modified for doxygen
* to support both zooming and panning via the mouse and via embedded bottons.
*
* This code is licensed under the following BSD license:
*
...
...
@@ -46,11 +47,10 @@ var maxZoom;
if
(
!
window
)
window
=
this
;
/**
*
Register handlers
*
Show the graph in the middle of the view, scaled to fit
*/
function
init
(
evt
)
function
show
()
{
svgDoc
=
evt
.
target
.
ownerDocument
;
if
(
window
.
innerHeight
)
// Firefox
{
windowWidth
=
window
.
innerWidth
;
...
...
@@ -61,21 +61,39 @@ function init(evt)
windowWidth
=
document
.
documentElement
.
clientWidth
windowHeight
=
document
.
documentElement
.
clientHeight
}
els
e
if
(
!
windowWidth
||
!
windowHeight
)
// failsaf
e
{
windowWidth
=
800
;
windowHeight
=
600
;
}
minZoom
=
windowHeight
/
viewHeight
;
maxZoom
=
1.5
;
minZoom
=
Math
.
min
(
windowHeight
/
viewHeight
,
windowWidth
/
viewWidth
)
;
maxZoom
=
minZoom
+
1.5
;
zoomInFactor
=
Math
.
pow
(
maxZoom
/
minZoom
,
1.0
/
zoomSteps
);
zoomOutFactor
=
1.0
/
zoomInFactor
;
var
g
=
svgDoc
.
getElementById
(
'viewport'
);
var
bb
=
g
.
getBBox
();
var
a
=
'scale('
+
minZoom
+
') rotate(0) translate('
+
((
innerWidth
-
viewWidth
*
minZoom
)
/
(
2
*
minZoom
))
+
' '
+
viewHeight
+
')'
;
try
{
var
bb
=
g
.
getBBox
();
// this can throw an exception if css { display: none }
var
tx
=
(
windowWidth
-
viewWidth
*
minZoom
+
8
)
/
(
2
*
minZoom
);
var
ty
=
viewHeight
+
(
windowHeight
-
viewHeight
*
minZoom
)
/
(
2
*
minZoom
);
var
a
=
'scale('
+
minZoom
+
') rotate(0) translate('
+
tx
+
' '
+
ty
+
')'
;
g
.
setAttribute
(
'transform'
,
a
);
}
catch
(
e
)
{}
}
/**
* Register handlers
*/
function
init
(
evt
)
{
svgDoc
=
evt
.
target
.
ownerDocument
;
if
(
top
.
window
&&
top
.
window
.
registerShow
)
// register show function in html doc for dynamic sections
{
top
.
window
.
registerShow
(
sectionId
,
show
);
}
show
();
setAttributes
(
root
,
{
"onmousedown"
:
"handleMouseDown(evt)"
,
...
...
@@ -85,36 +103,22 @@ function init(evt)
if
(
window
.
addEventListener
)
{
if
(
navigator
.
userAgent
.
toLowerCase
().
indexOf
(
'webkit'
)
>=
0
||
navigator
.
userAgent
.
toLowerCase
().
indexOf
(
"opera"
)
>=
0
)
window
.
addEventListener
(
'mousewheel'
,
handleMouseWheel
,
false
);
// Chrome/Safari
if
(
navigator
.
userAgent
.
toLowerCase
().
indexOf
(
'webkit'
)
>=
0
||
navigator
.
userAgent
.
toLowerCase
().
indexOf
(
"opera"
)
>=
0
||
navigator
.
appVersion
.
indexOf
(
"MSIE"
)
!=
-
1
)
{
window
.
addEventListener
(
'mousewheel'
,
handleMouseWheel
,
false
);
// Chrome/Safari/IE9
}
else
{
window
.
addEventListener
(
'DOMMouseScroll'
,
handleMouseWheel
,
false
);
// Others
}
}
}
window
.
onresize
=
function
()
{
if
(
svgDoc
)
{
var
newWindowWidth
;
if
(
window
.
innerWidth
)
// Firefox
{
newWindowWidth
=
window
.
innerWidth
;
}
else
if
(
document
.
documentElement
.
clientWidth
)
// Chrome/Safari
{
newWindowWidth
=
document
.
documentElement
.
clientWidth
}
if
(
newWindowWidth
)
{
var
g
=
svgDoc
.
getElementById
(
"viewport"
);
var
n
=
g
.
getCTM
();
n
=
n
.
translate
((
newWindowWidth
-
windowWidth
)
/
(
2
*
minZoom
),
0
);
setCTM
(
g
,
n
);
stateTf
=
stateTf
.
multiply
(
n
.
inverse
());
windowWidth
=
newWindowWidth
;
}
}
if
(
svgDoc
)
{
show
();
}
}
/**
...
...
@@ -178,9 +182,14 @@ function handleMouseWheel(evt)
{
delta
=
evt
.
wheelDelta
/
720
;
// Opera
}
else
if
(
navigator
.
userAgent
.
toLowerCase
().
indexOf
(
'chrome'
)
>
-
1
||
navigator
.
appVersion
.
indexOf
(
"MSIE"
)
!=
-
1
)
{
delta
=
evt
.
wheelDelta
/
7200
;
// Chrome/IE9
}
else
{
delta
=
evt
.
wheelDelta
/
7200
;
// Chrome/Safari/Opera
delta
=
evt
.
wheelDelta
/
7200
0
;
// Safari
}
}
else
...
...
@@ -243,6 +252,18 @@ function handleMouseUp(evt)
state
=
''
;
}
/**
* Dumps a matrix to a string (useful for debug).
*/
function
dumpMatrix
(
matrix
)
{
var
s
=
"[ "
+
matrix
.
a
+
", "
+
matrix
.
c
+
", "
+
matrix
.
e
+
"
\n
"
+
matrix
.
b
+
", "
+
matrix
.
d
+
", "
+
matrix
.
f
+
"
\n
0, 0, 1 ]"
;
return
s
;
}
/**
* Handler for pan buttons
*/
function
handlePan
(
x
,
y
)
{
var
g
=
svgDoc
.
getElementById
(
"viewport"
);
...
...
@@ -250,14 +271,16 @@ function handlePan(x,y)
}
/**
*
Dumps a matrix to a string (useful for debug).
*
Handle reset button
*/
function
dumpMatrix
(
matrix
)
function
handleReset
()
{
var
s
=
"[ "
+
matrix
.
a
+
", "
+
matrix
.
c
+
", "
+
matrix
.
e
+
"
\n
"
+
matrix
.
b
+
", "
+
matrix
.
d
+
", "
+
matrix
.
f
+
"
\n
0, 0, 1 ]"
;
return
s
;
show
();
}
/**
* Handler for zoom buttons
*/
function
handleZoom
(
evt
,
direction
)
{
var
g
=
svgDoc
.
getElementById
(
"viewport"
);
...
...
@@ -269,3 +292,4 @@ function handleZoom(evt,direction)
doZoom
(
g
,
p
,
factor
);
}
src/svgpan_js.h
View file @
b6550378
"/**
\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
"
...
...
@@ -46,11 +47,10 @@
"if (!window) window=this;
\n
"
"
\n
"
"/**
\n
"
" *
Register handlers
\n
"
" *
Show the graph in the middle of the view, scaled to fit
\n
"
" */
\n
"
"function
init(evt)
\n
"
"function
show()
\n
"
"{
\n
"
" svgDoc = evt.target.ownerDocument;
\n
"
" if (window.innerHeight) // Firefox
\n
"
" {
\n
"
" windowWidth = window.innerWidth;
\n
"
...
...
@@ -61,21 +61,39 @@
" windowWidth = document.documentElement.clientWidth
\n
"
" windowHeight = document.documentElement.clientHeight
\n
"
" }
\n
"
"
els
e
\n
"
"
if (!windowWidth || !windowHeight) // failsaf
e
\n
"
" {
\n
"
" windowWidth = 800;
\n
"
" windowHeight = 600;
\n
"
" }
\n
"
" minZoom =
windowHeight/viewHeight
;
\n
"
" maxZoom = 1.5;
\n
"
" minZoom =
Math.min(windowHeight/viewHeight,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
"
" var bb = g.getBBox();
\n
"
" var a = 'scale('+minZoom+') rotate(0) translate('+((innerWidth-viewWidth*minZoom)/(2*minZoom))+' '+viewHeight+')';
\n
"
"
\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
"
...
...
@@ -85,36 +103,22 @@
"
\n
"
" if (window.addEventListener)
\n
"
" {
\n
"
" if (navigator.userAgent.toLowerCase().indexOf('webkit') >= 0 || navigator.userAgent.toLowerCase().indexOf(
\"
opera
\"
) >= 0)
\n
"
" window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari
\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)
\n
"
" {
\n
"
" var newWindowWidth;
\n
"
" if (window.innerWidth) // Firefox
\n
"
" {
\n
"
" newWindowWidth = window.innerWidth;
\n
"
" }
\n
"
" else if (document.documentElement.clientWidth) // Chrome/Safari
\n
"
" {
\n
"
" newWindowWidth = document.documentElement.clientWidth
\n
"
" }
\n
"
" if (newWindowWidth)
\n
"
" {
\n
"
" var g = svgDoc.getElementById(
\"
viewport
\"
);
\n
"
" var n = g.getCTM();
\n
"
" n = n.translate((newWindowWidth-windowWidth)/(2*minZoom),0);
\n
"
" setCTM(g, n);
\n
"
" stateTf = stateTf.multiply(n.inverse());
\n
"
" windowWidth = newWindowWidth;
\n
"
" }
\n
"
" }
\n
"
" if (svgDoc) { show(); }
\n
"
"}
\n
"
"
\n
"
"/**
\n
"
...
...
@@ -178,9 +182,14 @@
" {
\n
"
" delta = evt.wheelDelta / 720; // Opera
\n
"
" }
\n
"
" else if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1 ||
\n
"
" navigator.appVersion.indexOf(
\"
MSIE
\"
) != -1)
\n
"
" {
\n
"
" delta = evt.wheelDelta / 7200; // Chrome/IE9
\n
"
" }
\n
"
" else
\n
"
" {
\n
"
" delta = evt.wheelDelta / 7200
; // Chrome/Safari/Opera
\n
"
" delta = evt.wheelDelta / 7200
0; // Safari
\n
"
" }
\n
"
" }
\n
"
" else
\n
"
...
...
@@ -243,6 +252,18 @@
" 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
"
...
...
@@ -250,22 +271,25 @@
"}
\n
"
"
\n
"
"/**
\n
"
" *
Dumps a matrix to a string (useful for debug).
\n
"
" *
Handle reset button
\n
"
" */
\n
"
"function
dumpMatrix(matrix)
\n
"
"function
handleReset()
\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
"
" 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.x = windowWidth/2;
\n
"
" p.y = windowHeight/2;
\n
"
" doZoom(g,p,factor);
\n
"
"}
\n
"
"
\n
"
"
\n
"
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment