[ERC] решение проблем с русскими(интернаци ональными) никами, топиками и т.п.

Andrey Slusar <[email protected]> Sat, 09 Oct 2004 19:40:46 +0300
Newsgroups gmane.emacs.xemacs.user.russian
Organization XEmacs User
Message-ID <[email protected]>
Hi,

вот патч на cvs-ный erc, если кто его не видел в erc-мейллисте,
исправляющий проблемы с русскими никами/топиками/нотисами в XEmacs.
Может кто-то его засабмитит в xemacs-patches? У меня просто знания
английского языка не хватает, а девелоперы erc его почему-то не
коммитят. Проверял на GNU Emacs 21.3 и XEmacs 21.4, 21.5 - работает
нормально.
--8<---------------cut here---------------start------------->8---
--- erc-backend.el	25 Sep 2004 13:03:24 -0000	1.1.1.2
+++ erc-backend.el	25 Sep 2004 13:36:35 -0000	1.2
@@ -151,8 +151,45 @@
     (setf (erc-response.command-args msg)
           (nreverse (erc-response.command-args msg)))
 
+    (erc-decode-parsed-server-response msg)
+
     (erc-handle-parsed-server-response proc msg)))))
 
+(defun erc-decode-parsed-server-response (parsed-response)
+  "Decode a pre-parsed PARSED-RESPONSE before it can be handled.
+
+Decode `erc-response' acroding the car of it's `command-args' or if
+that is not a channel, use the `erc-default-coding-system' to
+decoding."
+  (let* ((args (erc-response.command-args parsed-response))
+	 (first-arg (car args))
+	 (matchp (string-match "^[#&].*" first-arg))
+	 (decode-target (if matchp
+			    (erc-decode-string-from-target first-arg nil)
+			  nil))
+	 (decoded-args ()))
+    (setf (erc-response.unparsed parsed-response)
+	  (erc-decode-string-from-target
+	   (erc-response.unparsed parsed-response)
+	   decode-target))
+    (setf (erc-response.sender parsed-response)
+	  (erc-decode-string-from-target
+	   (erc-response.sender parsed-response)
+	   decode-target))
+    (setf (erc-response.command parsed-response)
+	  (erc-decode-string-from-target
+	   (erc-response.command parsed-response)
+	   decode-target))
+    (dolist (arg args nil)
+      (add-to-list 'decoded-args
+		   (erc-decode-string-from-target arg decode-target)
+		   t))
+    (setf (erc-response.command-args parsed-response) decoded-args)
+    (setf (erc-response.contents parsed-response)
+	  (erc-decode-string-from-target
+	   (erc-response.contents parsed-response)
+	   decode-target))))
+
 ;; (defun erc-parse-server-response (process response)
 ;;   "Parse a server PROCESS's IRC RESPONSE."
 ;;   ;; FIXME: this function doesn't do the same as our original
@@ -604,8 +641,9 @@
 	     (privp (erc-current-nick-p tgt))
 	     s buffer
 	     fnick
-	     (msg (erc-decode-string-from-target msg
-						 (if privp sender-spec tgt))))
+	     ;; (msg (erc-decode-string-from-target msg
+;; 						 (if privp sender-spec tgt)))
+	     )
 	(setf (erc-response.contents parsed) msg)
 	(setq buffer (erc-get-buffer (if privp nick tgt) proc))
 	(when buffer
@@ -667,8 +705,9 @@
 (define-erc-response-handler (TOPIC)
   nil nil
   (let* ((ch (first (erc-response.command-args parsed)))
-         (topic (erc-trim-string (erc-decode-string-from-target
-                                  (erc-response.contents parsed) ch)))
+         (topic (erc-trim-string ;; (erc-decode-string-from-target
+                                  (erc-response.contents parsed) ;; ch)
+		))
          (time (format-time-string "%T %m/%d/%y" (current-time))))
     (multiple-value-bind (nick login host)
         (erc-parse-user (erc-response.sender parsed))
--8<---------------cut here---------------end--------------->8---

---- 
 Андрей Слюсар.
 JID: [email protected]