vendredi 24 février 2012

Marsupial technologique

C'est arrivé le 31 janvier, je suis désormais papa pour la deuxième fois ( il s'agit cette fois-ci d'un garçon : un petit Loïc ).
Je ne vais pas m'épancher sur les joies que la paternité me procure car elles sont du domaine privé.
Le but de ce billet est juste de partager une impression ressentie ce matin : essayant désespérément de travailler, malgré un gros chagrin, inconsolable, que le petit partageait avec nous depuis quelques heures ; j'ai essayé le porte bébé pour pouvoir continuer à coder tout en essayant de réconforter Junior. Au même moment, passait en bruit de fond à la télévision un reportage animalier sur les kangourous.
Ma femme, rentrant dans la pièce à ce moment, a cru discerner un certain mimétisme entre le reportage télévisuel : à gauche des animaux sauvages, bébé sur le ventre se repaissant tranquillement ; à droite un marsupial technologique se nourrissant d'octets. Comme quoi, l'homme, malgré son génie, n'a de cesse d'imiter la nature :)

Documentation HTML

Je profite de mon congé paternité pour peaufiner une documentation que je fais pour le boulot ; cette documentation est réalisée en HTML, ou pour être plus précis en XHTML. Voici quelques bêtes tuyaux qui me sont utiles pour générer ma documentation.

Pour la numéroter les chapitres j'utilise les titres (h1,h2,...) et je profite des possibilités offertes par le CSS :

h1:before {
    content: counter(chapter) ". ";
    counter-increment: chapter; 
}
h1 {
    counter-reset: section;
    font-size: 150%;
    color:rgb(17,127,185);
}

h2:before {
    content: counter(chapter) "." counter(section) ". ";
    counter-increment: section;
}
h2{
counter-reset: subsection;
font-size: 140%;
color:rgb(17,127,185);
}

h3:before {
    content: counter(chapter) "." counter(section) "." counter(subsection) ". ";
    counter-increment: subsection;
}
h3{
counter-reset: h4section;
font-size: 130%;
color:rgb(17,127,185);
}
...


Pour générer la table des matières j'ai une petite fonction javascript toute prête ; faite en quelques minutes, donc sans doute très largement améliorable, mais qui a le mérite de marcher :)


tdm = new Array();

function generateTDM(startTag) {
 var nbChilds = startTag.childNodes.length;
 for (var i = 0; i < nbChilds; i++) {
  var tag = startTag.childNodes[i];
  var tagName = tag.nodeName.toLowerCase();
  if (tagName == 'h1' || tagName == 'h2' || tagName == 'h3' 
                              || tagName == 'h4' || tagName == 'h5' 
                              || tagName == 'h6') {
         tdm[tdm.length] = tag ;
        }
        else {
         generateTDM(tag);
        }
 }
}


function start() {
 var text ="<ul class=\"tdm\">\n";
 generateTDM(document.getElementsByTagName("body")[0]);
 var number = new Array();
 for (i=0;i<tdm.length;i++) {
  if (tdm[i].nodeName.toLowerCase()=="h1") {
   if (!number[0]) number[0]=0;
   number[0] = 1+number[0];
   while (number.length>1) number.pop();
  }
  else if (tdm[i].nodeName.toLowerCase()=="h2") {
   if (!number[1]) number[1]=0;
   number[1] = 1+number[1];
   while (number.length>2) number.pop();
  }
  else if (tdm[i].nodeName.toLowerCase()=="h3") {
   if (!number[2]) number[2]=0;
   number[2] = 1+number[2];
   while (number.length>3) number.pop();
  }
  else if (tdm[i].nodeName.toLowerCase()=="h4") {
   if (!number[3]) number[3]=0;
   number[3] = 1+number[3];
   while (number.length>4) number.pop();
  }
  else if (tdm[i].nodeName.toLowerCase()=="h5") {
   if (!number[4]) number[4]=0;
   number[4] = 1+number[4];
   while (number.length>5) number.pop();
  }
  else if (tdm[i].nodeName.toLowerCase()=="h6") {
   if (!number[5]) number[5]=0;
   number[5] = 1+number[5];
  }
  
  if (tdm[i].id=="") {
   tdm[i].id="td"+i;
  }
  text+="<li class=\""+tdm[i].nodeName.toLowerCase()+"\">";
  for (j=0;j<number.length;j++){
   text+=number[j];
   if (j<number.length-1) text+=".";
  }
  text+="<a href=\"#"+tdm[i].id+"\">"+tdm[i].innerHTML+"</a></li>\n";
 }
 text+="</ul>\n";
 document.getElementById("thetdm").innerHTML=text;
}


Cette fonction génère le code HTML de la table des matières puis l'ajoute dans l'élément HTML trouvé d'id=thetdm du document ; par exemple :


<div id="thetdm">...</div>

Et voilà, rien de plus simple :)

mardi 21 février 2012

Dragon

Je viens d'achever la lecture de Dragon, de E.E. Knight, tome 1 de l'âge de feu.

Le personnage central du livre est un dragon : Auron, dont nous suivons les aventures de la naissance jusqu'au début de sa période adulte. Son monde est peuplé de nains, d'elfes, d'humains et bien sur de dragons ; ces différentes espèces ne vivent pas toujours, c'est peu dire, dans la plus parfaite harmonie : les dragons tendent à disparaître, certains humains ont des tendances hégémoniques, ... Auron commence dans la vie de façon très sauvage ( il chasse, mange même des enfants, ... ) mais il développera une attitude réfléchie, n'utilisant plus la violence que contraint et forcé, ou alors pour des causes qui lui tiennent à coeur. Et si l'avenir de la paie entre les espèces dépendait d'un dragon ?

Outre l'originalité du personnage, l'histoire est vraiment très prenante : ce tome 1 se lit avec grand plaisir. J'ajoute d'ailleurs qu'il se suffit à lui même ; il se termine par une vrai fin. Je lirai quand même les suites : le tome 2 a, si j'ai bien compris, comme personnage central une des soeurs d'Auron.


Ma note : 15/20

mardi 14 février 2012

La Légende de Marche Mort



Je viens de terminer un nouveau David Gemmell : "La légende de marche mort". Dans la lignée de "Druss la légende" et de "Légende", mais avec un Druss peut-être un peu plus tiraillé par le doute, plus humain. J'ai lu cette oeuvre d'une seule traite, sans avoir le temps de m'ennuyer.
Tout comme dans "Légende", vous vivrez un siège passionnant, et si certains schémas de ces deux livres sont identiques, je n'ai pas eu l'impression de relire deux fois la même chose.
Un autre aspect intéressant de cette histoire est qu'elle est racontée par Druss lui même, pendant sa dernière bataille ( voir "Légende" ) ; ce qui apporte un éclairage nouveau à certains personnages de "Légende". On apprend aussi de nouvelles choses sur Druss : en autre d'où lui vient le surnom de "Marche Mort".
Bref, pour conclure, si vous aimez le genre Fantastique, les batailles épiques, n'hésitez pas, lisez ! 


Au passage, je signale, comme la photo l'illustre que j'ai lu ce bouquin sur mon IPad et que le format numérique de ce livre est tout à fait correcte.


P.S. : je viens de trouver un bon site sur Gemmell ici.


Ma note : 14/20