Hello Developers.
After some additional tests and referring the archive again I'm sure
that the configuration of FILTER_PATTERNS is not working or its usage is
not documented completely.
Even if I use
FILTER_PATTERNS = *.m=./folder/subfolder/m2cpp.pl
the c-comment files will be analysed but not the matlab-files.
Doxygen gives me the warning that the perl-script
"./folder/subfolder/m2cpp.pl can not be opened.
Note, the double-quote " is part of the doxygen warning message and
there is no double-quote at the end of the message.
Once a realized that, I tried to insert in the wizard-input as
filter-pattern
*.m=./folder/subfolder/m2cpp.pl" (note the double-quote at the end)
This results in the DOXYFILE the line:
FILTER_PATTERNS = "*.m=./folder/subfolder/m2cpp.pl\""
And last but not least it works now. Since I don't use the filter as
INPUT_FILTER all c-like files will be analysed like expected, while all
m-files will be preprocessed with the filter.
Again an additional double-quote with backslash is needed at the end of
the filter-definition:
FILTER_PATTERNS = "pattern=filter\""
in the doxygen-wizard the input is : pattern=filter"
Please decide if this is the wanted behaviour (then it may be useful to
extend the documentation) or if this is a bug in the part to call the
perl-script.
If you think this is a problem of the used perl-script I have added,
please help me with some information and I will discuss this in the
associated forum of matlab.
I use doxygen 1.8.3.1 on Windows XP SP3
Best regards,
Eckard Klotz.
Hello Everybody.
For my nassi-shneiderman generator for doxygen
(https://sourceforge.net/projects/moritz/) I'm working on an interface
for the programming-language matlab.For a first demo-release I created
some example-sources which I want to use together with my already
existing c-based description of the general function of Moritz to
create with doxygen a documentation. This means I have some txt-files
with c-comment blocks (where I have defined *.txt as FILE_PATERNS).
This c-comment-blocks contain doxygen group- and page-definitions
which are traditionally used from me as description of the language
independent parts of the documentation. In addition I have some files
which contain comment-blocks in the programming-language for what I
want to add examples. For python this works very good, since doxygen
is already able to understand python-files as well as c-files. But
since doxygen does not know matlab, I have to use a perl-filter for
those files. The perl-filter itself works well as long as I only use
my matlab-files. But I'm not able to configure doxygen to use this
filter for matlab-files only and to use its own build-in c-parser for
all other files.
If I use
INPUT_FILTER = "perl ./folder/subfolder/m2cpp.pl"
all matlab-files will be parsed correctly but the files with the
c-comments will be ignored.
If I use
FILTER_PATTERNS = "*.m=perl ./folder/subfolder/m2cpp.pl"
doxygen tells me that the perl-script can not be opened. The c-comment
files will be analysed but not the matlab-files.
I had the idea to use
INPUT_FILTER = "perl ./folder/subfolder/m2cpp.pl"
together with
FILTER_PATTERNS = "*.txt=????? to use the perl-fileter as
default-filter and to deactivate it for the txt-files which contain
the c-comment blocks. But I don't know what to use instead for the
question-marks to ensure that no filter will be used but the
doxygen-parser directly.
Is someone able to help me?
With many thanks,
Eckard Klotz.
#!C:/Program Files/Perl64/bin/perl.exe
#!/usr/bin/perl.exe
if ($#ARGV != 0)
{
die "Argument must contain filename $#ARGV"
}
else
{
$fname=$ARGV[0];
}
# If we have a .m file inside a (@)-folder with the same name :
# we will read each file of this folder
if ($fname =~ /^(.*)\@([\d\w-_]*)[\/\\](\2)\.m/)
{
$name = $2;
$nameExt = $name.".m";
$dir = $1."@".$name."/\*.m";
@fic = glob($dir);
$i = 0;
@listeFic[0] = $fname;
foreach $my_test (@fic)
{
if (!($my_test =~ $nameExt))
{
$i++;
@listeFic[$i] = $my_test;
}
}
}
# otherwise @-folder, but .m with a different name : ignore it
elsif ($fname =~ /^(.*)\@([\d\w-_]*)[\/\\](.*)\.m/)
{
}
# otherwise
else
{
@listeFic[0] = $fname;
}
$output = "";
foreach $my_fic (@listeFic)
{
open(my $in, $my_fic);
$declTypeDef="";
$inClass = 0;
$inAbstractMethodBlock = 0;
$listeProperties = 0;
$listeEnumeration = 0;
$methodAttribute = "";
while (<$in>)
{
if (/(^\s*)(%>)(.*)/)
{
$output=$output."$1///$3";
}
if (($listeProperties == 1) && (/(^\s*\bend\b\s*)/))
{
$listeProperties = 0;
}
if (($inAbstractMethodBlock == 1) && (/(^\s*\bend\b\s*)/))
{
$inAbstractMethodBlock = 0;
}
if (($listeProperties == 1) &&
(/^\s*([\w\d]*)\s*(=\s*[\w\d{}'',\s\[\]\.]*)?.*(%>.*)?/))
{
$propertyName = $1;
$propertyValue = $2;
$propertyComment = $3;
if (!($propertyName =~ /^$/))
{
if ($typeProperties =~ /Constant/)
{
$properties = $propertyName."$propertyValue;$propertyComment";
}
else
{
$properties = $propertyName.";$propertyComment";
}
$properties =~ s/%>/\/\/\//g;
$properties =~ s/%/\/\//g;
$output=$output.$typeProperties."Property ".$properties;
}
}
if (($listeEnumeration == 1) && (/(^\s*\bend\b\s*)/))
{
$listeEnumeration = 0;
$output=$output."};";
}
if (($listeEvents == 1) && (/(^\s*\bend\b\s*)/))
{
$listeEvents = 0;
$output=$output."};";
}
if (($listeEvents == 1) && (/^\s*([\w\d]*)\s*/))
{
$name_event = $1;
if (!($name_event =~ /^$/))
{
$event = $name_event.",";
$event =~ s/%>/\/\/\//g;
$event =~ s/%/\/\//g;
$output=$output.$event;
}
}
if (($listeEnumeration == 1) && (/^\s*([\w\d]*)\s*(\(.*\))?(%>.*)?/))
{
$name_enum = $1;
$val_enum = $2;
if (!($name_enum =~ /^$/))
{
if (!($val_enum =~ /^$/))
{
$enum = "$name_enum=$val_enum,";
$enum =~ s/%>/\/\/\//g;
$enum =~ s/%/\/\//g;
$output=$output.$enum;
}
else
{
$enum = "$name_enum,";
$enum =~ s/%>/\/\/\//g;
$enum =~ s/%/\/\//g;
$output=$output.$enum;
}
}
}
if (/(^\s*function)\s*([\]
\w\d,_\[]+=)?\s*([.\w\d_-]*)\s*\(?([\w\d\s,~]*)\)?(%?.*)/)
{
$functionKeyWord = $1;
$functionName = $3;
$arguments = $4;
if ($inClass == 0)
{
$output = $declTypeDef.$output;
$declTypeDef = "";
}
$arguments =~ s/,/,in /g;
$arguments =~ s/~/ignoredArg/g;
$arguments = "in $arguments";
if ($arguments =~ /^in $/)
{
$arguments = "";
}
$ligne = "$methodAttribute $functionKeyWord $functionName($arguments);";
$output=$output.$ligne;
}
# Signature of functions in abstract methods
elsif ((/^\s*([\]
\w\d,_\[]+=)?\s*([.\w\d_-]+)\s*\(?([\w\d\s,~]*)\)?(%?.*)/) &
($inAbstractMethodBlock == 1) )
{
$functionName = $2;
$arguments = $3;
$arguments =~ s/,/,in /g;
$arguments =~ s/~/ignoredArg/g;
$arguments = "in $arguments";
if ($arguments =~ /^in $/)
{
$arguments = "";
}
$ligne = "$methodAttribute $functionKeyWord $functionName($arguments);";
$output=$output.$ligne;
}
# inheritance for classes
if
(/(^\s*classdef)\s*(\s*\([\{\}\?\w,=\s]+\s*\))?\s*([\w\d_]+)\s*<?\s*([\s\w\d._&]+)?(.*)/)
{
$className = $3;
$classInheritance = $4;
$classAttributes = $2;
if (!($classInheritance =~ /^$/))
{
$classInheritance =~ s/&/,public /g;
$classDef = "class ".$className.":public $classInheritance";
}
else
{
$classDef = "class ".$className;
}
$output=$output.$classDef;
$output=$output."{";
$output=$output.$declTypeDef;
$output=$output."public:\n";
$inClass = 1;
}
if (/(^\s*properties)\s*(\s*\([\w,=\s]+\s*\))?(.*)/)
{
$listeProperties = 1;
$propertiesAttributes = $2;
$typeProperties = "public:\n";
if (lc($propertiesAttributes) =~ /(access\s*=\s*private)/)
{
$typeProperties = "private:\n"
}
elsif (lc($propertiesAttributes) =~ /(access\s*=\s*public)/)
{
$typeProperties = "public:\n"
}
elsif (lc($propertiesAttributes) =~ /(access\s*=\s*protected)/)
{
$typeProperties = "protected:\n"
}
if ((lc($propertiesAttributes) =~ /(constant\s*=\s*false)/) ||
(lc($propertiesAttributes) =~ /(~constant)/))
{
}
elsif (lc($propertiesAttributes) =~ /(constant(\s*=\s*true\s*)?)/)
{
$typeProperties = $typeProperties." Constant ";
}
}
if (/(^\s*enumeration)\s*(.*)/)
{
$listeEnumeration = 1;
$output=$output."public:\nenum ".$className." {";
}
if (/(^\s*events)\s*(.*)/)
{
$listeEvents = 1;
$output=$output."public:\nenum Events {";
}
if (/(^\s*methods)\s*(\s*\([\w,=\s]+\s*\))?(.*)/)
{
$methodAttribute = "public:\n";
$methodsAttributes = $2;
if (lc($methodsAttributes) =~ /(access\s*=\s*private)/)
{
$methodAttribute = "private:\n"
}
elsif (lc($methodsAttributes) =~ /(access\s*=\s*protected)/)
{
$methodAttribute = "protected:\n"
}
elsif (lc($methodsAttributes) =~ /(access\s*=\s*public)/)
{
$methodAttribute = "public:\n"
}
if (lc($methodsAttributes) =~ /(abstract(\s*=\s*true\s*)?)/)
{
$inAbstractMethodBlock = 1;
$methodAttribute = $methodAttribute." virtual ";
}
if ((lc($methodsAttributes) =~ /(static\s*=\s*false)/) ||
(lc($methodsAttributes) =~ /(~static)/))
{
}
elsif (lc($methodsAttributes) =~ /(static(\s*=\s*true\s*)?)/)
{
$methodAttribute = $methodAttribute." static";
}
}
$output=$output."\n";
}
close $in;
}
$output=$output."};\n";
print $output;
------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and
their applications. This 200-page book is written by three acclaimed
leaders in the field. The early access version is available now.
Download your free book today! http://p.sf.net/sfu/neotech_d2d_may
_______________________________________________
Doxygen-develop mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/doxygen-develop