xref: /template/strap/ComboStrap/PipelineUtility.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
1*37748cd8SNickeau<?php
2*37748cd8SNickeau/**
3*37748cd8SNickeau * Copyright (c) 2020. ComboStrap, Inc. and its affiliates. All Rights Reserved.
4*37748cd8SNickeau *
5*37748cd8SNickeau * This source code is licensed under the GPL license found in the
6*37748cd8SNickeau * COPYING  file in the root directory of this source tree.
7*37748cd8SNickeau *
8*37748cd8SNickeau * @license  GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html)
9*37748cd8SNickeau * @author   ComboStrap <support@combostrap.com>
10*37748cd8SNickeau *
11*37748cd8SNickeau */
12*37748cd8SNickeau
13*37748cd8SNickeaunamespace ComboStrap;
14*37748cd8SNickeau
15*37748cd8SNickeau/**
16*37748cd8SNickeau * Class PipelineUtility
17*37748cd8SNickeau * @package ComboStrap
18*37748cd8SNickeau * A pipeline to perform filter transformation
19*37748cd8SNickeau *
20*37748cd8SNickeau * See also
21*37748cd8SNickeau * https://getbootstrap.com/docs/5.0/helpers/text-truncation/
22*37748cd8SNickeau */
23*37748cd8SNickeauclass PipelineUtility
24*37748cd8SNickeau{
25*37748cd8SNickeau
26*37748cd8SNickeau    /**
27*37748cd8SNickeau     * @param $input
28*37748cd8SNickeau     * @return string
29*37748cd8SNickeau     */
30*37748cd8SNickeau    static public function execute($input)
31*37748cd8SNickeau    {
32*37748cd8SNickeau
33*37748cd8SNickeau        /**
34*37748cd8SNickeau         * Get the value
35*37748cd8SNickeau         */
36*37748cd8SNickeau        $firstQuoteChar = strpos($input, '"');
37*37748cd8SNickeau        $input = substr($input, $firstQuoteChar + 1);
38*37748cd8SNickeau        $secondQuoteChar = strpos($input, '"');
39*37748cd8SNickeau        $value = substr($input, 0, $secondQuoteChar);
40*37748cd8SNickeau        $input = substr($input, $secondQuoteChar + 1);
41*37748cd8SNickeau
42*37748cd8SNickeau        /**
43*37748cd8SNickeau         * Go to the first | and delete it from the input
44*37748cd8SNickeau         */
45*37748cd8SNickeau        $pipeChar = strpos($input, '|');
46*37748cd8SNickeau        $input = substr($input, $pipeChar + 1);
47*37748cd8SNickeau
48*37748cd8SNickeau        /**
49*37748cd8SNickeau         * Get the command and applies them
50*37748cd8SNickeau         */
51*37748cd8SNickeau        $commands = preg_split("/\|/", $input);
52*37748cd8SNickeau        foreach ($commands as $command) {
53*37748cd8SNickeau            $command = trim($command, " )");
54*37748cd8SNickeau            $leftParenthesis = strpos($command, "(");
55*37748cd8SNickeau            $commandName = substr($command, 0, $leftParenthesis);
56*37748cd8SNickeau            $signature = substr($command, $leftParenthesis + 1);
57*37748cd8SNickeau            $commandArgs = preg_split("/,/", $signature);
58*37748cd8SNickeau            $commandArgs = array_map(
59*37748cd8SNickeau                'trim',
60*37748cd8SNickeau                $commandArgs,
61*37748cd8SNickeau                array_fill(0, sizeof($commandArgs), "\"")
62*37748cd8SNickeau            );
63*37748cd8SNickeau            $commandName = trim($commandName);
64*37748cd8SNickeau            if (!empty($commandName)) {
65*37748cd8SNickeau                switch ($commandName) {
66*37748cd8SNickeau                    case "replace":
67*37748cd8SNickeau                        $value = self::replace($commandArgs, $value);
68*37748cd8SNickeau                        break;
69*37748cd8SNickeau                    case "head":
70*37748cd8SNickeau                        $value = self::head($commandArgs, $value);
71*37748cd8SNickeau                        break;
72*37748cd8SNickeau                    case "tail":
73*37748cd8SNickeau                        $value = self::tail($commandArgs, $value);
74*37748cd8SNickeau                        break;
75*37748cd8SNickeau                    case "rconcat":
76*37748cd8SNickeau                        $value = self::concat($commandArgs, $value, "right");
77*37748cd8SNickeau                        break;
78*37748cd8SNickeau                    case "lconcat":
79*37748cd8SNickeau                        $value = self::concat($commandArgs, $value, "left");
80*37748cd8SNickeau                        break;
81*37748cd8SNickeau                    case "cut":
82*37748cd8SNickeau                        $value = self::cut($commandArgs, $value);
83*37748cd8SNickeau                        break;
84*37748cd8SNickeau                    case "trim":
85*37748cd8SNickeau                        $value = trim($value);
86*37748cd8SNickeau                        break;
87*37748cd8SNickeau                    case "capitalize":
88*37748cd8SNickeau                        $value=ucwords($value);
89*37748cd8SNickeau                        break;
90*37748cd8SNickeau                    default:
91*37748cd8SNickeau                        LogUtility::msg("command ($commandName) is unknown", LogUtility::LVL_MSG_ERROR, "pipeline");
92*37748cd8SNickeau                }
93*37748cd8SNickeau            }
94*37748cd8SNickeau        }
95*37748cd8SNickeau        return $value;
96*37748cd8SNickeau    }
97*37748cd8SNickeau
98*37748cd8SNickeau    private static function replace(array $commandArgs, $value)
99*37748cd8SNickeau    {
100*37748cd8SNickeau        $search = $commandArgs[0];
101*37748cd8SNickeau        $replace = $commandArgs[1];
102*37748cd8SNickeau        return str_replace($search, $replace, $value);
103*37748cd8SNickeau    }
104*37748cd8SNickeau
105*37748cd8SNickeau    /**
106*37748cd8SNickeau     * @param array $commandArgs
107*37748cd8SNickeau     * @param $value
108*37748cd8SNickeau     * @return false|string
109*37748cd8SNickeau     * See also: https://getbootstrap.com/docs/5.0/helpers/text-truncation/
110*37748cd8SNickeau     */
111*37748cd8SNickeau    private static function head(array $commandArgs, $value)
112*37748cd8SNickeau    {
113*37748cd8SNickeau        $length = $commandArgs[0];
114*37748cd8SNickeau        return substr($value, 0, $length);
115*37748cd8SNickeau    }
116*37748cd8SNickeau
117*37748cd8SNickeau    private static function concat(array $commandArgs, $value, $side)
118*37748cd8SNickeau    {
119*37748cd8SNickeau        $string = $commandArgs[0];
120*37748cd8SNickeau        switch ($side) {
121*37748cd8SNickeau            case "left":
122*37748cd8SNickeau                return $string . $value;
123*37748cd8SNickeau            case "right":
124*37748cd8SNickeau                return $value . $string;
125*37748cd8SNickeau            default:
126*37748cd8SNickeau                LogUtility::msg("The side value ($side) is unknown", LogUtility::LVL_MSG_ERROR, "pipeline");
127*37748cd8SNickeau        }
128*37748cd8SNickeau
129*37748cd8SNickeau
130*37748cd8SNickeau    }
131*37748cd8SNickeau
132*37748cd8SNickeau    private static function tail(array $commandArgs, $value)
133*37748cd8SNickeau    {
134*37748cd8SNickeau        $length = $commandArgs[0];
135*37748cd8SNickeau        return substr($value, strlen($value) - $length);
136*37748cd8SNickeau    }
137*37748cd8SNickeau
138*37748cd8SNickeau    private static function cut(array $commandArgs, $value)
139*37748cd8SNickeau    {
140*37748cd8SNickeau        $pattern = $commandArgs[0];
141*37748cd8SNickeau        $words = preg_split("/$pattern/i", $value);
142*37748cd8SNickeau        if ($words !== false) {
143*37748cd8SNickeau            $selector = $commandArgs[1];
144*37748cd8SNickeau            $startEndSelector = preg_split("/-/i", $selector);
145*37748cd8SNickeau            $start = $startEndSelector[0] - 1;
146*37748cd8SNickeau            $end = null;
147*37748cd8SNickeau            if (isset($startEndSelector[1])) {
148*37748cd8SNickeau                $end = $startEndSelector[1];
149*37748cd8SNickeau                if (empty($end)) {
150*37748cd8SNickeau                    $end = sizeof($words);
151*37748cd8SNickeau                }
152*37748cd8SNickeau                $end = $end - 1;
153*37748cd8SNickeau            }
154*37748cd8SNickeau            if ($end == null) {
155*37748cd8SNickeau                if (isset($words[$start])) {
156*37748cd8SNickeau                    return $words[$start];
157*37748cd8SNickeau                } else {
158*37748cd8SNickeau                    return $value;
159*37748cd8SNickeau                }
160*37748cd8SNickeau            } else {
161*37748cd8SNickeau                $result = "";
162*37748cd8SNickeau                for ($i = $start; $i <= $end; $i++) {
163*37748cd8SNickeau                    if (isset($words[$i])) {
164*37748cd8SNickeau                        if (!empty($result)) {
165*37748cd8SNickeau                            $result .= $pattern;
166*37748cd8SNickeau                        }
167*37748cd8SNickeau                        $result .= $words[$i];
168*37748cd8SNickeau                    }
169*37748cd8SNickeau                }
170*37748cd8SNickeau                return $result;
171*37748cd8SNickeau            }
172*37748cd8SNickeau
173*37748cd8SNickeau        } else {
174*37748cd8SNickeau            return "An error occurred: could not split with the pattern `$pattern`, the value `$value`.";
175*37748cd8SNickeau        }
176*37748cd8SNickeau    }
177*37748cd8SNickeau
178*37748cd8SNickeau}
179