OVH Cloud OVH Cloud

MML sans multi-part

78 réponses
Avatar
drkm
Bonsoir

Certains se souviennent peut-être d'une discussion d'il y a
quelques mois, concernant MML. Ce package de Gnus permet
d'ajouter des parties dans un certain type à un message, juste en
utilisant 'C-c <RET> p' dans un buffer en Message Mode.

Cette partie du message, à la lecture, est alors font lockée en
fonction du type. Par exemple selon le mode Emacs Lisp pour les
partie de type "application/emacs-lisp", etc.

Ce qui apparaissait comme une fonctionalité intéressante s'est
révélé inutilisable, car Gnus génère alors un article en
multi-part, illisible par certains, en particulier Google Groups.

Je viens d'écrire un petit package utilisant la même idée, mais
ne générant pas de multi-part. Il laisse les balises telles
quelles à l'envoit, et les décode à la lecture.

Si l'on utilise le package à la lecture, on se retrouve alors
bien avec des parties de texte font lockées selon le type, sinon
on voit simplement les balises. C'est ÀMHA un bon compromis.

Voici par exemple des screenshots de Gnus montrant un tel
article font locké pour l'un, et raw pour l'autre :

<URL:http://drkm-lib.sf.net/tmp/mml-with.png>
<URL:http://drkm-lib.sf.net/tmp/mml-without.png>

Que pensez-vous du principe ? Le fichier, sur le CVS du
projet, contient les infos nécessaires à l'utilisation.

Je suis bien sûr ouvert à toute remarque, suggestion, ou
critique.

--drkm

10 réponses

4 5 6 7 8
Avatar
drkm
Bastien writes:

Pourquoi pas

<example language="lisp">
(defun somehow ()
"Something"
(nil))
</example>

<example language=="php">
...
</example>



C'est ce à quoi j'avais d'abord pensé, et ce qui est
effectivement implémenté tant qu'à présent. Je te renvois à la
discussion de juillet (celle que Sébastien a rouvert) pour les
détails des arguments pour et contre.

--drkm
Avatar
Bastien
drkm writes:

<example language=="php">
...
</example>



C'est ce à quoi j'avais d'abord pensé, et ce qui est
effectivement implémenté tant qu'à présent. Je te renvois à la
discussion de juillet (celle que Sébastien a rouvert) pour les
détails des arguments pour et contre.



Ok, tout lu, merci. Mon cerveau a aussi intercepté les remarques de
Mathieu et le #v+/#v-.

--
Bastien
Avatar
drkm
drkm writes:

ecrit par ... moi-meme. Il me reste encore trois jours pour tenir
promesse :-)



J'ai écrit un petit quelque chose, vite fait-bien fait :
<URL:http://www.fgeorges.org/tmp/drkm-mml.el>. Pour l'installer,
le placer dans un répertoire du 'load-path', et :

(autoload 'drkm-mml:decode-parts "drkm-mml")
(add-hook 'gnus-part-display-hook 'drkm-mml:decode-parts)

Pour ajouter des groupes par regexp :

(push '("group-re" (drkm-mml:default-mode . the-mode))
gnus-parameters)

et par chaîne :

(eval-after-load "drkm-mml"
'(push '("group" . the-mode) drkm-mml:part-group-mode-alist))

Les valeurs par défaut de cette alist sont :

fr.comp.applications.emacs -> emacs-lisp-mode
fr.comp.text.xml -> nxml-mode

Ça semble fonctionner avec le premier, mais pas le second. Je
ne sais pas si c'est dû à la manière de nXML de gérer le font
locking, ou à ma config de celui-ci.

Les parties à font locker sont simplement identifiées par une
ligne blanche, une ou plusieurs lignes commençant par 4 espaces,
et une ligne blanche. Par ligne blanche, j'entends ligne
exactement vide (un 'n' en 1ère colonne).

N'hésitez pas à le tester, et à me communiquer vos avis.
Notamment comment étendre la manière de repérer les blocs à font
locker, ou comment identifier le mode à utiliser. Pour l'instant
donc, le mode dépend directement et uniquement du groupe que l'on
est en train de lire. Il y aurait moyen aussi d'écrire une
fonction que l'on renseigne à la place d'un mode, et qui active
le bon mode en fonction du contenu du bloc.

J'attend vos réactions,

--drkm
Avatar
Sébastien Kirche
Le 30 octobre 2005 à 19:10, drkm a dit :

N'hésitez pas à le tester, et à me communiquer vos avis.



Ben :
Debugger entered--Lisp error: (void-function nil)
nil()
funcall(nil)
(let ((font-lock-mode t)) (funcall mode))
(save-current-buffer (set-buffer temp-buffer) (insert text) (require (quote font-lock)) (let (...) (funcall mode)) (let (...) (font-lock-fontify-buffer)) (setq text (buffer-string)))
(with-current-buffer temp-buffer (insert text) (require (quote font-lock)) (let (...) (funcall mode)) (let (...) (font-lock-fontify-buffer)) (setq text (buffer-string)))
(unwind-protect (with-current-buffer temp-buffer (insert text) (require ...) (let ... ...) (let ... ...) (setq text ...)) (and (buffer-name temp-buffer) (kill-buffer temp-buffer)))
(let ((temp-buffer ...)) (unwind-protect (with-current-buffer temp-buffer ... ... ... ... ...) (and ... ...)))
(with-temp-buffer (insert text) (require (quote font-lock)) (let (...) (funcall mode)) (let (...) (font-lock-fontify-buffer)) (setq text (buffer-string)))
(let ((mode ...) (text ...)) (delete-region start end) (with-temp-buffer (insert text) (require ...) (let ... ...) (let ... ...) (setq text ...)) (goto-char start) (insert text))
drkm-mml:display-region(1497 1608)
(progn (drkm-mml:display-region start (point)))
(if (/= start (point)) (progn (drkm-mml:display-region start ...)))
(when (/= start (point)) (drkm-mml:display-region start (point)))
(let ((start ...)) (while (looking-at drkm-mml::part-indent-re) (next-line)) (when (/= start ...) (drkm-mml:display-region start ...)))
(while (not (eobp)) (search-forward-regexp "^$") (forward-char) (let (...) (while ... ...) (when ... ...)))
(condition-case nil (while (not ...) (search-forward-regexp "^$") (forward-char) (let ... ... ...)) (end-of-buffer nil))
(save-excursion (goto-char (point-min)) (condition-case nil (while ... ... ... ...) (end-of-buffer nil)))
drkm-mml:decode-parts()
run-hooks(gnus-part-display-hook)
apply(run-hooks gnus-part-display-hook)
gnus-run-hooks(gnus-part-display-hook)
gnus-treat-article(nil 1 1)
gnus-display-mime()
gnus-article-prepare-display()
gnus-article-prepare(3836 nil)
gnus-summary-display-article(3836 nil)
gnus-summary-select-article(nil nil pseudo)
gnus-summary-scroll-up(1)
call-interactively(gnus-summary-scroll-up)

Apparemment drkm-mml:get-mode retourne nil, mais je n'arrive plus à ma
servir de ce #@$© de débogueur pour tracer une fonction lorsqu'elle est
appelée :o(

--
Sébastien Kirche
Avatar
drkm
Sébastien Kirche writes:

Le 30 octobre 2005 à 19:10, drkm a dit :

N'hésitez pas à le tester, et à me communiquer vos avis.



Ben :
Debugger entered--Lisp error: (void-function nil)
nil()
funcall(nil)
(let ((font-lock-mode t)) (funcall mode))



Oops, évidemment. Fixé (toujours à la même adresse).

Merci pour le retour,

--drkm
Avatar
Sébastien Kirche
Le 31 octobre 2005 à 01:10, drkm a formulé :

Oops, évidemment. Fixé (toujours à la même adresse).



Bon, ça ne plante plus, mais je ne vois pas de différence avec un
message non traité.

J'ai rajouté ceci au .gnus :
(when (require 'drkm-mml nil t)
(autoload 'drkm-mml:decode-parts "drkm-mml")
(add-hook 'gnus-part-display-hook 'drkm-mml:decode-parts))

Sachant que je suis sur fcae qui doit être traité par défaut...

J'ai oublié quoi ?

Merci pour le retour,



Merci pour la correction :oP

--
Sébastien Kirche
Avatar
Sébastien Kirche
Le 31 octobre 2005 à 02:10, drkm s'est exprimé ainsi :

Sébastien Kirche wrote:

> J'ai rajouté ceci au .gnus :
> (when (require 'drkm-mml nil t)
> (autoload 'drkm-mml:decode-parts "drkm-mml")
> (add-hook 'gnus-part-display-hook 'drkm-mml:decode-parts))

Il ne sert a rien d'utiliser 'autoload' avec 'require' (le but
d''autoload' est justement d'eviter un 'require', et de deferer le
chargement a la premiere utilisation).



Argl. Je me suis fais enduire d'erreur par le commentaire en début de
drkm-mml.el qui parle de générer l'autoload ou d'utiliser un require.
J'ai mis le require car je n'ai pas encore installé cedet sur ce
système.

Es-tu sur que 'drkm-mml.el' est dans ton 'load-path' ?



(locate-library "drkm-mml") -> /Users/seki/.elisp/drkm-mml.el
C'est bien dans mon load-path, j'y ai d'autres modules qui s'y trouvent
et qui fonctionnent comme filladapt.

Mais ça plantait avec l'autre version, puisque ça ne plante plus c'est
bien que j'ai remplacé la lib.

Il ne doit y avoir d'effet egalement que sur des blocs de code
precedes et suivis d'une ligne vide, et indente d'un moins 4 espaces,
comme celui-ci :

(autoload 'drkm-mml:decode-parts "drkm-mml")
;; Je ne suis pas sur que l''eval-after-load' soit
;; necessaire pour un hook.
(eval-after-load "gnus-art"
'(add-hook 'gnus-part-display-hook 'drkm-mml:decode-parts))

Tu ne vois rien ? Les deux chaines de caracteres devraient etre dans
une face differente, tout comme 'eval-after-load' dans la face des
mots-clefs. Et le commentaire, evidemment.



Non, le code n'est pas fontifié. Et je n'ai pas d'autre idée pour le
moment.

Ah si un truc bizarre :
,----
| drkm-mml:decode-parts is a Lisp function in `drkm-mml.e'.
^^^
Ici : bizarre ce nom de fichier, non ? j'ai vérifié qu'il n'existe pas
sur mon disque.

| (drkm-mml:decode-parts)
|
| Decode the parts in the article, and font lock them.
| [...]
`----

C'est tout pour le moment, avec le changement d'heure il est trop tard
pour que j'arrive encore à réfléchir...

--
Sébastien Kirche
Avatar
Romain Francoise
Sébastien Kirche writes:

,----
| drkm-mml:decode-parts is a Lisp function in `drkm-mml.e'.
^^^
Ici : bizarre ce nom de fichier, non ? j'ai vérifié qu'il n'existe pas
sur mon disque.



C'est un bug dans Emacs (déjà corrigé), le fichier s'appelle drkm-mml.el.

--
Romain Francoise | The sea! the sea! the open
it's a miracle -- http://orebokech.com/ | sea! The blue, the fresh, the
| ever free! --Bryan W. Procter
Avatar
Sébastien Kirche
Le 31 octobre 2005 à 07:10, Romain Francoise vraute :

Sébastien Kirche writes:

> ,----
> > drkm-mml:decode-parts is a Lisp function in `drkm-mml.e'.
> ^^^ Ici : bizarre ce nom de fichier, non ? j'ai vérifié qu'il
> n'existe pas sur mon disque.

C'est un bug dans Emacs (déjà corrigé),



Fort bien. C'était juste au niveau de l'affichage du nom, ou ça touchait
aussi le fonctionnement ?

le fichier s'appelle drkm-mml.el.



Oui, je l'ai copié moi-même.

--
Sébastien Kirche
Avatar
Romain Francoise
Sébastien Kirche writes:

Fort bien. C'était juste au niveau de l'affichage du nom, ou ça
touchait aussi le fonctionnement ?



Juste l'affichage.

--
Romain Francoise | The sea! the sea! the open
it's a miracle -- http://orebokech.com/ | sea! The blue, the fresh, the
| ever free! --Bryan W. Procter
4 5 6 7 8