common.inc 27.7 KB
Newer Older
Dries Buytaert's avatar
   
Dries Buytaert committed
1
2
3
<?php
// $Id$

Dries Buytaert's avatar
   
Dries Buytaert committed
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/**
 * Functions to get and set the title of the current page.
 */
function drupal_set_title($title = NULL) {
  static $stored_title;

  if (isset($title)) {
    $stored_title = $title;
  }
  return $stored_title;
}

function drupal_get_title() {
  $title = drupal_set_title();

  if (!isset($title)) {
    $title = menu_get_active_title();
  }

  return $title;
}


/**
 * Functions to get and set the breadcrumb trail of the current page. The
 * breadcrumb trail is represented as an array of links, starting with
 * "home" and proceeding up to but not including the current page.
 */
function drupal_set_breadcrumb($breadcrumb = NULL) {
  static $stored_breadcrumb;

  if (isset($breadcrumb)) {
    $stored_breadcrumb = $breadcrumb;
  }
  return $stored_breadcrumb;
}

function drupal_get_breadcrumb() {
  $breadcrumb = drupal_set_breadcrumb();

  if (!isset($breadcrumb)) {
    $breadcrumb = menu_get_active_breadcrumb();
    array_pop($breadcrumb);
  }

  return $breadcrumb;
}


Dries Buytaert's avatar
   
Dries Buytaert committed
53
54
55
/**
 * Build the alias/path array
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
56
function drupal_get_path_map($action = "") {
Dries Buytaert's avatar
   
Dries Buytaert committed
57
58

  static $cache;
Dries Buytaert's avatar
   
Dries Buytaert committed
59
60
  static $map;

Dries Buytaert's avatar
   
Dries Buytaert committed
61
62
  if ($action == "rebuild") {
    $map = NULL;
Dries Buytaert's avatar
   
Dries Buytaert committed
63
    $cache = 0;
Dries Buytaert's avatar
   
Dries Buytaert committed
64
65
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
66
  if (!$cache) {
Dries Buytaert's avatar
   
Dries Buytaert committed
67
    $result = db_query("SELECT * FROM {url_alias}");
Dries Buytaert's avatar
   
Dries Buytaert committed
68
    while ($data = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
69
      $map[$data->dst] = $data->src;
Dries Buytaert's avatar
   
Dries Buytaert committed
70
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
71
72

    $cache = 1;
Dries Buytaert's avatar
   
Dries Buytaert committed
73
74
75
76
77
  }

  return $map;
}

Dries Buytaert's avatar
   
Dries Buytaert committed
78
79
80
81
function drupal_rebuild_path_map() {
  drupal_get_path_map("rebuild");
}

Dries Buytaert's avatar
   
Dries Buytaert committed
82
83
84
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.";
Dries Buytaert's avatar
   
Dries Buytaert committed
85
86

  if ($errno & E_ALL ^ E_NOTICE) {
Dries Buytaert's avatar
   
Dries Buytaert committed
87
    watchdog("error", $types[$errno] .": $message in $filename on line $line.");
88
    print "<pre>$entry</pre>";
Dries Buytaert's avatar
   
Dries Buytaert committed
89
90
91
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
92
function watchdog($type, $message, $link = NULL) {
Dries Buytaert's avatar
   
Dries Buytaert committed
93
  global $user;
Dries Buytaert's avatar
   
Dries Buytaert committed
94
  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());
Dries Buytaert's avatar
   
Dries Buytaert committed
95
96
97
98
}

function throttle($type, $rate) {
  if (!user_access("access administration pages")) {
Dries Buytaert's avatar
   
Dries Buytaert committed
99
    if ($throttle = db_fetch_object(db_query("SELECT * FROM {watchdog} WHERE type = '$type' AND hostname = '". getenv("REMOTE_ADDR") ."' AND ". time() ." - timestamp < $rate"))) {
Dries Buytaert's avatar
   
Dries Buytaert committed
100
101
102
103
104
105
106
107
108
      watchdog("warning", "throttle: '". getenv("REMOTE_ADDR") ."' exceeded submission rate - $throttle->type");
      die(message_throttle());
    }
    else {
      watchdog($type, "throttle");
    }
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
109
110
111
112
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);
Dries Buytaert's avatar
   
Dries Buytaert committed
113
114
115
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
116
117
118
119
120
121
122
123
124
125
126
127
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;
}

Dries Buytaert's avatar
   
Dries Buytaert committed
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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;
}

Dries Buytaert's avatar
   
Dries Buytaert committed
156
function message_access() {
Dries Buytaert's avatar
   
Dries Buytaert committed
157
  return t("You are not authorized to access this page.");
Dries Buytaert's avatar
   
Dries Buytaert committed
158
159
160
161
162
163
164
165
166
167
}

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.");
}

Dries Buytaert's avatar
   
Dries Buytaert committed
168
169
function locale_init() {
  global $languages, $user;
Dries Buytaert's avatar
   
Dries Buytaert committed
170
171
172
173
174
175
  if ($user->uid && $languages[$user->language]) {
    return $user->language;
  }
  else {
    return key($languages);
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
176
177
}

Dries Buytaert's avatar
   
Dries Buytaert committed
178
function t($string, $args = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
179
  global $languages;
180

Dries Buytaert's avatar
   
Dries Buytaert committed
181
182
183
184
185
186
187
  /*
  ** 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
Dries Buytaert's avatar
   
Dries Buytaert committed
188
189
  **           account</a> before viewing the next page.", array("%url"
  **           => url("user/register")));
Dries Buytaert's avatar
   
Dries Buytaert committed
190
191
  */

192
  $string = ($languages && module_exist("locale") ? locale($string) : $string);
193

Dries Buytaert's avatar
   
Dries Buytaert committed
194
195
  if (!$args) {
    return $string;
Kjartan Mannes's avatar
Kjartan Mannes committed
196
197
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
198
199
    return strtr($string, $args);
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
200
201
}

Dries Buytaert's avatar
   
Dries Buytaert committed
202
function drupal_specialchars($input, $quotes = ENT_NOQUOTES) {
Dries Buytaert's avatar
   
Dries Buytaert committed
203
204
205
206
207
208
209
210
211

  /*
  ** 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);
Dries Buytaert's avatar
   
Dries Buytaert committed
212
213
}

214
215
216
217
218
219
/**
 * 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
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
220
function valid_email_address($mail) {
221
222
223
224
225
226
227
228
229
230
231
232
233
  $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;
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
234
235
236
237
238
239
240
/**
 * Verify the syntax of the given URL.
 *
 * @param $url  an URL
 */
function valid_url($url) {

Dries Buytaert's avatar
   
Dries Buytaert committed
241
  if (preg_match("/^[a-zA-z0-9\/:_\-_\.,]+$/", $url)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
242
243
244
245
246
247
248
    return 1;
  }
  else {
    return 0;
  }
}

Kjartan Mannes's avatar
Kjartan Mannes committed
249
250
251
252
/**
 * Format a single result entry of a search query:
 *
 * @param $item  a single search result as returned by <module>_search of type
Dries Buytaert's avatar
   
Dries Buytaert committed
253
 *               array("count" => ..., "link" => ..., "title" => ...,
Kjartan Mannes's avatar
Kjartan Mannes committed
254
255
256
 *               "user" => ..., "date" => ..., "keywords" => ...)
 * @param $type  module type of this item
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
257
function search_item($item, $type) {
Dries Buytaert's avatar
   
Dries Buytaert committed
258
259
260
261
262
263
264
265
266
267

  /*
  ** 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 {
Dries Buytaert's avatar
   
Dries Buytaert committed
268
    $output .= " <b><u><a href=\"". $item["link"] ."\">". $item["title"] ."</a></u></b><br />";
Dries Buytaert's avatar
   
Dries Buytaert committed
269
    $output .= " <small>" . t($type) . ($item["user"] ? " - ". $item["user"] : "") ."". ($item["date"] ? " - ". format_date($item["date"], "small") : "") ."</small>";
Dries Buytaert's avatar
   
Dries Buytaert committed
270
271
    $output .= "<br /><br />";
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
272
273
274
275

  return $output;
}

Kjartan Mannes's avatar
Kjartan Mannes committed
276
277
278
279
/**
 * Render a generic search form.
 *
 * "Generic" means "universal usable" - that is, usable not only from
Dries Buytaert's avatar
   
Dries Buytaert committed
280
 * 'site.com/search', but also as a simple seach box (without
Dries Buytaert's avatar
   
Dries Buytaert committed
281
282
 * "Restrict search to", help text, etc) from theme's header etc.
 * This means: provide options to only conditionally render certain
Kjartan Mannes's avatar
Kjartan Mannes committed
283
284
 * parts of this form.
 *
Dries Buytaert's avatar
   
Dries Buytaert committed
285
 * @param $action  Form action. Defaults to 'site.com/search'.
Dries Buytaert's avatar
   
Dries Buytaert committed
286
 * @param $keys   string containing keywords for the search.
Dries Buytaert's avatar
   
Dries Buytaert committed
287
 * @param $options != 0: Render additional form fields/text
Kjartan Mannes's avatar
Kjartan Mannes committed
288
289
 *                 ("Restrict search to", help text, etc).
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
290
function search_form($action = NULL, $keys = NULL, $options = NULL) {
Dries Buytaert's avatar
   
Dries Buytaert committed
291
292

  if (!$action) {
Dries Buytaert's avatar
   
Dries Buytaert committed
293
    $action = url("search");
Dries Buytaert's avatar
   
Dries Buytaert committed
294
295
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
296
297
  $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";
Dries Buytaert's avatar
   
Dries Buytaert committed
298
299
300
301
302
303
304

  if ($options != 0) {
    $output .= "<br />";
    $output .= t("Restrict search to") .": ";

    foreach (module_list() as $name) {
      if (module_hook($name, "search")) {
Kjartan Mannes's avatar
Kjartan Mannes committed
305
        $output .= " <input type=\"checkbox\" name=\"edit[type][$name]\" ". ($edit["type"][$name] ? " checked=\"checked\"" : "") ." /> ". t($name);
Dries Buytaert's avatar
   
Dries Buytaert committed
306
307
308
309
      }
    }
  }

Kjartan Mannes's avatar
Kjartan Mannes committed
310
311
  $form .= "<br />";

Dries Buytaert's avatar
   
Dries Buytaert committed
312
313
314
315
  return form($output, "post", $action);
}

/*
Kjartan Mannes's avatar
Kjartan Mannes committed
316
317
 * Collect the search results:
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
318
function search_data($keys = NULL) {
Dries Buytaert's avatar
   
Dries Buytaert committed
319
320

  $edit = $_POST["edit"];
Dries Buytaert's avatar
   
Dries Buytaert committed
321

Dries Buytaert's avatar
   
Dries Buytaert committed
322
  if (isset($keys)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
323
    foreach (module_list() as $name) {
Dries Buytaert's avatar
   
Dries Buytaert committed
324
      if (module_hook($name, "search") && (!$edit["type"] || $edit["type"][$name]) && ($result = module_invoke($name, "search", $keys))) {
Kjartan Mannes's avatar
Kjartan Mannes committed
325
        if ($name == "node" || $name == "comment") {
Dries Buytaert's avatar
   
Dries Buytaert committed
326
          $output .= "<p><b>". t("Matching ". $name ."s ranked in order of relevance") .":</b></p>";
Kjartan Mannes's avatar
Kjartan Mannes committed
327
328
        }
        else {
Dries Buytaert's avatar
   
Dries Buytaert committed
329
          $output .= "<p><b>". t("Matching ". $name ."s") .":</b></p>";
Kjartan Mannes's avatar
Kjartan Mannes committed
330
        }
Dries Buytaert's avatar
   
Dries Buytaert committed
331
332
333
334
335
336
337
338
339
340
        foreach ($result as $entry) {
          $output .= search_item($entry, $name);
        }
      }
    }
  }

  return $output;
}

Kjartan Mannes's avatar
Kjartan Mannes committed
341
342
343
/**
 * Display the search form and the resulting data.
 *
Dries Buytaert's avatar
   
Dries Buytaert committed
344
 * @param $type    If set, search only nodes of this type.
Kjartan Mannes's avatar
Kjartan Mannes committed
345
 *                 Otherwise, search all types.
Dries Buytaert's avatar
   
Dries Buytaert committed
346
 * @param $action  Form action. Defaults to 'site.com/search'.
Kjartan Mannes's avatar
Kjartan Mannes committed
347
 * @param $query   Query string. Defaults to global $keys.
Dries Buytaert's avatar
   
Dries Buytaert committed
348
 * @param $options != 0: Render additional form fields/text
Kjartan Mannes's avatar
Kjartan Mannes committed
349
350
 *                 ("Restrict search to", help text, etc).
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
351
function search_type($type, $action = NULL, $keys = NULL, $options = NULL) {
Dries Buytaert's avatar
   
Dries Buytaert committed
352

Dries Buytaert's avatar
   
Dries Buytaert committed
353
  $_POST["edit"]["type"][$type] = "on";
Dries Buytaert's avatar
   
Dries Buytaert committed
354

Dries Buytaert's avatar
   
Dries Buytaert committed
355
  return search_form($action, $keys, $options) . "<br />". search_data($keys);
Dries Buytaert's avatar
   
Dries Buytaert committed
356
357
}

Dries Buytaert's avatar
   
Dries Buytaert committed
358

Dries Buytaert's avatar
   
Dries Buytaert committed
359
360
function drupal_goto($url) {

Dries Buytaert's avatar
   
Dries Buytaert committed
361
362
363
  /*
  ** Translate &amp; to simply &
  */
Dries Buytaert's avatar
   
Dries Buytaert committed
364

Dries Buytaert's avatar
   
Dries Buytaert committed
365
  $url = str_replace("&amp;", "&", $url);
Dries Buytaert's avatar
   
Dries Buytaert committed
366

Dries Buytaert's avatar
   
Dries Buytaert committed
367
368
369
370
371
  /*
  ** 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".
  */
Dries Buytaert's avatar
   
Dries Buytaert committed
372
  if (!ini_get("session.use_trans_sid") || !session_id() || strstr($url, session_id())) {
Dries Buytaert's avatar
   
Dries Buytaert committed
373
374
375
    header("Location: $url");
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
376
377
378
379
380
381
382
383
    $sid = session_name() . "=" . session_id();

    if (strstr($url, "?") && !strstr($url, $sid)) {
      header("Location: $url&". $sid);
    }
    else {
      header("Location: $url?". $sid);
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
384
385
386
387
  }

  /*
  ** The "Location" header sends a REDIRECT status code to the http
Dries Buytaert's avatar
   
Dries Buytaert committed
388
  ** daemon.  In some cases this can go wrong, so we make sure none
Dries Buytaert's avatar
   
Dries Buytaert committed
389
390
391
392
393
394
  ** of the code /below/ gets executed when we redirect.
  */

  exit();
}

Dries Buytaert's avatar
   
Dries Buytaert committed
395
function valid_input_data($data) {
396

397
  if (is_array($data) || is_object($data)) {
398
399
400
401
402
    /*
    ** Form data can contain a number of nested arrays.
    */

    foreach ($data as $key => $value) {
Dries Buytaert's avatar
   
Dries Buytaert committed
403
404
405
      if (!valid_input_data($value)) {
        return 0;
      }
406
407
408
409
410
411
412
    }
  }
  else {
    /*
    ** Detect evil input data.
    */

Dries Buytaert's avatar
Dries Buytaert committed
413
    // check strings:
Dries Buytaert's avatar
Dries Buytaert committed
414
    $match  = preg_match("/\Wjavascript\s*:/i", $data);
Dries Buytaert's avatar
Dries Buytaert committed
415
416
417
    $match += preg_match("/\Wexpression\s*\(/i", $data);
    $match += preg_match("/\Walert\s*\(/i", $data);

418
    // check attributes:
Dries Buytaert's avatar
Dries Buytaert committed
419
    $match += preg_match("/\W(dynsrc|datasrc|data|lowsrc|on[a-z]+)\s*=[^>]+?>/i", $data);
Dries Buytaert's avatar
   
Dries Buytaert committed
420

421
422

    // check tags:
Dries Buytaert's avatar
   
Dries Buytaert committed
423
    $match += preg_match("/<\s*(applet|script|object|style|embed|form|blink|meta|html|frame|iframe|layer|ilayer|head|frameset|xml)/i", $data);
424
425
426

    if ($match) {
      watchdog("warning", "terminated request because of suspicious input data: ". drupal_specialchars($data));
Dries Buytaert's avatar
   
Dries Buytaert committed
427
      return 0;
428
429
    }
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
430
431

  return 1;
432
}
Dries Buytaert's avatar
   
Dries Buytaert committed
433

Dries Buytaert's avatar
   
Dries Buytaert committed
434
function check_form($text) {
Dries Buytaert's avatar
   
Dries Buytaert committed
435
  return drupal_specialchars($text, ENT_QUOTES);
Dries Buytaert's avatar
   
Dries Buytaert committed
436
437
438
}

function filter($text) {
Dries Buytaert's avatar
   
Dries Buytaert committed
439

Dries Buytaert's avatar
   
Dries Buytaert committed
440
441
442
443
444
445
446
447
448
449
450
451
452
  $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") {
Dries Buytaert's avatar
   
Dries Buytaert committed
453
454
455
456
457
      $text = module_invoke($name, "filter", $text);
    }
  }

  return $text;
Dries Buytaert's avatar
   
Dries Buytaert committed
458
459
}

Dries Buytaert's avatar
   
Dries Buytaert committed
460
461
function rewrite_old_urls($text) {

Dries Buytaert's avatar
   
Dries Buytaert committed
462
463
464
465
  global $base_url;

  $end = substr($base_url, 12);

Dries Buytaert's avatar
   
Dries Buytaert committed
466
467
468
  /*
  ** This is a *temporary* filter to rewrite old-style URLs to new-style
  ** URLs (clean URLs).  Currently, URLs are being rewritten dynamically
Dries Buytaert's avatar
   
Dries Buytaert committed
469
470
  ** (ie. "on output"), however when these rewrite rules have been tested
  ** enough, we will use them to permanently rewrite the links in node
Dries Buytaert's avatar
   
Dries Buytaert committed
471
472
473
  ** and comment bodies.
  */

Dries Buytaert's avatar
   
Dries Buytaert committed
474
  if (variable_get("clean_url", "0") == "0") {
Dries Buytaert's avatar
   
Dries Buytaert committed
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
    /*
    ** 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:
    */

Dries Buytaert's avatar
   
Dries Buytaert committed
491
    // rewrite 'node.php?id=<number>[&cid=<number>]' style URLs:
Dries Buytaert's avatar
   
Dries Buytaert committed
492
    $text = eregi_replace("$end/(node)\.php\?id=([[:digit:]]+)(&cid=)?([[:digit:]]*)", "$end/?q=\\1/view/\\2/\\4", $text);
Dries Buytaert's avatar
   
Dries Buytaert committed
493

Dries Buytaert's avatar
   
Dries Buytaert committed
494
    // rewrite 'module.php?mod=<name>{&<op>=<value>}' style URLs:
Dries Buytaert's avatar
   
Dries Buytaert committed
495
496
497
    $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);
Dries Buytaert's avatar
   
Dries Buytaert committed
498
499
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
500
501
502
503
    /*
    ** Relative URLs:
    */

Dries Buytaert's avatar
   
Dries Buytaert committed
504
    // rewrite 'node.php?id=<number>[&cid=<number>]' style URLs:
Dries Buytaert's avatar
   
Dries Buytaert committed
505
    $text = eregi_replace("\"(node)\.php\?id=([[:digit:]]+)(&cid=)?([[:digit:]]*)", "\"\\1/view/\\2/\\4", $text);
Dries Buytaert's avatar
   
Dries Buytaert committed
506
507

    // rewrite 'module.php?mod=<name>{&<op>=<value>}' style URLs:
Dries Buytaert's avatar
   
Dries Buytaert committed
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
    $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);
}
Dries Buytaert's avatar
   
Dries Buytaert committed
524

Dries Buytaert's avatar
   
Dries Buytaert committed
525
526
527
  return $text;
}

Dries Buytaert's avatar
   
Dries Buytaert committed
528
function check_output($text) {
Dries Buytaert's avatar
   
Dries Buytaert committed
529
  if (isset($text)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
530
531
532
533
    // filter content on output:
    $text = filter($text);

    // get the line breaks right:
Dries Buytaert's avatar
   
Dries Buytaert committed
534
    if (strip_tags($text, "<a><i><b><u><tt><code><cite><strong><img>") == $text) {
Dries Buytaert's avatar
   
Dries Buytaert committed
535
536
537
538
539
540
541
542
      $text = nl2br($text);
    }
  }
  else {
    $text = message_na();
  }

  return $text;
Dries Buytaert's avatar
   
Dries Buytaert committed
543
544
}

545

546
547
function check_file($filename) {
  return is_uploaded_file($filename);
Dries Buytaert's avatar
   
Dries Buytaert committed
548
549
}

Dries Buytaert's avatar
   
Dries Buytaert committed
550
551
552
function format_rss_channel($title, $link, $description, $items, $language = "en", $args = array()) {
  // arbitrary elements may be added using the $args associative array

Dries Buytaert's avatar
   
Dries Buytaert committed
553
  $output .= "<channel>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
554
555
556
557
  $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";
Dries Buytaert's avatar
   
Dries Buytaert committed
558
  foreach ($args as $key => $value) {
Dries Buytaert's avatar
   
Dries Buytaert committed
559
    $output .= " <$key>". drupal_specialchars(strip_tags($value)) ."</$key>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
560
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
561
562
563
564
565
566
  $output .= $items;
  $output .= "</channel>\n";

  return $output;
}

Dries Buytaert's avatar
   
Dries Buytaert committed
567
568
569
function format_rss_item($title, $link, $description, $args = array()) {
  // arbitrary elements may be added using the $args associative array

Dries Buytaert's avatar
   
Dries Buytaert committed
570
  $output .= "<item>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
571
572
573
  $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";
Dries Buytaert's avatar
   
Dries Buytaert committed
574
  foreach ($args as $key => $value) {
Dries Buytaert's avatar
   
Dries Buytaert committed
575
    $output .= "<$key>". drupal_specialchars(strip_tags($value)) ."</$key>";
Dries Buytaert's avatar
   
Dries Buytaert committed
576
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
577
578
579
580
581
  $output .= "</item>\n";

  return $output;
}

Dries Buytaert's avatar
   
Dries Buytaert committed
582
583
584
585
586
587
588
589
590
591
592
593
594
595
/**
 * 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".
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
596
function format_plural($count, $singular, $plural) {
Dries Buytaert's avatar
   
Dries Buytaert committed
597
  return t($count == 1 ? $singular : $plural, array("%count" => $count));
Dries Buytaert's avatar
   
Dries Buytaert committed
598
599
600
}

function format_size($size) {
Dries Buytaert's avatar
   
Dries Buytaert committed
601
  $suffix = t("bytes");
Dries Buytaert's avatar
   
Dries Buytaert committed
602
603
  if ($size > 1024) {
    $size = round($size / 1024, 2);
Dries Buytaert's avatar
   
Dries Buytaert committed
604
    $suffix = t("KB");
Dries Buytaert's avatar
   
Dries Buytaert committed
605
606
607
  }
  if ($size > 1024) {
    $size = round($size / 1024, 2);
Dries Buytaert's avatar
   
Dries Buytaert committed
608
    $suffix = t("MB");
Dries Buytaert's avatar
   
Dries Buytaert committed
609
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
610
  return t("%size %suffix", array("%size" => $size, "%suffix" => $suffix));
Dries Buytaert's avatar
   
Dries Buytaert committed
611
612
613
}

function format_interval($timestamp) {
Dries Buytaert's avatar
   
Dries Buytaert committed
614
  $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);
Kjartan Mannes's avatar
Kjartan Mannes committed
615
  foreach ($units as $key=>$value) {
Dries Buytaert's avatar
   
Dries Buytaert committed
616
617
618
619
620
621
    $key = explode("|", $key);
    if ($timestamp >= $value) {
      $output .= ($output ? " " : "") . format_plural(floor($timestamp / $value), $key[0], $key[1]);
      $timestamp %= $value;
    }
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
622
  return ($output) ? $output : t("0 sec");
Dries Buytaert's avatar
   
Dries Buytaert committed
623
624
625
626
627
}

function format_date($timestamp, $type = "medium", $format = "") {
  global $user;

Kjartan Mannes's avatar
Kjartan Mannes committed
628
  $timestamp += ($user->timezone) ? $user->timezone - date("Z") : 0;
Dries Buytaert's avatar
   
Dries Buytaert committed
629
630
631

  switch ($type) {
    case "small":
Dries Buytaert's avatar
   
Dries Buytaert committed
632
      $format = variable_get("date_format_short", "m/d/Y - H:i");
Dries Buytaert's avatar
   
Dries Buytaert committed
633
634
      break;
    case "large":
Dries Buytaert's avatar
   
Dries Buytaert committed
635
      $format = variable_get("date_format_long", "l, F j, Y - H:i");
Dries Buytaert's avatar
   
Dries Buytaert committed
636
637
      break;
    case "custom":
Dries Buytaert's avatar
   
Dries Buytaert committed
638
      // No change to format
Dries Buytaert's avatar
   
Dries Buytaert committed
639
      break;
Dries Buytaert's avatar
   
Dries Buytaert committed
640
    case "medium":
Dries Buytaert's avatar
   
Dries Buytaert committed
641
    default:
Dries Buytaert's avatar
   
Dries Buytaert committed
642
643
644
645
646
647
648
649
650
651
652
653
654
      $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;
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
655
656
657
658
659
660
661
  }
  return $date;
}

function format_name($object) {

  if ($object->uid && $object->name) {
662
663
664
665
666
667
668
669
670
671
672
673
    /*
    ** 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;
    }

Dries Buytaert's avatar
   
Dries Buytaert committed
674
    if (arg(0) == "admin") {
675
      $output = l($name, "admin/user/edit/$object->uid", array("title" => t("Administer user profile.")));
Dries Buytaert's avatar
   
Dries Buytaert committed
676
677
    }
    else {
678
      $output = l($name, "user/view/$object->uid", array("title" => t("View user profile.")));
Dries Buytaert's avatar
   
Dries Buytaert committed
679
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
680
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
681
682
683
684
685
686
687
688
689
690
  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;
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
691
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
692
    $output = t(variable_get("anonymous", "Anonymous"));
Dries Buytaert's avatar
   
Dries Buytaert committed
693
694
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
695
  return $output;
Dries Buytaert's avatar
   
Dries Buytaert committed
696
697
698
}

function form($form, $method = "post", $action = 0, $options = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
699
700

  if (!$action) {
701
    $action = request_uri();
Dries Buytaert's avatar
   
Dries Buytaert committed
702
  }
703
  return "<form action=\"$action\" method=\"$method\"". drupal_attributes($options) .">\n$form\n</form>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
704
705
706
}

function form_item($title, $value, $description = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
707
  return theme("form_element", $title, $value, $description);
Dries Buytaert's avatar
   
Dries Buytaert committed
708
}
Dries Buytaert's avatar
   
Dries Buytaert committed
709

Dries Buytaert's avatar
   
Dries Buytaert committed
710
711
712
function form_group($legend, $group, $description = 0) {
  return "<fieldset>" . ($legend ? "<legend>$legend</legend>" : "") . $group . ($description ? "<div class=\"description\">$description</div>" : "") . "</fieldset>\n";
}
Dries Buytaert's avatar
   
Dries Buytaert committed
713

714
function form_radio($title, $name, $value = 1, $checked = 0, $description = 0, $attributes = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
715
  return theme("form_element", 0, "<input type=\"radio\" class=\"form-radio\" name=\"edit[$name]\" value=\"". $value ."\"". ($checked ? " checked=\"checked\"" : "") . drupal_attributes($attributes) ." /> $title", $description);
Dries Buytaert's avatar
   
Dries Buytaert committed
716
717
}

718
function form_checkbox($title, $name, $value = 1, $checked = 0, $description = 0, $attributes = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
719
  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);
Dries Buytaert's avatar
   
Dries Buytaert committed
720
721
}

722
function form_textfield($title, $name, $value, $size, $maxlength, $description = 0, $attributes = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
723
  $size = $size ? " size=\"$size\"" : "";
Dries Buytaert's avatar
   
Dries Buytaert committed
724
  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);
Dries Buytaert's avatar
   
Dries Buytaert committed
725
726
}

727
function form_password($title, $name, $value, $size, $maxlength, $description = 0, $attributes = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
728
  $size = $size ? " size=\"$size\"" : "";
Dries Buytaert's avatar
   
Dries Buytaert committed
729
  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);
Dries Buytaert's avatar
   
Dries Buytaert committed
730
731
}

732
function form_textarea($title, $name, $value, $cols, $rows, $description = 0, $attributes = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
733
  $cols = $cols ? " cols=\"$cols\"" : "";
Dries Buytaert's avatar
   
Dries Buytaert committed
734
  module_invoke_all("textarea", $name);  // eg. optionally plug in a WYSIWYG editor
Dries Buytaert's avatar
   
Dries Buytaert committed
735
  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);
Dries Buytaert's avatar
   
Dries Buytaert committed
736
737
}

Dries Buytaert's avatar
   
Dries Buytaert committed
738
function form_select($title, $name, $value, $options, $description = 0, $extra = 0, $multiple = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
739
  if (count($options) > 0) {
Kjartan Mannes's avatar
Kjartan Mannes committed
740
    foreach ($options as $key=>$choice) {
741
      $select .= "<option value=\"$key\"". (is_array($value) ? (in_array($key, $value) ? " selected=\"selected\"" : "") : ($value == $key ? " selected=\"selected\"" : "")) .">". check_form($choice) ."</option>";
Dries Buytaert's avatar
   
Dries Buytaert committed
742
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
743
    return theme("form_element", $title, "<select name=\"edit[$name]". ($multiple ? "[]" : "") ."\"". ($multiple ? " multiple " : "") . ($extra ? " $extra" : "") .">$select</select>", $description);
Dries Buytaert's avatar
   
Dries Buytaert committed
744
745
746
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
747
748
749
750
751
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));
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
752
    return theme("form_element", $title, $output, $description);
Dries Buytaert's avatar
   
Dries Buytaert committed
753
754
755
  }
}

756
function form_file($title, $name, $size, $description = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
757
  return theme("form_element", $title, "<input type=\"file\" class=\"form-file\" name=\"edit[$name]\" size=\"$size\" />\n", $description);
Dries Buytaert's avatar
   
Dries Buytaert committed
758
759
760
761
762
763
}

function form_hidden($name, $value) {
  return "<input type=\"hidden\" name=\"edit[$name]\" value=\"". check_form($value) ."\" />\n";
}

764
function form_submit($value, $name = "op", $attributes = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
765
  return "<input type=\"submit\" class=\"form-submit\" name=\"$name\" value=\"". check_form($value) ."\" />\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
766
767
}

Dries Buytaert's avatar
   
Dries Buytaert committed
768
function form_weight($title = NULL, $name = "weight", $value = 0, $delta = 10, $description = 0, $extra = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
769
  for ($n = (-1 * $delta); $n <= $delta; $n++) {
Dries Buytaert's avatar
   
Dries Buytaert committed
770
771
772
773
774
775
    $weights[$n] = $n;
  }

  return form_select($title, $name, $value, $weights, $description, $extra);
}

Dries Buytaert's avatar
   
Dries Buytaert committed
776
777
778
779
function form_allowed_tags_text() {
  return variable_get("allowed_html", "") ? (t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", ""))) : "";
}

Dries Buytaert's avatar
   
Dries Buytaert committed
780
781
782
/**
 * Given an old url, return the alias.
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
783
784
function drupal_get_path_alias($path) {
  $map = drupal_get_path_map();
Dries Buytaert's avatar
   
Dries Buytaert committed
785

Dries Buytaert's avatar
   
Dries Buytaert committed
786
787
788
  if ($map) {
    return array_search($path, $map);
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
789
790
791
}

/**
Dries Buytaert's avatar
   
Dries Buytaert committed
792
 * Given an alias, return the default url.
Dries Buytaert's avatar
   
Dries Buytaert committed
793
 */
Dries Buytaert's avatar
   
Dries Buytaert committed
794
795
function drupal_get_normal_path($path) {
  $map = drupal_get_path_map();
Dries Buytaert's avatar
   
Dries Buytaert committed
796
797
798
  return $map[$path];
}

Dries Buytaert's avatar
   
Dries Buytaert committed
799
function url($url = NULL, $query = NULL) {
Dries Buytaert's avatar
   
Dries Buytaert committed
800
  global $base_url;
Dries Buytaert's avatar
   
Dries Buytaert committed
801

Dries Buytaert's avatar
   
Dries Buytaert committed
802
803
804
805
806
807
808
809
810
811
812
  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" : "";
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
813
  if ($alias = drupal_get_path_alias($url)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
814
815
816
    $url = $alias;
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
817
  if (variable_get("clean_url", "0") == "0") {
Dries Buytaert's avatar
   
Dries Buytaert committed
818
819
    if (isset($url)) {
      if (isset($query)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
820
        return "$base_url/$script?q=$url&amp;$query";
Dries Buytaert's avatar
   
Dries Buytaert committed
821
822
      }
      else {
Dries Buytaert's avatar
   
Dries Buytaert committed
823
        return "$base_url/$script?q=$url";
Dries Buytaert's avatar
   
Dries Buytaert committed
824
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
825
826
    }
    else {
Dries Buytaert's avatar
   
Dries Buytaert committed
827
      if (isset($query)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
828
        return "$base_url/$script?$query";
Dries Buytaert's avatar
   
Dries Buytaert committed
829
830
      }
      else {
Dries Buytaert's avatar
   
Dries Buytaert committed
831
        return "$base_url/";
Dries Buytaert's avatar
   
Dries Buytaert committed
832
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
833
834
835
    }
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
836
837
    if (isset($url)) {
      if (isset($query)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
838
        return "$base_url/$url?$query";
Dries Buytaert's avatar
   
Dries Buytaert committed
839
840
      }
      else {
Dries Buytaert's avatar
   
Dries Buytaert committed
841
        return "$base_url/$url";
Dries Buytaert's avatar
   
Dries Buytaert committed
842
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
843
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
844
    else {
Dries Buytaert's avatar
   
Dries Buytaert committed
845
      if (isset($query)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
846
        return "$base_url/$script?$query";
Dries Buytaert's avatar
   
Dries Buytaert committed
847
848
      }
      else {
Dries Buytaert's avatar
   
Dries Buytaert committed
849
        return "$base_url/";
Dries Buytaert's avatar
   
Dries Buytaert committed
850
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
851
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
852
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
853
854
}

855
856
857
858
859
860
861
function drupal_attributes($attributes = 0) {
  if (is_array($attributes)) {
    $t = array();
    foreach ($attributes as $key => $value) {
      $t[] = "$key=\"$value\"";
    }
    return " ". implode($t, " ");
Dries Buytaert's avatar
   
Dries Buytaert committed
862
  }
863
}
Dries Buytaert's avatar
   
Dries Buytaert committed
864

865
866
function l($text, $url, $attributes = array(), $query = NULL) {
  return "<a href=\"". url($url, $query) ."\"". drupal_attributes($attributes) .">$text</a>";
Dries Buytaert's avatar
   
Dries Buytaert committed
867
868
}

Dries Buytaert's avatar
   
Dries Buytaert committed
869
function field_get($string, $name) {
870
  ereg(",?$name=([^,]+)", ", $string", $regs);
Dries Buytaert's avatar
   
Dries Buytaert committed
871
872
873
874
875
  return $regs[1];
}

function field_set($string, $name, $value) {
  $rval = ereg_replace(",$name=[^,]+", "", ",$string");
Dries Buytaert's avatar
   
Dries Buytaert committed
876
  if (isset($value)) {
Kjartan Mannes's avatar
Kjartan Mannes committed
877
878
    $rval .= ($rval == "," ? "" : ",") ."$name=$value";
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
879
880
881
882
  return substr($rval, 1);
}

function link_page() {
883
  global $custom_links;
Dries Buytaert's avatar
   
Dries Buytaert committed
884

885
  if (is_array($custom_links)) {
886
887
888
    return $custom_links;
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
889
    $links = module_invoke_all("link", "page");
890
    array_unshift($links, l(t("home"), "", array("title" => t("Return to the main page."))));
891
    return $links;
Dries Buytaert's avatar
   
Dries Buytaert committed
892
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
893
}
Dries Buytaert's avatar
   
Dries Buytaert committed
894
895

function link_node($node, $main = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
896
  return module_invoke_all("link", "node", $node, $main);
Dries Buytaert's avatar
   
Dries Buytaert committed
897
898
}

Dries Buytaert's avatar
   
Dries Buytaert committed
899
function drupal_page_footer() {
Dries Buytaert's avatar
   
Dries Buytaert committed
900
  if (variable_get("cache", 0)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
901
    page_set_cache();
Dries Buytaert's avatar
   
Dries Buytaert committed
902
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
903

Dries Buytaert's avatar
   
Dries Buytaert committed
904
905
906
907
908
  /*
  ** A hook for modules where modules may take action at the end of a
  ** request good uses include setting a cache, page logging, etc.
  */

Dries Buytaert's avatar
   
Dries Buytaert committed
909
  module_invoke_all("exit");
Dries Buytaert's avatar
   
Dries Buytaert committed
910
911
912
}

include_once "includes/theme.inc";
Dries Buytaert's avatar
   
Dries Buytaert committed
913
include_once "includes/pager.inc";
Dries Buytaert's avatar
   
Dries Buytaert committed
914
include_once "includes/menu.inc";
Dries Buytaert's avatar
   
Dries Buytaert committed
915
include_once "includes/xmlrpc.inc";
Dries Buytaert's avatar
   
Dries Buytaert committed
916
include_once "includes/tablesort.inc";
917

Dries Buytaert's avatar
   
Dries Buytaert committed
918
919
920
// set error handler:
set_error_handler("error_handler");

Dries Buytaert's avatar
   
Dries Buytaert committed
921
// spit out the correct charset http header
Dries Buytaert's avatar
   
Dries Buytaert committed
922
header("Content-Type: text/html; charset=utf-8");
Dries Buytaert's avatar
   
Dries Buytaert committed
923

Dries Buytaert's avatar
   
Dries Buytaert committed
924
925
// initialize the _GET["q"] prior to loading the modules and invoking their 'init' hook:
if (!empty($_GET["q"])) {
Dries Buytaert's avatar
   
Dries Buytaert committed
926
  if ($path = drupal_get_normal_path(trim($_GET["q"], "/"))) {
Dries Buytaert's avatar
   
Dries Buytaert committed
927
928
929
930
    $_GET["q"] = $path;
  }
}
else {
Dries Buytaert's avatar
   
Dries Buytaert committed
931
932
933
934
935
936
  if ($path = drupal_get_normal_path(variable_get("site_frontpage", "node"))) {
    $_GET["q"] = $path;
  }
  else {
    $_GET["q"] = variable_get("site_frontpage", "node");
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
937
938
}

Dries Buytaert's avatar
   
Dries Buytaert committed
939
940
941
// initialize installed modules:
module_init();

Dries Buytaert's avatar
   
Dries Buytaert committed
942
943
944
945
946
947
if (!user_access("bypass input data check")) {
  if (!valid_input_data($_REQUEST)) {
    die("terminated request because of suspicious input data");
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
948
949
950
951
// initialize localization system:
$locale = locale_init();

// initialize theme:
Dries Buytaert's avatar
   
Dries Buytaert committed
952
$theme = init_theme();
Dries Buytaert's avatar
   
Dries Buytaert committed
953

Dries Buytaert's avatar
   
Dries Buytaert committed
954
?>