Outils pour utilisateurs

Outils du site


conv_txt_html

Conversion entre des chaines 'normales' et des chaines 'html'

Objectif

A l'origine du html, les navigateurs ne comprenaient que l'ASCII pur. Il a donc fallu trouver un moyen de représenter les caractères accentués et spéciaux. Par exemple, “sacré” devient “sacré”.

Voilà donc 2 fonctions qui font les conversions dans les 2 sens

Codage proposé

#! /usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import division
# Python v2.7
 
from htmlentitydefs import codepoint2name, name2codepoint
import re
 
#############################################################################
def txt2html(txt, esp=False):
    """convertit la chaine normale 'txt' (unicode) en chaine html (ISO-8859-1)
       si esp=True, convertit en plus tous les espaces normaux => " "
    """
    if esp:
        e = " "
    html = []
    for c in txt:
        n = ord(c)
        if n in codepoint2name:
            html.append("&%s;" % (codepoint2name[n],))
        elif esp and c == u" ":
            html.append(e)
        else:
            html.append(c)
    return ''.join(html)
 
#############################################################################
def html2txt(html, esp=False):
    """convertit la chaine html 'html' (ISO-8859-1) en chaine normale (unicode)
       si esp=True, convertit en plus tous les " " => espaces normaux
    """
    if esp:
       html = re.sub(" ", u" ", html)
    motif = '&(%s);' % ('|'.join(name2codepoint))
    rempl = lambda m: unichr(name2codepoint[m.group(1)])
    return re.sub(motif, rempl, html)

Exemple d'utilisation:

    txt = u"""Voilà une phrase accentuée qui vaut « 1€ ». Complément: "éèçàùôîëä" """
    print(txt)
 
    html = txt2html(txt)
    print(html)
 
    txt = html2txt(html)
    print txt

Ce qui affiche:

Voilà une phrase accentuée qui vaut « 1€ ». Complément: "éèçàùôîëä" 

Voilà une phrase accentuée qui vaut « 1€ ». Complément: "éèçàùôîëä" 

Voilà une phrase accentuée qui vaut « 1€ ». Complément: "éèçàùôîëä" 

J'ai, bien entendu, vérifié dans un éditeur html que la phrase en html est bien compris par les navigateurs.

Petit complément concernant les espaces: en principe, seul l'espace insécable (160) est convertit en “ ”, mais pas l'espace normal (32). Au cas où, j'ai ajouté un drapeau 'esp' qui permet de convertir en plus les espaces normaux en “ ” dans les 2 sens.

Avec ce drapeau à True, la chaine html devient:

Voilà une phrase accentuée qui vaut « 1€ ». Complément: "éèçàùôîëä"

Et on retrouve avec la conversion dans l'autre sens la même chaine de départ, à part que les éventuels espaces insécables sont devenus des espaces normaux.

On devrait pouvoir accélérer ces 2 fonctions (compréhension de liste, compilation de motif, etc…) mais écrites comme ça, on comprend bien ce qu'elles font.


Amusez-vous bien!

conv_txt_html.txt · Dernière modification: 2011/01/14 09:49 de tyrtamos

Outils de la page