Texte dans une image : gestion manuelle du débordement (césure)

ViPHP
ViPHP | 2287 Messages

08 avr. 2008, 12:02

Bonjour,

Petite question sur laquelle, j'en suis sûr, certains d'entre vous ont déjà buté ;-)

Dans un de mes sites, j'ai besoin de générer en PHP (avec GD) une image contenant un texte variable issu d'une base de données. Ce texte fait entre 1 et 10 mots et entre 8 et 200 caractères, tout en majuscules.

L'image que je dois générer doit être de dimension fixe pour toutes ces "vignettes". La police utilisée est une police à chasse non-fixe (Arial).

Mon problème se situe au niveau de la gestion du débordement de texte. Le texte pouvant être bien plus grand que la limite autorisée par l'image qui va le contenir, je dois le fractionner (insérer des retours à la ligne) pour avoir un rendu propre et éviter que le texte n'aille déborder hors de l'image. L'image me permet d'afficher le texte sur 4 lignes maxi.

Je ne peux pas me baser uniquement sur le nombre de caractères car un "i" est bien moins large qu'un "m". Je ne peux pas non plus me baser uniquement sur le nombre de mots car leur longueur est assez variable (de 1 à 15 caractères par mot pour vous donner une idée).

Je cherche donc une façon de gérer proprement l'introduction de ces césures ( \n ) dans mon texte. (Evidemment, j'ai déjà un bout de code dégueulasse basé sur des constantes arbitraires qui marche pas trop mal dans 70% des cas, mais je n'arrive pas à penser une façon propre et générique de traiter le problème)

Avez-vous des expériences sur le sujet ? :)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
ViPHP | 4674 Messages

08 avr. 2008, 12:07

Hey,

c'est un problème que je me suis également posé mais je n'ai pas trouvé de réponses à l'époque. Comme c'était un projet annexe de l'annexe de l'annexe, je n'ai pas approfondis.
Tu peux déjà regarder comment appliquer les règles de césures (regarde en Latex, c'est très documenté). Bien évidemment, ça diffère selon les langues, et c'est le point gênant, mais une bonne base de données est c'est réglé.

En revanche, il te reste à connaître la position de ta lettre dans l'image, et ça, c'est pas gagné :?. Mais pourquoi utiliser Arial (qu'on a trop vu ...) ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 2287 Messages

08 avr. 2008, 12:13

En revanche, il te reste à connaître la position de ta lettre dans l'image, et ça, c'est pas gagné :?. Mais pourquoi utiliser Arial (qu'on a trop vu ...) ?
Ici le problème de langue ne se posera pas, heureusement. On reste sur du script occidental :-)

Pour l'Arial, c'est par cohérence avec le reste de l'interface du site, et aussi parcequ'elle rend bien en petite taille.

Pour info, voici un exemple de ce que je produis (ici y'a un seul mot, donc pas de souci de césure) :

Image
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
ViPHP | 5924 Messages

08 avr. 2008, 14:42

Du monospace :P :mrgreen:

ViPHP
ViPHP | 2287 Messages

08 avr. 2008, 15:12

Du monospace :P :mrgreen:
Gros vilain. Pour la peine tu me referas cette image from scratch avec mspaint :twisted:
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
ViPHP | 4674 Messages

08 avr. 2008, 15:42

Sur Mac ça risque d'être compliqué.

Blague à part, essaye de connaître la position d'une caractère.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 2287 Messages

08 avr. 2008, 15:50

Blague à part, essaye de connaître la position d'une caractère.
Pour cela, si je comprends bien, j'aurai besoin de dresser un tableau de correspondance entre le caractère et la largeur en pixels qu'il occupe. Ce qui serait assez court puisque les seuls caractères que j'exploite sont les 26 lettres capitales, les 10 chiffres, l'espace et quelques caractères de ponctuation.

Mais dois-je vraiment faire cela moi-même ? Est-ce que ce tableau n'a pas déjà été fait par quelqu'un d'autre ?
if(!@work()){ Nespresso(); } else { what(); }
______________________________