html: Comment faire pour ajouter des numéros de ligne à un bloc de code source

Je veux montrer le code source avec les numéros de ligne, de telle manière que:

  1. Le code peut être copié et collé sans les numéros de ligne, en respectant les sauts de ligne, les espaces et les tabulations.
  2. Les chiffres sont justifié à droite.
  3. Le code peut s'enrouler autour d'.

J'ai essayé l'une des approches suivantes.

Liste ordonnée

<style type="text/css">
    ol.code > li {
        white-space: pre-wrap;
    }
</style>
...
<ol class="code">
    <li>first line</li>
    <li>   indented line followed by empty line</li>
    <li></li>
    <li>the following line consists of one single space</li>
    <li> </li>
    <li>this line has a space at the end </li>
    <li>&#9;and one leading and ending tab&#9;</li>
    <li>fill to</li>
    <li>ten</li>
    <li>lines</li>
</ol>

Cela fonctionne pour la plupart, mais lors de la copie et le collage, les espaces et les tabulations dans les lignes ne sont pas copiés dans mon navigateur (Iceweasel). Donc #1 échoue avec cette approche.

Pré avec compteur

<style type="text/css">
    pre.code {
        white-space: pre-wrap;
    }
    pre.code:before {
        counter-reset: listing;
    }
    pre.code code {
        counter-increment: listing;
    }
    pre.code code:before {
        content: counter(listing) ". ";
        width: 8em;         /* doesn't work */
        padding-left: auto; /* doesn't work */
        margin-left: auto;  /* doesn't work */
        text-align: right;  /* doesn't work */
    }
</style>
...
<pre class="code">
<code>first line</code>
<code>   indented line followed by empty line</code>
<code></code>
<code>the following line consists of one single space</code>
<code> </code>
<code>this line has a space at the end </code>
<code>&#9;and one leading and ending tab&#9;</code>
<code>fill to</code>
<code>ten</code>
<code>lines</code>
</pre>

Cela fonctionne presque, mais #2 tombe en panne. Il a un problème supplémentaire que les lignes de continuer sous le numéro de la ligne (à côté de la marge de gauche), ne relevant pas de la ligne de départ (compilés).

De synchronisation des lignes et des pré

C'était une suggestion que j'ai trouvé dans https://www.sitepoint.com/best-practice-for-code-examples/ mais il dit explicitement que la ligne d'emballage doit être désactivé, donc #3 tombe en panne. Il me fait aussi très mal à l'aise, comme je l'ai déjà vu ces blocs de rupture dans certains sites.

Est-il un moyen de le faire sans JavaScript?

Une raison quelconque vous avez besoin pour mettre en œuvre vous-même? github.com/google/code-prettify semble faire cela et plus encore
Voir ce que vous pouvez faire avec xmp tag.
J'ai vérifié le code-embellir maintenant. Il ne parvient pas requis #1 ci-dessus (les espaces, qui sont essentiels pour Python, sont perdus sur le copier-coller) et les numéros de ligne ne s'affiche pas correctement dans mon navigateur (uniquement des lignes vides avait un numéro de ligne).

OriginalL'auteur Pedro Gimeno | 2016-12-23