Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/croogo/croogo/Core/src/Utility/StringConverter.php
<?php

namespace Croogo\Core\Utility;

/**
 * StringConverter
 *
 * @package  Croogo.Croogo.Lib.Utility
 * @license  http://www.opensource.org/licenses/mit-license.php The MIT License
 * @link     http://www.croogo.org
 */
class StringConverter
{

   
/**
     * Parses bb-code like string.
     *
     * Example: string containing [menu:main option1="value"] will return an array like
     *
     * Array
     * (
     *     [main] => Array
     *         (
     *             [option1] => value
     *         )
     * )
     *
     * @param string $exp
     * @param string $text
     * @param array  $options
     * @return array
     */
   
public function parseString($exp, $text, $options = [])
    {
       
$_options = [
           
'convertOptionsToArray' => false,
        ];
       
$options = array_merge($_options, $options);

       
$output = [];
       
preg_match_all('/\[(' . $exp . '):([A-Za-z0-9_\-]*)(.*?)\]/i', $text, $tagMatches);
        for (
$i = 0, $ii = count($tagMatches[1]); $i < $ii; $i++) {
           
$regex = '/(\S+)=[\'"]?((?:.(?![\'"]?\s+(?:\S+)=|[>\'"]))+.)[\'"]?/i';
           
preg_match_all($regex, $tagMatches[3][$i], $attributes);
           
$alias = $tagMatches[2][$i];
           
$aliasOptions = [];
            for (
$j = 0, $jj = count($attributes[0]); $j < $jj; $j++) {
               
$aliasOptions[$attributes[1][$j]] = $attributes[2][$j];
            }
            if (
$options['convertOptionsToArray']) {
                foreach (
$aliasOptions as $optionKey => $optionValue) {
                    if (!
is_array($optionValue) && strpos($optionValue, ':') !== false) {
                       
$aliasOptions[$optionKey] = $this->stringToArray($optionValue);
                    }
                }
            }
           
$output[$alias] = $aliasOptions;
        }

        return
$output;
    }

   
/**
     * Converts formatted string to array
     *
     * A string formatted like 'Nodes.type:blog;' will be converted to
     * array('Nodes.type' => 'blog');
     *
     * @param string $string in this format: Nodes.type:blog;Nodes.user_id:1;
     * @return array
     */
   
public function stringToArray($string)
    {
       
$string = explode(';', $string);
       
$stringArr = [];
        foreach (
$string as $stringElement) {
            if (
$stringElement != null) {
               
$stringElementE = explode(':', $stringElement);
                if (isset(
$stringElementE['1'])) {
                   
$value = $stringElementE['1'];
                    if (
strpos($value, ',') !== false) {
                       
$value = explode(',', $value);
                       
$stringArr[$stringElementE['0'] . ' IN'] = $value;
                    } else {
                       
$stringArr[$stringElementE['0']] = $value;
                    }
                } else {
                   
$stringArr[] = $stringElement;
                }
            }
        }

        return
$stringArr;
    }

   
/**
     * Converts strings like controller:abc/action:xyz/ to arrays
     *
     * Options:
     * - `useCache`: Whether or not use cache results. Default is `true`
     *
     * @param string|array $link link
     * @param array $options Options array
     * @return array
     */
   
public function linkStringToArray($link, $options = [])
    {
        static
$cached = [];
       
$options = array_merge([
           
'useCache' => true,
        ],
$options);
       
$useCache = $options['useCache'];

       
$hash = md5($link);
        if (isset(
$cached[$hash])) {
            return
$cached[$hash];
        }

        if (
is_array($link)) {
           
$link = key($link);
        }
        if ((
$pos = strpos($link, '?')) !== false) {
           
parse_str(substr($link, $pos + 1), $query);
           
$link = substr($link, 0, $pos);
        }
       
$link = explode('/', $link);
       
$linkArr = [];
        foreach (
$link as $linkElement) {
            if (
$linkElement != null) {
               
$linkElementE = explode(':', $linkElement);
                if (isset(
$linkElementE['1'])) {
                    if (
in_array($linkElementE['1'], ['true', 'false'])) {
                       
$linkArr[$linkElementE['0']] = ($linkElementE['0'] === 'true') ? true : false;
                    } else {
                       
$linkArr[$linkElementE['0']] = urldecode($linkElementE['1']);
                    }
                } else {
                   
$linkArr[] = $linkElement;
                   
$pass[] = $linkElement;
                }
            }
        }
        if (!isset(
$linkArr['prefix'])) {
           
$linkArr['prefix'] = false;
        }
        if (!isset(
$linkArr['plugin'])) {
           
$linkArr['plugin'] = false;
        }

        if (isset(
$query)) {
           
$linkArr['?'] = $query;
        }

       
$cached[$hash] = $linkArr;

        return
$linkArr;
    }

   
/**
     * Converts array into string controller:abc/action:xyz/value1/value2?foo=bar
     *
     * @param array $url link
     * @return array
     */
   
public function urlToLinkString($url)
    {
       
$result = [];
       
$actions = array_merge(
            [
           
'prefix' => false, 'plugin' => false,
           
'controller' => false, 'action' => false
           
],
           
$url
       
);
       
$queryString = null;
        foreach (
$actions as $key => $val) {
            if (
is_string($key)) {
                if (
is_bool($val)) {
                    if (
$val === true) {
                       
$result[] = $key;
                    }
                } elseif (
$key == '?') {
                   
$queryString = '?' . http_build_query($val);
                } else {
                    if (
is_string($val)) {
                       
$result[] = $key . ':' . urlencode($val);
                    }
                }
            } else {
               
$result[] = $val;
            }
        }

        return
join('/', $result) . $queryString;
    }

   
/**
     * Extract the first paragraph from $text
     *
     * Options:
     *
     * - `tag` Wrap the returned value with a <p> tag. Default is `true`
     * - `regex` Regex expression to determine a paragraph
     * - `stripTags Strip all tags within the paragraph. Default is `true`
     * - `newline` Determine paragraph based on newlines instead of html <p> tag.
     *    Default is false
     *
     * @param string $text Html text
     * @param array $options Options
     * @return string
     */
   
public function firstPara($text, $options = [])
    {
       
$paragraph = null;
       
$options = array_merge([
           
'tag' => false,
           
'regex' => '#<p[^>]*>(.*)</p>#isU',
           
'stripTags' => true,
           
'newline' => false,
        ],
$options);

        if (
$options['regex']) {
           
preg_match($options['regex'], $text, $matches);
            if (isset(
$matches[1])) {
               
$paragraph = $matches[1];
            }
        }

        if (empty(
$paragraph) && $options['newline']) {
           
$paragraphs = preg_split('/\r\n|\r|\n/', $text);
           
$paragraph = empty($paragraphs[0]) ? null : $paragraphs[0];
        }

        if (
$paragraph) {
            if (
$options['stripTags']) {
               
$paragraph = strip_tags($paragraph);
            }
            if (
$options['tag']) {
               
$paragraph = '<p>' . $paragraph . '</p>';
            }
        }

        return
$paragraph;
    }
}