joomla-platform / libraries / joomla / html / html / string.php

<?php
/**
 * @package     Joomla.Platform
 * @subpackage  HTML
 *
 * @copyright   Copyright (C) 2005 - 2011 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

defined('JPATH_PLATFORM') or die;

/**
 * HTML helper class for rendering manipulated strings.
 *
 * @package     Joomla.Platform
 * @subpackage  HTML
 * @since       11.1
 */
abstract class JHtmlString
{
    /**
     * Truncates text blocks over the specified character limit and closes
     * all open HTML tags. The behavior will not truncate an individual
     * word, it will find the first space that is within the limit and
     * truncate at that point. This method is UTF-8 safe.
     *
     * @static
     * @param   string  $text       The text to truncate.
     * @param   int     $length     The maximum length of the text.
     * @return  string  The truncated text.
     */
    public static function truncate($text, $length = 0)
    {
        // Truncate the item text if it is too long.
        if ($length > 0 && JString::strlen($text) > $length)
        {
            // Find the first space within the allowed length.
            $tmp = JString::substr($text, 0, $length);
            $offset = JString::strrpos($tmp, ' ');
            if(JString::strrpos($tmp, '<') > JString::strrpos($tmp, '>'))
            {
                $offset = JString::strrpos($tmp, '<');
            }
            $tmp = JString::substr($tmp, 0, $offset);

            // If we don't have 3 characters of room, go to the second space within the limit.
            if (JString::strlen($tmp) >= $length - 3) {
                $tmp = JString::substr($tmp, 0, JString::strrpos($tmp, ' '));
            }

            // Put all opened tags into an array
            preg_match_all ( "#<([a-z][a-z0-9]?)( .*)?(?!/)>#iU", $tmp, $result );
            $openedtags = $result[1];
            $openedtags = array_diff($openedtags, array("img", "hr", "br"));
            $openedtags = array_values($openedtags);

            // Put all closed tags into an array
            preg_match_all ( "#</([a-z]+)>#iU", $tmp, $result );
            $closedtags = $result[1];
            $len_opened = count ( $openedtags );
            // All tags are closed
            if( count ( $closedtags ) == $len_opened )
            {
                return $tmp.'...';
            }
            $openedtags = array_reverse ( $openedtags );
            // Close tags
            for( $i = 0; $i < $len_opened; $i++ )
            {
                if ( !in_array ( $openedtags[$i], $closedtags ) )
                {
                    $tmp .= "</" . $openedtags[$i] . ">";
                } else {
                    unset ( $closedtags[array_search ( $openedtags[$i], $closedtags)] );
                }
            }
            $text = $tmp.'...';
        }

        return $text;
    }

    /**
     * Abridges text strings over the specified character limit. The
     * behavior will insert an ellipsis into the text replacing a section
     * of variable size to ensure the string does not exceed the defined
     * maximum length. This method is UTF-8 safe.
     *
     *  eg. Transform "Really long title" to "Really...title"
     *
     * @static
     * @param   string  $text       The text to abridge.
     * @param   int     $length     The maximum length of the text.
     * @param   int     $intro      The maximum length of the intro text.
     * 
     * @return  string  The abridged text.
     */
    public static function abridge($text, $length = 50, $intro = 30)
    {
        // Abridge the item text if it is too long.
        if (JString::strlen($text) > $length) {
            // Determine the remaining text length.
            $remainder = $length - ($intro + 3);

            // Extract the beginning and ending text sections.
            $beg = JString::substr($text, 0, $intro);
            $end = JString::substr($text, JString::strlen($text)-$remainder);

            // Build the resulting string.
            $text = $beg.'...'.$end;
        }

        return $text;
    }
}
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.