Affichage de texte avec une font custom

VaN
Mammouth du PHP | 1107 Messages

18 déc. 2009, 21:16

Bonsoir,

je travaille sur un projet de lettrage : l'utilisateur écrit un texte, définie des options (couleur, taille, police), et cela met à jour en temps réel un bloc de prévisualisation.

Le problème est que mon client souhaite proposer des polices non-standard. Est-il possible d'afficher le texte de prévisualisation avec cette police custom, même si l'utilisateur ne la possède pas sur son ordinateur. C'était à priori impossible il y a quelques années, mais peut-être que ça l'est maintenant, je ne sais pas.

Je viens de voir que WEFT (Web Embedding Fonts Tool) était capable de le faire, mais il ne fonctionne que pour IE.

Existe il une façon de faire qui fonctionne pour tous les navigateurs ?

(Au pire, je peux toujours générer une image de prévisualisation, mais c'est vraiment la dernière solution que j'envisage, vu que la prévisualisation se fait à la volée en temps réel dès qu'on modifie une option (taille, couleur, police, + d'autres options) ).

ViPHP
ViPHP | 3607 Messages

19 déc. 2009, 18:35


VaN
Mammouth du PHP | 1107 Messages

21 déc. 2009, 17:54

Me revoilà.

D'abord, merci beaucoup jojolapine, je vient d'opter pour cufon, et ça marche plutôt pas mal.

Mais je rencontre un petit problème. J'ai actuellement 3 polices custom proposées sur mon application. Je charge donc les 3 scripts Cufon correspondants :
<!-- SCRIPTS CUFON -->
<script language="javascript" type="text/javascript" src="http://127.0.0.1/Projects/2009-11 - Formatic Evolution/site/common/tools/Balloon_Extra_400.font.js"></script>
<script language="javascript" type="text/javascript" src="http://127.0.0.1/Projects/2009-11 - Formatic Evolution/site/common/tools/Bookman_Old_Style_300-Bookman_Old_Style_600-Bookman_Old_Style_italic_300-Bookman_Old_Style_italic_600.font.js"></script>
<script language="javascript" type="text/javascript" src="http://127.0.0.1/Projects/2009-11 - Formatic Evolution/site/common/tools/French_Script_MT_400.font.js"></script>
<!-- SCRIPTS CUFON END -->
Le problème, c'est que ces 3 scripts contiennent tous les 3 la même fonction :

Code : Tout sélectionner

Cufon.registerFont({"w":226,"face":{"font-family":"Balloon Extra","font-weight":400,"font-stretch":"normal","uni

Code : Tout sélectionner

Cufon.registerFont({"w":131,"face":{"font-family":"French Script MT","font-weight":400,"font-stretch":"normal","units-p
Du coup, seule la dernière fonction est prise en compte, et c'est cette police qui est utilisée, peu importe celle que je choisis.

Je vois 2 solutions :
- rendre cette fonction dépendante d'une variable, qui serait la police que je souhaite utiliser à l'instant T.
- à chaque fois que je dois mettre mon texte de prévisualisation à jour, charger dynamiquement le script Cufon correspondant, et "décharger" le précédent. Est-ce possible ?

Quelle solution semble la meilleure ? A priori la première, mais je ne sais pas du tout comment m'y prendre.

Le fichier Cufon général (seulement la partie qui semble intéressante) :

Code : Tout sélectionner

api.registerFont = function(data) { var font = new Font(data), family = font.family; if (!fonts[family]) fonts[family] = new FontFamily(); fonts[family].add(font); return api.set('fontFamily', '"' + family + '"'); }; api.replace = function(elements, options, ignoreHistory) { options = merge(defaultOptions, options); if (!options.engine) return api; // there's no browser support so we'll just stop here if (!initialized) { CSS.addClass(DOM.root(), 'cufon-active cufon-loading'); CSS.ready(function() { // fires before any replace() calls, but it doesn't really matter CSS.removeClass(DOM.root(), 'cufon-loading'); }); initialized = true; } if (options.hover) options.forceHitArea = true; if (typeof options.textShadow == 'string') options.textShadow = CSS.textShadow(options.textShadow); if (typeof options.color == 'string' && /^-/.test(options.color)) options.textGradient = CSS.gradient(options.color); if (!ignoreHistory) replaceHistory.add(elements, arguments); if (elements.nodeType || typeof elements == 'string') elements = [ elements ]; CSS.ready(function() { for (var i = 0, l = elements.length; i < l; ++i) { var el = elements[i]; if (typeof el == 'string') api.replace(options.selector(el), options, true); else replaceElement(el, options); } }); return api; }; api.set = function(option, value) { defaultOptions[option] = value; return api; };
Un des scripts Cufon de police :

Code : Tout sélectionner

/*! * The following copyright notice may not be removed under any circumstances. * * Copyright: */ Cufon.registerFont({"w":226,"face":{"font-family":"Balloon Extra","font-weight":400,"font-stretch":"normal", ... }});
et l'appel JS, au moment ou je change de police :

Code : Tout sélectionner

Cufon.replace('#preview');
Toute aide est la bienvenue : )

ViPHP
ViPHP | 3607 Messages

21 déc. 2009, 19:28

Bon, j'ai pas lu tout ce que t'avais écrit, mais voici comment moi je procède:
<!-- Inclusion de cufon -->
<script type="text/javascript" charset="utf-8" src="Js/cufon-yui.js"></script>
<!-- Inclusion des fichiers de fonts -->
<script type="text/javascript" charset="utf-8" src="Js/Quimbie_Shaddow_400.font.js"></script>
<script type="text/javascript" charset="utf-8" src="Js/Quimbie_3D_400.font.js"></script>
<!--  Inclusion de Jquery -->
<script type="text/javascript" charset="utf-8" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
<!-- et de son plugin Fontavailable -->
<script type="text/javascript" charset="utf-8" src="Js/jquery.fontavailable.js"></script>
<script type="text/javascript">

Cufon.DOM.ready(function() {
    // test de disponibilité des polices (associés au css suivant:
    //    @font-face { font-family : 'Quimbie_Shaddow';
    //    src: url(../Fonts/Quimbie_Shaddow.ttf) format('truetype'); }
    if(!$.fontAvailable('Quimbie_Shaddow')) {
        Cufon.replace($('#grostitre a'), { fontFamily: 'Quimbie_Shaddow' });
    }
    //Idem
    if(!$.fontAvailable('Quimbie_3D')) {
        Cufon.replace($('#soustitre'), { fontFamily: 'Quimbie_3D' });
    }
});
</script>


<!-- Fin de page html -->
<!-- Cufon pour IE -->
<script type="text/javascript">
Cufon.now();
</script>
<!-- Fin Cufon pour IE -->
Et celà fonctionne pour faire marcher plusieurs polices simultanément!
Je te laisse revoir ta copie ;)

VaN
Mammouth du PHP | 1107 Messages

21 déc. 2009, 21:55

Nickel, j'ai réussi à faire fonctionner mon script. C'était à priori un problème de nom de police. Dans le CSS, une de mes polices s'appelait Balloon, alors que son nom dans le fichier cufon était "Ballon Extra". (et son nom de fichier est BALLOON1.TTF).

le nom réel de la police est à priori "Balloon Extra". J'aimerai donc récupérer cette valeur là de manière automatique au moment de l'upload de la police via l'interface admin, plutôt que de laisser l'utilisateur remplir un champs texte.

Je viens de remarquer que le fichier que génère le site Cufon contient le nom de la police réelle : Balloon_Extra_400.font.js
Ce nom est également présent dans le fichier :

Code : Tout sélectionner

Cufon.registerFont({"w":226,"face":{"font-family":"Balloon Extra"
Est-ce sans faille ? Je peux récupérer par exemple le début du nom du fichier (jusqu'à l'apparition de 3 chiffres dans le nom de fichier par exemple), remplacer les underscores par des espaces, et au final, être sûr que j'ai le nom réel de la police ?