<?php
// Zerolith string Library
// 1.0 - 01/2023

class zstr
{
	//Adapted from wordpress; takes the accent off foreign input
	function westernize($string, $locale = null)
	{
        if(!preg_match('/[\x80-\xff]/', $string)) { return $string; } //optimization

        $chars=
        [
			'ª'=>'a','º'=>'o','À'=>'A','Á'=>'A','Â'=>'A','Ã'=>'A','Ä'=>'A','Å'=>'A','Æ'=>'AE','Ç'=>'C','È'=>'E','É'=>'E','Ê'=>'E','Ë'=>'E','Ì'=>'I','Í'=>'I','Î'=>'I','Ï'=>'I','Ð'=>'D','Ñ'=>'N','Ò'=>'O','Ó'=>'O','Ô'=>'O','Õ'=>'O','Ö'=>'O','Ù'=>'U','Ú'=>'U','Û'=>'U','Ü'=>'U','Ý'=>'Y','Þ'=>'TH','ß'=>'s','à'=>'a','á'=>'a','â'=>'a','ã'=>'a','ä'=>'a','å'=>'a','æ'=>'ae','ç'=>'c','è'=>'e','é'=>'e','ê'=>'e','ë'=>'e','ì'=>'i','í'=>'i','î'=>'i','ï'=>'i','ð'=>'d','ñ'=>'n','ò'=>'o','ó'=>'o','ô'=>'o','õ'=>'o','ö'=>'o','ø'=>'o','ù'=>'u','ú'=>'u','û'=>'u','ü'=>'u','ý'=>'y','þ'=>'th','ÿ'=>'y','Ø'=>'O','Ā'=>'A','ā'=>'a','Ă'=>'A','ă'=>'a','Ą'=>'A','ą'=>'a','Ć'=>'C','ć'=>'c','Ĉ'=>'C','ĉ'=>'c','Ċ'=>'C','ċ'=>'c','Č'=>'C','č'=>'c','Ď'=>'D','ď'=>'d','Đ'=>'D','đ'=>'d','Ē'=>'E','ē'=>'e','Ĕ'=>'E','ĕ'=>'e','Ė'=>'E','ė'=>'e','Ę'=>'E','ę'=>'e','Ě'=>'E','ě'=>'e','Ĝ'=>'G','ĝ'=>'g','Ğ'=>'G','ğ'=>'g','Ġ'=>'G','ġ'=>'g','Ģ'=>'G','ģ'=>'g','Ĥ'=>'H','ĥ'=>'h','Ħ'=>'H','ħ'=>'h','Ĩ'=>'I','ĩ'=>'i','Ī'=>'I','ī'=>'i','Ĭ'=>'I','ĭ'=>'i','Į'=>'I','į'=>'i','İ'=>'I','ı'=>'i','Ĳ'=>'IJ','ĳ'=>'ij','Ĵ'=>'J','ĵ'=>'j','Ķ'=>'K','ķ'=>'k','ĸ'=>'k','Ĺ'=>'L','ĺ'=>'l','Ļ'=>'L','ļ'=>'l','Ľ'=>'L','ľ'=>'l','Ŀ'=>'L','ŀ'=>'l','Ł'=>'L','ł'=>'l','Ń'=>'N','ń'=>'n','Ņ'=>'N','ņ'=>'n','Ň'=>'N','ň'=>'n','ŉ'=>'n','Ŋ'=>'N','ŋ'=>'n','Ō'=>'O','ō'=>'o','Ŏ'=>'O','ŏ'=>'o','Ő'=>'O','ő'=>'o','Œ'=>'OE','œ'=>'oe','Ŕ'=>'R','ŕ'=>'r','Ŗ'=>'R','ŗ'=>'r','Ř'=>'R','ř'=>'r','Ś'=>'S','ś'=>'s','Ŝ'=>'S','ŝ'=>'s','Ş'=>'S','ş'=>'s','Š'=>'S','š'=>'s','Ţ'=>'T','ţ'=>'t','Ť'=>'T','ť'=>'t','Ŧ'=>'T','ŧ'=>'t','Ũ'=>'U','ũ'=>'u','Ū'=>'U','ū'=>'u','Ŭ'=>'U','ŭ'=>'u','Ů'=>'U','ů'=>'u','Ű'=>'U','ű'=>'u','Ų'=>'U','ų'=>'u','Ŵ'=>'W','ŵ'=>'w','Ŷ'=>'Y','ŷ'=>'y','Ÿ'=>'Y','Ź'=>'Z','ź'=>'z','Ż'=>'Z','ż'=>'z','Ž'=>'Z','ž'=>'z','ſ'=>'s','Ș'=>'S','ș'=>'s','Ț'=>'T','ț'=>'t','€'=>'E','£'=>'','Ơ'=>'O','ơ'=>'o','Ư'=>'U','ư'=>'u','Ầ'=>'A','ầ'=>'a','Ằ'=>'A','ằ'=>'a','Ề'=>'E','ề'=>'e','Ồ'=>'O','ồ'=>'o','Ờ'=>'O','ờ'=>'o','Ừ'=>'U','ừ'=>'u','Ỳ'=>'Y','ỳ'=>'y','Ả'=>'A','ả'=>'a','Ẩ'=>'A','ẩ'=>'a','Ẳ'=>'A','ẳ'=>'a','Ẻ'=>'E','ẻ'=>'e','Ể'=>'E','ể'=>'e','Ỉ'=>'I','ỉ'=>'i','Ỏ'=>'O','ỏ'=>'o','Ổ'=>'O','ổ'=>'o','Ở'=>'O','ở'=>'o','Ủ'=>'U','ủ'=>'u','Ử'=>'U','ử'=>'u','Ỷ'=>'Y','ỷ'=>'y','Ẫ'=>'A','ẫ'=>'a','Ẵ'=>'A','ẵ'=>'a','Ẽ'=>'E','ẽ'=>'e','Ễ'=>'E','ễ'=>'e','Ỗ'=>'O','ỗ'=>'o','Ỡ'=>'O','ỡ'=>'o','Ữ'=>'U','ữ'=>'u','Ỹ'=>'Y','ỹ'=>'y','Ấ'=>'A','ấ'=>'a','Ắ'=>'A','ắ'=>'a','Ế'=>'E','ế'=>'e','Ố'=>'O','ố'=>'o','Ớ'=>'O','ớ'=>'o','Ứ'=>'U','ứ'=>'u','Ạ'=>'A','ạ'=>'a','Ậ'=>'A','ậ'=>'a','Ặ'=>'A','ặ'=>'a','Ẹ'=>'E','ẹ'=>'e','Ệ'=>'E','ệ'=>'e','Ị'=>'I','ị'=>'i','Ọ'=>'O','ọ'=>'o','Ộ'=>'O','ộ'=>'o','Ợ'=>'O','ợ'=>'o','Ụ'=>'U','ụ'=>'u','Ự'=>'U','ự'=>'u','Ỵ'=>'Y','ỵ'=>'y','ɑ'=>'a','Ǖ'=>'U','ǖ'=>'u','Ǘ'=>'U','ǘ'=>'u','Ǎ'=>'A','ǎ'=>'a','Ǐ'=>'I','ǐ'=>'i','Ǒ'=>'O','ǒ'=>'o','Ǔ'=>'U','ǔ'=>'u','Ǚ'=>'U','ǚ'=>'u','Ǜ'=>'U','ǜ'=>'u',
        ];
		
	    // Used for locale-specific rules
	    if('de_DE' == $locale || 'de_DE_formal' == $locale || 'de_CH' == $locale || 'de_CH_informal' == $locale)
		{$chars['Ä']='Ae';$chars['ä']='ae';$chars['Ö']='Oe';$chars['ö']='oe';$chars['Ü']='Ue';$chars['ü']='ue';$chars['ß']='ss';}
		elseif('da_DK' === $locale)
		{$chars['Æ']='Ae';$chars['æ']='ae';$chars['Ø']='Oe';$chars['ø']='oe';$chars['Å']='Aa';$chars['å']='aa';}
		elseif('ca' === $locale) {$chars['l·l'] = 'll';}
		elseif('sr_RS' === $locale || 'bs_BA' === $locale) {$chars['Đ']='DJ';$chars['đ']='dj';}
		
	    return strtr($string, $chars);
	}
	
	//htmlentities but faster if you are unsure if a string contains HTML. Not fully safe yet.
	public static function sanitizeHTML($HTML, $shortHTML = false)
	{
		if(strpos($HTML, "<") === FALSE) { return $HTML; } //speed hack
		else { return htmlentities($HTML); }
	}
	
	//cut a string into ... after X characters
    public static function shorten($textString, $limit = 30, $dotdotdot = "...")
    {
        if(!is_string($textString)) { return $textString; }
        if($limit < 4) { return $textString; }
        if(strlen($textString) > $limit) { $textString = substr($textString,0,($limit - 3)) . $dotdotdot; }
        return $textString;
    }
    
    //because php's function apparently doesn't work 100% of the time..
	public static function rn2br($textString)  { return str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),"<br/>", $textString); }
	
	//we need a dramatically better method in the future, but it does work..
	public static function htmlToText($textString = "", $cropAtChr = 0)
	{
		$textString = nl2br($textString);
		$textString = str_replace("<br>", "+)(+", $textString); //use these characters to shield the result from strip_tags
		$textString = str_replace("</p>", "+)(++)(+", $textString);
		if($cropAtChr != 0){$textString = mb_strimwidth(strip_tags($textString), 0, $cropAtChr, "..."); }
		else { $textString = strip_tags($textString); }
		$textString = trim(str_replace("+)(+", "<br>", $textString), "<br>");
		$textString = str_replace("<br><br>", "<br>", $textString); //crappy hack
		$textString = trim($textString, "<br>"); //crappy hack
		$textString = trim($textString, "<br>"); //crappy hack
		return $textString;
	}
	
	//the opposite, but worse
	public static function textToHtml($textString){ return preg_replace('/\v+|\\\r\\\n/Ui','<br/>',$textString); }
	
	//strips everything to the right of a string, including the character itself. - needs testing
	function stripRightOf($inString, $clipAtString)
	{
		if(strpos($inString, $clipAtString) !== false ) { return substr($inString, 0, strpos($inString, $clipAtString)); }
		else { return $inString; }
	}
	
	//strips everything to the left of a string, including the character itself. - needs testing
	function stripLeftOf($inString, $clipAtString)
	{
		if(strpos($inString, $clipAtString) !== false ) { return substr($inString, -strpos($inString, $clipAtString)); }
		else { return $inString; }
	}
	
	//returns an array of text that is between the specified end and start tags. - needs testing
	function getBetweenTags($inString, $startTag, $endTag, $includeTags = false)
	{
	    $result = [];
		$chunks = explode($startTag, $inString);
	    foreach($chunks as $chunk)
		{
	        $pos = strpos($chunk, $endTag);
	        if($pos !== false)
			{
				if($includeTags) { $result[] = $startTag . substr($chunk, 0, $pos) . $endTag; }
				else { $result[] = substr($chunk, 0, $pos); }
			}
	    }
	    return $result;
	}
}
?>