フォルダー内のコードの総行数とサイズを調べる

はじめに

今回の記事は、ちょっとしたお遊び記事です。

作成した公式プラグインが、気づいたら「100万ダウンロード」と「5万以上サイトで有効化中」になっていました。この数値は、Plugin Stats View という私のプラグインで出したもので、plugins_api を利用して集計しています。

ここまで良くやったなあとは思いつつ、今まで何行書いたんだろうと思い、行数とサイズを調べるプログラムを php で作成してみました。

下準備 & 仕様

作業ディレクトリを作成し、66個のプラグインをコピーしました。あらかじめ、自分以外の方が書いたライブラリなどを削除しました。

  • コマンドライン上で実行します。
  • コード中に指定したディレクトリを再帰検索して、php, js , css ファイルをカウントします。
  • php, js, css のそれぞれと全ての行数の総和と、サイズの総和を出力します。

コード

<?php
/**
 * Plugin Name: Program number of line
 * Author:      Katsushi Kawamori
 * Author URI:  https://riverforest-wp.info/
 * License:     GPL2
 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
 *
 */

/*
	Copyright (c) 2021- Katsushi Kawamori (email : dodesyoswift312@gmail.com)
	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; version 2 of the License.

	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.

	You should have received a copy of the GNU General Public License
	along with this program; if not, write to the Free Software
	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

$line_all = pnol_scan_file( 'ディレクトリをフルパスで指定します' );

foreach ( $line_all as $key => $value ) {
	echo $key . ' : ' . number_format( $value['line'] ) . '行 - ' . number_format( $value['size'] / 1024 / 1024, 2 ) . 'Mbyte' . PHP_EOL;
}

echo PHP_EOL;

/** ==================================================
 * Scan file
 *
 * @param string $dir  dir.
 * @return array $count
 * @since 1.00
 */
function pnol_scan_file( $dir ) {

	$iterator = new RecursiveDirectoryIterator(
		$dir,
		FilesystemIterator::CURRENT_AS_FILEINFO |
		FilesystemIterator::KEY_AS_PATHNAME |
		FilesystemIterator::SKIP_DOTS
	);
	$iterator = new RecursiveIteratorIterator( $iterator );
	$iterator = new RegexIterator( $iterator, '/\.php$|\.js$|\.css$/i', RecursiveRegexIterator::MATCH );

	$count = array(
		'all' => array(
			'line' => 0,
			'size' => 0,
		),
		'php' => array(
			'line' => 0,
			'size' => 0,
		),
		'js' => array(
			'line' => 0,
			'size' => 0,
		),
		'css' => array(
			'line' => 0,
			'size' => 0,
		),
	);
	if ( ! empty( $iterator ) ) {
		foreach ( $iterator as $file_path => $file_info ) {
			if ( $file_info->isFile() ) {
				$line = exec( 'wc -l '. $file_path );
				$count['all']['line'] += trim( str_replace( $file_path, '', $line ) );
				$count['all']['size'] += $file_info->getSize();
				switch ( $file_info->getExtension() ) {
					case 'php':
						$count['php']['line'] += trim( str_replace( $file_path, '', $line ) );
						$count['php']['size'] += $file_info->getSize();
						break;
					case 'js':
						$count['js']['line'] += trim( str_replace( $file_path, '', $line ) );
						$count['js']['size'] += $file_info->getSize();
						break;
					case 'css':
						$count['css']['line'] += trim( str_replace( $file_path, '', $line ) );
						$count['css']['size'] += $file_info->getSize();
						break;
				}
			}
		}
	}

	return $count;

}

?>

実行

以下の様な結果になりました。

終わりに

最近、自プロダクトの「競技会採点システム」の方に時間を割く事が多くなったので、今後、公式プラグインの方はあまり力を入れないと思います。フォーラムで応答が無くても、ご容赦ください。

この記事を書いた人