ScrutariJs est un projet de client javascript complexe pour le moteur de recherche Scrutari. Son but est double : montrer toutes les possibilités offertes par l'API Json (et identifier ainsi les manques et les améliorations possibles) et proposer des composants réutilisables et adaptables à d'autres contextes.
ScrutariJS peut être vu en action aux adresses suivantes (la recherche porte sur la Coredem) :
ScrutariJs est en HTML 5 et se base sur les bibliothèques JQuery (requêtes Ajax et manipulation du DOM) et Bootstrap (pour la définition des composants et l'adaptation aux tailles d'écran). Les traitements du côté serveur sont fait en PHP.
Pour le moment, ScrutariJs n'a pas de version empaquetée. Le code source est disponible sur le dépôt FramaGit : https://framagit.org/Scrutari/scrutarijs
ou via le dépôt Subversion :
svn co http://depot.exemole.fr/svn/web/apps/coredem.info/scrutarijs
Comme JQuery et Bootstrap, ScrutariJs est sous licence MIT.
ScrutariJs est composée de deux parties principales : le répertoire scrutarijs/ qui contient le cœur de l'application sous la forme de fichiers statiques Javascript, CSS et d'images et le reste de l'application comprenant principalement des fichiers PHP. Le répertoire scrutarijs est autonome et conçu pour être réutilisable dans d'autres projets sans avoir besoin de PHP. La partie PHP est une exemple d'utilisation de la bibliothèque scrutarijs/ avec des possibilités de configuration pour l'utilisation du même code PHP avec des moteurs différents. Cette partie comprend également des scripts de génération de fichiers (compilation de javascript, fichiers de langue, pour scrutari.js.
scrutarijs contient deux répertoires css/ et js/.
Contient la feuille de style de l'application (scrutarijs.css) et les images utilisées par cette feuille de style.
scrutarijs.css contient des surcharges du style de Bootstrap ainsi que des indications de style pour les éléments propres à ScrutariJs. Pour distinguer les classes Bootstrap de celles propres à ScrutariJs, ces dernières commencent toujours par le préfixe scrutari-.
Pour les identifiants d'éléments HTML, la convention de nommage choisie est de les nommmer comme s'il s'agissait de noms de variable classique (commençant en minuscules avec des majuscules pour marquer le type, exemple : categoryPanelBody). Lorsque l'élement est transformé est manipulé sous forme JQuery, la variable est préfixé avec $. cela donne ce type de formulation qui facilite la correspondance entre code HTML et Javascript :
var $ficheDisplayBlock = $("#ficheDisplayBlock")
C'est le cœur de l'application puisque comme son nom l'indique, il contient les fichiers Javascript. scrutarijs/js contient à sa racine le fichier scrutarijs.js qui est la compilation de tous les fichiers Javascript du répertoire lib/ (ainsi que la structure HTML). L'ordre de compilation de ces fichiers est indiqué par le fichier lib/list.txt.
lib/ contient deux répertoires : scrutari/ qui est centré sur l'interaction avec l'API JSON du serveur Scrutari et engine/ qui contient l'interaction avec l'interface
La souplesse du langage Javascript conduit rapidement à un code difficilement lisible. Pour essayer d'éviter ce phénomène, les principes suivant ont été appliqués au code javascript des fichiers contenus dans le répertoire lib/ :
Ces différents principes conduisent à un code volontairement verbeux en espérant qu'il soit le plus lisible possible.
Les différents fichiers du répertoire lib/ sont les suivants :
scrutarijs/js contient également un répertoire l10n qui contient des fichiers javascript de localisation.
Les fichiers de ce répetoire assurent l'affichage de l'interface du moteur de recherche. Ce répertoire contient le fichier engine.php qui génère le HTML final. En mode « développement », il compile également les fichiers .html contenus dans ce répertoire engine/. En mode « production », ces fichiers .html sont inclus directement dans scrutarijs/js/scrutarijs.js (via les propriétés d'un objet Engine.html) et sont inclus au moment de l'initialisation du javascript.
Comme le fichier index.php à la racine de l'application sert d'aiguillage, il suffit de passer des paramètres à l'adresse du répertoire dans lequel est l'application (exemple : http://scrutarijs.coredem.info/?engine=coredem). En cas d'absence du paramètre engine, c'est le premier moteur défini qui est pris. Les autres paramètres possibles sont :
Une même instance de ScrutariJs peut appeler des moteurs différents. C'est le rôle du paramètre engine qui indique le nom du moteur à utiliser. Les moteurs disponibles sont indiqués dans un fichier de configuration. index.php considère que ce fichier de configuration s'appelle scrutarijs-conf.php et se situe au niveau en dessous du répertoire d'installation de ScrutariJs. Le fichier scrutarijs-conf_example.php compris dans le dépôt est un exemple de configuration. Un fichier de configuration doit définir un tableau associatif stocké dans $GLOBALS['scrutari']['conf']. Ce tableau associatif a les deux clés suivantes :
Exemple :
<?php $GLOBALS['scrutari']['conf'] = array( 'origin-prefix' => "coredemjs-", 'engines' => array( "coredem" => array( "url" => "http://sct1.scrutari.net/sct/coredem/", "corpus" => false ), "irenees" => array( "url" => "http://sct1.scrutari.net/sct/irenees/", "corpus" => true, "corpus-sort" => "none" ), "socioeco" => array( "url" => "http://sct1.scrutari.net/sct/socioeco/", "corpus" => false ), "premiermai" => array( "url" => "http://sct1.scrutari.net/sct/premiermai/", "corpus" => true, "css-links" => array( "scrutarijs/css/scrutarijs.css", "http://static.autourdu1ermai.fr/new/css/main.css", "http://static.autourdu1ermai.fr/new/css/scrutari.css" ), "js-links" => array("http://static.autourdu1ermai.fr/new/js/scrutari.js") ) ) );
Dans cet exemple, le moteur de la Coredem (« coredem ») propose un filtre sur les bases alors que celui d'Irénées (« irenees ») propose un filtre sur les corpus.
Le moteur d'Autour du 1er mai (« premiermai ») est allé plus loin dans la personnalisation. Les feuilles de styles font que l'aspect du moteur respecte la charte graphique du site et ne jure pas avec le reste. http://www.autourdu1ermai.fr/static/new/js/scrutari.js fait deux choses : d'une part, il réécrit la fonction Scrutari.Html.initFicheHtmlFunction pour que l'aspect des blocs de résultat soit plus proches des autres listes (par exemple, l'année est placée juste après le titre du film) et d'autre part, il définit un mode « iframe » qui lui permet d'adopter un comportement particulier correspondant à l'insertion de la page dans une balise <iframe>.
La compilation de tous les fichiers Javascript dans scrutarijs/js/scrutarijs.js permet de mettre en place l'interface du moteur de recherche sans besoin des fichiers PHP. Le code minimal pour le mettre en place est le suivant :
<!DOCTYPE html> <html lang="fr"> <head> <title>ScrutariJs</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link href="static/icon.png" type="image/png" rel="icon"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="//code.jquery.com/jquery-1.11.0.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> <script src="http://scrutarijs.coredem.info/scrutarijs/js/scrutarijs.js"></script> <script src="http://scrutarijs.coredem.info/scrutarijs/js/l10n/fr.js"></script> <script> $(function () { var scrutariConfig = new Scrutari.Config("coredem","http://sct1.scrutari.net/sct/coredem/", "fr", "coredemjs-coredem"); var engine = new Engine(scrutariConfig, Engine.l10n); engine.setWithCorpus(false); engine.setBaseSort("fiche-count"); engine.setCorpusSort("fiche-count"); engine.setMode(""); engine.setTarget("_blank"); engine.setInitialQuery(""); Engine.Init.html(engine, "#mainContainer"); Engine.Init.mainTitle(engine); Engine.Init.custom(engine); var _scrutariMetaCallback = function (scrutariMeta) { Engine.Init.scrutariMeta(engine, scrutariMeta); }; Scrutari.Meta.load(_scrutariMetaCallback, scrutariConfig); }); </script> <link rel="stylesheet" href="http://scrutarijs.coredem.info/scrutarijs/css/scrutarijs.css"> </head> <body> <div class="container" id="mainContainer"></div> </body> </html>
La partie la plus importante est celle d'initialisation indiquée par $(function () {, c'est là que le moteur est configuré.