.
/**
* @package CoreAPI
* @subpackage StringProcessingAPI
* @copyright Copyright (C) 2000 - 2002 Kenzaburo Ito - kenito@300baud.org
* @copyright Copyright (C) 2002 - 2013 MantisBT Team - mantisbt-dev@lists.sourceforge.net
* @link http://www.mantisbt.org
*/
/**
* requires bug_api
*/
require_once( 'bug_api.php' );
/**
* requires user_pref_api
*/
require_once( 'user_pref_api.php' );
$g_cache_html_valid_tags = '';
$g_cache_html_valid_tags_single_line = '';
/**
* Preserve spaces at beginning of lines.
* Lines must be separated by \n rather than
* @param string $p_string
* @return string
*/
function string_preserve_spaces_at_bol( $p_string ) {
$lines = explode( "\n", $p_string );
$line_count = count( $lines );
for( $i = 0;$i < $line_count;$i++ ) {
$count = 0;
$prefix = '';
$t_char = utf8_substr( $lines[$i], $count, 1 );
$spaces = 0;
while(( $t_char == ' ' ) || ( $t_char == "\t" ) ) {
if( $t_char == ' ' ) {
$spaces++;
} else {
$spaces += 4;
}
// 1 tab = 4 spaces, can be configurable.
$count++;
$t_char = utf8_substr( $lines[$i], $count, 1 );
}
for( $j = 0;$j < $spaces;$j++ ) {
$prefix .= ' ';
}
$lines[$i] = $prefix . utf8_substr( $lines[$i], $count );
}
return implode( "\n", $lines );
}
/**
* Prepare a string to be printed without being broken into multiple lines
* @param string $p_string
* @return string
*/
function string_no_break( $p_string ) {
if( strpos( $p_string, ' ' ) !== false ) {
return '' . $p_string . "";
} else {
return $p_string;
}
}
/**
* Similar to nl2br, but fixes up a problem where new lines are doubled between
* html pre tags.
* additionally, wrap the text an $p_wrap character intervals if the config is set
* @param string $p_string
* @param int $p_wrap
* @return string
*/
function string_nl2br( $p_string, $p_wrap = 100 ) {
$output = '';
$pieces = preg_split( '/(
]*>.*?<\/pre>)/is', $p_string, -1, PREG_SPLIT_DELIM_CAPTURE );
if( isset( $pieces[1] ) ) {
foreach( $pieces as $piece ) {
if( preg_match( '/(]*>.*?<\/pre>)/is', $piece ) ) {
$piece = preg_replace( "/
]*?>/", '', $piece );
# @@@ thraxisp - this may want to be replaced by html_entity_decode (or equivalent)
# if other encoded characters are a problem
$piece = preg_replace( '/ /', ' ', $piece );
if( ON == config_get( 'wrap_in_preformatted_text' ) ) {
$output .= preg_replace( '/([^\n]{' . $p_wrap . ',}?[\s]+)(?!<\/pre>)/', "$1\n", $piece );
} else {
$output .= $piece;
}
} else {
$output .= nl2br( $piece );
}
}
return $output;
} else {
return nl2br( $p_string );
}
}
/**
* Prepare a multiple line string for display to HTML
* @param string $p_string
* @return string
*/
function string_display( $p_string ) {
$t_data = event_signal( 'EVENT_DISPLAY_TEXT', $p_string, true );
return $t_data;
}
/**
* Prepare a single line string for display to HTML
* @param string $p_string
* @return string
*/
function string_display_line( $p_string ) {
$t_data = event_signal( 'EVENT_DISPLAY_TEXT', $p_string, false );
return $t_data;
}
/**
* Prepare a string for display to HTML and add href anchors for URLs, emails,
* bug references, and cvs references
* @param string $p_string
* @return string
*/
function string_display_links( $p_string ) {
$t_data = event_signal( 'EVENT_DISPLAY_FORMATTED', $p_string, true );
return $t_data;
}
/**
* Prepare a single line string for display to HTML and add href anchors for
* URLs, emails, bug references, and cvs references
* @param string $p_string
* @return string
*/
function string_display_line_links( $p_string ) {
$t_data = event_signal( 'EVENT_DISPLAY_FORMATTED', $p_string, false );
return $t_data;
}
/**
* Prepare a string for display in rss
* @param string
* @return string
*/
function string_rss_links( $p_string ) {
# rss can not start with which spaces will be replaced into by string_display().
$t_string = trim( $p_string );
$t_string = event_signal( 'EVENT_DISPLAY_RSS', $t_string );
# another escaping to escape the special characters created by the generated links
return string_html_specialchars( $t_string );
}
/**
* Prepare a string for plain text display in email
* @param string $p_string
* @return string
*/
function string_email( $p_string ) {
return string_strip_hrefs( $p_string );
}
/**
* Prepare a string for plain text display in email and add URLs for bug
* links and cvs links
* @param string
* @return string
*/
function string_email_links( $p_string ) {
return event_signal( 'EVENT_DISPLAY_EMAIL', $p_string );
}
# --------------------
# Process a string for display in a textarea box
/**
* @todo function documentation
* @param string
* @return string
*/
function string_textarea( $p_string ) {
return string_html_specialchars( $p_string );
}
/**
* Process a string for display in a text box
* @param string
* @return string
*/
function string_attribute( $p_string ) {
return string_html_specialchars( $p_string );
}
/**
* Process a string for inclusion in a URL as a GET parameter
* @param string $p_string
* @return string
*/
function string_url( $p_string ) {
return rawurlencode( $p_string );
}
/**
* validate the url as part of this site before continuing
* @param string $p_url
* @param bool $p_return_absolute
* @return string
*/
function string_sanitize_url( $p_url, $p_return_absolute = false ) {
$t_url = strip_tags( urldecode( $p_url ) );
$t_path = rtrim( config_get( 'path' ), '/' );
$t_short_path = rtrim( config_get( 'short_path' ), '/' );
$t_pattern = '(?:/*(?P