Coloration Syntaxique

Du code en couleur pour plus de 500 langages de programmation avec PrismJS

Pourquoi un nouveau plugin ?

L’objectif du plugin est d’ajouter très simplement la possibilité de partager des portions de codes informatique au sein de vos contenus éditoriaux (articles, rubriques, etc...).

Le plugin coloration_code permet lui aussi de coloriser vos portions de code mais il utilise la librairie HighlightJS alors que ce plugin utilise PrismJS. Vous avez donc maintenant le choix en fonction de vos besoins si vous préférez HighlightJS ou PrismJS.

Le but de ce plugin est de rester très minimaliste, selon le principe « KISS, Keep It Simple, Stupid ».

Il ne dépend d’aucun autre plugin et charge les css/javascript de coloration syntaxique uniquement si il y a des balises <code> dans la page pour optimiser et alléger le rendu des pages.

Fonctionnalités

  • Le plugin ajoute la coloration syntaxique à tous les langages de programmation supportés par la librairie PrismJS. Il inclut aussi la prise en charge des langages spip (pour la typographie SPIP) et spip-squelette (pour les squelettes SPIP) pour faciliter le partage au sein de la communauté SPIP 😊.
  • Une unification de l’utilisation des raccourcis typographiques <cadre>, <frame>, et <code> est faite
    pour afficher le même résultat quelque soit le raccourci utilisé.
  • Le raccourci <pre> est quant à lui échappé et sécurisé sans traitement des balises <code> qu’il peut contenir.
  • Le raccourci typographique backtick simple markdown (ex. `ligne de code...`) est maintenant traité lors de l’appel de la fonction typo(), permettant ainsi d’ajouter du code sur une ligne au fil du texte dans vos titres, sous-titres et autres champs apparentés.
  • Le plugin facilite le copier-coller des blocs de code. En survolant un bloc de code, un bouton « Copier » s’affiche et au clic le contenu est copié dans le presse-papier.
  • Le plugin corrige aussi un bug du core SPIP qui affiche parfois en base64 des parties d’une portion de code (par exemple : <span class="base64" title="PGNvZGUgY2xhc3M9J3NwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lJyBkaXI9J2x0cic+dGVzdDwvY29kZT4="></span>).
  • Unification de la coloration syntaxique avec le squelette inclure/coloration_syntaxique.html pour pouvoir être utilisé directement depuis un squelette ou un raccourci typographique.
  • Chargement des css/javascript de coloration syntaxique uniquement si il y a des balises <code> dans la page pour optimiser et alléger le rendu des pages.
  • Un nouveau raccourci typographique SPIP <exemple_de_code> pour présenter proprement un exemple de code html ou spip.

Compatibilité et prérequis du plugin SPIP

Le plugin est compatible avec :

Utilisation

Le plugin utilise le plugin porte_plume pour ajouter des boutons à la barre d’édition de code informatique.

Code en ligne

`...votre portion de code...`

Le raccourci «backtick» simple, comme en Markdown [1], est utilisé pour afficher du code informatique au fil du texte. Cette portion de code informatique se trouve au sein d’un texte et reprend les caractéristiques typographiques de celui-ci tout en étant encadré.

Bloc de code

Pour afficher des portions de code informatique de plusieurs lignes, le triple «backtick» doit être utilisé (comme en Markdown [1]). Cela permet de bien restituer les indentations au début de chaque ligne.

Coloration syntaxique

Consultez la liste des langages de programmation supportés pour connaitre la référence d’un langage de programmation.

Il est possible de préciser un langage de programmation pour activer une coloration syntaxique du code. Pour cela, ajouter la référence du langage concerné juste après les 3 premiers «backtick». Par exemple pour du code HTML, commencez votre portion de code avec la référence : html.

Exemples

CSS

Le code suivant :

```css
.container {
	width: 900px;
}
.container div {
	display: inline-block;
	width: 300px;
}
```

Affichera :

HTML

Le code suivant :

```html
<div class="container">
	<div><p>Lorem Elsass ipsum bredele [...]</p></div>
	<div><p>Lorem Elsass ipsum bredele [...]</p></div>
	<div><p>Lorem Elsass ipsum bredele [...]</p></div>
</div>
```

Affichera :

Coloration syntaxique spécifique à SPIP

Pour faciliter le partage de portion de code SPIP et SQUELETTE, le plugin inclut la prise en charge des langages spip (pour la typographie SPIP) et spip-squelette (pour les squelettes SPIP).

Le code suivant :

```spip
{{{ Un intertitre }}}

Du texte avec {de l’italique} et {{du gras}} ou un {{ {mélange des deux} }}.
Un retour à la ligne avec [un lien externe->https://www.spip.net], [un lien interne->art2] et un lien interne avec un titre automatique [->rubrique2].

-* Une liste
-* Une liste
-** Sous élément de liste

-# Une liste ordonnée
-# Une liste ordonnée
-## Sous élément de liste ordonnée

Un séparateur
----
```

Affichera :

Le code suivant :

```spip-squelette
<footer class="footer clearfix" role="contentinfo">
	<p class="colophon">
		<BOUCLE_annee(ARTICLES){par date}{0,1}>[(#DATE|annee|!={#VAL{Y}|date}|oui)[(#DATE|annee)]]</BOUCLE_annee> - </B_annee>[(#DATE|annee) ]#NOM_SITE_SPIP
		<br /><a rel="contents" href="#URL_PAGE{plan}" class="first"><:plan_site:></a>[
		(#SESSION{id_auteur}|non) | <a href="[(#URL_PAGE{login}|parametre_url{url,#SELF})]" rel="nofollow" class='login_modal'><:lien_connecter:></a>][
		(#AUTORISER{ecrire})| <a href="#CONST{_DIR_RESTREINT_ABS}"><:espace_prive:></a>][
		(#SESSION{id_auteur}|oui) | <a href="#URL_LOGOUT" rel="nofollow"><:icone_deconnecter:></a>] | 
		<a rel="nofollow" href="#URL_PAGE{contact}"><:contact:></a> |
		<a href="#URL_PAGE{backend}" rel="alternate" title="<:syndiquer_site:>" class="last">RSS&nbsp;2.0</a>
	</p>
	[<small class="generator"><a href="https://www.spip.net/" rel="generator" title="<:site_realise_avec_spip:>" class="generator spip_out">(#CHEMIN{spip.svg}|balise_svg{'',SPIP})</a></small>]
</footer>
```

Affichera :

Nouveau raccourci SPIP : <exemple_de_code>

Une fois activé, le plugin permet l’utilisation du raccourci <exemple_de_code>...</exemple_de_code> dans vos contenus éditoriaux. Ce raccourci permet de présenter proprement un exemple de code html ou spip qui affichera successivement le rendu puis le code source de l’exemple.

Paramètres

Comme pour les modèles SPIP des paramètres sont disponibles :

  • langage (spip par défaut)
  • titre (Exemple de code : $langage$ par défaut)

Exemples d’utilisations

Avec les paramètres par défaut :

<exemple_de_code>
	Du texte avec {de l’italique} et {{du gras}} ou un {{ {mélange des deux} }}.
</exemple_de_code>

Avec un titre personnalisé :

<exemple_de_code|titre=Titre personnalisé>
	Du texte avec {de l’italique} et {{du gras}} ou un {{ {mélange des deux} }}.
</exemple_de_code>

Avec du code HTML :

<exemple_de_code|html>
	<div class="container">
		<div><p>Lorem Elsass ipsum bredele [...]</p></div>
		<div><p>Lorem Elsass ipsum bredele [...]</p></div>
		<div><p>Lorem Elsass ipsum bredele [...]</p></div>
	</div>
</exemple_de_code>

2 nouveaux squelettes SPIP pour afficher des portions de code informatique

Vous trouverez une explication plus détaillée des paramètres d’inclusions directement dans le code source de chaque squelette.

inclure/coloration_syntaxique

#SET{code,#CHEMIN{demo/coloration_syntaxique_code.html}|spip_file_get_contents}
<INCLURE{
	fond=inclure/coloration_syntaxique,
	langage=html,
	code=#GET{code},
}>

inclure/exemple_de_code

#SET{code,#CHEMIN{demo/coloration_syntaxique_exemple_de_code.spip}|spip_file_get_contents}
<INCLURE{
	fond=inclure/exemple_de_code,
	code=#GET{code},
}>

3 nouveaux pipelines SPIP

2 pipelines pour vos CSS et Javascript

Pour alléger le chargement des pages, le plugin déclenche dynamiquement le chargement des CSS/Javascript nécessaire à
la coloration syntaxique uniquement si une portion de code est présente dans la page.

Pour ajouter vos propres CSS/Javascript vous pouvez utiliser les pipelines suivant en indiquant le chemin du fichier CSS/Javascript
à charger dynamiquement :

  • coloration_syntaxique_css
  • coloration_syntaxique_javascript
/**
 * @pipeline coloration_syntaxique_css
 * 
 * @param array $flux
 * 
 * @return $flux
 **/
function nomdevotreplugin_coloration_syntaxique_css($flux) {

	// exemple pour 2 feuilles de styles CSS chargées dynamiquement :

	// 1. Feuille de style CSS sous forme de squelette `css/coloration_syntaxique_nomdevotreplugin_squelette.css.html`
	$flux['css/coloration_syntaxique_nomdevotreplugin_squelette.css'] = produire_fond_statique('css/coloration_syntaxique_nomdevotreplugin_squelette.css');

	// 2. Feuille de style CSS simple `css/coloration_syntaxique_nomdevotreplugin.css`
	$flux['css/coloration_syntaxique_nomdevotreplugin.css'] = timestamp(find_in_path('css/coloration_syntaxique_nomdevotreplugin.css'));

	return $flux;
}

1 pipeline pour personnaliser l’affichage du code source d’un exemple de code

Lors de l’affichage d’un exemple_de_code, vous pouvez utiliser le pipeline exemple_de_code_source.

/**
 * @pipeline exemple_de_code_source
 * 
 * @param array $flux => [
 *     'args' => [
 *         'code'              => {string}, // code source de l'exemple
 *         'langage',          => {string}, // langage de l'exemple (spip|html)
 *         'titre',            => {string}, // titre de l'exemple
 *         'nombre_de_lignes', => {int},    // nombre de lignes du code source de l'exemple
 *     ],
 *     'data' => {string}, // rendu HTML de l'affichage du code source de l'exemple
 * ]
 * 
 * @return $flux
 **/
function nomdevotreplugin_exemple_de_code_source($flux) {

	// ne pas afficher le code source de l'exemple sur l'espace privé
	if ( test_espace_prive() ) {
		return '';
	}
	else {
		$exemple = '<div style="text-align:center;">';
		$exemple .= '<p><strong>Titre :</strong> '.$flux['args']['titre'].'</p>';
		$exemple .= '<p><strong>Langage :</strong> '.$flux['args']['langage'].'</p>';
		$exemple .= '<p><strong>Nombre de lignes :</strong> '.$flux['args']['nombre_de_lignes'].'</p>';
		$exemple .= '</div>';

		$flux['data'] .= $exemple;
	}

	return $flux;
}

Footnotes

[1Markdown : langage de balisage léger créé en 2004 par John Gruber, avec l’aide d’Aaron Swartz.

Discussion

3 discussions

  • 1
    Laurent Bloch

    Bonjour,
    Le résutat est excellent, mais j’aimerais élargir la zone d’affichage du code en sortant à droite de la colonne centrale, ainsi par exemple en CSS, comme avec coloration_code :

    .spip_cadre, .coloration_syntaxique
    display: inline-block;
    background-image: none;
    padding-left: 0;
    width: 120%;
    ...

    J’utilise le squelette Escal. Un exemple : https://laurentbloch.net/MySpip3/Programmer-en-TypeScript-avec-ChatGPT-second-episode

    Est-ce possible ? Ou alors supprimer le colonne de droite ’extra’.

    Merci !

    • Bonjour pour surcharger les css d’un bloc de code il faut utiliser :

      pre[class*="language-"], pre.spip_code.spip_code_block {
      	width : 120%;
      }
      

      par contre, il faut faire attention à l’accessibilité et je ne sais pas ce que ça va donner avec escal sur smartphone avec une largeur > 100%

    Reply to this message

  • 1

    Merci pour ce plugin bien utile 😉.

    En regardant la documentation de PrismJS, je vois qu’il est possible d’ajouter des scripts additionnels ; comme Command Line. Ces scripts sont bien présents dans le répertoire du plugin, mais je ne vois pas comment les utiliser.

    Y a-t-il un moyen de pouvoir utiliser ces scripts additionnels en l’état, ou faut-il faire des modifications dans le plugin lui-même ?

    • Bonjour,

      Je pense que ça doit être possible avec les pipelines coloration_syntaxique_javascript et coloration_syntaxique_css disponibles : https://git.spip.net/spip-contrib-extensions/coloration_syntaxique#2-pipelines-pour-vos-css-et-javascript

      J’utilise par défaut ce pipeline pour charger les plugins toolbar et copy-to-clipboard donc cela doit fonctionner de la même façon pour les autres plugins PrismJS

      /**
       * @pipeline coloration_syntaxique_css
       **/
      function nomdevotreplugin_coloration_syntaxique_css($css) {
      
      	// PrismJS Command Line
      	$css['lib/prismjs/plugins/command-line/prism-command-line.css'] = timestamp(find_in_path('lib/prismjs/plugins/command-line/prism-command-line.css'));
      
      	return $css;
      }
      
      /**
       * @pipeline coloration_syntaxique_javascript
       **/
      function nomdevotreplugin_coloration_syntaxique_javascript($javascript) {
      
      	// PrismJS Command Line
      	$javascript['lib/prismjs/plugins/command-line/prism-command-line.min.js'] = timestamp(find_in_path('lib/prismjs/plugins/command-line/prism-command-line.min.js'));
      
      	return $javascript;
      }
      

    Reply to this message

  • Merci pour ce plugin !

    Reply to this message

Add a comment

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom