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