[pmwiki-users] lowercase urls?

Kathryn Andersen kat_lists at katspace.homelinux.org
Fri Feb 16 02:14:46 CST 2007


On Fri, Feb 16, 2007 at 08:55:27AM +0100, SteP wrote:
> Hello, is there a way to make a PmWiki site accept lowercase urls for
> wiki words, i.e., 
> http://www.site.com/pmwiki/pmwiki.php?groupname/pagename for a true
> filepath of GroupName/PageName ? 

I recently tried to get this working, (with '_' as separators, and
everything in lowercase) but of course everything to do with Site and
PmWiki broke, so then I tried to make a "hybrid names" scheme, where one
could designate a group to have "classic" naming or new naming.  That
sort of worked, but didn't play well with Cluster, so I gave up.

I'll attach the script I came up with, just in case anyone else wants to
pursue this.

Kathryn Andersen
-- 
 _--_|\     | Kathryn Andersen	<http://www.katspace.com>
/      \    | 
\_.--.*/    | GenFicCrit mailing list <http://www.katspace.com/gen_fic_crit/>
      v     | 
------------| Melbourne -> Victoria -> Australia -> Southern Hemisphere
Maranatha!  |	-> Earth -> Sol -> Milky Way Galaxy -> Universe
-------------- next part --------------
<?php if (!defined('PmWiki')) exit();
/*
 * Copyright 2007 Kathryn Andersen
 * 
 * This program is free software; you can redistribute it and/or modify it
 * under the Gnu Public Licence or the Artistic Licence.
 */ 

/** hybridnames.php
 * Alternative naming scheme.
 * Change formatting of page names (in URLs) and titles for MOST groups.
 * Page names (in URLs) will contain underlines ('_') in place of spaces
 * and special characters.  All page names will be in lower-case.
 * Page titles will contain spaces in place of underlines.
 * Pages in groups designated as "classic" groups (such as PmWiki and Site)
 * will use the normal default page-naming scheme.
 *
 * See Also: http://www.pmwiki.org/wiki/Cookbook/AlternateNamingScheme
 */
$RecipeInfo['HybridNames']['Version'] = '20070213';

$GroupPattern = '[\\w]*(?:-\\w+)*';
$NamePattern = '[\\w]*(?:-\\w+)*';
$MakePageNameFunction = 'HybridMakePageName';

SDV($HybridClassicGroupPattern, '(?:PmWiki|Site)');
SDV($HybridClassicNamePattern, '(?:RecentChanges|RecentUploads|GroupHeader|GroupFooter|GroupAttributes)');
SDV($HybridPageNameChars,'-_[:alnum:]');
SDV($HybridMakePageNamePatterns, array(
    "/'/" => '',                           # strip single-quotes
    "/[^$HybridPageNameChars]+/" => ' ',         # convert everything else to space
    "/([[:upper:]])/" => ' $1',         # prefix upper-case with space
    "/\\s*-\\s*/" => '-',			# remove spaces around dashes
    "/(^\\s+)|(\\s+\$)/" => '',            # trim whitespaces
    "/\\b(\\w)/e" => "strtolower('$1')",     # lowercase first letter of words
    "/\s+/" => '_',                           # convert spaces to underscores
));

## MakePageName is used to convert a string $str into a fully-qualified
## pagename.  If $str doesn't contain a group qualifier, then 
## MakePageName uses $basepage and $PagePathFmt to determine the 
## group of the returned pagename.
function HybridMakePageName($basepage, $str) {
    global $HybridClassicGroupPattern, $HybridClassicNamePattern,
	   $MakePageNamePatterns, $PageNameChars,
	   $HybridPageNameChars, $PagePathFmt, $HybridMakePageNamePatterns;

    SDV($PageNameChars,'-[:alnum:]');
    SDV($MakePageNamePatterns, array(
    "/'/" => '',			   # strip single-quotes
    "/[^$PageNameChars]+/" => ' ',         # convert everything else to space
    '/((^|[^-\\w])\\w)/e' => "strtoupper('$1')",
    '/ /' => ''));

    $str = preg_replace('/[#?].*$/', '', $str);
    $m = preg_split('/[.\\/]/', $str);
    if (count($m)<1 || count($m)>2 || $m[0]=='') return '';
##  handle "Group.Name" conversions
    if (@$m[1] > '') {
	$group_part = $m[0];
	$name_part = $m[1];
	if (preg_match("/$HybridClassicGroupPattern/", $m[0])) {
	    $group = preg_replace(array_keys($MakePageNamePatterns),
				  array_values($MakePageNamePatterns), $m[0]);
	    $name = preg_replace(array_keys($MakePageNamePatterns),
				 array_values($MakePageNamePatterns), $m[1]);
	} else {
	    $group = preg_replace(array_keys($HybridMakePageNamePatterns),
				  array_values($HybridMakePageNamePatterns), $m[0]);
	    if (preg_match('/^' . $HybridClassicNamePattern . '$/', $m[1])) {
		$name = preg_replace(array_keys($MakePageNamePatterns),
				     array_values($MakePageNamePatterns), $m[1]);
	    } else {
		$name = preg_replace(array_keys($HybridMakePageNamePatterns),
				     array_values($HybridMakePageNamePatterns), $m[1]);
	    }
	}
	return "$group.$name";
    }
    $isgrouphome = count($m) > 1;
    if ($isgrouphome) {
	if (preg_match("/$HybridClassicGroupPattern/", $m[0])) {
	    $name = preg_replace(array_keys($MakePageNamePatterns),
				 array_values($MakePageNamePatterns), $m[0]);
	} else {
	    $name = preg_replace(array_keys($HybridMakePageNamePatterns),
				 array_values($HybridMakePageNamePatterns), $m[0]);
	}
    } else {
	if (preg_match("/$HybridClassicGroupPattern/", $basepage)) {
	    $name = preg_replace(array_keys($MakePageNamePatterns),
				 array_values($MakePageNamePatterns), $m[0]);
	} else if (preg_match("/$HybridClassicNamePattern/", $m[0])) {
	    $name = preg_replace(array_keys($MakePageNamePatterns),
				 array_values($MakePageNamePatterns), $m[0]);
	} else {
	    $name = preg_replace(array_keys($HybridMakePageNamePatterns),
				 array_values($HybridMakePageNamePatterns), $m[0]);
	}
    }
    foreach((array)$PagePathFmt as $pg) {
	if ($isgrouphome && strncmp($pg, '$1.', 3) !== 0) continue;
	$pn = FmtPageName(str_replace('$1', $name, $pg), $basepage);
	if (PageExists($pn)) return $pn;
    }
    if ($isgrouphome) {
	foreach((array)$PagePathFmt as $pg) 
	    if (strncmp($pg, '$1.', 3) == 0)
		return FmtPageName(str_replace('$1', $name, $pg), $basepage);
	return "$name.$name";
    }
    return preg_replace('/[^\\/.]+$/', $name, $basepage);
}

$old_as_spaced_function = $AsSpacedFunction;
$AsSpacedFunction = 'HybridAsSpaced';
function HybridAsSpaced($text) {
  global $old_as_spaced_function;
  if ($old_as_spaced_function) {
      $text = $old_as_spaced_function($text);
  }
  $text = strtr($text,'_',' ');
  return $text;
}


More information about the pmwiki-users mailing list