#!/usr/bin/env python
#-*- coding: utf-8 -*-
import os
import sys
import codecs
ORG_ENCODING='CP932'
DEST_ENCODING='CP936'
RES_MARK='\x07'
KEEP_CHARS=''
#KEEP_CHARS='@\\'
BREAK_CMDS=('spfont', 'mov', 'mid', 'add', 'if')
NEW_LINE='\r\n'
LINE_STEP=200
def show_help():
print '%s -d/-e/-D/-E ' %args[0]
sys.exit()
def conv_to_wide_char(text):
fullwide_map = [[]]
def closure(t):
if not fullwide_map[0]:
fullwide_map[0] = [ unichr(65248+i) for i in range(128)]
fullwide_map[0][ord(' ')] = u'\u3000'
keep_chars = KEEP_CHARS
for s in keep_chars:
fullwide_map[0][ord(s)] = s
fullwide_map[0] = ''.join(fullwide_map[0])
return t.translate(fullwide_map[0])
#return t.replace(u'¥', '\\').translate(fullwide_map[0])
return closure(text)
def is_wide_char(c):
return ord(c) >= 128
def parse_line(line):
line = line.strip()
ret_change = ''
res_add = []
cmd = line.split(' ')[0]
if cmd in BREAK_CMDS:
return ret_change, res_add
wide_flag = None
i = 0
while i < len(line):
c = line[i]
if c == ';':
if wide_flag is not None:
res_add.append(line[wide_flag:i])
ret_change += RES_MARK
wide_flag = None
ret_change += line[i:]
break
if is_wide_char(c):
if wide_flag is None:
wide_flag = i
else:
if wide_flag is not None:
res_add.append(line[wide_flag:i])
ret_change += RES_MARK
wide_flag = None
ret_change += c
if c == '"':
i += 1
if i >= len(line):
print line
raise Exception('Unmatched quote!')
j = line.find('"', i)
if j < 0:
print line
raise Exception('Unmatched quote!')
c = line[i]
if is_wide_char(c):
res_add.append(line[i:j])
ret_change += RES_MARK+'"'
else:
ret_change += line[i:j] + '"'
i = j
elif c == ':':
cmd = line[i+1:].lstrip().split(' ')[0]
if cmd in BREAK_CMDS:
ret_change += line[i+1:]
break
i += 1
if wide_flag is not None:
res_add.append(line[wide_flag:])
ret_change += RES_MARK
return ret_change, res_add
def decode(text):
ret = text.splitlines()
res = []
for lno, line in enumerate(ret):
ret_change, res_add = parse_line(line)
if res_add:
ret[lno] = ret_change
res += res_add
'''
stripped_line = line.lstrip()
if stripped_line and ord(stripped_line[0]) >= 128:
# Wide char begins, it's a text line!
line = line.rstrip()
wide_flag = True
start_pos = 0
for i, c in enumerate(line):
if
newpage_flag = False
if line[-1] in ('\\', '/'):
newpage_flag = line[-1]
line = line[:-1]
if '@' not in line:
res.append(line)
ret[lno] = RES_MARK
else:
ret[lno] = ''
pos = line.find('@')
last_pos = 0
while pos >= 0:
res.append(line[last_pos:pos])
if pos > last_pos:
ret[lno] += RES_MARK+'@'
else:
ret[lno] += '@'
last_pos = pos + 1
pos = line.find('@', last_pos)
last_words = line[last_pos:]
if last_words:
res.append(last_words)
ret[lno] += RES_MARK
if newpage_flag:
ret[lno] += newpage_flag
'''
return NEW_LINE.join(ret), res
def encode(text, res):
ret = text.splitlines()
res_flag = 0
for lno in range(len(ret)):
while RES_MARK in ret[lno]:
if res_flag >= len(res):
raise Exception('Res is too short!')
ret[lno] = ret[lno].replace(RES_MARK, conv_to_wide_char(res[res_flag]), 1)
res_flag += 1
return NEW_LINE.join(ret)
def read_file(file_, encoding):
text = ''
try:
rf = codecs.open(file_, 'rb', encoding=encoding)
text = rf.read()
rf.close()
except Exception, e:
print 'Can not read %s: %s' %(file_, e)
sys.exit()
return text
def write_file(file_, text, encoding, errors='strict'):
try:
rf = codecs.open(file_, 'wb', encoding=encoding, errors=errors)
rf.write(text)
rf.close()
except Exception, e:
print 'Can not write %s: %s' %(file_, e)
sys.exit()
__name__ = '__main__'
if __name__ == '__main__':
args = sys.argv
if len(args) != 5:
show_help()
cmd, nsfile, msfile, resname = args[1:5]
if cmd not in ('-d', '-e', '-D', '-E'):
show_help()
if cmd in ('-d', '-D'):
'''decode from NS script file'''
in_text = read_file(nsfile, ORG_ENCODING)
out_text, res = decode(in_text)
if cmd == '-D':
for i, r in enumerate(res):
write_file(os.path.join(resname, '%s.txt' %i), r, ORG_ENCODING)
else:
res = NEW_LINE.join(res)
write_file(resname, res, ORG_ENCODING)
write_file(msfile, out_text, ORG_ENCODING)
else:
#elif cmd in ('-e', '-E'):
'''generate new NS script file'''
res = []
if cmd == '-E':
i = 0
resfile = os.path.join(resname, '%s.txt' %i)
while os.path.isfile(resfile):
r = read_file(resfile, DEST_ENCODING)
res.append(''.join(r.splitlines()))
i += 1
resfile = os.path.join(resname, '%s.txt' %i)
else:
r = read_file(resname, DEST_ENCODING)
#res = r.splitlines()
res = r.split(NEW_LINE)
in_text = read_file(msfile, ORG_ENCODING)
out_text = encode(in_text, res)
write_file(nsfile, out_text, DEST_ENCODING, 'ignore')