Comment créer une boîte de code d'extrait de code jQuery

Dans ce didacticiel, nous allons créer un bloc d'extraits de code qui affiche un exemple de code sur des pages Web de manière attrayante et facile à lire, un peu comme ce que vous voyez ici sur Nettuts. Les boîtes de prévisualisation d'extraits de code comme celle-ci sont souvent créées sous forme de plugins Wordpress, mais nous verrons comment nous pouvons faire la même chose avec juste un peu de jQuery et CSS.

Nous pouvons ajouter toutes les fonctionnalités attendues, telles que la numérotation et le marquage de ligne, ainsi que tous les outils habituels, tels que l'affichage du code en texte brut et son impression facile à imprimer. La capture d'écran suivante montre le genre de choses avec lesquelles nous allons nous retrouver à la fin du tutoriel:



Commencer

Le bloc d’extrait de code sera construit à partir d’un sous-jacent

 élément; c’est l’élément parfait à utiliser car il rend tout ce que vous y mettez sous forme de texte brut dans une police à largeur fixe telle que monospace, ce qui est idéal pour afficher des exemples de code de manière claire et concise. Il préserve également les sauts de ligne, une fonctionnalité que nous pouvons exploiter pour ajouter les fonctionnalités de numérotation et de séparation de lignes..

Une autre raison pour laquelle nous utilisons le

 tag est parce qu'il constitue la base idéale pour notre boîte de code; dans les navigateurs avec JavaScript désactivé, ou ceux qui ne le prennent tout simplement pas en charge, le code sera toujours rendu de manière acceptable. Cela va ressortir du reste du texte sur la page et ne dégénérera pas en quelque chose de complètement inutile et ridicule.

Commencez par la page suivante dans votre éditeur de texte:

    Boîte d'extraits de code jQuery    

Code CSS:

#selector color: # 000000;  .another-selector taille de la police: 20px; bordure: 1px solide # 000000; rembourrage: 20px;  tagname width: 100%; 

Enregistrer la page sous code-snippet.html dans un répertoire contenant déjà la version actuelle de jQuery. Sans style ni intervention de script, la page devrait ressembler à ceci:


Par défaut, il est acceptable. si la page avait un autre corps de texte dessus, le

 l'élément se démarquerait en tant que bloc de texte séparé et apparaîtrait toujours sous la forme d'un petit code.


Commencer le script

Commençons par ajouter l’effet de striping qui rendra chaque ligne différente de celles situées au-dessus et au-dessous, et la numérotation des lignes indiquant le moment où une ligne brisée (qui déborde sur deux lignes ou plus) fait partie d’une ligne de exemple de code.

Dans le vide > élément au bas de la ajoutez le code suivant:

$ (function () // traite le contenu des extraits $ ("pre.snippet"). each (function () // récupère le contenu de 
 et créez la liste et le conteneur var currentItem = $ (this), currentContents = currentItem.text (), contents = (currentItem.text (). indexOf ("\ n")! = -1)? currentItem.text (). split ("\ n"): currentItem.text (). split ("\ r"), list = $ ("
    "), conteneur = $ ("
    ") .addClass (" snippet-container "). insertBefore (currentItem.prev ()); // supprime le contenu d'origine et l'enveloppe dans le conteneur currentItem.text (" "). prev (). andSelf (). appendTo (container) ; // normaliser la hauteur (currentItem.height ()> 0)? list.css ("marginTop", -16): null; // créer un élément de liste $ .each (contenu, fonction (i, val) // create élément de liste et p var interne = $ ("
  1. ") .appendTo (liste), p = $ ("

    ") .text (val) .appendTo (li); // ajouter une classe de bande (i% 2 === 0)? li.addClass (" bande "): li.addClass (" unstripe ");); list .appendTo (currentItem);););

Passons en revue chaque partie du code pour voir ce qu'il fait. d'abord nous sélectionnons chaque

 élément ayant le nom de classe d'extrait et pour chaque découverte, nous exécutons une fonction anonyme. Dans cette fonction, nous définissons d'abord cinq variables; la première variable est le sélecteur du courant 
 élément, que nous mettons en cache pour des raisons de performance. Nous allons utiliser le $ (ceci) référence à plusieurs reprises dans notre code, il est donc logique de le stocker dans une variable pour un accès rapide.

La variable suivante stockera le contenu intégral du texte actuel.

 et la suivante stockera un tableau où chaque élément du tableau contient une seule ligne de texte à partir du 
 élément. La longueur du tableau correspondra au nombre de lignes de texte dans le 
 élément. Parce que les sauts de ligne dans 
 les éléments sont préservés, nous pouvons facilement les détecter et effectuer une scission en fonction de ces éléments.

La plupart des navigateurs détectent les sauts de ligne en JavaScript à l'aide du \ n caractère newline donc nous voyons d’abord si le texte intérieur du

 L'élément contient l'un de ceux-ci et les utilise ensuite. IE détecte les sauts de ligne différemment des autres navigateurs, donc si aucun \ n les caractères sont trouvés, nous effectuons la division en utilisant le \ r caractère de retour de chariot à la place.

La variable suivante contient un nouvel élément de la liste ordonnée; en utilisant un

    Cet élément est parfait car il gérera automatiquement la numérotation de la ligne de l'extrait de code. La dernière variable pointe vers un nouveau conteneur
    que nous donnons un nom de classe et puis ajoutons à la page directement avant la

    élément qui précède le snippet box.

    Créer le tableau de la

     Le contenu de l'élément n'est pas une opération destructrice, nous devons donc supprimer le contenu d'origine pour éviter sa duplication, ce que nous pouvons faire en utilisant une chaîne vide avec celle de jQuery. texte() méthode. Nous passons aussi le 

    et le
     élément dans notre élément conteneur nouvellement créé.

    Firefox semble insérer une rupture de ligne dans le

     element, qui donne l'élément la taille quand il ne devrait pas avoir de hauteur du tout (car nous avons supprimé le contenu). Pour contrer cela, nous détectons si le vide 
     l'élément a une hauteur supérieure à 0, et si oui, nous définissons la haut de la marge de notre nouveau 
      élément pour le tirer vers le haut de l'élément. C’est seulement Firefox qui le fait, mais il est préférable de vérifier la taille au lieu de vérifier pour Firefox. La détection des fonctionnalités via le sniffing du navigateur gagne à chaque fois.


      Striping

      La prochaine section de code traite de l'ajout des classes que nous pouvons utiliser pour l'effet de striping; comme nous avons mis le contenu de la

       élément dans un tableau et non un objet jQuery, nous ne pouvons pas utiliser la norme chaque méthode comme nous l'avons fait avec le 
       éléments sur la page.

      Au lieu de cela, nous pouvons utiliser le jQuery chaque méthode d'utilité qui est appelée directement sur jQuery $ objet. La méthode accepte 2 arguments, le premier est l’objet à parcourir, dans ce cas notre Contenu tableau, et le second est une fonction anonyme à exécuter pour chaque élément du tableau. Notre fonction est automatiquement passée deux arguments; je est l'index de l'élément en cours d'itération et val est le contenu de l'élément de tableau.

      Dans notre fonction, nous créons d’abord un nouvel élément de liste pour notre

        et insérez un nouvel élément de paragraphe contenant le contenu de l'élément de tableau actuel. Le nouvel élément est ajouté à la
          élément que nous avons créé plus tôt. Nous ajoutons ensuite les classes de striping; Pour ce faire, nous utilisons l'opérateur de module JavaScript afin de déterminer si l'index de tableau actuel est impair ou pair. pour chaque indice même on ajoute la classe Bande et pour chaque indice impair on ajoute la classe imparfait. L'utilisation de 2 classes pour les bandes signifie que nous pouvons facilement définir les deux couleurs de bandes au lieu d'insister pour que l'une d'entre elles soit blanche.

          A ce stade, notre page d'exemple devrait maintenant ressembler à ceci:



          Snippet Styling

          Nous pouvons maintenant ajouter le style pour le widget extrait de code et la segmentation; Dans un nouveau fichier de votre éditeur de texte, ajoutez le code suivant:

          .snippet-container width: 630px; remplissage: 10px 10px 30px; bordure: solide 1px # 999999; couleur de fond: # e1e1e1; marge inférieure: 10px; position: relative;  .snippet-container h2 margin: 0 0 10px; padding-left: 10px; famille de polices: Georgia; poids de police: normal; style de police: italique;  .snippet border: 1px solid # 999999; marge: 0;  .snippet ol margin: 0; padding-left: 34px; couleur de fond: # 8dd397; couleur: #ffffff; poids de police: gras; style de police: italique;  .snippet ol li padding-left: 10px;  .snippet ol p margin: 0; couleur: # 000000; poids de police: normal; style de police: normal; espace blanc: préemballage; remplissage: 3px 0;  .snippet .stripe background-color: # f5f5f5;  .snippet .unstripe background-color: #ffffff; 

          Enregistrer ceci sous code-snippet.css dans le même répertoire que la page d'exemple. La plupart de ces CSS est purement pour la décoration et a été choisi arbitrairement selon mes préférences. Vous pouvez modifier les polices, les couleurs, la largeur ou n’importe quoi. Le CSS fonctionnel le plus important que nous avons défini est le positionnement relatif sur chaque extrait et le espace blanc statuer sur l'intérieur

          éléments dans chaque élément de la liste; si nous ne mettons pas cela à préemballage le texte de chaque ligne débordera du conteneur d'extraits s'il est trop long au lieu de passer à la ligne suivante.

          Avec l'ajout de notre feuille de style, la zone de code apparaît maintenant comme ceci:



          Autres types de code

          Jusqu'à présent, dans cet exemple, nous avons utilisé des CSS très simples comme exemple de code présenté dans le fragment de code. Pouvons-nous ajouter un autre type de code que nous voulons? Nous allons jeter un coup d'oeil. Directement après le premier

           élément sur la page ajouter le code suivant: [/ sourcecode]

          [code source sourcec = "extrait" originalClass = "extrait"]    Un exemple de page Web   

          Ceci est une page web basique

          Tout est à peu près ce que nous avions avant avec une différence majeure; nous ne pouvons pas utiliser le < caractère lors de l'affichage des balises HTML dans notre exemple de code. Si nous devions mettre dans notre

           tag, il serait interprété comme un  élément et provoquer un avertissement HTML. Pour surmonter cela, nous pouvons spécifier l'entité HTML 

          <

          qui sera changé en caractère par le navigateur sans le navigateur pensant que c'est un élément réel. Il est probablement préférable d'afficher tout code utilisant caractères de cette manière pour éviter toute interprétation accidentelle par le navigateur. Voici comment la deuxième zone de fragment devrait apparaître:


          J'ai respecté la convention d'indentation que j'utilise normalement, à savoir deux espaces standard pour les éléments imbriqués; C'est une habitude dans laquelle j'ai pris l'habitude de montrer plusieurs lignes de code potentiellement larges dans des documents à largeur fixe. Ce n'est pas la convention standard, qui est quatre espaces simples ou un espace de tabulation. Vous pouvez utiliser la convention de votre choix lors du déploiement du fragment de code sur votre propre site, car les espaces simples et les espaces de tabulation sont préservés par le pré étiquette.


          Outils d'extraits

          Une autre caractéristique des boîtes d’extraits de code que nous pouvons facilement ajouter est une série d’outils qui aident le visiteur à utiliser le code; Si vous essayez de copier et de coller le code d'une des zones d'extraits dans un éditeur de texte, vous verrez que les numéros de ligne de la liste ordonnée sont également copiés dans la nouvelle page. C’est regrettable, car laisser ces chiffres empêcherait probablement l’exemple de code de fonctionner. Une chose que nous pouvons faire est de fournir un mécanisme où le code peut être affiché sans les numéros de ligne..

          Directement après la ligne de code qui se lit list.appendTo (currentItem); ajoutez le code suivant:

          // créer des outils var toolContainer = $ ("
          ") .addClass (" tools-container "), toolList = $ ("