SPIP 1.9 - Les Plugins

Le système de plugin a été réintroduit dans la version 1.9alpha. Il remplace l’ancien système de plugins qui avait été testé pendant la phase de développement de la 1.8 puis enlevé (voir OldSystemDePlugin)

Installer les plugins

La description du fonctionnement du système de plugin est applicable à partir de la release 5616

Activer la gestion des Plugins
La gestion est activé à partir du moment ou un répertoire ’plugins’ existe à la racine du site (à côté de ecrire, IMG, dist ...)
Le bouton d’administration des plugins est dans le menu Configuration, et n’apparaît que lorsque l’interface complète est sélectionnée, pour les administrateurs uniquement.

Installer un plugin
Les plugins sont pour le moment disponibles sur spip-zone dans le répertoire _plugins_
Avec svn vous pouvez faire un checkout de _plugins_ sur votre répertoire local plugins pour installer tout les plugins disponibles, ou copier simplement les dossiers de plugins qui vous intéressent dans votre dossier plugins.
L’installation dans le dossier n’active pas le plugin.

Activer un plugin
Dans le menu Configuration, Administration des Plugin
SPIP détecte alors tous les plugins installés et en affiche la liste.
Sur chaque plugin, un > basculant permet de faire apparaitre les détails concernant le plugin en question (version, répertoire, auteur, description, lien vers la home page du plugin )
Cocher la case ’Activer le plugin’ pour activer un plugin et valider.
Quand plusieurs plugins sont actifs, ils apparaisent dans l’ordre de chargement. Il est possible de modifier cet ordre avec les flèches monter et descendre. Le changement concerne toutes les fonctions des plugins.
Quand plusieurs plugins interviennent sur le même traitement (ajouter des icônes, formatage du texte ...) ils sont appliqués dans l’ordre indiqué par le tableau.
Dans certains cas il peut donc être utile de modifier cet ordre. Ceci n’est pas géré automatiquement à ce jour.

Quand tout est planté
L’activation des plugins passe par une phase de vérification minimale de conformité (déclarations suffisantes, présence des fichiers à inclure ...) mais tout n’est pas vérifiable simplement. Il est donc possible qu’un plugin indélicat (surtout dans cette période de développement ou les seuls plugins dispo sont en pleine évolution) génère une erreur définitive.
Pour récuperer la main (désactiver manuellement un plugin malgre l’interface plantée), il suffit de renommer le dossier du plugin, ou de supprimer les scripts charger_plugin_xxx.php du répertoire data, puis de retourner dans le panneau de configuration des plugins.

Créer son plugin

Comment créer son plugin :

Créer un dossier ’monplugin’ dans le répertoire plugins.
Le plugin sera reconnu par SPIP a l’aide de son fichier de description plugin.xml :

<plugin>
	<nom> <!-- Nom du plugin -->
	Rien
	</nom>
	<auteur>	<!-- Auteur du plugin -->
	_fil_
	</auteur>
	<version>
	0.1
	</version>
	<etat>
	test
	</etat>
	<description>
	Le seul plugin spip au monde qui ne fait rien, mais qui le fait bien !
	</description>
	<options> <!-- fichier charge a chaque hit -->
	mes_options.php
	</options>
	<fonctions> <!-- fichier charge a chaque recalul de page -->
	mes_fonctions.php
	</fonctions>
	<!-- classe d'implementation : espace de nommage qui prefixera les appels de fonction
	sur le mode Rien::
	ainsi les fonctions hors espace de nommage ne peuvent etre appelees
	ce parametre est obligatoire et doit etre non vide
	-->
	<prefix> 
	Rien
	</prefix>
	<!-- Definitions des fonctions qui s'inserent dans les pipelines -->
	<pipeline>
		<nom>post_propre</nom>
		<action>leFiltre</action>
	</pipeline>
	<pipeline>
		<nom>ajouter_boutons</nom>
		<action>ajouterBoutons</action>
		<inclure>Rien.php</inclure>
	</pipeline>
	<pipeline>
		<nom>ajouter_onglets</nom>
		<action>ajouterOnglets</action>
		<inclure>Rien.php</inclure>
	</pipeline>
	<!-- Le parametre action est facultatif : en son absence la methode de la classe portant le nom du pipeline est appelee. Le parametre inclure est facultatif.	-->
</plugin>

Balises de description :

  • <nom> permet de définir le nom du plugin tel qu’apparaissant dans le panneau de configuration.
  • <version> permet de donner le numéro de version du plugin
  • <etat> permet de définir l’état du plugin, parmi dev (developpement), experimental, test, stable.
  • <auteur> permet de renseigner le ou les auteurs du plugin. Vous pouvez utiliser les raccourcis typo et chaînes de langue dans ce champ.
  • <description> permet de décrire ce que fait le plugin. Vous pouvez utiliser les raccourcis typo et chaînes de langue dans ce champ.
  • <lien> permet de donner un lien html vers la homepage du plugin qui donne plus d’information sur son fonctionnement.

Balises d’implémentation :

  • <options> permet de définir un fichier qui sera chargé à chaque hit, comme l’était le fichier mes_options.php.
  • <fonctions> permet de définir un fichier qui sera chargé à chaque recalcul de page, comme l’était le fichier mes_fonctions.php.
  • <prefix> permet de définir le nom des préfixes de fonction définies par le plugin. Pour des raisons de cohabitation saine avec ses petits copains plugins, toutes les fonctions propres à votre plugin devront commencer par ce préfixe. Regardez les exemples du plugin « Rien » pour voir comment faire. La seule contrainte est de préfixer les declarations de fonction et d’ecrire vos appels de fonction sur le mode $truc = Rien_ma_fonction($val);.
  • <pipeline> permet de définir un point d’insertion du plugin dans un pipeline de traitement. Pour cela on utilise les tags suivants :
    • <nom> donne le nom du pipeline où insérer l’appel au plugin.
    • <action> donne le nom de la fonction à appeler (sans le préfixe qui sera ajouté automatiquement par SPIP).
    • <inclure> donne le nom d’un fichier à inclure pour que la fonction soit disponible.

Les tags <nom>, <version> et <prefix> sont obligatoires. Les autres sont facultatifs.
Il n’est pas autorisé d’utiliser un nom de fonction identique au nom de préfixe (La fonction Rien_rien() sera refusée parce que c’est comme ca - pour les curieux je peux raconter l’histoire... -), ni d’utiliser les noms de fonctions install, uninstall et configure qui sont réservés pour des évolutions que vous devinez déjà.

Pour des raisons de performance, il est conseillé de découper proprement les fonctions de son plugin dans des fichiers séparés, afin que seules les fonctions requises soient chargées lors des include.

Et pour plus de réponses à vos questions n’hesitez pas à regarder tous les exemples disponibles sur spip-zone.

Pour plus d’information, voir :

Listes des pipelines

  • delete_tables ???
  • ajouter_boutons ajoute un bouton dans la barre de bouton. Prend en paramètre un tableau qu’il modifie et retourne :
	function Rien_ajouterBoutons($boutons_admin) {
		// si on est admin
		if ($GLOBALS['connect_statut'] == "0minirezo") {
		  // on voit le bouton dans la barre "naviguer"
		  $boutons_admin['naviguer']->sousmenu['rien_poo']= new Bouton(
			'../'._DIR_PLUGINS.'rien/ecrire/img_pack/rien-24.png', 'rien !');

		  // et on accede a la config
		  $boutons_admin['configuration']->sousmenu['rien_config']= new Bouton(
			'../'._DIR_PLUGINS.'rien/ecrire/img_pack/rien-24.png', 'rien ?');
		} else {
		  // sinon, on voit un icone de plus dans la barre du haut
		  $boutons_admin['rien_poo']= new Bouton(
			'../'._DIR_PLUGINS.'rien/ecrire/img_pack/rien-24.png', 'rien !');
		}

		return $boutons_admin;
	}
  • ajouter_onglets ajoute un onglet sur une page, prend un tableau de paramètres en entré :
    • ’data’=> le tableau d’onglets,
    • ’args’=> le nom de la page depuis laquelle se fait l’appelle
  • pre_indexation ??
  • pre_syndication ??
  • post_syndication ??
  • pre_typo voir PointsEntreeIncTexte
  • post_typo voir PointsEntreeIncTexte
  • pre_propre voir PointsEntreeIncTexte
  • post_propre voir PointsEntreeIncTexte
  • yen manque

Nota Spipcontrib : cette liste de pipelines est évolutive aussi regardez dans « inc_version.php » et cherchez $spip_pipeline et vous trouverez une liste bien plus à jour.

Voir aussi les rubriques Téléchargement des plugins et Réaliser un premier plugin.

Discussion

5 discussions

  • asnidren

    Concernant :

    Quand plusieurs plugins sont actifs, ils apparaisent dans l’ordre de chargement. Il est possible de modifier cet ordre avec les flèches monter et descendre. Le changement concerne toutes les fonctions des plugins.
    Quand plusieurs plugins interviennent sur le même traitement (ajouter des icônes, formatage du texte ...) ils sont appliqués dans l’ordre indiqué par le tableau.
    Dans certains cas il peut donc être utile de modifier cet ordre. Ceci n’est pas géré automatiquement à ce jour.

    Je n’ai pas ces flèches... Comment fait-on sur SPIP 2.1 svp ?

    Répondre à ce message

  • 17

    D’abord, je vous remercie tous, créateurs et contributeurs, de spip-contrib pour vos travaux et en particulier pour l’aide indispensable que vous dispensez à ceux qui comme moi galère pendant des mois sur chacune des évolutions que vous apportez à Spip comme sur chacune des évoluions du « xhtml strict » .

    Cette fois, après passage à la 1.9.2, en ce qui concerne les plugins (Nouveaux pour moi resté longtemps et pour cause à la 1.8), je n’arrive pas à en activer plus de trois à la fois. Un quatrième coché, quel qu’il soit, et toutes (3) les coches disparaissent après la validation.

    Chmod du répertoire Tmp et des quatre « fichiers plugin » mis « à toutes les sauces » ; Cache vidé et revidé ; Validation après chaque activation ou plusieurs coches à la fois validées, ... j’ai essayé dans tous les sens avec une dizaine de plugins différents, ... rien y fait : Je ne dépasse pas trois, quels qu’ils soient (?)

    J’ai cherché dans la doc. et les forums. Je ne m’en sors pas.

    Pas doué !

    SVP sortez-moi de là.

    • Permettez-moi de nuancer ma première appréciation :

      -  Je maintiens : « je vous remercie tous, créateurs et contributeurs, de spip-contrib pour vos travaux »

      -  Je retire : « en particulier pour l’aide indispensable que vous dispensez »

      J’attendais patient et confiant, cette aide depuis le 24 juillet... Erreur, Dommage !

    • Bonjour,

      Je viens de me coller le bug « impossible d’activer plus de 3 plugins à la fois » (3 pouvant être 2 ou 1 ou 4, ...)
      Après un peu (beaucoup de café) il s’agit d’un bug lors des migrations 1.8.x vers 1.9.x

      Explication :
      Dans une base 1.8.3 le champ spip_meta.valeur est de type VARCHAR(255)
      Sur une 1.9.2c c’est un TEXT

      Hors sur une de mes bases migrée depuis 1.8.3 vers 1.9.2 puis 1.9.2c, il n’avait pas fait la conversion. Par conséquent dès qu’ils voulaient ajouter trop de plugin, le meta « plugin » (et tous les autres) ne rentraient pas => bug, la requête plantait !

      Solution :
      ALTER TABLE spip_meta MODIFY COLUMN valeur TEXT CHARACTER SET latin1 COLLATE latin1_swedish_ci
      , DROP INDEX valeur ;

      Ca a très bien fonctionné pour moi.
      Il serait intéressant de retracer dans l’outil de migration où se trouve le problème étant donné que je ne suis pas le premier à le rencontrer.

      Rq pour Fabrice : sans une base plantée, il est totalement impossible de tomber sur ce bug donc impossible de trouver la solution :-(

      Spipement votre,

    • Merci Renaud.

      Le champ spip_meta a bien la valeur VARCHAR(255) après « mise à jour 1.9.2c ».

      Je ne connais rien aux bases de données (Je n’ose même pas y toucher), mais coincé depuis juillet j’ai essayé ta solution (sans comprendre bien sûr) en « copier coller » dans le formulaire « Exécuter une ou des requêtes sur la base » de la « Table spip_meta »

      la base me renvoie ceci :

      requête SQL :

      ALTER TABLE spip_meta MODIFY COLUMN valeur TEXT CHARACTER SET latin1COLLATE latin1_swedish_ci,
      DROP INDEX valeur

      MySQL a répondu :

      #1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ’CHARACTER SET latin1COLLATE latin1_swedish_ci,
      DROP INDEX `

      Aurais-tu encore la gentillesse de m’indiquer où est l’erreur de syntaxe ?

      D’avance encore merci

    • Bonsoir,

      Même problème pour moi, même symptômes (varchar 255), et la requête SQL ne fonctionne pas non plus... Je suis en MySQL 4.0.25, y a-t-il moyen de faire le changement via l’interface phpmyadmin ? (j’ai essayé, sans succès, de modifier les champs : j’ai l’erreur #1170 - BLOB column ’valeur’ used in key specification without a key length)

      Help :-)

    • Bonjour,

      Je me réponds à moi-même, j’ai résolu le problème en supprimant (avec l’interface phpmyadmin) les index de la table spip_meta liés au champ valeur, une fois cette suppression faite il devient possible de modifier le type du champ en TEXT, et j’ai pu activer les plugins.

      Bon courage ! merci pour le tuyau

    • Bonjour Yves,

      Pour les nuls craintifs, est-ce bien :

      Cocher les « noms » dans la table « spip_meta » qui ont la valeur « oui » et ... poubelle ?

      Est-ce absolument sans conséquence pour le site ou pour la configuration, STP ?

      Je serais bien incapable de revenir en arrière...

    • Compléments à mon message précédent :

      -  En réfléchissant à

      « index de la table spip_meta liés au champ valeur »

      , c’est, si j’ai mieux compris, supprimer tous les index sauf ceux dont la "valeur" est "Non" qu’il faudrait faire ... (?)

      -  Dans ma table « spip_meta » le champ "version_installee" a la valeur 1.82, or je suis en 1.9.2.c ...suffirait-il de ne supprimer que ce champ ? Le bug, si bug il y a, vient peut-être de là ?

      Autre anomalie dans la table :
      -  le champ "charset" indique "iso-8859-1" alors que la conversion en "utf8" a été faite depuis longtemps à partir de l’interface configuration de spip... (?)

      Toujours dans l’attente de précieux conseils,
      très cordialement

    • Bonjour,

      Alors voilà comment j’ai procédé. Déjà quelques détails de contexte, c’était une migration de SPIP 1.7.2 vers 1.9.2c. Je suis hébergé chez OVH et j’utilise le PhpMyAdmin fourni par l’hébergeur (MySQL en version 4.0.25, phpMyAdmin en version 5.0.32).

      Je sélectionne ma base, et la table spip_meta. PhpMyAdmin affiche deux zones d’informations : en haut d’écran, la structure de la table, et en dessous les index de la table. J’avais 5 index : PRIMARY, maj, nom, valeur, valeur2. Ces deux derniers étaient associés au champ valeur, je les ai supprimés tous les deux (colonne action / supprimer de phpMyAdmin dans la zone des index). Une fois ces suppressions effectuées, j’ai pu aller modifier le type du champ valeur (colonne action / modifier de la zone de la structure de table) et j’ai juste remplacé VARCHAR par TEXT, et j’ai pu valider la modification (pas de message d’erreur).

      Après ça, je peux gérer les plugins sans problème !

      J’espère que ça vous sera utile,

      Amicalement
      Yves

    • Bonjour Yves,

      J’ai suivi à la lettre les instructions (Je n’avais effectivement rien compris :-).

      J’ai cliqué sur « sauvegarder ». La base (En haut) indique maintenant :

      -  Table spip_meta a été modifié(e).
      -  requête SQL : [Modifier] [Créer source PHP]
      -  ALTER TABLE spip_meta CHANGE valeur valeur TEXT

      Mais hélas pour moi, aucun changement. Je pensais bien avoir vos résultats... je me sens encore plus seul maintenant :-(

      Toujours pas plus de trois plugins. Si j’en coche un quatrième, quel qu’il soit, les quatre plugins cochés se décochent toujours après validation...

      J’ai vidé le cache au cas où... ça n’a rien changé.

      Une différence peut-être significative « entre Renaud et moi » :

      Je viens de me coller le bug « impossible d’activer plus de 3 plugins à la fois » (3 pouvant être 2 ou 1 ou 4, ...)

      -  Chez moi 1, 2, 3 plugins actifs ;.. aucun problème. Mais un 4e et plus qui me sont interdits. 3 parait être une limite précise.

      Voyez-vous autre chose à tenter ?

      En tout cas, Renaud et Yves, merci beaucoup de m’avoir répondu... j’attendais depuis juillet.

    • Est-ce que le type du champ ’valeur’ a bien été modifié à ’TEXT’ ? (question bête, est-ce que vous n’auriez pas tout simplement oublié de confirmer une modification ? - ça arrive souvent...)

      En ce qui me concerne je ne suis pas du tout développeur, j’arrive juste à me débrouiller et à bidouiller quand on me donne des instructions précises ;) donc j’ai peur de ne pas pouvoir vous aider plus loin, c’est en fait Renaud qui a fait tout le boulot je n’ai fait « qu’intuiter » comment traduire sa requête SQL avec l’interface PhpMyAdmin...

      Bon courage !

    • Voilà se qu’affiche la structure de spip_meta après « Sauvegarder » :

      nom varchar(255) Non

      valeur text Oui NULL

      maj timestamp(14) Oui NULL

      text a bien remplacé varchar... apparemment (?)

      est-ce que vous n’auriez pas tout simplement oublié de confirmer une modification ? - ça arrive souvent...

      Euh... c’est possible :

      Après la modification (Varchar ->Text)
      J’ai hésité entre « Sauvegarder » et « Exécuter » proposé plus bas.
      J’ai cliqué sur le bouton le plus évident : « Sauvegarder ».

      La modif. souhaitée apparaissant bien, je me suis arrêté là...

      Aurais-je raté quelque chose ? :-)

      Quoiqu’il en soit vous m’avez beaucoup aidé. Grâce à vous j’ai osé pénétrer dans PhpMySql. C’est une étape de franchie. Merci !

    • Oui, TEXT a bien remplacé VARCHAR pour le champ ’valeur’.

      Par contre, vous ne mentionnez que les champs ’nom’, ’valeur’ et ’maj’ ; dans ma table j’en ai un 4e, ’impt’. Par contre je ne sais pas à quoi il sert, mais il y a peut-être là un indice pour les développeurs SPIP ? :)

    • Cher Yves, merci pour le temps que vous avez consacré à mon problème.

      Un 4e champ « impt » (?). Non, je n’en vois pas ;-(

      Qu’un développeur repasse avant longtemps sur ce forum désertique m’étonnerait.

      En trois mois je n’ai « rencontré » que vous et Renaud.

      Les quelques solutions proposées sur d’autres forums (Supprimer le tmp ou les 4 « fichiers plugins », vérifier les chmods,...) n’ont rien donné non plus.

      Je me résous à arrêter mes recherches, à arrêter d’abuser de votre temps et à revenir à une configuration en adéquation avec mon niveau. C’est la sagesse de l’incompétent.

      Je vous remercie encore de votre gentillesse.

    • Topic qui m’a bien dépanné car je n’aurai jamais trouvé la faille tout seul ! Merci ça a marché impec sur ma version buggé de spip 1.9 après migration...

    • Pour ceux qui coincent, il y a deux remarques à faire suite à mon premier message :
      -  La requête correcte de correction est :
      « ALTER TABLE spip_meta MODIFY COLUMN valeur TEXT ; »
      la première requête que j’ai donnée vient de mon ancien hébergeur OVH qui bricolait les bdd sans rien me demander (!).
      -  une solution alternative consiste à dumper sa base mais uniquement les données, supprimer toutes les tables, réinstaller une base vierge 1.9.2c puis de réimporter les données.

      Bon courage,
      Renaud

    • Ca n’est absolument pas le bon endroit pour contacter les developeurs de SPIP !
      Il y a pour cela la liste spip-dev@rezo.net.

      Contacte la liste, ou mail moi directement, que je puisse réparer ton probleme et appliquer un patch correctif à la prochaine version SPIP.

    • Pour Yves

      Merci cela m’a bien aidée !

    Répondre à ce message

  • 2

    Je suis en train d’essayer les plugins avec SPIP 1.9... tout va pour le mieux tant et aussi longtemp que mon site reste à la souche de mon domaine...

    Si j’installe le plugin dans un site situé dans un sous dossier, les plugins sont visibles en configuration, mais ils sont inopérants...


    http://www.monsite.com/{{MonSousSite/spip.php... (les plugins ne fonctionnent pas.)

    Photo d’écran avec le problème des plugins dans un dossier du site... la patch 1.9.1 n’affiche pas la notice de version... les autres plugins ne fonctionnent pas non plus...


    http://www.monsite.com/spip.php... (les plugins fonctionnent... )

    Photo d’écran sur le même site mais à la souche du domaine, sans le problème... la patch est visible au bas de l’écran. Les autres plugins fonctionnent bien aussi...


    Pas d’inquiétude... le cache a été vidé...

    Quelqu’un a le même problème ?

    • J’ai déplacé un site sous SPIP 1.9.1 d’un serveur (mutu ovh) vers un autre (dédié ovh).
      Copier/coller des fichiers. Export sql des données et import par le biais de phpMyAdmin.
      l’adresse de teste est du type http://xxx.ovh.net/~monsite/

      Tout fonctionne sauf ... les plugins

      Malgré mais recherche je n’ai trouvé aucune réponse à mon problème pourtant d’autres semble l’avoir eu.

      extrait : Si j’installe le plugin dans un site situé dans un sous dossier, les plugins sont visibles en configuration, mais ils sont inopérants...

      Alors une idée de génie ;-)

      Ludo

    • Xavier Brouaux

      Je pense que l’admin 0minirezo codé en dur devrait être retiré, car il s’agit d’un user pour les example et non d’un mot codé.

    Répondre à ce message

  • 1

    Bonjour à tous et à toutes,

    J’ai quelques problèmes concernant l’installation d’un plugin. Il s’agit de l’installation de la Bloogletter, un système d’envoi de newsletter que j’affectionne particulièrement.

    Ce qui se passe :
    - j’ai créé mon répertoire « plugins » à la racine du site
    - j’y ai envoyé l’ensemble de l’arborescence de la Bloogletter
    - je vois bien le plugin dans mon espace privé
    - par contre j’ai beau cocher la case « activer » puis valider, mon plugin n’apparaît jamais comme activé.

    Je ne comprends pas et ne sais plus quoi faire.

    Certains ont-ils déjà eu ce problème ?
    Si vous avez des idées merci de me les indiquer.

    En attente de vos réponses.

    Agathe.

    • Il me semble qu’après avoir cliqué sur « valider », rien ne change dans ta page. Il faut retourner au menu de configuration général, et là le plugin apparaît.

    Répondre à ce message

  • Quand tout est planté, il m’a fallu supprimer aussi charger_pipelines.php dans ecrire/data.

    Mais les plugins c’est trop fort !!

    Répondre à ce message

Ajouter un commentaire

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.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom