2001-12-01 15:20:48 +00:00
< ? php
// $Id$
2003-09-30 17:01:34 +00:00
/**
* Build the alias / path array
*/
2003-10-03 14:10:05 +00:00
function drupal_get_path_map ( $action = " " ) {
2003-10-09 17:22:22 +00:00
static $cache ;
2003-09-30 17:01:34 +00:00
static $map ;
2003-10-03 14:10:05 +00:00
if ( $action == " rebuild " ) {
$map = NULL ;
2003-10-09 17:22:22 +00:00
$cache = 0 ;
2003-10-03 14:10:05 +00:00
}
2003-10-09 17:22:22 +00:00
if ( ! $cache ) {
2003-10-22 20:20:35 +00:00
$result = db_query ( " SELECT * FROM { url_alias} " );
2003-09-30 17:01:34 +00:00
while ( $data = db_fetch_object ( $result )) {
2003-10-01 05:18:03 +00:00
$map [ $data -> dst ] = $data -> src ;
2003-09-30 17:01:34 +00:00
}
2003-10-09 17:22:22 +00:00
$cache = 1 ;
2003-09-30 17:01:34 +00:00
}
return $map ;
}
2003-10-03 14:10:05 +00:00
function drupal_rebuild_path_map () {
drupal_get_path_map ( " rebuild " );
}
2001-12-01 15:20:48 +00:00
function error_handler ( $errno , $message , $filename , $line , $variables ) {
$types = array ( 1 => " error " , 2 => " warning " , 4 => " parse error " , 8 => " notice " , 16 => " core error " , 32 => " core warning " , 64 => " compile error " , 128 => " compile warning " , 256 => " user error " , 512 => " user warning " , 1024 => " user notice " );
$entry = $types [ $errno ] . " : $message in $filename on line $line . " ;
2003-04-21 12:36:09 +00:00
if ( $errno & E_ALL ^ E_NOTICE ) {
2001-12-01 15:20:48 +00:00
watchdog ( " error " , $types [ $errno ] . " : $message in $filename on line $line . " );
2003-09-29 14:36:48 +00:00
print " <pre> $entry </pre> " ;
2001-12-01 15:20:48 +00:00
}
}
2003-01-04 11:03:15 +00:00
function watchdog ( $type , $message , $link = NULL ) {
2001-12-01 15:20:48 +00:00
global $user ;
2003-07-10 17:46:44 +00:00
db_query ( " INSERT INTO { watchdog} (uid, type, message, link, location, hostname, timestamp) VALUES (%d, '%s', '%s', '%s', '%s', '%s', %d) " , $user -> uid , $type , $message , $link , request_uri (), getenv ( " REMOTE_ADDR " ), time ());
2001-12-01 15:20:48 +00:00
}
function throttle ( $type , $rate ) {
if ( ! user_access ( " access administration pages " )) {
2003-07-10 17:46:44 +00:00
if ( $throttle = db_fetch_object ( db_query ( " SELECT * FROM { watchdog} WHERE type = ' $type ' AND hostname = ' " . getenv ( " REMOTE_ADDR " ) . " ' AND " . time () . " - timestamp < $rate " ))) {
2001-12-01 15:20:48 +00:00
watchdog ( " warning " , " throttle: ' " . getenv ( " REMOTE_ADDR " ) . " ' exceeded submission rate - $throttle->type " );
die ( message_throttle ());
}
else {
watchdog ( $type , " throttle " );
}
}
}
2003-10-31 19:34:03 +00:00
function _fix_gpc_magic_array ( & $items ) {
foreach ( $items as $k => $i ) {
if ( is_array ( $i )) _fix_gpc_magic_array ( $items [ $k ]);
else $items [ $k ] = stripslashes ( $i );
2002-12-26 12:16:09 +00:00
}
}
2003-10-31 19:34:03 +00:00
function fix_gpc_magic () {
static $fixed = false ;
if ( $fixed ) return ;
if ( ini_get ( " magic_quotes_gpc " ) == 0 ) return ;
_fix_gpc_magic_array ( $_GET );
_fix_gpc_magic_array ( $_POST );
_fix_gpc_magic_array ( $_COOKIE );
$fixed = true ;
}
2001-12-30 16:16:38 +00:00
function array2object ( $node ) {
if ( is_array ( $node )) {
foreach ( $node as $key => $value ) {
$object -> $key = $value ;
}
}
else {
$object = $node ;
}
return $object ;
}
function object2array ( $node ) {
if ( is_object ( $node )) {
foreach ( $node as $key => $value ) {
$array [ $key ] = $value ;
}
}
else {
$array = $node ;
}
return $array ;
}
2001-12-01 15:20:48 +00:00
function message_access () {
2002-12-11 20:21:04 +00:00
return t ( " You are not authorized to access this page. " );
2001-12-01 15:20:48 +00:00
}
function message_na () {
return t ( " n/a " );
}
function message_throttle () {
return t ( " You exceeded the maximum submission rate. Please wait a few minutes and try again. " );
}
2001-12-27 15:27:44 +00:00
function locale_init () {
global $languages , $user ;
2003-03-04 15:10:37 +00:00
if ( $user -> uid && $languages [ $user -> language ]) {
return $user -> language ;
}
else {
return key ( $languages );
}
2001-12-27 15:27:44 +00:00
}
2002-04-20 11:52:50 +00:00
function t ( $string , $args = 0 ) {
2001-12-27 15:27:44 +00:00
global $languages ;
2002-04-24 20:55:20 +00:00
2002-05-02 18:47:35 +00:00
/*
** About the usage of t () . We try to keep strings whole as much as
** possible and are unafraid of HTML markup within translation strings
** if necessary . The suggested syntax for a link embedded within a
** translation string is for example :
**
** $msg = t ( " You must login below or <a href= \" %url \" >create a new
2003-01-06 19:51:01 +00:00
** account </ a > before viewing the next page . " , array( " % url "
** => url ( " user/register " )));
2002-05-02 18:47:35 +00:00
*/
2003-04-01 06:05:15 +00:00
$string = ( $languages && module_exist ( " locale " ) ? locale ( $string ) : $string );
2002-04-24 20:55:20 +00:00
2002-04-20 11:52:50 +00:00
if ( ! $args ) {
return $string ;
2002-04-22 09:05:36 +00:00
}
else {
2002-04-20 11:52:50 +00:00
return strtr ( $string , $args );
}
2001-12-27 15:27:44 +00:00
}
2003-06-12 17:24:06 +00:00
function drupal_specialchars ( $input , $quotes = ENT_NOQUOTES ) {
2003-06-19 17:26:27 +00:00
/*
** Note that we 'd like to go ' htmlspecialchars ( $input , $quotes , " utf-8 " ) '
** like the PHP manual tells us to , but we can 't because there' s a bug in
** PHP < 4.3 that makes it mess up multibyte charsets if we specify the
** charset . Change this later once we make PHP 4.3 a requirement .
*/
return htmlspecialchars ( $input , $quotes );
2003-06-05 18:09:39 +00:00
}
2003-03-28 10:55:27 +00:00
/**
* Verify the syntax of the given e - mail address . Empty e - mail addresses
* are allowed . See RFC 2822 for details .
*
* @ param $mail a email address
*/
2003-04-13 13:42:51 +00:00
function valid_email_address ( $mail ) {
2003-03-28 10:55:27 +00:00
$user = '[a-zA-Z0-9_\-\.\+\^!#\$%&*+\/\=\?\`\|\{\}~\']+' ;
$domain = '(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]\.?)+' ;
$ipv4 = '[0-9]{1,3}(\.[0-9]{1,3}){3}' ;
$ipv6 = '[0-9a-fA-F]{1,4}(\:[0-9a-fA-F]{1,4}){7}' ;
if ( preg_match ( " /^ $user @( $domain |( \ [( $ipv4 | $ipv6 ) \ ])) $ / " , $mail )) {
return 1 ;
}
else {
return 0 ;
}
}
2003-07-16 20:14:26 +00:00
/**
* Verify the syntax of the given URL .
*
* @ param $url an URL
*/
function valid_url ( $url ) {
2003-10-03 14:10:05 +00:00
if ( preg_match ( " /^[a-zA-z0-9 \ /:_ \ -_ \ .,]+ $ / " , $url )) {
2003-07-16 20:14:26 +00:00
return 1 ;
}
else {
return 0 ;
}
}
2002-03-05 20:15:17 +00:00
/**
* Format a single result entry of a search query :
*
* @ param $item a single search result as returned by < module > _search of type
2002-04-14 20:46:41 +00:00
* array ( " count " => ... , " link " => ... , " title " => ... ,
2002-03-05 20:15:17 +00:00
* " user " => ... , " date " => ... , " keywords " => ... )
* @ param $type module type of this item
*/
2001-12-27 15:27:44 +00:00
function search_item ( $item , $type ) {
2002-04-27 13:19:37 +00:00
/*
** Modules may implement the " search_item " hook in order to overwrite
** the default function to display search results .
*/
if ( module_hook ( $type , " search_item " )) {
$output = module_invoke ( $type , " search_item " , $item );
}
else {
2003-06-25 22:10:54 +00:00
$output .= " <b><u><a href= \" " . $item [ " link " ] . " \" > " . $item [ " title " ] . " </a></u></b><br /> " ;
2003-10-13 21:28:05 +00:00
$output .= " <small> " . t ( $type ) . ( $item [ " user " ] ? " - " . $item [ " user " ] : " " ) . " " . ( $item [ " date " ] ? " - " . format_date ( $item [ " date " ], " small " ) : " " ) . " </small> " ;
2002-04-27 13:19:37 +00:00
$output .= " <br /><br /> " ;
}
2001-12-27 15:27:44 +00:00
return $output ;
}
2002-03-05 20:15:17 +00:00
/**
* Render a generic search form .
*
* " Generic " means " universal usable " - that is , usable not only from
2003-01-06 19:51:01 +00:00
* 'site.com/search' , but also as a simple seach box ( without
2002-04-14 20:46:41 +00:00
* " Restrict search to " , help text , etc ) from theme ' s header etc .
* This means : provide options to only conditionally render certain
2002-03-05 20:15:17 +00:00
* parts of this form .
*
2003-01-06 19:51:01 +00:00
* @ param $action Form action . Defaults to 'site.com/search' .
2003-06-25 22:10:54 +00:00
* @ param $keys string containing keywords for the search .
2002-04-14 20:46:41 +00:00
* @ param $options != 0 : Render additional form fields / text
2002-03-05 20:15:17 +00:00
* ( " Restrict search to " , help text , etc ) .
*/
2003-06-30 19:18:47 +00:00
function search_form ( $action = NULL , $keys = NULL , $options = NULL ) {
2001-12-27 15:27:44 +00:00
if ( ! $action ) {
2003-01-06 19:51:01 +00:00
$action = url ( " search " );
2001-12-27 15:27:44 +00:00
}
2003-10-15 15:12:50 +00:00
$output .= " <br /><input type= \" text \" class= \" form-text \" size= \" 50 \" value= \" " . check_form ( $keys ) . " \" name= \" keys \" /> " ;
$output .= " <input type= \" submit \" class= \" form-submit \" value= \" " . t ( " Search " ) . " \" /> \n " ;
2001-12-27 15:27:44 +00:00
if ( $options != 0 ) {
$output .= " <br /> " ;
$output .= t ( " Restrict search to " ) . " : " ;
foreach ( module_list () as $name ) {
if ( module_hook ( $name , " search " )) {
2002-03-05 20:15:17 +00:00
$output .= " <input type= \" checkbox \" name= \" edit[type][ $name ] \" " . ( $edit [ " type " ][ $name ] ? " checked= \" checked \" " : " " ) . " /> " . t ( $name );
2001-12-27 15:27:44 +00:00
}
}
}
2002-03-05 20:15:17 +00:00
$form .= " <br /> " ;
2001-12-27 15:27:44 +00:00
return form ( $output , " post " , $action );
}
/*
2002-03-05 20:15:17 +00:00
* Collect the search results :
*/
2003-06-25 22:10:54 +00:00
function search_data ( $keys = NULL ) {
2003-05-13 18:36:38 +00:00
$edit = $_POST [ " edit " ];
2001-12-27 15:27:44 +00:00
2003-01-09 20:06:00 +00:00
if ( isset ( $keys )) {
2001-12-27 15:27:44 +00:00
foreach ( module_list () as $name ) {
2003-09-14 08:57:18 +00:00
if ( module_hook ( $name , " search " ) && ( ! $edit [ " type " ] || $edit [ " type " ][ $name ]) && ( $result = module_invoke ( $name , " search " , $keys ))) {
2002-03-05 20:15:17 +00:00
if ( $name == " node " || $name == " comment " ) {
2002-05-31 20:29:30 +00:00
$output .= " <p><b> " . t ( " Matching " . $name . " s ranked in order of relevance " ) . " :</b></p> " ;
2002-03-05 20:15:17 +00:00
}
else {
2002-05-31 20:29:30 +00:00
$output .= " <p><b> " . t ( " Matching " . $name . " s " ) . " :</b></p> " ;
2002-03-05 20:15:17 +00:00
}
2001-12-27 15:27:44 +00:00
foreach ( $result as $entry ) {
$output .= search_item ( $entry , $name );
}
}
}
}
return $output ;
}
2002-03-05 20:15:17 +00:00
/**
* Display the search form and the resulting data .
*
2002-04-14 20:46:41 +00:00
* @ param $type If set , search only nodes of this type .
2002-03-05 20:15:17 +00:00
* Otherwise , search all types .
2003-01-06 19:51:01 +00:00
* @ param $action Form action . Defaults to 'site.com/search' .
2002-03-05 20:15:17 +00:00
* @ param $query Query string . Defaults to global $keys .
2002-04-14 20:46:41 +00:00
* @ param $options != 0 : Render additional form fields / text
2002-03-05 20:15:17 +00:00
* ( " Restrict search to " , help text , etc ) .
*/
2003-06-30 19:18:47 +00:00
function search_type ( $type , $action = NULL , $keys = NULL , $options = NULL ) {
2003-05-13 18:36:38 +00:00
2003-06-30 19:18:47 +00:00
$_POST [ " edit " ][ " type " ][ $type ] = " on " ;
2001-12-27 15:27:44 +00:00
2003-06-25 22:10:54 +00:00
return search_form ( $action , $keys , $options ) . " <br /> " . search_data ( $keys );
2001-12-27 15:27:44 +00:00
}
2002-04-14 20:46:41 +00:00
2001-12-01 15:20:48 +00:00
function drupal_goto ( $url ) {
2002-05-31 20:29:30 +00:00
/*
** Translate & amp ; to simply &
*/
2002-08-08 18:24:53 +00:00
2003-05-30 11:01:56 +00:00
$url = str_replace ( " & " , " & " , $url );
2002-05-31 20:29:30 +00:00
2001-12-01 15:20:48 +00:00
/*
** It is advised to use " drupal_goto() " instead of PHP ' s " header() " as
** " drupal_goto() " will append the user ' s session ID to the URI when PHP
** is compiled with " --enable-trans-sid " .
*/
2003-02-27 22:52:08 +00:00
if ( ! ini_get ( " session.use_trans_sid " ) || ! session_id () || strstr ( $url , session_id ())) {
2001-12-01 15:20:48 +00:00
header ( " Location: $url " );
}
else {
2002-11-29 05:45:57 +00:00
$sid = session_name () . " = " . session_id ();
if ( strstr ( $url , " ? " ) && ! strstr ( $url , $sid )) {
header ( " Location: $url & " . $sid );
}
else {
header ( " Location: $url ? " . $sid );
}
2001-12-01 15:20:48 +00:00
}
/*
** The " Location " header sends a REDIRECT status code to the http
2003-05-29 10:18:38 +00:00
** daemon . In some cases this can go wrong , so we make sure none
2001-12-01 15:20:48 +00:00
** of the code / below / gets executed when we redirect .
*/
exit ();
}
2003-08-08 22:24:55 +00:00
function valid_input_data ( $data ) {
2003-06-27 17:48:20 +00:00
2003-09-29 09:32:45 +00:00
if ( is_array ( $data ) || is_object ( $data )) {
2003-06-27 17:48:20 +00:00
/*
** Form data can contain a number of nested arrays .
*/
foreach ( $data as $key => $value ) {
2003-08-08 22:24:55 +00:00
if ( ! valid_input_data ( $value )) {
return 0 ;
}
2003-06-27 17:48:20 +00:00
}
}
else {
/*
** Detect evil input data .
*/
2003-07-09 22:07:50 +00:00
// check strings:
2003-07-09 22:13:09 +00:00
$match = preg_match ( " / \ Wjavascript \ s*:/i " , $data );
2003-07-09 22:07:50 +00:00
$match += preg_match ( " / \ Wexpression \ s* \ (/i " , $data );
$match += preg_match ( " / \ Walert \ s* \ (/i " , $data );
2003-06-27 17:48:20 +00:00
// check attributes:
2003-07-09 22:13:09 +00:00
$match += preg_match ( " / \ W(dynsrc|datasrc|data|lowsrc|on[a-z]+) \ s*=[^>]+?>/i " , $data );
2003-07-10 17:46:44 +00:00
2003-06-27 17:48:20 +00:00
// check tags:
2003-06-29 18:21:47 +00:00
$match += preg_match ( " /< \ s*(applet|script|object|style|embed|form|blink|meta|html|frame|iframe|layer|ilayer|head|frameset|xml)/i " , $data );
2003-06-27 17:48:20 +00:00
if ( $match ) {
watchdog ( " warning " , " terminated request because of suspicious input data: " . drupal_specialchars ( $data ));
2003-08-08 22:24:55 +00:00
return 0 ;
2003-06-27 17:48:20 +00:00
}
}
2003-08-08 22:24:55 +00:00
return 1 ;
2003-06-27 17:48:20 +00:00
}
2003-06-06 21:08:35 +00:00
2001-12-01 15:20:48 +00:00
function check_form ( $text ) {
2003-06-23 07:24:56 +00:00
return drupal_specialchars ( $text , ENT_QUOTES );
2001-12-01 15:20:48 +00:00
}
function filter ( $text ) {
2003-01-27 19:37:07 +00:00
2003-05-30 05:45:35 +00:00
$modules = module_list ();
/*
** Make sure the HTML filters that are part of the node module
** are run first .
*/
if ( in_array ( " node " , $modules )) {
$text = module_invoke ( " node " , " filter " , $text );
}
foreach ( $modules as $name ) {
if ( module_hook ( $name , " filter " ) && $name != " node " ) {
2003-01-27 19:37:07 +00:00
$text = module_invoke ( $name , " filter " , $text );
}
}
return $text ;
2001-12-01 15:20:48 +00:00
}
2003-01-11 20:07:42 +00:00
function rewrite_old_urls ( $text ) {
2003-03-08 21:10:22 +00:00
global $base_url ;
$end = substr ( $base_url , 12 );
2003-01-11 20:07:42 +00:00
/*
** This is a * temporary * filter to rewrite old - style URLs to new - style
** URLs ( clean URLs ) . Currently , URLs are being rewritten dynamically
2003-01-12 11:53:31 +00:00
** ( ie . " on output " ), however when these rewrite rules have been tested
** enough , we will use them to permanently rewrite the links in node
2003-01-11 20:07:42 +00:00
** and comment bodies .
*/
2003-02-15 17:15:48 +00:00
if ( variable_get ( " clean_url " , " 0 " ) == " 0 " ) {
2003-03-08 21:10:22 +00:00
/*
** Relative URLs :
*/
// rewrite 'node.php?id=<number>[&cid=<number>]' style URLs:
$text = eregi_replace ( " \" (node) \ .php \ ?id=([[:digit:]]+)(&cid=)?([[:digit:]]*) " , " \" ?q= \\ 1/view/ \\ 2/ \\ 4 " , $text );
// rewrite 'module.php?mod=<name>{&<op>=<value>}' style URLs:
$text = ereg_replace ( " \" module \ .php \ ?(&?[[:alpha:]]+=([[:alnum:]]+))(&?[[:alpha:]]+=([[:alnum:]]+))(&?[[:alpha:]]+=([[:alnum:]]+)) " , " \" ?q= \\ 2/ \\ 4/ \\ 6 " , $text );
$text = ereg_replace ( " \" module \ .php \ ?(&?[[:alpha:]]+=([[:alnum:]]+))(&?[[:alpha:]]+=([[:alnum:]]+)) " , " \" ?q= \\ 2/ \\ 4 " , $text );
$text = ereg_replace ( " \" module \ .php \ ?(&?[[:alpha:]]+=([[:alnum:]]+)) " , " \" ?q= \\ 2 " , $text );
/*
** Absolute URLs :
*/
2003-02-14 19:52:45 +00:00
// rewrite 'node.php?id=<number>[&cid=<number>]' style URLs:
2003-03-08 21:10:22 +00:00
$text = eregi_replace ( " $end /(node) \ .php \ ?id=([[:digit:]]+)(&cid=)?([[:digit:]]*) " , " $end /?q= \\ 1/view/ \\ 2/ \\ 4 " , $text );
2003-01-15 05:56:50 +00:00
2003-02-14 19:52:45 +00:00
// rewrite 'module.php?mod=<name>{&<op>=<value>}' style URLs:
2003-03-08 21:10:22 +00:00
$text = ereg_replace ( " $end /module \ .php \ ?(&?[[:alpha:]]+=([[:alnum:]]+))(&?[[:alpha:]]+=([[:alnum:]]+))(&?[[:alpha:]]+=([[:alnum:]]+)) " , " $end /?q= \\ 2/ \\ 4/ \\ 6 " , $text );
$text = ereg_replace ( " $end /module \ .php \ ?(&?[[:alpha:]]+=([[:alnum:]]+))(&?[[:alpha:]]+=([[:alnum:]]+)) " , " $end /?q= \\ 2/ \\ 4 " , $text );
$text = ereg_replace ( " $end /module \ .php \ ?(&?[[:alpha:]]+=([[:alnum:]]+)) " , " \" $end /?q= \\ 2 " , $text );
2003-02-14 19:52:45 +00:00
}
else {
2003-03-08 21:10:22 +00:00
/*
** Relative URLs :
*/
2003-02-14 19:52:45 +00:00
// rewrite 'node.php?id=<number>[&cid=<number>]' style URLs:
2003-03-08 21:10:22 +00:00
$text = eregi_replace ( " \" (node) \ .php \ ?id=([[:digit:]]+)(&cid=)?([[:digit:]]*) " , " \" \\ 1/view/ \\ 2/ \\ 4 " , $text );
2003-02-14 19:52:45 +00:00
// rewrite 'module.php?mod=<name>{&<op>=<value>}' style URLs:
2003-03-08 21:10:22 +00:00
$text = ereg_replace ( " \" module \ .php \ ?(&?[[:alpha:]]+=([[:alnum:]]+))(&?[[:alpha:]]+=([[:alnum:]]+))(&?[[:alpha:]]+=([[:alnum:]]+)) " , " \" \\ 2/ \\ 4/ \\ 6 " , $text );
$text = ereg_replace ( " \" module \ .php \ ?(&?[[:alpha:]]+=([[:alnum:]]+))(&?[[:alpha:]]+=([[:alnum:]]+)) " , " \" \\ 2/ \\ 4 " , $text );
$text = ereg_replace ( " \" module \ .php \ ?(&?[[:alpha:]]+=([[:alnum:]]+)) " , " \" \\ 2 " , $text );
/*
** Absolute URLs :
*/
// rewrite 'node.php?id=<number>[&cid=<number>]' style URLs:
$text = eregi_replace ( " $end /(node) \ .php \ ?id=([[:digit:]]+)(&cid=)?([[:digit:]]*) " , " $end / \\ 1/view/ \\ 2/ \\ 4 " , $text );
// rewrite 'module.php?mod=<name>{&<op>=<value>}' style URLs:
$text = ereg_replace ( " $end /module \ .php \ ?(&?[[:alpha:]]+=([[:alnum:]]+))(&?[[:alpha:]]+=([[:alnum:]]+))(&?[[:alpha:]]+=([[:alnum:]]+)) " , " $end / \\ 2/ \\ 4/ \\ 6 " , $text );
$text = ereg_replace ( " $end /module \ .php \ ?(&?[[:alpha:]]+=([[:alnum:]]+))(&?[[:alpha:]]+=([[:alnum:]]+)) " , " $end / \\ 2/ \\ 4 " , $text );
$text = ereg_replace ( " $end /module \ .php \ ?(&?[[:alpha:]]+=([[:alnum:]]+)) " , " $end / \\ 2 " , $text );
}
2003-01-15 05:56:50 +00:00
2003-01-11 20:07:42 +00:00
return $text ;
}
2002-12-31 12:34:07 +00:00
function check_output ( $text ) {
2003-01-09 20:06:00 +00:00
if ( isset ( $text )) {
2003-05-24 16:26:13 +00:00
// filter content on output:
$text = filter ( $text );
// get the line breaks right:
2002-12-15 23:05:25 +00:00
if ( strip_tags ( $text , " <a><i><b><u><tt><code><cite><strong><img> " ) == $text ) {
2002-12-14 11:55:54 +00:00
$text = nl2br ( $text );
}
}
else {
$text = message_na ();
}
return $text ;
2001-12-01 15:20:48 +00:00
}
2003-09-29 09:32:45 +00:00
2003-10-07 10:22:33 +00:00
function check_file ( $filename ) {
return is_uploaded_file ( $filename );
2001-12-01 15:20:48 +00:00
}
2002-04-27 13:19:37 +00:00
function format_rss_channel ( $title , $link , $description , $items , $language = " en " , $args = array ()) {
// arbitrary elements may be added using the $args associative array
2001-12-01 15:20:48 +00:00
$output .= " <channel> \n " ;
2003-06-05 18:09:39 +00:00
$output .= " <title> " . drupal_specialchars ( strip_tags ( $title )) . " </title> \n " ;
$output .= " <link> " . drupal_specialchars ( strip_tags ( $link )) . " </link> \n " ;
$output .= " <description> " . drupal_specialchars ( $description ) . " </description> \n " ;
$output .= " <language> " . drupal_specialchars ( strip_tags ( $language )) . " </language> \n " ;
2002-04-27 13:19:37 +00:00
foreach ( $args as $key => $value ) {
2003-09-10 19:30:34 +00:00
$output .= " < $key > " . drupal_specialchars ( strip_tags ( $value )) . " </ $key > \n " ;
2002-04-27 13:19:37 +00:00
}
2001-12-01 15:20:48 +00:00
$output .= $items ;
$output .= " </channel> \n " ;
return $output ;
}
2002-04-27 13:19:37 +00:00
function format_rss_item ( $title , $link , $description , $args = array ()) {
// arbitrary elements may be added using the $args associative array
2001-12-01 15:20:48 +00:00
$output .= " <item> \n " ;
2003-06-05 18:09:39 +00:00
$output .= " <title> " . drupal_specialchars ( strip_tags ( $title )) . " </title> \n " ;
$output .= " <link> " . drupal_specialchars ( strip_tags ( $link )) . " </link> \n " ;
$output .= " <description> " . drupal_specialchars ( check_output ( $description )) . " </description> \n " ;
2002-04-27 13:19:37 +00:00
foreach ( $args as $key => $value ) {
2003-06-05 18:09:39 +00:00
$output .= " < $key > " . drupal_specialchars ( strip_tags ( $value )) . " </ $key > " ;
2002-04-27 13:19:37 +00:00
}
2001-12-01 15:20:48 +00:00
$output .= " </item> \n " ;
return $output ;
}
2003-01-21 22:44:25 +00:00
/**
* Formats a string with a count of items so that the string is pluralized
* correctly .
* format_plural calls t () by itself , make sure not to pass already localized
* strings to it .
*
* @ param $count The item count to display .
* @ param $singular The string for the singular case . Please make sure it ' s clear
* this is singular , to ease translation . ( " 1 new comment " instead of
* " 1 new " ) .
* @ param $plural The string for the plrual case . Please make sure it ' s clear
* this is plural , to ease translation . Use % count in places of the
* item count , as in " %count new comments " .
*/
2001-12-01 15:20:48 +00:00
function format_plural ( $count , $singular , $plural ) {
2003-01-21 22:44:25 +00:00
return t ( $count == 1 ? $singular : $plural , array ( " %count " => $count ));
2001-12-01 15:20:48 +00:00
}
function format_size ( $size ) {
2002-07-05 18:28:02 +00:00
$suffix = t ( " bytes " );
2001-12-01 15:20:48 +00:00
if ( $size > 1024 ) {
$size = round ( $size / 1024 , 2 );
2002-07-05 18:28:02 +00:00
$suffix = t ( " KB " );
2001-12-01 15:20:48 +00:00
}
if ( $size > 1024 ) {
$size = round ( $size / 1024 , 2 );
2002-07-05 18:28:02 +00:00
$suffix = t ( " MB " );
2001-12-01 15:20:48 +00:00
}
2002-07-05 18:28:02 +00:00
return t ( " %size %suffix " , array ( " %size " => $size , " %suffix " => $suffix ));
2001-12-01 15:20:48 +00:00
}
function format_interval ( $timestamp ) {
2003-01-21 22:44:25 +00:00
$units = array ( " 1 year|%count years " => 31536000 , " 1 week|%count weeks " => 604800 , " 1 day|%count days " => 86400 , " 1 hour|%count hours " => 3600 , " 1 min|%count min " => 60 , " 1 sec|%count sec " => 1 );
2002-05-12 15:40:57 +00:00
foreach ( $units as $key => $value ) {
2001-12-01 15:20:48 +00:00
$key = explode ( " | " , $key );
if ( $timestamp >= $value ) {
$output .= ( $output ? " " : " " ) . format_plural ( floor ( $timestamp / $value ), $key [ 0 ], $key [ 1 ]);
$timestamp %= $value ;
}
}
2002-07-05 18:28:02 +00:00
return ( $output ) ? $output : t ( " 0 sec " );
2001-12-01 15:20:48 +00:00
}
function format_date ( $timestamp , $type = " medium " , $format = " " ) {
global $user ;
2002-05-13 18:59:53 +00:00
$timestamp += ( $user -> timezone ) ? $user -> timezone - date ( " Z " ) : 0 ;
2001-12-01 15:20:48 +00:00
switch ( $type ) {
case " small " :
2003-09-29 18:20:38 +00:00
$format = variable_get ( " date_format_short " , " m/d/Y - H:i " );
2001-12-01 15:20:48 +00:00
break ;
case " large " :
2003-09-29 18:20:38 +00:00
$format = variable_get ( " date_format_long " , " l, F j, Y - H:i " );
2001-12-01 15:20:48 +00:00
break ;
case " custom " :
2003-09-29 18:20:38 +00:00
// No change to format
2001-12-01 15:20:48 +00:00
break ;
2003-09-29 18:20:38 +00:00
case " medium " :
2001-12-01 15:20:48 +00:00
default :
2003-09-29 18:20:38 +00:00
$format = variable_get ( " date_format_medium " , " D, m/d/Y - H:i " );
}
for ( $i = strlen ( $format ); $i >= 0 ; $c = $format [ -- $i ]) {
if ( strstr ( " DFlMSw " , $c )) {
$date = t ( date ( $c , $timestamp )) . $date ;
}
else if ( strstr ( " AaBdgGhHiIjLmnOrstTUWYyZz " , $c )) {
$date = date ( $c , $timestamp ) . $date ;
}
else {
$date = $c . $date ;
}
2001-12-01 15:20:48 +00:00
}
return $date ;
}
function format_name ( $object ) {
if ( $object -> uid && $object -> name ) {
2003-08-22 21:35:25 +00:00
/*
** Shorten the name when it is too long or it will break many
** tables .
*/
if ( strlen ( $object -> name ) > 20 ) {
$name = substr ( $object -> name , 0 , 15 ) . " ... " ;
}
else {
$name = $object -> name ;
}
2003-02-02 10:13:13 +00:00
if ( arg ( 0 ) == " admin " ) {
2003-08-22 21:35:25 +00:00
$output = l ( $name , " admin/user/edit/ $object->uid " , array ( " title " => t ( " Administer user profile. " )));
2001-12-05 18:54:14 +00:00
}
else {
2003-08-22 21:35:25 +00:00
$output = l ( $name , " user/view/ $object->uid " , array ( " title " => t ( " View user profile. " )));
2001-12-05 18:54:14 +00:00
}
2001-12-01 15:20:48 +00:00
}
2003-02-02 10:13:13 +00:00
else if ( $object -> name ) {
/*
** Sometimes modules display content composed by people who are
** not registers members of the site ( i . e . mailing list or news
** aggregator modules ) . This clause enables modules to display
** the true author of the content .
*/
$output = $object -> name ;
}
2001-12-01 15:20:48 +00:00
else {
2003-04-21 12:36:09 +00:00
$output = t ( variable_get ( " anonymous " , " Anonymous " ));
2001-12-01 15:20:48 +00:00
}
2001-12-05 18:54:14 +00:00
return $output ;
2001-12-01 15:20:48 +00:00
}
function form ( $form , $method = " post " , $action = 0 , $options = 0 ) {
2003-05-19 18:26:49 +00:00
if ( ! $action ) {
2003-06-03 18:04:47 +00:00
$action = request_uri ();
2003-05-19 18:26:49 +00:00
}
2003-08-12 20:37:16 +00:00
return " <form action= \" $action\ " method = \ " $method\ " " . drupal_attributes( $options ) . " > \n $form\n </ form > \n " ;
2001-12-01 15:20:48 +00:00
}
function form_item ( $title , $value , $description = 0 ) {
2003-11-17 19:16:55 +00:00
return theme ( " form_element " , $title , $value , $description );
2001-12-01 15:20:48 +00:00
}
2003-11-17 19:16:55 +00:00
2003-11-06 18:27:58 +00:00
function form_group ( $legend , $group , $description = 0 ) {
return " <fieldset> " . ( $legend ? " <legend> $legend </legend> " : " " ) . $group . ( $description ? " <div class= \" description \" > $description </div> " : " " ) . " </fieldset> \n " ;
}
2001-12-01 15:20:48 +00:00
2003-08-12 20:37:16 +00:00
function form_radio ( $title , $name , $value = 1 , $checked = 0 , $description = 0 , $attributes = 0 ) {
2003-11-17 19:16:55 +00:00
return theme ( " form_element " , 0 , " <input type= \" radio \" class= \" form-radio \" name= \" edit[ $name ] \" value= \" " . $value . " \" " . ( $checked ? " checked= \" checked \" " : " " ) . drupal_attributes ( $attributes ) . " /> $title " , $description );
2003-04-13 13:42:51 +00:00
}
2003-08-12 20:37:16 +00:00
function form_checkbox ( $title , $name , $value = 1 , $checked = 0 , $description = 0 , $attributes = 0 ) {
2003-11-17 19:16:55 +00:00
return form_hidden ( $name , 0 ) . theme ( " form_element " , 0 , " <input type= \" checkbox \" class= \" form-checkbox \" name= \" edit[ $name ] \" value= \" " . $value . " \" " . ( $checked ? " checked= \" checked \" " : " " ) . drupal_attributes ( $attributes ) . " /> $title " , $description );
2001-12-01 15:20:48 +00:00
}
2003-08-12 20:37:16 +00:00
function form_textfield ( $title , $name , $value , $size , $maxlength , $description = 0 , $attributes = 0 ) {
2003-06-05 18:09:39 +00:00
$size = $size ? " size= \" $size\ " " : " " ;
2003-11-17 19:16:55 +00:00
return theme ( " form_element " , $title , " <input type= \" text \" maxlength= \" $maxlength\ " class = \ " form-text \" name= \" edit[ $name ] \" $size value= \" " . check_form ( $value ) . " \" " . drupal_attributes ( $attributes ) . " /> " , $description );
2001-12-01 15:20:48 +00:00
}
2003-08-12 20:37:16 +00:00
function form_password ( $title , $name , $value , $size , $maxlength , $description = 0 , $attributes = 0 ) {
2003-06-05 18:09:39 +00:00
$size = $size ? " size= \" $size\ " " : " " ;
2003-11-17 19:16:55 +00:00
return theme ( " form_element " , $title , " <input type= \" password \" class= \" form-password \" maxlength= \" $maxlength\ " name = \ " edit[ $name ] \" $size value= \" " . check_form ( $value ) . " \" " . drupal_attributes ( $attributes ) . " /> " , $description );
2001-12-01 15:20:48 +00:00
}
2003-08-12 20:37:16 +00:00
function form_textarea ( $title , $name , $value , $cols , $rows , $description = 0 , $attributes = 0 ) {
2003-06-05 18:09:39 +00:00
$cols = $cols ? " cols= \" $cols\ " " : " " ;
2003-04-23 18:58:43 +00:00
module_invoke_all ( " textarea " , $name ); // eg. optionally plug in a WYSIWYG editor
2003-11-17 19:16:55 +00:00
return theme ( " form_element " , $title , " <textarea wrap= \" virtual \" $cols rows= \" $rows\ " name = \ " edit[ $name ] \" id= \" edit[ $name ] \" " . drupal_attributes ( $attributes ) . " > " . check_form ( $value ) . " </textarea> " , $description );
2001-12-01 15:20:48 +00:00
}
2002-04-14 20:46:41 +00:00
function form_select ( $title , $name , $value , $options , $description = 0 , $extra = 0 , $multiple = 0 ) {
2001-12-01 15:20:48 +00:00
if ( count ( $options ) > 0 ) {
2002-05-12 15:40:57 +00:00
foreach ( $options as $key => $choice ) {
2003-02-12 21:37:56 +00:00
$select .= " <option value= \" $key\ " " . (is_array( $value ) ? (in_array( $key , $value ) ? " selected = \ " selected \" " : " " ) : ( $value == $key ? " selected= \" selected \" " : " " )) . " > " . check_form ( $choice ) . " </option> " ;
2002-01-27 14:58:45 +00:00
}
2003-11-17 19:16:55 +00:00
return theme ( " form_element " , $title , " <select name= \" edit[ $name ] " . ( $multiple ? " [] " : " " ) . " \" " . ( $multiple ? " multiple " : " " ) . ( $extra ? " $extra " : " " ) . " > $select </select> " , $description );
2001-12-01 15:20:48 +00:00
}
}
2003-06-05 18:09:39 +00:00
function form_radios ( $title , $name , $value , $options , $description = 0 ) {
if ( count ( $options ) > 0 ) {
foreach ( $options as $key => $choice ) {
$output .= form_radio ( $choice , $name , $key , ( $key == $value ));
}
2003-11-17 19:16:55 +00:00
return theme ( " form_element " , $title , $output , $description );
2003-06-05 18:09:39 +00:00
}
}
2003-10-07 10:22:33 +00:00
function form_file ( $title , $name , $size , $description = 0 ) {
2003-11-17 19:16:55 +00:00
return theme ( " form_element " , $title , " <input type= \" file \" class= \" form-file \" name= \" edit[ $name ] \" size= \" $size\ " /> \n " , $description );
2001-12-01 15:20:48 +00:00
}
function form_hidden ( $name , $value ) {
return " <input type= \" hidden \" name= \" edit[ $name ] \" value= \" " . check_form ( $value ) . " \" /> \n " ;
}
2003-08-12 20:37:16 +00:00
function form_submit ( $value , $name = " op " , $attributes = 0 ) {
2003-06-20 17:43:03 +00:00
return " <input type= \" submit \" class= \" form-submit \" name= \" $name\ " value = \ " " . check_form ( $value ) . " \" /> \n " ;
2001-12-01 15:20:48 +00:00
}
2002-10-26 15:17:26 +00:00
function form_weight ( $title = NULL , $name = " weight " , $value = 0 , $delta = 10 , $description = 0 , $extra = 0 ) {
2003-04-03 22:18:27 +00:00
for ( $n = ( - 1 * $delta ); $n <= $delta ; $n ++ ) {
2002-10-26 15:17:26 +00:00
$weights [ $n ] = $n ;
}
return form_select ( $title , $name , $value , $weights , $description , $extra );
}
2003-06-19 17:26:27 +00:00
function form_allowed_tags_text () {
return variable_get ( " allowed_html " , " " ) ? ( t ( " Allowed HTML tags " ) . " : " . htmlspecialchars ( variable_get ( " allowed_html " , " " ))) : " " ;
}
2003-09-30 17:01:34 +00:00
/**
* Given an old url , return the alias .
*/
2003-10-03 14:10:05 +00:00
function drupal_get_path_alias ( $path ) {
$map = drupal_get_path_map ();
2003-09-30 17:01:34 +00:00
2003-09-30 20:59:26 +00:00
if ( $map ) {
return array_search ( $path , $map );
}
2003-09-30 17:01:34 +00:00
}
/**
2003-10-03 14:10:05 +00:00
* Given an alias , return the default url .
2003-09-30 17:01:34 +00:00
*/
2003-10-03 14:10:05 +00:00
function drupal_get_normal_path ( $path ) {
$map = drupal_get_path_map ();
2003-09-30 17:01:34 +00:00
return $map [ $path ];
}
2003-01-11 10:46:11 +00:00
function url ( $url = NULL , $query = NULL ) {
2003-02-14 19:52:45 +00:00
global $base_url ;
2003-01-06 21:24:21 +00:00
2003-05-31 13:05:06 +00:00
static $script ;
if ( empty ( $script )) {
/*
** On some webservers such as IIS we can ' t omit " index.php " . As such we
** generate " index.php?q=foo " instead of " ?q=foo " on anything that is not
** Apache .
*/
$script = ( strpos ( $_SERVER [ " SERVER_SOFTWARE " ], " Apache " ) === false ) ? " index.php " : " " ;
}
2003-10-03 14:10:05 +00:00
if ( $alias = drupal_get_path_alias ( $url )) {
2003-09-30 17:01:34 +00:00
$url = $alias ;
}
2003-02-15 17:15:48 +00:00
if ( variable_get ( " clean_url " , " 0 " ) == " 0 " ) {
2003-02-14 19:52:45 +00:00
if ( isset ( $url )) {
if ( isset ( $query )) {
2003-05-31 13:05:06 +00:00
return " $base_url / $script ?q= $url & $query " ;
2003-02-14 19:52:45 +00:00
}
else {
2003-05-31 13:05:06 +00:00
return " $base_url / $script ?q= $url " ;
2003-02-14 19:52:45 +00:00
}
2003-01-06 21:24:21 +00:00
}
else {
2003-02-14 19:52:45 +00:00
if ( isset ( $query )) {
2003-05-31 13:05:06 +00:00
return " $base_url / $script ? $query " ;
2003-02-14 19:52:45 +00:00
}
else {
2003-03-07 06:37:30 +00:00
return " $base_url / " ;
2003-02-14 19:52:45 +00:00
}
2003-01-06 21:24:21 +00:00
}
}
else {
2003-02-14 19:52:45 +00:00
if ( isset ( $url )) {
if ( isset ( $query )) {
2003-02-15 17:15:48 +00:00
return " $base_url / $url ? $query " ;
2003-02-14 19:52:45 +00:00
}
else {
2003-02-15 17:15:48 +00:00
return " $base_url / $url " ;
2003-02-14 19:52:45 +00:00
}
2003-01-06 21:24:21 +00:00
}
2003-01-11 10:46:11 +00:00
else {
2003-02-14 19:52:45 +00:00
if ( isset ( $query )) {
2003-05-31 13:05:06 +00:00
return " $base_url / $script ? $query " ;
2003-02-14 19:52:45 +00:00
}
else {
2003-03-07 06:37:30 +00:00
return " $base_url / " ;
2003-02-14 19:52:45 +00:00
}
2003-01-11 10:46:11 +00:00
}
2003-01-06 21:24:21 +00:00
}
2002-04-20 11:52:50 +00:00
}
2003-08-12 20:37:16 +00:00
function drupal_attributes ( $attributes = 0 ) {
if ( is_array ( $attributes )) {
$t = array ();
foreach ( $attributes as $key => $value ) {
$t [] = " $key = \" $value\ " " ;
}
return " " . implode ( $t , " " );
2002-04-27 13:19:37 +00:00
}
2003-08-12 20:37:16 +00:00
}
2003-01-06 19:51:01 +00:00
2003-08-12 20:37:16 +00:00
function l ( $text , $url , $attributes = array (), $query = NULL ) {
return " <a href= \" " . url ( $url , $query ) . " \" " . drupal_attributes ( $attributes ) . " > $text </a> " ;
2002-04-20 11:52:50 +00:00
}
2001-12-01 15:20:48 +00:00
function field_get ( $string , $name ) {
2003-03-07 22:11:44 +00:00
ereg ( " ,? $name =([^,]+) " , " , $string " , $regs );
2001-12-01 15:20:48 +00:00
return $regs [ 1 ];
}
function field_set ( $string , $name , $value ) {
$rval = ereg_replace ( " , $name =[^,]+ " , " " , " , $string " );
2003-01-09 20:06:00 +00:00
if ( isset ( $value )) {
2002-03-05 20:15:17 +00:00
$rval .= ( $rval == " , " ? " " : " , " ) . " $name = $value " ;
}
2001-12-01 15:20:48 +00:00
return substr ( $rval , 1 );
}
function link_page () {
2003-08-11 20:41:37 +00:00
global $custom_links ;
2002-04-14 20:46:41 +00:00
2003-09-05 13:19:00 +00:00
if ( is_array ( $custom_links )) {
2002-04-02 09:45:57 +00:00
return $custom_links ;
}
else {
2003-01-26 13:22:02 +00:00
$links = module_invoke_all ( " link " , " page " );
2003-08-11 20:41:37 +00:00
array_unshift ( $links , l ( t ( " home " ), " " , array ( " title " => t ( " Return to the main page. " ))));
2002-04-02 09:45:57 +00:00
return $links ;
2001-12-01 15:20:48 +00:00
}
2002-04-14 20:46:41 +00:00
}
2001-12-01 15:20:48 +00:00
function link_node ( $node , $main = 0 ) {
2003-01-26 13:22:02 +00:00
return module_invoke_all ( " link " , " node " , $node , $main );
2001-12-01 15:20:48 +00:00
}
2003-05-18 09:48:49 +00:00
function drupal_page_footer () {
2001-12-01 15:20:48 +00:00
if ( variable_get ( " cache " , 0 )) {
2002-01-05 16:28:34 +00:00
page_set_cache ();
2001-12-01 15:20:48 +00:00
}
2003-01-26 13:22:02 +00:00
2003-08-13 20:44:11 +00:00
/*
** A hook for modules where modules may take action at the end of a
** request good uses include setting a cache , page logging , etc .
*/
2003-01-26 13:22:02 +00:00
module_invoke_all ( " exit " );
2001-12-01 15:20:48 +00:00
}
include_once " includes/theme.inc " ;
2002-11-09 13:59:36 +00:00
include_once " includes/pager.inc " ;
2002-12-24 15:40:32 +00:00
include_once " includes/menu.inc " ;
2003-04-29 22:02:02 +00:00
include_once " includes/xmlrpc.inc " ;
2003-08-20 19:19:13 +00:00
include_once " includes/tablesort.inc " ;
2003-02-12 16:21:48 +00:00
2003-03-04 06:19:01 +00:00
// set error handler:
set_error_handler ( " error_handler " );
2003-06-04 18:24:39 +00:00
// spit out the correct charset http header
2003-06-08 16:50:05 +00:00
header ( " Content-Type: text/html; charset=utf-8 " );
2003-06-04 18:24:39 +00:00
2003-09-30 17:01:34 +00:00
// initialize the _GET["q"] prior to loading the modules and invoking their 'init' hook:
if ( ! empty ( $_GET [ " q " ])) {
2003-10-03 14:10:05 +00:00
if ( $path = drupal_get_normal_path ( trim ( $_GET [ " q " ], " / " ))) {
2003-09-30 17:01:34 +00:00
$_GET [ " q " ] = $path ;
}
}
else {
2003-10-20 07:47:18 +00:00
if ( $path = drupal_get_normal_path ( variable_get ( " site_frontpage " , " node " ))) {
$_GET [ " q " ] = $path ;
}
else {
$_GET [ " q " ] = variable_get ( " site_frontpage " , " node " );
}
2003-09-30 17:01:34 +00:00
}
2003-03-17 07:01:12 +00:00
// initialize installed modules:
module_init ();
2003-11-18 19:44:36 +00:00
if ( ! user_access ( " bypass input data check " )) {
if ( ! valid_input_data ( $_REQUEST )) {
die ( " terminated request because of suspicious input data " );
}
}
2001-12-01 15:20:48 +00:00
// initialize localization system:
$locale = locale_init ();
// initialize theme:
2003-11-09 23:27:22 +00:00
$theme = init_theme ();
2003-11-18 19:44:36 +00:00
2003-03-04 15:10:37 +00:00
?>