includes/functions.php
changeset 953 323c4cd1aa37
parent 915 91f4da84966f
child 963 b572ce1114f1
--- a/includes/functions.php	Mon May 04 23:07:00 2009 -0400
+++ b/includes/functions.php	Tue May 05 00:10:26 2009 -0400
@@ -380,16 +380,7 @@
   global $db, $session, $paths, $template, $plugins; // Common objects
 
   $idata = RenderMan::strToPageID($page_id);
-  $page_id_key = $paths->nslist[ $idata[1] ] . $idata[0];
-  $page_id_key = sanitize_page_id($page_id_key);
-  $page_data = @$paths->pages[$page_id_key];
-  $title = ( isset($page_data['name']) ) ?
-    ( ( $page_data['namespace'] == 'Article' || !$show_ns ) ?
-      '' :
-      $paths->nslist[ $idata[1] ] )
-    . $page_data['name'] :
-    ( $show_ns ? $paths->nslist[$idata[1]] : '' ) . str_replace('_', ' ', dirtify_page_id( $idata[0] ) );
-  return $title;
+  return get_page_title_ns($idata[0], $idata[1]);
 }
 
 /**
@@ -402,19 +393,9 @@
 function get_page_title_ns($page_id, $namespace)
 {
   global $db, $session, $paths, $template, $plugins; // Common objects
-
-  $ns_prefix = ( isset($paths->nslist[ $namespace ]) ) ? $paths->nslist[ $namespace ] : $namespace . substr($paths->nslist['Special'], -1);
-  $page_id_key = $ns_prefix . $page_id;
-  if ( isPage($page_id_key) )
-  {
-    $page_data = $paths->pages[$page_id_key];
-  }
-  else
-  {
-    $page_data = array();
-  }
-  $title = ( isset($page_data['name']) ) ? $page_data['name'] : $ns_prefix . str_replace('_', ' ', dirtify_page_id( $page_id ) );
-  return $title;
+  
+  $ns = namespace_factory($page_id, $namespace);
+  return $ns->title;
 }
 
 /**
@@ -578,32 +559,24 @@
  * @return bool True if the page exists, false otherwise
  */
 
-function isPage($p) {
+function isPage($p)
+{
   global $db, $session, $paths, $template, $plugins; // Common objects
-
-  // Try the easy way first ;-)
-  if ( isset( $paths->pages[ $p ] ) )
-  {
-    return true;
-  }
-
-  // Special case for Special, Template, and Admin pages that can't have slashes in their URIs
-  $ns_test = RenderMan::strToPageID( $p );
-
-  if($ns_test[1] != 'Special' && $ns_test[1] != 'Template' && $ns_test[1] != 'Admin')
-  {
-    return false;
-  }
-
-  $particles = explode('/', $p);
-  if ( isset ( $paths->pages[ $particles[ 0 ] ] ) )
-  {
-    return true;
-  }
-  else
-  {
-    return false;
-  }
+  static $ispage_cache = array();
+  if ( isset($ispage_cache[$p]) )
+    return $ispage_cache[$p];
+  
+  list($page_id, $namespace) = RenderMan::strToPageID($p);
+  $cdata = $paths->get_cdata($page_id, $namespace);
+  if ( !isset($cdata['page_exists']) )
+  {
+    $class = ( class_exists($_ = "Namespace_$namespace") ) ? $_ : "Namespace_Default";
+    $page = new $class($page_id, $namespace);
+    return $page->exists();
+  }
+  
+  $ispage_cache[$p] = $cdata['page_exists'];
+  return $cdata['page_exists'];
 }
 
 /**
@@ -615,6 +588,13 @@
 
 function namespace_factory($page_id, $namespace, $revision_id = 0)
 {
+  global $db, $session, $paths, $template, $plugins; // Common objects
+  
+  static $objcache = array();
+  $pathskey = $paths->get_pathskey($page_id, $namespace) . ":$revision_id";
+  if ( isset($objcache[$pathskey]) )
+    return $objcache[$pathskey];
+  
   if ( !class_exists("Namespace_$namespace") )
   {
     if ( file_exists(ENANO_ROOT . "/includes/namespaces/" . strtolower($namespace) . ".php") )
@@ -626,11 +606,13 @@
   {
     $class = "Namespace_$namespace";
     $ns = new $class($page_id, $namespace, $revision_id);
+    $objcache[$pathskey] = $ns;
     return $ns;
   }
   else
   {
     $ns = new Namespace_Default($page_id, $namespace, $revision_id);
+    $objcache[$pathskey] = $ns;
     return $ns;
   }
 }
@@ -915,22 +897,7 @@
 
 function display_page_headers()
 {
-  global $db, $session, $paths, $template, $plugins; // Common objects
-  global $lang;
-  if($session->get_permissions('vote_reset') && $paths->cpage['delvotes'] > 0)
-  {
-    $delvote_ips = unserialize($paths->cpage['delvote_ips']);
-    $hr = htmlspecialchars(implode(', ', $delvote_ips['u']));
-    
-    $string_id = ( $paths->cpage['delvotes'] == 1 ) ? 'delvote_lbl_votes_one' : 'delvote_lbl_votes_plural';
-    $string = $lang->get($string_id, array('num_users' => $paths->cpage['delvotes']));
-    
-    echo '<div class="info-box" style="margin-left: 0; margin-top: 5px;" id="mdgDeleteVoteNoticeBox">
-            <b>' . $lang->get('etc_lbl_notice') . '</b> ' . $string . '<br />
-            <b>' . $lang->get('delvote_lbl_users_that_voted') . '</b> ' . $hr . '<br />
-            <a href="'.makeUrl($paths->page, 'do=deletepage').'" onclick="ajaxDeletePage(); return false;">' . $lang->get('delvote_btn_deletepage') . '</a>  |  <a href="'.makeUrl($paths->page, 'do=resetvotes').'" onclick="ajaxResetDelVotes(); return false;">' . $lang->get('delvote_btn_resetvotes') . '</a>
-          </div>';
-  }
+  // Deprecated.
 }
 
 /**
@@ -2362,8 +2329,11 @@
   $this_page = ceil ( $start / $perpage );
   $i = 0;
   
-  $paginator = generate_paginator($this_page, $num_pages, $result_url, $perpage, 0);
-  $out .= $paginator;
+  if ( $num_results > 0 )
+  {
+    $paginator = generate_paginator($this_page, $num_pages, $result_url, $perpage, 0);
+    $out .= $paginator;
+  }
 
   $cls = 'row2';
 
@@ -2386,7 +2356,7 @@
       {
         if ( isset($callers[$j]) )
         {
-          $tmp = ( is_callable($callers[$j]) ) ? @call_user_func($callers[$j], $val, $row) : $val;
+          $tmp = ( is_callable($callers[$j]) ) ? call_user_func($callers[$j], $val, $row) : $val;
 
           if ( is_string($tmp) )
           {
@@ -2401,7 +2371,8 @@
     $out .= $footer;
   }
 
-  $out .= $paginator;
+  if ( $num_results > 0 )
+    $out .= $paginator;
 
   return $out;
 }
@@ -2429,9 +2400,8 @@
   $this_page = ceil ( $start / $perpage );
 
   $paginator = generate_paginator($this_page, $num_pages, $result_url, $perpage, 0);
-  $out .= $paginator;
   
-  if ( $total > 1 )
+  if ( $num_results > 1 )
   {
     $out .= $paginator;
   }
@@ -2457,7 +2427,7 @@
     $out .= $footer;
   }
 
-  if ( $total > 1 )
+  if ( $num_results > 1 )
     $out .= $paginator;
 
   return $out;
@@ -4617,9 +4587,11 @@
  * Logs something in the profiler.
  * @param string Point name or message
  * @param bool Optional. If true (default), a backtrace will be generated and added to the profiler data. False disables this, often for security reasons.
+ * @param resource Optional. If specified, bases the time difference off of this event instead of the previous event/
+ * @return resource Event ID
  */
 
-function profiler_log($point, $allow_backtrace = true)
+function profiler_log($point, $allow_backtrace = true, $parent_event = false)
 {
   if ( !defined('ENANO_DEBUG') )
     return false;
@@ -4634,13 +4606,31 @@
       'point' => $point,
       'time' => microtime_float(),
       'backtrace' => $backtrace,
-      'mem' => false
+      'mem' => false,
+      'parent_event' => $parent_event
     );
   if ( function_exists('memory_get_usage') )
   {
     $_profiler[ count($_profiler) - 1 ]['mem'] = memory_get_usage();
   }
-  return true;
+  return count($_profiler) - 1;
+}
+
+/**
+ * Insert a message (an event without any time data) into the profiler.
+ * @param string Message
+ */
+
+function profiler_message($message)
+{
+  if ( !defined('ENANO_DEBUG') )
+    return false;
+  
+  global $_profiler;
+  
+  $_profiler[] = array(
+      'message' => $message,
+    );
 }
 
 /**
@@ -4676,6 +4666,17 @@
     // if ( $time_since_last < 0.01 )
     //   continue;
     
+    if ( isset($entry['message']) )
+    {
+      $html .= "<!-- ########################################################## -->\n<tr>\n  <th colspan=\"2\">Message $i</th>\n</tr>";
+      
+      $html .= '<tr>' . "\n";
+      $html .= '  <td class="row2">Message:</td>' . "\n";
+      $html .= '  <td class="row1">' . htmlspecialchars($entry['message']) . '</td>' . "\n";
+      $html .= '</tr>' . "\n";
+      continue;
+    }
+    
     $html .= "<!-- ########################################################## -->\n<tr>\n  <th colspan=\"2\">Event $i</th>\n</tr>";
     
     $html .= '<tr>' . "\n";
@@ -4690,15 +4691,25 @@
     $html .= '  <td class="row1">' . $time . 's</td>' . "\n";
     $html .= '</tr>' . "\n";
     
+    $time_label = 'Time since last event:';
+    if ( $entry['parent_event'] && is_int($entry['parent_event']) && isset($profile[$entry['parent_event']]) )
+    {
+      $time_last = $profile[$entry['parent_event']]['time'];
+      $time_label = "Time since event #{$entry['parent_event']}:";
+    }
+    
     $time = $entry['time'] - $time_last;
     if ( $time < 0.0001 )
-      $time = 'Marginal';
+      $time_html = 'Marginal';
     else
-      $time = "{$time}s";
+      $time_html = number_format($time, 6) . "s";
     
+    if ( $time > 0.02 )
+      $time_html = "<span style=\"background-color: #a00; padding: 4px; color: #fff; font-weight: bold;\">$time_html</span>";
+      
     $html .= '<tr>' . "\n";
-    $html .= '  <td class="row2">Time since last event:</td>' . "\n";
-    $html .= '  <td class="row1">' . $time . '</td>' . "\n";
+    $html .= '  <td class="row2">' . $time_label . '</td>' . "\n";
+    $html .= '  <td class="row1">' . $time_html . '</td>' . "\n";
     $html .= '</tr>' . "\n";
     
     if ( $entry['backtrace'] )
@@ -4903,6 +4914,7 @@
     $cache->purge('page_meta');
     $cache->purge('anon_sidebar');
     $cache->purge('plugins');
+    $cache->purge('wiki_edit_notice');
     
     $data_files = array(
         'aes_decrypt.php',