Blame a2ps-h.py

Bernhard M. Wiedemann f9c255
#! /usr/bin/env python
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
#
Bernhard M. Wiedemann f9c255
# (C) Mizi Research
Bernhard M. Wiedemann f9c255
# distributed under GPL
Bernhard M. Wiedemann f9c255
#
Bernhard M. Wiedemann f9c255
# Author: Hwang, ChiDeok (hwang@mizi.co.kr)
Bernhard M. Wiedemann f9c255
# 2000.03.14
Bernhard M. Wiedemann f9c255
#
Bernhard M. Wiedemann f9c255
# ChangeLog:
Bernhard M. Wiedemann f9c255
# -o option이 있을 경우나 argument로 주어진 파일이
Bernhard M. Wiedemann f9c255
# ps 파일이 아닌 경우 a2ps 를 부르도록 수정
Bernhard M. Wiedemann f9c255
# argument가 안 주어진 경우 stdin에서 읽어드림. (2000/03/16)
Bernhard M. Wiedemann f9c255
# string변환을 postscript language에서 하도록 변경. (2000/03/20)
Bernhard M. Wiedemann f9c255
# string변환을 하고 아직 비여있은 공간을 없앰 (2000/03/23)
Bernhard M. Wiedemann f9c255
# stdin으로부터 온 내용도 필요하면 a2ps로 보냄 (2000/12/28)
Bernhard M. Wiedemann f9c255
# mutt와 함께 쓸 수 있도록 -m옵션을 추가 (2000/01/03)
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
import string,sys,os
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
try: 
Bernhard M. Wiedemann f9c255
        from os import tmpnam # python2.0
Bernhard M. Wiedemann f9c255
except:
Bernhard M. Wiedemann f9c255
        def tmpnam():
Bernhard M. Wiedemann f9c255
                return "/tmp/a2ps-h-tmp"
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
hps = '/Gulim-Medium-KSC-EUC-H'
Bernhard M. Wiedemann f9c255
hbps = '/Gulim-Medium-KSC-EUC-H'
Bernhard M. Wiedemann f9c255
hbops = '/Gulim-Medium-KSC-EUC-H'
Bernhard M. Wiedemann f9c255
hops = '/Gulim-Medium-KSC-EUC-H'
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
hps = '/Gulim-Regular'
Bernhard M. Wiedemann f9c255
hbps = '/Gulim-Regular'
Bernhard M. Wiedemann f9c255
hbops = '/Gulim-Regular'
Bernhard M. Wiedemann f9c255
hops = '/Gulim-Regular'
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
def startswith(s, needle):
Bernhard M. Wiedemann f9c255
        if len(needle) > len(s): return 0
Bernhard M. Wiedemann f9c255
        return s[:len(needle)] == needle
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
def trans_file(filename):
Bernhard M. Wiedemann f9c255
        if type(filename) == type([]):
Bernhard M. Wiedemann f9c255
                lines = filename
Bernhard M. Wiedemann f9c255
        else:
Bernhard M. Wiedemann f9c255
                lines = open(filename).readlines()
Bernhard M. Wiedemann f9c255
        for i in range(len(lines)):
Bernhard M. Wiedemann f9c255
                if startswith(lines[i], '% Check PostScript language '):
Bernhard M. Wiedemann f9c255
                        print show_override
Bernhard M. Wiedemann f9c255
                        print lines[i],
Bernhard M. Wiedemann f9c255
                elif startswith(lines[i], '% Dictionary for ISO-8859-1'):
Bernhard M. Wiedemann f9c255
                        print lines[i],
Bernhard M. Wiedemann f9c255
                        print lines[i+1],
Bernhard M. Wiedemann f9c255
                        print hangul_font
Bernhard M. Wiedemann f9c255
                        lines = lines[i+10:]
Bernhard M. Wiedemann f9c255
                        break
Bernhard M. Wiedemann f9c255
                else:
Bernhard M. Wiedemann f9c255
                        print lines[i],
Bernhard M. Wiedemann f9c255
        for line in lines: print line,
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
hangul_font = """\
Bernhard M. Wiedemann f9c255
16 dict begin
Bernhard M. Wiedemann f9c255
  /FontName /fCourier def /FontType 0 def
Bernhard M. Wiedemann f9c255
  /WMode 0 def /FMapType 3 def /FontMatrix matrix def
Bernhard M. Wiedemann f9c255
  /Encoding [0 1] def
Bernhard M. Wiedemann f9c255
  /FDepVector [ /Courier findfont %(hps)s findfont ] def
Bernhard M. Wiedemann f9c255
  FontName currentdict
Bernhard M. Wiedemann f9c255
  end
Bernhard M. Wiedemann f9c255
definefont /fCourier exch def
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
16 dict begin
Bernhard M. Wiedemann f9c255
  /FontName /fCourier-Bold def /FontType 0 def
Bernhard M. Wiedemann f9c255
  /WMode 0 def /FMapType 3 def /FontMatrix matrix def
Bernhard M. Wiedemann f9c255
  /Encoding [0 1] def
Bernhard M. Wiedemann f9c255
  /FDepVector [ /Courier-Bold findfont %(hbps)s findfont ] def
Bernhard M. Wiedemann f9c255
  FontName currentdict
Bernhard M. Wiedemann f9c255
  end
Bernhard M. Wiedemann f9c255
definefont /fCourier-Bold exch def
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
16 dict begin
Bernhard M. Wiedemann f9c255
  /FontName /fCourier-BoldOblique def /FontType 0 def
Bernhard M. Wiedemann f9c255
  /WMode 0 def /FMapType 3 def /FontMatrix matrix def
Bernhard M. Wiedemann f9c255
  /Encoding [0 1] def
Bernhard M. Wiedemann f9c255
  /FDepVector [ /Courier-BoldOblique findfont %(hbops)s findfont ] def
Bernhard M. Wiedemann f9c255
  FontName currentdict
Bernhard M. Wiedemann f9c255
  end
Bernhard M. Wiedemann f9c255
definefont /fCourier-BoldOblique exch def
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
16 dict begin
Bernhard M. Wiedemann f9c255
  /FontName /fCourier-Oblique def /FontType 0 def
Bernhard M. Wiedemann f9c255
  /WMode 0 def /FMapType 3 def /FontMatrix matrix def
Bernhard M. Wiedemann f9c255
  /Encoding [0 1] def
Bernhard M. Wiedemann f9c255
  /FDepVector [ /Courier-Oblique findfont %(hops)s findfont ] def
Bernhard M. Wiedemann f9c255
  FontName currentdict
Bernhard M. Wiedemann f9c255
  end
Bernhard M. Wiedemann f9c255
definefont /fCourier-Oblique exch def
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
16 dict begin
Bernhard M. Wiedemann f9c255
  /FontName /fHelvetica def /FontType 0 def
Bernhard M. Wiedemann f9c255
  /WMode 0 def /FMapType 3 def /FontMatrix matrix def
Bernhard M. Wiedemann f9c255
  /Encoding [0 1] def
Bernhard M. Wiedemann f9c255
  /FDepVector [ /Helvetica findfont %(hps)s findfont ] def
Bernhard M. Wiedemann f9c255
  FontName currentdict
Bernhard M. Wiedemann f9c255
  end
Bernhard M. Wiedemann f9c255
definefont /fHelvetica exch def
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
16 dict begin
Bernhard M. Wiedemann f9c255
  /FontName /fHelvetica-Bold def /FontType 0 def
Bernhard M. Wiedemann f9c255
  /WMode 0 def /FMapType 3 def /FontMatrix matrix def
Bernhard M. Wiedemann f9c255
  /Encoding [0 1] def
Bernhard M. Wiedemann f9c255
  /FDepVector [ /Helvetica-Bold findfont %(hbps)s findfont ] def
Bernhard M. Wiedemann f9c255
  FontName currentdict
Bernhard M. Wiedemann f9c255
  end
Bernhard M. Wiedemann f9c255
definefont /fHelvetica-Bold exch def
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
16 dict begin
Bernhard M. Wiedemann f9c255
  /FontName /fTimes-Bold def /FontType 0 def
Bernhard M. Wiedemann f9c255
  /WMode 0 def /FMapType 3 def /FontMatrix matrix def
Bernhard M. Wiedemann f9c255
  /Encoding [0 1] def
Bernhard M. Wiedemann f9c255
  /FDepVector [ /Times-Bold findfont %(hbps)s findfont ] def
Bernhard M. Wiedemann f9c255
  FontName currentdict
Bernhard M. Wiedemann f9c255
  end
Bernhard M. Wiedemann f9c255
definefont /fTimes-Bold exch def
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
16 dict begin
Bernhard M. Wiedemann f9c255
  /FontName /fTimes-Roman def /FontType 0 def
Bernhard M. Wiedemann f9c255
  /WMode 0 def /FMapType 3 def /FontMatrix matrix def
Bernhard M. Wiedemann f9c255
  /Encoding [0 1] def
Bernhard M. Wiedemann f9c255
  /FDepVector [ /Times-Roman findfont %(hps)s findfont ] def
Bernhard M. Wiedemann f9c255
  FontName currentdict
Bernhard M. Wiedemann f9c255
  end
Bernhard M. Wiedemann f9c255
definefont /fTimes-Roman exch def
Bernhard M. Wiedemann f9c255
""" % locals()
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
show_override = """\
Bernhard M. Wiedemann f9c255
%  
Bernhard M. Wiedemann f9c255
%%Copyright: (c) 2000, 2001 Chideok Hwang
Bernhard M. Wiedemann f9c255
/han-trans {
Bernhard M. Wiedemann f9c255
        dup length 3 mul string /mystr exch def
Bernhard M. Wiedemann f9c255
        /mylen 0 def
Bernhard M. Wiedemann f9c255
        /in-hangul false def
Bernhard M. Wiedemann f9c255
        { 
Bernhard M. Wiedemann f9c255
                dup 128 gt {
Bernhard M. Wiedemann f9c255
                        in-hangul {
Bernhard M. Wiedemann f9c255
                          % c
Bernhard M. Wiedemann f9c255
                           mystr exch mylen exch put
Bernhard M. Wiedemann f9c255
                           /mylen mylen 1 add def
Bernhard M. Wiedemann f9c255
                        } {
Bernhard M. Wiedemann f9c255
                          /in-hangul true def
Bernhard M. Wiedemann f9c255
                          % 255 1 c 
Bernhard M. Wiedemann f9c255
                          mystr mylen (\\377\\1) putinterval  
Bernhard M. Wiedemann f9c255
                          mystr exch mylen 2 add exch put
Bernhard M. Wiedemann f9c255
                           /mylen mylen 3 add def
Bernhard M. Wiedemann f9c255
                        } ifelse
Bernhard M. Wiedemann f9c255
                } {
Bernhard M. Wiedemann f9c255
                        in-hangul not {
Bernhard M. Wiedemann f9c255
                          % c
Bernhard M. Wiedemann f9c255
                          mystr exch mylen exch put
Bernhard M. Wiedemann f9c255
                           /mylen mylen 1 add def
Bernhard M. Wiedemann f9c255
                        } {
Bernhard M. Wiedemann f9c255
                          /in-hangul false def
Bernhard M. Wiedemann f9c255
                          % 255 0 c
Bernhard M. Wiedemann f9c255
                          mystr mylen (\\377\\0) putinterval  
Bernhard M. Wiedemann f9c255
                          mystr exch mylen 2 add exch put
Bernhard M. Wiedemann f9c255
                           /mylen mylen 3 add def
Bernhard M. Wiedemann f9c255
                        } ifelse
Bernhard M. Wiedemann f9c255
                } ifelse
Bernhard M. Wiedemann f9c255
        } forall
Bernhard M. Wiedemann f9c255
        mystr 0 mylen getinterval
Bernhard M. Wiedemann f9c255
} bind def
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
/origshow {show} bind def
Bernhard M. Wiedemann f9c255
/show {han-trans origshow} bind def
Bernhard M. Wiedemann f9c255
/origstringwidth {stringwidth} bind def
Bernhard M. Wiedemann f9c255
/stringwidth { han-trans origstringwidth } bind def
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
%\
Bernhard M. Wiedemann f9c255
"""
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
def run_a2ps(input_file):
Bernhard M. Wiedemann f9c255
        ps = os.popen('a2ps --output=- ' + input_file)
Bernhard M. Wiedemann f9c255
        return ps.readlines()
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
def run_a2ps_from_stdin(contents):
Bernhard M. Wiedemann f9c255
        infile_name = tmpnam()
Bernhard M. Wiedemann f9c255
        infile = open(infile_name, 'w')
Bernhard M. Wiedemann f9c255
        infile.write(contents)
Bernhard M. Wiedemann f9c255
        del infile # flush
Bernhard M. Wiedemann f9c255
        a2ps_args = ' --center-title="' + title + '" ' + \
Bernhard M. Wiedemann f9c255
                '--footer="편지 메시지" ' + \
Bernhard M. Wiedemann f9c255
                '--output=- '+ infile_name
Bernhard M. Wiedemann f9c255
        ps = os.popen('a2ps ' + a2ps_args, 'r')
Bernhard M. Wiedemann f9c255
        outlines = ps.readlines()
Bernhard M. Wiedemann f9c255
        os.remove(infile_name)
Bernhard M. Wiedemann f9c255
        return outlines
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
try:
Bernhard M. Wiedemann f9c255
        i = sys.argv.index('-o')
Bernhard M. Wiedemann f9c255
        sys.stdout = open(sys.argv[i+1], 'w')
Bernhard M. Wiedemann f9c255
        del sys.argv[i:i+2]
Bernhard M. Wiedemann f9c255
except: pass
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
if '-h' in sys.argv:
Bernhard M. Wiedemann f9c255
        sys.exit(0)
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
if '-m' in sys.argv:
Bernhard M. Wiedemann f9c255
        # called from mutt 
Bernhard M. Wiedemann f9c255
        i = sys.argv.index('-m')
Bernhard M. Wiedemann f9c255
        del sys.argv[i]
Bernhard M. Wiedemann f9c255
        assert len(sys.argv) == 1
Bernhard M. Wiedemann f9c255
        input_buf = sys.stdin.read()
Bernhard M. Wiedemann f9c255
        magic = input_buf[:5];
Bernhard M. Wiedemann f9c255
        import re
Bernhard M. Wiedemann f9c255
        title = re.search('^Subject:(.*)$', input_buf, re.M).group(1)
Bernhard M. Wiedemann f9c255
        input_file = None
Bernhard M. Wiedemann f9c255
elif len(sys.argv) == 1:
Bernhard M. Wiedemann f9c255
        input_buf = sys.stdin.read()
Bernhard M. Wiedemann f9c255
        magic = input_buf[:5]
Bernhard M. Wiedemann f9c255
        title = 'From Stdin'
Bernhard M. Wiedemann f9c255
        input_file = None
Bernhard M. Wiedemann f9c255
else:
Bernhard M. Wiedemann f9c255
        input_file = sys.argv[1]
Bernhard M. Wiedemann f9c255
        magic = open(input_file).read(5)
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
if magic != '%!PS-':
Bernhard M. Wiedemann f9c255
        if input_file:
Bernhard M. Wiedemann f9c255
                input_lines = run_a2ps(input_file)
Bernhard M. Wiedemann f9c255
        else:
Bernhard M. Wiedemann f9c255
                input_lines = run_a2ps_from_stdin(input_buf)
Bernhard M. Wiedemann f9c255
Bernhard M. Wiedemann f9c255
trans_file(input_lines)
Bernhard M. Wiedemann f9c255