Problème
WikiNi dimensionne par défaut la taille des fenêtres de code à 400px. Cette dimension est souvent trop importante et plutôt malvenue lorsqu'il faut afficher à peine quelques lignes de code...
Solution 1
La propriété CSS2 "max-height" permet de fixer une hauteur maximum mais elle ne fonctionne pas sous
InternetExplorer.
Je propose donc une petite astuce permettant d'obtenir cette fonctionnalité sous
MoZilla, tout en conservant l'usage classique dans
InternetExplorer.
Il suffit d'ajouter à la feuille de style wakka.css :
html>body .code { width: 99%; height: auto; max-height: 400px; }
Ce code, parfaitement conforme à la norme CSS, est correctement interprété par
MoZilla mais n'est pas interprété du tout par
InternetExplorer.
--
CharlesNepote
Solution 2
Jai trouvé un script js qui ajoute la fonctionalité max-height à ie
http://www.doxdesk.com/software/js/minmax.html c'est une solution (pas top) pour supporter ie en atendant une hypothétique màj d'ie reglant le pb
--
FiFi?
Solution 3
Que pensez-vous de faire un troisieme fichier de style spécifique pour les options dépendant du navigateur ? Il pourrait se nommer
"special_".$browser.".css" par exemple et serait chargé en troisieme. Ca empêcherait completement le cache des pages en revanche... Personnellement je préfere me concentrer sur le cache des pages que sur le support de MS-IE ! ;-) --
ProgFou
- Moi je ne suis pas du tout d'accord car c'est donner corps à la balkanisation du web justement recherchée par des sociétés commerciales comme Microsoft. Je préfère coder conforme aux standards quitte à avantager les navigateurs les supportant correctement (tant que les autres ne sont pas pénalisés). -- CharlesNepote
Solution actuelle de WackoWiki R3
La solution retenue est la suivante :
- <textarea class="code" rows="15" readonly="readonly">
- (soit une zone de texte en lecture seule (readonly), d'une hauteur de 15 lignes)
- et
- .code { background: #FFFFFF; border: solid #888888 2px; font-family: "Courier New"; color: black; font-size: 10pt; width: 80%; padding: 3px; }
Avantages :
- n'affiche les ascenseurs que si nécessaire
- la souris "ne se perd pas dedans" (particulièrement énervant quand la molette ne permet pas de faire descendre ou remonter la page), l'ascenseur de cette fenêtre ne devient actif que si l'on clique dans la fenêtre de code : cela permet de faire défiler la page avec la molette et au besoin s'arrêter sur une fenêtre de code, uniquement si on le souhaite, et non pas avoir un "arrêt" systématique sur toute fenêtre de code (jusqu'à ce que l'ascenseur soit arrivé en bas de cette fenêtre de code).
- et surtout la fenêtre n'est pas trop longue [en hauteur ou en largeur ??? -- CharlesNepote]
--
BenoitAudouard 20031218
Inconvénients :
- la hauteur de la fenêtre est fixée en dur dans le code PHP (rows="15") ; il n'est pas possible de la modifier par la feuille de style
- il y a un bug avec ie6 pour les lignes trop larges, pas d'ascenseur horizontal : en plus l'ascenseur vertical devient actif du fait que la fenêtre est taillée pour 2 lignes alors qu'elle s'affiche sur 3 lignes... rien n'est parfait ! ce bug n'apparaît pas avec Galeon 1.3.6
Solution de WikiNi 0.1.1-0.3
Par comparaison,
WikiNi utilise le code suivant :
<div class="code"><code>xxxxxxxxxxxxxx</code></div>
et
.code { background: #FFFFFF; border: solid #888888 2px; font-family: 'Courier New', Courier; color: black; font-size: 10pt; width: 100%; height: 400px; overflow: scroll; padding: 3px; }
Avantages :
- la fenêtre est entièrement stylée par la CSS
Inconvénients :
- affiche des ascenseurs dans tous les cas
Discussions
Pour la solution de
WikiNi, l'enchainement des balises <div><code> n'est en effet pas très satisfaisant. La solution
WackoWiki, qui consiste à fixer la hauteur dans le code PHP, me semble moins intéressante. Il est peut-être possible de mixer les deux solutions.
--
CharlesNepote
[Concernant la solution de
WackoWiki] bon, il leur manque quand même une option noscroll pour afficher un cadre de la longueur du texte --
BenoitAudouard
Peut-être regarder la fonction include de
WikiNi ? --
BenoitAudouard
Identification de quelques utilisations
Afin de constituer les besoins "par l'exemple", voici quelques URL :
http://www.mirabellug.org/docs/docbook/x146.html sans aller jusqu'à ce niveau de détail pour
WikiNi, cette page présente deux besoins élégamment :
- des bouts de code (le titre devrait néanmoins être optionnel, un peu comme la légende des images dans WinWord? qui permet ensuite de constituer une table des illustrations)
- des listes de commande effectuées dans une console Unix : un %%(terminalX) pourrait répondre correctement à cette mise en forme
Deux exemples utilisant
WikiNi "brut de fonderie" :
http://eagle-usb.ath.cx/eagledev/wakka.php?wiki=LocalizationScriptsES la fenêtre de code apparaît comme une masse dans la page
http://eagle-usb.ath.cx/eagledev/wakka.php?wiki=LocalizationScriptsIt l'utilisation de la double-quote + <pre> permet l'affichage in-extenso du code, qui ne se distingue plus du reste de la page mais garde son indentation "mode terminal"
[root@localhost user] dhclient eth1 Internet Software Consortium DHCP Client V3.0pl2 Copyright 1995-2001 Internet Software Consortium. All rights reserved. For info, please visit http://www.isc.org/products/DHCP
Listening on LPF/eth1/xx :xx :xx :xx :xx :xx Sending on LPF/eth1/xx :xx :xx :xx :xx :xx Sending on Socket/fallback DHCPREQUEST on eth1 to 255.255.255.255 port 67 DHCPACK from 81.57.202.254 bound to yyy.yyy.yyy.yyy -- renewal in 256809 seconds. [root@localhost user] |
- Ca rend pas mal du tout !! Mais pour ma part j'éviterais les tables... Je viens de l'implémenter dans mon WikiNi de test en créant un fichier formatters/coloration_terminal.php contenant juste <div class="terminal"><pre><?php echo htmlentities($text); ?></pre></div> et en ajoutant une classe terminal (contenant juste la coloration inversée : .terminal { background: black; color: white; }) au fichier wakka.css ; on obtient bien le rendu voulu en encadrant son code par %%(terminal)...le texte en mode terminal...%%. Je ne suis pas certain que ce soit la meilleure façon d'implémenter cet affichage, mais c'est probablement le moins intrusif ! ;-) -- ProgFou
- ben voilà, je suis d'accord que les tables ça le fait pas (j'ai au moins compris ça), j'ai simplement des besoins fonctionnels supplémentaires et je suis une burne en css. donc je mets quoi % % (terminal) et ça le fait ? -- BenoitAudouard 20040108
- Ce n'est pas (encore) intégré dans la version actuelle de WikiNi, mais tu peux le faire si tu suis les instructions que je donne juste au dessus. Sinon tu peux toujours passer par un truc genre ""<div style="background: black; color: white;">...le texte en mode terminal...</div>"". -- ProgFou
- ouais enfin le "truc genre" c'est déjà ce que je fais aussi pour les tableaux ;-) une rubrique "je rajoute des styles avec du style" ça le ferait bien en fait. En outre, j'ai l'impression que l'ajouts de thèmes WikiNiThemeTech?, WikiNiThemeTabs? (à la WackoWiki), WikiniThemeJoli? ça va arriver à la mode pour éviter à chacun de se palucher un css auquel il ne comprend rien... (si vous voulez, je vous monte un phpBB2 sur wikini.net en 10mn : thèmes, international, tout ce qui me plaît bien en ce moment... voir http://baud123.free.fr/phpBB2 l'inscription marche même si les mails sont défaillants, merci Free !)
J'ai implémenté la solution suivante dans mon
WikiNi (0.4.1rc) :
dans le css :
.code { background: #FFFFFF; border: solid #888888 2px; font-family: 'Courier New', Courier; color: black; font-size: 10pt; padding: 3px; overflow: auto; height: auto; width: auto; max-height: 400px;}
dans wakka.php :
// $output = "<div class=\"code\">";
- $output .= $wiki->Format(trim($code), $formatter);
// $output .= "</div>";
et il faut ramener les
<div class="code"> et
</div> respectivement en début et fin des fichiers
code.php et
coloration_php.php sous
formatters.
Résultat : hauteur auto-adaptative avec un maximum donnés. Barre de scroll apparaissant au besoin.
commentaire ? --
JeanMorlet (
exemple ici supprimé pour le moment. --
JeanMorlet)
Le problème de cette solution, c'est qu'IE (au moins 5.0) affiche des fenêtres longues sans ascenseur. --
CharlesNepote
Solution 4
Je crois bien que j'ai trouvé la solution élégante 100% compatible avec Wikini et IE/Mozilla and co. :-). Au départ je pensais modifier le Php pour ajouter une classe lorsque le nombre de lignes du PRE atteint un nombre de lignes donné. Mais je me suis dit qu'il devait bien exister une magouille CSS pour faire cela : bingo ! Ca se trouve sur
http://www.svendtofte.com/code/max_width_in_ie/ et ça utilise une particularité CSS des IE. J'ai fait un petit test, il suffit de mettre ce code CSS pour le DIV de classe code :
div.code{
- border: 1px solid black;
- width: 100%;
- max-height: 400px;
- overflow: auto;
- height: expression(
- this.scrollHeight > 400? "400px" : "auto" );
}
Seuls les IE comprennent le
height, les autres l'ignorent. Les curieux n'auront qu'à aller voir comment ça marche sur le site cité plus haut. J'ai testé avec Firefox 1.0PR et les IE 5.x/6.0, y'a plus qu'à !
Et signalez si ça ne va pas comme attendu...
--
JmPhilippe - 08/11/2004
- Ça me parraît pas mal du tout ! Et rapide à intégrer en plus. CharlesNepoteASuivreEnPriorite, peux-tu vérifier avec MS-IE (j'utilise plus du tout, désolé) ? Moi je suis partant pour l'intégrer dès que possible. Je viens déjà de le mettre sur le site de mon boulo. -- ProgFou
- C'est que moi non plus je n'utilise plus IE (pas désolé ;-) ) mais j'ai quand même fait quelques tests sous Win2k avec 5.01 SP2, 5.5 SP2 et 6.0 SP1 parce qu'au boulot il n'y a qu'IE sur les machines bureautique. A ce que j'ai vu ça marche, il n'y a donc plus qu'à attendre d'autres résultats de tests. NB: je laisse tomber IE 4.01 vu qu'il n'est quasiment plus utilisé (< 0.5 % je crois), et de toute façon je n'ai aucun moyen de le tester -- JmPhilippe
Je viens de tester cette solution et elle marche plutôt bien. J'ai cependant dû ajouter dans ma feuille de style une modification concernant les pre, sinon il y a un espace avant (sous firefox) ou après (sous IE6) le bloc
<pre>...</pre> à l'intérieur du div à cause des marges...
Cependant il faudrait tout de même examiner s'il n'y a pas de meilleure solution. En effet ce n'est pas le
height qui pose problème (celui-ci étant
) mais l'utilisation de
expression. Le validateur me dit même que c'est la partie "
this.scrollHeight > 400? "400px" : "auto"" qui pose problème. Je viens de faire une recherche et il semblerait que
expression ait été introduit dans les feuilles de style avec IE5.0 sans aucun souci du respect des standards (peut-être se sont-ils dit que cela permettrait aux webmestres de contourner les nombreux bugs d'IE ?). Il est à noter que la solution est assez mauvaise en fait puisqu'elle provoque apparemment un calcul de la valeur à chaque fin d'exécution d'un thread JS. Plus de détails
ici où l'on propose entre-autres une solution qui évite ce recalcul, mais en contre partie provoque une importante utilisation du JS...
Personnellement je pense qu'il est préférable de conserver la validité w3c et d'éviter le JS, et tant pis si sous IE c'est une boite qui s'allonge indéfiniment avec le texte (cas où il n'y a pas de propriété
height) --
LordFarquaad
Pour moi cette solution n'est pas envisageable du fait 1. qu'elle ne respecte pas la norme CSS ; 2. qu'il s'agit d'une bidouille dont rien ne nous garanti la pérennité. --
CharlesNepote
Ce qui me gêne le plus, c'est que c'est du
JavaScript (certes déguisé), et donc ça ne marchera pas s'il est désactivé. De toute façon, il me semble qu'on n'a pas trop le choix côté navigateur : soit il supporte
max-height et ça roule tout seul, soit il faut ajouter un script qui remplace
max-height et donc il faut que l'utilisateur autorise les scripts et que le script ne s'exécute que quand il y en a besoin (donc un truc du genre solution 6 transféré en pur
JavaScript, peut-être équivalent à une solution 2 allégée ?). La seule autre possibilité que je vois serait que ce soit Php qui fasse un
max-height en insérant une classique propriété
height dans le Html suivant le nombre de lignes du code... --
JmPhilippe
Solution 5
Voici encore une solution qui provoque, sous IE6, des boites qui s'allongent mais sous Firefox et IE < 6 des boites dont la taille devrait dépendre du contenu (à vérifier pour IE < 6)
Les version d'IE < 6 (ainsi que, certains navigateurs comme opera5) ne vont pas lire correctioment le premier voice-family et croire que la classe s'arrête au niveau du "}". Dès lors il vont interpréter le .code qui suit (... et ça marchera sous IE5 uniquement) alors que les autres navigateurs vont considérer que cela fait partie de la chaine qui s'arrête à la fin de la ligne.
Tous les navigateurs sauf IE (toutes versions) vont interpréter le
div > .code et rétablir la valeur
auto de
height, du coup ils vont dimensionner à la taille du contenu jusqu'à
max-height.
C'est le seul moyen qe j'ai trouvé pour faire interprêter du css "
valide" uniquement pour IE tout en gardant la feuille de style valide. Consultez tout de même
why not use css hacks (le cas présent serait repris dans les
dead browsers puisqu'il ne concerne que les navigateurs ne supportant pas les guillemets échappés) et
why not use JS in css.
--
LordFarquaad
Je ne pense pas que le recalcul à chaque thread JS soit réellement un problème dans un Wiki qui en général ne repose pas sur du code JS. Personnellement je n'ai remarqué aucune différence avant et après du point de vue réactivité du navigateur (et mon PC a 3 ans...). --
JmPhilippe
Solution 6
Si la validation CSS de la solution 4 est vraiment un problème, on peut aussi le contourner avec un
commentaire conditionnel dans le Html :
<!-- Internet Explorer failures -->
<!--[if lt IE 7]>
<style type="text/css" media="screen" />
.code {
- height: expression(this.scrollHeight > 400? "400px" : "auto" );
}
</style>
<![endif]-->
L'inconvénient est que la dimension maxi pour les IE ne se trouve plus dans le fichier CSS mais dans l'entête Html, donc un fichier Php... A moins de créer une variable Php spécifique pour ce problème, qui gèrerait aussi le
max-height, mais ça commence à devenir plus compliqué.
NB: Effectivement les CSS standards n'autorisent pas à exécuter du JS à l'intérieur du CSS ! Déjà qu'une page web mêlant Html, CSS et JS ça devient complexe à déboguer, alors s'il y a du JS dans les CSS, des CSS dans le JS, du Html dans le JS et du Html dans le CSS !!! Il n'y a vraiment que MS pour y penser ! --
JmPhilippe
- La solution des commentaires conditionnels me parait être de loin la meilleure: non seulement elle reste valide en XHTML/CSS mais en plus elle corrige le problème du max-height pour IE. Cependant il faudrait plutôt que le commentaire vérifie que la version d'IE est inférieure à la dernière version connue n'acceptant pas le max-height (on peut espérer que dans IE 7 ou même un prochaine version 6.x ceci sera corrigé...).
- Par contre je ne vois pas pourquoi il est question de php là dedans :-S l'ActionHeader? pourrait très bien inclure ce bout de code, je vais d'ailleurs tester de ce pas sur un de mes wikis :-) -- LordFarquaad
- Autant pour moi, victime du bête copié collé ! C'est sûr il vaut mieux mettre un <!--[if lt IE 7]>. Pour le Php, je disais ça parce que les tags <style> doivent apparaître dans le tag <head>, mais il y a peut-être moyen d'écrire une action qui agisse dans l'entête Html ? (auquel il faudrait l'appliquer à d'autres actions comme ActionRecentChangesRSS pour ajouter un petit tag <link>) -- JmPhilippe
- Oui mais rien n'empêche de mettre le tag spécial IE dans toutes les pages, ce ne serait pas trop grave... Pour ce qui est des actions qui agissent dans l'entête, ce n'est actuellement pas possible, mais cela me paraîtrait assez intéressant (comme déjà dit dans JmPhilippePropositionsCSS) La question a des applications beaucoup plus larges et notemment un impact sur le fonctionnement du noyeau de WikiNi, il vaudrait mieux en discuter ailleurs... -- LordFarquaad