From: <de...@de...> - 2013-07-18 06:30:46
|
Author: PeterThoeny Date: 2013-07-18 01:30:40 -0500 (Thu, 18 Jul 2013) New Revision: 26085 Trac url: http://develop.twiki.org/trac/changeset/26085 Modified: twiki/branches/TWikiRelease05x01/DoxygenImportPlugin/lib/TWiki/Plugins/DoxygenImportPlugin/Core.pm Log: Item7295: Initial version of DoxygenImportPlugin - add logic to convert unzipped files to TWiki topics and attach non-html files (css, js, png, ...) to DoxygenFiles topic - work in progress Modified: twiki/branches/TWikiRelease05x01/DoxygenImportPlugin/lib/TWiki/Plugins/DoxygenImportPlugin/Core.pm =================================================================== --- twiki/branches/TWikiRelease05x01/DoxygenImportPlugin/lib/TWiki/Plugins/DoxygenImportPlugin/Core.pm 2013-07-18 06:27:23 UTC (rev 26084) +++ twiki/branches/TWikiRelease05x01/DoxygenImportPlugin/lib/TWiki/Plugins/DoxygenImportPlugin/Core.pm 2013-07-18 06:30:40 UTC (rev 26085) @@ -25,6 +25,7 @@ my $webTopicRegex = '[^' . $TWiki::regex{mixedAlphaNum} . '_\-\.\/]'; my $pluginName = 'DoxygenImportPlugin'; my $debug = $TWiki::cfg{Plugins}{$pluginName}{Debug} || 0; +my $AZ_OK = 0; # ========================= sub new { @@ -152,8 +153,8 @@ sub _actionUpload { my ( $this, $query ) = @_; - my ( $web, $topic ) = $this->_sanitizeWebTopic( $query->param( 'doxygen_topic' ) ); - $this->{redirect} = "$web, $topic, foo=bar"; + my ( $baseWeb, $baseTopic ) = $this->_sanitizeWebTopic( $query->param( 'doxygen_topic' ) ); + $this->{redirect} = "$baseWeb, $baseTopic"; return if( $this->{error} ); if( $query->request_method() !~ /^POST$/i ) { @@ -161,6 +162,7 @@ return; } + # Check if zip file my $zipFile = $query->param( 'zip' ) || 'not-specified'; $zipFile =~ s/.*\///; # Remove any file path in case present my $zipHandle = $query->upload( 'zip' ); @@ -168,13 +170,8 @@ $this->{error} = "Invalid file '$zipFile' - please upload a ZIP file."; return; } - my $zipObj = Archive::Zip->new(); - -#my $result = $zipObj->read( $zipHandle ); -#print STDERR "===== result $result, OK code " . $Archive::Zip::AZ_OK . "\n"; -# unless( $result ) { - unless( $zipObj->read( $zipHandle ) == AZ_OK ) { + unless( $zipObj->read( $zipHandle ) eq $AZ_OK ) { $this->{error} = "Zip read error or '$zipFile' is not a zip file. "; return; } @@ -184,20 +181,23 @@ $tempDir = $workArea . '/' . int( rand( 1000000000 ) ); # Unzip files in workarea mkdir( $tempDir ); chdir( $tempDir ); # Change to the temp directory - some Archive::Zip ignore the path - $this->_unzipFiles( $zipFile, $zipObj, $tempDir ); # Unzipped file names in hash $this->{zipContent} + my $zipContent = $this->_unzipFiles( $zipFile, $zipObj, $tempDir ); if( $this->{error} ) { - $this->_rmTempDir( $tempDir ); + $this->_rmTempDir( $tempDir, $zipContent ); return; } - $this->_processDoxygenImport( $this->{zipContent} ); - $this->_rmTempDir( $tempDir ); # Remove temp dir recursively + + # Import content of zip file + $this->_processDoxygenImport( $tempDir, $zipContent, $baseWeb, $baseTopic ); + $this->_rmTempDir( $tempDir, $zipContent ); # Remove temp dir recursively + $this->{note} = "Import of '$zipFile' succeeded." unless( $this->{error} ); } # ========================= sub _rmTempDir { - my ( $this, $tempDir ) = @_; - foreach my $file ( keys %{ $this->{zipContent} } ) { + my ( $this, $tempDir, $zipContent ) = @_; + foreach my $file ( keys %{ $zipContent } ) { print STDERR "=== delete file $tempDir/$file\n"; # unlink( "$tempDir/$file" ); } @@ -208,32 +208,116 @@ sub _unzipFiles { my ( $this, $zipFile, $zipObj, $tempDir ) = @_; - undef $this->{zipContent}; + my $zipContent; my @memberNames = $zipObj->memberNames(); foreach my $fileName ( sort @memberNames ) { $member = $zipObj->memberNamed( $fileName ); next if( $member->isDirectory() ); - $fileName =~ s/.*\///; # Remove path - next if( $fileName =~ /^\._/ ); # Ignore OSX files + $fileName =~ s/.*\///; # Remove path, if any + next if( $fileName =~ /^\./ ); # Ignore hidden files, including OS X ._* HSF info files $fileName =~ s/$TWiki::cfg{NameFilter}//goi; # Remove problematic chars $fileName =~ /^(.*)$/; $fileName = $1; # untaint my $result = $zipObj->extractMemberWithoutPaths( $member, "$tempDir/$fileName" ); - if( $result == AZ_OK ) { - $this->{zipContent}{$fileName} = 1; + if( $result eq $AZ_OK ) { + $zipContent->{$fileName} = 1; } else { $this->{error} .= "Unzip error on '$zipFile', can't unzip $fileName: $result. "; } } + return $zipContent; } # ========================= sub _processDoxygenImport { - my ( $this, $zipContent ) = @_; + my ( $this, $tempDir, $zipContent, $baseWeb, $baseTopic ) = @_; + + TWiki::Func::writeDebug( "- $pluginName _processDoxygenImport: $baseWeb.$baseTopic" ) if $debug; + + # Create DoxygenFiles topic if needed - this topics holds all imported files + unless( TWiki::Func::topicExists( $baseWeb, 'DoxygenFiles' ) ) { + $this->_saveTopic( $baseWeb, 'DoxygenFiles', + "---+ Doxygen Files\n\nThis topic contains common Doxygen files.\n" ); + } # FIXME + foreach my $file ( keys %{ $zipContent } ) { + if( $file =~ /(.*)\.html$/ ) { +print STDERR "=== processing html file $tempDir/$file\n"; + my $topic = $baseTopic . '_' . $1; + my $text = $this->_convertHtmlToTopicText( $tempDir, $file ); + $this->_saveTopic( $baseWeb, $topic, $text, $baseTopic ); +last; + } else { +print STDERR "=== processing attachment $tempDir/$file\n"; + $this->_attachFile( $baseWeb, 'DoxygenFiles', $tempDir, $file ); + } + } } # ========================= +sub _convertHtmlToTopicText { + my ( $this, $filePath, $fileName ) = @_; + + my $text = TWiki::Func::readFile( "$filePath/$fileName" ); + + $text =~ s/.*<body[^>]*>//; + $text =~ s/<\/body>.*//; + + return $text; +} + +# ========================= +sub _saveTopic { + my ( $this, $web, $topic, $text, $baseTopic ) = @_; + + TWiki::Func::writeDebug( "- $pluginName _saveTopic: $web.$topic" ) if $debug; + my( $topicMeta, $topicText ); + my $templateTopic = 'WebTopicEditTemplate'; + if( TWiki::Func::topicExists( $web, $topic ) ) { + # Read exsting topic + ( $topicMeta, $topicText ) = TWiki::Func::readTopic( $web, $topic ); + } elsif( TWiki::Func::topicExists( $web, $baseTopic ) ) { + # Read base topic to to inherit meta data + ( $topicMeta, $topicText ) = TWiki::Func::readTopic( $web, $baseTopic ); + } elsif( TWiki::Func::topicExists( $web, $templateTopic ) ) { + # Use template topic in current web + ( $topicMeta, $topicText ) = TWiki::Func::readTopic( $web, $templateTopic ); + } elsif( TWiki::Func::topicExists( $TWiki::cfg{UsersWebName}, $templateTopic ) ) { + # Use template topic in Main web + ( $topicMeta, $topicText ) = TWiki::Func::readTopic( $TWiki::cfg{UsersWebName}, $templateTopic ); + } else { + # Use template topic in TWiki web + ( $topicMeta, $topicText ) = TWiki::Func::readTopic( $TWiki::cfg{SystemWebName}, $templateTopic ); + } + + $topicText = $text; + $topicMeta->putKeyed( 'TOPICPARENT', { name => $parent } ) if( $baseTopic ); + + # save updated topic: + TWiki::Func::saveTopic( $web, $topic, $topicMeta, $topicText, { forcenewrevision => 1 } ); +print STDERR "=== saved topic $web.$topic\n"; +} + +# ========================= +sub _attachFile { + my ( $this, $web, $topic, $filePath, $fileName ) = @_; + + TWiki::Func::writeDebug( "- $pluginName _attachFile: $fileName to $web.$topic" ) if $debug; + + TWiki::Func::saveAttachment( $web, $topic, $fileName, + { + file => "$filePath/$fileName", + filepath => '', + filedate => time(), + filesize => -s "$filePath/$fileName", + comment => 'Attached by Doxygen Import Plugin', + } + ); + +print STDERR "=== attach file $fileName to topic $web.$topic\n"; +} + +# ========================= sub _sanitizeWebTopic { my ( $this, $text ) = @_; $text ||= ''; |