2009-10-30 11 views
4

J'ai besoin d'une représentation en texte brut d'un fichier HTML arbitraire (par exemple, un billet de blog). Jusqu'à présent, ce n'est pas un problème, il existe des dizaines de convertisseurs HTML en txt. Toutefois, le texte dans les paragraphes (lire "p éléments") doit être justifié dans la vue de texte brut (à un certain nombre de colonnes) et, si possible, coupés pour donner un meilleur résultat lisible. En outre, le fichier texte résultant doit être UTF-8 ou UTF-16.Texte brut justifié à partir du code HTML

Simple conversation de texte simple que je peux faire avec XSLT, c'est presque trivial. Mais la justification du texte est au-delà de ses possibilités (pas tout à fait vrai, car XSLT est complet à Turing, mais assez proche de la réalité).

FOP et XSL-FO ne fonctionnent pas non plus. Ils font comme demandé, mais la production de texte brut de la FOP est horrible (les développeurs disent, qu'il n'est pas destiné à un tel usage).

J'ai également expérimenté avec HTML -> XSLT -> Roff, mais je suis bloqué avec groff et son support Unicode est loin d'être optimal. Comme il y a des caractères comme des ellipses ("...") et des marques de quota typographiquement correctes, il est assez compliqué de dire à groff dans la feuille de style XSLT les séquences d'échappement pour des dizaines de caractères Unicode.

Une autre façon pourrait être la conversion en TeX et la sortie en texte brut, mais je n'ai jamais essayé cela auparavant avec (La) TeX. Peut-être que j'ai manqué quelque chose de vraiment simple. Quelqu'un at-il une idée, comment je pourrais réaliser ce qui précède? A propos: Une solution devrait de préférence fonctionner sans droits root pour installer, avec PHP, Python, Perl, XSLT ou n'importe quel programme trouvé dans une distribution Linux semi-décente.

Répondre

4

Essayez Python. Utilisez BeautifulSoup pour analyser le code HTML. Le textwrap module vous permettra de formater le texte.

Deux fonctions manquent cependant. Pour justifier le texte, vous devez ajouter des espaces à chaque ligne, mais cela ne devrait pas être un gros problème (voir this code example).

Pour la césure, essayez this project.

+0

Il est un peu BYO, mais, oui, avec un peu de logique mis en œuvre entre TextWrap et césures cela pourrait fonctionner. J'aime l'approche pure de Python. – Boldewyn

0

Links ou lynx peut valoir la peine d'essayer, voir le commutateur -dump. La partie d'encodage que vous pouvez ensuite résoudre séparément en utilisant iconv ou quelque chose de similaire.

+0

Lynx ne fait pas de justification, n'est-ce pas? Pour autant que je sache, il ignore complètement CSS (qui est peu utile pour les navigateurs de terminaux). Donc, il s'agit simplement de convertir du HTML en texte, ce qui est plutôt simple avec d'autres méthodes. Pardon. – Boldewyn

+0

Et avez-vous essayé certaines des variantes de liens? Ceux-ci sont beaucoup mieux au formatage, certains d'entre eux pourraient aussi bien justifier la justification. – zoul

+0

Peut-être que j'ai raté quelque chose, mais je n'ai trouvé ni Lynx ni Links ni Elinks ni Links-hacked ni W3m faisant la justification ou même la césure. – Boldewyn

2

Si vous êtes familier avec Emacs, vous pouvez ouvrir le fichier HTML dans Emacs-W3M (à savoir M-x w3m-find-file foo.html), enregistrez la page rendu sous forme de fichier texte brut, puis appeler M-x set-justification-full là-dessus.

Vous pouvez même écrire une petite fonction pour faire le travail:

(defun my-html-to-justifed-text (html-file text-file) 
    "Convert HTML-FILE to plain TEXT-FILE." 
    (find-file html-file) 
    (w3m-rendering-buffer) 
    (set-justification-full (point-min) (point-max)) 
    (write-file text-file)) 

(my-html-to-justifed-text "~/tmp/2.html" "~/tmp/2.txt") 
+0

C'est sympa aussi, et j'aime une solution Lisp ... J'accepte la réponse d'AAron, car il inclut aussi la partie trait d'union, mais merci d'avoir montré ce qu'Emacs pouvait faire. – Boldewyn