<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

use think\exception\ClassNotFoundException;

// 应用公共文件

if (!function_exists('widget')) {
    /**
     * 渲染输出Widget
     * @param string    $name Widget名称
     * @param array     $data 传入的参数
     * @return mixed
     * milo 2019-05-08 从TP5.1代码中拿来修改的
     */
    function widget($name, $data = [])
    {
        return action($name, $data, 'widget');
    }
}
if (!function_exists('action')) {
    /**
     * 调用模块的操作方法 参数格式 [模块/控制器/]操作
     * @param string        $url 调用地址
     * @param string|array  $vars 调用参数 支持字符串和数组
     * @param string        $layer 要调用的控制层名称
     * @param bool          $appendSuffix 是否添加类名后缀
     * @return mixed
     * milo 2019-05-08 从TP5.1代码中拿来修改的
     */
    function action($url, $vars = [], $layer = 'controller', $appendSuffix = false)
    {
        $info   = pathinfo($url);
        $action = $info['basename'];
        $module = '.' != $info['dirname'] ? $info['dirname'] : request()->controller();
        $class  = controller($module, $layer);
        if (is_scalar($vars)) {
            if (strpos($vars, '=')) {
                parse_str($vars, $vars);
            } else {
                $vars = [$vars];
            }
        }
        return app()->invokeMethod([$class, $action . config('route.action_suffix')], $vars);
    }
}
if (!function_exists('controller')) {
    /**
     * 实例化(分层)控制器 格式:[模块名/]控制器名
     * @access public
     * @param  string $name              资源地址
     * @param  string $layer             控制层名称
     * @param  bool   $appendSuffix      是否添加类名后缀
     * @param  string $empty             空控制器名称
     * @return object
     * @throws ClassNotFoundException
     *
     * milo 2019-05-08 从TP5.1代码中拿来修改的
     */
    function controller($name, $layer = 'controller', $empty = '')
    {
        $class = parseClass($name, $layer);
        if (class_exists($class)) {
            return app()->make($class);
        } elseif ($empty && class_exists($emptyClass = app()->parseClass($layer, $empty))) {
            return app()->make($emptyClass);
        }

        throw new ClassNotFoundException('class not exists:' . $class, $class);
    }
}

if (!function_exists('parseClass')) {
    /**
     * 解析模块和类名
     * @access protected
     * @param  string $name         资源地址
     * @param  string $layer        验证层名称
     * @param  bool   $appendSuffix 是否添加类名后缀
     * @return array
     *
     * milo 2019-05-08 从TP5.1代码中拿来修改的
     */
    function parseClass($name, $layer)
    {
        if (false !== strpos($name, '\\')) {
            $class  = $name;
        } else {
            if (strpos($name, '/')) {
                $names = explode('/', $name, 2);
                $name = $names[1];
            }
            $class = app()->parseClass($layer,$name);
        }
        return $class;
    }
}


if (!function_exists('randomStr')) {
    /**
     * 获取随机字符串
     * @param int $type 0:数字(默认);1:全部;2:小写字母;3:大写字母;4:字母;
     * @param int $len 字符串长度
     * @return string
     */
    function randomStr($type = 0,$len = 5)
    {
        $strPol = "0123456789";
        if($type == 1) {
            $strPol = "ABCDEFGHIJKLMOPQRSTUVWYZ0123456789abcdefghijklmopqrstuvwyz";
        } elseif ($type == 2) {
            $strPol = "abcdefghijklmopqrstuvwyz";
        } elseif ($type == 3) {
            $strPol = "ABCDEFGHIJKLMOPQRSTUVWYZ";
        } elseif ($type == 4) {
            $strPol = "ABCDEFGHIJKLMOPQRSTUVWYZabcdefghijklmopqrstuvwyz";
        }
        $max = strlen($strPol) - 1;
        $str = '';
        for ($i=0;$i<$len;$i++) {
            $str .= $strPol[rand(0,$max)];
        }
        return $str;
    }
}

if(!function_exists('isMobile')){
    //判断访问终端是否为移动端
    function isMobile()
    {
        // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
        if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
            return true;
        }
        // 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
        if (isset($_SERVER['HTTP_VIA'])) {
            // 找不到为flase,否则为true
            return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
        }
        // 脑残法,判断手机发送的客户端标志,兼容性有待提高。其中'MicroMessenger'是电脑微信
        if (isset($_SERVER['HTTP_USER_AGENT'])) {
            $clientkeywords = ['nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile','MicroMessenger'];
            // 从HTTP_USER_AGENT中查找手机浏览器的关键字
            if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
                return true;
            }
        }
        // 协议法,因为有可能不准确,放到最后判断
        if (isset ($_SERVER['HTTP_ACCEPT'])) {
            // 如果只支持wml并且不支持html那一定是移动设备
            // 如果支持wml和html但是wml在html之前则是移动设备
            if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
                return true;
            }
        }
        return false;
    }
}
//根据栏目获取路径
if(!function_exists('getUri')){
    function getUri($cate, $lang = 'cn')
    {
        $url = '';
        if(!empty($cate)){
            if ($lang == 'en') {
                if($cate['is_index']){
                    $url = '/en';
                }elseif(!empty($cate['url'])){
                    $url = '/en'.$cate['url'];
                }else{
                    $url = url('/en/'.$cate['template'].'/index', ['category_id' => $cate['id']]);
                }
            } else {
                if($cate['is_index']){
                    $url = '/';
                }elseif(!empty($cate['url'])){
                    $url = $cate['url'];
                }else{
                    $url = url($cate['template'].'/index', ['category_id' => $cate['id']]);
                }
            }
        }
        return $url;
    }
}

//根据文件大小转换为文字
if(!function_exists('sizeToStr')){
    function sizeToStr($size)
    {
        if(!is_numeric($size) || $size <= 0){
            return '';
        }
        $size = $size / 1024;
        if($size < 1024){
            return sprintf("%.2fK", $size);
        }
        $size = $size / 1024;
        if($size < 1024){
            return sprintf("%.2fM", $size);
        }
        $size = $size / 1024;
        return sprintf("%.2fG", $size);
    }
}

//根据路径获取文件名
if(!function_exists('getKeyByPath')){
    function getKeyByPath($path)
    {
        return substr($path, strrpos($path, '/')+1);
    }
}

//富文本中提取图片路径
if(!function_exists('getImageUrlFromText')){
    function getImageUrlFromText($content)
    {
        preg_match_all('/<img.*?src="(.*?)".*?>/is', $content, $imgs);
        $data = [];
        if(!empty($imgs) && !empty($imgs[1])){
            foreach($imgs[1] as $img){
                if(substr($img, 0, 4) != 'http'){
                    $key = getKeyByPath($img);
                    $data[$key] = $img;
                }
            }
        }
        return $data;
    }
}

//富文本中提取视频路径
if(!function_exists('getVideoUrlFromText')){
    function getVideoUrlFromText($content)
    {
        preg_match_all('/<video.*?src="(.*?)".*?>/is', $content, $videos);
        $data = [];
        if(!empty($videos) && !empty($videos[1])){
            foreach($videos[1] as $video){
                if(substr($video, 0, 4) != 'http'){
                    $key = getKeyByPath($video);
                    $data[$key] = $video;
                }
            }
        }
        return $data;
    }
}

//获取目录下的所有文件
if(!function_exists('getAllFilesByPath')){
    function getAllFilesByPath($path, $rootPath)
    {
        if(is_dir($path) && file_exists($path)){
            $items = scandir($path);
            $files = [];
            foreach($items as $item){
                if(substr($item, 0, 1) != '.' && strpos($item, '_') == false){
                    $itemPath = $path . '/' . $item;
                    if(is_file($itemPath)){
                        $size = filesize($itemPath);
                        $files[$item] = [
                            'path' => str_replace($rootPath, '/', $itemPath),
                            'realPath' => $itemPath,
                            'size' => $size,
                            'sizeStr' => sizeToStr($size),
                            'suffix' => strtolower(substr($item, strrpos($item, '.')+1))    //后缀
                        ];
                    }elseif(is_dir($itemPath)){
                        $childFiles = getAllFilesByPath($itemPath, $rootPath);
                        if(!empty($childFiles)){
                            $files = array_merge($files, $childFiles);
                        }else{
                            rmdir($itemPath);
                        }
                    }
                }
            }
            return $files;
        }
        return [];
    }
}

//过滤get输入
if(!function_exists('getFilter')){
    function getFilter($value){
        $getFilter = "'|(and|or)\b.+?(>|<|=|in|like)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
        $forArray = false;
        if(is_array($value)){
            $forFilter = implode($value);
            $forArray = true;
        }else{
            $forFilter = $value;
        }
        if (preg_match("/".$getFilter."/is", $forFilter) == 1){
            $value = $forArray ? [] : '';
        }
        return filterExp($value);
    }
}

//过滤post录入
if(!function_exists($postFilter)){
    function postFilter($value){
        $postFilter = "\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
        $forArray = false;
        if(is_array($value)){
            $forFilter = implode($value);
            $forArray = true;
        }else{
            $forFilter = $value;
        }
        if (preg_match("/".$postFilter."/is", $forFilter) == 1){
            $value = $forArray ? [] : '';
        }
        return filterExp($value);
    }
}

//过滤cookie数据
if(!function_exists('cookieFilter')){
    function cookieFilter($value){
        $cookieFilter = "\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
        $forArray = false;
        if(is_array($value)){
            $forFilter = implode($value);
            $forArray = true;
        }else{
            $forFilter = $value;
        }
        if (preg_match("/".$cookieFilter."/is", $forFilter) == 1){
            $value = $forArray ? [] : '';
        }
        return filterExp($value);
    }
}

if(!function_exists('filterExp')){
    function filterExp($value){
        $filter = '/^EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT LIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN$/i';
        $forArray = false;
        if(is_array($value)){
            $forFilter = implode($value);
            $forArray = true;
        }else{
            $forFilter = $value;
        }
        if (preg_match($filter, $forFilter) == 1){
            $value = $forArray ? [] : '';
        }
        return $value;
    }
}
if(!function_exists('arrayHtmlFilter')){
    function arrayHtmlFilter($arr) {
        foreach ($arr as $k => $one) {
            if(is_array($one)) {
                $arr[$k] = arrayHtmlFilter($one);
            } else {
                $one = trim($one);
                $arr[$k] = strip_tags($one);
            }
        }
        return $arr;
    }
}

if(!function_exists('getImgSrc')) {
    function getImgSrc($item, $defaultImg)
    {
        $imgSrc = $defaultImg;
        if(!empty($item['src']) && file_exists('.'.$item['src'])) {
            $imgSrc = $item['src'];
        }
        return $imgSrc;
    }
}