#!/usr/bin/perl -w # file KLEIDER/web/src/pinw/docframe_js.pl # Rahmen zur Dokumentation von ECMAScript-Dateien # 2020-06-20 Herbert Schiemann use utf8; # Dieser Quelltext ist utf-8-kodiert use Herbaer::Readargs; # read_args () use Herbaer::XMLDataWriter ; use POSIX qw(strftime); # Zur Ausgabe der Zeit binmode (STDIN, ":encoding(utf-8)"); binmode (STDOUT, ":encoding(utf-8)"); binmode (STDERR, ":encoding(utf-8)"); my $args = { "[cnt]verbose" => 1, "[cnt]igncom" => 0, }; # gibt die Version nach STDOUT aus sub version { print << 'VERSION'; docframe_js.pl Rahmen zur Dokumentation von ECMAScript-Dateien 2020-06-20 Herbert Schiemann GPL 2 oder neuer VERSION }; $args -> {"[sr]version"} = sub { version (); exit 0; }; $args -> {"[sr]help"} = sub { version (); print_message_with_values (<<"HELP", $args); Typische Anwendung ./docframe_js.pl < SCRIPT.js | xsltproc docframe_db.xslt - > SCRIPT_frame.dbk $0 --help zeigt diese Hilfe an $0 --version zeigt die Programm-Version an $0 [option]... --[no_]verbose erhöht den Umfang der STDERR-Ausgabe \${[cnt]verbose} --[no_]igncom Kommentare ignorieren \${[cnt]igncom} HELP exit 0; }; # help my $data = { "entries" => [], }; sub read_script { my ($args, $data) = @_; my $ent = $data -> {"entries"}; my $igncom = $args -> {"[cnt]igncom"}; my $line; my $is_comment = 0; my $ri; # Eintrag in der Ergebnisliste my $fa; # Funktionsargumente my $has_file = 0; # Dateipfad-Informationen? print STDERR "docframe_js.pl: lese Script\n" if $args -> {"[cnt]verbose"}; while (defined ($line = )) { if ( $line =~ /\/\*\s+file\s+(\S+)\s*\*\/\s*$/ ) { $line = $1; $data -> {"path"} = $line; $data -> {"basename"} = $1 if $line =~ /\b([a-zA-Z0-9_]+)\.js$/ ; next; } if ($is_comment) { $is_comment = 0 if $line =~ s/.*\*\///; $is_comment = 1 if $line =~ /\/\*/; next; } $ri = undef; $fa = undef; # var login = null; // Nutzer-Name als URI-Komponente kodiert if ( $line =~ /^var\s+([a-zA-Z][a-zA-Z0-9_]+)(?>\s*=\s*)(.*?;)/ ) { $ri = { "key" => $1, "type" => "var", }; } elsif ( $line =~ /^var\s+([a-zA-Z][a-zA-Z0-9_]+)/ ) { $ri = { "key" => $1, "type" => "var", }; } # function login_get () { elsif ( $line =~ /^function\s*([a-zA-Z][a-zA-Z0-9_]+)\s*\(([^)]+)\)/ ) { $fa = $2; $ri = { "key" => $1, "type" => "func", }; } elsif ( $line =~ /^function\s*([a-zA-Z][a-zA-Z0-9_]+)/ ) { $ri = { "key" => $1, "type" => "func", }; } # Radio.prototype.curdata = function () { elsif ( $line =~ /([a-zA-Z][a-zA-Z0-9_]+)\.prototype\.([a-zA-Z][a-zA-Z0-9_]+)(?>\s*=\s*)function\s*\(([^)]*)\)/ ) { $fa = $3; $ri = { "class" => $1, "key" => $2, "type" => "method", }; } elsif ( $line =~ /([a-zA-Z][a-zA-Z0-9_]+)\.prototype\.([a-zA-Z][a-zA-Z0-9_]+)(?>\s*=\s*)function\b/ ) { $ri = { "class" => $1, "key" => $2, "type" => "method", }; } if ($ri) { if ($fa) { $fa =~ s/\s//g; $ri -> {"args"} = [split /,/, $fa]; } } push (@$ent, $ri); if ($igncom) { $line =~ s/\/\/.*//; $line =~ s/.*\*\///; $is_comment = 1 if $line =~ /\/\*/; } } $data -> {"time"} = strftime ("%Y-%m-%dT%H:%M:%S", localtime()); } # read_script sub write_results { my ($args, $data) = @_; my $xml_options = { '@entries' => ["entries", "entry"], '@args' => ["args", "arg"], }; print STDERR "docframe_js.pl: gebe Ergebnisse aus\n" if $args -> {"[cnt]verbose"}; my $xmlwriter = new Herbaer::XMLDataWriter ( $xml_options, "utf-8", "http://herbaer.de/xmlns/20200620/docframejs/" ); $xmlwriter -> write ("docframejs", {}, $data); } # write_results read_args ($args); read_script ($args, $data); write_results ($args, $data); # end of file KLEIDER/web/src/pinw/docframe_js.pl