Spritify::go()   A
last analyzed

Complexity

Conditions 4
Paths 8

Size

Total Lines 25
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 4
eloc 14
c 2
b 0
f 0
nc 8
nop 8
dl 0
loc 25
rs 9.7998

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
/** Created by Gorlum 08.01.2024 19:21 */
4
5
/** @noinspection PhpUnnecessaryCurlyVarSyntaxInspection */
6
7
namespace Tools;
8
9
use Exception;
10
use ImageFile;
11
12
define('INSIDE', true);
13
14
require_once __DIR__ . '/../../classes/debug.php';
15
require_once __DIR__ . '/Sprite.php';
16
17
class Spritify {
18
  /**
19
   * @param string|string[] $dirInArray  Input directory
20
   * @param string          $dirOut      Output directory
21
   * @param string          $outName     Name to use CSS/PNG file names and global CSS class
22
   * @param string          $cssPrefix   Prefix to CSS qualifier. Default '#'
23
   * @param string          $cssSuffix   Suffix to CSS qualifier. Default ''
24
   * @param int             $scaleToPx   Pixel size to scale largest side of sprite to for scale(). Default 0 - no scaling
25
   * @param string          $relativeUrl Url relative to root where PNG sprite will reside. Default: '/design/images/'
26
   * @param string          $layout      How images should be arranged in sprite. Default: Sprite::LAYOUT_SQUARE
27
   *
28
   * @return void
29
   *
30
   * @throws Exception
31
   * @see Sprite::LAYOUT_SQUARE and others Sprite::LAYOUT_XXX constants
32
   *
33
   */
34
  public static function go($dirInArray, $dirOut, $outName, $cssPrefix = '#', $cssSuffix = '', $scaleToPx = 0, $relativeUrl = '/design/images/', $layout = Sprite::LAYOUT_SQUARE) {
35
    if (!is_array($dirInArray)) {
36
      $dirInArray = [$dirInArray];
37
    }
38
39
    $images = [];
40
    foreach ($dirInArray as $dirIn) {
41
      print "Loading files from folder/filter `$dirIn` \n";
42
43
//    $images = self::propagateImagesScanDir($dirIn);
44
      $images = array_merge($images, self::propagateImagesGlob($dirIn));
0 ignored issues
show
Bug introduced by
It seems like self::propagateImagesGlob($dirIn) can also be of type false; however, parameter $arrays of array_merge() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

44
      $images = array_merge($images, /** @scrutinizer ignore-type */ self::propagateImagesGlob($dirIn));
Loading history...
45
    }
46
47
    print "Processing images to `$outName`\n";
48
    if (empty($images)) {
49
      print "No images found to process\n\n";
50
51
      return;
52
    }
53
54
    $sprite = new Sprite($images, $layout, $scaleToPx);
55
    $sprite->generate();
56
    $sprite->saveOutput($dirOut, $outName, [$cssPrefix, $cssSuffix, $outName, $relativeUrl,]);
57
58
    print "Folder/filter processed\n\n";
59
  }
60
61
  /**
62
   * Propagates array with image files from glob pattern (as in OS - with * and ?)
63
   *
64
   * @param string $dirIn
65
   *
66
   * @return ImageFile[]|false
67
   */
68
  protected static function propagateImagesGlob($dirIn) {
69
    if (($fullPathList = glob($dirIn, GLOB_BRACE)) === false) {
70
      print "Can't find directory `$dirIn`\n";
71
72
      return false;
73
    }
74
75
    /** @var ImageFile[] $images */
76
    $images = [];
77
    foreach ($fullPathList as $fullPath) {
78
      $fullPath = str_replace('\\', '/', realpath($fullPath));
79
      $images   = self::tryReadFile($fullPath, $images);
80
    }
81
82
    return $images;
83
  }
84
85
  /**
86
   * Propagates array with image files from folder
87
   *
88
   * @param string $dirIn
89
   *
90
   * @return ImageFile[]|false
91
   */
92
  protected static function propagateImagesScanDir($dirIn) {
93
    $dirRealPath = str_replace('\\', '/', realpath($dirIn ?: './'));
94
    if (!file_exists($dirRealPath) || !is_dir($dirRealPath)) {
95
      print "Can't find directory `$dirIn`\n";
96
97
      return false;
98
    }
99
100
    /** @var ImageFile[] $images */
101
    $images = [];
102
103
    foreach (scandir($dirRealPath) as $fileNameOnly) {
104
      if (in_array($fileNameOnly, ['.', '..',]) || is_dir($fullPath = "$dirRealPath/$fileNameOnly")) {
105
        continue;
106
      }
107
      $images = self::tryReadFile($fullPath, $images);
108
    }
109
110
    return $images;
111
  }
112
113
  /**
114
   * @param             $fullPath
115
   * @param ImageFile[] $images
116
   *
117
   * @return ImageFile[]
118
   */
119
  protected static function tryReadFile($fullPath, $images) {
120
    if ($image = ImageFile::read($fullPath)) {
121
      $images[] = $image;
122
      print "`$fullPath` read OK\n";
123
    } else {
124
      print "ERROR: Can't read file `$fullPath`\n";
125
    }
126
127
    return $images;
128
  }
129
130
}
131