| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Laconica, the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * URL routing utilities | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENCE: This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  URL | 
					
						
							|  |  |  |  * @package   Laconica | 
					
						
							|  |  |  |  * @author    Evan Prodromou <evan@controlyourself.ca> | 
					
						
							|  |  |  |  * @copyright 2009 Control Yourself, Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link      http://laconi.ca/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('LACONICA')) { | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require_once 'Net/URL/Mapper.php'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * URL Router | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Cheap wrapper around Net_URL_Mapper | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category URL | 
					
						
							|  |  |  |  * @package  Laconica | 
					
						
							|  |  |  |  * @author   Evan Prodromou <evan@controlyourself.ca> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link     http://laconi.ca/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Router | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-02-20 16:48:49 -05:00
										 |  |  |     var $m = null; | 
					
						
							| 
									
										
										
										
											2009-02-11 00:45:11 -05:00
										 |  |  |     static $inst = null; | 
					
						
							| 
									
										
										
										
											2009-03-06 17:18:21 -08:00
										 |  |  |     static $bare = array('requesttoken', 'accesstoken', 'userauthorization', | 
					
						
							| 
									
										
										
										
											2009-03-07 12:38:22 -08:00
										 |  |  |                          'postnotice', 'updateprofile', 'finishremotesubscribe', | 
					
						
							|  |  |  |                          'finishopenidlogin', 'finishaddopenid'); | 
					
						
							| 
									
										
										
										
											2009-02-11 00:45:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     static function get() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!Router::$inst) { | 
					
						
							|  |  |  |             Router::$inst = new Router(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return Router::$inst; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function __construct() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-02-10 22:49:25 -05:00
										 |  |  |         if (!$this->m) { | 
					
						
							|  |  |  |             $this->m = $this->initialize(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-25 12:56:52 -04:00
										 |  |  |     function initialize() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         $m = Net_URL_Mapper::getInstance(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // In the "root"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('', array('action' => 'public')); | 
					
						
							|  |  |  |         $m->connect('rss', array('action' => 'publicrss')); | 
					
						
							|  |  |  |         $m->connect('xrds', array('action' => 'publicxrds')); | 
					
						
							|  |  |  |         $m->connect('featuredrss', array('action' => 'featuredrss')); | 
					
						
							|  |  |  |         $m->connect('favoritedrss', array('action' => 'favoritedrss')); | 
					
						
							|  |  |  |         $m->connect('opensearch/people', array('action' => 'opensearch', | 
					
						
							|  |  |  |                                                'type' => 'people')); | 
					
						
							|  |  |  |         $m->connect('opensearch/notice', array('action' => 'opensearch', | 
					
						
							|  |  |  |                                                'type' => 'notice')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // docs
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('doc/:title', array('action' => 'doc')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // facebook
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('facebook', array('action' => 'facebookhome')); | 
					
						
							|  |  |  |         $m->connect('facebook/index.php', array('action' => 'facebookhome')); | 
					
						
							|  |  |  |         $m->connect('facebook/settings.php', array('action' => 'facebooksettings')); | 
					
						
							|  |  |  |         $m->connect('facebook/invite.php', array('action' => 'facebookinvite')); | 
					
						
							|  |  |  |         $m->connect('facebook/remove', array('action' => 'facebookremove')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // main stuff is repetitive
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $main = array('login', 'logout', 'register', 'subscribe', | 
					
						
							|  |  |  |                       'unsubscribe', 'confirmaddress', 'recoverpassword', | 
					
						
							|  |  |  |                       'invite', 'favor', 'disfavor', 'sup', | 
					
						
							| 
									
										
										
										
											2009-06-14 16:17:44 -07:00
										 |  |  |                       'block', 'unblock', 'subedit', | 
					
						
							|  |  |  |                       'groupblock', 'groupunblock'); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         foreach ($main as $a) { | 
					
						
							|  |  |  |             $m->connect('main/'.$a, array('action' => $a)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-01 18:29:10 -04:00
										 |  |  |         $m->connect('main/sup/:seconds', array('action' => 'sup'), | 
					
						
							|  |  |  |                     array('seconds' => '[0-9]+')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-20 10:04:28 -05:00
										 |  |  |         $m->connect('main/tagother/:id', array('action' => 'tagother')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-30 15:37:35 -04:00
										 |  |  |         $m->connect('main/oembed.xml', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'method' => 'oembed.xml', | 
					
						
							|  |  |  |                           'apiaction' => 'oembed')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('main/oembed.json', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'method' => 'oembed.json', | 
					
						
							|  |  |  |                           'apiaction' => 'oembed')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         // these take a code
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach (array('register', 'confirmaddress', 'recoverpassword') as $c) { | 
					
						
							|  |  |  |             $m->connect('main/'.$c.'/:code', array('action' => $c)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // exceptional
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('main/openid', array('action' => 'openidlogin')); | 
					
						
							|  |  |  |         $m->connect('main/remote', array('action' => 'remotesubscribe')); | 
					
						
							| 
									
										
										
										
											2009-02-22 14:27:09 +01:00
										 |  |  |         $m->connect('main/remote?nickname=:nickname', array('action' => 'remotesubscribe'), array('nickname' => '[A-Za-z0-9_-]+')); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-06 17:18:21 -08:00
										 |  |  |         foreach (Router::$bare as $action) { | 
					
						
							| 
									
										
										
										
											2009-02-21 18:51:56 +01:00
										 |  |  |             $m->connect('index.php?action=' . $action, array('action' => $action)); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // settings
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach (array('profile', 'avatar', 'password', 'openid', 'im', | 
					
						
							| 
									
										
										
										
											2009-06-18 02:01:06 -07:00
										 |  |  |                        'email', 'sms', 'twitter', 'userdesign', 'other') as $s) { | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |             $m->connect('settings/'.$s, array('action' => $s.'settings')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // search
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach (array('group', 'people', 'notice') as $s) { | 
					
						
							|  |  |  |             $m->connect('search/'.$s, array('action' => $s.'search')); | 
					
						
							| 
									
										
										
										
											2009-03-25 12:56:52 -04:00
										 |  |  |             $m->connect('search/'.$s.'?q=:q', | 
					
						
							|  |  |  |                         array('action' => $s.'search'), | 
					
						
							|  |  |  |                         array('q' => '.+')); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-21 14:16:54 +00:00
										 |  |  |         // The second of these is needed to make the link work correctly
 | 
					
						
							| 
									
										
										
										
											2009-03-25 12:56:52 -04:00
										 |  |  |         // when inserted into the page. The first is needed to match the
 | 
					
						
							|  |  |  |         // route on the way in. Seems to be another Net_URL_Mapper bug to me.
 | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         $m->connect('search/notice/rss', array('action' => 'noticesearchrss')); | 
					
						
							| 
									
										
										
										
											2009-03-25 12:56:52 -04:00
										 |  |  |         $m->connect('search/notice/rss?q=:q', array('action' => 'noticesearchrss'), | 
					
						
							|  |  |  |                     array('q' => '.+')); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-25 14:05:06 -07:00
										 |  |  |         $m->connect('attachment/:attachment', | 
					
						
							|  |  |  |                     array('action' => 'attachment'), | 
					
						
							|  |  |  |                     array('attachment' => '[0-9]+')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  |         $m->connect('attachment/:attachment/ajax', | 
					
						
							|  |  |  |                     array('action' => 'attachment_ajax'), | 
					
						
							| 
									
										
										
										
											2009-05-24 04:43:34 -04:00
										 |  |  |                     array('attachment' => '[0-9]+')); | 
					
						
							| 
									
										
										
										
											2009-05-15 15:04:58 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-25 11:13:13 -04:00
										 |  |  |         $m->connect('attachment/:attachment/thumbnail', | 
					
						
							|  |  |  |                     array('action' => 'attachment_thumbnail'), | 
					
						
							|  |  |  |                     array('attachment' => '[0-9]+')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         $m->connect('notice/new', array('action' => 'newnotice')); | 
					
						
							| 
									
										
										
										
											2009-02-22 13:31:50 +01:00
										 |  |  |         $m->connect('notice/new?replyto=:replyto', | 
					
						
							|  |  |  |                     array('action' => 'newnotice'), | 
					
						
							|  |  |  |                     array('replyto' => '[A-Za-z0-9_-]+')); | 
					
						
							| 
									
										
										
										
											2009-05-25 19:42:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-14 15:47:39 -07:00
										 |  |  |         $m->connect('notice/:notice/file', | 
					
						
							|  |  |  |             array('action' => 'file'), | 
					
						
							| 
									
										
										
										
											2009-05-26 21:20:04 -04:00
										 |  |  |             array('notice' => '[0-9]+')); | 
					
						
							| 
									
										
										
										
											2009-06-14 15:47:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         $m->connect('notice/:notice', | 
					
						
							|  |  |  |                     array('action' => 'shownotice'), | 
					
						
							|  |  |  |                     array('notice' => '[0-9]+')); | 
					
						
							|  |  |  |         $m->connect('notice/delete', array('action' => 'deletenotice')); | 
					
						
							|  |  |  |         $m->connect('notice/delete/:notice', | 
					
						
							|  |  |  |                     array('action' => 'deletenotice'), | 
					
						
							|  |  |  |                     array('notice' => '[0-9]+')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-28 15:12:31 -08:00
										 |  |  |         // conversation
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('conversation/:id', | 
					
						
							|  |  |  |                     array('action' => 'conversation'), | 
					
						
							|  |  |  |                     array('id' => '[0-9]+')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         $m->connect('message/new', array('action' => 'newmessage')); | 
					
						
							| 
									
										
										
										
											2009-03-13 22:06:02 +01:00
										 |  |  |         $m->connect('message/new?to=:to', array('action' => 'newmessage'), array('to' => '[A-Za-z0-9_-]+')); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         $m->connect('message/:message', | 
					
						
							|  |  |  |                     array('action' => 'showmessage'), | 
					
						
							|  |  |  |                     array('message' => '[0-9]+')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('user/:id', | 
					
						
							|  |  |  |                     array('action' => 'userbyid'), | 
					
						
							|  |  |  |                     array('id' => '[0-9]+')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-10 22:49:25 -05:00
										 |  |  |         $m->connect('tags/', array('action' => 'publictagcloud')); | 
					
						
							|  |  |  |         $m->connect('tag/', array('action' => 'publictagcloud')); | 
					
						
							|  |  |  |         $m->connect('tags', array('action' => 'publictagcloud')); | 
					
						
							|  |  |  |         $m->connect('tag', array('action' => 'publictagcloud')); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         $m->connect('tag/:tag/rss', | 
					
						
							|  |  |  |                     array('action' => 'tagrss'), | 
					
						
							|  |  |  |                     array('tag' => '[a-zA-Z0-9]+')); | 
					
						
							|  |  |  |         $m->connect('tag/:tag', | 
					
						
							|  |  |  |                     array('action' => 'tag'), | 
					
						
							| 
									
										
										
										
											2009-07-20 14:02:52 +12:00
										 |  |  |                     array('tag' => '[\pL\pN_\-\.]{1,64}')); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('peopletag/:tag', | 
					
						
							|  |  |  |                     array('action' => 'peopletag'), | 
					
						
							|  |  |  |                     array('tag' => '[a-zA-Z0-9]+')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-10 22:49:25 -05:00
										 |  |  |         $m->connect('featured/', array('action' => 'featured')); | 
					
						
							|  |  |  |         $m->connect('featured', array('action' => 'featured')); | 
					
						
							|  |  |  |         $m->connect('favorited/', array('action' => 'favorited')); | 
					
						
							|  |  |  |         $m->connect('favorited', array('action' => 'favorited')); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // groups
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('group/new', array('action' => 'newgroup')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach (array('edit', 'join', 'leave') as $v) { | 
					
						
							|  |  |  |             $m->connect('group/:nickname/'.$v, | 
					
						
							|  |  |  |                         array('action' => $v.'group'), | 
					
						
							|  |  |  |                         array('nickname' => '[a-zA-Z0-9]+')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-18 02:01:06 -07:00
										 |  |  |         foreach (array('members', 'logo', 'rss', 'designsettings') as $n) { | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |             $m->connect('group/:nickname/'.$n, | 
					
						
							|  |  |  |                         array('action' => 'group'.$n), | 
					
						
							|  |  |  |                         array('nickname' => '[a-zA-Z0-9]+')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-14 16:17:44 -07:00
										 |  |  |         $m->connect('group/:nickname/blocked', | 
					
						
							|  |  |  |                     array('action' => 'blockedfromgroup'), | 
					
						
							|  |  |  |                     array('nickname' => '[a-zA-Z0-9]+')); | 
					
						
							| 
									
										
										
										
											2009-06-15 00:59:15 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('group/:nickname/makeadmin', | 
					
						
							|  |  |  |                     array('action' => 'makeadmin'), | 
					
						
							|  |  |  |                     array('nickname' => '[a-zA-Z0-9]+')); | 
					
						
							| 
									
										
										
										
											2009-06-14 16:17:44 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         $m->connect('group/:id/id', | 
					
						
							|  |  |  |                     array('action' => 'groupbyid'), | 
					
						
							|  |  |  |                     array('id' => '[0-9]+')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('group/:nickname', | 
					
						
							|  |  |  |                     array('action' => 'showgroup'), | 
					
						
							|  |  |  |                     array('nickname' => '[a-zA-Z0-9]+')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-10 22:49:25 -05:00
										 |  |  |         $m->connect('group/', array('action' => 'groups')); | 
					
						
							|  |  |  |         $m->connect('group', array('action' => 'groups')); | 
					
						
							|  |  |  |         $m->connect('groups/', array('action' => 'groups')); | 
					
						
							|  |  |  |         $m->connect('groups', array('action' => 'groups')); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Twitter-compatible API
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // statuses API
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('api/statuses/:method', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'statuses'), | 
					
						
							| 
									
										
										
										
											2009-07-06 11:57:21 -07:00
										 |  |  |                     array('method' => '(public_timeline|friends_timeline|user_timeline|update|replies|mentions|show|friends|followers|featured)(\.(atom|rss|xml|json))?')); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('api/statuses/:method/:argument', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'statuses'), | 
					
						
							| 
									
										
										
										
											2009-07-10 17:56:01 -07:00
										 |  |  |                     array('method' => '(|user_timeline|friends_timeline|replies|mentions|show|destroy|friends|followers)')); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // users
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-04 16:17:40 -08:00
										 |  |  |         $m->connect('api/users/:method/:argument', | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |                     array('action' => 'api', | 
					
						
							| 
									
										
										
										
											2009-03-04 18:14:52 -08:00
										 |  |  |                           'apiaction' => 'users'), | 
					
						
							| 
									
										
										
										
											2009-03-04 16:17:40 -08:00
										 |  |  |                     array('method' => 'show(\.(xml|json))?')); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('api/users/:method', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'users'), | 
					
						
							| 
									
										
										
										
											2009-03-04 16:17:40 -08:00
										 |  |  |                     array('method' => 'show(\.(xml|json))?')); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // direct messages
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-20 15:07:59 -08:00
										 |  |  |         foreach (array('xml', 'json') as $e) { | 
					
						
							|  |  |  |             $m->connect('api/direct_messages/new.'.$e, | 
					
						
							|  |  |  |                         array('action' => 'api', | 
					
						
							|  |  |  |                               'apiaction' => 'direct_messages', | 
					
						
							|  |  |  |                               'method' => 'create.'.$e)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach (array('xml', 'json', 'rss', 'atom') as $e) { | 
					
						
							|  |  |  |             $m->connect('api/direct_messages.'.$e, | 
					
						
							|  |  |  |                         array('action' => 'api', | 
					
						
							|  |  |  |                               'apiaction' => 'direct_messages', | 
					
						
							|  |  |  |                               'method' => 'direct_messages.'.$e)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach (array('xml', 'json', 'rss', 'atom') as $e) { | 
					
						
							| 
									
										
										
										
											2009-03-10 16:15:57 -07:00
										 |  |  |             $m->connect('api/direct_messages/sent.'.$e, | 
					
						
							| 
									
										
										
										
											2009-02-20 15:07:59 -08:00
										 |  |  |                         array('action' => 'api', | 
					
						
							| 
									
										
										
										
											2009-03-25 12:56:52 -04:00
										 |  |  |                               'apiaction' => 'direct_messages', | 
					
						
							|  |  |  |                               'method' => 'sent.'.$e)); | 
					
						
							| 
									
										
										
										
											2009-02-20 15:07:59 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('api/direct_messages/destroy/:argument', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'direct_messages')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // friendships
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('api/friendships/:method/:argument', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'friendships'), | 
					
						
							|  |  |  |                     array('method' => '(create|destroy)')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('api/friendships/:method', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'friendships'), | 
					
						
							| 
									
										
										
										
											2009-07-02 17:32:27 -07:00
										 |  |  |                     array('method' => '(show|exists)(\.(xml|json))')); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-22 20:04:47 -08:00
										 |  |  |         // Social graph
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('api/friends/ids/:argument', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'statuses', | 
					
						
							|  |  |  |                           'method' => 'friendsIDs')); | 
					
						
							| 
									
										
										
										
											2009-02-28 15:12:31 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-22 20:04:47 -08:00
										 |  |  |         foreach (array('xml', 'json') as $e) { | 
					
						
							|  |  |  |             $m->connect('api/friends/ids.'.$e, | 
					
						
							|  |  |  |                         array('action' => 'api', | 
					
						
							|  |  |  |                               'apiaction' => 'statuses', | 
					
						
							|  |  |  |                               'method' => 'friendsIDs.'.$e)); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-02-28 15:12:31 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-22 20:04:47 -08:00
										 |  |  |         $m->connect('api/followers/ids/:argument', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'statuses', | 
					
						
							|  |  |  |                           'method' => 'followersIDs')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach (array('xml', 'json') as $e) { | 
					
						
							|  |  |  |             $m->connect('api/followers/ids.'.$e, | 
					
						
							|  |  |  |                         array('action' => 'api', | 
					
						
							|  |  |  |                               'apiaction' => 'statuses', | 
					
						
							|  |  |  |                               'method' => 'followersIDs.'.$e)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         // account
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('api/account/:method', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'account')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // favorites
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('api/favorites/:method/:argument', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							| 
									
										
										
										
											2009-06-17 14:34:04 -07:00
										 |  |  |                           'apiaction' => 'favorites', | 
					
						
							|  |  |  |                           array('method' => '(create|destroy)'))); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('api/favorites/:argument', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'favorites', | 
					
						
							|  |  |  |                           'method' => 'favorites')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-20 15:07:59 -08:00
										 |  |  |         foreach (array('xml', 'json', 'rss', 'atom') as $e) { | 
					
						
							|  |  |  |             $m->connect('api/favorites.'.$e, | 
					
						
							| 
									
										
										
										
											2009-03-25 12:56:52 -04:00
										 |  |  |                         array('action' => 'api', | 
					
						
							|  |  |  |                               'apiaction' => 'favorites', | 
					
						
							|  |  |  |                               'method' => 'favorites.'.$e)); | 
					
						
							| 
									
										
										
										
											2009-02-20 15:07:59 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // notifications
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('api/notifications/:method/:argument', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'favorites')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // blocks
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('api/blocks/:method/:argument', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'blocks')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // help
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('api/help/:method', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'help')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // laconica
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-15 10:29:54 -04:00
										 |  |  |         $m->connect('api/laconica/:method', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'laconica')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         $m->connect('api/laconica/:method', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'laconica')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-10 17:56:01 -07:00
										 |  |  |         // Groups
 | 
					
						
							|  |  |  |         $m->connect('api/laconica/groups/:method/:argument', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'groups')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-10 18:22:19 -07:00
										 |  |  |         $m->connect('api/laconica/groups/:method', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'groups')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-12 15:07:54 -04:00
										 |  |  |         // Tags
 | 
					
						
							|  |  |  |         $m->connect('api/laconica/tags/:method/:argument', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'tags')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect('api/laconica/tags/:method', | 
					
						
							|  |  |  |                     array('action' => 'api', | 
					
						
							|  |  |  |                           'apiaction' => 'tags')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-04 18:14:52 -08:00
										 |  |  |         // search
 | 
					
						
							| 
									
										
										
										
											2009-03-06 13:33:47 -08:00
										 |  |  |         $m->connect('api/search.atom', array('action' => 'twitapisearchatom')); | 
					
						
							|  |  |  |         $m->connect('api/search.json', array('action' => 'twitapisearchjson')); | 
					
						
							| 
									
										
										
										
											2009-03-04 18:14:52 -08:00
										 |  |  |         $m->connect('api/trends.json', array('action' => 'twitapitrends')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         // user stuff
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-10 16:15:57 -07:00
										 |  |  |         foreach (array('subscriptions', 'subscribers', | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |                        'nudge', 'xrds', 'all', 'foaf', | 
					
						
							|  |  |  |                        'replies', 'inbox', 'outbox', 'microsummary') as $a) { | 
					
						
							|  |  |  |             $m->connect(':nickname/'.$a, | 
					
						
							|  |  |  |                         array('action' => $a), | 
					
						
							|  |  |  |                         array('nickname' => '[a-zA-Z0-9]{1,64}')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach (array('subscriptions', 'subscribers') as $a) { | 
					
						
							|  |  |  |             $m->connect(':nickname/'.$a.'/:tag', | 
					
						
							|  |  |  |                         array('action' => $a), | 
					
						
							|  |  |  |                         array('tag' => '[a-zA-Z0-9]+', | 
					
						
							|  |  |  |                               'nickname' => '[a-zA-Z0-9]{1,64}')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach (array('rss', 'groups') as $a) { | 
					
						
							|  |  |  |             $m->connect(':nickname/'.$a, | 
					
						
							|  |  |  |                         array('action' => 'user'.$a), | 
					
						
							|  |  |  |                         array('nickname' => '[a-zA-Z0-9]{1,64}')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach (array('all', 'replies', 'favorites') as $a) { | 
					
						
							|  |  |  |             $m->connect(':nickname/'.$a.'/rss', | 
					
						
							|  |  |  |                         array('action' => $a.'rss'), | 
					
						
							|  |  |  |                         array('nickname' => '[a-zA-Z0-9]{1,64}')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect(':nickname/favorites', | 
					
						
							|  |  |  |                     array('action' => 'showfavorites'), | 
					
						
							|  |  |  |                     array('nickname' => '[a-zA-Z0-9]{1,64}')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $m->connect(':nickname/avatar/:size', | 
					
						
							|  |  |  |                     array('action' => 'avatarbynickname'), | 
					
						
							|  |  |  |                     array('size' => '(original|96|48|24)', | 
					
						
							|  |  |  |                           'nickname' => '[a-zA-Z0-9]{1,64}')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-18 18:18:08 -04:00
										 |  |  |         $m->connect(':nickname/tag/:tag/rss', | 
					
						
							|  |  |  |             array('action' => 'userrss'), | 
					
						
							|  |  |  |             array('nickname' => '[a-zA-Z0-9]{1,64}'), | 
					
						
							|  |  |  |             array('tag' => '[a-zA-Z0-9]+')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-18 17:18:57 -04:00
										 |  |  |         $m->connect(':nickname/tag/:tag', | 
					
						
							|  |  |  |                     array('action' => 'showstream'), | 
					
						
							|  |  |  |                     array('nickname' => '[a-zA-Z0-9]{1,64}'), | 
					
						
							|  |  |  |                     array('tag' => '[a-zA-Z0-9]+')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         $m->connect(':nickname', | 
					
						
							|  |  |  |                     array('action' => 'showstream'), | 
					
						
							|  |  |  |                     array('nickname' => '[a-zA-Z0-9]{1,64}')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-04 15:34:04 +00:00
										 |  |  |         Event::handle('RouterInitialized', array($m)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-10 22:49:25 -05:00
										 |  |  |         return $m; | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function map($path) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-02-20 15:07:59 -08:00
										 |  |  |         try { | 
					
						
							|  |  |  |             $match = $this->m->match($path); | 
					
						
							|  |  |  |         } catch (Net_URL_Mapper_InvalidException $e) { | 
					
						
							|  |  |  |             common_log(LOG_ERR, "Problem getting route for $path - " . | 
					
						
							| 
									
										
										
										
											2009-03-25 12:56:52 -04:00
										 |  |  |                        $e->getMessage()); | 
					
						
							| 
									
										
										
										
											2009-02-20 15:07:59 -08:00
										 |  |  |             $cac = new ClientErrorAction("Page not found.", 404); | 
					
						
							|  |  |  |             $cac->showPage(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $match; | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-20 17:30:09 -05:00
										 |  |  |     function build($action, $args=null, $params=null, $fragment=null) | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         $action_arg = array('action' => $action); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($args) { | 
					
						
							| 
									
										
										
										
											2009-02-11 00:45:11 -05:00
										 |  |  |             $args = array_merge($action_arg, $args); | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |         } else { | 
					
						
							|  |  |  |             $args = $action_arg; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-25 15:39:58 +00:00
										 |  |  |         $url = $this->m->generate($args, $params, $fragment); | 
					
						
							| 
									
										
										
										
											2009-03-25 15:39:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Due to a bug in the Net_URL_Mapper code, the returned URL may
 | 
					
						
							|  |  |  |         // contain a malformed query of the form ?p1=v1?p2=v2?p3=v3. We
 | 
					
						
							|  |  |  |         // repair that here rather than modifying the upstream code...
 | 
					
						
							| 
									
										
										
										
											2009-03-25 12:56:52 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $qpos = strpos($url, '?'); | 
					
						
							| 
									
										
										
										
											2009-03-25 15:39:58 +00:00
										 |  |  |         if ($qpos !== false) { | 
					
						
							|  |  |  |             $url = substr($url, 0, $qpos+1) . | 
					
						
							| 
									
										
										
										
											2009-03-25 12:56:52 -04:00
										 |  |  |               str_replace('?', '&', substr($url, $qpos+1)); | 
					
						
							| 
									
										
										
										
											2009-03-25 15:39:58 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |         return $url; | 
					
						
							| 
									
										
										
										
											2009-02-10 22:32:38 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-02-21 18:51:56 +01:00
										 |  |  | } |