Skip to content
Snippets Groups Projects
class.format.php 9.83 KiB
Newer Older
Jared Hancock's avatar
Jared Hancock committed
<?php
/*********************************************************************
    class.format.php

    Collection of helper function used for formatting
Jared Hancock's avatar
Jared Hancock committed

    Peter Rotich <peter@osticket.com>
    Copyright (c)  2006-2013 osTicket
Jared Hancock's avatar
Jared Hancock committed
    http://www.osticket.com

    Released under the GNU General Public License WITHOUT ANY WARRANTY.
    See LICENSE.TXT for details.

    vim: expandtab sw=4 ts=4 sts=4:
**********************************************************************/


class Format {


    function file_size($bytes) {
Jared Hancock's avatar
Jared Hancock committed
        if(!is_numeric($bytes))
            return $bytes;
        if($bytes<1024)
Jared Hancock's avatar
Jared Hancock committed
        if($bytes <102400)
            return round(($bytes/1024),1).' kb';

        return round(($bytes/1024000),1).' mb';
    }

    function file_name($filename) {
        return preg_replace('/\s+/', '_', $filename);
    /* encode text into desired encoding - taking into accout charset when available. */
    function encode($text, $charset=null, $encoding='utf-8') {

        //Try auto-detecting charset/encoding
        if(!$charset && function_exists('mb_detect_encoding'))
            $charset = mb_detect_encoding($text);

        // Cleanup - incorrect, bogus, or ambiguous charsets
        if($charset && in_array(strtolower(trim($charset)),
                array('default','x-user-defined','iso')))
        
        if (strcasecmp($charset, $encoding) === 0)
            return $text;
        if(function_exists('iconv') && $charset)
            $text = iconv($charset, $encoding.'//IGNORE', $text);
        elseif(function_exists('mb_convert_encoding') && $charset && $encoding)
            $text = mb_convert_encoding($text, $encoding, $charset);
        elseif(!strcasecmp($encoding, 'utf-8')) //forced blind utf8 encoding.
            $text = function_exists('imap_utf8')?imap_utf8($text):utf8_encode($text);
        // If $text is false, then we have a (likely) invalid charset, use
        // the original text and assume 8-bit (latin-1 / iso-8859-1)
        // encoding
        return (!$text && $original) ? $original : $text;
    }

    //Wrapper for utf-8 encoding.
    function utf8encode($text, $charset=null) {
        return Format::encode($text, $charset, 'utf-8');
    function mimedecode($text, $encoding='UTF-8') {

        if(function_exists('imap_mime_header_decode')
                && ($parts = imap_mime_header_decode($text))) {
            $str ='';
            foreach ($parts as $part)
                $str.= Format::encode($part->text, $part->charset, $encoding);

            $text = $str;
        } elseif(function_exists('iconv_mime_decode')) {
            $text = iconv_mime_decode($text, 0, $encoding);
        } elseif(!strcasecmp($encoding, 'utf-8') && function_exists('imap_utf8')) {
            $text = imap_utf8($text);
        }

        return $text;
    }

Jared Hancock's avatar
Jared Hancock committed
	function phone($phone) {

		$stripped= preg_replace("/[^0-9]/", "", $phone);
		if(strlen($stripped) == 7)
			return preg_replace("/([0-9]{3})([0-9]{4})/", "$1-$2",$stripped);
		elseif(strlen($stripped) == 10)
			return preg_replace("/([0-9]{3})([0-9]{3})([0-9]{4})/", "($1) $2-$3",$stripped);
		else
			return $phone;
	}

    function truncate($string,$len,$hard=false) {
Jared Hancock's avatar
Jared Hancock committed
        if(!$len || $len>strlen($string))
            return $string;
Jared Hancock's avatar
Jared Hancock committed
        $string = substr($string,0,$len);

        return $hard?$string:(substr($string,0,strrpos($string,' ')).' ...');
    }

    function strip_slashes($var) {
        return is_array($var)?array_map(array('Format','strip_slashes'),$var):stripslashes($var);
    }

    function wrap($text,$len=75) {
        return wordwrap($text,$len,"\n",true);
    }

    function html($html, $config=array('balance'=>1)) {
        require_once(INCLUDE_DIR.'htmLawed.php');
        return htmLawed($html, $config);
    }

    function safe_html($html) {
        $config = array(
                'safe' => 1, //Exclude applet, embed, iframe, object and script tags.
                'balance' => 1, //balance and close unclosed tags.
                'comment' => 1  //Remove html comments (OUTLOOK LOVE THEM)
                );

        return Format::html($html, $config);
    function sanitize($text, $striptags= true) {
        //balance and neutralize unsafe tags.
        $text = Format::safe_html($text);

        //If requested - strip tags with decoding disabled.
        return $striptags?Format::striptags($text, false):$text;
    }

Jared Hancock's avatar
Jared Hancock committed
    function htmlchars($var) {
        return Format::htmlencode($var);
    }

    function htmlencode($var) {
        $flags = ENT_COMPAT | ENT_QUOTES;
        if (phpversion() >= '5.4.0')
            $flags |= ENT_HTML401;
        return is_array($var)
            ? array_map(array('Format','htmlencode'), $var)
            : htmlentities($var, $flags, 'UTF-8');
    function htmldecode($var) {

        if(is_array($var))
            return array_map(array('Format','htmldecode'), $var);

        $flags = ENT_COMPAT;
        if (phpversion() >= '5.4.0')
            $flags |= ENT_HTML401;
        return html_entity_decode($var, $flags, 'UTF-8');
    }

Jared Hancock's avatar
Jared Hancock committed
    function input($var) {
Jared Hancock's avatar
Jared Hancock committed
    }

    //Format text for display..
    function display($text) {
        global $cfg;

Jared Hancock's avatar
Jared Hancock committed
        if($cfg && $cfg->clickableURLS() && $text)
            $text=Format::clickableurls($text);

        //Wrap long words...
        $text=preg_replace_callback('/\w{75,}/',
            create_function(
                '$matches',                                     # nolint
                'return wordwrap($matches[0],70,"\n",true);'),  # nolint
            $text);
Jared Hancock's avatar
Jared Hancock committed

        return nl2br($text);
    }

    function striptags($var, $decode=true) {

        if(is_array($var))
            return array_map(array('Format','striptags'), $var, array_fill(0, count($var), $decode));

        return strip_tags($decode?Format::htmldecode($var):$var);
    //make urls clickable. Mainly for display
Jared Hancock's avatar
Jared Hancock committed
    function clickableurls($text) {
        $token = $ost->getLinkToken();
        //Not perfect but it works - please help improve it.
        $text=preg_replace_callback('/(((f|ht){1}tp(s?):\/\/)[-a-zA-Z0-9@:%_\+.~#?&;\/\/=]+)/',
                create_function('$matches',
                    sprintf('return "<a href=\"l.php?url=".urlencode($matches[1])."&auth=%s\" target=\"_blank\">".$matches[1]."</a>";',
                        $token)),
                $text);

        $text=preg_replace_callback("/(^|[ \\n\\r\\t])(www\.([a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+)(\/[^\/ \\n\\r]*)*)/",
                create_function('$matches',
                    sprintf('return "<a href=\"l.php?url=".urlencode("http://".$matches[2])."&auth=%s\" target=\"_blank\">".$matches[2]."</a>";',
                        $token)),
                $text);

        $text=preg_replace("/(^|[ \\n\\r\\t])([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,4})/",
            '\\1<a href="mailto:\\2" target="_blank">\\2</a>', $text);
Jared Hancock's avatar
Jared Hancock committed

        return $text;
    }

    function stripEmptyLines ($string) {
        //return preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $string);
        //return preg_replace('/\s\s+/',"\n",$string); //Too strict??
        return preg_replace("/\n{3,}/", "\n\n", $string);
    }

Jared Hancock's avatar
Jared Hancock committed
    function linebreaks($string) {
        return urldecode(ereg_replace("%0D", " ", urlencode($string)));
    }


    /**
     * Thanks, http://us2.php.net/manual/en/function.implode.php
     * Implode an array with the key and value pair giving
     * a glue, a separator between pairs and the array
     * to implode.
     * @param string $glue The glue between key and value
     * @param string $separator Separator between pairs
     * @param array $array The array to implode
     * @return string The imploded array
    */
    function array_implode( $glue, $separator, $array ) {
Jared Hancock's avatar
Jared Hancock committed
        if ( !is_array( $array ) ) return $array;

        $string = array();
        foreach ( $array as $key => $val ) {
            if ( is_array( $val ) )
                $val = implode( ',', $val );
Jared Hancock's avatar
Jared Hancock committed
            $string[] = "{$key}{$glue}{$val}";
        }
Jared Hancock's avatar
Jared Hancock committed
        return implode( $separator, $string );
    }

    /* elapsed time */
Peter Rotich's avatar
Peter Rotich committed
    function elapsedTime($sec) {
Jared Hancock's avatar
Jared Hancock committed

        if(!$sec || !is_numeric($sec)) return "";

        $days = floor($sec / 86400);
        $hrs = floor(bcmod($sec,86400)/3600);
        $mins = round(bcmod(bcmod($sec,86400),3600)/60);
        if($days > 0) $tstring = $days . 'd,';
        if($hrs > 0) $tstring = $tstring . $hrs . 'h,';
        $tstring =$tstring . $mins . 'm';

        return $tstring;
    }
Jared Hancock's avatar
Jared Hancock committed
    /* Dates helpers...most of this crap will change once we move to PHP 5*/
    function db_date($time) {
        global $cfg;
Peter Rotich's avatar
Peter Rotich committed
        return Format::userdate($cfg->getDateFormat(), Misc::db2gmtime($time));
Jared Hancock's avatar
Jared Hancock committed
    }

    function db_datetime($time) {
        global $cfg;
Peter Rotich's avatar
Peter Rotich committed
        return Format::userdate($cfg->getDateTimeFormat(), Misc::db2gmtime($time));
Jared Hancock's avatar
Jared Hancock committed
    function db_daydatetime($time) {
        global $cfg;
Peter Rotich's avatar
Peter Rotich committed
        return Format::userdate($cfg->getDayDateTimeFormat(), Misc::db2gmtime($time));
Peter Rotich's avatar
Peter Rotich committed
    function userdate($format, $gmtime) {
        return Format::date($format, $gmtime, $_SESSION['TZ_OFFSET'], $_SESSION['TZ_DST']);
Peter Rotich's avatar
Peter Rotich committed
    function date($format, $gmtimestamp, $offset=0, $daylight=false){
Peter Rotich's avatar
Peter Rotich committed
        if(!$gmtimestamp || !is_numeric($gmtimestamp))
Peter Rotich's avatar
Peter Rotich committed
        $offset+=$daylight?date('I', $gmtimestamp):0; //Daylight savings crap.
Peter Rotich's avatar
Peter Rotich committed
        return date($format, ($gmtimestamp+ ($offset*3600)));
    }
    // Thanks, http://stackoverflow.com/a/2955878/1025836
    /* static */
    function slugify($text) {
        // replace non letter or digits by -
        $text = preg_replace('~[^\p{L}\p{N}]+~u', '-', $text);

        // trim
        $text = trim($text, '-');

        // lowercase
        $text = strtolower($text);

        return (empty($text)) ? 'n-a' : $text;
    }