use File::stat; use Time::localtime; use Win32::OLE; use Getopt::Long; $numenu=0; $item=-1; $itemold=0; $space=" "; $dossiermenu="."; $ren1=$dossiermenu."\\renam1.bat"; $ren2=$dossiermenu."\\renam2.bat"; $doc=$dossiermenu."\\menu.html"; $index=$dossiermenu."\\index.html"; $entete=$dossiermenu."\\me_head.html"; $menu_vide=$dossiermenu."\\me_vide.html"; $invite=$dossiermenu."\\me_invit.html"; $jscript=$dossiermenu."\\mtmcode.js"; $search=$dossiermenu."\\me_srch.html"; ($dossier,$titre,$jour,$onrenomme,$exclfile,$opt_help); if (@ARGV > 0) { GetOptions("d=s" => \$dossier, "t=s" => \$titre, "j=s" => \$jour, "e=s" => \$exclfile, "r|rename" => \$onrenomme, "help|h|?" => \$opt_help ) or die "$!\n"; } else { $opt_help = 1; } if (defined $opt_help) { print < [ -t ] [ -j <day_elapsed_to_mark_as_new_document> ] [ -e <exclude_file> ] [ -{r,rename} ] | -{h,help,?} example : $0 -d scripts -t "demo scripts" -j 30 -e toexclude.txt -r EOF exit; } if (defined $exclude_file) { $stuff="$exclfile"; open STUFF, $stuff or die "impossible d'ouvrir $stuff :$!"; @excludefile=<STUFF>; close STUFF; foreach $exclude (@excludefile) { chomp $exclude; $exclude=~s/\\/\\\\/g; }; } else { @excludefile=(); } if (not defined $titre) { $titre="Documentation"; } if (not defined $jour ) { $jour=-1; } # Ouverture des fichiers "Table des matières" et "Documents" open SRCH, ">$search"; print SRCH <<FINEND; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> FINEND $Word = Win32::OLE->new('Word.Application', 'Quit'); $Excel = Win32::OLE->new('Excel.Application', 'Quit'); open DOC, ">$doc"; open REN1, ">$ren1"; open REN2, ">$ren2"; open NEW, ">$dossier\\nouveaux documents.htm"; create_debutmenu(); showdirs($dossier); create_finmenu(); print SRCH "</HTML>"; close SRCH; close DOC; close REN1; close REN2; close NEW; # Creation de l'index principal create_index(); create_entete(); create_invite(); create_menu_vide(); create_jscript(); exit; # La sous-routine clé... #============================================================ sub showdirs { my $numenuold=0; my $numenusuivant=0; my $DirToCheck=shift; my @sousdir; my $pos=0; my $posold=0; printf SRCH "<p><h3>%s</h3></p>","$DirToCheck"; # print "$DirToCheck\n"; $item++; $derniercd = time() - ( $jour * 24 * 60 * 60 ); opendir DP,"$DirToCheck" or die "Could not open directory"; if ( $numenu == 0 ) { print DOC "var menu = null;\n"; print DOC "menu = new MTMenu();\n"; } else { print DOC "var number_".$numenu." = null;\n"; print DOC "number_".$numenu." = new MTMenu();\n"; } # Parcourir les entrees de repertoire for ( readdir DP ){ # ignorer les directories . et .. next if(/^\.+$/); # Pour effacer les version historiques (placé dans exclude.txt maintenant) # next if(/^HV/); if(-d "$DirToCheck\\$_"){ # si repertoire, on stocke pour traiter apres tout les fichiers du repertoire push @sousdir, "$_"; } else{ # allons-y pour les fichiers $topub="$DirToCheck\\$_"; $toexclude=0; # print " Fichier: $DirToCheck\\$_\n"; # on exclu le fichier si il est dans la liste foreach $exclude (@excludefile) { if ( $topub=~/$exclude/ || $_=~/$exclude/ ) { $toexclude=1; } } next if ($toexclude == 1); # on teste la date du fichier pour savoir si on met un icône nouveau $date_string = stat($topub)->mtime; if ($derniercd < $date_string ) { $nouveau="\<img src=\"menu-images/nouveau.gif\" width=\"40\" height=\"20\" border=\"0\"\>"; } else { $nouveau=""; } $topub=~s/\\/\\\\/g; if ( $numenu == 0 ) { print DOC " menu.MTMAddItem(new MTMenuItem(\"$_\", \"$topub\",\"text\"));\n"; } else { print DOC " number_".$numenu.".MTMAddItem(new MTMenuItem(\"$_\", \"$topub\",\"text\"));\n"; } if ( /zzzzzz.doc|zzzzzzzz.dot/ig ) { my $Doc = $Word->Documents->Open("$DirToCheck\\$_"); my $Title = $Doc->BuiltinDocumentProperties("Title")->Value; my $Subject = $Doc->BuiltinDocumentProperties("Subject")->Value; my $Author = $Doc->BuiltinDocumentProperties("Author")->Value; my $Size = $Doc->BuiltinDocumentProperties("Number of bytes")->Value; my $Keywords = $Doc->BuiltinDocumentProperties("Keywords")->Value; my $Comments = $Doc->BuiltinDocumentProperties("Comments")->Value; my $Hyperlinkbase = $Doc->BuiltinDocumentProperties("Hyperlink base")->Value; my $Category = $Doc->BuiltinDocumentProperties("Category")->Value; my $Manager = $Doc->BuiltinDocumentProperties("Manager")->Value; # my $Date = $Doc->BuiltinDocumentProperties("Last savetime")->Value; $Doc->Close; printf SRCH "<tr><td width=\"203\"><p><a href=\"%s\">%-40s</td><td width=\"500\"><font face=\"Courier New\">T %40s<br>S %25s<br>A %30s<br>M %30s<br>C %30s<br>C %20s</p></td></tr>\n","$DirToCheck\\$_","$_",$Title,$Subject,$Author,$Keywords,$Comments,$Category; } # elsif ( /.xll|.xli/ig ) # { # my $Doc = $Excel->Workbooks->Open("$DirToCheck\\$_"); # my $Title = $Doc->BuiltinDocumentProperties("Title")->Value; # my $Subject = $Doc->BuiltinDocumentProperties("Subject")->Value; # my $Author = $Doc->BuiltinDocumentProperties("Author")->Value; # my $Size = $Doc->BuiltinDocumentProperties("Number of bytes")->Value; # my $Keywords = $Doc->BuiltinDocumentProperties("Keywords")->Value; # my $Comments = $Doc->BuiltinDocumentProperties("Comments")->Value; # my $Hyperlinkbase = $Doc->BuiltinDocumentProperties("Hyperlink base")->Value; # my $Category = $Doc->BuiltinDocumentProperties("Category")->Value; # my $Manager = $Doc->BuiltinDocumentProperties("Manager")->Value; # # my $Date = $Doc->BuiltinDocumentProperties("Last savetime")->Value; # $Doc->Close; # printf SRCH "<tr><td width=\"203\"><p><a href=\"%s\">%-40s</td><td width=\"500\"><font face=\"Courier New\">T %40s<br>S %25s<br>A %30s<br>M %30s<br>C %30s<br>C %20s</p></td></tr>\n","$DirToCheck\\$_","$_",$Title,$Subject,$Author,$Keywords,$Comments,$Category; # } else { if ( $onrenomme == 0 ) { printf SRCH "<a href=\"%s\" target=\"_blank\"> %-40s</a>%s<br>","$DirToCheck\\$_","$_","$nouveau"; if ( $nouveau ne "" ) { # dossier relatif sans le premier niveau $DossierRelatif=$DirToCheck; $DossierRelatif=~s/$dossier//; $DossierRelatif=~s/^\\//; printf NEW "<a href=\"%s\" target=\"_blank\"> %-40s</a><br>","$DossierRelatif\\$_","$_"; } } else { printf SRCH "<a href=\"%s\" target=\"_blank\"> %-40s</a>%s<br>","$DirToCheck\\File$pos","$_","$nouveau"; if ( $nouveau ne "" ) { # dossier relatif sans le premier niveau $DossierRelatif=$DirToCheck; $DossierRelatif=~s/$dossier//; $DossierRelatif=~s/^\\//; printf NEW "<a href=\"%s\" target=\"_blank\"> %-40s</a><br>","$DossierRelatif\\File$pos","$_"; } print REN1 "ren \"$DirToCheck\\$_\" File$pos\n"; print REN2 "ren \"$DirToCheck\\File$pos\" \"$_\" \n"; }; } $pos++; } } $numenuold=$numenu; for ( @sousdir ) { $toexcludedir=0; $tocontrol="$DirToCheck\\$_"; foreach $exclude (@excludefile) { if ( $tocontrol=~/$exclude/) { $toexcludedir=1; } }; if ($toexcludedir == 0) { if ( $numenuold == 0 ) { print DOC " menu.MTMAddItem(new MTMenuItem(\"$_\"));\n"; } else { print DOC " number_".$numenuold.".MTMAddItem(new MTMenuItem(\"$_\"));\n"; } my $spaceold=$space; $space=$space."    "; $itemold=$item; $posold=$pos; $numenu++; $numenusuivant=$numenu; # print DOC "\\\\-------->".$numenuold."=".$numenu."\n"; showdirs("$DirToCheck\\$_"); # print DOC "\\\\<--------".$numenuold."=".$numenu."\n"; $item=$itemold; if ( $numenuold == 0 ) { print DOC " menu.items[".$pos."].MTMakeSubmenu(number_".$numenusuivant.");\n"; } else { print DOC " number_".$numenuold.".items[".$pos."].MTMakeSubmenu(number_".$numenusuivant.");\n"; } $space=$spaceold; $pos++; } } } # #=================================================================== sub create_index { open TOC, ">$index"; print TOC <<FINEND; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN" "http://www.w3.org/TR/REC-html40/frame.dtd"> <html> <head> <title>$titre <p>The <code>NOFRAMES</code> element is to be used to give useful content to people with browsers that cannot display frames. One example is Lynx, a text-based browser.</p> FINEND close TOC; } # #============================================================================= sub create_entete { open TOC, ">$entete"; print TOC < $titre

$titre

FINEND close TOC; } sub create_menu_vide { open TOC, ">$menu_vide"; print TOC < $titre

Chargement du menu en cours...

FINEND close TOC; } # #======================================================================= sub create_invite { open TOC, ">$invite"; print TOC < Invite

Fenêtre d'affichage des documents

FINEND close TOC; } # #==================================================================================== sub create_debutmenu { print DOC < Menu FINEND } # #========================================================================== sub create_jscript { open DOC, ">$jscript"; print DOC < (c) 1998-2000 // This is version 2.2.6, dated 2000-03-30 // The script is freely distributable // It may be used (and modified) as you wish, but retain this message // For more information about the menu visit its home page // http://www.treemenu.com/ /****************************************************************************** * Define the MenuItem object. * ******************************************************************************/ function MTMenuItem(text, url, target, icon) { this.text = text; this.url = url ? url : ""; this.target = target ? target : ""; this.icon = icon ? icon : ""; this.number = MTMSubNumber++; this.submenu = null; this.expanded = false; this.MTMakeSubmenu = MTMakeSubmenu; } function MTMakeSubmenu(menu) { this.submenu = menu; } /****************************************************************************** * Define the Menu object. * ******************************************************************************/ function MTMenu() { this.items = new Array(); this.MTMAddItem = MTMAddItem; } function MTMAddItem(item) { this.items[this.items.length] = item; } /****************************************************************************** * Define the icon list, addIcon function and MTMIcon item. * ******************************************************************************/ function IconList() { this.items = new Array(); this.addIcon = addIcon; } function addIcon(item) { this.items[this.items.length] = item; } function MTMIcon(iconfile, match, type) { this.file = iconfile; this.match = match; this.type = type; } /****************************************************************************** * Global variables. Not to be altered unless you know what you're doing. * * User-configurable options are at the end of this document. * ******************************************************************************/ var MTMLoaded = false; var MTMLevel; var MTMBar = new Array(); var MTMIndices = new Array(); var MTMBrowser = null; var MTMNN3 = false; var MTMNN4 = false; var MTMIE4 = false; var MTMUseStyle = true; if(navigator.appName == "Netscape" && navigator.userAgent.indexOf("WebTV") == -1) { if(parseInt(navigator.appVersion) == 3 && (navigator.userAgent.indexOf("Opera") == -1)) { MTMBrowser = true; MTMNN3 = true; MTMUseStyle = false; } else if(parseInt(navigator.appVersion) >= 4) { MTMBrowser = true; MTMNN4 = true; } } else if (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) >= 4) { MTMBrowser = true; MTMIE4 = true; } var MTMClickedItem = false; var MTMExpansion = false; var MTMSubNumber = 1; var MTMTrackedItem = false; var MTMTrack = false; var MTMPreHREF = ""; if(MTMIE4 || MTMNN3) { MTMPreHREF += document.location.href.substring(0, document.location.href.lastIndexOf("/") +1); } var MTMFirstRun = true; var MTMCurrentTime = 0; // for checking timeout. var MTMUpdating = false; var MTMWinSize, MTMyval; var MTMOutputString = ""; /****************************************************************************** * Code that picks up frame names of frames in the parent frameset. * ******************************************************************************/ if(MTMBrowser) { var MTMFrameNames = new Array(); for(i = 0; i < parent.frames.length; i++) MTMFrameNames[i] = parent.frames[i].name; } /****************************************************************************** * Dummy function for sub-menus without URLs * * Thanks to Michel Plungjan for the advice. :) * ******************************************************************************/ function myVoid() { ; } /****************************************************************************** * Functions to draw the menu. * ******************************************************************************/ function MTMSubAction(SubItem, ReturnValue) { SubItem.expanded = (SubItem.expanded) ? false : true; if(SubItem.expanded) { MTMExpansion = true; } MTMClickedItem = SubItem.number; if(MTMTrackedItem && MTMTrackedItem != SubItem.number) { MTMTrackedItem = false; } if(!ReturnValue) { setTimeout("MTMDisplayMenu()", 10); } return ReturnValue; } function MTMStartMenu() { MTMLoaded = true; if(MTMFirstRun) { MTMCurrentTime++; if(MTMCurrentTime == MTMTimeOut) { // call MTMDisplayMenu setTimeout("MTMDisplayMenu()",10); } else { setTimeout("MTMStartMenu()",100); } } } function MTMDisplayMenu() { if(MTMBrowser && !MTMUpdating) { MTMUpdating = true; MTMFirstRun = false; if(MTMTrack) { MTMTrackedItem = MTMTrackExpand(menu); } if(MTMExpansion && MTMSubsAutoClose) { MTMCloseSubs(menu); } MTMLevel = 0; MTMDoc = parent.frames[MTMenuFrame].document MTMDoc.open("text/html", "replace"); MTMOutputString = ''; if(MTMLinkedSS) { MTMOutputString += ''; } else if(MTMUseStyle) { MTMOutputString += ''; } MTMOutputString += ''; MTMOutputString += ''; MTMOutputString += ''); MTMListItems(menu); MTMDoc.writeln('
'; MTMOutputString += ''; if(MTMUseStyle) { MTMOutputString += ' ' + MTMenuText + ''; } else { MTMOutputString += '' + MTMenuText + ''; } MTMDoc.writeln(MTMOutputString + '
'); MTMDoc.close(); if((MTMClickedItem || MTMTrackedItem) && (MTMNN4 || MTMIE4) && !MTMFirstRun) { MTMItemName = "sub" + (MTMClickedItem ? MTMClickedItem : MTMTrackedItem); if(document.layers && parent.frames[MTMenuFrame].scrollbars) { MTMyval = parent.frames[MTMenuFrame].document.anchors[MTMItemName].y; MTMWinSize = parent.frames[MTMenuFrame].innerHeight; } else { MTMyval = MTMGetPos(parent.frames[MTMenuFrame].document.all[MTMItemName]); MTMWinSize = parent.frames[MTMenuFrame].document.body.offsetHeight; } if(MTMyval > (MTMWinSize - 60)) { parent.frames[MTMenuFrame].scrollBy(0, parseInt(MTMyval - (MTMWinSize * 1/3))); } } MTMClickedItem = false; MTMExpansion = false; MTMTrack = false; } MTMUpdating = false; } function MTMListItems(menu) { var i, isLast; for (i = 0; i < menu.items.length; i++) { MTMIndices[MTMLevel] = i; isLast = (i == menu.items.length -1); MTMDisplayItem(menu.items[i], isLast); if (menu.items[i].submenu && menu.items[i].expanded) { MTMBar[MTMLevel] = (isLast) ? false : true; MTMLevel++; MTMListItems(menu.items[i].submenu); MTMLevel--; } else { MTMBar[MTMLevel] = false; } } } function MTMDisplayItem(item, last) { var i, img, more; if(item.submenu) { var MTMouseOverText; var MTMClickCmd; var MTMDblClickCmd = false; var MTMfrm = "parent.frames['code']"; var MTMref = '.menu.items[' + MTMIndices[0] + ']'; if(MTMLevel > 0) { for(i = 1; i <= MTMLevel; i++) { MTMref += ".submenu.items[" + MTMIndices[i] + "]"; } } if(!MTMEmulateWE && !item.expanded && (item.url != "")) { MTMClickCmd = "return " + MTMfrm + ".MTMSubAction(" + MTMfrm + MTMref + ",true);"; } else { MTMClickCmd = "return " + MTMfrm + ".MTMSubAction(" + MTMfrm + MTMref + ",false);"; } if(item.url == "") { MTMouseOverText = (item.text.indexOf("'") != -1) ? MTMEscapeQuotes(item.text) : item.text; } else { MTMouseOverText = "Expand/Collapse"; } } MTMOutputString = ''; if(MTMLevel > 0) { for (i = 0; i < MTMLevel; i++) { MTMOutputString += (MTMBar[i]) ? MTMakeImage("menu_bar.gif") : MTMakeImage("menu_pixel.gif"); } } more = false; if(item.submenu) { if(MTMSubsGetPlus || MTMEmulateWE) { more = true; } else { for (i = 0; i < item.submenu.items.length; i++) { if (item.submenu.items[i].submenu) { more = true; } } } } if(!more) { img = (last) ? "menu_corner.gif" : "menu_tee.gif"; } else { if(item.expanded) { img = (last) ? "menu_corner_minus.gif" : "menu_tee_minus.gif"; } else { img = (last) ? "menu_corner_plus.gif" : "menu_tee_plus.gif"; } if(item.url == "" || item.expanded || MTMEmulateWE) { MTMOutputString += MTMakeVoid(item, MTMClickCmd, MTMouseOverText); } else { MTMOutputString += MTMakeLink(item, true) + ' onclick="' + MTMClickCmd + '">'; } } MTMOutputString += MTMakeImage(img); if(item.submenu) { if(MTMEmulateWE && item.url != "") { MTMOutputString += '' + MTMakeLink(item, false) + '>'; } img = (item.expanded) ? "menu_folder_open.gif" : "menu_folder_closed.gif"; if(!more) { if(item.url == "" || item.expanded) { MTMOutputString += MTMakeVoid(item, MTMClickCmd, MTMouseOverText); } else { MTMOutputString += MTMakeLink(item, true) + ' onclick="' + MTMClickCmd + '">'; } } MTMOutputString += MTMakeImage(img); } else { MTMOutputString += MTMakeLink(item, true) + '>'; img = (item.icon != "") ? item.icon : MTMFetchIcon(item.url); MTMOutputString += MTMakeImage(img); } if(item.submenu && (item.url != "") && (item.expanded && !MTMEmulateWE)) { MTMOutputString += '' + MTMakeLink(item, false) + '>'; } if(MTMNN3 && !MTMLinkedSS) { var stringColor; if(item.submenu && (item.url == "") && (item.number == MTMClickedItem)) { stringColor = (item.expanded) ? MTMSubExpandColor : MTMSubClosedColor; } else if(MTMTrackedItem && MTMTrackedItem == item.number) { stringColor = MTMTrackColor; } else { stringColor = MTMLinkColor; } MTMOutputString += ''; } MTMOutputString += ' ' + item.text + ((MTMNN3 && !MTMLinkedSS) ? '' : '') + '' ; MTMDoc.writeln(MTMOutputString + ''); } FINEND #============================================================================================= # pour essayer résoudre différence print DOC <'); } function MTMakeLink(thisItem, addName) { var tempString = ''); } function MTMakeBackImage(thisImage) { var tempString = 'transparent url("' + ((MTMPreHREF == "") ? "" : MTMPreHREF); tempString += MTMenuImageDirectory + thisImage + '")' return(tempString); } function MTMakeA(thisType, thisText, thisColor) { var tempString = ""; tempString += 'a' + ((thisType == "pseudo") ? ':' : '.'); return(tempString + thisText + '{color:' + thisColor + ';background:' + MTMakeBackground() + ';}'); } function MTMakeBackground() { return((MTMBackground == "") ? MTMBGColor : 'transparent'); } function MTMTrackTarget(thisTarget) { if(thisTarget.charAt(0) == "_") { return false; } else { for(i = 0; i < MTMFrameNames.length; i++) { if(thisTarget == MTMFrameNames[i]) { return true; } } } return false; } FINEND close DOC; }