Last edited by MovieLady:
Modified links pointing to docs server
Mon, 28 Jan 2008 00:14 UTC
Modified links pointing to docs server
Mon, 28 Jan 2008 00:14 UTC
Everyone does not like CamelCase
I like the simplicity of the automatic link creation when I type a new WikiWord. But I hate having to think about it all the time and as I naturally write "the wiki word" I would like the system to understand that for me. This is particularly enerving when typing people names: typing JohnDoe is not natural and it is also a pain for the eyes of a WikiStranger.The standard solution is then to type [[JohnDoe John Doe]] but it is not really user friendly.
A solution
I picked the ExpandedWikiWords idea from Teamflux which is a commercial Wiki based on zwiki. The idea was already there.The solution consists in adding a space before any capital letter within a word (not including the first one) when this word isn't enclosed in brackets (we may want to add similar restrictions to double quote).
This solution is easy to implement. The decision whether to use it or not should be taken by the user so it should be a new item in the UserSettings. The anonymous users shoud have it by default and this decision could be part of the ConfigurationOptions.
The code
1) adding field to user table:SQL-query:
ALTER TABLE `wikka_users` ADD `space_camelcase` ENUM( 'Y', 'N' ) DEFAULT 'N' NOT NULL;
2) adding a table row to show the status of the variable (to actions/usersettings.php):
change
<tr>
<td align="right">Show comments by default:</td>
<td><input type="hidden" name="show_comments" value="N"><input type="checkbox" name="show_comments" value="Y" <?php echo $user["show_comments"] "Y" ? "checked=\"checked\ : ?> /></td>
</tr>
<tr>
<td align="right">RecentChanges display limit:</td>
<td><input name="changescount" value="<?php echo htmlspecialchars($user["changescount"]) ?>" size="40" /></td>
</tr>
"Y" ? "checked=\"checked\ : ?> /></td>
</tr>
<tr>
<td align="right">RecentChanges display limit:</td>
<td><input name="changescount" value="<?php echo htmlspecialchars($user["changescount"]) ?>" size="40" /></td>
</tr>
<tr>
<td align="right">Show comments by default:</td>
<td><input type="hidden" name="show_comments" value="N"><input type="checkbox" name="show_comments" value="Y" <?php echo $user["show_comments"]
"Y" ? "checked=\"checked\ : ?> /></td>
</tr>
<tr>
<td align="right">Insert spaces in between WikiWords:</td>
<td><input type="hidden" name="space_camelcase" value="N"><input type="checkbox" name="space_camelcase" value="Y" <?php echo $user["space_camelcase"] "Y" ? "checked=\"checked\ : ?> /></td>
</tr>
<tr>
<td align="right">RecentChanges display limit:</td>
<td><input name="changescount" value="<?php echo htmlspecialchars($user["changescount"]) ?>" size="40" /></td>
</tr>
"Y" ? "checked=\"checked\ : ?> /></td>
</tr>
<tr>
<td align="right">RecentChanges display limit:</td>
<td><input name="changescount" value="<?php echo htmlspecialchars($user["changescount"]) ?>" size="40" /></td>
</tr>
3) added the user-table-update in actions/usersettings.php:
change:
$this->Query("update ".$this->config["table_prefix"]."users set ".
"email = '".mysql_real_escape_string($_POST["email"])."', ".
"doubleclickedit = '".mysql_real_escape_string($_POST["doubleclickedit"])."', ".
"show_comments = '".mysql_real_escape_string($_POST["show_comments"])."', ".
"revisioncount = '".mysql_real_escape_string($_POST["revisioncount"])."', ".
"changescount = '".mysql_real_escape_string($_POST["changescount"])."' ".
"where name = '".$user["name"]."' limit 1");
"email = '".mysql_real_escape_string($_POST["email"])."', ".
"doubleclickedit = '".mysql_real_escape_string($_POST["doubleclickedit"])."', ".
"show_comments = '".mysql_real_escape_string($_POST["show_comments"])."', ".
"revisioncount = '".mysql_real_escape_string($_POST["revisioncount"])."', ".
"changescount = '".mysql_real_escape_string($_POST["changescount"])."' ".
"where name = '".$user["name"]."' limit 1");
to
$this->Query("update ".$this->config['table_prefix']."users set ".
"email = '".mysql_real_escape_string($_POST['email'])."', ".
"doubleclickedit = '".mysql_real_escape_string($_POST['doubleclickedit'])."', ".
"show_comments = '".mysql_real_escape_string($_POST['show_comments'])."', ".
"space_camelcase = '".mysql_real_escape_string($_POST['space_camelcase'])."', ".
"revisioncount = '".mysql_real_escape_string($_POST['revisioncount'])."', ".
"changescount = '".mysql_real_escape_string($_POST['changescount'])."' ".
"where name = '".$user['name']."' limit 1");
"email = '".mysql_real_escape_string($_POST['email'])."', ".
"doubleclickedit = '".mysql_real_escape_string($_POST['doubleclickedit'])."', ".
"show_comments = '".mysql_real_escape_string($_POST['show_comments'])."', ".
"space_camelcase = '".mysql_real_escape_string($_POST['space_camelcase'])."', ".
"revisioncount = '".mysql_real_escape_string($_POST['revisioncount'])."', ".
"changescount = '".mysql_real_escape_string($_POST['changescount'])."' ".
"where name = '".$user['name']."' limit 1");
4) create the function addspaceincamelcase($camelcase) in formatters/wakka.php:
if (!function_exists("wakka2callback"))
{
function addspaceincamelcase($camelcase)
{
$result = "";
preg_match_all('/[A-Z,ÄÖÜ]+[a-z,ßäöü,0-9]*/', $camelcase, $matches);
for ($i=0; $i<count($matches[0]); $i++) {
if ($i>0) $result .=" ";
$result .= $matches[0][$i];
}
return $result;
}
function wakka2callback($things)
{
function addspaceincamelcase($camelcase)
{
$result = "";
preg_match_all('/[A-Z,ÄÖÜ]+[a-z,ßäöü,0-9]*/', $camelcase, $matches);
for ($i=0; $i<count($matches[0]); $i++) {
if ($i>0) $result .=" ";
$result .= $matches[0][$i];
}
return $result;
}
function wakka2callback($things)
- I had to modify the preg_match_all on my installation so it wouldn't drop/ignore numbers that start a page name:
- Now the question is (for me, anyway), how do I change it so there's a space between a number followed by a capital letter? --MovieLady
5) last update in formatters/wakka.php:
change:
// wiki links!
else if (preg_match("/^[A-Z,ÄÖÜ]+[a-z,ßäöü]+[A-Z,0-9,ÄÖÜ][A-Z,a-z,0-9,ÄÖÜ,ßäöü]*$/s", $thing))
{
return $wakka->Link($thing);
}
else if (preg_match("/^[A-Z,ÄÖÜ]+[a-z,ßäöü]+[A-Z,0-9,ÄÖÜ][A-Z,a-z,0-9,ÄÖÜ,ßäöü]*$/s", $thing))
{
return $wakka->Link($thing);
}
to:
// wiki links!
else if (preg_match("/^[A-Z,ÄÖÜ]+[a-z,ßäöü]+[A-Z,0-9,ÄÖÜ][A-Z,a-z,0-9,ÄÖÜ,ßäöü]*$/s", $thing))
{
$user=$_SESSION['user'];
$addspace = $user['space_camelcase'];
if ($addspace == 'N') {
return $wakka->Link($thing);
}
else return $wakka->Link($thing,"",addspaceincamelcase($thing));
}
else if (preg_match("/^[A-Z,ÄÖÜ]+[a-z,ßäöü]+[A-Z,0-9,ÄÖÜ][A-Z,a-z,0-9,ÄÖÜ,ßäöü]*$/s", $thing))
{
$user=$_SESSION['user'];
$addspace = $user['space_camelcase'];
if ($addspace == 'N') {
return $wakka->Link($thing);
}
else return $wakka->Link($thing,"",addspaceincamelcase($thing));
}
Moreover the comfort provided by such a functionality, it allows more consistency in the WikiPages by reformating the content to ensure that the WikiLinks are generated even when the author forgott the NoSpaceInBetweenRule.
CategoryUserContributions