Build urls using Net_URL_Mapper, too

This commit is contained in:
Evan Prodromou 2009-02-10 22:49:25 -05:00
parent 1a7337f2fd
commit fbecbcb693
2 changed files with 28 additions and 271 deletions

View File

@ -47,10 +47,17 @@ require_once 'Net/URL/Mapper.php';
class Router class Router
{ {
var $m = null; static $m = null;
function __construct() function __construct()
{ {
if (!$this->m) {
$this->m = $this->initialize();
}
}
function initialize() {
$m = Net_URL_Mapper::getInstance(); $m = Net_URL_Mapper::getInstance();
// In the "root" // In the "root"
@ -134,8 +141,10 @@ class Router
array('action' => 'userbyid'), array('action' => 'userbyid'),
array('id' => '[0-9]+')); array('id' => '[0-9]+'));
$m->connect('tags/?', array('action' => 'publictagcloud')); $m->connect('tags/', array('action' => 'publictagcloud'));
$m->connect('tag/?', array('action' => 'publictagcloud')); $m->connect('tag/', array('action' => 'publictagcloud'));
$m->connect('tags', array('action' => 'publictagcloud'));
$m->connect('tag', array('action' => 'publictagcloud'));
$m->connect('tag/:tag/rss', $m->connect('tag/:tag/rss',
array('action' => 'tagrss'), array('action' => 'tagrss'),
array('tag' => '[a-zA-Z0-9]+')); array('tag' => '[a-zA-Z0-9]+'));
@ -147,8 +156,10 @@ class Router
array('action' => 'peopletag'), array('action' => 'peopletag'),
array('tag' => '[a-zA-Z0-9]+')); array('tag' => '[a-zA-Z0-9]+'));
$m->connect('featured/?', array('action' => 'featured')); $m->connect('featured/', array('action' => 'featured'));
$m->connect('favorited/?', array('action' => 'favorited')); $m->connect('featured', array('action' => 'featured'));
$m->connect('favorited/', array('action' => 'favorited'));
$m->connect('favorited', array('action' => 'favorited'));
// groups // groups
@ -174,7 +185,10 @@ class Router
array('action' => 'showgroup'), array('action' => 'showgroup'),
array('nickname' => '[a-zA-Z0-9]+')); array('nickname' => '[a-zA-Z0-9]+'));
$m->connect('group/?', array('action' => 'groups')); $m->connect('group/', array('action' => 'groups'));
$m->connect('group', array('action' => 'groups'));
$m->connect('groups/', array('action' => 'groups'));
$m->connect('groups', array('action' => 'groups'));
// Twitter-compatible API // Twitter-compatible API
@ -317,7 +331,7 @@ class Router
array('action' => 'showstream'), array('action' => 'showstream'),
array('nickname' => '[a-zA-Z0-9]{1,64}')); array('nickname' => '[a-zA-Z0-9]{1,64}'));
$this->m = $m; return $m;
} }
function map($path) function map($path)

View File

@ -669,275 +669,18 @@ function common_relative_profile($sender, $nickname, $dt=null)
function common_local_url($action, $args=null, $fragment=null) function common_local_url($action, $args=null, $fragment=null)
{ {
$url = null; $r = new Router();
if (common_config('site','fancy')) { $path = $r->build($action, $args, $fragment);
$url = common_fancy_url($action, $args); if ($path) {
} else {
$url = common_simple_url($action, $args);
} }
if (!is_null($fragment)) { if (common_config('site','fancy')) {
$url .= '#'.$fragment; $url = common_path(mb_substr($path, 1));
} else {
$url = common_path('index.php'.$path);
} }
return $url; return $url;
} }
function common_fancy_url($action, $args=null)
{
switch (strtolower($action)) {
case 'public':
if ($args && isset($args['page'])) {
return common_path('?page=' . $args['page']);
} else {
return common_path('');
}
case 'featured':
if ($args && isset($args['page'])) {
return common_path('featured?page=' . $args['page']);
} else {
return common_path('featured');
}
case 'favorited':
if ($args && isset($args['page'])) {
return common_path('favorited?page=' . $args['page']);
} else {
return common_path('favorited');
}
case 'publicrss':
return common_path('rss');
case 'publicatom':
return common_path("api/statuses/public_timeline.atom");
case 'publicxrds':
return common_path('xrds');
case 'tagrss':
return common_path('tag/' . $args['tag'] . '/rss');
case 'featuredrss':
return common_path('featuredrss');
case 'favoritedrss':
return common_path('favoritedrss');
case 'opensearch':
if ($args && $args['type']) {
return common_path('opensearch/'.$args['type']);
} else {
return common_path('opensearch/people');
}
case 'doc':
return common_path('doc/'.$args['title']);
case 'block':
case 'login':
case 'logout':
case 'subscribe':
case 'unsubscribe':
case 'invite':
return common_path('main/'.$action);
case 'tagother':
return common_path('main/tagother?id='.$args['id']);
case 'register':
if ($args && $args['code']) {
return common_path('main/register/'.$args['code']);
} else {
return common_path('main/register');
}
case 'remotesubscribe':
if ($args && $args['nickname']) {
return common_path('main/remote?nickname=' . $args['nickname']);
} else {
return common_path('main/remote');
}
case 'nudge':
return common_path($args['nickname'].'/nudge');
case 'openidlogin':
return common_path('main/openid');
case 'profilesettings':
return common_path('settings/profile');
case 'passwordsettings':
return common_path('settings/password');
case 'emailsettings':
return common_path('settings/email');
case 'openidsettings':
return common_path('settings/openid');
case 'smssettings':
return common_path('settings/sms');
case 'twittersettings':
return common_path('settings/twitter');
case 'othersettings':
return common_path('settings/other');
case 'deleteprofile':
return common_path('settings/delete');
case 'newnotice':
if ($args && $args['replyto']) {
return common_path('notice/new?replyto='.$args['replyto']);
} else {
return common_path('notice/new');
}
case 'shownotice':
return common_path('notice/'.$args['notice']);
case 'deletenotice':
if ($args && $args['notice']) {
return common_path('notice/delete/'.$args['notice']);
} else {
return common_path('notice/delete');
}
case 'microsummary':
case 'xrds':
case 'foaf':
return common_path($args['nickname'].'/'.$action);
case 'all':
case 'replies':
case 'inbox':
case 'outbox':
if ($args && isset($args['page'])) {
return common_path($args['nickname'].'/'.$action.'?page=' . $args['page']);
} else {
return common_path($args['nickname'].'/'.$action);
}
case 'subscriptions':
case 'subscribers':
$nickname = $args['nickname'];
unset($args['nickname']);
if (isset($args['tag'])) {
$tag = $args['tag'];
unset($args['tag']);
}
$params = http_build_query($args);
if ($params) {
return common_path($nickname.'/'.$action . (($tag) ? '/' . $tag : '') . '?' . $params);
} else {
return common_path($nickname.'/'.$action . (($tag) ? '/' . $tag : ''));
}
case 'allrss':
return common_path($args['nickname'].'/all/rss');
case 'repliesrss':
return common_path($args['nickname'].'/replies/rss');
case 'userrss':
if (isset($args['limit']))
return common_path($args['nickname'].'/rss?limit=' . $args['limit']);
return common_path($args['nickname'].'/rss');
case 'showstream':
if ($args && isset($args['page'])) {
return common_path($args['nickname'].'?page=' . $args['page']);
} else {
return common_path($args['nickname']);
}
case 'usertimeline':
return common_path("api/statuses/user_timeline/".$args['nickname'].".atom");
case 'confirmaddress':
return common_path('main/confirmaddress/'.$args['code']);
case 'userbyid':
return common_path('user/'.$args['id']);
case 'recoverpassword':
$path = 'main/recoverpassword';
if ($args['code']) {
$path .= '/' . $args['code'];
}
return common_path($path);
case 'imsettings':
return common_path('settings/im');
case 'avatarsettings':
return common_path('settings/avatar');
case 'groupsearch':
return common_path('search/group' . (($args) ? ('?' . http_build_query($args)) : ''));
case 'peoplesearch':
return common_path('search/people' . (($args) ? ('?' . http_build_query($args)) : ''));
case 'noticesearch':
return common_path('search/notice' . (($args) ? ('?' . http_build_query($args)) : ''));
case 'noticesearchrss':
return common_path('search/notice/rss' . (($args) ? ('?' . http_build_query($args)) : ''));
case 'avatarbynickname':
return common_path($args['nickname'].'/avatar/'.$args['size']);
case 'tag':
$path = 'tag/' . $args['tag'];
unset($args['tag']);
return common_path($path . (($args) ? ('?' . http_build_query($args)) : ''));
case 'publictagcloud':
return common_path('tags');
case 'peopletag':
$path = 'peopletag/' . $args['tag'];
unset($args['tag']);
return common_path($path . (($args) ? ('?' . http_build_query($args)) : ''));
case 'tags':
return common_path('tags' . (($args) ? ('?' . http_build_query($args)) : ''));
case 'favor':
return common_path('main/favor');
case 'disfavor':
return common_path('main/disfavor');
case 'showfavorites':
if ($args && isset($args['page'])) {
return common_path($args['nickname'].'/favorites?page=' . $args['page']);
} else {
return common_path($args['nickname'].'/favorites');
}
case 'favoritesrss':
return common_path($args['nickname'].'/favorites/rss');
case 'showmessage':
return common_path('message/' . $args['message']);
case 'newmessage':
return common_path('message/new' . (($args) ? ('?' . http_build_query($args)) : ''));
case 'api':
// XXX: do fancy URLs for all the API methods
switch (strtolower($args['apiaction'])) {
case 'statuses':
switch (strtolower($args['method'])) {
case 'user_timeline.rss':
return common_path('api/statuses/user_timeline/'.$args['argument'].'.rss');
case 'user_timeline.atom':
return common_path('api/statuses/user_timeline/'.$args['argument'].'.atom');
case 'user_timeline.json':
return common_path('api/statuses/user_timeline/'.$args['argument'].'.json');
case 'user_timeline.xml':
return common_path('api/statuses/user_timeline/'.$args['argument'].'.xml');
default: return common_simple_url($action, $args);
}
default: return common_simple_url($action, $args);
}
case 'sup':
if ($args && isset($args['seconds'])) {
return common_path('main/sup?seconds='.$args['seconds']);
} else {
return common_path('main/sup');
}
case 'newgroup':
return common_path('group/new');
case 'showgroup':
return common_path('group/'.$args['nickname'] . (($args['page']) ? ('?page=' . $args['page']) : ''));
case 'editgroup':
return common_path('group/'.$args['nickname'].'/edit');
case 'joingroup':
return common_path('group/'.$args['nickname'].'/join');
case 'leavegroup':
return common_path('group/'.$args['nickname'].'/leave');
case 'groupbyid':
return common_path('group/'.$args['id'].'/id');
case 'grouprss':
return common_path('group/'.$args['nickname'].'/rss');
case 'groupmembers':
return common_path('group/'.$args['nickname'].'/members' . (($args['page']) ? ('?page=' . $args['page']) : ''));
case 'grouplogo':
return common_path('group/'.$args['nickname'].'/logo');
case 'usergroups':
$nickname = $args['nickname'];
unset($args['nickname']);
return common_path($nickname.'/groups' . (($args) ? ('?' . http_build_query($args)) : ''));
case 'groups':
return common_path('group' . (($args) ? ('?' . http_build_query($args)) : ''));
default:
return common_simple_url($action, $args);
}
}
function common_simple_url($action, $args=null)
{
global $config;
/* XXX: pretty URLs */
$extra = '';
if ($args) {
foreach ($args as $key => $value) {
$extra .= "&${key}=${value}";
}
}
return common_path("index.php?action=${action}${extra}");
}
function common_path($relative) function common_path($relative)
{ {
global $config; global $config;