|< 1 2 >| | 14 Einträge, 2 Seiten |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var TREE_ITEMS = [
['Home', null,
['test', "Link mit id aus Datenbank"],
['verz1', null,
['file2', "Link mit id aus Datenbank"],
['verz2', null,
['ver3', "Link mit id aus Datenbank",
['file3', "Link mit id aus Datenbank"],
],
],
],
],
];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#! /usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %hash;
while(<DATA>){
next if($_ =~ /^\s*?$/);
$_ =~ s/^\s+//;
my $path = $_;
$path =~ s/^\///; #/
my ($key,$sub) = split(/\//,$path,2);
$hash{$key} = insert_rec($key,$sub,$hash{$key});
}
print Dumper(\%hash);
# insert_rec builds the hash recursivly.
# Parameters:
# key of anonymous hash that has to be expanded
# remaining path
# reference to hash
sub insert_rec{
my ($key2,$path,$hashref) = @_;
my ($key,$sub) = split(/\//,$path,2);
unless($sub){
$hashref->{$key} = {};
return($hashref);
}
$hashref->{$key} = insert_rec($key,$sub,$hashref->{$key}) if($sub);
return ($hashref);
}# end insert_rec
# ohne Leerzeichen:
_ _DATA_ _
verz1/datei4
test
verz1/verz2/verz3/file3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use strict;
use Data::Dump qw(dump);
my @packeddirs = qw'verz1/datei4 test verz1/verz2/verz3/file3 verz1/file2';
my @unpackeddirs = map {
[split '/', $_]
} @packeddirs;
my @sorteddirs = sort {
my $idx = 0;
my $res = 0;
while(!$res) {
$res = sort_unpacked($idx++, $a, $b)
}
$res;
} @unpackeddirs;
sub sort_unpacked {
my ($idx, $left, $right) = @_;
my $ma = $left->[$idx];
my $mb = $right->[$idx];
defined $ma and defined $mb
? $ma cmp $mb
: defined $ma
? 1
: -1;
}
dump @sorteddirs;
$hashref->{$key} = insert_rec($key,$sub,$hashref->{$key}) if($sub);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
my $statement="SELECT * FROM orangeFile_files WHERE (vertrag_id=$db_vertrag_id AND status = 'ok') ORDER BY filename";
my $sth = $dbh->prepare($statement) or die("Kann keine Abfrage ($statement) starten:$DBI::errstr");
$sth->execute;
my $row;
my %flashfile = ();
my $cnt = 0;
while ($row = $sth->fetchrow_hashref)
{
my %temp=%$row;
# Nachschauen ob der filename doppelt besteht, dann den aktuellen benutzen
# da nur gültige aus der DB gelesen werden, können zu alte auch gelesen werden.
# den älteren also überschrieben:
if($flashfile{$temp{'filename'}}{'start_time'} > $temp{'start_time'}){
if($config{'umgebung'} eq "test"){
print "Datei $temp{'filename'} gibt es mit verschiedenen start_time";
}
next;
}else{ # also auch wenn nur ein Datensatz für diesen Flashfile gefunden wird
# Fügt das gefundende Hash in das HoH ein
$flashfile{$temp{'filename'}} = { %temp };
#push @warnungen, "Content of ".$temp{'filename'}." is ".$flashfile{$filename}{'content'};
}
$cnt++;
last if $cnt > 1000000;
}
my $link="?name=wert&id=".$flashfile{$filename}{'id'}; # Link um Datei anzuzeigen und zu ändern
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#! /usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use CGI::Carp 'fatalsToBrowser';
print "Content-type: text/plain\n\n";
my %hash;
my $zaehler = 0;
while(<DATA>){
my $path = $_;
chomp $path;
next if($path =~ /^\s*?$/);
$_ =~ s/^\s+//;
$path =~ s/^\///; #/
next if(length $path < 2);
my ($key,$sub) = split(/\//,$path,2);
print "key: $key | sub: ".$sub."\n";
unless($sub){
$hash{$key} = 0;
next;
}
$hash{$key} = insert_rec($key,$sub,$hash{$key});
}
my $outputstruktur = Dumper(\%hash); # Das was für das JS ausgegeben werden soll
# Für das JS die { durch [ ersetzen
$outputstruktur =~ s/}/]/g;
#$outputstruktur =~ s/=>/,/g;
$outputstruktur =~ s/\$VAR1/var TREE_ITEMS/g; # Variablennamen für JS ändern
$outputstruktur =~ s/('\w+') => {/[$1, $zaehler/g; # quick and dirty
# Ausgabe
print $outputstruktur;
# insert_rec builds the hash recursivly.
# Parameters:
# key of anonymous hash that has to be expanded
# remaining path
# reference to hash
sub insert_rec{
my ($key2,$path,$hashref) = @_;
my ($key,$sub) = split(/\//,$path,2);
unless($sub){
$hashref->{$key} = {};
return($hashref);
}
#print $sub."\n";
$hashref->{$key} = insert_rec($key,$sub,$hashref->{$key}) if($sub);
return ($hashref);
}# end insert_rec
# ohne Leerzeichen:
verz1/datei1
verz1/datei2
verz1/datei3
verz1/datei4
file1
verz1/verz2/verz3/file1231
verz1/verz2/verz3/file1232
verz1/verz2/file121
verz1/verz2/file122
verz1/verz2/file123
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#! /usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use CGI::Carp 'fatalsToBrowser';
print "Content-type: text/plain\n\n";
my $dimension; # Enthält die aktuelle Dimension des Arrays
my @element_nummer = (); # Enthält die aktuelle Position im Array, bezogen auf die Dimension
my @array_of_arrays = (); # Wird befüllt
my @AoA2 = (); # füll das erste AoA
while(<DATA>){
$dimension = 0; # reset
#@element_nummer=(); # reset
# bisschen was überprüfen und aussortieren
next if($_ =~ /^\s*?$/);
$_ =~ s/^\s+//;
my $path = $_;
chomp $path;
$path =~ s/^\///; #/
next if(length $path < 5);
# unterstes Verzeichnis nehmen und mit "Rattenschwanz" an Funktion insert_rec übergeben
my ($key,$sub) = split(/\//,$path,2);
@AoA2 = (); #reset
push @array_of_arrays, [insert_rec($key,$sub,"ich bin der Link")];
$element_nummer[$dimension]++;
}
my $outputstruktur = Dumper(@array_of_arrays); # Das was für das JS ausgegeben werden soll
# Für das JS die { durch { durch [ ersetzen
$outputstruktur =~ s/\$VAR1/var TREE_ITEMS/g; # Variablennamen für JS ändern
# Ausgabe
print $outputstruktur;
sub insert_rec{
my $key2; # Datei oder Verzeichnisname in der 2. Ebene
my $path; # Rattenschwanz des Path, überbleibende Verzeichnisse und Dateien
my $link; # Der Link für das JavaScript
($key2,$path,$link) = @_;
my ($key,$sub) = split(/\//,$path,2); # Wieder aufteilen
unless($sub){ # Wenn es kein Sub gibt muss es eine Datei sein, also mit Infos zurückgeben
return($key, $link);
}
# Hier komme ich nur hin, wenn $key ein Verzeichnis ist, $sub also existiert, weil ich vorher mit return zurück gesprungen bin.
# und einmal rekursiv Verzeichnis in Array pushen
#return (insert_rec($key,$sub,"ich bin ein Verzeichnis"));
my $arraydimension; # Wie tief soll in das Array gepusht werden?
$arraydimension = 'push @{ $AoA2';
# Dimension anhängen
foreach(@element_nummer){
$arraydimension .= "[".$_."]";
}
$arraydimension .= " }, [ insert_rec('$key','$sub',\"ich bin ein Verzeichnis\") ]";
print $arraydimension."\n";
eval($arraydimension);
# Nächstes Listenelement ist dran
$element_nummer[$dimension]++;
$dimension++;
return(@AoA2);
}# end insert_rec
# Testdaten
# ohne Leerzeichen:
verz1/datei1
verz1/datei2
verz1/datei3
verz1/datei4
file1
verz1/verz2/verz3/file1231
verz1/verz2/verz3/file1232
verz1/verz2/file121
verz1/verz2/file122
verz1/verz2/file123
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var TREE_ITEMS = [
['Home', null,
['test', "Link mit id aus Datenbank"],
['verz1', null,
['file2', "Link mit id aus Datenbank"],
['verz2', null,
['ver3', "Link mit id aus Datenbank",
['file3', "Link mit id aus Datenbank"],
],
],
],
],
];
$hashref->{$key} = insert_rec($key,$sub,$hashref->{$key}) if($sub);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/perl
use strict;
use warnings;
my $path = '/dir/dir1.3/dir1.3.1/dir1.3.1.3/file1.3.1.3.1';
process_path($path);
sub process_path {
my $path = shift; # Pfad
my $indent = shift || 0; # Einrueckungs-Anzahl
$path =~ s:^[\/\\]::; # entf. fuehrenden (Back-)Slash
my($super, $sub) = split /[\/\\]/, $path, 2; # aufteilen in oberen Ordner und Pfadrest
print ' ' x $indent, "$super\n";
if($sub) { # wenn es Pfadrest gibt
process_path($sub, ++$indent); # ruf mich erneut mit Pfadrest auf
return;
print ' ' x $indent, "$sub\n";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
our $DEBUG = 0; # Debugging: Aus = 0; An = 1 oder 2
our $SHIFTWIDTH = 4;
# Simuliert Datenbankabfrage
my(@rows) = map { my %h; @h{ qw(id filename content content_type) } = @$_; \%h }
[1, '/dir1/dir1.1/dir1.1.1/file1.1.1.1', 'bla bla bla', 'text'],
[2, '/dir1/dir1.2/dir1.2.1/file1.2.1.1', 'blu bla blubb', 'text'],
[4, '/dir1/file1', 'blu bla bla', 'text'],
[5, '/dir1/file2', 'blu bla ble', 'text'],
[3, '/dir2/dir2.1/dir2.1.1/file2.1.1.3', 'bli blu bla', 'text'],
[6, 'file1', 'bar bla blo', 'text'],
[7, 'afile2', 'another file', 'text'],
[8, 'bfile2', 'bnother file', 'text'];
my $tree;
while(my $row = shift @rows) { # jede Datenzeile
$tree = process_data($row->{'filename'}, $row, $tree); # verarbeiten und Baum hinzufuegen
}
print Dumper($tree), '-'x25, "\n" if $DEBUG;
print <<EOT1;
var TREE_ITEMS = [
EOT1
# erzeuge JS-Code
build_js_code($tree);
print <<EOT2;
];
EOT2
sub process_data {
my($path, $row_data, $tree) = @_;
$tree = {'type' => 'dir'} unless $tree;
$path =~ s:^[\\/]::;
my($super, $sub) = split /[\/\\]/, $path, 2;
if($sub && $sub ne '') {
$tree->{'items'}->{$super} = process_data($sub, $row_data, {'dir' => 1});
} else {
$tree->{'items'}->{$super} = {'file' => 1, 'data' => $row_data };
}
return $tree;
}
sub build_js_code {
my $tree = shift;
my $indent = shift || 1;
foreach my $key (sort {return $a cmp $b if $tree->{'items'}->{$a}->{'dir'}
&& $tree->{'items'}->{$b}->{'dir'};
return $a cmp $b if $tree->{'items'}->{$a}->{'file'}
&& $tree->{'items'}->{$b}->{'file'};
return $tree->{'items'}->{$a}->{'dir'} ? -1 : 1;}
keys %{ $tree->{'items'} } ) {
if( $tree->{'items'}->{$key}->{'dir'} ) {
print ' ' x ($SHIFTWIDTH * $indent),
"['", $key, ", null,\n";
build_js_code( $tree->{'items'}->{$key}, $indent + 1);
} else {
print ' ' x ($SHIFTWIDTH * $indent),
"['", $key, "', '", $tree->{'items'}->{$key}->{'data'}->{'content'}, "']\n";
}
}
}
|< 1 2 >| | 14 Einträge, 2 Seiten |