[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