<commit_before><?php

/**
 * Tools object
 * 
 * Toolkit with most needed functions
 *
 * @author <NAME> <<EMAIL>>
 * @link http://inji.ru/
 * @copyright 2015 <NAME>
 * @license https://github.com/injitools/cms-Inji/blob/master/LICENSE
 */
class Tools extends Model
{
    static function randomString($length = 20, $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
    {
        $charactersLength = strlen($characters);
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, $charactersLength - 1)];
        }
        return $randomString;
    }

    static function uriParse($uri)
    {
        $answerPos = strpos($uri, '?');
        $params = array_slice(explode('/', substr($uri, 0, $answerPos ? $answerPos : strlen($uri) )), 1);

        foreach ($params as $key => $param) {
            if ($param != '') {
                $params[$key] = urldecode($param);
            } else {
                unset($params[$key]);
            }
        }
        return $params;
    }

    static function createDir($path)
    {
        if (file_exists($path))
            return true;

        $path = explode('/', $path);
        $cur = '';
        foreach ($path as $item) {
            $cur .= $item . '/';
            if (!file_exists($cur)) {
                mkdir($cur);
            }
        }
        return true;
    }

    static function resizeImage($img_path, $max_width = 1000, $max_height = 1000, $crop = false, $pos = 'center')
    {
        ini_set("gd.jpeg_ignore_warning", 1);
        list( $img_width, $img_height, $img_type, $img_tag ) = getimagesize($img_path);
        switch ($img_type) {
            case 1:
                $img_type = 'gif';
                break;
            case 3:
                $img_type = 'png';
                break;
            case 2:
            default:
                $img_type = 'jpeg';
                break;
        }
        $imagecreatefromX = "imagecreatefrom{$img_type}";
        $src_res = $imagecreatefromX($img_path);

        if ($img_width / $max_width > $img_height / $max_height)
            $separator = $img_width / $max_width;
        else
            $separator = $img_height / $max_height;

        if ($crop === true || $crop == 'q') {
            if ($img_width > $img_height) {
                $imgX = floor(( $img_width - $img_height ) / 2);
                $imgY = 0;
                $img_width = $img_height;
                $new_width = $max_width;
                $new_height = $max_height;
            } else {
                $imgX = 0;
                $imgY = floor(( $img_height - $img_width ) / 2);
                $img_height = $img_width;
                $new_width = $max_width;
                $new_height = $max_height;
            }
            if ($pos == 'top') {
                $imgY = 0;
            }
        } elseif ($crop == 'c') {
//Вычисляем некий коэффициент масштабирования
            $k1 = $img_width / $max_width;
            $k2 = $img_height / $max_height;
            $k = $k1 > $k2 ? $k2 : $k1;
            $ow = $img_width;
            $oh = $img_height;
//Вычисляем размеры области для нового изображения
            $img_width = intval($max_width * $k);
            $img_height = intval($max_height * $k);
            $new_width = $max_width;
            $new_height = $max_height;
//Находим начальные координаты (центрируем новое изображение)
            $imgX = (int) (($ow / 2) - ($img_width / 2) );
            if ($pos == 'center') {
                $imgY = (int) (($oh / 2) - ($img_height / 2));
            } else {
                $imgY = 0;
            }
        } else {
            $imgX = 0;
            $imgY = 0;
            $new_width = floor($img_width / $separator);
            $new_height = floor($img_height / $separator);
        }

        $new_res = imagecreatetruecolor($new_width, $new_height);
        imageAlphaBlending($new_res, false);
        imagesavealpha($new_res, true);
        imagecopyresampled($new_res, $src_res, 0, 0, $imgX, $imgY, $new_width, $new_height, $img_width, $img_height);

        if ($img_type == 'jpeg') {
            imageinterlace($new_res, 1); // чересстрочное формирование изображение
            imagejpeg($new_res, $img_path, 85);
        } else {
            $imageX = "image{$img_type}";
            $imageX($new_res, $img_path);
        }

        imagedestroy($new_res);
        imagedestroy($src_res);
        return $img_type;
    }

    static function sendMail($from, $to, $subject, $text, $charset = 'utf-8', $ctype = 'text/html')
    {
        $headers = "From: {$from}\r\n";
        $headers .= "Content-type: {$ctype}; charset={$charset}\r\n";
        $headers .= "Mime-Version: 1.0\r\n";
        return mail($to, $subject, $text, $headers);
    }

    static function redirect($href = '/', $text = false, $status = 'info')
    {

        if ($text !== false) {
            Msg::add($text, $status);
        }
        if (!headers_sent()) {
            header("Location: {$href}");
        } else {
            echo '\'"><script>window.location="' . $href . '";</script>';
        }
        exit("Перенаправление на: <a href = '{$href}'>{$href}</a>");
    }

    /**
     * Функция возвращает окончание для множественного числа слова на основании числа и массива окончаний
     * @param  $number Integer Число на основе которого нужно сформировать окончание
     * @param  $endingsArray  Array Массив слов или окончаний для чисел (1, 4, 5),
     *         например array('яблоко', 'яблока', 'яблок')
     * @return String
     */
    static function getNumEnding($number, $endingArray)
    {
        $number = $number % 100;
        if ($number >= 11 && $number <= 19) {
            $ending = $endingArray[2];
        } else {
            $i = $number % 10;
            switch ($i) {
                case (1): $ending = $endingArray[0];
                    break;
                case (2):
                case (3):
                case (4): $ending = $endingArray[1];
                    break;
                default: $ending = $endingArray[2];
            }
        }
        return $ending;
    }

    static function parsePath($path)
    {
        $path = str_replace('\\', '/', $path);
        $pathArray = explode('/', $path);
        $cleanPathArray = [];
        do {
            $changes = 0;
            foreach ($pathArray as $pathItem) {
                if (trim($pathItem) === '' || $pathItem == '.') {
                    $changes++;
                    continue;
                }
                if ($pathItem == '..') {
                    array_pop($cleanPathArray);
                    $changes++;
                    continue;
                }
                $cleanPathArray[] = $pathItem;
            }
            $pathArray = $cleanPathArray;
            $cleanPathArray = [];
        } while ($changes);
        return (strpos($path, '/') === 0 ? '/' : '') . implode('/', $pathArray);
    }

    static function toRusDate($date)
    {
        $yy = (int) substr($date, 0, 4);
        $mm = (int) substr($date, 5, 2);
        $dd = (int) substr($date, 8, 2);

        $hours = substr($date, 11, 5);

        $month = array('января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря');
        if (empty($month[$mm - 1])) {
            return 'Не указано';
        }
        return ($dd > 0 ? $dd . " " : '') . $month[$mm - 1] . " " . $yy . " " . $hours;
    }

    static function header($code, $exit = false)
    {
        switch ($code) {
            case '404':
                header('HTTP/1.1 404 Not Found');
                break;
            default :
                header($code);
        }
        if ($exit) {
            exit;
        }
    }

    static function pathsResolve($paths = [], $default = false)
    {
        foreach ($paths as $path) {
            if (file_exists($path)) {
                return $path;
            }
        }
        return $default;
    }

    static function toBytes($val)
    {
        $val = trim($val);
        $last = strtolower($val[strlen($val) - 1]);
        switch ($last) {
            case 'g':
                $val *= 1024;
            case 'm':
                $val *= 1024;
            case 'k':
                $val *= 1024;
        }

        return $val;
    }

    static function copyFiles($from, $to)
    {
        $from = rtrim($from, '/');
        $to = rtrim($to, '/');
        self::createDir($to);
        $files = scandir($from);
        foreach ($files as $file) {
            if (in_array($file, ['.', '..'])) {
                continue;
            }
            if (is_dir($from . '/' . $file)) {
                self::copyFiles($from . '/' . $file, $to . '/' . $file);
            } else {
                copy($from . '/' . $file, $to . '/' . $file);
            }
        }
    }

    static function translit($str)
    {
        $rus = array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');
        $lat = array('A', 'B', 'V', 'G', 'D', 'E', 'E', 'Gh', 'Z', 'I', 'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'C', 'Ch', 'Sh', 'Sch', 'Y', 'Y', 'Y', 'E', 'Yu', 'Ya', 'a', 'b', 'v', 'g', 'd', 'e', 'e', 'gh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'sch', 'y', 'y', 'y', 'e', 'yu', 'ya');
        return str_replace($rus, $lat, $str);
    }

    /**
     * get youtube video ID from URL
     *
     * @author http://stackoverflow.com/a/6556662
     * @param string $url
     * @return string Youtube video id or FALSE if none found. 
     */
    static function youtubeIdFromUrl($url)
    {
        $pattern = '%^# Match any youtube URL
        (?:https?://)?  # Optional scheme. Either http or https
        (?:www\.)?      # Optional www subdomain
        (?:             # Group host alternatives
          youtu\.be/    # Either youtu.be,
        | youtube\.com  # or youtube.com
          (?:           # Group path alternatives
            /embed/     # Either /embed/
          | /v/         # or /v/
          | /watch\?v=  # or /watch\?v=
          )             # End path alternatives.
        )               # End host alternatives.
        ([\w-]{10,12})  # Allow 10-12 for 11 char youtube id.
        $%x'
        ;
        $result = preg_match($pattern, $url, $matches);
        if (false !== $result) {
            return $matches[1];
        }
        return false;
    }

}
<commit_msg>redirect default reload page<commit_after><?php

/**
 * Tools object
 * 
 * Toolkit with most needed functions
 *
 * @author <NAME> <<EMAIL>>
 * @link http://inji.ru/
 * @copyright 2015 <NAME>
 * @license https://github.com/injitools/cms-Inji/blob/master/LICENSE
 */
class Tools extends Model
{
    static function randomString($length = 20, $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
    {
        $charactersLength = strlen($characters);
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, $charactersLength - 1)];
        }
        return $randomString;
    }

    static function uriParse($uri)
    {
        $answerPos = strpos($uri, '?');
        $params = array_slice(explode('/', substr($uri, 0, $answerPos ? $answerPos : strlen($uri) )), 1);

        foreach ($params as $key => $param) {
            if ($param != '') {
                $params[$key] = urldecode($param);
            } else {
                unset($params[$key]);
            }
        }
        return $params;
    }

    static function createDir($path)
    {
        if (file_exists($path))
            return true;

        $path = explode('/', $path);
        $cur = '';
        foreach ($path as $item) {
            $cur .= $item . '/';
            if (!file_exists($cur)) {
                mkdir($cur);
            }
        }
        return true;
    }

    static function resizeImage($img_path, $max_width = 1000, $max_height = 1000, $crop = false, $pos = 'center')
    {
        ini_set("gd.jpeg_ignore_warning", 1);
        list( $img_width, $img_height, $img_type, $img_tag ) = getimagesize($img_path);
        switch ($img_type) {
            case 1:
                $img_type = 'gif';
                break;
            case 3:
                $img_type = 'png';
                break;
            case 2:
            default:
                $img_type = 'jpeg';
                break;
        }
        $imagecreatefromX = "imagecreatefrom{$img_type}";
        $src_res = $imagecreatefromX($img_path);

        if ($img_width / $max_width > $img_height / $max_height)
            $separator = $img_width / $max_width;
        else
            $separator = $img_height / $max_height;

        if ($crop === true || $crop == 'q') {
            if ($img_width > $img_height) {
                $imgX = floor(( $img_width - $img_height ) / 2);
                $imgY = 0;
                $img_width = $img_height;
                $new_width = $max_width;
                $new_height = $max_height;
            } else {
                $imgX = 0;
                $imgY = floor(( $img_height - $img_width ) / 2);
                $img_height = $img_width;
                $new_width = $max_width;
                $new_height = $max_height;
            }
            if ($pos == 'top') {
                $imgY = 0;
            }
        } elseif ($crop == 'c') {
//Вычисляем некий коэффициент масштабирования
            $k1 = $img_width / $max_width;
            $k2 = $img_height / $max_height;
            $k = $k1 > $k2 ? $k2 : $k1;
            $ow = $img_width;
            $oh = $img_height;
//Вычисляем размеры области для нового изображения
            $img_width = intval($max_width * $k);
            $img_height = intval($max_height * $k);
            $new_width = $max_width;
            $new_height = $max_height;
//Находим начальные координаты (центрируем новое изображение)
            $imgX = (int) (($ow / 2) - ($img_width / 2) );
            if ($pos == 'center') {
                $imgY = (int) (($oh / 2) - ($img_height / 2));
            } else {
                $imgY = 0;
            }
        } else {
            $imgX = 0;
            $imgY = 0;
            $new_width = floor($img_width / $separator);
            $new_height = floor($img_height / $separator);
        }

        $new_res = imagecreatetruecolor($new_width, $new_height);
        imageAlphaBlending($new_res, false);
        imagesavealpha($new_res, true);
        imagecopyresampled($new_res, $src_res, 0, 0, $imgX, $imgY, $new_width, $new_height, $img_width, $img_height);

        if ($img_type == 'jpeg') {
            imageinterlace($new_res, 1); // чересстрочное формирование изображение
            imagejpeg($new_res, $img_path, 85);
        } else {
            $imageX = "image{$img_type}";
            $imageX($new_res, $img_path);
        }

        imagedestroy($new_res);
        imagedestroy($src_res);
        return $img_type;
    }

    static function sendMail($from, $to, $subject, $text, $charset = 'utf-8', $ctype = 'text/html')
    {
        $headers = "From: {$from}\r\n";
        $headers .= "Content-type: {$ctype}; charset={$charset}\r\n";
        $headers .= "Mime-Version: 1.0\r\n";
        return mail($to, $subject, $text, $headers);
    }

    static function redirect($href = null, $text = false, $status = 'info')
    {
        if ($href === null) {
            $href = $_SERVER['REQUEST_URI'];
        }
        if ($text !== false) {
            Msg::add($text, $status);
        }
        if (!headers_sent()) {
            header("Location: {$href}");
        } else {
            echo '\'"><script>window.location="' . $href . '";</script>';
        }
        exit("Перенаправление на: <a href = '{$href}'>{$href}</a>");
    }

    /**
     * Функция возвращает окончание для множественного числа слова на основании числа и массива окончаний
     * @param  $number Integer Число на основе которого нужно сформировать окончание
     * @param  $endingsArray  Array Массив слов или окончаний для чисел (1, 4, 5),
     *         например array('яблоко', 'яблока', 'яблок')
     * @return String
     */
    static function getNumEnding($number, $endingArray)
    {
        $number = $number % 100;
        if ($number >= 11 && $number <= 19) {
            $ending = $endingArray[2];
        } else {
            $i = $number % 10;
            switch ($i) {
                case (1): $ending = $endingArray[0];
                    break;
                case (2):
                case (3):
                case (4): $ending = $endingArray[1];
                    break;
                default: $ending = $endingArray[2];
            }
        }
        return $ending;
    }

    static function parsePath($path)
    {
        $path = str_replace('\\', '/', $path);
        $pathArray = explode('/', $path);
        $cleanPathArray = [];
        do {
            $changes = 0;
            foreach ($pathArray as $pathItem) {
                if (trim($pathItem) === '' || $pathItem == '.') {
                    $changes++;
                    continue;
                }
                if ($pathItem == '..') {
                    array_pop($cleanPathArray);
                    $changes++;
                    continue;
                }
                $cleanPathArray[] = $pathItem;
            }
            $pathArray = $cleanPathArray;
            $cleanPathArray = [];
        } while ($changes);
        return (strpos($path, '/') === 0 ? '/' : '') . implode('/', $pathArray);
    }

    static function toRusDate($date)
    {
        $yy = (int) substr($date, 0, 4);
        $mm = (int) substr($date, 5, 2);
        $dd = (int) substr($date, 8, 2);

        $hours = substr($date, 11, 5);

        $month = array('января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря');
        if (empty($month[$mm - 1])) {
            return 'Не указано';
        }
        return ($dd > 0 ? $dd . " " : '') . $month[$mm - 1] . " " . $yy . " " . $hours;
    }

    static function header($code, $exit = false)
    {
        switch ($code) {
            case '404':
                header('HTTP/1.1 404 Not Found');
                break;
            default :
                header($code);
        }
        if ($exit) {
            exit;
        }
    }

    static function pathsResolve($paths = [], $default = false)
    {
        foreach ($paths as $path) {
            if (file_exists($path)) {
                return $path;
            }
        }
        return $default;
    }

    static function toBytes($val)
    {
        $val = trim($val);
        $last = strtolower($val[strlen($val) - 1]);
        switch ($last) {
            case 'g':
                $val *= 1024;
            case 'm':
                $val *= 1024;
            case 'k':
                $val *= 1024;
        }

        return $val;
    }

    static function copyFiles($from, $to)
    {
        $from = rtrim($from, '/');
        $to = rtrim($to, '/');
        self::createDir($to);
        $files = scandir($from);
        foreach ($files as $file) {
            if (in_array($file, ['.', '..'])) {
                continue;
            }
            if (is_dir($from . '/' . $file)) {
                self::copyFiles($from . '/' . $file, $to . '/' . $file);
            } else {
                copy($from . '/' . $file, $to . '/' . $file);
            }
        }
    }

    static function translit($str)
    {
        $rus = array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');
        $lat = array('A', 'B', 'V', 'G', 'D', 'E', 'E', 'Gh', 'Z', 'I', 'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'C', 'Ch', 'Sh', 'Sch', 'Y', 'Y', 'Y', 'E', 'Yu', 'Ya', 'a', 'b', 'v', 'g', 'd', 'e', 'e', 'gh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'sch', 'y', 'y', 'y', 'e', 'yu', 'ya');
        return str_replace($rus, $lat, $str);
    }

    /**
     * get youtube video ID from URL
     *
     * @author http://stackoverflow.com/a/6556662
     * @param string $url
     * @return string Youtube video id or FALSE if none found. 
     */
    static function youtubeIdFromUrl($url)
    {
        $pattern = '%^# Match any youtube URL
        (?:https?://)?  # Optional scheme. Either http or https
        (?:www\.)?      # Optional www subdomain
        (?:             # Group host alternatives
          youtu\.be/    # Either youtu.be,
        | youtube\.com  # or youtube.com
          (?:           # Group path alternatives
            /embed/     # Either /embed/
          | /v/         # or /v/
          | /watch\?v=  # or /watch\?v=
          )             # End path alternatives.
        )               # End host alternatives.
        ([\w-]{10,12})  # Allow 10-12 for 11 char youtube id.
        $%x'
        ;
        $result = preg_match($pattern, $url, $matches);
        if (false !== $result) {
            return $matches[1];
        }
        return false;
    }

}

{'fraction_non_alphanumeric': 0.18212408961003043, 'fraction_numerical': 0.012169263390799299, 'mean_word_length': 1.5708022277521034, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 33, 'https://': 2, 'lorem ipsum': 0, 'www.': 4, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 18, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4401785', 'n_tokens_mistral': 7478, 'n_tokens_neox': 7217, 'n_words': 1667}