<?php
namespace nur\v\model;

/**
 * Interface IPlugin: un composant qui apporte une fonctionnalité à une page,
 * mais qui n'a aucun affichage. la fonctionnalité passe par le chargement de
 * feuilles CSS ou de scripts
 */
interface IPlugin {
  /**
   * @return ?string|array url d'une feuille de style à charger pour ce plugin
   */
  function getCss();

  /**
   * indiquer que la feuille de style est générée dynamiquement: il faut la
   * charger même si elle est déjà mentionnée par d'autres plugins
   */
  function isDynamicCss(): bool;

  /** afficher les tags pour charger les feuilles de style */
  function printCss(): void;

  /**
   * @return ?string|array url d'un script à charger pour ce plugin
   */
  function getJs();

  /**
   * indiquer que le script est généré dynamiquement: il faut le charger même
   * s'il est déjà mentionné par d'autres plugins
   */
  function isDynamicJs(): bool;

  /** afficher les tags pour charger les scripts */
  function printJs(): void;

  /** la méthode {@link printScript()} affiche-t-elle quelque chose? */
  function haveScript(): bool;

  /**
   * afficher le script générique
   *
   * pour simplifier l'intégration, si la première ligne affichée est exactement
   *     <script type="text/javascript">
   * et la dernière ligne
   *     </script>
   * alors ces lignes sont supprimées de la sortie, et le script est intégré
   * dans une balise globale. Sinon, si la première ligne contient une balise
   * <script> quelconque, alors l'affichage est fait tel quel
   */
  function printScript(): void;

  /** la méthode {@link printJquery()} affiche-t-elle quelque chose? */
  function haveJquery(): bool;

  /**
   * afficher le script JQuery
   *
   * pour simplifier l'intégration, si les deux premières lignes affichées sont
   * exactement
   *     <script type="text/javascript">
   *     jQuery.noConflict()(function($) {
   * et les deux dernières lignes
   *     });
   *     </script>
   * alors ces lignes sont supprimées de la sortie, et le script est intégré
   * dans une section partagée globale. Sinon, si la première ligne contient
   * une balise <script> quelconque, alors l'affichage est fait tel quel
   */
  function printJquery(): void;
}
