Skip to content
Snippets Groups Projects
bokeh_eco.php 3.29 KiB
Newer Older
<?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();
?>