#/usr/bin/perl -w
###############################################################################
# Perl-skripti harjoitustyon ottamiseksi WWW:sta tai laittamiseksi sinne
#
# Kutsun syntaksi:
# lue.pl KOMENTO ohjetiedosto kone kayttaja kurssi [comps-hakemisto] [passwd]
#
# Esim:
#
# perl lue.pl GET files.txt www.jyu.fi vesal gko
# - hakee ensin tiedoston http://www.jyu.fi/~vesal/gko/files.txt
# ja sitten sen ohjeiden mukaan tekee paikalliselle levylle
# tarvittavat alihakemistot ja hakee sitten tarvittavat tiedostot
# Jos koneen nimen perässä on polku, niin mitään ei lisätä
# Eli esim:
# perl lue.pl GET files.txt www.it.jyu.fi/users/vesal/gko
# - hakee ensin tiedoston
# http://www.it.jyu.fi/users/vesal/gko/files.txt
# ja sitten sen ohjeiden mukaan tekee paikalliselle levylle
# tarvittavat alihakemistot ja hakee sitten tarvittavat tiedostot
# perl lue.pl FTP files.txt www.jyu.fi vesal gko
# - lukee paikallisen levyn oletushakemistosta tiedoston
# files.txt ja sen ohjeiden mukaan kopioi paikalliselta levylta
# ftp:lla tiedostoja www.jyu.fi-koneessa käyttäjän vesal kotihakemisto
# ja sen alla www/gko hakemistoon luoden tarvittaessa uusia
# hakemistoja
# Tekee lisäksi saman kuin HTML
# perl lue.pl HTML files.txt tukki vesal gko
# - lukee paikallisen levyn oletushakemistosta tiedoston
# files.txt ja tekee siitä tiedostot files.html ja index.html, jotka
# kopioidaan ftp:lla tukki-koneeseen käyttäjän vesal kotihakemistoon
# hakemistoon www/gko.
# perl lue.pl HTML files.txt tukki vesal gko comps -
# - lukee paikallisen levyn oletushakemistosta tiedoston
# files.txt ja tekee siitä tiedostot files.html ja index.html, joita
# ei kopioida mihinkään muualle, sillä salasanana on -
#
# perl lue.pl PUREHTML files.txt tukki vesal gko srcreplacement
# - lukee paikallisen levyn oletushakemistosta tiedoston
# files.txt ja tekee siitä tiedostot files.html ja index.html, joita
# ei kopioida mihinkään muualle
# srcreplacement on hakemiston nimi, jolla java-tiedostoissa oleva src
# merkkijono korvataan (jos src halutaa poistaa, on tämä tyhjä, jos säilyttää, niin src/)
#
# perl lue.pl COPY files.txt w: vesal gko
# - lukee paikallisen levyn oletushakemistosta tiedoston
# files.txt ja tekee siitä tiedostot files.html ja index.html, ja
# kopioi ne paikkaa w:\gko
#
# perl lue.pl SVN files.txt
# - lukee paikallisen levyn oletushakemistosta tiedoston
# files.txt ja lisää sen mukaan kaikki siinä olevat tiedostot
# oletushakemiston
# kopioi ne paikkaa w:\gko
#
# Javadoc tehdään javadoc -ohjelmalla ja sen on oltava polussa
# jos files.txt:ssä on .java -tiedostoja
# c# doc tehdään doxygen-ohjelmalla ja sen on oltava polussa
# jos on .cs-tiedostoja. doxyfile-tiedostossa on ohjeet dokumentin
# tekoon. doxyfile-tiedostoa etsitään oletushakemistosta ylöspäin.
# Oletushakemistoa lähintä doxyfile-tiedostoa käytetään.
# Jos doxyfile tiedostoa ei löydy, käytetään lue.pl:n hakemistosta
# löytyvää versiota.
# doxyfile-tiedostossa voidaan (ja kannattaa) ottaa mukaan
# d.dox tiedosto joka generoidaan lue.pl ajossa.
#
# Jos tiedoston nimi on muotoa (files.tx:n sijaan) nimiN.txt
# (missä N on luku)
# niin tulostiedostot ovat vastaavasti filesN.html, indexN.html
# Esim. files2.txt => files2.html ja index2.html
#
# Tiedoston files.txt muoto on yksinkertaisimmillaan:
# oma/tiedosto.c = kommentti
# oma/ali/ali.c = kommentti 2
#
# Tahan voidaan lisata myos koristeita,
# =-- => WWW-sivulle
, eli viiva
# = Otsikko => WWW-sivulle Pelkastaan teksti Otsikko
#
# =------------------------------
# = Otsikko
# =------------------------------
# oma/tiedosto.c = kommentti
# oma/ali/ali.c = kommentti 2
# =------------------------------
#
# Huom! =-merkin jälkeen on oltava välilyönti tai - (jos piirretään hr)
#
# Jos tiedostoon halutaan linkki, se voidaan tehdä tyyliin:
#
# @https://trac.cc.jyu.fi/projects/ohj2k11/wiki/suunnitelmat/vesal=Suunnitelma Wikissä
#
# tai yksi linkki tyyliin
# !https://trac.cc.jyu.fi/projects/ohj2k11/wiki/suunnitelmat/vesal=Suunnitelma Wikissä
#
# jolloin tästä linkistä tulee framen oletuslinkki (näkyy framessa oletuksena).
# Muuten oletuslinkkinä on 1. löytynyt tiedosto
#
# Jos kommenttiosa on pelkkä linkki tyyliin:
#
# = http://user.jyu.fi/~vesal
#
# niin se muutetaan linkiksi. Jos rivillä on muuta, ei muuteta linkiksi.
#
# Jos projektiin tarvitaan esim. muiden tekemia komponentteja, niin
# nehan tietysti luetaan aivan jostakin muusta paikasta ja niita
# ei kirjoiteta FTP-komennossa takaisin (ei me pilata muiden tekemia).
# Talloin files.txt voisi olla esimerkiksi:
#
# =--------------------
# =Delphi työ
# =--------------------
# delphi/vespacad.dpr = projektitiedosto VespaCadia varten
# delphi/vespacadf.dfm = päälomake
# delphi/vespacadf.pas = lähdekoodi
# =--------------------
# =Muut tarvittavat komponentit
# =--------------------
# $DESTINATION=$COMPS
# $SOURCEPATH=http://www.mit.jyu.fi/~vesal/kurssit/winohj/winohj/delphi/comps/editpnl/
# savepos.pas = komponentti paikan tallettamiseksi
# SavePos.dcr = komponentin kuvake
#
# Selityksia files.txt -tiedostosta
# tiedoston nimi= suhteellinen nimi nykyiseen $SOURCEPATH-muuttujaan
# ja paikallisen levyn hakemistoon verrattuna.
# Oletuksena $SOURCEPATH riippuu konetorivin parametreista.
# Eli esimerkissa luetaan
# (komento: GET, tiedosto: delphi/vespacadf.pas)
# http://www.jyu.fi/~vesal/gko/delphi/vespacadf.pas
# -tiedosto, luodaan paikalliselle levylle delphi
# niminen alihakemisto ja kopioidaan tiedosto sinne.
# Vastaavasti FTP-komennolla otetaan paikallisen levyn
# tiedosto delphi/vespacadf.pas ja kirjoitetaan se
# www.jyu.fi-koneessa kayttajan vesal kotihakemistosta
# alkaen tiedostoksi www/gko/delphi/vespacad.pas
#
# $DESTINATION = paikallisen levyn hakemisto, jonne tiedosto laitetaan
# Apumuuttuja $COMPS on komentorivilta annetun
# comps-hakemiston arvo (pitaa sisaltaa /-merkki lopussa).
# Oletuksena comps-hakemisto on ../comps/
# $SOURCEPATH = www-polku, joka lisataan seuraavien tiedostojen nimien
# eteen kun tiedostoa haetaan WWW:sta.
# Oletuksena tama on tyhja. Ja jos kirjoitetaan
# $SOURCEPATH =, palataan kayttamaan alkuperaista hakemistoa
# joka maaraytyy komentorivin parametreista
# Ne tiedostot, joiden aikana $SOURCEPATH on epatyhja, ovat
# ReadOnly-tiedostoja, eli niita ei kopioda FTP-komennolla
# takaisin verkkoon. $SOURCEPATH ja $DESTINATION voidaan
# muuttaa kuinka monta kertaa tahansa, ja ne vaikuttavat
# seuraavaan muutokseen saakka.
#
# Kayttovinkkeja:
# ================
#
# A. Aloitus ja tallettaminen
# ----------------------------
# 1) kirjoita paikalliselle levylle tiedosto files.txt
# 2a)anna komento:
# perl lue.pl FTP files.txt www.jyu.fi vesal gko
# (Tietenkin korvaten www.jyu.fi, vesal ja gko vastaavilla koneen nimella,
# omalla tunnuksellasi ko. koneessa ja kurssin nimella).
# 2b)anna komento
# perl lue.pl COPY files.txt w: vesal gko
# 3) Nain sinulle syntyy www.jyu.fi-koneeseen hakemisto www/gko ja sen alle
# tarvittavat alihakemistot. Hakemistoon gko tulee tiedostot
# files.html ja index.html, joilla tiedostojasi voi selata kivasti.
# 4) Kun jatkossa lisaat uusia tiedostoja projektiisi tai paivitat
# vanhoja, niin tarpeen mukaan muutat paikallisessa koneessa
# (siis kayttamassasi mikrossa) tiedostoa files.txt tarpeen mukaan.
# Sitten annat aina kohdassa 2) mainitun komennon
#
# B. Tyon jatkaminen toisessa koneessa
# ------------------------------------
# 1) siirry paikallisessa koneessa omaan hakemistoosi, esim
# d:\omat\vesal\gko
# 2a)anna komentorivilta komento
# perl lue.pl GET files.txt www.jyu.fi vesal gko
# (Tietenkin taas korvaten nimet vastaavilla)
# 2b)anna komentorivilta komento
# perl lue.pl GET files.txt www.infotec.jyu.fi/users/vesal/gko
# (Tietenkin taas korvaten nimet vastaavilla)
# 3) Jatkat ohjelmointia ja lopettaessasi annat komennon kohdasta A.2)
#
# C. Helpottaminen
# ----------------
# 1) Jos osaat yhtaan kirjoittaa DOS-komentoja .bat -tiedostoon, niin
# kirjoitat itsellesi komento ht.bat:
# lue.pl %1 files.txt www.jyu.fi vesal gko
# 2) Lukeminen:
# ht GET
# 3) Tallettaminen:
# ht FTP
#
# D. Harjoitustyon nayttaminen
# -----------------------------
# 1) Kun saavut nayttamaan harjoitustyotasi kerro ohjaajalle
# a) tunnuksesi (esim. vesal)
# b) koneen nimi (esim. www.jyu.fi)
# c) kurssin tunnus (esim. gko)
#
# Vesa Lappalainen
# 26.5.1999
# 5.8.1999
# 26.10.1999
# + luodaan kurssihakemisto www-koneeseenkin jos se puuttuu
# 30.10.1999
# + vaihdettu käyttämään vlftplib.pl, koska alkup. ftplib.pl ei
# osannut binääristä siirtoa :-(
# 27.12.1999
# + salasana - katkaisee lopun skriptin suorituksen
# 19.11.2000
# + COPY - komento
# + PUREHTML -komento
# + GET-komentoon / tulkinta estämään polun muokkaus
# + Tuotettu HTML paremmin kelpaamaan validaattorille
# + hakemisotn nimen pakkomuuttaminen pieneksi poistettu =>
# PITÄÄ olla huolellinen hakemistojen nimiä kirjoitettaessa
#
# 27.12.2000
# + COPY luo kaikki tarvittavat kohdepolussa olevat hakemistot
#
# 20.1.2001
# + tulostetaan
:iä kommenttirivien perään
# + tarkistetaan paremmin milloin lisätään http: ja milloin ei
#
# 27.1.2001
# + muuttaa välilyönnilliset tiedoston nimet linkeissä muotoon %20
# myös % muuteteen %25
# + tekee myös FTP:llä tarvittavat alihakemistot ennen siirtoa
#
# 12.1.2003 Heikki Kainulainen
# + tekee java-koodista javadocin ja sorsat html-muotoon
# käytetään ohjelmaa java2html (http://www.java2html.com)
#
# 27.1.2011 Vesa Lappalainen
# + tekee .cs tiedosta doxygen dokut ja linkit vastaavasti
#
###############################################################################
# require('vlftplib.pl'); # siirretty vain niihin kohti, joissa tarvitaan
use strict;
###############################################################################
sub trim($) { # merkkijono => merkkijono
my($s) = @_;
# Poistetaan merkkijonosta alkutyhjat, lopputyhjat ja rivinvaihdot (lopusta)
# Esim. " kissa istuu\n " => "kissa istuu"
$s =~ s/^\s*//; # alkutyhjat
$s =~ s/\s*$//; # lopputyhjat (myös rivinvaihdot)
# s/^\s*(.*?)\s*$/\1/;
return $s;
}
###############################################################################
sub ToHtmlName($) { # merkkijono => merkkijono
my($s) = @_;
# Poistetaan merkkijonosta alkutyhjat, lopputyhjat ja rivinvaihdot (lopusta)
# Esim. " kissa istuu\n " => "kissa istuu"
$s =~ s/%/%25/g; # välilyönnit
$s =~ s/ /%20/g; # välilyönnit
return $s;
}
###############################################################################
sub CheckHTTP($) { # merkkijono => merkkijono
my($s) = @_;
# Jos jonossa ei ole http://, niin se lisätään
# Samoin loppu / jos se puuttuu
# Esim. "www.mit.jyu.fi/~vesal" => "http://www.mit.jyu.fi/~vesal/"
# Tyhjästä jonosta palautetaan tyhjä jono
#
if ( $s eq "" ) { return $s; }
if ( !( $s =~ /\/$/ ) ) { $s = "$s/"; }
if ( !( $s =~ /^http:/ ) ) {
if ( !( $s =~ /^\// ) ) { $s = "/$s"; }
if ( !( $s =~ /^\/\// ) ) { $s = "/$s"; }
$s = "http:$s";
}
return $s;
}
use Time::localtime;
use File::stat;
###############################################################################
sub GetWWWFileDate($) # => mtime
#------------------------------------------------------------------------------
# Hakee WWW-tiedoston päiväyksen
# Esim: GetWWWFileDate('http://www.jyu.fi/~vesal/gko/delphi/vespacadf.dfm')
###############################################################################
{
my ($url) = @_;
$url = ToHtmlName(trim($url));
require LWP;
# Create the user agent object
my $ua =new LWP::UserAgent;
# Set up a request. We will use the same request object for all URLs.
my $request = new HTTP::Request "GET";
# Send the request and get a response back from the server
$request->url($url);
my $response = $ua->request($request);
if ($response->is_success) {
$response->headers->last_modified;
} else {
0;
}
}
#open(VSTDERR,">c:\\temp\\error.txt");
###############################################################################
sub GetWWWFile($$) {
my ($url,$file) = map {trim($_)} @_;
$url = ToHtmlName($url);
# $file = trim($file);
#------------------------------------------------------------------------------
# Hakee WWW-tiedoston ja tallettaa sen lokaalisti valituksi tiedostoksi
# Esim: GetWWWFile('http://www.jyu.fi/~vesal/gko/delphi/vespacadf.dfm',
# 'delphi/vespacadf.dfm');
# Mahdollisesti tarvittavat alihakemistot pitää jo olla olemassa
# Otetaan vain tiedostot, jotka ovat uudempia kuin kohdekoneessa
###############################################################################
my $filedate = 0;
my $filestat;
$filestat = stat($file) and $filedate = $filestat->mtime;
# my $filedate = $filestat->mtime if $filestat = stat($file);
require LWP;
# Create the user agent object
my $ua =new LWP::UserAgent;
# Set up a request. We will use the same request object for all URLs.
my $request = new HTTP::Request "GET";
# Send the request and get a response back from the server
$request->url($url);
my $response = $ua->request($request);
if ($response->is_success) {
if ( $response->headers->last_modified > $filedate ) {
print "$url => $file\n";
# print ctime($response->headers->last_modified) . " " . ctime($filedate) . "\n";
# print $response->headers->last_modified . " $filedate"\n";
open(OUT, ">$file") or die "Error opening output file $file: $!\n";
binmode OUT;
print OUT $response->content;
close(OUT) if ($file);
utime $response->headers->last_modified,$response->headers->last_modified,$file;
}
# else { print ctime($response->headers->last_modified) . " " . ctime($filedate) . "\n"; }
# else { print "@{[ctime($response->headers->last_modified) ctime($filedate)\n"; }
# else { print "$response->headers->last_modified";
} else {
print STDERR "ERROR: $url\n";
print STDERR $response->error_as_HTML;
}
}
###############################################################################
sub CopyFileIfNewer($$) {
my ($source,$dest) = map {trim($_)} @_;
# $url = trim($url);
# $file = trim($file);
#------------------------------------------------------------------------------
# Kopioi lokaalin tiedoston toiselle levylle
# Esim: CopyFileIfNewer('delphi/vespacadf.dfm','w:/gko/delphi/vespacadf.dfm');
# Mahdollisesti tarvittavat alihakemistot pitää jo olla olemassa
# Kopioidaan vain tiedostot, jotka ovat uudempia kuin kohdekoneessa
###############################################################################
use File::Copy;
my $destdate = 0;
my $deststat;
my $sourcedate = 0;
my $sourcestat;
$deststat = stat($dest) and $destdate = $deststat->mtime;
$sourcestat = stat($source) and $sourcedate = $sourcestat->mtime;
my $filetype = substr($source, -5);
# if($filetype eq ".java"){
# my $src = substr($source, 0, index($source,"."));
# my $dst = substr($dest, 0, index($dest,$source));
# copy("doc/$src.html","$dst/doc/$src.html");
# copy("doc/$src.java.html","$dst/doc/$src.java.html");
# }
# print "try: $source => $dest\n";
if ( $sourcedate > $destdate ) {
print " $source => $dest";
if ( !copy($source,$dest) ) { print " Error: $!"; }
print "\n";
}
# else { print ctime($response->headers->last_modified) . " " . ctime($filedate) . "\n"; }
# else { print "@{[ctime($response->headers->last_modified) ctime($filedate)\n"; }
# else { print "$response->headers->last_modified";
}
###############################################################################
sub hakemisto_lista($$) { # $hakemisto,\%hakemistot
#------------------------------------------------------------------------------
# Lisää %hakemistot-listaan kaikki hakemiston alihakemistot joita ei vielä ole
# listassa.
# Esim: $hakemisto = "oma1/oma2" => lisätään ("oma1","oma1/oma2")
###############################################################################
my ($hakemisto,$hakemistot) = @_;
my $loput = $hakemisto;
my $alku = "";
my $hak;
while ( 1 ) {
($hak,$loput) = split("[/\\x5c]",$loput,2);
# print "$hak $loput \n";
if ( not $loput ) { last; }
if ( not $hak ) { next; }
$alku .= $hak;
$$hakemistot{($alku)} = "";
# $$hakemistot{lc($alku)} = "";
$alku .= "/";
}
}
# @dirs = split "/", lc $hakemisto;
# for(0..$#dirs) {$hakemistot->{join '/', @dirs[0..$_]} = ""}
###############################################################################
sub takeType($) { # merkkijono => merkkijono
###############################################################################
#------------------------------------------------------------------------------
# Palauttaa tiedostosta tyyppiosan
# Esim: takeType("kalle.ville\\oma.cs") => .cs
# ei toimi jos . puuttuu
###############################################################################
my($rivi) = @_;
my ($filename,$filetype) = split(/\.([^\.]+)$/,$rivi,2);
$filetype = ".".$filetype;
return $filetype;
}
###############################################################################
sub takeFilename($) { # merkkijono => merkkijono
###############################################################################
#------------------------------------------------------------------------------
# Palauttaa tiedostosta nimiosan
# Esim: takeFilename("kalle.ville/oma.cs") => kalle.ville/oma
# ei toimi jos . puuttuu
###############################################################################
my($rivi) = @_;
my ($filename,$filetype) = split(/\.([^\.]+)$/,$rivi,2);
#print "|$rivi| => |$filename|\n";
return $filename
}
###############################################################################
sub takeJustFilename($) { # merkkijono => merkkijono
###############################################################################
#------------------------------------------------------------------------------
# Palauttaa tiedostosta nimiosan
# Esim: takeJustFilename("kalle.ville/oma.cs") => kalle.ville/oma
# ei toimi jos . puuttuu
###############################################################################
my($rivi) = @_;
my ($path,$justfile) = split(/\/([^\/]+)$/,takeFilename($rivi),2);
#print "|$rivi| => |$filename|\n";
if ( $justfile ne "" ) { return $justfile; }
return $path;
}
###############################################################################
sub takePath($) { # merkkijono => merkkijono
###############################################################################
#------------------------------------------------------------------------------
# Palauttaa tiedostosta polkuosan
# Esim: takePath("kalle.ville/oma.cs") => kalle.ville
###############################################################################
my($rivi) = @_;
my ($path,$file) = split(/\/([^\/]+)$/,$rivi,2);
if ( $file ne "" ) { return $path; }
return "";
}
use Cwd;
use Cwd 'abs_path';
###############################################################################
sub findFile($$) { # file,def => filewithpath
###############################################################################
#------------------------------------------------------------------------------
# Palauttaa tiedoston nimen kiiveten hakemistoa ylöispäin kunnes löytyy.
# Jos ei löydy, paluttaa tiedoston nimen oletushakemistosta.
# Esim: findFile("ohj.txt","c:\mytemp") => xxx/ohj.txt missä xxx on hakemisto
# josta ohj.txt löytyi kun aloitettiin
# nykyhakemistosta
###############################################################################
my ($file,$def) = @_;
my ($path) = getcwd();
while ( 1 == 1 ) {
my $name = "$path/$file";
# print "$name|$path|$file|$def\n";
if ( -e $name ) { return $name; }
my ($p,$last) = split(/\/([^\/]+)$/,$path,2);
# print "hajoitus: |$p|$path|\n";
if ( $p eq "" ) { last; }
if ( $p eq $path ) { last; }
$path = $p;
}
return "$def/$file";
}
###############################################################################
sub ShowFtpError() {
###############################################################################
# my $error = ftp::error();
# if ( $error ) { print "FTP error: $error\n"; }
}
###############################################################################
# Pääohjelma
###############################################################################
my $command = $ARGV[0];
my $filename = $ARGV[1];
my $www = $ARGV[2];
my $user = $ARGV[3];
#my $kurssi = $ARGV[4];
my ($kurssi,$foo) = split("[/\\x5c]",$ARGV[4],2);
my $comps = $ARGV[5];
my $passwd = $ARGV[6];
my $mainpath = $ARGV[2];
my $subpath = $ARGV[4];
my $srcreplace = $ARGV[5];
my $docdir = "doc";
$subpath =~ s!/*$!!; # delete extra / end of subpath
$www =~ s!/*$!!; # delete extra / end of www-machine
my $defwww = "$www/~$user/$subpath";
my $filenr = $filename;
$filenr =~ s!(.*?)([0-9]*).txt!\2!;
if ( $filenr == $filename ) { $filenr = ""; }
my $fileshtml = "files$filenr.html";
my $indexhtml = "index$filenr.html";
if ( $www =~ /\// ) { $defwww = $www; } # if / in www then this is the
# total path
if ( $comps lt " " ) { $comps = '../comps/'; } # as default
my $sourcepath = "";
my $destination = "";
$defwww = CheckHTTP("$defwww");
if ( $command eq "GET" ) {
GetWWWFile("$defwww$filename","$filename");
}
#print "Args: 0:$command 1:$filename 2:$www 3:$user 4:$kurssi 5:$comps 6:$passwd 7:$mainpath $subpath 8:$defwww 9:$docdir $srcreplace\n";
open(TIEDOSTOT,$filename) or die("File not found: $filename!\n");
my @tiedostot = ();
my @alkuosat = ();
my @kommentit = ();
my @lahdepolut = ();
my @lahteet = ();
my @kohdepolut = ();
my %hakemistot = (); # Käytetään vain hashin avainosaa :-)
my $deflink = "";
while (my $rivi=) {
$rivi = trim($rivi);
my ($alkuosa, $kommentti) = split(/\B= *|=\B */,$rivi,2);
$alkuosa = trim($alkuosa);
$kommentti = trim($kommentti);
if ( $alkuosa eq '=' ) {
$alkuosa = "";
}
if ( ( $command eq "SVN" ) && ( $alkuosa =~ /overview-tree.html/ ) ) { next; }
if ( $alkuosa eq '$SOURCEPATH' ) { $sourcepath = trim($kommentti); next; }
if ( $alkuosa eq '$DESTINATION' ) {
$destination = trim($kommentti);
if ( $destination eq '$COMPS' ) { $destination = $comps; }
next;
}
if ( $alkuosa =~ m/^[\!@].*/ ) { # alkaa ! tai @, eli linkki
my $link = substr($alkuosa,1);
$kommentti = "$kommentti";
if ( $alkuosa =~ m/^\!.*/ && $deflink eq "" ) { # ensimmäisestä ! oletuslinkki
$deflink = $link;
}
if ( $kommentti le " " ) { next; }
$alkuosa = "";
}
if ( ($kommentti =~ m/http/) && (! ($kommentti =~ m/http$link2$afterlink";
# print "KOMMENTTI: $kommentti\n";
}
push @alkuosat, ($alkuosa);
push @kommentit,(trim($kommentti));
push @lahteet,($sourcepath);
if ( $alkuosa ge " " ) {
push @lahdepolut,($sourcepath);
push @kohdepolut,($destination);
push @tiedostot, ($alkuosa);
hakemisto_lista("$destination$alkuosa",\%hakemistot);
}
}
close(TIEDOSTOT);
if ($deflink le " " ) {
$deflink = $tiedostot[0];
}
my @lajiteltu = sort(keys(%hakemistot));
###############################################################################
sub MakeHtmlFiles() {
###############################################################################
use File::Copy;
# my $javadoc = "javadoc -nodeprecatedlist -nohelp -private -version -author -d doc -docletpath c:/bat/XHTML_Doclet.jar -doclet xhtmldoclet.XhtmlDoclet -linksource -tag example:a:\"Example:\" ";
my $javadoc = "javadoc -nodeprecatedlist -nohelp -version -author -d $docdir -link http://java.sun.com/javase/6/docs/api -linksource -tag example:a:\"Example:\" ";
my $j2h = "j2h -d $docdir/src-html -js ";
my @arr = glob("*.java");
my $source = "";
my $files = "";
my $csfiles = "";
if(@arr > 0){
$source = "*.java ";
}
$" = ".";
for(my $i = 0; $i < @lajiteltu; $i++){
my @parts = split("/",$lajiteltu[$i]);
@arr = glob("$lajiteltu[$i]/*.java");
if(@arr > 0){
$source = "$source $lajiteltu[$i]/*.java";
}
}
for (my $i=0; $i < @tiedostot; $i++ ) {
my $tied = trim($tiedostot[$i]);
if ( $lahdepolut[$i] gt " " ) { next; }
my $filetype = takeType($tied);
if($filetype eq ".java"){
$files = "$files $tied";
}
if ( $filetype eq ".cs"){
$csfiles = "$csfiles $tied";
}
}
if ( $source ge " " ) {
print "$javadoc $files\n";
# print `$javadoc $source`;
print `$javadoc $files`;
print `$j2h .`;
print "$j2h .\n";
print "Paketteja käsittelmään: $source\n";
handlePackages($source);
}
print "CSFILES: $csfiles\n";
if ( $csfiles ge " " ) {
my $doxycs = "doxygen " . findFile("doxyfile",takePath(abs_path($0)));
open(OUT, ">d.dox") || die "Error opening output file d.ox $!\n";
print OUT <<"__STOP__";
PROJECT_NAME=$user
OUTPUT_DIRECTORY=csdoc
INPUT=
__STOP__
close OUT;
print "$doxycs \n";
print `$doxycs `;
}
open(OUT, ">$indexhtml") || die "Error opening output file $indexhtml: $!\n";
print OUT <<"__STOP__";
$user/$kurssi/
__STOP__
close OUT;
open(OUT, ">$fileshtml") || die "Error opening output file $fileshtml: $!\n";
print OUT <<"__STOP__";
$user/$kurssi
$kurssi/$user
__STOP__
for (my $i=0; $i < @alkuosat; $i++ ) {
if ( $alkuosat[$i] ge " " ) {
my $htmlfile = ToHtmlName("$lahteet[$i]$alkuosat[$i]");
my $filetype = takeType($htmlfile);
# print "$htmlfile =>$filetype=> ";
if ( $htmlfile =~ m/\.\..*/ ){ # jos tiedoston nimessä .. eli eri hakemistossa, ei tehdä dokuja
print OUT "$alkuosat[$i]";
# print "ei\n";
}
elsif ( $filetype eq ".cs" ) { # .cs tiedosto
my $fileName = takeFilename($htmlfile);
my $justFileName = takeJustFilename($htmlfile);
my $coloredfilelink = "csdoc/html/$justFileName"."_8cs_source.html";
if ( !(-e $coloredfilelink) ) {
$coloredfilelink = "csdoc/html/$justFileName"."_8cs-source.html"; #older doxygen
}
print OUT "$fileName";
# file:///E:/kurssit/ohjelmointi1/2011/demot/vast/demo4/csdoc/html/KirjaintenMuutos_8cs.html
print OUT "\.";
print OUT "cs";
}
elsif ( $filetype eq ".java" ) { # .java tiedosto
# my $part = substr($htmlfile, 0, index($htmlfile,"."));
my $origpart = substr($htmlfile, 0, -5);
my $part = $origpart;
$origpart =~ s/^src\//$srcreplace/;
$part =~ s/^src\///;
print OUT "$part";
# print OUT "java";
# print "DOCFILE: $docdir/$part.html\n";
if ( open(DOCFILE,"<$docdir/$part.html") ) { #|| die "ERROR!";
# print OUT "doc\n";
# print "doc\n";
print OUT ".";
if ( 0 ) { # ei tarvii lisätä SRC-HTML -linkkiä
my @array = ;
close(DOCFILE);
my $target = " " .
" Class | ";
if (open(RESULTFILE, ">$docdir/$part.html")) {
for(my $k = 0; $k < @array; $k++){
my $line = $array[$k];
if( $line =~ m/$target/){
my @foo = split("/",$part);
print "part: $part\n";
$line = $line . " " .
# "" .
"" .
"SRC-HTML | \n";
}
print RESULTFILE $line;
}
close(RESULTFILE);
}
} # ei SCR-HTML -linkkiä
} else {
print OUT ".";
}
print OUT "java";
# print OUT "html\n";
} # .java tiedosto
else { # kaikista muista pelkkä linkki
print OUT "$alkuosat[$i]";
}
#print OUT " \n";
# print OUT qq{$alkuosat[$i] = $kommentit[$i]
\n};
} else {
if ( "-" le $kommentit[$i] && $kommentit[$i] lt "-A" ) { print OUT "
\n"; }
elsif ( $kommentit[$i] ge " " ) {
print OUT "$kommentit[$i]";
if ( ! ( $kommentit[$i] =~ // ) ) { print OUT "
"; }
print OUT "\n";
}
else { print OUT "
\n"; }
}
}
print OUT "\n";
print OUT "\n";
close OUT;
}
###############################################################################
if ( $command eq "GET" ) {
foreach my $hak (@lajiteltu) {
mkdir $hak,0;
print "mkdir $hak\n";
}
# for my $i (0..$#tiedostot) {
for (my $i=0; $i < @tiedostot; $i++ ) {
my $tied = $tiedostot[$i];
my $lahde = $lahdepolut[$i];
my $kohde = $kohdepolut[$i];
if ( $lahde eq "" ) { $lahde = CheckHTTP($defwww); }
# my $lahde = ($lahdepolut[$i] || CheckHTTP("$www/~$user/$kurssi");
GetWWWFile("$lahde$tied","$kohde$tied");
}
}
###############################################################################
if ( $command eq "PUREHTML" ) {
if ( $subpath ne "" ) { $docdir = $subpath . "/"; }
MakeHtmlFiles();
}
###############################################################################
if ( $command eq "HTML" || $command eq "FTP" ) {
require('vlftplib.pl');
MakeHtmlFiles();
my $host = $www;
$host =~ s!.*//!!; # Mahdollinen http:// pois
$host =~ s!/.*!!; # Kaikki /-jälkeiset osat pois
if ( $passwd eq "" ) {
print "Password for $host.$user >";
$passwd = ;
if ( $passwd eq "" ) { die "No passwd"; }
$passwd =~ s/\n//;
}
if ( $passwd eq "-" ) { die "No ftp"; }
ftp::debug('ON');
ftp::open($host, $user, $passwd) or die("Can not open ftp $host, $user");
ShowFtpError;
ftp::binary();
my %polun_palat = (); # Käytetään vain hashin avainosaa :-)
hakemisto_lista("$subpath/.",\%polun_palat);
my @spolun_palat = sort(keys(%polun_palat));
# print %polun_palat; print "\n";
# print @spolun_palat; print "\n";
ftp::cwd("www"); ShowFtpError;
foreach my $hak (@spolun_palat) {
ftp::mkdir("$hak"); ShowFtpError;
# ftp::cwd("$hak"); ShowFtpError;
print "mkdir $hak\n";
}
# ftp::mkdir("www/$subpath"); ShowFtpError;
ftp::cwd("$subpath"); ShowFtpError;
ftp::put("$fileshtml","$fileshtml"); ShowFtpError;
ftp::put("$indexhtml","$indexhtml"); ShowFtpError;
# my @dir = ftp::dir(".");
# print "---------\n";
# print $dir[0];
# print "---------\n";
###############################################################################
if ( $command eq "FTP" ) {
require('vlftplib.pl');
ftp::mkdir("doc"); ShowFtpError;
foreach my $hak (@lajiteltu) {
print "mkdir $hak\n";
ftp::mkdir($hak); ShowFtpError;
ftp::mkdir("doc/$hak"); ShowFtpError;
}
ftp::put("$filename","$filename"); ShowFtpError;
ftp::put("doc/stylesheet.css","doc/stylesheet.css"); ShowFtpError;
ftp::put("doc/overview-tree.html","doc/overview-tree.html"); ShowFtpError;
ftp::put("doc/index-all.html","doc/index-all.html"); ShowFtpError;
# foreach my $tied (@tiedostot) {
for (my $i=0; $i < @tiedostot; $i++ ) {
my $tied = trim($tiedostot[$i]);
if ( $lahdepolut[$i] gt " " ) { next; }
my $lahde = $lahdepolut[$i];
# if ( $lahde eq "" ) { $lahde = CheckHTTP("$www/~$user/$subpath"); }
if ( $lahde eq "" ) { $lahde = CheckHTTP("$defwww"); }
# print "$lahde$tied\n";
my $mtime = GetWWWFileDate("$lahde$tied");
my $filedate = 0;
my $filestat;
$filestat = stat($tied) and $filedate = $filestat->mtime;
print "$tied: " . ctime($filedate) . " - " . ctime($mtime) ;
if ( $filedate > $mtime ) {
ftp::put($tied,$tied); ShowFtpError;
print "->";
}
my $filetype = substr($tied, -5);
if($filetype eq ".java"){
my $part = substr($tied, 0, index($tied,"."));
ftp::put("doc/$part.html","doc/$part.html");
ftp::put("doc/$part.java.html","doc/$part.java.html");
}
print "\n";
}
}
ftp::close();
}
###############################################################################
###############################################################################
if ( $command eq "COPY" ) {
MakeHtmlFiles();
my $destpath = "$mainpath/$subpath";
my %polun_palat = (); # Käytetään vain hashin avainosaa :-)
hakemisto_lista("$subpath/.",\%polun_palat);
my @spolun_palat = sort(keys(%polun_palat));
# print %polun_palat; print "\n";
# print @spolun_palat; print "\n";
foreach my $hak (@spolun_palat) {
mkdir "$mainpath/$hak",0;
print "mkdir $mainpath/$hak\n";
}
# print "mkdir $destpath\n";
# mkdir "$destpath",0;
mkdir "$destpath/doc",0;
mkdir "$destpath/doc/src-html",0;
foreach my $hak (@lajiteltu) {
my $dochak = $hak;
$dochak =~ s/^src\///;
$hak =~ s/^src\//$srcreplace/;
print "mkdir $destpath/$hak\n";
mkdir "$destpath/$hak",0;
mkdir "$destpath/doc/$dochak",0;
mkdir "$destpath/doc/src-html/$dochak",0;
CopyFileIfNewer("doc/$dochak/package-frame.html","$destpath/doc/$dochak/package-frame.html");
CopyFileIfNewer("doc/$dochak/package-summary.html","$destpath/doc/$dochak/package-summary.html");
CopyFileIfNewer("doc/$dochak/package-tree.html","$destpath/doc/$dochak/package-tree.html");
# copy("doc/$hak/*.html","$destpath/doc/$hak/");
}
CopyFileIfNewer("$filename","$destpath/$filename");
CopyFileIfNewer("$fileshtml","$destpath/$fileshtml");
CopyFileIfNewer("$indexhtml","$destpath/$indexhtml");
CopyFileIfNewer("doc/front.html","$destpath/doc/front.html");
CopyFileIfNewer("doc/AllClasses.html","$destpath/doc/AllClasses.html");
CopyFileIfNewer("doc/allclasses-frame.html","$destpath/doc/allclasses-frame.html");
CopyFileIfNewer("doc/$indexhtml","$destpath/doc/$indexhtml");
CopyFileIfNewer("doc/stylesheet.css","$destpath/doc/stylesheet.css");
CopyFileIfNewer("doc/src-html/stylesheet.css","$destpath/doc/src-html/stylesheet.css");
CopyFileIfNewer("doc/overview-tree.html","$destpath/doc/overview-tree.html");
CopyFileIfNewer("doc/overview-summary.html","$destpath/doc/overview-summary.html");
CopyFileIfNewer("doc/overview-frame.html","$destpath/doc/overview-frame.html");
CopyFileIfNewer("doc/index-all.html","$destpath/doc/index-all.html");
CopyFileIfNewer("doc/packages.html","$destpath/doc/packages.html");
# foreach my $tied (@tiedostot) {
for (my $i=0; $i < @tiedostot; $i++ ) {
my $tied = trim($tiedostot[$i]);
if ( $lahdepolut[$i] gt " " ) { next; }
my $desttied = $tied;
$desttied =~ s/^src\//$srcreplace/;
CopyFileIfNewer($tied,"$destpath/$desttied");
my $filetype = substr($tied, -5);
if($filetype eq ".java"){
my $part = substr($tied, 0, index($tied,"."));
$part =~ s/^src\///;
CopyFileIfNewer("doc/$part.html","$destpath/doc/$part.html");
CopyFileIfNewer("doc/src-html/$part.html","$destpath/doc/src-html/$part.html");
CopyFileIfNewer("doc/src-html/$part.java.html","$destpath/doc/src-html/$part.java.html");
}
}
}
###############################################################################
###############################################################################
if ( $command eq "SVN" ) {
# my $destpath = "$mainpath/$subpath";
my %polun_palat = (); # Käytetään vain hashin avainosaa :-)
hakemisto_lista("$subpath/.",\%polun_palat);
my @spolun_palat = sort(keys(%polun_palat));
# print %polun_palat; print "\n";
# print @spolun_palat; print "\n";
foreach my $hak (@spolun_palat) {
print `svn add -N $hak 2>nul`;
}
print `svn add -N .svnignore 2>nul`;
print `svn add -N files.txt 2>nul`;
print `svn add -N .classpath 2>nul`;
print `svn add -N .project 2>nul`;
foreach my $hak (@lajiteltu) {
print `svn add -N $hak 2>nul`;
}
for (my $i=0; $i < @tiedostot; $i++ ) {
my $tied = trim($tiedostot[$i]);
if ( $lahdepolut[$i] gt " " ) { next; }
# print "svn add -N $tied 2>nul\n";
print `svn add -N $tied 2>nul`;
# print `svn add -N $tied `;
}
}
###############################################################################
sub handlePackages() {
my $mask = shift;
my @packages = split(" ",$mask);
foreach my $package (@packages) {
handlePackage($package);
}
}
###############################################################################
#
sub handlePackage() {
my $package = shift;
#print "Paketti: $package\n";
$package =~ s/\/\*\.java//;
print "Paketti: $package\n";
if ( $package =~ m/^\.\./ ) { return; }
if ( $package eq "*.java" ) { $package = ""; }
print "Paketti: $package\n";
$package =~ s/^src\///;
my $dir = "$docdir/src-html/$package";
$dir =~s/\\\\\/\//\//; # korvataan \\// yhdellä /
$dir =~s/\\//; # poistetaan \
print "dir = $dir\n";
opendir(D, $dir) || die "can't opendir $dir: $!";
my @f = readdir(D);
closedir(D);
foreach my $file (@f) {
my $filename = $dir . '/' . $file;
print "$filename\n";
if ($file eq '.' || $file eq '..') {
} elsif (-d $filename) {
# depending on your needs you can do subdirs
} else {
if ( $filename =~ m/\.java\.html/ ) {
handleFile($filename);
}
}
}
foreach my $file (@f) {
my $filename = $dir . '/' . $file;
my $repname;
if ($file eq '.' || $file eq '..') {
} elsif (-d $filename) {
# depending on your needs you can do subdirs
} else {
if ( $file =~ m/\..*\.html/ && !($file =~ m/\.java\.html/) ) {
$repname = $file; # copy something??? why???
$repname =~ s!\..*\.!.!;
print "$repname <= $filename\n";
copy($dir . '/' . $repname,$filename);
}
}
}
}
###############################################################################
sub handleFile() {
# make copies from j2h java source files Class.java.html and change links a bit
my $name = shift;
my $outname = $name;
my $line;
$outname =~ s/\.java//; # copy over javadoc file Class.html
print "$outname\n";
open(FILE,"<$name") or die "Error opening input file $name: $!\n";
open(OUT, ">$outname") or die "Error opening output file $outname: $!\n";
while ($line = ) {
$line =~ s/NAME=\"/NAME=\"line\./g;
$line =~ s!\.java\.html!\.html!g;
print OUT $line;
}
close(OUT);
close(FILE);
}
###############################################################################
###############################################################################