#! /usr/bin/env perl # ls-puki.pl (c) T.Watanabe # change url encoded filename made by PukiWiki # → human readable filename # Published with Creative Commons 帰属 - 非営利 - 同一条件許諾 License. # # History: # 2003-07-09 worked # ls -l の表示がガタつくのは勘弁してくれい # 2004-10-21 書式のガタつきがなくなりました # 代わりに ls -l の先頭行の合計は正しく出力されません # # Usage: ls [option] | ls-puki.pl # ls [option] | perl ls-puki.pl # use strict; use English; our( @max_width, $print_format ); sub main { my( $line, @buf, $buf, @list ); my( @org_list ) = <>; # ファイル名の変換と各カラムの最大幅の算出 foreach $line ( @org_list ) { chomp( $line ); @buf = split( /\s+/, $line ); # ls の出力の最終カラムをファイル名と決め打ち $buf[$#buf] = get_realfilename( $buf[$#buf] ); store_max_width( @buf ); # リストをリストに push push( @list, [@buf] ); } # 最大幅をもとに出力フォーマット生成 make_print_format(); # 出力 # ls -l の先頭の合計はちゃんと表示されません foreach $line ( @list ) { printf( "$print_format\n", @$line ); } } # End of main() ### ## ファイル名をチェックして pukiwiki encode のものなら decode ## そうでないものはスルーする関数 ### sub get_realfilename { my( $filename ) = @_; my( $is_puki_encode, $str, $i, @tmp, $ext ); $is_puki_encode = 0; # 退避(何もしない場合はそのまま返す) $str = $filename; $ext = ""; # まず拡張子でチェック # 拡張子が txt log rel ref なし で if ( $filename !~ /\./ || $filename =~ s/([^.]+)\.((txt|log|rel|ref|[0-9]+)[\/\*]?)$/\1/gi ) { if ( $filename =~ /[^0-9a-fA-F_]/ ) { $is_puki_encode = 0; } else { # 16進数に使われる文字と _ 以外にマッチしなかったら $is_puki_encode = 1; # pukiwiki encoded filename $ext = $2; } } # 入力されたファイル名が puki encode されたものなら decode → $str if ( $is_puki_encode ) { if ( $filename =~ /_/ ) { # _ で分割されていたら @tmp = split( /_/, $filename ); for ( $i = 0; $i <= $#tmp; $i++ ) { $tmp[$i] = pukidecode( $tmp[$i] ); } $str = join( '_', @tmp ); if ( $ext ne "" ) { $str .= "." . $ext; } } else { # されていなかったら $str = pukidecode( $filename ); if ( $ext ne "" ) { $str .= "." . $ext; } } } return $str; } ## ## 実際に URL decode する関数 ## % を付加したうえで pack(無駄かもです) ## sub pukidecode { my( $src ) = @_; my( $i, $str ); # print "PukiWiki encoded !\n"; for( $i = 0; $i < length( $src ); $i+=2 ) { $str .= "%" . substr( $src, $i, 2 ); } # $str = $src; $str =~ s/%([0-9a-f][0-9a-f])/pack("C",hex($1))/egi; return $str; } # End of pukidecode() ## ## 各カラムの最大幅を計算 ## sub store_max_width { my( @buf ) = @_; my( $i ); for ( $i = 0; $i <= $#buf; $i++ ) { if ( length( $buf[$i] ) > $max_width[$i] ) { $max_width[$i] = length( $buf[$i] ); } } 1; } # End of store_max_width() ## ## max_width をもとに sprintf 書式の生成 ## sub make_print_format { my( @buf ) = @max_width; my( $str, $i ); for ( $i = 0; $i <= $#buf; $i++ ) { if ( $i != $#buf ) { $str .= "%" . $buf[$i] . "s "; } else { $str .= "%-" . $buf[$i] . "s"; } } $print_format = $str; 1; } # End of make_print_format() # ls でも ls -l でもなんか適当にオプション付け加えてもそのまま動きます # 違うファイル名のリストを吐き出しちゃうけど、まぁ並べてみれば分かるかな、とか # 添付ファイルのバックアップがうっとぉしくなったときに使えると思う # とゆーかそういう目的で作った # 書式を変えたくなったら直接書き換えてください main();