blog.pagesd.info

Aller au contenu | Aller au menu | Aller à la recherche

lundi 17 octobre 2011

Personnalisation de la CSS pour ASP.NET MVC

Ce billet est avant tout un pense-bête personnel pour noter les quelques modifications que j'apporte assez régulièrement à la feuille de style fournie par défaut quand on génère un nouveau projet ASP.NET MVC3 dans Visual Studio.

En général, lorsque je débute un nouveau projet, j'ai tendance à conserver la feuille de style telle que Visual Studio l'a créée. Puis quand je bloque sur des fonctionnalités ou des problèmes techniques, je m'accorde un petit moment de détente en adaptant « Site.css » pour essayer d'embellir mon projet avant de repartir de plus belle.

mysite01.png

Normalize

Avant toute chose, et pour partir du bon pied, je démarre par un petit reset.css, ou ces derniers temps un normalize.css dans la vue _Layout.cshtml :

<head>
  ...
  <link href="@Url.Content("~/Content/normalize.css")" rel="stylesheet" type="text/css" />
  <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
  ...
</head>

Undo

Comme j'aime très moyennement les coins arrondis, je commence par m'en débarrasser. Ca m'amuse toujours de commencer de façon radicale en lançant un rechercher / remplacer de -radius par -no-radius. Cela me permet de venir à bout de border-radius, -moz-border-radius et autre -webkit-border-radius. Mais au final, je fais ça de façon plus civilisée en redéfinissant tous les styles « xxxxx-border-radius » à 0.

/* Suppression des coinzarrondis */
#main,
footer, 
#footer,
ul#menu li a
{
  border-radius: 0;
  -webkit-border-radius: 0;
  -moz-border-radius: 0;
}

Il y a aussi l'effet d'ombre 3D sur le titre « My MVC Application » que je trouve un peu lourd. Là encore, un rechercher / remplacer à l'arrache de -shadow par -no-shadow ne fait pas de mal. Ou plus proprement je redéfini le style « text-shadow » de « header h1 ».

/* Suppression de l'effet 3D sur le titre */
header h1,
#header h1
{
  text-shadow: 0 0 0 transparent;
}

Font

Une fois défoulé, j'apporte encore quelques modifications encore plus personnelles pour obtenir un résultat un peu plus à mon goût.

Comme je suis toujours dans ma période Century Gothic is Beautiful, c'est elle qui gagne par rapport à la police « Trebuchet MS » utilisée par défaut.

/* Utilisation de ma police de prédilection */
body
{
  font-family: "Century Gothic", "Trebuchet MS", Verdana, Helvetica, Sans-Serif;
}

Color

Puis, même si j'aime beaucoup le bleu assez soutenu utilisé comme couleur de fond, je le change pour une couleur plus claire et neutre.

Ensuite, je change les couleurs de titres au gré de l'humeur du jour ou des « Oh, c'est quoi cette joli couleur » trouvés sur d'autres sites. Ou plus simplement, c'est le titre général en chocolat, le titre de page en gris clair et les sous-titre en vert.

Après, j'ai encore un problème avec le menu qui est bleuté par défaut parce que je n'ai rien trouvé qui me plaise vraiment. Pour l'instant, je me contente de le faire ressortir en le passant en blanc sur fond vert avec un effet chocolat quand on passe la souris dessus.

/* Changement du jeu de couleurs */
body { background-color: #e0e0e0; } /* Un fond de page gris clair */
header h1, #header h1, h1 { color: #d2691e; } /* chocolat */
h2 { color: #888888; } /* gris */
h3 { color: #39b449; } /* vert */
ul#menu li a { color: #fff; background-color: #39b449; } /* Menu blanc/vert */
ul#menu li a:hover { background-color: #d2691e; } /* Et survolé en chocolat */
ul#menu { border-bottom: 0; } /* Tant qu'à faire */

Table

Une fois zen, je pars à l'assaut des tables. Déjà c'est du n'importe quoi. Pour éviter de m'emporter, je commence par un table { width : 100% } pour qu'elles s'étalent par défaut sur toute la largeur de la page.

/* Par défaut les tables occupent toute la largeur de la page */
table
{
  width: 100%;
}

Puis j'aère les cellules parce que ça sert à rien de se payer des 21 pouces si c'est pour rester tout riquiqui et tassé.

/* Aération des cellules */
thead th,
tbody td,
tfoot th
{
  border: 1px dotted #aaa;
  padding: 0.5em;
  text-align: left;
  vertical-align: top;
}

En parlant de thead et autres, je me plonge dans toutes les vues d'ores et déjà générées par défaut pour rajouter les balises <thead> et <tbody> que Visual Studio s'acharne à oublier. Y m'énerve ! C'est pourtant pas compliqué de comprendre que :

  • C'est quand même beaucoup plus simple à styler
  • C'est bien plus pratique pour utiliser la plupart des plugins jQuery

Après ça, je peux facilement colorer les en-têtes et pieds de tables en reprenant la couleur du menu d'onglets :

/* Redéfini les couleurs de l'en-tête et du pied des tables */
thead tr th,
tfoot tr th
{
  background-color: #3399ff;
  color: #fff;
}

Puis là, comme j'en ai rien à faire des vieux navigateurs, j'alterne la couleur de fond des lignes avec du CSS3 et un fond moins blanc que blanc.

/* Alterne la couleur de fond des lignes d'une table */
tbody tr:nth-child(odd)
{
  background-color: #f0f0f0;
}

Pour continuer à animer et égayer un peu les tableaux, je fais mon petit effet au passage de la souris en changeant la couleur de fond de la ligne pour que ça pète un peu plus. Là aussi, la couleur dépend des jours et de l'inspiration. Et aujourd'hui c'est jaune clair parce qu'il a l'avantage d'avoir un petit effet orangé sur mon portable.

/* Ajoute un effet lors du survol d'une ligne */
tbody tr:hover
{
  background-color: #ffff80;
}

Form

Là aussi, il y aurait pas mal à dire du choix du balisage. Le problème, c'est que c'est tout un ensemble entre les helpers et le système de validation alors c'est un peu compliqué et que je résiste encore pour conserver tel quel le html généré par Visual Studio. Ce qui fait que je n'arrive pas à me fixer sur quelque chose de « définitif ». Enfin bref, y'a rien qui me plait pour l'instant. A suivre donc…

mysite02.png

lundi 26 avril 2010

Nouvelle CSS pour AP

Ca fait une éternité que j'ai envie de donner un coup de jeune à la charte graphique de 07 Ardèche qui date des tous premiers jours du site et qui n'a quasiment jamais évolué depuis, si ce n'est pour gérer de plus en plus de trucs.

L'idéal ça aurait été de la remplacer complètement, mais ça demande beaucoup de travail. Et à chaque fois que j'essaie de m'y mettre, je n'ai pas suffisamment de temps libre pour m'occuper de tous les aspects du site, ce qui fait que malgré plusieurs démarrages, rien ne bouge...

Par conséquent, ce coup-ci j'ai préféré prendre le problème à l'envers et plutôt que de repartir à zéro pour tout changer, j'y suis allé par petites touches même si le résultat final est moins spectaculaire.

Améliorer la lisibilité

Pour commencer, j'ai défini une couleur fond différente pour le body (gris très clair) et la partie contenu (blanc). Pour cela, j'ai utilisé une image de fond un peu plus large que le contenu ce qui donne l'impression qu'il existe une bordure assez grande autour du contenu. Le but c'est d'essayer de donner un effet un peu moins tassé aux pages.

Pour continuer à "alléger" les pages et rendre leur contenu un peu plus lisible, j'ai cherché à mieux faire ressortir les différents types de contenu. Jusqu'à présent, il n'y avait en gros que 3 couleurs dans tout le site :

  • du noir pour le texte
  • du bleu pour les liens et certains titres
  • du vert pour quelques titres

J'ai donc décidé de revenir à plus de simplicité et d'être plus strict en réservant le bleu aux liens. Et pour les titres, je suis parti avec du gris qui est ma couleur du moment pour tout ce qui est titre. Après avoir appliqué ce même gris aux deux barres de séparation en haut et en bas de page, le contenu des pages me parait un peu moins fouillis.

Toujours pour que le texte soit plus simple et j'espère plus lisible, j'ai fait disparaitre tous les effets de décalage et d'alinéa qui pouvaient exister sur certaines pages et j'ai un peu dé-complexifié les styles pour la navigation dans la partie blogue.

J'ai terminé en simplifiant le contenu de la feuille de style. Globalement, cela a consisté à supprimer tout plein de vieux code CSS qui ne servait plus trop à rien mais qui continuait à trainer dans la feuille de style :

  • l'ancien système de pictogrammes utilisé dans les premiers mois du site
  • des bidouilles issues de Skidoo Lean pour gérer au mieux IE 5, IE 5.5, IE Mac et FF 0.#
  • la mise en évidence des mot-clés recherchés quand on arrivait d'un moteur de recherche (là j'ai aussi dû modifier le traitement dans les sources du programme)

Augmenter les espacements

Après avoir mis ces premières modifications en production et vérifié pendant quelque jours que ça ne posait pas de problème, j'ai pu m'attaquer à une seconde vague d'évolutions.

Jusqu'à présent, les différents contenu étaient un peu collés les uns aux autres. Par exemple, il n'y avait qu'un espacement de 10 pixels entre le contenu principal des pages et le bandeau latéral qui contient les pictogrammes, les sous-menus et autres publicités.

Au fil du temps, j'avais donc plus ou moins mis en place les 3 types de disposition suivantes :

  • 2 colonnes =>
    • contenu principal (790 pixels) + espacement (10 pixels) + bandeau latéral (160 pixels)
    • 1° demi colonne (390 pixels) + espacement (10 pixels) + 2° demi colonne (390 pixels) + bandeau latéral (160 pixels)
  • 3 colonnes => 1° colonne (480 pixels) + espacement (10 pixels) + 2° colonne (300 pixels) + espacement (10 pixels) + bandeau latéral (160 pixels)

Le premier truc, pour aérer les pages et faire moins tassé, c'était d'augmenter tous les espacements de 10 à 20 pixels, en essayant néanmoins de respecter deux impératifs :

  • rester dans la limite des 960 pixels
  • commencer à aller vers un système de grid

Finalement, après beaucoup de calculs et la tentation de dépasser les 960 pixels, j'ai réussi à opter pour un système de grid avec des colonnes de 180 pixels :

  • 180 px + 20 px + 180 px + 20 px + 180 px + 20 px + 180 px + 20px + 160px

J'ai donc dû un peu tricher avec la dernière colonne mais de toute façon 160 pixels c'est pile ce dont j'ai besoin pour le bandeau AdSense vertical.

Et ça me permet de gérer le mode 2 colonnes très simplement :

  • contenu principal (780 pixels) + espacement (20 pixels) + bandeau latéral (160 pixels)
  • 1° demi colonne (380 pixels) + espacement (20 pixels) + 2° demi colonne (380 pixels) + bandeau latéral (160 pixels)

L'avantage avec ça, c'est que j'arrive même à avoir les 4 colonnes nécessaires pour afficher certaines pages de l'annuaire où les sites sont classés par commune et se présentent alors sur 4 colonnes.

Malgré tout, il reste encore une disposition un peu exotique pour les pages sur 3 colonnes :

  • 1° colonne (480 pixels) + espacement (20 pixels) + 2° colonne (280 pixels) + espacement (20 pixels) + bandeau latéral (160 pixels)

Une fois ces nouvelles mesures décidées, il a fallu mettre à jour les CSS pour que tout rentre dans le moule. Ca n'a pas été facile facile à faire. J'ai dû y aller petit morceau par petit morceau et m'y reprendre à plusieurs fois avant d'en venir à bout. Et j'ai dû passer par des tas de background-color: pink, yellow, green, blue ... pour bien vérifier que chaque morceau était bien cadré comme il fallait et que rien ne sortait des clous.

Après ça, je me suis un peu reposé en me contentant d'espacer légèrement l'en-tête et le pied de page et en simplifiant certains bouts de CSS par ci ou par là.

Fignoler la présentation

Pour finir, je suis revenu sur le système que j'avais utilisé au début pour donner un effet de large bordure autour du contenu des pages.

La largeur des pages est fixée à 960 pixels, ce qui ne laisse pas de place pour des marges de 20 pixels à gauche et à droite. Par conséquent, pour simuler ces marges, j'ai donc utilisé une image de fond de 1000 pixels de large que j'applique à l'élément body :

body
{
        background: #eee url(bg1000.gif) repeat-y center top;
        color: #000;
        margin: 0;
        padding: 0;
        text-align: center;
}

#pageWrapper
{
        margin: auto;
        padding: 0;
        width: 960px;
        text-align: left;
}

L'inconvénient, c'est qu'avec ce système le fond blanc commence en haut de l'écran pour finir tout en bas de l'écran alors que j'aurais bien voulu avoir un petit espacement d'une dizaine de pixels en haut et en bas.

Après avoir essayé de jouer sans succès avec un effet de margin ou de padding vertical sur l'élément body, j'avais bricolé les border pour parvenir à ce que je souhaitais faire :

body
{
        background: #eee url(bg1000.gif) repeat-y center top;
        border-bottom: solid 10px #eee;
        border-top: solid 10px #eee;
        color: #000;
        margin: 0;
        padding: 0;
        text-align: center;
}

Le problème, c'est qu'avec les écrans 21 pouces ou plus, on avait le border à la fin du contenu (sous le pied de page) puis on retrouvait l'image de fond qui se répétait jusqu'en bas de l'écran :). J'ai donc dû changer de méthode et finalement, je me suis rendu compte qu'il suffisait de gérer cette bordure au niveau de l'élément html.

html
{
        background-color: #eee;
        color: #000;
        padding: 10px 0;
}

Idées pour la suite

Même si à première vue les nombreuses modifications apportées ne sautent pas aux yeux, je suis malgré tout extrêmement satisfait des résultats que j'ai obtenus :

  • le contenu est moins tassé et plus lisible qu'avant,
  • la structure et la taille des pages sont plus homogènes,
  • le code CSS a été pas mal nettoyé.

Pour l'avenir, j'aimerai faire rentrer le mode 3 colonnes dans le rang en faisant en sorte que la colonne du milieu passe de 280 pixels à 180 pixels. Pour cela, il faudra aussi revoir la façon de l'utiliser et très certainement le code source de l'application pour qu'elle gère moins de contenu et qu'elle ait plus un rôle de sous-menu géant.

Mais à priori, cela devrait être tout à fait jouable pour les différentes parties du site qui ont besoin de cette disposition en 3 colonnes :

  • la météo
  • les offices de tourisme
  • les randonnées

Une autre évolution, ça serait de voir si maintenant que mon code est un peu plus carré je peux réussir à remplacer la base Skidoo Lean qui commence à dater par un framework CSS plus récent.

Et si en plus de tout ça je continue à simplifier suffisamment mon code CSS et à gérer moins de cas particuliers, peut-être que j'arriverai un jour à faire un changement de charte graphique beaucoup plus radical et visible.

jeudi 18 mars 2010

Simplifier la balise head pour ASP.NET MVC

Dernièrement, j'ai souhaité remplacer le PlaceHolder qui sert à définir le titre de la page et qui est généré par l'application ASP.NET MVC créée par défaut par Visual Studio 2008 :

<head runat="server">
    <link href="../../Content/style.css" rel="stylesheet" type="text/css" />
    <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
...
</head>

Pour moi, plutôt que d'avoir un PlaceHolder qui se contente de gérer le contenu de la balise <title>, je préfère avoir un PlaceHolder un peu plus "générique" pour pouvoir m'en servir pour insérer plus de contenu dans la partie <head> de la page :

<head runat="server">
    <link href="../../Content/style.css" rel="stylesheet" type="text/css" />
    <asp:ContentPlaceHolder ID="HeadContent" runat="server" />
...
</head>

Puis, dans mes vues, j'ai remplacé la partie consacrée au PlaceHolder TitleContent :

<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

Par du code qui s'adresse au PlaceHolder HeadContent :

<asp:Content ID="indexHead" ContentPlaceHolderID="HeadContent" runat="server">
    <title>Home Page</title>
</asp:Content>

Ca marchait bien, mais à l'occasion d'un affichage du source HTML, je me suis rendu compte qu'il y avait comme un défaut :

<head><link href="Content/style.css" rel="stylesheet" type="text/css" />
    <title>Home Page</title>
<title>
 
</title></head>

Y'a DEUX balises <title> ! Mais c'est normal ! C'est parce que ASP.NET ne se rend pas compte que qu'il y a déjà une balise <title> alors il en insère une parce qu'il sait qu'un <head> sans <title> c'est pas des choses à faire. mais pourquoi donc est-ce que ASP.NET se mêle de ça ? C'est parce que la balise <head> contient une attribut runat="server". Ben qu'est-ce qu'il fait là celui-là ?

Je sais pas mais y'a qu'à demander : TipJar: Title Tags and Master Pages.

Et donc, le fait d'avoir <head runat="server"> semble avoir deux avantages / effets.

En un, cela permet à ASP.NET de vérifier la validité du code html composant la section <head> de la page HTML. En particulier, si ASP.NET s'aperçoit que la page ne contient pas de balise <title>, il en insère une automatiquement (avec un titre vide d'accord, mais au moins la validité est sauve).

En deux, cela permet de gérer correctement les adresses des fichiers à incorporer. Par exemple, il est possible de référencer les feuilles de styles CSS ou les fichiers de scripts Javascripts en utilisant un tilde dans leur adresse :

  • <link rel="stylesheet" type="text/css" href="~/Content/style.css" />
  • <script type="text/javascript" src="~/Scripts/jquery.js"></script>

C'est pas totalement idiot parce que c'est quand même beaucoup plus simple que de s'essayer avec des href="../../Content/style.css" ou href="../Content/style.css" jusqu'à ce qu'on tombe sur la bonne combinaison.

Malgré tout, est-ce que ça serait si grave que ça que j'enlève le runat="server" de ma balise <head> ?

  • Je perd le contrôle de la validation pour le <title> mais dans mon cas c'est plus un problème qu'un avantage.
  • Et en ce qui concerne la simplification des adresses href ou src, ça serait bien le diable si c'était si indispensable que ça. Outre le fait que jusqu'ici je me dé...brouille tout le temps pour m'en passer, il devrait être possible de faire autrement.

Et c'est même tout à fait possible puisqu'il y a déjà quelqu'un qui s'est occupé de faire ça : Refactoring the ASP.NET MVC project template. Mais pour l'instant, je ne vais pas aller aussi loin que lui et me mettre à créer des helpers spécifiques pour insérer des fichiers CSS ou Javascript.

Dans un premier temps, je vais me contenter d'utiliser tout simplement la méthode Url.Content() :

<head>
    <link href="<%= Url.Content("~/Content/style.css") %>" rel="stylesheet" type="text/css" />
    <script src="<%= Url.Content("~/Scripts/jquery-1.3.2.js") %>" type="text/javascript"></script>
    <asp:ContentPlaceHolder ID="Htmlhead" runat="server" />
</head>

C'est beau, on dirait du HTML.

Localhost lent avec Firefox, Safari et Chrome

Ces derniers temps, je travaille sur une charte graphique pour ASP.NET MVC. Je teste au fur et à mesure sous Internet Explorer 8 (parce que c'est la cible de l'application) et sous Firefox 3.5 (pour être sûr de faire du code à peu près correct).

J'avais l'impression que tout allait bien, mais ces derniers temps je me suis rendu compte que l'affichage était vraiment lent. Et pourtant, je fais mes essais avec le projet ASP.NET MVC quasi vide créé par défaut par Visual Studio 2008. En particulier, l'image de fond mettait une bonne seconde avant de s'afficher. Alors que c'est un bête PNG de 350 octets ! Ca y est, mon disque dur SSD est devenu lent :(

Au début, je me suis dit que je verrai ça plus tard jusqu'à ce que je remarque que ce phénomène de lenteur était beaucoup plus sensible avec Firefox et quasiment inexistant avec Internet Explorer. (Ah! Ah! Microsoft qui est meilleur que Mozilla :). Et là ça a fait tilt. Je me suis souvenu que j'avais déjà vu ce genre de problème signalé quelque part : une application ASP.NET MVC qui devient lente quand on utilise Firefox.

Y'avait plus qu'à aller sur Google pour voir comment régler ça. Et en deux temps trois mouvements j'ai eu la réponse à mon problème : un bête problème d'IPv6 avec localhost (pas d'inquiétude, moi non plus je sais pas ce que ça veut dire).

D'abord, une bidouille spéciale pour Firefox (Fixing Firefox Slowness with localhost on Vista (or XP with IPv6) qui consiste à modifier la configuration avancée de Firefox :

  • taper about:config dans la barre d'adresse
  • promettre de bien faire attention
  • filtrer sur le paramètre network.dns.disableIPv6
  • double-cliquer sur la ligne obtenue pour passer de "false" (valeur par défaut) à "true" (valeur définie par l'utilisateur)
  • quitter et redémarre Firefox pour faire bonne mesure (pas sûr que cela soit vraiment nécessaire)

C'est déjà pas mal, mais en y regardant de plus près, j'ai vu que cette lenteur concernait aussi Chrome et Safari (Slow IIS on Vista with Firefox, Chrome or Safari). Si jamais il me reprend l'envie d'installer Safari ou Chrome (ou Opera ?) un jour ou l'autre, je suis bien obligé de faire les choses correctement.

Et étant donné que le contenu de mon fichier hosts ne ressemblait pas tout à fait à ce qui était indiqué, j'ai continué à chercher et je suis finalement tombé sur un truc un peu plus explicite sur StackOverflow : My Local Host goes so slow now that I am on windows 7 and Asp.net MVC.

Avec ça, je peux faire ma modification, si ce n'est que mon fidèle Notepad ne veut pas me laisser enregistrer le fichier et attend de moi que je lui donne un autre nom ou que je le sauvegarde dans "Mes Documents". Qu'à cela ne tienne, je quitte puis j'exécute Notepad en tant qu'administrateur et ce coup-ci plus de problème.

Mon fichier C:\Windows\System32\drivers\etc\hosts d'origine :

# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
#       127.0.0.1       localhost
#       ::1             localhost

Le même fichier hosts après avoir dé-commenté la ligne 127.0.0.1 localhost :

# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
127.0.0.1       localhost
#       ::1             localhost

Et même après avoir remis le paramètre network.dns.disableIPv6 de Firefox à "false", je peux débuguer ma charte graphique sous Firefox sans attendre des heures une seconde à chaque fois que je rafraichis la page.

jeudi 11 mars 2010

Faire une liste Html.RadioButton

Un bouton radio ne s'utilisant jamais seul, on doit donc coder plusieurs helpers Html.RadioButton() quand on veut permettre à l'utilisateur de faire un choix entre plusieurs options :

<% using (Html.BeginForm()) { %>
   <fieldset>
     <p>
        Couleur ?
        <%= Html.RadioButton("Couleur", "R", false) %>Rouge
        <%= Html.RadioButton("Couleur", "V", true) %>Vert
        <%= Html.RadioButton("Couleur", "B", false) %>Bleu
     </p>
     <p>
        <input type="submit" value="Save" />
     </p>
   </fieldset>
<% } %>

Ce code ASP.NET permet d'afficher la page ci-dessous :

radio-button-helper.jpg

Si on consulte le code source de cette page, on trouve le code HTML suivant :

<form action="/Home/Edit" method="post">
   <fieldset>
     <p>
        Couleur ?
        <input id="Couleur" name="Couleur" type="radio" value="R" />Rouge
        <input checked="checked" id="Couleur" name="Couleur" type="radio" value="V" />Vert
        <input id="Couleur" name="Couleur" type="radio" value="B" />Bleu
     </p>
     <p>
        <input type="submit" value="Save" />
     </p>
   </fieldset>
</form>

Il faut cliquer sur un des 3 boutons radio pour sélectionner une option. Une fois qu'une option a été sélectionnée, le fait de cliquer sur un autre bouton radio va sélectionner une nouvelle option et automatiquement dé-sélectionner l'option qui était sélectionnée auparavant. Les 3 boutons radio sont liés entre eux et on ne peut sélectionner qu'une seule option à la fois parce qu'au niveau du code HTML, les 3 <input type="radio" ...> ont le même attribut name.

Pour l'instant, si on veut sélectionner une option, il est obligatoire de bien viser et de cliquer pile sur le petit rond du bouton radio. Dans la pratique, il faudrait faire en sorte que quand on clique sur le libellé de l'option, cela permette aussi de sélectionner cette option.

Pour faire ça, il faut associer le libellé au bouton radio. En HTML, on fait ça en utilisant une balise "label" pour définir le libellé et on relie ce label au bouton radio avec un attribut "for" qui pointe vers l'identifiant du bouton radio :

<input id="Couleur" name="Couleur" type="radio" value="R" /><label for="Couleur">Rouge</label>

Avec le helper Html.RadioButton() de ASP.NET MVC, il suffit donc de faire ça, mais le problème c'est que ça n'est pas si facile que ça...

Pour commencer, si on re-regarde le code HTML généré, on s'aperçoit que les 3 boutons radio ont le même identifiant ! Outre le fait que c'est pas normal du tout, ça nous complique la vie pour associer chaque libellé au bon bouton radio (puisque l'attribut "for" a besoin de l'identifiant du contrôle associé). Il va donc falloir trouver un moyen pour définir un identifiant unique pour chaque bouton radio. Heureusement, c'est prévu : le helper Html.RadioButton() accepte un objet htmlAttributes qui va nous permettre de faire ça.

Couleur ?
<%= Html.RadioButton("Couleur", "R", false, new { @id = "Red" })%><label for="Red">Rouge</label>
<%= Html.RadioButton("Couleur", "V", true, new { @id = "Green" })%><label for="Green">Vert</label>
<%= Html.RadioButton("Couleur", "B", false, new { @id = "Blue" })%><label for="Blue">Bleu</label>

Et ce coup-ci, on peut constater au niveau du code HTML généré que les 3 boutons radio n'ont plus à partager le même identifiant :

Couleur ?
<input id="Red" name="Couleur" type="radio" value="R" /><label for="Red">Rouge</label>
<input checked="checked" id="Green" name="Couleur" type="radio" value="V" /><label for="Green">Vert</label>
<input id="Blue" name="Couleur" type="radio" value="B" /><label for="Blue">Bleu</label>
 

Et maintenant, il est possible de cliquer sur le nom d'une couleur pour automatiquement sélectionner le bouton radio qui lui est associé.

lundi 25 janvier 2010

Nouvelle charte graphique Prisca

Un billet quasi-obligé pour donner quelques nouvelles du blogue en attendant d'ici peu d'autres informations sur la traduction du tutoriel NerdDinner. Pour commencer, l'évolution la plus évidente c'est le changement de la charte graphique. Dans la charte graphique précédente, j'avais cherché à mettre en avant le contenu du blogue en l'isolant dans un cadre sur fond blanc alors que tout le reste du contenu était "posé" directement sur un fond de page aux tons marron clair.

Le problème, c'est que j'avais essayé de faire en sorte que le maximum de contenu soit visible en une seule fois. Pour cela, j'avais diminué la taille des caractères, réduit un peu trop les marges et pas mal chargé les blocs d'en-tête où j'avais regroupées toutes les informations du billet : titre, date, permalien, tags...

Un autre truc que j'avais fini par trouver un peu lassant à la longue, c'était le côté très encadré (et même enfermé) des différents éléments de cette ancienne charte graphique. En plus du cadre général pour le contenu principal, j'avais utilisé une couleur de fond plus foncée pour dessiner une sorte de cadre pour les blocs d'en-tête des billets. Et pour bien insister, j'étais allé jusqu'à présenter les tags et même quelques éléments de navigation sous forme de boutons avec un léger effet 3D... A tel point que j'avais d'ailleurs appelé cette charte graphique "Boxed" :)

Ce coup-ci, j'ai commencé par essayer de corriger ça en démarrant encore une fois avec un grand bloc blanc mais en y disposant des marges beaucoup plus importantes. Je cherchais en fait à obtenir un peu le même effet que sur une page dans Word avec des marges de 3 ou 4 centimètres. Le problème, c'était que si je voulais rester dans une échelle d'environ 960 pixels de large, il ne me restait pas tant d'espace que ça pour le texte (et surtout les extraits de code source) une fois que j'avais compté l'espace pris par ces marges et le bandeau vertical destiné aux tags et aux différents menus ou liens...

Alors je me suis dit qu'à tant qu'à faire, pour gagner un maximum de place le mieux c'était de carrément supprimer le cadre blanc et de partir avec un simple fond de page tout blanc sur lequel je pourrai placer directement tous les éléments du blogue. Avec cette méthode, je n'avais plus besoin que d'une large marge entre le contenu principal et la colonne latérale.

Puis j'ai augmenté la taille des caractères du contenu principal pour qu'il ressorte plus par rapport à tout le reste du blogue (et au début j'avais même essayé avec des caractères 10% plus gros mais ça faisait un peu trop). Pour accentuer ce contraste entre ce contenu principal et le reste du contenu, j'ai aussi traité les liens de deux façons différentes, même si je les affiche toujours en bleu dans les deux cas :

  • soulignés par défaut dans le contenu principal puis non soulignés lors du passage de la souris,
  • non soulignés par défaut dans le contenu secondaire et soulignés seulement au moment du passage de la souris dessus.

Pour compléter l'impression de clarté et de simplicité apportée par le fond blanc sans bordure, j'ai aussi cherché à simplifier l'aspect général du blogue. Pour commencer, j'ai éclairci le texte en employant un gris foncé plutôt que du noir. J'ai aussi allégé la présentation en augmentant de façon significative l'espacement entre les lignes. Et pour renforcer un peu plus cette idée de sobriété, j'ai aussi diminué le nombre de polices de caractères employées :

  • Georgia pour le titre du blog (balise <h1>)
  • une police style Courrier pour le code source
  • Verdana pour tout le reste

Après j'ai re-stylé la présentation des différents niveaux de titres et de sous-titres. Pour eux aussi, j'ai tout d'abord utilisé une taille de caractères beaucoup plus grosse que dans la version précédente. Puis j'ai utilisé un jeu de couleurs propre à chaque niveau de titre : un vert basique pour le plus haut niveau (balise <h2>), un gris assez clair pour le niveau intermédiaire (balise <h3>) et un simple noir pour le dernier niveau de titre (balise <h4>).

La seule fioriture au niveau des titres a été de placer une sorte de liseré gris très très clair en dessous des titres des billets pour marquer la séparation avec le contenu du billet lui-même. L'avantage c'est que je peux m'en servir pour y afficher la date de publication du billet, son lien permanent et la liste de ses tags.

Pour finir, en plus de l'avoir fait passer du côté gauche au côté droit de l'écran, j'ai complètement réorganisé le contenu du bandeau latéral. La partie lien a été fusionnée avec la partie navigation de Dotclear et ne contient plus que trois liens vers l'accueil, les archives et le fil RSS. Par la suite, il est possible que je rajoute une page spéciale pour remettre certains des liens qui apparaissaient auparavant dans cette barre latérale. Après réflexion j'ai décidé de conserver la zone de recherche parce qu'il m'arrive de m'en servir au moins pour rechercher parmi mes Blogmarks. Et je l'ai complété par la liste des derniers billets publiés (mais je ne suis pas vraiment sûr d'avoir envie de garder celle-ci). Et en dessous de cette liste j'ai relégué la liste des tags de laquelle j'ai fait disparaitre la corélation entre la taille des caractères et le nombre de billets correspondant aux tags.

Et sinon, à part ce changement au niveau de la charte graphique, le blogue a connu deux autres évolutions assez importantes même si elles sont beaucoup moins visibles.

La première de ces évolutions, c'est que j'ai enfin terminé de reprendre tous les billets que j'avais publiés à l'origine sur mes précédentes tentatives de blogues sous Blogger et WordPress, sans compter tous les billets consacrés à QC que je suis allé récupérer dans les archives de l'internet. Ca m'a pris du temps, mais je suis bien content de l'avoir fait.

En ce qui concerne la seconde de ces évolutions, elle n'est pas vraiment de mon fait, mais elle contribue à me simplifier pas mal la vie. Suite à la mise en place d'une version plus récente de Dotclear sur la plateforme GandiBlog, je peux maintenant republier mes Blogmarks de façon un peu plus automatisée. Avant, une fois que j'avais récupéré les blogmarks de la veille (par RSS) puis que je les avais envoyé vers Dotclear (via l'interface XML-RPC), je devais encore me connecter au blog pour ajouter manuellement un tag "Blogmarks". Mais maintenant, l'API de Dotclear prend en compte la propriété mt_keywords et je peux enfin définir le tag "Blogmarks" directement via l'interface XML-RPC. Et au passage, j'en ai profité pour bidouiller un peu le contenu généré par Blogmarks pour mieux gérer le cas où celui-ci contient un bloc de citation <blockquote>.

jeudi 10 septembre 2009

Placer un libellé semi-transparent sur une image

J'avais vu ça il y a pas mal de temps, alors ce coup-ci je blogue pour essayer de ne pas oublier comment faire.

Côté Html

<div class="img-desc">
        <img src="sample.jpg" alt="" />
        <cite>Salone del mobile Milano, April 2008 - Peeta</cite>
</div>

Côté CSS

.img-desc {
        position: relative;
        display: block;
        height:335px;
        width: 575px;
}
.img-desc cite {
        background: #111;
        filter:alpha(opacity=55);
        opacity:.55;
        color: #fff;
        position: absolute;
        bottom: 0;
        left: 0;
        width: 555px;
        padding: 10px;
        border-top: 1px solid #999;
}

Sources et exemples

vendredi 5 juin 2009

Ouvrir un document en dehors du navigateur

Quand on vient comme moi de changer de PC et que son nouveau Microsoft Internet Explorer a la facheuse habitude d'ouvrir les fichiers Word dans le navigateur plutôt que de lancer le Microsoft Word qui va bien, il ne faut pas hésiter à aller trifouiller dans le paramètres de l'explorateur de fichiers :

  • cliquer sur le menu "Outils"
  • choisr le sous-menu "Option des dossiers..."
  • aller sur l'onglet "Types de fichiers"
  • rechercher la ligne "DOC - Document Microsoft Word" (c'est dans l'ordre alphabétique)
  • cliquer sur le bouton "Avancé"
  • décocher "Parcourir dans une même fenêtre"
  • valider en cliquent sur le bouton "OK"
  • fermer la fenêtre "Option des dossiers" en cliquant sur le bouton "Fermer"

Pour faire bonne mesure et parce qu'on a rien à perdre, le mieux c'est ensuite de fermer les fenêtres de toutes les applications en cours, d'arrêter l'ordinateur puis de le redémarrer après avoir compté jusqu'à 5 (un, deux, trois, quatre et cinq).

Ou bien alors, avant d'en arriver à cette extrémité, on peut aussi en profiter pour répéter l'opération pour les fichiers Microsoft Excel, Adobe PDF, etcétéra...

jeudi 30 octobre 2008

Nouveau thème Boxed

Ca faisait un bon moment que j'y pensais et je l'ai enfin fait : mon blog a maintenant une nouvelle charte graphique ! Quittez donc 5 secondes votre agrégateur et venez vous rendre compte par vous-même :)

Au début, j'étais parti comme bien souvent de la charte graphique Skidoo Redux et petit à petit, j'étais arrivé à faire ce que je souhaitais obtenir, à savoir :

  • une présentation sur 2 colonnes, avec les menus ou autres dans une barre latérale sur la gauche et le contenu principal sur la partie de droite
  • un source html où le contenu principal apparait avant le contenu de la barre latérale
  • une mise en évidence du contenu principal (encadré et fond blanc) par rapport à tout le reste (fond uni qui occupe tout l'écran) et qui soit suffisamment large pour permettre les copies d'écrans et les extraits de codes sources

Malheureusement, l'adaptation sous Dotclear n'était pas si évidente que ça, parce que la structure de base pour Skidoo Redux est un peu différente de celle générée par défaut dans le cas d'un Gandi Blog.

Squelette html pour Skidoo Redux

<body>
    <div id="page-container">
        <div id="masthead">
            <div class="inside">
                <ul class="rMenu"> ... </ul>
                <h1> ... </h1>
            </div>
        </div>
        <div id="outer-column-container">
            <div id="inner-column-container">
                <div id="middle-column">
                    <div class="inside">
                        ...
                    </div>
                </div>
                <div id="left-column">
                    <div class="inside">
                        ...
                    </div>
                </div>
                <div class="clear-columns"><!-- do not delete --></div>
            </div>
        </div>
        <div id="footer">
            <div class="inside">
                ...
            </div>
        </div>
    </div>
</body>

Squelette html pour Gandi Blog

<body>
    <div id="page">
        <div id="top">
            <h1><span> ... </span></h1>
        </div>
        <p id="prelude"> ... </p>
        <div id="wrapper">
            <div id="main">
                <div id="content">
                    ...
                </div>
            </div>
            <div id="sidebar">
                <div id="blognav">
                    ...
                </div>
                <div id="blogextra">
                    ...
                </div>
            </div>
        </div>
        <div id="footer">
            ...
        </div>
    </div>
</body>

En fait, une bonne partie du principe de Skidoo Redux repose sur les deux div #outer-column-container et #inner-column-container qui permettent de définir la colonne de gauche en tant que border-left.

Dans le cas d'un Gandi Blog, il existe bien une div #wrapper qui peut se substituer à la div #outer-column-container, mais rien qui puisse correspondre à la div #inner-column-container.

Après un certain nombre d'essais d'adaptations, j'ai préféré laisser tomber et je suis allé voir sur dotaddict[http://dotaddict.org/ ce qu'il existait comme thèmes avec la structure que je souhaitais. Et parmi les différents thèmes à 2 colonnes proposés pour Dotclear 2, j'ai récupéré le thème Bastienne.

Le thème Bastienne pour Dotclear 2

Et me voila reparti pour un nouveau tour d'adaptations afin de reproduire ce que j'avais déjà réussi à faire avec Skidoo Redux.

J'ai essayé d'organiser la feuille de style en m'inspirant de cette d'origine et en gardant plus ou moins le découpage suivant :

  • la structure des différents blocs
  • la présentation des différents blocs
  • la présentation de certains blocs particuliers (citations, codes sources, listes...)
  • la présentation de blocs spécifiques à Dotclear (tags, commentaires, informations sur le billet...)

Par conséquent, si j'enlève toutes les parties spécifiques à Dotclear (et pour l'instant marquées GandiBlog), je devrais obtenir une charte graphique tout à fait acceptable pour Altrr-Press (à tester plus tard).

Je ne suis pas encore certain d'avoir bien pris en compte toutes les possibilités de Dotclear, masi c'est déjà largement suffisant pour l'utilisation que j'en fait sur ce blog. Et donc, après quasiment 2 ans de bons et loyaux services, je laisse tomber la charte graphique Scribbish pour ce blog.

Pour la mise en prod, c'est assez simple. Dans le tableau de bord, je clique sur "Apparence du blog" et je conserve mon "Custom theme" actuel, mais je change sa configuration de :

@import url(/public/scribbish/application.css);

en :

@import url(/public/css/boxed/boxed.css);
@media print {
  body { margin: 0; padding: 0; }
  #page { width: 100%; }
  #prelude, #navlinks, #sidebar, #comment-form, #pings, #ping-url, #comments-feed { display: none; height: 0; width: 0; }
  #main { float: none; margin: 0; padding: 0; width: 99% important; }
  #content pre { color: #000; background: #eee; }
  #content { border: none 0; margin: 0; padding: 0; width: 99% important; }
  /* http://longren.org/2006/09/27/wrapping-text-inside-pre-tags */
  pre {
    white-space: pre-wrap;
    white-space: -moz-pre-wrap !important;
    white-space: -pre-wrap;
    white-space: -o-pre-wrap;
    word-wrap: break-word;
  }               
}

La partie @media print, c'est pour la feuille de style à l'impression. Ca fait disparaitre tout ce qui est navigation ou accessoire de façon à n'imprimer que le contenu central, et surtout sans qu'il manque la fin des lignes (comme c'est quelquefois le cas sur certains blogs).

Pour la suite, je vais tester sur place pendant quelque temps, peut-être fignoler quelques trucs par ci par là et faire en sorte que la CSS soit bien valide. J'aimerai aussi faire apparaitre un menu en haut à droite, mais je ne saisi pas encore si je pourrait faire ça avec un simple bloc de texte puisqu'avec les Gandi Blog il n'est pas possible de modifier le squelette html. Et puis il faut aussi que je m'occupe du bloc #prelude avec les liens de navigation pour l'accessibilité que j'ai laissé caché pour l'instant.

mercredi 22 octobre 2008

Faire des vignettes d'écrans de sites internet

Plutôt que de continuer à garder ça sur un coin de page dans mon cahier grand format petit carreaux à spirale, autant recopier ici ma liste des sites internet qui permettent de générer des miniatures de pages web :

  1. Website Thumbnails and Webpage Snapshots of Any Website
  2. thmbnl - small pictures for your big picture : nécessite une inscription
  3. thumbalizr - thumb your web page
  4. thumboo - Because Text Links Suck
  5. Thumbshot.org - Free thumbnails for your website : nécessite une inscription
  6. wdesc - service de thumbshots
  7. WebShotsPro.com : Website Screenshot Generation
  8. Website thumbnails - Making URLs look memorable
  9. websnapr - Website Thumbnails For Your Site

Et dans des styles un peu différent, il y a aussi :

Mises à jour :

lundi 17 septembre 2007

Disappearing Text or Images in IE?

IE exhibits a very strange bug whereby text or background images sometimes disappear from sight. These items are still actually present and, if you highlight everything on screen or hit refresh, they'll often re-appear. Kind of strange, huh?

This problem mostly occurs on background images and on text positioned next to a floated element. To remedy the problem, simply insert position: relative into the CSS command for the disappearing element, and for some bizarre reason, that'll usually fix the problem. If this doesn't work (and sometimes, it doesn't), assign a width to the offending element in the CSS -- that should fix the problem.

My Top Ten CSS Tricks

vendredi 3 février 2006

Sémantique HTML et PageRank

Mike Davidson tried to rank for the term lodefizzle on Google. He wrote a dozen different pages to find out what aspects of HTML Google really cares about. Scroll down to the Google…

  1. The H1 tag does indeed assert some dominance and we can therefore assume you are better off using proper headings in your HTML documents.
  2. The mere appearance of many nested tables in your code does not have a strong enough negative effect to be considered a drag on search engine ranking.
  3. It’s not clear that validity helps search engine ranking, but it’s definitely true that certain errors in your code can get you completely removed from indexes.
  4. The semantic effect of hierarchical HTML headings is a stronger factor in search rankings than more rudimentary measures such as physical keyword placement.
  5. Although good semantics are somewhat valuable in optimization, simple things like proper titles, descriptive filenames, and incoming links are dramatically more important.

vendredi 20 janvier 2006

Comment cibler les publicités AdSense

Il est possible d'indiquer à Google quelle sont les parties de la page dont on souhaite mettre le contenu en avant. Cela permet de cibler les annonces affichées sur le site en fonction de ce contenu.

Pour cela, il suffit d'encadrer le contenu "intéressant" par :

<!-- google_ad_section_start -->
    ....
<!-- google_ad_section_end -->

Il est aussi possible de "masquer" du contenu pour éviter d'avoir des annonces relatives à celui-ci :

<!-- google_ad_section_start(weight=ignore) -->

    ....
<!-- google_ad_section_end -->

Via «What is section targeting and how do I implement it?»

jeudi 19 janvier 2006

Blogmarks to Html conversion

Ce fichier permet de transformer le fil atom de Blogmarks (par exemple http://api.blogmarks.net/user/ms_michel) en code html afin de pouvoir l'intégrer à une page web.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
        xmlns:atom="http://www.w3.org/2005/Atom" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:dc="http://purl.org/dc/elements/1.1/">
  <xsl:output method="html" />
  <xsl:template match="/">
    <xsl:apply-templates select="/atom:feed/atom:head" mode="before" />
    <xsl:apply-templates select="/atom:feed/atom:entry" />
    <xsl:apply-templates select="/atom:feed/atom:head" mode="after" />
  </xsl:template>
  <xsl:template match="atom:feed/atom:head" mode="before" >
    <!-- <h3><xsl:value-of select="atom:title" /></h3> -->
  </xsl:template>
  <xsl:template match="atom:feed/atom:head" mode="after">
    <p><a href="{atom:link[@rel='alternate']/@href}"><img src="http://blogmarks.net/img/88x31_neg.png" alt="blogmarks.net" /></a></p>
  </xsl:template>
  <xsl:template match="atom:feed/atom:entry">
    <div>
      <xsl:choose>
        <xsl:when test="position() mod 2 = 1">
          <xsl:attribute name="class">bm_blogmarks bm_odd</xsl:attribute>
        </xsl:when>
        <xsl:otherwise>
          <xsl:attribute name="class">bm_blogmarks bm_even</xsl:attribute>
        </xsl:otherwise>
      </xsl:choose>
      <a href="{atom:link[@rel='related']/@href}"><img src="{atom:link[@rel='image']/@href}" alt="" /></a>
      <h4><a href="{atom:link[@rel='related']/@href}"><xsl:value-of select="atom:title" /></a></h4>
      <p><xsl:value-of select="atom:summary" disable-output-escaping="yes" /></p>
      <p class="blogmarks-tags">
        <xsl:value-of select="substring(atom:published, 0, 11)" />
        <xsl:if test="atom:category">
          <xsl:for-each select="atom:category">
            <xsl:text> - </xsl:text><a href="{@term}{@sheme}"><xsl:value-of select="@label" /></a>
          </xsl:for-each>
        </xsl:if>
      </p>
    </div>
  </xsl:template>
</xsl:stylesheet>

Le code html généré est inspiré par celui de Hot Links. Il peut ensuite être présenté grâce à la feuille de style CSS suivante :

.bm_blogmarks {
  margin: 10px auto;
  padding: 1%;
  background-color: #f5f5f5;
  border: 1px solid #d9d9d9;
  width: 97%;
  overflow:auto;
}
.bm_even {
  background-color: #fcfcfc;
}
.bm_blogmarks h4 {
  margin-top: 0;
}
.bm_blogmarks p.bm_tags {
  margin-bottom: 0;
  display: block;
  clear: left;
}
.bm_blogmarks img {
  margin: 0 0px 5px 10px;
  float: right;
  border: 0;
  clear: none;
  width: 144px;
  height: 107px;
}
.bm_even img {
  margin: 0 10px 5px 0px;
  float: left;
}

(publié à l'origine sur http://www.bigbold.com/snippets/pos...)

lundi 16 janvier 2006

RDF to Html conversion

Ce fichier permet de transformer un fil RDF en code html afin de pouvoir l'intégrer à une page web.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:foo="http://purl.org/rss/1.0/">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <xsl:apply-templates select="/rdf:RDF/foo:channel"/>
    </xsl:template>
    <xsl:template match="/rdf:RDF/foo:channel">
        <h3><xsl:value-of select="foo:title"/></h3>
        <p><xsl:value-of select="foo:description"/></p>
        <ul>
            <xsl:apply-templates select="/rdf:RDF/foo:item"/>
        </ul>
    </xsl:template>
    <xsl:template match="/rdf:RDF/foo:item">
        <li>
            <a href="{foo:link}" title="{substring(dc:date, 0, 11)}"><xsl:value-of select="foo:title"/></a>
            <p><xsl:value-of select="foo:description" disable-output-escaping="yes" /></p>
        </li>
    </xsl:template>
</xsl:stylesheet>

(publié à l'origine sur http://www.bigbold.com/snippets/pos...)

RSS to Html conversion

Ce fichier permet de transformer un fil RSS (version 0.9x ou 2.0) en code html afin de pouvoir l'intégrer à une page web.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <xsl:apply-templates select="/rss/channel"/>
    </xsl:template>
    <xsl:template match="/rss/channel">
        <h3><xsl:value-of select="title"/></h3>
        <p><xsl:value-of select="description"/></p>
        <ul>
            <xsl:apply-templates select="item"/>
        </ul>
    </xsl:template>
    <xsl:template match="/rss/channel/item">
        <li>
            <a href="{link}" title="{substring(pubDate, 0, 11)}"><xsl:value-of select="title"/></a>
            <p><xsl:value-of select="description" disable-output-escaping="yes" /></p>
        </li>
    </xsl:template>
</xsl:stylesheet>

(publié à l'origine sur http://www.bigbold.com/snippets/pos...)

Atom to Html conversion

Ce fichier permet de transformer un fil atom en code html afin de pouvoir l'intégrer à une page web.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:dc="http://purl.org/dc/elements/1.1/">
    <xsl:output method="html"/>
    <xsl:template match="/">
    <xsl:apply-templates select="/atom:feed/atom:head"/>
        <xsl:apply-templates select="/atom:feed"/>
    </xsl:template>
    <xsl:template match="atom:feed/atom:head">
        <h3><xsl:value-of select="atom:title"/></h3>
        <xsl:if test="atom:tagline"><p><xsl:value-of select="atom:tagline"/></p></xsl:if>
        <xsl:if test="atom:subtitle"><p><xsl:value-of select="atom:subtitle"/></p></xsl:if>
    </xsl:template>
    <xsl:template match="/atom:feed">
        <h3><xsl:value-of select="atom:title"/></h3>
        <xsl:if test="atom:tagline"><p><xsl:value-of select="atom:tagline"/></p></xsl:if>
        <xsl:if test="atom:subtitle"><p><xsl:value-of select="atom:subtitle"/></p></xsl:if>
        <ul>
            <xsl:apply-templates select="atom:entry"/>
        </ul>
    </xsl:template>
    <xsl:template match="atom:entry">
        <li>
            <a href="{atom:link[@rel='related']/@href}" title="{substring(atom:published, 0, 11)}"><xsl:value-of select="atom:title"/></a>
            <xsl:choose>
                <xsl:when test="atom:content != ''">
                    <p><xsl:value-of select="atom:content" disable-output-escaping="yes" /></p>
                </xsl:when>
                <xsl:otherwise>
                    <p><xsl:value-of select="atom:summary" disable-output-escaping="yes" /></p>
                </xsl:otherwise>
            </xsl:choose>
        </li>
    </xsl:template>
</xsl:stylesheet>

(publié à l'origine sur http://www.bigbold.com/snippets/pos...)

mardi 21 juin 2005

Des formulaires encore plus mieux bien

CSS Forms that don't suck.