<?php require_once 'library/Class/Url.php'; class Bokeh_EngineEco { protected $_actions = []; public static function dispatchWithExit() { if ((new static())->dispatch()) exit; } public function __construct() { $this->addAction('/admin/index/heartbeat', function($params) { session_start(); session_write_close(); }); $this->addAction('/recherche/suggestajax', function($params) { echo (new Bokeh_EngineEco_AutocompleteRequest())->dispatch($params); }); $this->addAction('/sitemap.xml', function($params) {echo (new Bokeh_EngineEco_SitemapRequest())->dispatch();}); } public function addAction($url, $callable) { $this->_actions[Class_Url::baseUrl() . $url] = $callable; return $this; } public function dispatch() { if (!isset($_SERVER['REQUEST_URI'])) return false; $request = parse_url($_SERVER['REQUEST_URI']); if (!isset($this->_actions[$request['path']])) return false; $query_params = []; if (isset($request['query'])) parse_str($request['query'], $query_params); call_user_func($this->_actions[$request['path']], $query_params); return true; } } class Bokeh_EngineEco_AutocompleteRequest { protected function _loadEnvironment() { require_once 'library/Trait/StaticFileSystem.php'; require_once 'library/Trait/Translator.php'; require_once 'library/Class/Autocomplete/Index.php'; require_once 'library/Class/Autocomplete/IndexNull.php'; require_once 'library/Class/Autocomplete/IndexTitle.php'; require_once 'library/Class/Autocomplete/IndexAuthor.php'; require_once 'library/Class/Autocomplete/IndexSearcher.php'; require_once 'library/startup.php'; defineConstant('BASE_URL', Class_Url::baseUrl()); (new Bokeh_Engine())->setupConstants(); } public function dispatch($params) { if (!(isset($params['startsWith']) && $startsWith = trim($params['startsWith']))) { return '[]'; } $this->_loadEnvironment(); $results = Class_Autocomplete_Index::searchAll($startsWith); $terms = Class_Autocomplete_IndexSearcher::extractTerms($startsWith); $term_regex = '/('.implode('|', $terms).')/iu'; $json = []; foreach($results as $index => $result) { $json[] = ['label' => preg_replace($term_regex, '<span>$1</span>', $result), 'value' => $result]; } return json_encode($json); } } class Bokeh_EngineEco_SitemapRequest { protected function _loadEnvironment() { require_once 'library/storm/src/Storm/FileSystem/Abstract.php'; require_once 'library/storm/src/Storm/FileSystem/Disk.php'; require_once 'library/Class/UserAgent.php'; require_once 'library/Class/Sitemap.php'; require_once 'library/startup.php'; defineConstant('BASE_URL', Class_Url::baseUrl()); Bokeh_Engine::getInstance()->setupConstants(); } public function dispatch() { $this->_loadEnvironment(); if (!Class_Sitemap::getInstance()->sitemap_exists()) return; header('Content-Type: text/xml; charset=utf-8'); echo Class_Sitemap::getInstance()->getSitemap(); } } Bokeh_EngineEco::dispatchWithExit(); ?>