Скрипт подсчета строк в проекте

Опубликовал Максим Баев, 24 октября 2016, 20:19

С кружкой кофе на столе, решил подготовить пост к пятнице. Но для этого мне нужен скрипт, который "склеит" все файлы из указанной папки. А после этого посчитает количество строк в получившемся холсте. Особенность скрипта заключается в том, что он группирует сумму строк из файлов по расширению.

В функции associations вы можете сформировать мапинг, в соответствии с которым, будет выведен на экран общий подсчет.

Если вдруг, по необъяснимым причинам, вы все еще пользуетесь версией php ниже 5.4, то нужно заменить объявление массива на классический вариант. Подробнее...

<?php
function associations() {
  return [
    'Text'       => ['txt', 'csv', 'md'],
    'PHP'        => ['php'],
    'JavaScript' => ['js', 'coffee'],
    'CSS'        => ['css', 'sass', 'scss', 'less'],
    'Images'     => ['jpg', 'jpeg', 'gif', 'png', 'ico', 'icon'],
  ];
}

Да, да! Он может подсчитать количество строк в изображении. Работает это также, как если бы вы открыли изображение в текстовом редакторе.

К делу. Заранее прошу прощения за мое немногословие в комментариях в скрипте, я накидал его "на коленке".

<?php


$dir = '/path/to/dir/that/is/need/to/be/calculated';
$result = [];

initialize();
calculation($dir);
print_results();

function initialize() {
  global $result;
  foreach (associations() as $type => $assoc) {
    foreach ($assoc as $ext) {
      $result[$type][$ext] = 0;
    }
  }
}

function calculation($dir) {
  foreach (scandir($dir) as $filename) {
    $file = $dir . '/' . $filename;
    // Recursive processing directories.
    if (is_dir($file)) {
      // Exclude current and parent directory.
      if (!in_array($filename, ['.', '..'], TRUE)) {
        calculation($file);
      }
    }
    // Fix for Windows.
    elseif ($filename != 'desktop.ini') {
      counting($file, $filename);
    }
  }
}

function associations() {
  return [
    'Text' => ['txt', 'csv', 'md'],
    'PHP' => ['php'],
    'JavaScript' => ['js', 'coffee'],
    'CSS' => ['css', 'sass', 'scss', 'less'],
    'Images' => ['jpg', 'jpeg', 'gif', 'png', 'ico', 'icon'],
  ];
}

function get_type($filename) {
  $ext = get_extension($filename);
  $type = NULL;
  foreach (associations() as $assoc => $ext_list) {
    if (in_array($ext, $ext_list)) {
      $type = $assoc;
      break;
    }
  }

  return [
    'type' => $type ?: 'Other',
    'ext' => $ext,
  ];
}

function get_extension($filename) {
  if (strpos($filename, '.') !== FALSE) {
    $ext_parts = explode('.', $filename);
    $ext = end($ext_parts);
  }
  else {
    $ext = $filename;
  }
  return strtolower($ext);
}

function counting($file, $filename) {
  global $result;
  $assoc = get_type($filename);
  $type = $assoc['type'];
  $ext = $assoc['ext'];
  if (isset($result[$type])) {
    $result[$type][$ext] += count(file($file));
  }
  else {
    $result['Other'][$ext] = count(file($file));
  }
}

function count_by_type() {
  global $result;
  $count_by_type = [
    'total' => 0,
  ];
  foreach ($result as $type => $sizes) {
    $count_by_type[$type] = 0;
    foreach (array_filter($sizes) as $ext => $size) {
      $count_by_type[$type] += $size;
      $count_by_type['total'] += $size;
    }
  }
  return $count_by_type;
}

function print_results() {
  global $result;
  $count_by_type = count_by_type();

  print 'Total: ' . $count_by_type['total'];
  print '<ul>';
  foreach ($result as $type => $sizes) {
    print '<li>' . $type . ' - ' . $count_by_type[$type] . '<ul>';
    foreach (array_filter($sizes) as $ext => $size) {
      print '<li>' . $ext . ' - ' . $size;
    }
    print '</ul></li>';
  }
  print '</ul>';
}

Как это работает

Предположим у вас уже есть рабочий php-сервер. Например, Denwer или Open Server.

  1. Берем весь код из блока выше
  2. Помещаем его в отдельный файл. Например, index.php
  3. Вписываем полный путь до папки, в которой лежат файлы для подсчета, в переменную $dir, в начале скрипта.
  4. Пишем свой маппинг в функции associations, где ключ - это человеко-понятный заголовок группы, а значение - это массив расширений, которые должны входит в эту группу. Можно оставить пустым ( return array(); ), тогда будет выведен список расширений и общее количество строк в них.
  5. Запускаем файл index.php в браузере и любуемся.

P.S.
В консоли тоже должно работать

cd path/to/dir/with/index-file
php index.php

Результат

Возьмем любой проект с гихаба. Например, bootstrap-datepicker и положим его в папку datepicker. Пишу путь до папки datepicker, который у меня такой:

<?php
$dir = 'D:\Servers\PHP\domains\datepicker';

Запускаем скрипт и смотрим результат

Total: 19401

  Text - 499
    txt - 1
    md - 498
  PHP - 
  JavaScript - 11893
    js - 11893
  CSS - 3420
    css - 2656
    less - 764
  Images - 1027
    png - 1027
  Other - 2562
    editorconfig - 11
    gitignore - 10
    yml - 9
    license - 202
    json - 99
    map - 4
    makefile - 153
    html - 442
    py - 249
    rst - 1119
    bat - 190
    jshintrc - 33
    jscsrc - 22
    csslintrc - 19

Другие посты