Le but est d'avoir une jolie bibliographie sur ma page professionnelle qui reprend les us scientifiques, ça doit ressembler à ça :

[ABCD08]  Titre de l'article
          Noms des auteurs
          Références exacte de l'article
          Liens, etc.
[CDE07]   Titre de l'article
          Noms des auteurs
          Références exacte de l'article
          Liens, etc.
[Celui07] Titre de l'article
          Noms des auteurs
          Références exacte de l'article
          Liens, etc.

J'ai voulu faire ça bien, genre je suis un gourou du web sémantique, xhtml et CSS. Seulement, ce n'est pas mon rayon, l'informatique théorique est assez éloignée des bonnes pratiques du web.

Voila à quoi ressemble[1] mon code HTML :

<ol class="publications">
    <li id="ABCD08">
          Titre<br />
          Auteurs<br />
          Références<br />
          Autre
    </li>
    <li id="CDE07">
          Titre<br />
          Celui et al.<br />
          Références<br />
          Autre
    </li>
    <li id="Celui07">
          Titre<br />
          Celui<br />
          Références<br />
          Autre
     </li>
</ol>

Puisque j'ai besoin d'utiliser des attributs id pour faire des ancres, autant utiliser les ids des papiers, après tout, ils sont fait pour ça.[2] Et puisque j'ai les id, pas la peine de les réécrire.

Donc à ce point là, je me suis dit : Chouette, il suffit d'utiliser l'attribut id comme "bullet" pour mes items de liste, et c'est gagné. En plus, c'est le navigateur qui va gérer la "tabulation" comme il le fait pour les numérotations, ça va être trop simple.

Sauf que je n'ai pas trouvé comment faire,[3] et c'est là que commence le vilain hack CSS. Bon ça marche, mais si quelqu'un sait faire mieux, je suis preneur.

L'idée est de générer l'id de l'article et le placer grace au pseudo-element :before. Seulement celui-ci fait parti intégrante de <li> et n'est donc pas facilement manipulable. C'est pourquoi j'utilise pour lui display: block ce qui a pour conséquence de lui donner une ligne rien que pour lui. On place tout ce beau monde en jouant sur les marges négatives.

Voici mon code CSS :

.publications {
   list-style-type: none;
   line-height: 2.5ex;
   padding: 0; 
   margin: 0;
}
.publications > li:before {
   display: block;
   width: 8em;
   margin-left: -8em;
   margin-bottom: -2.5ex;
   content: "[" attr(id) "]";
}
.publications > li {
   padding-left: 8em;
}

Moralité : ce serait bien de pouvoir faire quelque chose du genre

list-style-text: child.attr(id);

(ou que j'apprenne mieux le CSS)

Notes

[1] j'ai simplifié ce qu'il y a dans les <li>

[2] L'attribut id ne peut pas commencer par [

[3] Sur A List Apart il y a une astuce pour faire ça si le texte du "bullet" a une longueur fixe, ce qui n'est pas mon cas