L’efficacia di drupal_is_front_page con un esempio pratico

Pubblicato da Nicola Rainiero il 23-06-2015 (aggiornato il 11-08-2016)

Usando questa funzione ho potuto riattivare il modulo MathJax che mi bloccava la visualizzazione completa della prima pagina del mio sito in Drupal 7. Nell'articolo descrivo come ho sistemato il problema mediante la funzione drupal_is_front_page() con l'aggiunta di pochissimo codice PHP.

Quando ho scoperto il modulo MathJax1 e ho iniziato ad utilizzarlo nel mio sito, funzionava perfettamente e bastava aggiungere i nodi dove attivarlo o escluderlo dalla propria pagina di configurazione (../admin/config/content/mathjax). La procedura veniva completata in un click all'interno della sezione PAGE SPECIFIC ACTIVATION SETTINGS, così descritta:

Attiva MathJax su pagine specifiche:

  • Tutte le pagine eccetto quelle elencate
  • Solo le pagine elencate

Per maggiori informazioni suggerisco di leggere il mio articolo: MathJax e MathML in Drupal. Ammetto che Forse aggiungere di volta in volta i nodi che facevano uso di formule era un po' troppo macchinoso, ma così evitavo di caricare su ogni pagina una libreria in più, a maggior ragione se non veniva poi impiegata.

La funzione drupal_is_front_page mostrata con un esempio

Anamnesi

A partire dalla versione 2.0, questa possibilità è stata rimossa e adesso la libreria viene caricata come un filtro2 su ogni pagina, prima pagina inclusa, con questo risultato:

  • Prima di MathJax 2.0
    Prima di MathJax 2.0
  • Dopo MathJax 2.0
    Dopo

Quindi sono stato costretto a rimuoverlo dalla pagina di configurazione dei Formati del testo (../admin/config/content/formats), fino al momento in cui non avrei trovato una soluzione accettabile per inserirlo nuovamente. Così per un po' di tempo le mie bellissime formule matematiche sono ritornate allo stato originale, in puro LaTeX:

\[\begin{aligned}
\epsilon &= 3.94 - 8.21 n + 6.23 n^2 \\
K_c &= \bigl( {{10 \phi a} \over {3.6^n \epsilon}} \bigr)^{1 \over {1-n}} {{1} \over {ln {\epsilon \over {\epsilon - 1}}}} \\
u &= \Bigl( {K_c \over {v_0}} \Bigr)^{{1 - n} \over {n}}
\\ Q &= u S
\end{aligned}\]

Invece di essere renderizzate così:

\[\begin{aligned} \epsilon &= 3.94 - 8.21 n + 6.23 n^2 \\ K_c &= \bigl( {{10 \phi a} \over {3.6^n \epsilon}} \bigr)^{1 \over {1-n}} {{1} \over {ln {\epsilon \over {\epsilon - 1}}}} \\ u &= \Bigl( {K_c \over {v_0}} \Bigr)^{{1 - n} \over {n}} \\ Q &= u S \end{aligned} \]

Palliativo

Recentemente ho trovato una semplice soluzione, in parole povere una pezza, per aggirare questo inconveniente: drupal_is_front_page(). È una funzione PHP che controlla se la pagina corrente è quella principale, restituendo una valore booleano: TRUE se la pagina è quella principale, FALSE altrimenti3.

In questi casi si dovrebbe partire dal codice HTML generato dalla pagina problematica e poi decidere il da farsi, ma nel mio caso mi ero messo in testa che il problema fosse il semplice caricamento della libreria Javascript e ho di conseguenza istruito il file ../sites/all/modules/mathjax/mathjax.module su come non caricarla nella pagina principale, questo è il codice:

function mathjax_init() {
/** MY CODE **/
if (!drupal_is_front_page()) { // Don't load the JavaScript library on front page
/** MY CODE **/ 
  if(variable_get('mathjax_config_type', 0) == 0) {
    $config_string = mathjax_default('config string');
  }
  else {
    $config_string = variable_get('mathjax_config_string', mathjax_default('config string'));
  }
  // Load Mathjax.
  $config = array(
    '#type' => 'markup',
    '#markup' => '<script type="text/x-mathjax-config">' . $config_string . '</script>',
  );
  drupal_add_html_head($config, 'mathjax-config');
  drupal_add_js(drupal_get_path('module', 'mathjax') . '/mathjax.js');
  if (variable_get('mathjax_use_cdn', TRUE)) {
    $cdn_url = variable_get('mathjax_cdn_url', mathjax_default('cdn url'));
    drupal_add_js($cdn_url, 'external');
  }
  else {
    if (function_exists('libraries_get_path')) {
      drupal_add_js(libraries_get_path('mathjax', TRUE) . '/MathJax.js?config=TeX-AMS-MML_HTMLorMML', 'external');
    }
  }
}
/** MY CODE **/
}
/** MY CODE **/

Ovviamente non ha funzionato, perché guardando l'HTML sorgente della pagina ho scoperto che c'erano moltissimi tag <div> privi della relativa chiusura </div>4, con il modulo MathJax attivo:

[...]<div class="tex2jax"><p>It happens that you have to print for job or personal pleasure, one or more posters in a big format and like me you don't use famous commercial software and you aren't a professional illustrator. But how can the color palette of your document fit the request of the typography? This post tries to show a simple conversion of a pdf from RGB to CMYK, using ghostscript library...</span>  </span></div>[...]

Con MathJax spento:

[...]<p>It happens that you have to print for job or personal pleasure, one or more posters in a big format and like me you don't use famous commercial software and you aren't a professional illustrator. But how can the color palette of your document fit the request of the typography? This post tries to show a simple conversion of a pdf from RGB to CMYK, using ghostscript library and imagemagick in a...</span>  </span></div>[...]

''Elementare, Watson!'' - Tralasciando l'analisi del tag <p>5, ho quindi inserito nel file ../sites/all/modules/mathjax/mathjax.module la richiesta di non inserire il testo <div class="tex2jax"> nella pagina principale del mio sito. Ecco il codice che corregge il problema:

/**
 * Mathjax filter process callback.
 */
function mathjax_filter_process($text, $filter, $format) {
       // MY CODE STARTS
       if (drupal_is_front_page()) {
              return $text;
       }
       else {
       // MY CODE ENDS
              return '<div class="tex2jax">' . $text . '</div>';
       }
// MY CODE STARTS
}
// MY CODE ENDS

Magari la prossima volta comincio subito dal codice sorgente e poi penso a come sistemare il tutto!

  • 1. MathJax: LaTeX for Drupal è un metodo veloce per integrare la libreria MathJax nel proprio sito Drupal. MathJax è basato su JavaScript e permette di visualizzare il codice LaTeX all'interno delle proprie pagine HTML.
  • 2. Applicare filtri al testo 
    Ogni formato del testo usa dei filtri per manipolare il testo, e molti formati applicano diversi filtri al testo in uno specifico ordine. Ogni filtro è progettato per uno specifico scopo, e generalmente aggiunge, rimuove, o trasforma gli elementi presenti nel testo inserito dall'utente prima che venga visualizzato. Un filtro non modifica in alcun modo il contenuto, piuttosto lo manipola "al volo" mentre viene elaborato per la visualizzazione. Un filtro potrebbe rimuovere tag HTML non consentiti, mentre un altro potrebbe aggiungere automaticamente codice HTML per rendere cliccabili gli URL. Fonte: Drupal help (../admin/help/filter)
  • 3. Fonte: drupal_is_front_page | path.inc | Drupal 7 | DrupalContrib
  • 4. Chiaramente non mi sono messo a leggere riga per riga il sorgente, ma lo ho confrontato usando Meld, o lo stesso sarebbe stato con Diffuse, per evidenziare le differenze tra la pagina con MathJax attivo e quella senza.
  • 5. Probabilmente dovrò selezionare il "Field can contain HTML": if checked, HTML corrector will be run to ensure tags are properly closed after trimming, nella rispettiva pagina di configurazione di Views.



Potrebbero interessarti anche:

Nicola Rainiero

Ingegnere civile specializzato in geotecnica con l'ambizione di facilitare la propria attività lavorativa usando e creando software libero per un sapere condiviso e collettivo. Mi occupo anche di energie rinnovabili ed in particolare di geotermia a bassa entalpia. Sono da sempre appassionato di web design e modellazione 3D.

Commenti

A dirti la sincera verità perché non conoscevo questo plugin! Purtroppo uso come editor TinyMCE e quindi mi era sembrata la soluzione più facile. Grazie per le dritte, investigherò.