xref: /template/strap/ComboStrap/PipelineUtility.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
137748cd8SNickeau<?php
237748cd8SNickeau/**
337748cd8SNickeau * Copyright (c) 2020. ComboStrap, Inc. and its affiliates. All Rights Reserved.
437748cd8SNickeau *
537748cd8SNickeau * This source code is licensed under the GPL license found in the
637748cd8SNickeau * COPYING  file in the root directory of this source tree.
737748cd8SNickeau *
837748cd8SNickeau * @license  GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html)
937748cd8SNickeau * @author   ComboStrap <support@combostrap.com>
1037748cd8SNickeau *
1137748cd8SNickeau */
1237748cd8SNickeau
1337748cd8SNickeaunamespace ComboStrap;
1437748cd8SNickeau
1537748cd8SNickeau/**
1637748cd8SNickeau * Class PipelineUtility
1737748cd8SNickeau * @package ComboStrap
1837748cd8SNickeau * A pipeline to perform filter transformation
1937748cd8SNickeau *
2037748cd8SNickeau * See also
2137748cd8SNickeau * https://getbootstrap.com/docs/5.0/helpers/text-truncation/
2237748cd8SNickeau */
2337748cd8SNickeauclass PipelineUtility
2437748cd8SNickeau{
2537748cd8SNickeau
2637748cd8SNickeau    /**
2737748cd8SNickeau     * @param $input
2837748cd8SNickeau     * @return string
2937748cd8SNickeau     */
3037748cd8SNickeau    static public function execute($input)
3137748cd8SNickeau    {
3237748cd8SNickeau
3337748cd8SNickeau        /**
3437748cd8SNickeau         * Get the value
3537748cd8SNickeau         */
3637748cd8SNickeau        $firstQuoteChar = strpos($input, '"');
3737748cd8SNickeau        $input = substr($input, $firstQuoteChar + 1);
3837748cd8SNickeau        $secondQuoteChar = strpos($input, '"');
3937748cd8SNickeau        $value = substr($input, 0, $secondQuoteChar);
4037748cd8SNickeau        $input = substr($input, $secondQuoteChar + 1);
4137748cd8SNickeau
4237748cd8SNickeau        /**
4337748cd8SNickeau         * Go to the first | and delete it from the input
4437748cd8SNickeau         */
4537748cd8SNickeau        $pipeChar = strpos($input, '|');
4637748cd8SNickeau        $input = substr($input, $pipeChar + 1);
4737748cd8SNickeau
4837748cd8SNickeau        /**
4937748cd8SNickeau         * Get the command and applies them
5037748cd8SNickeau         */
5137748cd8SNickeau        $commands = preg_split("/\|/", $input);
5237748cd8SNickeau        foreach ($commands as $command) {
5337748cd8SNickeau            $command = trim($command, " )");
5437748cd8SNickeau            $leftParenthesis = strpos($command, "(");
5537748cd8SNickeau            $commandName = substr($command, 0, $leftParenthesis);
5637748cd8SNickeau            $signature = substr($command, $leftParenthesis + 1);
5737748cd8SNickeau            $commandArgs = preg_split("/,/", $signature);
5837748cd8SNickeau            $commandArgs = array_map(
5937748cd8SNickeau                'trim',
6037748cd8SNickeau                $commandArgs,
6137748cd8SNickeau                array_fill(0, sizeof($commandArgs), "\"")
6237748cd8SNickeau            );
6337748cd8SNickeau            $commandName = trim($commandName);
6437748cd8SNickeau            if (!empty($commandName)) {
6537748cd8SNickeau                switch ($commandName) {
6637748cd8SNickeau                    case "replace":
6737748cd8SNickeau                        $value = self::replace($commandArgs, $value);
6837748cd8SNickeau                        break;
6937748cd8SNickeau                    case "head":
7037748cd8SNickeau                        $value = self::head($commandArgs, $value);
7137748cd8SNickeau                        break;
7237748cd8SNickeau                    case "tail":
7337748cd8SNickeau                        $value = self::tail($commandArgs, $value);
7437748cd8SNickeau                        break;
7537748cd8SNickeau                    case "rconcat":
7637748cd8SNickeau                        $value = self::concat($commandArgs, $value, "right");
7737748cd8SNickeau                        break;
7837748cd8SNickeau                    case "lconcat":
7937748cd8SNickeau                        $value = self::concat($commandArgs, $value, "left");
8037748cd8SNickeau                        break;
8137748cd8SNickeau                    case "cut":
8237748cd8SNickeau                        $value = self::cut($commandArgs, $value);
8337748cd8SNickeau                        break;
8437748cd8SNickeau                    case "trim":
8537748cd8SNickeau                        $value = trim($value);
8637748cd8SNickeau                        break;
8737748cd8SNickeau                    case "capitalize":
8837748cd8SNickeau                        $value = ucwords($value);
8937748cd8SNickeau                        break;
9037748cd8SNickeau                    default:
9137748cd8SNickeau                        LogUtility::msg("command ($commandName) is unknown", LogUtility::LVL_MSG_ERROR, "pipeline");
9237748cd8SNickeau                }
9337748cd8SNickeau            }
9437748cd8SNickeau        }
9537748cd8SNickeau        return $value;
9637748cd8SNickeau    }
9737748cd8SNickeau
9837748cd8SNickeau    private static function replace(array $commandArgs, $value)
9937748cd8SNickeau    {
10037748cd8SNickeau        $search = $commandArgs[0];
10137748cd8SNickeau        $replace = $commandArgs[1];
10237748cd8SNickeau        return str_replace($search, $replace, $value);
10337748cd8SNickeau    }
10437748cd8SNickeau
10537748cd8SNickeau    /**
10637748cd8SNickeau     * @param array $commandArgs
10737748cd8SNickeau     * @param $value
10837748cd8SNickeau     * @return false|string
10937748cd8SNickeau     * See also: https://getbootstrap.com/docs/5.0/helpers/text-truncation/
11037748cd8SNickeau     */
11137748cd8SNickeau    private static function head(array $commandArgs, $value)
11237748cd8SNickeau    {
11337748cd8SNickeau        $length = $commandArgs[0];
114*4cadd4f8SNickeau        if (strlen($value) < $length) {
115*4cadd4f8SNickeau            return $value;
116*4cadd4f8SNickeau        }
117*4cadd4f8SNickeau        $headValue = substr($value, 0, $length);
118*4cadd4f8SNickeau        $tail = $commandArgs[1];
119*4cadd4f8SNickeau        if ($tail !== null) {
120*4cadd4f8SNickeau            $headValue .= $tail;
121*4cadd4f8SNickeau        }
122*4cadd4f8SNickeau        return $headValue;
12337748cd8SNickeau    }
12437748cd8SNickeau
12537748cd8SNickeau    private static function concat(array $commandArgs, $value, $side)
12637748cd8SNickeau    {
12737748cd8SNickeau        $string = $commandArgs[0];
12837748cd8SNickeau        switch ($side) {
12937748cd8SNickeau            case "left":
13037748cd8SNickeau                return $string . $value;
13137748cd8SNickeau            case "right":
13237748cd8SNickeau                return $value . $string;
13337748cd8SNickeau            default:
13437748cd8SNickeau                LogUtility::msg("The side value ($side) is unknown", LogUtility::LVL_MSG_ERROR, "pipeline");
13537748cd8SNickeau        }
13637748cd8SNickeau
13737748cd8SNickeau
13837748cd8SNickeau    }
13937748cd8SNickeau
14037748cd8SNickeau    private static function tail(array $commandArgs, $value)
14137748cd8SNickeau    {
14237748cd8SNickeau        $length = $commandArgs[0];
14337748cd8SNickeau        return substr($value, strlen($value) - $length);
14437748cd8SNickeau    }
14537748cd8SNickeau
14637748cd8SNickeau    private static function cut(array $commandArgs, $value)
14737748cd8SNickeau    {
14837748cd8SNickeau        $pattern = $commandArgs[0];
14937748cd8SNickeau        $words = preg_split("/$pattern/i", $value);
15037748cd8SNickeau        if ($words !== false) {
15137748cd8SNickeau            $selector = $commandArgs[1];
15237748cd8SNickeau            $startEndSelector = preg_split("/-/i", $selector);
15337748cd8SNickeau            $start = $startEndSelector[0] - 1;
15437748cd8SNickeau            $end = null;
15537748cd8SNickeau            if (isset($startEndSelector[1])) {
15637748cd8SNickeau                $end = $startEndSelector[1];
15737748cd8SNickeau                if (empty($end)) {
15837748cd8SNickeau                    $end = sizeof($words);
15937748cd8SNickeau                }
16037748cd8SNickeau                $end = $end - 1;
16137748cd8SNickeau            }
16237748cd8SNickeau            if ($end == null) {
16337748cd8SNickeau                if (isset($words[$start])) {
16437748cd8SNickeau                    return $words[$start];
16537748cd8SNickeau                } else {
16637748cd8SNickeau                    return $value;
16737748cd8SNickeau                }
16837748cd8SNickeau            } else {
16937748cd8SNickeau                $result = "";
17037748cd8SNickeau                for ($i = $start; $i <= $end; $i++) {
17137748cd8SNickeau                    if (isset($words[$i])) {
17237748cd8SNickeau                        if (!empty($result)) {
17337748cd8SNickeau                            $result .= $pattern;
17437748cd8SNickeau                        }
17537748cd8SNickeau                        $result .= $words[$i];
17637748cd8SNickeau                    }
17737748cd8SNickeau                }
17837748cd8SNickeau                return $result;
17937748cd8SNickeau            }
18037748cd8SNickeau
18137748cd8SNickeau        } else {
18237748cd8SNickeau            return "An error occurred: could not split with the pattern `$pattern`, the value `$value`.";
18337748cd8SNickeau        }
18437748cd8SNickeau    }
18537748cd8SNickeau
18637748cd8SNickeau}
187