<?php


    /**
     * Tturns a date string into a human readable string on the specified
     * language. Only works for spanish, basque and english.
     * 
     * @param string $str_date Date string ('yyyy-mm-dd' or 'yyyy-mm-dd HH:MM:SS')
     * @param string $time Append the time at the end.
     * @return string Formatted date string.
     */
    function format_date($str_date, $lang, $time = true){
        $date = strtotime($str_date);
        $year = date("o", $date);
        $month = date("n", $date);
        $month --;
        $day = date("j", $date);
        $wday = date("N", $date);
        $wday --;
        $hour = date("H", $date);
        $minute = date("i", $date);
        $week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
        $months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
        if ($time){
            $str = "$week[$wday], $months[$month] $day, $year at $hour:$minute";
        }
        else{
            $str = "$week[$wday], $months[$month] $day, $year";
        }
        return $str;
    }

    /**
     * This function closes all the opened HTML tags in a given string.
     * 
     * @param string html The string with HTML tags.
     * @return string HTML with closed tags.
     */
    function close_tags($html) {
        $result = [];
        preg_match_all("#<(?!meta|img|br|hr|input\b)\b([a-z]+)(?: .*)?(?<![/|/ ])>#iU", $html, $result);
        $openedtags = $result[1];
        preg_match_all("#</([a-z]+)>#iU", $html, $result);
        $closedtags = $result[1];
        $len_opened = count($openedtags);
        if (count($closedtags) == $len_opened) {
            return $html;
        }
        $openedtags = array_reverse($openedtags);
        for ($i=0; $i < $len_opened; $i++) {
            if (!in_array($openedtags[$i], $closedtags)) {
                $html .= "</".$openedtags[$i].">";
            } else {
                unset($closedtags[array_search($openedtags[$i], $closedtags)]);
            }
        }
        return $html;
    }

    /**
     * Text shortener. Given a string, it trims in the proximity of the
     * desired string, up to the next white character. If indicated, it will
     * append a link to the full text.
     * 
     * @param string $text The text to shorten.
     * @param int $length The desired length.
     * @param string $link_text Text for the link. Optional.
     * @param string $link URI of the link.
     * @return string Shortened text.
     */
     function cut_text($text, $length, $link_text = "", $link = ""){
        if (strlen($text) < $length){
            return $text;
        }
        $cut = substr($text, 0, strpos($text, " ", $length));
        $cut = close_tags($cut);
        if (strlen($cut) == 0){
            $cut = $text;
        }
        if (strlen($text) != strlen($cut) && strlen($link) > 0 && strlen($link_text) > 0){
            $cut = $cut . "... <a href='$link'>$link_text</a>";
        }
        return $cut;
    }

?>

