#!/usr/bin/perl # Copyright (c) 2003 Hansjoerg Lipp # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # The license can be found at http://www.gnu.org/copyleft/gpl.html # one of my first perl scripts; so don't expect too much... $my_domain=hobbes; $dont_ignore=0; sub print_line { my $out_line=$_[0]; my $out_entry=$_[1]; my $out_folder=$_[2]; my $out_parent=$_[3]; my $flags=$_[4]; # 0: normal; 1: folder without children; 2: parents:self; 3: parents my $parent_entry; #FIXME <-- as parameter my $parent_name; my $depth_diff; my $var; if ($out_folder>=0) { if ($flags==3) { $var="FOLDER_MAIN_PAR"; } elsif ($flags==2) { $var="FOLDER_MAIN_CUR"; } else { $var="FOLDER_MAIN_STD"; } $var .= "_DEAD" if ($flags!=1&&$out_folder&&!$folder_urls[$out_folder]); $out_line =~ s/\@FOLDER_MAIN\@/$variables{$var}/g; # FIXME newlines if ($out_entry>=0 && $entry_has_desc[$out_entry]) { $out_line =~ s/\@FOLDER_OPT_DESC\@/$variables{"FOLDER_DESC"}/g } else { $out_line =~ s/\@FOLDER_OPT_DESC\@/$variables{"FOLDER_NO_DESC"}/g } } else { if ($entry_has_url[$out_entry]) { $out_line =~ s/\@URL_MAIN\@/$variables{"URL_MAIN_STD"}/g } else { $out_line =~ s/\@URL_MAIN\@/$variables{"URL_MAIN_STD_DEAD"}/g } if ($entry_has_desc[$out_entry]) { $out_line =~ s/\@URL_OPT_DESC\@/$variables{"URL_DESC"}/g } else { $out_line =~ s/\@URL_OPT_DESC\@/$variables{"URL_NO_DESC"}/g } } if ($out_parent>=0) { $parent_entry=$folder_to_entry[$out_parent]; if ($parent_entry<0) { $parent_name=$variables{"MAIN_NAME"}; } else { $parent_name=$entry_html_name[$parent_entry]; } $out_line =~ s/\@PARENTNAME\@/$parent_name/g; $out_line =~ s/\@PARENTFILE\@/$folder_file[$out_parent].html/; } if ($out_entry>=0) { $out_line =~ s/\@URL\@/$entry_url[$out_entry]/g; $out_line =~ s/\@HTMLNAME\@/$entry_html_name[$out_entry]/g; $out_line =~ s/\@DESCRIPTION\@/$entry_desc[$out_entry]/g; } else { $out_line =~ s/\@HTMLNAME\@/$variables{"MAIN_NAME"}/g; } if ($out_folder>=0) { $out_line =~ s/\@FILENAME\@/$folder_file[$out_folder].html/g; } $depth_diff=($out_line =~ s/\@INDENT:UP\@//g)-($out_line =~ s/\@INDENT:DOWN\@//g); if ($depth_diff < 0) { $ind_lev+=$depth_diff; $ind_lev=0 if $ind_lev<0; } $out_line = $variables{"INDLEV"}x$ind_lev . $out_line; $out_line =~ s/\@INDENT\@/$indent/g; if ($depth_diff > 0) { $ind_lev+=$depth_diff; } print OUT $out_line,"\n"; } sub print_lines { my $out_lines=$_[0]; my $out_entry=$_[1]; my $out_folder=$_[2]; my $out_parent=$_[3]; my $flags=$_[4]; my @out_text; my $out_line; @out_text=split /\n/, $out_lines; #print ">>>>>>>>>>>>>>>>>>>> $out_lines"; #$num=@out_text;print "<<<<<<<<<<<<<<<<<<<< $num parts\n"; #FIXME newlines foreach $out_line (@out_text) { print_line $out_line,$out_entry,$out_folder,$out_parent,$flags; } } sub print_var { my $var_name=$_[0]; my $out_entry=$_[1]; my $out_folder=$_[2]; my $out_parent=$_[3]; my $flags=$_[4]; #print "var ", $var_name; #print ", ", $entry_html_name[$out_entry] if $out_entry>=0; #print "\n"; print_lines $variables{$var_name},$out_entry,$out_folder,$out_parent,$flags; } sub print_item { my $var_name=$_[0]; my $out_entry=$_[1]; my $out_folder=$_[2]; my $out_parent=$_[3]; my $flags=$_[4]; print_var $var_name,$out_entry,$out_folder,$out_parent,$flags; $have_output=1; $need_separator=1; } sub print_pre { my $var_name=$_[0]; my $out_entry=$_[1]; my $out_folder=$_[2]; my $out_parent=$_[3]; my $parents=$_[4]; my $with_items=$_[5]; my @parent_stack=(); my $par_parent,$par_folder,$par_depth=0; #my $par_flags=3; if (!$have_output) { print_var "SEPARATOR",$out_entry,$out_folder,$out_parent,0 if $need_separator; print_var $var_name,$out_entry,$out_folder,$out_parent,0; $have_output=1; $need_separator=1; if ($parents) { $par_parent=$out_parent; ++$par_depth; while ($par_parent>=0&&($parents<0||$par_depth<$parents)) { ++$par_depth; push @parent_stack,$par_parent; if ($par_parent) { $par_parent=$entry_folder[$folder_to_entry[$par_parent]]; } else { $par_parent=-1; } } while (@parent_stack) { $par_folder=pop @parent_stack; $par_flags=2 if !@parent_stack; print_var "FOLDER",$folder_to_entry[$par_folder],$par_folder,$par_parent,3;#$par_flags; print_var "UP",$folder_to_entry[$par_folder],$par_folder,$par_parent,0; $par_parent=$par_folder; } print_var "FOLDER",$out_entry,$out_folder,$out_parent,2; } } if ($parents&&!$have_items&&$with_items) { print_var "UP",$out_entry,$out_folder,$out_parent,0; $have_items=1; } } sub print_post { my $var_name=$_[0]; my $out_entry=$_[1]; my $out_folder=$_[2]; my $out_parent=$_[3]; my $parents=$_[4]; #my @parent_stack=(); my $par_parent,$par_folder,$par_depth=0; if ($have_output) { if ($parents) { if ($have_items) { print_var "DOWN",$out_entry,$out_folder,$out_parent,0; } ++$par_depth; $par_parent=$out_parent; while ($par_parent>=0&&($parents<0||$par_depth<$parents)) { ++$par_depth; $par_folder=$par_parent; if ($par_parent) { $par_parent=$entry_folder[$folder_to_entry[$par_parent]]; } else { $par_parent=-1; } print_var "DOWN",$folder_to_entry[$par_folder],$par_folder,$par_parent,0; } } print_var $var_name,$out_entry,$out_folder,$out_parent,0 if $have_output; $have_output=0; $need_separator=1; } } sub convert_html { #FIXME characters 0x00..0x1f ? my $name=$_[0]; my $lno=$_[1]; my $entry_name=$_[2]; my $is_desc=$_[3]; my $html_name; $html_name=$name; #if (!$is_desc) #{ $html_name =~ s/&/&/g; $html_name =~ s//>/g; $html_name =~ s/"/"/g; #} $html_name =~ s/\xc3\x9c/Ü/g; $html_name =~ s/\xc3\xbc/ü/g; $html_name =~ s/\xc3\x84/Ä/g; $html_name =~ s/\xc3\xa4/ä/g; $html_name =~ s/\xc3\x96/Ö/g; $html_name =~ s/\xc3\xb6/ö/g; $html_name =~ s/\xc3\x9f/ß/g; $html_name =~ s/\xc2\xae/®/g; $html_name =~ s/\xc2\xa0/ /g; $html_name =~ s/\xc2\xb0/°/g; $html_name =~ s/\xc2\xb7/·/g; $html_name =~ s/\xc2\xa7/§/g; $html_name =~ s/\xc2\xa2/¢/g; $html_name =~ s/\xe2\x82\xac/&euro/g; $html_name =~ s/\02\02/
/g if $is_desc; #FIXME \n print "unknown character in line $lno, <$entry_name>\n" if $html_name =~ s/[\xc0-\xdf][\x80-\xbf]{1}/?/g; print "unknown character in line $lno, <$entry_name>\n" if $html_name =~ s/[\xe0-\xef][\x80-\xbf]{2}/?/g; print "unknown character in line $lno, <$entry_name>\n" if $html_name =~ s/[\xf0-\xf7][\x80-\xbf]{3}/?/g; print "unknown character in line $lno, <$entry_name>\n" if $html_name =~ s/[\xf8-\xfb][\x80-\xbf]{4}/?/g; print "unknown character in line $lno, <$entry_name>\n" if $html_name =~ s/[\xfc-\xfd][\x80-\xbf]{5}/?/g; print "invalid character in line $lno, <$entry_name>\n" if $html_name =~ s/[\x80-\xff]/?/g; return $html_name; } die "missing argument (opera bookmark file) or too many arguments" if @ARGV != 1; $bookmarks= $ARGV[0]; open(IN,"<$bookmarks") or die "could not open \"$bookmarks\""; @INPUT=; close(IN); $in_header=1; $in_folder=0; $in_url=0; $waiting=0; $indent=""; $ind_lev=0; $lno=0; $folders=1; $entries=0; $cur_folder=0; push @folder_to_entry, -1; # root "folder" has no entry push @folder_size, 0; push @folder_folders, 0; push @folder_urls, 0; push @folder_first_folder,-1; push @folder_first_url, -1; push @folder_last_folder, -1; push @folder_last_url, -1; print "parsing $bookmarks...\n"; foreach $line (@INPUT) { ++$lno; chomp $line; if ($waiting && $line eq "#URL") { $name=""; $url=""; $desc=""; $have_desc=0; $have_url=0; $have_name=0; $trash=0; $waiting=0; $in_url=1; } elsif ($waiting && $line eq "#FOLDER") { $name=""; $url=""; $desc=""; $have_desc=0; $have_url=0; $have_name=0; $trash=0; $waiting=0; $in_folder=1; } elsif ($waiting && $line eq "-") { die "error in line $lno: '-' outside folder" if !$cur_folder; if(!$folder_size[$cur_folder]) { push @empty_list,$cur_folder; } $indent=~ s/ $//; $cur_folder=$entry_folder[$folder_to_entry[$cur_folder]]; $waiting=0; } elsif ($line eq "") { if ($in_folder||$in_url) { #die "entry without name" if (!$have_name); #die "bookmark without url" if ($in_url&&!$have_url); if ($dont_ignore) { $ignore=!$cur_folder && $in_url; } else { $ignore=$trash || !$cur_folder && $in_url || $cur_folder && $entry_ignore[$folder_to_entry[$cur_folder]] || $have_name && $name =~ m/-hide-/ || $have_desc && $desc =~ m/-hide-/ || $have_url && $url =~ m#^file:/#; if (!$ignore && $have_url) { $domain=$url; $domain=~tr/A-Z/a-z/; $domain=~s#^[a-z][-a-z0-9+.]*:/*##; $domain=~s#/.*$##; $domain=~s#/:[0-9]+$##; $ignore=$domain =~ m/\@/ || $domain eq "localhost" || $domain eq $my_domain || $domain eq "config.privoxy.org" || $domain =~ m/\.local$/ || $domain =~ m/\.localdomain$/ || $domain =~ m/^127\./ || $domain =~ m/^[^.]+$/; } } $desc = convert_html $desc,$lno,$name,1 if $have_desc; if($have_name) { $html_name=$name; } else { $html_name = "-"; } $html_name = convert_html $name,$lno,$name,0; push @entry_folder, $cur_folder; push @entry_has_desc, $have_desc; push @entry_desc, $desc; push @entry_has_name, $have_name; push @entry_name, $name; push @entry_has_url, $have_url; push @entry_url, $url; push @entry_is_folder,$in_folder; push @entry_ignore, $ignore; push @entry_html_name,$html_name; push @entry_next, -1; ++$folder_size[$cur_folder] if !$ignore; $cur_entry=$entries; ++$entries; $prev=-1; if ($in_folder) { if (!$ignore) { ++$folder_folders[$cur_folder]; $prev=$folder_last_folder[$cur_folder]; $folder_first_folder[$cur_folder]=$cur_entry if ($prev<0); $folder_last_folder[$cur_folder]=$cur_entry; } $out="$indent\[$html_name\]"; $indent="$indent "; push @folder_to_entry, $cur_entry; push @folder_size, 0; push @folder_folders, 0; push @folder_urls, 0; push @folder_first_folder, -1; push @folder_first_url, -1; push @folder_last_folder, -1; push @folder_last_url, -1; $cur_folder=$folders; ++$folders;; push @entry_to_folder,$cur_folder; } else { if (!$ignore) { ++$folder_urls[$cur_folder]; $prev=$folder_last_url[$cur_folder]; $folder_first_url[$cur_folder]=$cur_entry if ($prev<0); $folder_last_url[$cur_folder]=$cur_entry; } $out="$indent<$html_name> -> $url"; push @entry_to_folder,-1; } $out="{ $out }" if $ignore; print "$out\n"; $entry_next[$prev]=$cur_entry if ($prev>=0); push @entry_prev,$prev; } $in_header=0; $in_folder=0; $in_url=0; $waiting=1; } elsif (($in_folder||$in_url) && $line =~ m/^\tNAME=/ && !$have_name) { $have_name=1; $name=$line; $name=~s/^\tNAME=//; } elsif (($in_folder||$in_url) && $line =~ m/^\tDESCRIPTION=/ && !$have_desc) { $have_desc=1; $desc=$line; $desc=~s/^\tDESCRIPTION=//; } elsif (($in_folder||$in_url) && $line =~ m/^\tID=/) { #print "skipped ID: >$line<\n" } elsif (($in_folder||$in_url) && $line =~ m/^\tCREATED=/) { #print "skipped CREATED: >$line<\n" } elsif (($in_folder||$in_url) && $line eq "\tON PERSONALBAR=YES") { } elsif (($in_folder||$in_url) && $line =~ m/^\tPERSONALBAR_POS=/) { } elsif (($in_folder||$in_url) && $line =~ m/^\tORDER=/) { } elsif (($in_folder||$in_url) && $line eq "\tACTIVE=YES") { } elsif ($in_folder && $line eq "\tTRASH FOLDER=YES") { $trash=1; } elsif ($in_folder && $line eq "\tLINKBAR FOLDER=YES") { } elsif ($in_folder && $line eq "\tLINKBAR STOP=YES") { } elsif ($in_folder && $line eq "\tEXPANDED=YES") { } elsif ($in_url && $line =~ m/^\tURL=/ && !$have_url) { $have_url=1; $url=$line; $url=~s/^\tURL=//; } elsif ($in_url && $line =~ m/^\tICONFILE=/) { #print "skipped ICONFILE: >$line<\n" } elsif ($in_url && $line =~ m/^\tVISITED=/) { #print "skipped VISITED: >$line<\n" } elsif ($in_header) { print "skipped header line >$line<\n" } else { die "error in line $lno: >$line<"; } } die "unexpected end of file" if !$waiting || $cur_folder; if (0) { for ($cur_entry=0;$cur_entry<$entries;++$cur_entry) { $fmt='%04d [ %04d <> %04d | %02d->%02d ] %-40.40s'; if ($entry_inore[$cur_entry]) { $fmt=" $fmt \n"; } else { $fmt="{ $fmt }\n"; } printf $fmt,$cur_entry,$entry_prev[$cur_entry],$entry_next[$cur_entry], $entry_folder[$cur_entry],$entry_to_folder[$cur_entry], $entry_html_name[$cur_entry]; } print "\n"; for ($cur_folder=0;$cur_folder<$folders;++$cur_folder) { $cur_entry=$folder_to_entry[$cur_folder]; if ($cur_folder) { $html_name=$entry_html_name[$cur_entry]; } else { $html_name= '';} $fmt='%02d (%04d) #%03d | urls: #%03d %04d..%04d | folders: #%03d %04d..%04d | %-40.40s'; if ($entry_inore[$cur_entry]) { $fmt=" $fmt \n"; } else { $fmt="{ $fmt }\n"; } printf $fmt,$cur_folder,$cur_entry,$folder_size[$cur_folder], $folder_urls[$cur_folder],$folder_first_url[$cur_folder],$folder_last_url[$cur_folder], $folder_folders[$cur_folder],$folder_first_folder[$cur_folder],$folder_last_folder[$cur_folder], $html_name; } } print "\nremoving empty folders...\n"; while (@empty_list) { $cur_folder=pop @empty_list; next if !$cur_folder; $cur_entry=$folder_to_entry[$cur_folder]; next if $entry_ignore[$cur_entry]; if ($entry_has_name[$cur_entry]) { print "removing folder [$entry_name[$cur_entry]]\n" } else { print "removing unnamed folder\n" } $entry_ignore[$cur_entry]=1; $parent=$entry_folder[$cur_entry]; --$folder_folders[$parent]; $prev=$entry_prev[$cur_entry]; $next=$entry_next[$cur_entry]; if ($next>=0) { $entry_prev[$next]=$prev; } else { $folder_last_folder[$parent]=$prev; } if ($prev >= 0) { $entry_next[$prev]=$next; } else { $folder_first_folder[$parent]=$next; } if(!--$folder_size[$parent]) { push @empty_list, $parent } } print "\ngenerating file names...\n"; push @folder_file,"index"; %file_hash = ( "index" => 0, "stdtmpl" => -1, "maintmpl" => -1, "tmplboth" => -1, "tmplfolders" => -1, "tmplurls" => -1 ); for ($cur_folder=1;$cur_folder<$folders;++$cur_folder) { $cur_entry=$folder_to_entry[$cur_folder]; if ($entry_ignore[$cur_entry]) { push @folder_file,""; next; } $par_folder=$entry_folder[$cur_entry]; if (!$entry_has_name[$cur_entry]) { $file_name="-"; $name=""; } else { $name = $entry_name[$cur_entry]; $file_name = $name; $file_name =~ s/[\x80-\xff]/-/g; $file_name =~ s/[_\/|\(\)&"'`\$ \\:;\t.,*?\[\]{}#]/-/g; $file_name =~ s/-+/-/g; $file_name =~ s/^-//; $file_name =~ s/-$//; $file_name =~ tr/A-Z/a-z/; $file_name = "-" if $file_name eq ""; } if ($par_folder) { $par_name = $folder_file[$par_folder] . "_"; } else { $par_name = ""; } $comb_name = $par_name . $file_name; $i=0; while (exists $file_hash{$comb_name}) { ++$i; $comb_name = $par_name . $file_name . "." . $i; } push @folder_file,$comb_name; $file_hash{$comb_name}=$cur_folder; print "[$name] => $comb_name\n"; } print "\ngenerating html files...\n"; $setting_var=0; %variables = ( "INDLEV" => "\t", "URL_MAIN_STD" => "\@HTMLNAME\@", "URL_MAIN_STD_DEAD" => "\@HTMLNAME\@", "URL" => "\@INDENT\@

\@URL_MAIN\@\@URL_OPT_DESC\@

\n", "URL_DESC" => ": \@DESCRIPTION\@", "URL_NODESC" => "", # "URL_TAG" => "\@INDENT\@

\@TAG\@ \@HTMLNAME\@

\n", "FOLDER_MAIN_STD" => "\@HTMLNAME\@", "FOLDER_MAIN_STD_DEAD" => "\@HTMLNAME\@", "FOLDER_MAIN_CUR" => ">\@HTMLNAME\@<", "FOLDER_MAIN_CUR_DEAD" => ">\@HTMLNAME\@<", "FOLDER_MAIN_PAR" => "\@HTMLNAME\@", "FOLDER_MAIN_PAR_DEAD" => "\@HTMLNAME\@", "FOLDER" => "\@INDENT\@
\@FOLDER_MAIN\@\@FOLDER_OPT_DESC\@
\n", "FOLDER_DESC" => ": \@DESCRIPTION\@", "FOLDER_NODESC" => "", "SEPARATOR" => "\@INDENT\@
\n", "FOLDER_PRE" => "\@INDENT:UP\@\@INDENT\@
\n", "FOLDER_POST" => "\@INDENT:DOWN\@\@INDENT\@
\n", "URL_PRE" => "", "URL_POST" => "", "UP" => "\@INDENT:UP\@\@INDENT\@
\n", "DOWN" => "\@INDENT:DOWN\@\@INDENT\@
\n", "MAIN_NAME" => "Bookmarks" #FIXME ); for ($cur_folder=0;$cur_folder<$folders;++$cur_folder) { $cur_entry=$folder_to_entry[$cur_folder]; $template="stdtmpl.html"; if ($cur_folder) { next if $entry_ignore[$cur_entry]; #$html_name=$entry_html_name[$cur_entry]; $parent=$entry_folder[$cur_entry]; if (!$folder_folders[$cur_folder]) { $try_template="tmplurls.hmtl"; } elsif (!$folder_urls[$cur_folder]) { $try_template="tmplfolders.hmtl"; } else { $try_template="tmplboth.hmtl"; } } else { #$html_name="Bookmarks"; $try_template="maintmpl.html"; $parent=-1; } $template=$try_template if -r $try_template; $size=$folder_size[$cur_folder]; $have_output=0; $have_items=0; $need_separator=0; open(IN,"<$template") or die "could not open \"$template\""; @INPUT=; close(IN); $file_name=$folder_file[$cur_folder] . ".html"; print "$file_name\n"; open(OUT,">$file_name") or die "could not open \"$file_name\""; $lno=0; foreach $line (@INPUT) { ++$lno; if($line =~ m/^\s*(.*)\s*$/) { #chomp $line; $setting_var = 0; $var_name = $1; $var_val = $2; if(!exists $variables{$var_name}) { print "invalid variable name \"$var_name\"\n"; } else { $variables{$var_name}=$var_val; } #print "setting \"$var_name\" to \"$var_val\"\n"; } elsif($line =~ m/^(\s*)\s*$/) { #chomp $line; #print "$var_name set to\n--\n$variables{$var_name}--\n" if $setting_var; $setting_var=0; $indent = $1; $cmd = $2; if ($cmd =~ m/^SET:/) { $var_name=$cmd; $var_name=~s/^SET://; if($var_name ne "") { if(!exists $variables{$var_name}) { print "invalid variable name \"$var_name\"\n"; } else { $setting_var=1; $variables{$var_name}=""; } } } elsif ($cmd =~ m/^CONTENTS(:[:A-Z]*)?$/) { @params=split /:/,$1; %param_hash=(); foreach $param (@params) { next if $param eq ""; if(exists $param_hash{$param}) { $param_hash{$param}=1; } else { print "invalid parameter ", $param, "\n"; } } for($out_entry=$folder_first_url[$cur_folder];$out_entry>=0;$out_entry=$entry_next[$out_entry]) { print_pre "URL_PRE",$cur_entry,$cur_folder,$parent,0,1; print_item "URL",$out_entry,-1,$cur_folder,0; #FIXME has_url,has_name,tags,description,... } print_post "URL_POST",$cur_entry,$cur_folder,$parent,0; } elsif ($cmd =~ m/^DIR(:([0-9:A-Z]*))?$/) { @params=split /:/,$2; %param_hash=(); $depth=-1; $parents=-1; foreach $param (@params) { $param=-2 if $param eq ""; if($param=~m/^-?[0-9]+$/) { if ($parents != -1) { print "too many parameters for DIR\n"; } elsif ($depth != -1) { $parents=$param; } else { $depth=$param; } } elsif(exists $param_hash{$param}) { $param_hash{$param}=1; } else { print "invalid parameter ", $param, "\n"; } } @folder_stack=(); @entry_stack=(); $old_parent=$parent; $old_entry=$cur_entry; $old_folder=$cur_folder; $out_depth=0; $out_entry=$folder_first_folder[$cur_folder]; $out_folder=$entry_to_folder[$out_entry] if $out_entry>=0; print_pre "FOLDER_PRE",$cur_entry,$cur_folder,$parent,$parents,0 if $parents; while ($out_entry>=0) { print_pre "FOLDER_PRE",$cur_entry,$cur_folder,$parent,$parents,1; print_item "FOLDER",$out_entry,$out_folder,$old_folder,$depth>=0&&$out_depth==$depth; #FIXME has_url,has_name,tags,description,dir containing only dirs,flat,indentation... if(($depth<0||$out_depth<$depth) && $folder_first_folder[$out_folder]>=0) { print_var "UP",$out_entry,$out_folder,$old_folder,0; ++$out_depth; push @folder_stack,$old_parent; $old_parent=$old_folder; $old_folder=$out_folder; push @entry_stack,$old_entry; $old_entry=$out_entry; $out_entry=$folder_first_folder[$out_folder]; $out_folder=$entry_to_folder[$out_entry]; } else { while (1) { $out_entry=$entry_next[$out_entry]; if ($out_entry>=0) { $out_folder=$entry_to_folder[$out_entry]; last; } last if !$out_depth; --$out_depth; $out_folder=$old_folder; $old_folder=$old_parent; $old_parent=pop @folder_stack; $out_entry=$old_entry; $old_entry=pop @entry_stack; print_var "DOWN",$out_entry,$out_folder,$old_folder,0; } } } print_post "FOLDER_POST",$cur_entry,$cur_folder,$parent,$parents; } else { print "invalid command \"$cmd\"\n"; } } elsif ($setting_var) { $variables{$var_name} .= $line; } else { $indent=""; print_lines $line,$cur_entry,$cur_folder,$parent,0; } } close OUT; } #print "\nremoving unused files...\n"; # #for ($cur_folder=1;$cur_folder<$folders;++$cur_folder) #{ # $cur_entry=$folder_to_entry[$cur_folder]; # next if $entry_ignore[$cur_entry]||$folder_used[$cur_folder]; # $file_name=$folder_file[$cur_folder].".html"; # print $file_name,"\n"; # unlink $file_name; #} print "\ndone.\n";