2010年7月14日 星期三

[PHP] 替已壓縮 Javascript Code 稍稍排版

有時後會需要看別人寫的 Javascript Code,很多情況該程式碼已經被壓縮或最佳化,然後程式碼就被擠成一列而已,然而,那一些展開後可能是數百數千列的程式碼。


為此,就簡單寫隻 PHP 程式碼,把 Javascript Code 稍稍地排版,例如碰到 { 和 } 要縮排等,我記得以前用 Visual C++ 時,可全選程式碼後按 shtif + F8 就可以排版好了,這已經是七年前的印象,不過手邊沒這種環境,目前只愛用 vim 啦,就簡單寫一下 PHP 來處理。在自行更改 input 跟 output 吧。


程式碼(僅適合觀看,不適合轉完又拿來用喔,因為有些像 regular expression 應該因為此排版而出錯):


<?php
        $raw = file_get_contents( 'bundle.js' );

        $level = 0;
        for( $i=0 ; $i<strlen( $raw ) ; ++$i )
        {   
                if( $level > 0 && $raw[$i] == "\n" )
                {   
                        $sp = '';
                        for( $j=0 ; $j<$level; ++$j )
                                $sp .= "\t";

                        $prev_part = substr( $raw , 0 , $i );
                        $next_part = substr( $raw , $i + 1 );
                        $raw = $prev_part . $raw[ $i ] . $sp . $next_part ;

                        $i += $level;
                }   
                else if( $raw[ $i ] == ';' )
                {   
                        $prev_part = substr( $raw , 0 , $i );
                        $next_part = substr( $raw , $i + 1 );
                        $raw = $prev_part . $raw[ $i ] . "\n" . $next_part ;
                }   
                else if( $raw[ $i ] == '{' )
                {   
                        $prev_part = substr( $raw , 0 , $i );
                        $next_part = substr( $raw , $i + 1 );
                        $raw = $prev_part . $raw[ $i ] . "\n" . $next_part ;

                        ++$level;
                }   
                else if( $level > 0 && $raw[ $i ] == '}' )
                {   
                        --$level;
                        $sp = '';
                        for( $j=0 ; $j<$level; ++$j )
                                $sp .= "\t";

                        $prev_part = substr( $raw , 0 , $i );
                        $next_part = substr( $raw , $i + 1 );
                        $raw = $prev_part . "\n" . $sp . $raw[ $i ] . "\n" . $next_part ;

                        $i += $level + 1 ;      // 1 for first newline
                }   
                echo "$level\n";
        }
        file_put_contents( 'bundle.js.new' , $raw );
?>



沒有留言:

張貼留言