Mise à jour: gérer cela dans CSS est merveilleusement simple et peu coûteux, mais vous n'avez aucun contrôle sur l'endroit où les pauses se produisent lorsqu'elles se produisent. C'est bien si vous ne vous en souciez pas, ou si vos données ont de longues séries alphanumériques sans interruption naturelle. Nous avions beaucoup de longs chemins de fichiers, d'URL et de numéros de téléphone, qui ont tous des endroits où il est nettement préférable de casser que d'autres.
Notre solution était d'utiliser d'abord un remplacement de regex pour mettre un espace de largeur nulle (& # 8203;) après chaque 15 (disons) caractères qui ne sont pas des espaces ou l'un des caractères spéciaux où nous préférerions les pauses. Nous faisons ensuite un autre remplacement pour mettre un espace de largeur nulle après ces caractères spéciaux.
Les espaces de largeur nulle sont agréables, car ils ne sont jamais visibles à l'écran; les tirets timides étaient déroutants lorsqu'ils se montraient, car les données comportent des tirets importants. Les espaces de largeur nulle ne sont pas non plus inclus lorsque vous copiez du texte hors du navigateur.
Les caractères de coupure spéciaux que nous utilisons actuellement sont le point, la barre oblique, la barre oblique inverse, la virgule, le trait de soulignement, @, | et le trait d'union. Vous ne penseriez pas que vous auriez besoin de faire quoi que ce soit pour encourager la rupture après les traits d'union, mais Firefox (3.6 et 4 au moins) ne se casse pas tout seul aux traits d'union entourés de chiffres (comme les numéros de téléphone).
Nous voulions également contrôler le nombre de caractères entre les pauses artificielles, en fonction de l'espace de disposition disponible. Cela signifiait que l'expression régulière pour correspondre à de longues exécutions insécables devait être dynamique. Cela est souvent appelé, et nous ne voulions pas créer les mêmes regex identiques encore et encore pour des raisons de performances, nous avons donc utilisé un simple cache regex, codé par l'expression regex et ses indicateurs.
Voici le code; vous auriez probablement nommé les fonctions dans un package utilitaire
makeWrappable = function(str, position)
{
if (!str)
return '';
position = position || 15; // default to breaking after 15 chars
// matches every requested number of chars that's not whitespace or one of the special chars defined below
var longRunsRegex = cachedRegex('([^\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^\\s\\.\/\\,_@\\|-])', 'g');
return str
.replace(longRunsRegex, '$1​') // put a zero-width space every requested number of chars that's not whitespace or a special char
.replace(makeWrappable.SPECIAL_CHARS_REGEX, '$1​'); // and one after special chars we want to allow breaking after
};
makeWrappable.SPECIAL_CHARS_REGEX = /([\.\/\\,_@\|-])/g; // period, forward slash, backslash, comma, underscore, @, |, hyphen
cachedRegex = function(reString, reFlags)
{
var key = reString + (reFlags ? ':::' + reFlags : '');
if (!cachedRegex.cache[key])
cachedRegex.cache[key] = new RegExp(reString, reFlags);
return cachedRegex.cache[key];
};
cachedRegex.cache = {};
Testez comme ceci:
makeWrappable('12345678901234567890 12345678901234567890 1234567890/1234567890')
Mise à jour 2: Il semble que les espaces en fait zéro largeur sont inclus dans le texte copié dans au moins certaines circonstances, vous ne pouvez pas les voir. Évidemment, encourager les gens à copier du texte avec des caractères cachés est une invitation à avoir des données comme celles entrées dans d'autres programmes ou systèmes, même le vôtre, où cela peut causer des problèmes. Par exemple, s'il se retrouve dans une base de données, les recherches sur celui-ci peuvent échouer, et des chaînes de recherche comme celle-ci risquent également d'échouer. L'utilisation des touches fléchées pour parcourir des données comme celle-ci nécessite (à juste titre) une pression supplémentaire sur une touche pour se déplacer sur le caractère que vous ne pouvez pas voir, quelque peu bizarre pour les utilisateurs s'ils le remarquent.
Dans un système fermé, vous pouvez filtrer ce caractère en entrée pour vous protéger, mais cela n'aide pas les autres programmes et systèmes.
Tout compte fait, cette technique fonctionne bien, mais je ne suis pas sûr du meilleur choix de personnage provoquant une rupture.
Mise à jour 3: Faire en sorte que ce personnage se retrouve dans les données n'est plus une possibilité théorique, c'est un problème observé. Les utilisateurs soumettent des données copiées hors de l'écran, elles sont enregistrées dans la base de données, les recherches interrompent, les choses trient bizarrement, etc.
Nous avons fait deux choses:
- Écrit un utilitaire pour les supprimer de toutes les colonnes de toutes les tables de toutes les sources de données pour cette application.
- Ajout d'un filtrage pour le supprimer de notre processeur d'entrée de chaîne standard, il a donc disparu au moment où le code le voit.
Cela fonctionne bien, tout comme la technique elle-même, mais c'est un récit édifiant.
Mise à jour 4: Nous l'utilisons dans un contexte où les données qui y sont transmises peuvent être échappées HTML. Dans les bonnes circonstances, il peut insérer des espaces de largeur nulle au milieu d'entités HTML, avec des résultats funky.
Le correctif consistait à ajouter une esperluette à la liste des caractères sur lesquels nous ne cassons pas, comme ceci:
var longRunsRegex = cachedRegex('([^&\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^&\\s\\.\/\\,_@\\|-])', 'g');