You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
6.3 KiB
189 lines
6.3 KiB
2 years ago
|
<?php
|
||
|
|
||
|
/** @package verysimple::String */
|
||
|
|
||
|
require_once("util/html2text.php");
|
||
|
|
||
|
/**
|
||
|
* A set of utility functions for working with simple template files
|
||
|
*
|
||
|
* @package verysimple::String
|
||
|
* @author Jason Hinkle
|
||
|
* @copyright 1997-2011 VerySimple, Inc.
|
||
|
* @license http://www.gnu.org/licenses/lgpl.html LGPL
|
||
|
* @version 1.0
|
||
|
*/
|
||
|
class SimpleTemplate
|
||
|
{
|
||
|
/** @var used internally for merging. */
|
||
|
static $_MERGE_TEMPLATE_VALUES = null;
|
||
|
|
||
|
/**
|
||
|
* Transforms HTML into formatted plain text.
|
||
|
*
|
||
|
* @param
|
||
|
* string HTML
|
||
|
* @return string plain text
|
||
|
*/
|
||
|
static function HtmlToText($html)
|
||
|
{
|
||
|
return convert_html_to_text($html);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Transforms plain text into formatted HTML.
|
||
|
*
|
||
|
* @param
|
||
|
* string plain text
|
||
|
* @return string HTML
|
||
|
*/
|
||
|
static function TextToHtml($txt)
|
||
|
{
|
||
|
// Kills double spaces and spaces inside tags.
|
||
|
while (! (strpos($txt, ' ') === false)) {
|
||
|
$txt = str_replace(' ', ' ', $txt);
|
||
|
}
|
||
|
|
||
|
$txt = str_replace(' >', '>', $txt);
|
||
|
$txt = str_replace('< ', '<', $txt);
|
||
|
|
||
|
// Transforms accents in html entities.
|
||
|
$txt = htmlentities($txt);
|
||
|
|
||
|
// We need some HTML entities back!
|
||
|
$txt = str_replace('"', '"', $txt);
|
||
|
$txt = str_replace('<', '<', $txt);
|
||
|
$txt = str_replace('>', '>', $txt);
|
||
|
$txt = str_replace('&', '&', $txt);
|
||
|
|
||
|
// Ajdusts links - anything starting with HTTP opens in a new window
|
||
|
// $txt = str_ireplace("<a href=\"http://","<a rel=\"noopener\" target=\"_blank\" href=\"http://",$txt);
|
||
|
// $txt = str_ireplace("<a href=http://","<a rel=\"noopener\" target=\"_blank\" href=http://",$txt);
|
||
|
|
||
|
// Basic formatting
|
||
|
$eol = (strpos($txt, "\r") === false) ? "\n" : "\r\n";
|
||
|
$html = '<p>' . str_replace("$eol$eol", "</p><p>", $txt) . '</p>';
|
||
|
$html = str_replace("$eol", "<br />\n", $html);
|
||
|
$html = str_replace("</p>", "</p>\n\n", $html);
|
||
|
$html = str_replace("<p></p>", "<p> </p>", $html);
|
||
|
|
||
|
// Wipes <br /> after block tags (for when the user includes some html in the text).
|
||
|
$wipebr = array (
|
||
|
"table",
|
||
|
"tr",
|
||
|
"td",
|
||
|
"blockquote",
|
||
|
"ul",
|
||
|
"ol",
|
||
|
"li"
|
||
|
);
|
||
|
|
||
|
for ($x = 0; $x < count($wipebr); $x++) {
|
||
|
$tag = $wipebr [$x];
|
||
|
$html = str_ireplace("<$tag><br />", "<$tag>", $html);
|
||
|
$html = str_ireplace("</$tag><br />", "</$tag>", $html);
|
||
|
}
|
||
|
|
||
|
return $html;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Merges data into a template with placeholder variables
|
||
|
* (for example "Hello {{NAME}}").
|
||
|
* Useful for simple templating
|
||
|
* needs such as email, form letters, etc.
|
||
|
*
|
||
|
* If a placeholder is in the template but there is no matching value,
|
||
|
* then the placeholder will be left alone and will appear in the output.
|
||
|
*
|
||
|
* Note that there is no escape character so ensure the right and
|
||
|
* left delimiters do not appear as normal text within the template
|
||
|
*
|
||
|
* @param string $template
|
||
|
* string with placeholder variables
|
||
|
* @param
|
||
|
* mixed (array or object) $values an associative array or object with key/value pairs
|
||
|
* @param
|
||
|
* bool true to strip out placeholders with missing value, false to leave them as-is in the output (default true)
|
||
|
* @param
|
||
|
* string the left (opening) delimiter for placeholders. default = {{
|
||
|
* @param
|
||
|
* string the right (closing) delimiter for placeholders. default = }}
|
||
|
* @return string merged template
|
||
|
*/
|
||
|
static function Merge($template, $values, $stripMissingValues = true, $ldelim = "{{", $rdelim = "}}")
|
||
|
{
|
||
|
return $stripMissingValues ? self::MergeRegEx($template, $values, $ldelim, $rdelim) : self::MergeSimple($template, $values, $ldelim, $rdelim);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Used internally by Merge, or may be called directly.
|
||
|
* If a placeholder is in the template but there is no matching value,
|
||
|
* it will be left alone and appear in the template, for example: {{PLACEHOLDER}}.
|
||
|
*
|
||
|
* @param string $template
|
||
|
* string with placeholder variables
|
||
|
* @param
|
||
|
* mixed (array or object) $values an associative array or object with key/value pairs
|
||
|
* @param
|
||
|
* string the left (opening) delimiter for placeholders. default = {{
|
||
|
* @param
|
||
|
* string the right (closing) delimiter for placeholders. default = }}
|
||
|
* @return string merged template
|
||
|
*/
|
||
|
static function MergeSimple($template, $values, $ldelim = "{{", $rdelim = "}}")
|
||
|
{
|
||
|
$replacements = array ();
|
||
|
|
||
|
foreach ($values as $key => $val) {
|
||
|
$replacements [$ldelim . $key . $rdelim] = $val;
|
||
|
}
|
||
|
|
||
|
return strtr($template, $replacements);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Used internally by Merge, or may be called directly.
|
||
|
* If a placeholder is in the template but there is no matching value,
|
||
|
* it will be replaced with empty string and will NOT appear in the output.
|
||
|
*
|
||
|
* @param string $template
|
||
|
* string with placeholder variables
|
||
|
* @param
|
||
|
* mixed (array or object) $values an associative array or object with key/value pairs
|
||
|
* @param
|
||
|
* string the left (opening) delimiter for placeholders. default = {{
|
||
|
* @param
|
||
|
* string the right (closing) delimiter for placeholders. default = }}
|
||
|
* @return string merged template
|
||
|
*/
|
||
|
static function MergeRegEx($template, $values, $ldelim = "{{", $rdelim = "}}")
|
||
|
{
|
||
|
self::$_MERGE_TEMPLATE_VALUES = $values;
|
||
|
|
||
|
if ($ldelim != "{{" || $rdelim != "}}") {
|
||
|
throw new Exception("Custom delimiters are not yet implemented. Sorry!");
|
||
|
}
|
||
|
|
||
|
$results = preg_replace_callback('!\{\{(\w+)\}\}!', 'SimpleTemplate::_MergeRegExCallback', $template);
|
||
|
|
||
|
self::$_MERGE_TEMPLATE_VALUES = null;
|
||
|
|
||
|
return $results;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* called internally by preg_replace_callback
|
||
|
*
|
||
|
* @param array $matches
|
||
|
*/
|
||
|
static function _MergeRegExCallback($matches)
|
||
|
{
|
||
|
if (isset(self::$_MERGE_TEMPLATE_VALUES [$matches [1]])) {
|
||
|
return self::$_MERGE_TEMPLATE_VALUES [$matches [1]];
|
||
|
} else {
|
||
|
return "";
|
||
|
}
|
||
|
}
|
||
|
}
|