From 26ece5a719ce2b1307a6af5bcdef8b9177e0dff7 Mon Sep 17 00:00:00 2001
From: Andreas Gohr <andi@splitbrain.org>
Date: Sun, 26 Oct 2008 09:42:39 +0100
Subject: [PATCH] more placeholders for namespace templates

This patch adds a @FILE@ placeholder for namespace templates which is similar
to the @PAGE@ placeholder but keeps underscores intact. It also adds
placeholder to insert the page name with a first uppercase character, all words
uppercased or the whole string uppercased.

The utf8 library was enhanced with utf8_ucfirst and utf8_ucwords functions

darcs-hash:20081026084239-7ad00-1a4be6bb85280df025ca308d4ed2e50da1cbc9cf.gz
---
 inc/common.php | 41 ++++++++++++++++++++++++++++++-------
 inc/utf8.php   | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 89 insertions(+), 7 deletions(-)

diff --git a/inc/common.php b/inc/common.php
index d58eacb7a..9b284617b 100644
--- a/inc/common.php
+++ b/inc/common.php
@@ -824,13 +824,40 @@ function pageTemplate($data){
   if(!$tpl) return '';
 
   // replace placeholders
-  $tpl = str_replace('@ID@',$id,$tpl);
-  $tpl = str_replace('@NS@',getNS($id),$tpl);
-  $tpl = str_replace('@PAGE@',strtr(noNS($id),'_',' '),$tpl);
-  $tpl = str_replace('@USER@',$_SERVER['REMOTE_USER'],$tpl);
-  $tpl = str_replace('@NAME@',$INFO['userinfo']['name'],$tpl);
-  $tpl = str_replace('@MAIL@',$INFO['userinfo']['mail'],$tpl);
-  $tpl = str_replace('@DATE@',$conf['dformat'],$tpl);
+  $file = noNS($id);
+  $page = strtr($file,'_',' ');
+
+  $tpl = str_replace(array(
+                        '@ID@',
+                        '@NS@',
+                        '@FILE@',
+                        '@!FILE@',
+                        '@!FILE!@',
+                        '@PAGE@',
+                        '@!PAGE@',
+                        '@!!PAGE@',
+                        '@!PAGE!@',
+                        '@USER@',
+                        '@NAME@',
+                        '@MAIL@',
+                        '@DATE@',
+                     ),
+                     array(
+                        $id,
+                        getNS($id),
+                        $file,
+                        utf8_ucfirst($file),
+                        utf8_strtoupper($file),
+                        $page,
+                        utf8_ucfirst($page),
+                        utf8_ucwords($page),
+                        utf8_strtoupper($page),
+                        $_SERVER['REMOTE_USER'],
+                        $INFO['userinfo']['name'],
+                        $INFO['userinfo']['mail'],
+                        $conf['dformat'],
+                     ), $tpl);
+
   // we need the callback to work around strftime's char limit
   $tpl = preg_replace_callback('/%./',create_function('$m','return strftime($m[0]);'),$tpl);
 
diff --git a/inc/utf8.php b/inc/utf8.php
index d49b1413c..b0ffdb001 100644
--- a/inc/utf8.php
+++ b/inc/utf8.php
@@ -317,6 +317,61 @@ function utf8_strtoupper($string){
   return strtr($string,$UTF8_LOWER_TO_UPPER);
 }
 
+/**
+ * UTF-8 aware alternative to ucfirst
+ * Make a string's first character uppercase
+ *
+ * @author Harry Fuecks
+ * @param string
+ * @return string with first character as upper case (if applicable)
+ */
+function utf8_ucfirst($str){
+  switch ( utf8_strlen($str) ) {
+    case 0:
+        return '';
+    case 1:
+        return utf8_strtoupper($str);
+    default:
+        preg_match('/^(.{1})(.*)$/us', $str, $matches);
+        return utf8_strtoupper($matches[1]).$matches[2];
+  }
+}
+
+/**
+ * UTF-8 aware alternative to ucwords
+ * Uppercase the first character of each word in a string
+ *
+ * @author Harry Fuecks
+ * @param string
+ * @return string with first char of each word uppercase
+ * @see http://www.php.net/ucwords
+ */
+function utf8_ucwords($str) {
+  // Note: [\x0c\x09\x0b\x0a\x0d\x20] matches;
+  // form feeds, horizontal tabs, vertical tabs, linefeeds and carriage returns
+  // This corresponds to the definition of a "word" defined at http://www.php.net/ucwords
+  $pattern = '/(^|([\x0c\x09\x0b\x0a\x0d\x20]+))([^\x0c\x09\x0b\x0a\x0d\x20]{1})[^\x0c\x09\x0b\x0a\x0d\x20]*/u';
+
+  return preg_replace_callback($pattern, 'utf8_ucwords_callback',$str);
+}
+
+/**
+ * Callback function for preg_replace_callback call in utf8_ucwords
+ * You don't need to call this yourself
+ *
+ * @author Harry Fuecks
+ * @param array of matches corresponding to a single word
+ * @return string with first char of the word in uppercase
+ * @see utf8_ucwords
+ * @see utf8_strtoupper
+ */
+function utf8_ucwords_callback($matches) {
+  $leadingws = $matches[2];
+  $ucfirst = utf8_strtoupper($matches[3]);
+  $ucword = utf8_substr_replace(ltrim($matches[0]),$ucfirst,0,1);
+  return $leadingws . $ucword;
+}
+
 /**
  * Replace accented UTF-8 characters by unaccented ASCII-7 equivalents
  *
-- 
GitLab