diff --git a/classes/controller/userguide.php b/classes/controller/userguide.php index d927925e..e3196143 100644 --- a/classes/controller/userguide.php +++ b/classes/controller/userguide.php @@ -1,384 +1,3 @@ request->action() === 'media') - { - // Do not template media files - $this->auto_render = FALSE; - } - else - { - // Grab the necessary routes - $this->media = Route::get('docs/media'); - $this->guide = Route::get('docs/guide'); - - // Set the base URL for links and images - Kodoc_Markdown::$base_url = URL::site($this->guide->uri()).'/'; - Kodoc_Markdown::$image_url = URL::site($this->media->uri()).'/'; - } - - // Default show_comments to config value - $this->template->show_comments = Kohana::config('userguide.show_comments'); - } - - // List all modules that have userguides - public function index() - { - $this->template->title = "Userguide"; - $this->template->breadcrumb = array('User Guide'); - $this->template->content = View::factory('userguide/index', array('modules' => $this->_modules())); - $this->template->menu = View::factory('userguide/menu', array('modules' => $this->_modules())); - - // Don't show disqus on the index page - $this->template->show_comments = FALSE; - } - - // Display an error if a page isn't found - public function error($message) - { - $this->response->status(404); - $this->template->title = "Userguide - Error"; - $this->template->content = View::factory('userguide/error',array('message' => $message)); - - // Don't show disqus on error pages - $this->template->show_comments = FALSE; - - // If we are in a module and that module has a menu, show that - if ($module = $this->request->param('module') AND $menu = $this->file($module.'/menu') AND Kohana::config('userguide.modules.'.$module.'.enabled')) - { - // Namespace the markdown parser - Kodoc_Markdown::$base_url = URL::site($this->guide->uri()).'/'.$module.'/'; - Kodoc_Markdown::$image_url = URL::site($this->media->uri()).'/'.$module.'/'; - - $this->template->menu = Kodoc_Markdown::markdown($this->_get_all_menu_markdown()); - $this->template->breadcrumb = array( - $this->guide->uri() => 'User Guide', - $this->guide->uri(array('module' => $module)) => Kohana::config('userguide.modules.'.$module.'.name'), - 'Error' - ); - } - // If we are in the api browser, show the menu and show the api browser in the breadcrumbs - else if (Route::name($this->request->route()) == 'docs/api') - { - $this->template->menu = Kodoc::menu(); - - // Bind the breadcrumb - $this->template->breadcrumb = array( - $this->guide->uri(array('page' => NULL)) => 'User Guide', - $this->request->route()->uri() => 'API Browser', - 'Error' - ); - } - // Otherwise, show the userguide module menu on the side - else - { - $this->template->menu = View::factory('userguide/menu',array('modules' => $this->_modules())); - $this->template->breadcrumb = array($this->request->route()->uri() => 'User Guide','Error'); - } - } - - public function action_docs() - { - $module = $this->request->param('module'); - $page = $this->request->param('page'); - - // Trim trailing slash - $page = rtrim($page, '/'); - - // If no module provided in the url, show the user guide index page, which lists the modules. - if ( ! $module) - { - return $this->index(); - } - - $config = Kohana::config('userguide.modules.'.$module); - - // If this module's userguide pages are disabled, show the error page - if ( ! Arr::get($config, 'enabled')) - { - return $this->error(__('That module doesn\'t exist, or has userguide pages disabled.')); - } - - // Get the index page from config, default to "index" - $index = Arr::get($config, 'index', 'index'); - - // Prevent "guide/module" and "guide/module/index" from having duplicate content - if ( $page === $index) - { - return $this->error(__('Userguide page not found')); - } - - // If a module is set, but no page was provided in the url, show the index page - if ( ! $page ) - { - $page = $index; - } - - // Find the markdown file for this page - $file = $this->file($module.'/'.$page); - - // If it's not found, show the error page - if ( ! $file) - { - return $this->error(__('Userguide page not found')); - } - - // Namespace the markdown parser - Kodoc_Markdown::$base_url = URL::site($this->guide->uri()).'/'.$module.'/'; - Kodoc_Markdown::$image_url = URL::site($this->media->uri()).'/'.$module.'/'; - - // Set the page title - $this->template->title = ($page === $index) ? Arr::get($config, 'name') : $this->title($page); - - // Parse the page contents into the template - Kodoc_Markdown::$show_toc = true; - $this->template->content = Kodoc_Markdown::markdown(file_get_contents($file)); - Kodoc_Markdown::$show_toc = false; - - // Attach this module's menu to the template - $this->template->menu = Kodoc_Markdown::markdown($this->_get_all_menu_markdown()); - - // Bind the breadcrumb - $this->template->bind('breadcrumb', $breadcrumb); - - // Bind the copyright - $this->template->copyright = Arr::get($config, 'copyright'); - - // Add the breadcrumb trail - $breadcrumb = array(); - $breadcrumb[$this->guide->uri()] = __('User Guide'); - $breadcrumb[$this->guide->uri(array('module' => $module))] = Arr::get($config, 'name'); - - // TODO try and get parent category names (from menu). Regex magic or javascript dom stuff perhaps? - - // Only add the current page title to breadcrumbs if it isn't the index, otherwise we get repeats. - if ($page !== $index) - { - $breadcrumb[] = $this->template->title; - } - } - - public function action_api() - { - // Enable the missing class autoloader. If a class cannot be found a - // fake class will be created that extends Kodoc_Missing - spl_autoload_register(array('Kodoc_Missing', 'create_class')); - - // Get the class from the request - $class = $this->request->param('class'); - - // If no class was passed to the url, display the API index page - if ( ! $class) - { - $this->template->title = __('Table of Contents'); - - $this->template->content = View::factory('userguide/api/toc') - ->set('classes', Kodoc::class_methods()) - ->set('route', $this->request->route()); - } - else - { - // Create the Kodoc_Class version of this class. - $_class = Kodoc_Class::factory($class); - - // If the class requested and the actual class name are different - // (different case, orm vs ORM, auth vs Auth) redirect - if ($_class->class->name != $class) - { - $this->request->redirect($this->request->route()->uri(array('class'=>$_class->class->name))); - } - - // If this classes immediate parent is Kodoc_Missing, then it should 404 - if ($_class->class->getParentClass() AND $_class->class->getParentClass()->name == 'Kodoc_Missing') - return $this->error('That class was not found. Check your url and make sure that the module with that class is enabled.'); - - // If this classes package has been disabled via the config, 404 - if ( ! Kodoc::show_class($_class)) - return $this->error('That class is in package that is hidden. Check the api_packages config setting.'); - - // Everything is fine, display the class. - $this->template->title = $class; - - $this->template->content = View::factory('userguide/api/class') - ->set('doc', Kodoc::factory($class)) - ->set('route', $this->request->route()); - } - - // Attach the menu to the template - $this->template->menu = Kodoc::menu(); - - // Bind the breadcrumb - $this->template->bind('breadcrumb', $breadcrumb); - - // Get the docs URI - $guide = Route::get('docs/guide'); - - // Add the breadcrumb - $breadcrumb = array(); - $breadcrumb[$this->guide->uri(array('page' => NULL))] = __('User Guide'); - $breadcrumb[$this->request->route()->uri()] = 'API Browser'; - $breadcrumb[] = $this->template->title; - } - - public function action_media() - { - // Get the file path from the request - $file = $this->request->param('file'); - - // Find the file extension - $ext = pathinfo($file, PATHINFO_EXTENSION); - - // Remove the extension from the filename - $file = substr($file, 0, -(strlen($ext) + 1)); - - if ($file = Kohana::find_file('media/guide', $file, $ext)) - { - // Check if the browser sent an "if-none-match: " header, and tell if the file hasn't changed - $this->response->check_cache(sha1($this->request->uri()).filemtime($file), $this->request); - - // Send the file content as the response - $this->response->body(file_get_contents($file)); - - // Set the proper headers to allow caching - $this->response->headers('content-type', File::mime_by_ext($ext)); - $this->response->headers('last-modified', date('r', filemtime($file))); - } - else - { - // Return a 404 status - $this->response->status(404); - } - } - - public function after() - { - if ($this->auto_render) - { - // Get the media route - $media = Route::get('docs/media'); - - // Add styles - $this->template->styles = array( - $media->uri(array('file' => 'css/print.css')) => 'print', - $media->uri(array('file' => 'css/screen.css')) => 'screen', - $media->uri(array('file' => 'css/kodoc.css')) => 'screen', - $media->uri(array('file' => 'css/shCore.css')) => 'screen', - $media->uri(array('file' => 'css/shThemeKodoc.css')) => 'screen', - ); - - // Add scripts - $this->template->scripts = array( - $media->uri(array('file' => 'js/jquery.min.js')), - $media->uri(array('file' => 'js/jquery.cookie.js')), - $media->uri(array('file' => 'js/kodoc.js')), - // Syntax Highlighter - $media->uri(array('file' => 'js/shCore.js')), - $media->uri(array('file' => 'js/shBrushPhp.js')), - ); - - // Add languages - $this->template->translations = Kohana::message('userguide', 'translations'); - } - - return parent::after(); - } - - public function file($page) - { - return Kohana::find_file('guide', $page, 'md'); - } - - public function section($page) - { - $markdown = $this->_get_all_menu_markdown(); - - if (preg_match('~\*{2}(.+?)\*{2}[^*]+\[[^\]]+\]\('.preg_quote($page).'\)~mu', $markdown, $matches)) - { - return $matches[1]; - } - - return $page; - } - - public function title($page) - { - $markdown = $this->_get_all_menu_markdown(); - - if (preg_match('~\[([^\]]+)\]\('.preg_quote($page).'\)~mu', $markdown, $matches)) - { - // Found a title for this link - return $matches[1]; - } - - return $page; - } - - protected function _get_all_menu_markdown() - { - // Only do this once per request... - static $markdown = ''; - - if (empty($markdown)) - { - // Get menu items - $file = $this->file($this->request->param('module').'/menu'); - - if ($file AND $text = file_get_contents($file)) - { - // Add spans around non-link categories. This is a terrible hack. - //echo Kohana::debug($text); - - //$text = preg_replace('/(\s*[\-\*\+]\s*)(.*)/','$1$2',$text); - $text = preg_replace('/^(\s*[\-\*\+]\s*)([^\[\]]+)$/m','$1$2',$text); - //echo Kohana::debug($text); - $markdown .= $text; - } - - } - - return $markdown; - } - - // Get the list of modules from the config, and reverses it so it displays in the order the modules are added, but move Kohana to the top. - protected function _modules() - { - $modules = array_reverse(Kohana::config('userguide.modules')); - - if (isset($modules['kohana'])) - { - $kohana = $modules['kohana']; - unset($modules['kohana']); - $modules = array_merge(array('kohana' => $kohana), $modules); - } - - // Remove modules that have been disabled via config - foreach ($modules as $key => $value) - { - if ( ! Kohana::config('userguide.modules.'.$key.'.enabled')) - { - unset($modules[$key]); - } - } - - return $modules; - } - -} // End Userguide +class Controller_Userguide extends Kohana_Controller_Userguide {} diff --git a/classes/kohana/controller/userguide.php b/classes/kohana/controller/userguide.php new file mode 100644 index 00000000..5472f5ed --- /dev/null +++ b/classes/kohana/controller/userguide.php @@ -0,0 +1,384 @@ +request->action() === 'media') + { + // Do not template media files + $this->auto_render = FALSE; + } + else + { + // Grab the necessary routes + $this->media = Route::get('docs/media'); + $this->guide = Route::get('docs/guide'); + + // Set the base URL for links and images + Kodoc_Markdown::$base_url = URL::site($this->guide->uri()).'/'; + Kodoc_Markdown::$image_url = URL::site($this->media->uri()).'/'; + } + + // Default show_comments to config value + $this->template->show_comments = Kohana::config('userguide.show_comments'); + } + + // List all modules that have userguides + public function index() + { + $this->template->title = "Userguide"; + $this->template->breadcrumb = array('User Guide'); + $this->template->content = View::factory('userguide/index', array('modules' => $this->_modules())); + $this->template->menu = View::factory('userguide/menu', array('modules' => $this->_modules())); + + // Don't show disqus on the index page + $this->template->show_comments = FALSE; + } + + // Display an error if a page isn't found + public function error($message) + { + $this->response->status(404); + $this->template->title = "Userguide - Error"; + $this->template->content = View::factory('userguide/error',array('message' => $message)); + + // Don't show disqus on error pages + $this->template->show_comments = FALSE; + + // If we are in a module and that module has a menu, show that + if ($module = $this->request->param('module') AND $menu = $this->file($module.'/menu') AND Kohana::config('userguide.modules.'.$module.'.enabled')) + { + // Namespace the markdown parser + Kodoc_Markdown::$base_url = URL::site($this->guide->uri()).'/'.$module.'/'; + Kodoc_Markdown::$image_url = URL::site($this->media->uri()).'/'.$module.'/'; + + $this->template->menu = Kodoc_Markdown::markdown($this->_get_all_menu_markdown()); + $this->template->breadcrumb = array( + $this->guide->uri() => 'User Guide', + $this->guide->uri(array('module' => $module)) => Kohana::config('userguide.modules.'.$module.'.name'), + 'Error' + ); + } + // If we are in the api browser, show the menu and show the api browser in the breadcrumbs + else if (Route::name($this->request->route()) == 'docs/api') + { + $this->template->menu = Kodoc::menu(); + + // Bind the breadcrumb + $this->template->breadcrumb = array( + $this->guide->uri(array('page' => NULL)) => 'User Guide', + $this->request->route()->uri() => 'API Browser', + 'Error' + ); + } + // Otherwise, show the userguide module menu on the side + else + { + $this->template->menu = View::factory('userguide/menu',array('modules' => $this->_modules())); + $this->template->breadcrumb = array($this->request->route()->uri() => 'User Guide','Error'); + } + } + + public function action_docs() + { + $module = $this->request->param('module'); + $page = $this->request->param('page'); + + // Trim trailing slash + $page = rtrim($page, '/'); + + // If no module provided in the url, show the user guide index page, which lists the modules. + if ( ! $module) + { + return $this->index(); + } + + $config = Kohana::config('userguide.modules.'.$module); + + // If this module's userguide pages are disabled, show the error page + if ( ! Arr::get($config, 'enabled')) + { + return $this->error(__('That module doesn\'t exist, or has userguide pages disabled.')); + } + + // Get the index page from config, default to "index" + $index = Arr::get($config, 'index', 'index'); + + // Prevent "guide/module" and "guide/module/index" from having duplicate content + if ( $page === $index) + { + return $this->error(__('Userguide page not found')); + } + + // If a module is set, but no page was provided in the url, show the index page + if ( ! $page ) + { + $page = $index; + } + + // Find the markdown file for this page + $file = $this->file($module.'/'.$page); + + // If it's not found, show the error page + if ( ! $file) + { + return $this->error(__('Userguide page not found')); + } + + // Namespace the markdown parser + Kodoc_Markdown::$base_url = URL::site($this->guide->uri()).'/'.$module.'/'; + Kodoc_Markdown::$image_url = URL::site($this->media->uri()).'/'.$module.'/'; + + // Set the page title + $this->template->title = ($page === $index) ? Arr::get($config, 'name') : $this->title($page); + + // Parse the page contents into the template + Kodoc_Markdown::$show_toc = true; + $this->template->content = Kodoc_Markdown::markdown(file_get_contents($file)); + Kodoc_Markdown::$show_toc = false; + + // Attach this module's menu to the template + $this->template->menu = Kodoc_Markdown::markdown($this->_get_all_menu_markdown()); + + // Bind the breadcrumb + $this->template->bind('breadcrumb', $breadcrumb); + + // Bind the copyright + $this->template->copyright = Arr::get($config, 'copyright'); + + // Add the breadcrumb trail + $breadcrumb = array(); + $breadcrumb[$this->guide->uri()] = __('User Guide'); + $breadcrumb[$this->guide->uri(array('module' => $module))] = Arr::get($config, 'name'); + + // TODO try and get parent category names (from menu). Regex magic or javascript dom stuff perhaps? + + // Only add the current page title to breadcrumbs if it isn't the index, otherwise we get repeats. + if ($page !== $index) + { + $breadcrumb[] = $this->template->title; + } + } + + public function action_api() + { + // Enable the missing class autoloader. If a class cannot be found a + // fake class will be created that extends Kodoc_Missing + spl_autoload_register(array('Kodoc_Missing', 'create_class')); + + // Get the class from the request + $class = $this->request->param('class'); + + // If no class was passed to the url, display the API index page + if ( ! $class) + { + $this->template->title = __('Table of Contents'); + + $this->template->content = View::factory('userguide/api/toc') + ->set('classes', Kodoc::class_methods()) + ->set('route', $this->request->route()); + } + else + { + // Create the Kodoc_Class version of this class. + $_class = Kodoc_Class::factory($class); + + // If the class requested and the actual class name are different + // (different case, orm vs ORM, auth vs Auth) redirect + if ($_class->class->name != $class) + { + $this->request->redirect($this->request->route()->uri(array('class'=>$_class->class->name))); + } + + // If this classes immediate parent is Kodoc_Missing, then it should 404 + if ($_class->class->getParentClass() AND $_class->class->getParentClass()->name == 'Kodoc_Missing') + return $this->error('That class was not found. Check your url and make sure that the module with that class is enabled.'); + + // If this classes package has been disabled via the config, 404 + if ( ! Kodoc::show_class($_class)) + return $this->error('That class is in package that is hidden. Check the api_packages config setting.'); + + // Everything is fine, display the class. + $this->template->title = $class; + + $this->template->content = View::factory('userguide/api/class') + ->set('doc', Kodoc::factory($class)) + ->set('route', $this->request->route()); + } + + // Attach the menu to the template + $this->template->menu = Kodoc::menu(); + + // Bind the breadcrumb + $this->template->bind('breadcrumb', $breadcrumb); + + // Get the docs URI + $guide = Route::get('docs/guide'); + + // Add the breadcrumb + $breadcrumb = array(); + $breadcrumb[$this->guide->uri(array('page' => NULL))] = __('User Guide'); + $breadcrumb[$this->request->route()->uri()] = 'API Browser'; + $breadcrumb[] = $this->template->title; + } + + public function action_media() + { + // Get the file path from the request + $file = $this->request->param('file'); + + // Find the file extension + $ext = pathinfo($file, PATHINFO_EXTENSION); + + // Remove the extension from the filename + $file = substr($file, 0, -(strlen($ext) + 1)); + + if ($file = Kohana::find_file('media/guide', $file, $ext)) + { + // Check if the browser sent an "if-none-match: " header, and tell if the file hasn't changed + $this->response->check_cache(sha1($this->request->uri()).filemtime($file), $this->request); + + // Send the file content as the response + $this->response->body(file_get_contents($file)); + + // Set the proper headers to allow caching + $this->response->headers('content-type', File::mime_by_ext($ext)); + $this->response->headers('last-modified', date('r', filemtime($file))); + } + else + { + // Return a 404 status + $this->response->status(404); + } + } + + public function after() + { + if ($this->auto_render) + { + // Get the media route + $media = Route::get('docs/media'); + + // Add styles + $this->template->styles = array( + $media->uri(array('file' => 'css/print.css')) => 'print', + $media->uri(array('file' => 'css/screen.css')) => 'screen', + $media->uri(array('file' => 'css/kodoc.css')) => 'screen', + $media->uri(array('file' => 'css/shCore.css')) => 'screen', + $media->uri(array('file' => 'css/shThemeKodoc.css')) => 'screen', + ); + + // Add scripts + $this->template->scripts = array( + $media->uri(array('file' => 'js/jquery.min.js')), + $media->uri(array('file' => 'js/jquery.cookie.js')), + $media->uri(array('file' => 'js/kodoc.js')), + // Syntax Highlighter + $media->uri(array('file' => 'js/shCore.js')), + $media->uri(array('file' => 'js/shBrushPhp.js')), + ); + + // Add languages + $this->template->translations = Kohana::message('userguide', 'translations'); + } + + return parent::after(); + } + + public function file($page) + { + return Kohana::find_file('guide', $page, 'md'); + } + + public function section($page) + { + $markdown = $this->_get_all_menu_markdown(); + + if (preg_match('~\*{2}(.+?)\*{2}[^*]+\[[^\]]+\]\('.preg_quote($page).'\)~mu', $markdown, $matches)) + { + return $matches[1]; + } + + return $page; + } + + public function title($page) + { + $markdown = $this->_get_all_menu_markdown(); + + if (preg_match('~\[([^\]]+)\]\('.preg_quote($page).'\)~mu', $markdown, $matches)) + { + // Found a title for this link + return $matches[1]; + } + + return $page; + } + + protected function _get_all_menu_markdown() + { + // Only do this once per request... + static $markdown = ''; + + if (empty($markdown)) + { + // Get menu items + $file = $this->file($this->request->param('module').'/menu'); + + if ($file AND $text = file_get_contents($file)) + { + // Add spans around non-link categories. This is a terrible hack. + //echo Kohana::debug($text); + + //$text = preg_replace('/(\s*[\-\*\+]\s*)(.*)/','$1$2',$text); + $text = preg_replace('/^(\s*[\-\*\+]\s*)([^\[\]]+)$/m','$1$2',$text); + //echo Kohana::debug($text); + $markdown .= $text; + } + + } + + return $markdown; + } + + // Get the list of modules from the config, and reverses it so it displays in the order the modules are added, but move Kohana to the top. + protected function _modules() + { + $modules = array_reverse(Kohana::config('userguide.modules')); + + if (isset($modules['kohana'])) + { + $kohana = $modules['kohana']; + unset($modules['kohana']); + $modules = array_merge(array('kohana' => $kohana), $modules); + } + + // Remove modules that have been disabled via config + foreach ($modules as $key => $value) + { + if ( ! Kohana::config('userguide.modules.'.$key.'.enabled')) + { + unset($modules[$key]); + } + } + + return $modules; + } + +} // End Userguide