Hatena::Grouppython

HM python

Pythonについて覺えたことや疑問に思ったこと、及び參考にしたリソースをメモして行く感じで。面倒なのでマーク附けは最小限に。

 | 

2006-10-05

PythonでEmacsのリージョンをUnicodeエスケープする

ほげほげ

以前、ふるごむのうんこ日記 - ファイルの中身を Unicode エスケープするに觸發されて書いたもの。公開するのを忘れてゐた。PythonといふよりEmacs Lispプログラムとしての色合ひが濃いのだけれど、まあ一往Python使ってゐるし、といふことで此處に掲載。御自由にどうぞ。

あ、さうさう、これ、タブを\tに變換してしまひます。駄目ぢゃん。なんとかしたいんだけど、自分がインデントにタブを使はない派だから放置中。

コード

;;; my-unicode-escape.el --- EmacsのリージョンをUnicodeエスケープする

;; Copyright 2006  MORIYAMA Hiroshi <hiroshi@kvd.biglobe.ne.jp>

;; This program is free softwear. You can redistribute it and/or
;; modify it.

;;; Commentary:

;;;; これなに?

;; EmacsのバッファのリージョンをUnicodeエスケープしたりアンエスケープ
;; したりします。パスの通ったところにPythonが必要です。

;;;; インストール

;; 1. my-unicode-escape.el といふ名前で、Emacsのload-pathが通ったとこ
;;    ろに保存。

;; 2. ~/.emacs.el (或いは ~/.emacs) に
;;      (require 'my-unicode-escape)
;;    と記述。

;;;; 使用方法

;; M-x my-unicode-escape-region でリージョンをエスケープ。
;; 「いろは」が「\u3044\u308d\u306f」になります。

;; M-x my-unicode-unescape-region でリージョンをアンエスケープ。
;; 「\u3044\u308d\u306f」が「いろは」になります。

;;;; 言ひわけとかお願ひとか

;; Emacsのcoding關連の處理が怪しいです。いまひとつ理解して切れてゐない。
;; 一應私の環境(EUC-JP)では問題無く動いてゐるやうですが、その他の環境・
;; 設定でのテストは殆どしてゐません。「動かない!」とか「ここはかうした
;; 方が良いよ」とかがありましたら是非おしらせください。

;;; Code:

(defun my-unicode-escape-program (&optional decode)
  (let ((in-coding (substring
                    (symbol-name (cdr default-process-coding-system)) 0
                    (string-match "-\\(unix\\|dos\\|mac\\)"
                                  (symbol-name (cdr default-process-coding-system)))))
        (out-coding (substring
                     (symbol-name (car default-process-coding-system))
                     0
                     (string-match "-\\(unix\\|dos\\|mac\\)"
                                   (symbol-name (car default-process-coding-system))))))
    (if decode
        ;; decode program:
        `("python" ;; command name or full path.
          ,(concat "\
import sys, re, codecs
for m in re.finditer(r'(?s)(?P<escaped_string>\\\\u[0-9A-Fa-f]{4})|.', unicode(sys.stdin.read(), '" in-coding "')):
    if m.group('escaped_string'):
        es = m.group('escaped_string')
        try:
            sys.stdout.write(es.encode('ascii').decode('unicode_escape').encode('" out-coding "'))
        except:
            sys.stdout.write(es.encode('" out-coding "'))
    else:
        sys.stdout.write(m.group(0).encode('" out-coding "'))"
        ))
      ;; encode program:
      `("python" ;; command name or full path.
        ,(concat "\
import sys, re, codecs
for line in sys.stdin:
    re_NL = re.compile(r'\\r\\n$|[\\n\\r]$')
    NL = re.search(re_NL, line)
    try:
        NL = NL.group(0)
    except:
        NL = ''
    line = re.sub(re_NL, '', line)
    sys.stdout.write(unicode(line, '" in-coding "').encode('unicode_escape') + NL)"
    ;; memo: S.encode('unicode_escape') は 改行文字もエスケープしてしまふので、
    ;; 改行を變數に待避させてから變換してゐる。
    )))))

(defun my-unicode-escape-or-unescape-region-program-run (start end &optional decode)
  (save-excursion
    (call-process-region start end
                         (car (my-unicode-escape-program)) ;; program-name
                         t    ; delete: リージョンを削除するか否か
                         t    ; destination: deleteと此れが非nilの場合リージョンと出力を入換へる
                         nil  ; display
                         "-c" (car (cdr (my-unicode-escape-program decode))) ; arguments
                         )))

(defun my-unicode-escape-region (start end)
  (interactive "r")
  (my-unicode-escape-or-unescape-region-program-run start end))

(defun my-unicode-unescape-region (start end)
  (interactive "r")
  (my-unicode-escape-or-unescape-region-program-run start end t))

(provide 'my-unicode-escape)

;;; my-unicode-escape.el ends here

參考

くわんれん(關聯)

 | 
MORIYAMA Hiroshi <hiroshi@kvd.biglobe.ne.jp>