Bläddra i källkod

代码格式化

master v1.0.0
AICells 4 år sedan
förälder
incheckning
696bdc8ac5
16 ändrade filer med 1066 tillägg och 1056 borttagningar
  1. +136
    -121
      src/color_print.py
  2. +154
    -149
      src/decoder.py
  3. +55
    -54
      src/genCfgs.py
  4. +18
    -14
      src/slpp/slpp-c4d7f69af338f973c0ef21a9a06a145936367229/slpp.py
  5. +3
    -2
      src/slpp/slpp-c4d7f69af338f973c0ef21a9a06a145936367229/tests.py
  6. +18
    -14
      src/slpp/slpp.py
  7. +3
    -2
      src/slpp/tests.py
  8. +13
    -14
      src/writer.py
  9. +126
    -129
      src/writer_elixir.py
  10. +97
    -99
      src/writer_erlang_erl.py
  11. +68
    -70
      src/writer_erlang_hrl.py
  12. +5
    -8
      src/writer_json_array.py
  13. +85
    -89
      src/writer_json_object.py
  14. +114
    -118
      src/writer_lua.py
  15. +117
    -120
      src/writer_python.py
  16. +54
    -53
      src/writer_xml.py

+ 136
- 121
src/color_print.py Visa fil

@ -5,215 +5,230 @@
import ctypes
import sys
STD_INPUT_HANDLE = -10
STD_OUTPUT_HANDLE = -11
STD_ERROR_HANDLE = -12
# 字体颜色定义 ,关键在于颜色编码,由2位十六进制组成,分别取0~f,前一位指的是背景色,后一位指的是字体色
#由于该函数的限制,应该是只有这16种,可以前景色与背景色组合。也可以几种颜色通过或运算组合,组合后还是在这16种颜色中
# 由于该函数的限制,应该是只有这16种,可以前景色与背景色组合。也可以几种颜色通过或运算组合,组合后还是在这16种颜色中
# Windows CMD命令行 字体颜色定义 text colors
FOREGROUND_BLACK = 0x00 # black.
FOREGROUND_DARKBLUE = 0x01 # dark blue.
FOREGROUND_DARKGREEN = 0x02 # dark green.
FOREGROUND_DARKSKYBLUE = 0x03 # dark skyblue.
FOREGROUND_DARKRED = 0x04 # dark red.
FOREGROUND_DARKPINK = 0x05 # dark pink.
FOREGROUND_DARKYELLOW = 0x06 # dark yellow.
FOREGROUND_DARKWHITE = 0x07 # dark white.
FOREGROUND_DARKGRAY = 0x08 # dark gray.
FOREGROUND_BLUE = 0x09 # blue.
FOREGROUND_GREEN = 0x0a # green.
FOREGROUND_SKYBLUE = 0x0b # skyblue.
FOREGROUND_RED = 0x0c # red.
FOREGROUND_PINK = 0x0d # pink.
FOREGROUND_YELLOW = 0x0e # yellow.
FOREGROUND_WHITE = 0x0f # white.
FOREGROUND_BLACK = 0x00 # black.
FOREGROUND_DARKBLUE = 0x01 # dark blue.
FOREGROUND_DARKGREEN = 0x02 # dark green.
FOREGROUND_DARKSKYBLUE = 0x03 # dark skyblue.
FOREGROUND_DARKRED = 0x04 # dark red.
FOREGROUND_DARKPINK = 0x05 # dark pink.
FOREGROUND_DARKYELLOW = 0x06 # dark yellow.
FOREGROUND_DARKWHITE = 0x07 # dark white.
FOREGROUND_DARKGRAY = 0x08 # dark gray.
FOREGROUND_BLUE = 0x09 # blue.
FOREGROUND_GREEN = 0x0a # green.
FOREGROUND_SKYBLUE = 0x0b # skyblue.
FOREGROUND_RED = 0x0c # red.
FOREGROUND_PINK = 0x0d # pink.
FOREGROUND_YELLOW = 0x0e # yellow.
FOREGROUND_WHITE = 0x0f # white.
# Windows CMD命令行 背景颜色定义 background colors
BACKGROUND_BLUE = 0x10 # dark blue.
BACKGROUND_GREEN = 0x20 # dark green.
BACKGROUND_DARKSKYBLUE = 0x30 # dark skyblue.
BACKGROUND_DARKRED = 0x40 # dark red.
BACKGROUND_DARKPINK = 0x50 # dark pink.
BACKGROUND_DARKYELLOW = 0x60 # dark yellow.
BACKGROUND_DARKWHITE = 0x70 # dark white.
BACKGROUND_DARKGRAY = 0x80 # dark gray.
BACKGROUND_BLUE = 0x90 # blue.
BACKGROUND_GREEN = 0xa0 # green.
BACKGROUND_SKYBLUE = 0xb0 # skyblue.
BACKGROUND_RED = 0xc0 # red.
BACKGROUND_PINK = 0xd0 # pink.
BACKGROUND_YELLOW = 0xe0 # yellow.
BACKGROUND_WHITE = 0xf0 # white.
BACKGROUND_BLUE = 0x10 # dark blue.
BACKGROUND_GREEN = 0x20 # dark green.
BACKGROUND_DARKSKYBLUE = 0x30 # dark skyblue.
BACKGROUND_DARKRED = 0x40 # dark red.
BACKGROUND_DARKPINK = 0x50 # dark pink.
BACKGROUND_DARKYELLOW = 0x60 # dark yellow.
BACKGROUND_DARKWHITE = 0x70 # dark white.
BACKGROUND_DARKGRAY = 0x80 # dark gray.
BACKGROUND_BLUE = 0x90 # blue.
BACKGROUND_GREEN = 0xa0 # green.
BACKGROUND_SKYBLUE = 0xb0 # skyblue.
BACKGROUND_RED = 0xc0 # red.
BACKGROUND_PINK = 0xd0 # pink.
BACKGROUND_YELLOW = 0xe0 # yellow.
BACKGROUND_WHITE = 0xf0 # white.
# get handle
std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
def set_cmd_text_color(color, handle=std_out_handle):
Bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
return Bool
#reset white
# reset white
def resetColor():
set_cmd_text_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
###############################################################
#暗蓝色
#dark blue
# 暗蓝色
# dark blue
def printDarkBlue(mess):
set_cmd_text_color(FOREGROUND_DARKBLUE)
sys.stdout.write(mess)
resetColor()
#暗绿色
#dark green
# 暗绿色
# dark green
def printDarkGreen(mess):
set_cmd_text_color(FOREGROUND_DARKGREEN)
sys.stdout.write(mess)
resetColor()
#暗天蓝色
#dark sky blue
# 暗天蓝色
# dark sky blue
def printDarkSkyBlue(mess):
set_cmd_text_color(FOREGROUND_DARKSKYBLUE)
sys.stdout.write(mess)
resetColor()
#暗红色
#dark red
# 暗红色
# dark red
def printDarkRed(mess):
set_cmd_text_color(FOREGROUND_DARKRED)
sys.stdout.write(mess)
resetColor()
#暗粉红色
#dark pink
# 暗粉红色
# dark pink
def printDarkPink(mess):
set_cmd_text_color(FOREGROUND_DARKPINK)
sys.stdout.write(mess)
resetColor()
#暗黄色
#dark yellow
# 暗黄色
# dark yellow
def printDarkYellow(mess):
set_cmd_text_color(FOREGROUND_DARKYELLOW)
sys.stdout.write(mess)
resetColor()
#暗白色
#dark white
# 暗白色
# dark white
def printDarkWhite(mess):
set_cmd_text_color(FOREGROUND_DARKWHITE)
sys.stdout.write(mess)
resetColor()
#暗灰色
#dark gray
# 暗灰色
# dark gray
def printDarkGray(mess):
set_cmd_text_color(FOREGROUND_DARKGRAY)
sys.stdout.write(mess)
resetColor()
#蓝色
#blue
# 蓝色
# blue
def printBlue(mess):
set_cmd_text_color(FOREGROUND_BLUE)
sys.stdout.write(mess)
resetColor()
#绿色
#green
# 绿色
# green
def printGreen(mess):
set_cmd_text_color(FOREGROUND_GREEN)
sys.stdout.write(mess)
resetColor()
#天蓝色
#sky blue
# 天蓝色
# sky blue
def printSkyBlue(mess):
set_cmd_text_color(FOREGROUND_SKYBLUE)
sys.stdout.write(mess)
resetColor()
#红色
#red
# 红色
# red
def printRed(mess):
set_cmd_text_color(FOREGROUND_RED)
sys.stdout.write(mess)
resetColor()
#粉红色
#pink
# 粉红色
# pink
def printPink(mess):
set_cmd_text_color(FOREGROUND_PINK)
sys.stdout.write(mess)
resetColor()
#黄色
#yellow
# 黄色
# yellow
def printYellow(mess):
set_cmd_text_color(FOREGROUND_YELLOW)
sys.stdout.write(mess)
resetColor()
#白色
#white
# 白色
# white
def printWhite(mess):
set_cmd_text_color(FOREGROUND_WHITE)
sys.stdout.write(mess)
resetColor()
##################################################
#白底黑字
#white bkground and black text
# 白底黑字
# white bkground and black text
def printWhiteBlack(mess):
set_cmd_text_color(FOREGROUND_BLACK | BACKGROUND_WHITE)
sys.stdout.write(mess)
resetColor()
#白底黑字
#white bkground and black text
# 白底黑字
# white bkground and black text
def printWhiteBlack_2(mess):
set_cmd_text_color(0xf0)
sys.stdout.write(mess)
resetColor()
#黄底蓝字
#white bkground and black text
# 黄底蓝字
# white bkground and black text
def printYellowRed(mess):
set_cmd_text_color(BACKGROUND_YELLOW | FOREGROUND_RED)
sys.stdout.write(mess)
resetColor()
##############################################################
if __name__ == '__main__':
printDarkBlue('printDarkBlue:暗蓝色文字\n')
printDarkGreen('printDarkGreen:暗绿色文字\n' )
printDarkSkyBlue('printDarkSkyBlue:暗天蓝色文字\n' )
printDarkRed('printDarkRed:暗红色文字\n' )
printDarkPink('printDarkPink:暗粉红色文字\n' )
printDarkYellow('printDarkYellow:暗黄色文字\n' )
printDarkWhite('printDarkWhite:暗白色文字\n' )
printDarkGray('printDarkGray:暗灰色文字\n' )
printBlue('printBlue:蓝色文字\n' )
printGreen('printGreen:绿色文字\n' )
printSkyBlue('printSkyBlue:天蓝色文字\n' )
printRed('printRed:红色文字\n' )
printPink('printPink:粉红色文字\n' )
printYellow('printYellow:黄色文字\n' )
printWhite('printWhite:白色文字\n' )
printWhiteBlack('printWhiteBlack:白底黑字输出\n' )
printWhiteBlack_2('printWhiteBlack_2:白底黑字输出(直接传入16进制参数)\n' )
printYellowRed('printYellowRed:黄底红字输出\n' )
printDarkGreen('printDarkGreen:暗绿色文字\n')
printDarkSkyBlue('printDarkSkyBlue:暗天蓝色文字\n')
printDarkRed('printDarkRed:暗红色文字\n')
printDarkPink('printDarkPink:暗粉红色文字\n')
printDarkYellow('printDarkYellow:暗黄色文字\n')
printDarkWhite('printDarkWhite:暗白色文字\n')
printDarkGray('printDarkGray:暗灰色文字\n')
printBlue('printBlue:蓝色文字\n')
printGreen('printGreen:绿色文字\n')
printSkyBlue('printSkyBlue:天蓝色文字\n')
printRed('printRed:红色文字\n')
printPink('printPink:粉红色文字\n')
printYellow('printYellow:黄色文字\n')
printWhite('printWhite:白色文字\n')
printWhiteBlack('printWhiteBlack:白底黑字输出\n')
printWhiteBlack_2('printWhiteBlack_2:白底黑字输出(直接传入16进制参数)\n')
printYellowRed('printYellowRed:黄底红字输出\n')

+ 154
- 149
src/decoder.py Visa fil

@ -1,13 +1,13 @@
#! python
# -*- coding:utf-8 -*-
import json
import openpyxl
import os
import re
import sys
import json
import openpyxl
import color_print
import color_print
from slpp.slpp import slpp as lua
# array数组模式下,各个栏的分布 第一行行是文档注释,不导出
@ -25,8 +25,8 @@ OCLT_COL = 4 # client column 客户端
OCTX_COL = 5 # content column 内容所在列
OFLG_ROW = 2 # flag object模式下 server client所在行
SHEET_FLAG_ROW = 2 # 2列1行表示是array 还是object 或者是不用导出的表
SHEET_FLAG_COL = 1 # 2列1行表示是array 还是object 或者是不用导出的表
SHEET_FLAG_ROW = 2 # 2列1行表示是array 还是object 或者是不用导出的表
SHEET_FLAG_COL = 1 # 2列1行表示是array 还是object 或者是不用导出的表
# 导出服务器/客户端配置标识
SRV_FLAG = "server"
@ -38,19 +38,18 @@ ALIST_COL = 1
SRV_LIST = "slist"
CLT_LIST = "clist"
# 用于标识表的类型 不是这两种就不会导出数据
ARRAY_FLAG = "array" # 标识表的是array类型的表
ARRAY_FLAG = "array" # 标识表的是array类型的表
OBJECT_FLAG = "object" # 标识表的是object类型的表
KEY_FLAG = "$key_" # array表的 作为Key字段的前缀标识
KEY_FLAG_LEN = 5 # array表的 作为Key字段的前缀标识长度 用于分割字符串
KEY_FLAG = "$key_" # array表的 作为Key字段的前缀标识
KEY_FLAG_LEN = 5 # array表的 作为Key字段的前缀标识长度 用于分割字符串
# 支持的数据类型
# "int":1,"number":2,"int64":3,"string":4, "tuple":5, "list":6, "dict":7 为python原生数据格式
# "json":8,"lua":9 为json和lua的数据格式
# excel配置的时候 对应类型字段 填入对应数据类型的有效数据格式的数据就OK
TYPES = { "int":1,"number":2,"int64":3,"string":4, "tuple":5, "list":6, "dict":7, "json":8,"lua":9}
TYPES = {"int": 1, "number": 2, "int64": 3, "string": 4, "tuple": 5, "list": 6, "dict": 7, "json": 8, "lua": 9}
try:
basestring
@ -69,6 +68,7 @@ try:
except NameError:
unicode = str
# 类型转换器
class ValueConverter(object):
def __init__(self):
@ -78,67 +78,68 @@ class ValueConverter(object):
# str可以通过decode转换为unicode
# ascii' codec can't encode characters
# 这个函数在python3中没用
def to_unicode_str( self,val ):
if isinstance( val,str ) :
def to_unicode_str(self, val):
if isinstance(val, str):
return val
elif isinstance( val,unicode ) :
elif isinstance(val, unicode):
return val
else :
return str( val ).decode("utf8")
def to_value(self,val_type,val):
if "int" == val_type :
return int( val )
elif "int64" == val_type :
return long( val )
elif "number" == val_type :
else:
return str(val).decode("utf8")
def to_value(self, val_type, val):
if "int" == val_type:
return int(val)
elif "int64" == val_type:
return long(val)
elif "number" == val_type:
# 去除带小数时的小数点,100.0 ==>> 100
# number就让它带小数点吧,不然强类型的配置无法正确识别出来
# if long( val ) == float( val ) : return long( val )
return float( val )
elif "string" == val_type :
return self.to_unicode_str( val )
elif "json" == val_type :
return json.loads( val )
elif "lua" == val_type :
return lua.decode( val )
elif "tuple" == val_type :
return tuple(eval(val))
elif "list" == val_type :
return float(val)
elif "string" == val_type:
return self.to_unicode_str(val)
elif "json" == val_type:
return json.loads(val)
elif "lua" == val_type:
return lua.decode(val)
elif "tuple" == val_type:
return tuple(eval(val))
elif "list" == val_type:
return list(eval(val))
elif "dict" == val_type :
elif "dict" == val_type:
return dict(eval(val))
else :
self.raise_error( "invalid type",value )
else:
self.raise_error("invalid type", value)
class Sheet(object):
def __init__(self, base_name, wb_sheet, srv_writer, clt_writer, srv_is_list, clt_is_list):
self.types = [] # 记录各列字段的类型
self.types = [] # 记录各列字段的类型
self.srv_writer = srv_writer
self.clt_writer = clt_writer
self.srv_fields = [] #服务端各列字段名
self.clt_fields = [] #客户端各列字段名
self.srv_comment = {} # 服务器字段注释
self.clt_comment = {} # 客户端字段注释
self.srv_fields = [] # 服务端各列字段名
self.clt_fields = [] # 客户端各列字段名
self.srv_comment = {} # 服务器字段注释
self.clt_comment = {} # 客户端字段注释
self.srv_keys = {} # 服务器key
self.clt_keys = {} # 客户端key
self.srv_keys = {} # 服务器key
self.clt_keys = {} # 客户端key
self.srv_is_list = srv_is_list # 客户端是否导致get_list() 列表函数
self.clt_is_list = clt_is_list # 客户端是否导致get_list() 列表函数
self.converter = ValueConverter()
self.wb_sheet = wb_sheet
self.wb_sheet = wb_sheet
self.base_name = base_name
match_list = re.findall("[a-zA-Z0-9_]+$",base_name)
match_list = re.findall("[a-zA-Z0-9_]+$", base_name)
if None == match_list or 1 != len(match_list):
Exception( base_name,"not a legal file name" )
Exception(base_name, "not a legal file name")
self.base_file_name = match_list[0]
@ -147,42 +148,42 @@ class Sheet(object):
self.error_col = 0
# 记录出错位置
def mark_error_pos(self,row,col):
if row > 0 : self.error_row = row
if col > 0 : self.error_col = col
def mark_error_pos(self, row, col):
if row > 0: self.error_row = row
if col > 0: self.error_col = col
# 发起一个解析错误
def raise_error(self,what,val):
def raise_error(self, what, val):
excel_info = format("DOC:%s,SHEET:%s,ROW:%d,COLUMN:%d" % \
(self.base_name,self.wb_sheet.title,self.error_row,self.error_col))
raise Exception( what,val,excel_info )
(self.base_name, self.wb_sheet.title, self.error_row, self.error_col))
raise Exception(what, val, excel_info)
def to_value(self,val_type,val):
def to_value(self, val_type, val):
try:
return self.converter.to_value(val_type,val)
except Exception :
return self.converter.to_value(val_type, val)
except Exception:
t, e = sys.exc_info()[:2]
self.raise_error( "ConverError",e )
self.raise_error("ConverError", e)
# 解析一个表格
def decode_sheet(self):
wb_sheet = self.wb_sheet
self.decode_type ()
self.decode_type()
self.decode_field()
self.decode_ctx ()
self.decode_ctx()
color_print.printGreen( " covert successfully... sheet name -> %s \n" % wb_sheet.title )
color_print.printGreen(" covert successfully... sheet name -> %s \n" % wb_sheet.title)
return True
# 写入配置到文件
def write_one_file(self, ctx, base_path, writer, keys_list, comment_text, is_list):
# 有些配置可能只导出客户端或只导出服务器
if not any(ctx) :
if not any(ctx):
return
write_file_name = self.base_file_name
if self.wb_sheet.title.find("+") >= 0 or self.wb_sheet.title.find("-") >= 0 :
if self.wb_sheet.title.find("+") >= 0 or self.wb_sheet.title.find("-") >= 0:
match_list = re.findall("[a-zA-Z0-9_]+$", self.wb_sheet.title)
if 1 == len(match_list):
write_file_name = write_file_name + '_' + match_list[0]
@ -190,20 +191,23 @@ class Sheet(object):
wt = writer(self.base_name, self.wb_sheet.title, write_file_name, keys_list, comment_text, is_list)
ctx = wt.context(ctx)
suffix = wt.suffix()
if None != ctx :
if None != ctx:
path = base_path + write_file_name + suffix
#必须为wb,不然无法写入utf-8
file = open( path, 'wb' )
file.write( ctx.encode( "utf-8" ) )
# 必须为wb,不然无法写入utf-8
file = open(path, 'wb')
file.write(ctx.encode("utf-8"))
file.close()
# 分别写入到服务端、客户端的配置文件
def write_files(self, srv_path, clt_path):
if None != srv_path and None != self.srv_writer:
self.write_one_file(self.srv_ctx, srv_path, self.srv_writer, self.srv_keys, self.srv_comment, self.srv_is_list)
self.write_one_file(self.srv_ctx, srv_path, self.srv_writer, self.srv_keys, self.srv_comment,
self.srv_is_list)
if None != clt_path and None != self.clt_writer:
self.write_one_file(self.clt_ctx, clt_path, self.clt_writer, self.clt_keys, self.clt_comment, self.clt_is_list)
self.write_one_file(self.clt_ctx, clt_path, self.clt_writer, self.clt_keys, self.clt_comment,
self.clt_is_list)
# 导出数组类型配置,A1格子的内容有array标识
class ArraySheet(Sheet):
@ -219,103 +223,103 @@ class ArraySheet(Sheet):
# 解析各列的类型(string、number...)
def decode_type(self):
# 第一列没数据,类型可以不填,默认为None,但是这里要占个位
self.types.append( None )
self.types.append(None)
for col_idx in range( AKEY_COL + 1,self.wb_sheet.max_column + 1 ):
self.mark_error_pos(ATPE_ROW,col_idx)
value = self.wb_sheet.cell( row = ATPE_ROW, column = col_idx ).value
for col_idx in range(AKEY_COL + 1, self.wb_sheet.max_column + 1):
self.mark_error_pos(ATPE_ROW, col_idx)
value = self.wb_sheet.cell(row=ATPE_ROW, column=col_idx).value
# 单元格为空的时候,wb_sheet.cell(row=1, column=2).value == None
# 类型那一行必须连续,空白表示后面的数据都不导出了
if value == None :
if value == None:
break
if value not in TYPES :
self.raise_error( "invalid type",value )
if value not in TYPES:
self.raise_error("invalid type", value)
self.types.append( value )
self.types.append(value)
# 解析客户端、服务器的字段名(server、client)那两行
def decode_one_field(self,fields,row_index, keys):
def decode_one_field(self, fields, row_index, keys):
key_index = 1
for col_index in range( AKEY_COL,len( self.types ) + 1 ):
for col_index in range(AKEY_COL, len(self.types) + 1):
value = self.wb_sheet.cell(
row = row_index, column = col_index ).value
row=row_index, column=col_index).value
# 对于array类型的表 一条数据可以有多个值作为KEY 需要处理一下
if None != value and value.find(KEY_FLAG) >= 0 :
if None != value and value.find(KEY_FLAG) >= 0:
value = value[KEY_FLAG_LEN:]
keys[value] = key_index
key_index = key_index + 1
# 对于不需要导出的field,可以为空。即value为None
fields.append( value )
fields.append(value)
# 解析注释那一行
def decode_one_comment(self,fields,row_index, key_index):
for col_index in range( AKEY_COL + 1,len( self.types ) + 1 ):
def decode_one_comment(self, fields, row_index, key_index):
for col_index in range(AKEY_COL + 1, len(self.types) + 1):
value = self.wb_sheet.cell(
row = row_index, column = col_index ).value
row=row_index, column=col_index).value
key = self.wb_sheet.cell(
row = key_index, column = col_index ).value
row=key_index, column=col_index).value
if None == key :
if None == key:
continue
# 对于不需要导出的field,可以为空。即value为None
if key.find(KEY_FLAG) >= 0 :
if key.find(KEY_FLAG) >= 0:
key = key[KEY_FLAG_LEN:]
fields[key] = value
else :
else:
fields[key] = value
# 导出客户端、服务端字段名(server、client)那一列
def decode_field(self):
self.decode_one_field( self.srv_fields,ASRV_ROW, self.srv_keys )
self.decode_one_field( self.clt_fields,ACLT_ROW, self.clt_keys )
self.decode_one_field(self.srv_fields, ASRV_ROW, self.srv_keys)
self.decode_one_field(self.clt_fields, ACLT_ROW, self.clt_keys)
# 导出服务器和客户端对用字段的注释, 导表的时候可能用到
self.decode_one_comment( self.srv_comment, ACMT_ROW, ASRV_ROW)
self.decode_one_comment( self.clt_comment, ACMT_ROW, ACLT_ROW)
self.decode_one_comment(self.srv_comment, ACMT_ROW, ASRV_ROW)
self.decode_one_comment(self.clt_comment, ACMT_ROW, ACLT_ROW)
# 解析出一个格子的内容
def decode_cell(self,row_idx,col_idx):
value = self.wb_sheet.cell( row = row_idx, column = col_idx ).value
def decode_cell(self, row_idx, col_idx):
value = self.wb_sheet.cell(row=row_idx, column=col_idx).value
if None == value:
return None
# 类型是从0下标开始,但是excel的第一列从1开始
self.mark_error_pos( row_idx,col_idx )
return self.to_value( self.types[col_idx - 1],value )
self.mark_error_pos(row_idx, col_idx)
return self.to_value(self.types[col_idx - 1], value)
# 解析出一行的内容
def decode_row(self,row_idx):
def decode_row(self, row_idx):
srv_row = {}
clt_row = {}
# 第一列没数据,从第二列开始解析
for col_idx in range( AKEY_COL + 1,len( self.types ) + 1 ):
value = self.decode_cell( row_idx,col_idx )
if None == value : continue
for col_idx in range(AKEY_COL + 1, len(self.types) + 1):
value = self.decode_cell(row_idx, col_idx)
if None == value: continue
srv_key = self.srv_fields[col_idx - 1]
clt_key = self.clt_fields[col_idx - 1]
if srv_key :
if srv_key:
srv_row[srv_key] = value
if clt_key :
if clt_key:
clt_row[clt_key] = value
return srv_row,clt_row # 返回一个tuple
return srv_row, clt_row # 返回一个tuple
# 解析导出的内容
def decode_ctx(self):
for row_idx in range( ACLT_ROW + 1,self.wb_sheet.max_row + 1 ):
srv_row,clt_row = self.decode_row( row_idx )
for row_idx in range(ACLT_ROW + 1, self.wb_sheet.max_row + 1):
srv_row, clt_row = self.decode_row(row_idx)
# 不为空才追加
if any( srv_row ) :
self.srv_ctx.append( srv_row )
if any( clt_row ) :
self.clt_ctx.append( clt_row )
if any(srv_row):
self.srv_ctx.append(srv_row)
if any(clt_row):
self.clt_ctx.append(clt_row)
# 导出object类型的结构,A1格子有object标识
class ObjectSheet(Sheet):
@ -330,80 +334,81 @@ class ObjectSheet(Sheet):
# 解析各字段的类型
def decode_type(self):
for row_idx in range( OFLG_ROW + 1,self.wb_sheet.max_row + 1 ):
self.mark_error_pos( row_idx,OTPE_COL)
value = self.wb_sheet.cell( row = row_idx, column = OTPE_COL ).value
for row_idx in range(OFLG_ROW + 1, self.wb_sheet.max_row + 1):
self.mark_error_pos(row_idx, OTPE_COL)
value = self.wb_sheet.cell(row=row_idx, column=OTPE_COL).value
# 类型必须连续,遇到空则认为后续数据不再导出
if value == None :
if value == None:
break
if value not in TYPES :
self.raise_error( "invalid type",value )
if value not in TYPES:
self.raise_error("invalid type", value)
self.types.append( value )
self.types.append(value)
# 导出客户端、服务端字段名(server、client)那一列
def decode_one_field(self,fields,col_idx):
for row_idx in range( OFLG_ROW + 1,len( self.types ) + OFLG_ROW + 1 ):
value = self.wb_sheet.cell( row = row_idx, column = col_idx ).value
def decode_one_field(self, fields, col_idx):
for row_idx in range(OFLG_ROW + 1, len(self.types) + OFLG_ROW + 1):
value = self.wb_sheet.cell(row=row_idx, column=col_idx).value
# 对于不需要导出的field,可以为空。即value为None
fields.append( value )
fields.append(value)
# 解析注释那一行
def decode_one_comment(self,fields,col_idx, key_index):
for row_idx in range( OFLG_ROW + 1,len( self.types ) + OFLG_ROW + 1 ):
value = self.wb_sheet.cell( row = row_idx, column = col_idx ).value
def decode_one_comment(self, fields, col_idx, key_index):
for row_idx in range(OFLG_ROW + 1, len(self.types) + OFLG_ROW + 1):
value = self.wb_sheet.cell(row=row_idx, column=col_idx).value
key = self.wb_sheet.cell( row = row_idx, column = key_index ).value
key = self.wb_sheet.cell(row=row_idx, column=key_index).value
if None == value:
continue
# 导出存在值的fields的注释
fields[key] = value
fields[key] = value
# 导出客户端、服务端字段名(server、client)那一列
def decode_field(self):
self.decode_one_field( self.srv_fields,OSRV_COL )
self.decode_one_field( self.clt_fields,OCLT_COL )
self.decode_one_field(self.srv_fields, OSRV_COL)
self.decode_one_field(self.clt_fields, OCLT_COL)
# 导出服务器和客户端对用字段的注释, 导表的时候可能用到
self.decode_one_comment( self.srv_comment, OCMT_COL, OSRV_COL)
self.decode_one_comment( self.clt_comment, OCMT_COL, OCLT_COL )
self.decode_one_comment(self.srv_comment, OCMT_COL, OSRV_COL)
self.decode_one_comment(self.clt_comment, OCMT_COL, OCLT_COL)
# 解析一个单元格内容
def decode_cell(self,row_idx):
value = self.wb_sheet.cell( row = row_idx, column = OCTX_COL ).value
if None == value : return None
def decode_cell(self, row_idx):
value = self.wb_sheet.cell(row=row_idx, column=OCTX_COL).value
if None == value: return None
# 在object的结构中,数据是从第二行开始的,所以types的下标偏移2
self.mark_error_pos( row_idx,OCTX_COL )
return self.to_value( self.types[row_idx - OFLG_ROW - 1],value )
self.mark_error_pos(row_idx, OCTX_COL)
return self.to_value(self.types[row_idx - OFLG_ROW - 1], value)
# 解析表格的所有内容
def decode_ctx(self):
for row_idx in range( OFLG_ROW + 1,len( self.types ) + OFLG_ROW + 1 ):
value = self.decode_cell( row_idx )
for row_idx in range(OFLG_ROW + 1, len(self.types) + OFLG_ROW + 1):
value = self.decode_cell(row_idx)
if None == value :
if None == value:
continue
srv_key = self.srv_fields[row_idx - OFLG_ROW - 1]
clt_key = self.clt_fields[row_idx - OFLG_ROW - 1]
if srv_key : self.srv_ctx[srv_key] = value
if clt_key : self.clt_ctx[clt_key] = value
if srv_key: self.srv_ctx[srv_key] = value
if clt_key: self.clt_ctx[clt_key] = value
class ExcelDoc:
def __init__(self, file,abspath):
def __init__(self, file, abspath):
self.file = file
self.abspath = abspath
# 是否需要解析
# 返回解析的对象类型
def need_decode(self,wb_sheet):
def need_decode(self, wb_sheet):
sheet_val = wb_sheet.cell(
row = SHEET_FLAG_ROW, column = SHEET_FLAG_COL ).value
row=SHEET_FLAG_ROW, column=SHEET_FLAG_COL).value
sheeter = None
srv_value = None
@ -437,17 +442,17 @@ class ExcelDoc:
return None, srv_is_list, clt_is_list
return sheeter, srv_is_list, clt_is_list
def decode(self,srv_path,clt_path,srv_writer,clt_writer):
def decode(self, srv_path, clt_path, srv_writer, clt_writer):
color_print.printYellow(" start covert: %s \n" % self.file.ljust(44, "*"))
base_name = os.path.splitext( self.file )[0]
wb = openpyxl.load_workbook( self.abspath )
base_name = os.path.splitext(self.file)[0]
wb = openpyxl.load_workbook(self.abspath)
for wb_sheet in wb.worksheets:
Sheeter, srv_is_list, clt_is_list = self.need_decode( wb_sheet )
if None == Sheeter :
Sheeter, srv_is_list, clt_is_list = self.need_decode(wb_sheet)
if None == Sheeter:
color_print.printPink(" covert skip........... sheet name -> %s\n" % wb_sheet.title)
continue
sheet = Sheeter( base_name,wb_sheet,srv_writer,clt_writer, srv_is_list, clt_is_list )
if sheet.decode_sheet() :
sheet.write_files( srv_path,clt_path )
sheet = Sheeter(base_name, wb_sheet, srv_writer, clt_writer, srv_is_list, clt_is_list)
if sheet.decode_sheet():
sheet.write_files(srv_path, clt_path)

+ 55
- 54
src/genCfgs.py Visa fil

@ -16,97 +16,98 @@ from optparse import OptionParser
from decoder import ExcelDoc
class Reader:
# @input_path:excel文件所在目录
# @srv_path :server输出目录
# @clt_path :客户端输出目录
# @timeout :只处理文档最后更改时间在N秒内的文档
# @suffix :excel文件后缀
def __init__(self,input_path,
srv_path,clt_path,timeout,suffix,srv_writer,clt_writer):
def __init__(self, input_path,
srv_path, clt_path, timeout, suffix, srv_writer, clt_writer):
self.input_path = input_path
self.srv_path = srv_path
self.clt_path = clt_path
self.timeout = timeout
self.suffix = suffix
self.srv_path = srv_path
self.clt_path = clt_path
self.timeout = timeout
self.suffix = suffix
self.srv_writer = None
self.clt_writer = None
if None != srv_writer :
self.srv_writer = eval( srv_writer.capitalize() + "Writer" )
if None != clt_writer :
self.clt_writer = eval( clt_writer.capitalize() + "Writer" )
if None != srv_writer:
self.srv_writer = eval(srv_writer.capitalize() + "Writer")
if None != clt_writer:
self.clt_writer = eval(clt_writer.capitalize() + "Writer")
def attention(self):
print("*****************************开始导表*****************************\n")
def can_read(self,file,abspath):
if not os.path.isfile( abspath ): return False
def can_read(self, file, abspath):
if not os.path.isfile(abspath): return False
# ~开头的excel文件是临时文件,linux下wps临时文件以.~开头
if file.startswith( "~" ) \
or file.startswith( "." ) or file.startswith( "$" ): return False
if "" != self.suffix and not file.endswith( self.suffix ): return False
if file.startswith("~") \
or file.startswith(".") or file.startswith("$"): return False
if "" != self.suffix and not file.endswith(self.suffix): return False
if self.timeout > 0:
now = time.time()
mtime = os.path.getmtime( abspath )
mtime = os.path.getmtime(abspath)
if now - mtime > self.timeout: return False
return True
def read(self):
if self.timeout > 0 :
if self.timeout > 0:
print("read %s files from %s modified \
within %d seconds" % (self.suffix,self.input_path,self.timeout))
else :
print("read %s files from %s" % (self.suffix,self.input_path))
within %d seconds" % (self.suffix, self.input_path, self.timeout))
else:
print("read %s files from %s" % (self.suffix, self.input_path))
if None != self.srv_path and not os.path.exists( self.srv_path ) :
os.makedirs( self.srv_path )
if None != self.clt_path and not os.path.exists( self.clt_path ) :
os.makedirs( self.clt_path )
if None != self.srv_path and not os.path.exists(self.srv_path):
os.makedirs(self.srv_path)
if None != self.clt_path and not os.path.exists(self.clt_path):
os.makedirs(self.clt_path)
now = time.time()
file_list = os.listdir( options.input_path )
file_list = os.listdir(options.input_path)
for file in file_list:
abspath = os.path.join( self.input_path,file )
if self.can_read( file,abspath ) :
self.read_one( file,abspath )
abspath = os.path.join(self.input_path, file)
if self.can_read(file, abspath):
self.read_one(file, abspath)
print( "done,%d seconds elapsed" % ( time.time() - now ) )
print("done,%d seconds elapsed" % (time.time() - now))
def read_one(self,file,abspath):
doc = ExcelDoc( file,abspath )
doc.decode( self.srv_path,
self.clt_path,self.srv_writer,self.clt_writer )
def read_one(self, file, abspath):
doc = ExcelDoc(file, abspath)
doc.decode(self.srv_path,
self.clt_path, self.srv_writer, self.clt_writer)
if __name__ == '__main__':
if __name__ == '__main__':
parser = OptionParser()
parser.add_option( "-i", "--input", dest="input_path",
default="xls/",
help="read all files from this path" )
parser.add_option( "-s", "--srv", dest="srv_path",
help="write all server file to this path" )
parser.add_option( "-c", "--clt", dest="clt_path",
help="write all client file to this path" )
parser.add_option( "-t", "--timeout", dest="timeout",type="int",
default="-1",
help="only converte files modified within seconds" )
parser.add_option( "-f", "--suffix", dest="suffix",
default="",
help="what type of file will be readed.empty mean all files" )
parser.add_option( "-w","--swriter", dest="srv_writer",
help="which server writer you wish to use:lua xml json" )
parser.add_option( "-l","--cwriter", dest="clt_writer",
help="which client writer you wish to use:lua xml json" )
parser.add_option("-i", "--input", dest="input_path",
default="xls/",
help="read all files from this path")
parser.add_option("-s", "--srv", dest="srv_path",
help="write all server file to this path")
parser.add_option("-c", "--clt", dest="clt_path",
help="write all client file to this path")
parser.add_option("-t", "--timeout", dest="timeout", type="int",
default="-1",
help="only converte files modified within seconds")
parser.add_option("-f", "--suffix", dest="suffix",
default="",
help="what type of file will be readed.empty mean all files")
parser.add_option("-w", "--swriter", dest="srv_writer",
help="which server writer you wish to use:lua xml json")
parser.add_option("-l", "--cwriter", dest="clt_writer",
help="which client writer you wish to use:lua xml json")
options, args = parser.parse_args()
reader = Reader( options.input_path,options.srv_path,options.clt_path,
options.timeout,options.suffix,options.srv_writer,options.clt_writer )
reader = Reader(options.input_path, options.srv_path, options.clt_path,
options.timeout, options.suffix, options.srv_writer, options.clt_writer)
reader.attention()
reader.read()
reader.read()

+ 18
- 14
src/slpp/slpp-c4d7f69af338f973c0ef21a9a06a145936367229/slpp.py Visa fil

@ -20,6 +20,7 @@ try:
except NameError:
unicode = str
class ParseError(Exception):
pass
@ -40,7 +41,7 @@ class SLPP(object):
def decode(self, text):
if not text or not isinstance(text, basestring):
return
#FIXME: only short comments removed
# FIXME: only short comments removed
reg = re.compile('--.*$', re.M)
text = reg.sub('', text, 0)
self.text = text
@ -71,10 +72,10 @@ class SLPP(object):
s += 'nil'
elif tp in [list, tuple, dict]:
self.depth += 1
if len(obj) == 0 or ( tp is not dict and len(filter(
lambda x: type(x) in (int, float, long) \
or (isinstance(x, basestring) and len(x) < 10), obj
)) == len(obj) ):
if len(obj) == 0 or (tp is not dict and len(filter(
lambda x: type(x) in (int, float, long) \
or (isinstance(x, basestring) and len(x) < 10), obj
)) == len(obj)):
newline = tab = ''
dp = tab * self.depth
s += "%s{%s" % (tab * (self.depth - 2), newline)
@ -117,7 +118,7 @@ class SLPP(object):
return self.object()
if self.ch == "[":
self.next_chr()
if self.ch in ['"', "'", '[']:
if self.ch in ['"', "'", '[']:
return self.string(self.ch)
if self.ch.isdigit() or self.ch == '-':
return self.number()
@ -128,7 +129,7 @@ class SLPP(object):
start = self.ch
if end == '[':
end = ']'
if start in ['"', "'", '[']:
if start in ['"', "'", '[']:
while self.next_chr():
if self.ch == end:
self.next_chr()
@ -152,7 +153,7 @@ class SLPP(object):
if self.ch and self.ch == '}':
self.depth -= 1
self.next_chr()
return o #Exit here
return o # Exit here
else:
while self.ch:
self.white()
@ -164,13 +165,14 @@ class SLPP(object):
self.depth -= 1
self.next_chr()
if k is not None:
o[idx] = k
if not numeric_keys and len([ key for key in o if isinstance(key, (str, unicode, float, bool, tuple))]) == 0:
o[idx] = k
if not numeric_keys and len(
[key for key in o if isinstance(key, (str, unicode, float, bool, tuple))]) == 0:
ar = []
for key in o:
ar.insert(key, o[key])
ar.insert(key, o[key])
o = ar
return o #or here
return o # or here
else:
if self.ch == ',':
self.next_chr()
@ -191,9 +193,10 @@ class SLPP(object):
o[idx] = k
idx += 1
k = None
raise Exception(ERRORS['unexp_end_table']) #Bad exit here
raise Exception(ERRORS['unexp_end_table']) # Bad exit here
words = {'true': True, 'false': False, 'nil': None}
def word(self):
s = ''
if self.ch != '\n':
@ -211,6 +214,7 @@ class SLPP(object):
if not self.ch or not self.ch.isdigit():
raise ParseError(err)
return n
n = ''
try:
if self.ch == '-':
@ -251,7 +255,7 @@ class SLPP(object):
def hex(self):
n = ''
while self.ch and \
(self.ch in 'ABCDEFabcdef' or self.ch.isdigit()):
(self.ch in 'ABCDEFabcdef' or self.ch.isdigit()):
n += self.ch
self.next_chr()
return n

+ 3
- 2
src/slpp/slpp-c4d7f69af338f973c0ef21a9a06a145936367229/tests.py Visa fil

@ -81,8 +81,6 @@ Key: {2}, item: {3}'''.format(value, origin, key, item))
assert value == origin, '{0} not match original: {1}.'.format(value, origin)
def number_test():
"""
Integer and float:
@ -148,6 +146,7 @@ def table_test():
"""
pass
def string_test():
r"""
Escape test:
@ -158,6 +157,7 @@ def string_test():
"""
pass
def basic_test():
"""
No data loss:
@ -179,4 +179,5 @@ def unicode_test():
if __name__ == '__main__':
import doctest
doctest.testmod()

+ 18
- 14
src/slpp/slpp.py Visa fil

@ -20,6 +20,7 @@ try:
except NameError:
unicode = str
class ParseError(Exception):
pass
@ -40,7 +41,7 @@ class SLPP(object):
def decode(self, text):
if not text or not isinstance(text, basestring):
return
#FIXME: only short comments removed
# FIXME: only short comments removed
reg = re.compile('--.*$', re.M)
text = reg.sub('', text, 0)
self.text = text
@ -71,10 +72,10 @@ class SLPP(object):
s += 'nil'
elif tp in [list, tuple, dict]:
self.depth += 1
if len(obj) == 0 or ( tp is not dict and len(filter(
lambda x: type(x) in (int, float, long) \
or (isinstance(x, basestring) and len(x) < 10), obj
)) == len(obj) ):
if len(obj) == 0 or (tp is not dict and len(filter(
lambda x: type(x) in (int, float, long) \
or (isinstance(x, basestring) and len(x) < 10), obj
)) == len(obj)):
newline = tab = ''
dp = tab * self.depth
s += "%s{%s" % (tab * (self.depth - 2), newline)
@ -117,7 +118,7 @@ class SLPP(object):
return self.object()
if self.ch == "[":
self.next_chr()
if self.ch in ['"', "'", '[']:
if self.ch in ['"', "'", '[']:
return self.string(self.ch)
if self.ch.isdigit() or self.ch == '-':
return self.number()
@ -128,7 +129,7 @@ class SLPP(object):
start = self.ch
if end == '[':
end = ']'
if start in ['"', "'", '[']:
if start in ['"', "'", '[']:
while self.next_chr():
if self.ch == end:
self.next_chr()
@ -152,7 +153,7 @@ class SLPP(object):
if self.ch and self.ch == '}':
self.depth -= 1
self.next_chr()
return o #Exit here
return o # Exit here
else:
while self.ch:
self.white()
@ -164,13 +165,14 @@ class SLPP(object):
self.depth -= 1
self.next_chr()
if k is not None:
o[idx] = k
if not numeric_keys and len([ key for key in o if isinstance(key, (str, unicode, float, bool, tuple))]) == 0:
o[idx] = k
if not numeric_keys and len(
[key for key in o if isinstance(key, (str, unicode, float, bool, tuple))]) == 0:
ar = []
for key in o:
ar.insert(key, o[key])
ar.insert(key, o[key])
o = ar
return o #or here
return o # or here
else:
if self.ch == ',':
self.next_chr()
@ -191,9 +193,10 @@ class SLPP(object):
o[idx] = k
idx += 1
k = None
raise Exception(ERRORS['unexp_end_table']) #Bad exit here
raise Exception(ERRORS['unexp_end_table']) # Bad exit here
words = {'true': True, 'false': False, 'nil': None}
def word(self):
s = ''
if self.ch != '\n':
@ -211,6 +214,7 @@ class SLPP(object):
if not self.ch or not self.ch.isdigit():
raise ParseError(err)
return n
n = ''
try:
if self.ch == '-':
@ -251,7 +255,7 @@ class SLPP(object):
def hex(self):
n = ''
while self.ch and \
(self.ch in 'ABCDEFabcdef' or self.ch.isdigit()):
(self.ch in 'ABCDEFabcdef' or self.ch.isdigit()):
n += self.ch
self.next_chr()
return n

+ 3
- 2
src/slpp/tests.py Visa fil

@ -81,8 +81,6 @@ Key: {2}, item: {3}'''.format(value, origin, key, item))
assert value == origin, '{0} not match original: {1}.'.format(value, origin)
def number_test():
"""
Integer and float:
@ -148,6 +146,7 @@ def table_test():
"""
pass
def string_test():
r"""
Escape test:
@ -158,6 +157,7 @@ def string_test():
"""
pass
def basic_test():
"""
No data loss:
@ -179,4 +179,5 @@ def unicode_test():
if __name__ == '__main__':
import doctest
doctest.testmod()

+ 13
- 14
src/writer.py Visa fil

@ -1,11 +1,6 @@
#! python
# -*- coding:utf-8 -*-
import os
import sys
import json
from xml.dom.minidom import Document
try:
basestring
except NameError:
@ -27,31 +22,35 @@ BASE_LENGTH = 60
BASE_INDENT = " "
INDENT_LIST = {}
class Writer(object):
def __init__(self,doc_name,sheet_name, base_name, keys_list, comment_text, is_list):
def __init__(self, doc_name, sheet_name, base_name, keys_list, comment_text, is_list):
# 文件名包含中文则需要转unicode
#self.doc_name = unicode(doc_name, "utf-8")
self.doc_name = doc_name
# self.doc_name = unicode(doc_name, "utf-8")
self.doc_name = doc_name
self.sheet_name = sheet_name
self.base_name = base_name
self.keys_list = keys_list
self.comment_text = comment_text
self.base_name = base_name
self.keys_list = keys_list
self.comment_text = comment_text
self.is_list = is_list
# 文件后缀
def suffix(self):
pass
# 文件内容
def context(self,ctx):
def context(self, ctx):
pass
# 注释开始
def comment_start(self):
pass
# 注释结束
def comment_end(self):
pass
# 文件注释(千万不要加时间,影响svn)
def comment(self):
comment = []
return "".join( comment )
return "".join(comment)

+ 126
- 129
src/writer_elixir.py Visa fil

@ -1,8 +1,6 @@
#! python
# -*- coding:utf-8 -*-
import os
import sys
from writer import *
try:
@ -26,6 +24,7 @@ BASE_LENGTH = 60
BASE_INDENT = " "
INDENT_LIST = {}
class ElixirWriter(Writer):
# 文件后缀
def suffix(self):
@ -39,42 +38,42 @@ class ElixirWriter(Writer):
'\ndefmodule ' + self.base_name.title() + ' do\n\n'
]
return "\n".join( comment )
return "\n".join(comment)
# 获取缩进字符串
def indent_ctx( self,indent ):
def indent_ctx(self, indent):
if indent <= 0: return ""
if indent not in INDENT_LIST:
INDENT_LIST[indent] = ""
else:
ctx = BASE_INDENT*indent
ctx = BASE_INDENT * indent
INDENT_LIST[indent] = ctx
return INDENT_LIST[indent]
def dict_to_text(self, value, indent) :
def dict_to_text(self, value, indent):
dict_text_list = []
for k in ( value ) :
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( value[k],indent + 1 )
for k in (value):
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(value[k], indent + 1)
comment = self.comment_text[k]
val_type = type( lk )
if str == val_type :
if lk.replace(".", "").isdigit() :
val_type = type(lk)
if str == val_type:
if lk.replace(".", "").isdigit():
lk.replace("\"", "")
else :
else:
lk = ':' + lk.replace("\"", "")
key = "".join( [" def get(",lk,") do\n"] )
key = "".join([" def get(", lk, ") do\n"])
val = "".join( [" ## ", comment, "\n", key, " ", lv, "\n end\n\n"] )
val = "".join([" ## ", comment, "\n", key, " ", lv, "\n end\n\n"])
dict_text_list.append( val )
dict_text_list.append(val)
dict_str = "".join( dict_text_list )
dict_str = "".join(dict_text_list)
dict_str = dict_str + " def get(_) do\n :undefined\n end\n\nend"
return False, dict_str
@ -84,78 +83,78 @@ class ElixirWriter(Writer):
struct_text_list = []
struct_len = len(self.comment_text)
tem_count = 0
for k in self.comment_text :
for k in self.comment_text:
tem_count += 1
comment = self.comment_text[k]
k_indent,lk = self.to_target_lang( k,indent )
val_type = type( lk )
if str == val_type :
if lk.replace(".", "").isdigit() :
k_indent, lk = self.to_target_lang(k, indent)
val_type = type(lk)
if str == val_type:
if lk.replace(".", "").isdigit():
lk.replace("\"", "")
else :
else:
lk = ':' + lk.replace("\"", "")
if tem_count != struct_len :
if tem_count != struct_len:
lk = lk + ','
else :
else:
lk = lk
if None == comment :
if None == comment:
comment = ""
val = "".join( [lk.ljust(20, " "), "\t## ", comment, "\n"] )
val = "".join([lk.ljust(20, " "), "\t## ", comment, "\n"])
struct_text_list.append( val )
struct_text_list.append(val)
struct_str = " ".join( struct_text_list )
struct_str = " ".join(struct_text_list)
end_str = " defstruct [\n " + struct_str + " ]\n\n"
list_text_list.append(end_str)
all_key_list = []
# 生成 get() 函数
for i, onedict in enumerate( value ) :
for i, onedict in enumerate(value):
# 生成对应的 key
key_list = []
for k in ( onedict ) :
if None != self.keys_list.get(k, None) :
is_indent,lv = self.to_target_lang( onedict[k],indent + 1 )
for k in (onedict):
if None != self.keys_list.get(k, None):
is_indent, lv = self.to_target_lang(onedict[k], indent + 1)
key_list.append(lv)
all_key_list.append(key_list)
tem = ", ".join( key_list )
tem = ", ".join(key_list)
key = "".join( [" def get(",tem,") do\n %", self.base_name.title(), "{\n "] )
key = "".join([" def get(", tem, ") do\n %", self.base_name.title(), "{\n "])
# 生成对应的value
value_list = []
onedict_len = len(onedict)
tem_count = 0
for k in ( onedict ) :
for k in (onedict):
tem_count += 1
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( onedict[k],indent + 1 )
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(onedict[k], indent + 1)
val_type = type( lk )
if str == val_type :
if lk.replace(".", "").isdigit() :
val_type = type(lk)
if str == val_type:
if lk.replace(".", "").isdigit():
lk.replace("\"", "")
else :
else:
lk = ':' + lk.replace("\"", "")
if tem_count != onedict_len :
oneval = "".join( [lk, " => ", lv , ",\n"] )
value_list.append( oneval )
else :
oneval = "".join( [lk, " => ", lv , "\n"] )
value_list.append( oneval )
if tem_count != onedict_len:
oneval = "".join([lk, " => ", lv, ",\n"])
value_list.append(oneval)
else:
oneval = "".join([lk, " => ", lv, "\n"])
value_list.append(oneval)
value_list_str = " ".join(value_list)
end_str = "".join( [key, value_list_str, " }\n end\n\n"] )
end_str = "".join([key, value_list_str, " }\n end\n\n"])
list_text_list.append( end_str )
list_text_list.append(end_str)
underline_list = []
for i in self.keys_list :
for i in self.keys_list:
underline_list.append('_')
end_str = ", ".join(underline_list)
@ -167,153 +166,151 @@ class ElixirWriter(Writer):
get_all_fun = []
allkey_len = len(all_key_list)
tem_count = 0
for i, ival in enumerate(all_key_list) :
for i, ival in enumerate(all_key_list):
tem_count += 1
if tem_count != allkey_len :
if tem_count != allkey_len:
oneval = '{' + ", ".join(ival) + '},\n'
get_all_fun.append(oneval)
else :
else:
oneval = '{' + ", ".join(ival) + '}\n'
get_all_fun.append(oneval)
value_list_str = " ".join(get_all_fun)
start_str = ' def get_all() do\n [\n '
end_str = "".join( [start_str, value_list_str, " ]\n end\n\n"] )
end_str = "".join([start_str, value_list_str, " ]\n end\n\n"])
list_text_list.append( end_str )
list_text_list.append(end_str)
# 生成 get_list() 函数
get_list_fun = []
keys_len = len(self.keys_list)
for key in self.keys_list :
for key in self.keys_list:
keyindex = self.keys_list[key]
if keyindex == 1 :
list_text_list.append( ' def get_list() do\n get_all()\n end\n\n')
elif keyindex <= keys_len :
if keyindex == 1:
list_text_list.append(' def get_list() do\n get_all()\n end\n\n')
elif keyindex <= keys_len:
get_tem_dict = {}
underline_list = []
for i, ival in enumerate(all_key_list) :
for i, ival in enumerate(all_key_list):
key_tem_list = []
j = 0
underline_list = []
while j < keyindex - 1 :
while j < keyindex - 1:
key_tem_list.append(ival[j])
underline_list.append('_')
j += 1
keystr = '(' + ", ".join(key_tem_list) + ')'
if None != get_tem_dict.get(keystr, None) :
if None != get_tem_dict.get(keystr, None):
oldlist = get_tem_dict[keystr]
oldlist.append(ival)
get_tem_dict[keystr] = oldlist
else :
else:
get_tem_dict[keystr] = [ival]
for onekey in get_tem_dict :
for onekey in get_tem_dict:
value_tem_list = []
valuelist = get_tem_dict[onekey]
value_len = len(valuelist)
tem_count = 0
for l, lval in enumerate(valuelist) :
for l, lval in enumerate(valuelist):
tem_count += 1
if tem_count != value_len :
if tem_count != value_len:
oneval = '{' + ", ".join(lval) + '},\n'
value_tem_list.append(oneval)
else :
else:
oneval = '{' + ", ".join(lval) + '}\n'
value_tem_list.append(oneval)
start_str = ' def get_list' + onekey + ' do\n [\n '
end_str = "".join( [start_str, " ".join(value_tem_list), " ]\n end\n\n"] )
end_str = "".join([start_str, " ".join(value_tem_list), " ]\n end\n\n"])
get_list_fun.append(end_str)
no_match_str = "".join(' def get_list(' + ", ".join(underline_list) + ') do\n []\n end\n\n')
no_match_str = "".join(
' def get_list(' + ", ".join(underline_list) + ') do\n []\n end\n\n')
get_list_fun.append(no_match_str)
value_list_str = "".join(get_list_fun) + 'end'
list_text_list.append( value_list_str )
dict_str = "".join( list_text_list )
list_text_list.append(value_list_str)
dict_str = "".join(list_text_list)
return False, dict_str
# 转换为文本数据 之前解析出来的excel数据存放方式存在LIST(array格式)和DICT(object格式)两种类型
def to_text(self,value,indent):
val_type = type( value )
if dict == val_type :
return self.dict_to_text(value, indent)
else :
return self.list_to_text(value, indent)
def to_text(self, value, indent):
val_type = type(value)
if dict == val_type:
return self.dict_to_text(value, indent)
else:
return self.list_to_text(value, indent)
# python的dict转换为elixir的map类型
def dict_to_elixir(self,value,indent):
def dict_to_elixir(self, value, indent):
dict_ctx_list = []
for k in ( value ) :
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( value[k],indent + 1 )
for k in (value):
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(value[k], indent + 1)
val_type = type( lk )
if str == val_type :
if lk.replace(".", "").isdigit() :
val_type = type(lk)
if str == val_type:
if lk.replace(".", "").isdigit():
lk.replace("\"", "")
else :
else:
lk = ':' + lk.replace("\"", "")
key = "".join( [lk," => "] )
val = "".join( [key, lv] )
key = "".join([lk, " => "])
val = "".join([key, lv])
dict_ctx_list.append(val)
dict_str = ", ".join( dict_ctx_list )
return False,"".join( ["%{",dict_str,"}"] )
dict_str = ", ".join(dict_ctx_list)
return False, "".join(["%{", dict_str, "}"])
# python的list转换为elixir的list类型
def list_to_elixir(self,value,indent):
def list_to_elixir(self, value, indent):
list_ctx_list = []
for v in value :
is_indent,lv = self.to_target_lang( v,indent + 1 )
list_ctx_list.append( lv )
for v in value:
is_indent, lv = self.to_target_lang(v, indent + 1)
list_ctx_list.append(lv)
list_str = ", ".join( list_ctx_list )
return False,"".join( ["[",list_str,"]"] )
list_str = ", ".join(list_ctx_list)
return False, "".join(["[", list_str, "]"])
# python的tuple转换为elixir的tuple类型
def tuple_to_elixir(self,value,indent):
def tuple_to_elixir(self, value, indent):
tuple_ctx_list = []
for v in value :
is_indent,lv = self.to_target_lang( v,indent + 1 )
tuple_ctx_list.append( lv )
for v in value:
is_indent, lv = self.to_target_lang(v, indent + 1)
tuple_ctx_list.append(lv)
# 返回 {a,b,c}这种不换行的格式
list_str = ", ".join( tuple_ctx_list )
return False,"".join( ["{",list_str,"}"] )
list_str = ", ".join(tuple_ctx_list)
return False, "".join(["{", list_str, "}"])
# 变量转换到目标语言字符串
def to_target_lang(self,value,indent):
val_type = type( value )
if int == val_type :
return False,str( value )
elif long == val_type :
return False,str( value )
elif float == val_type :
def to_target_lang(self, value, indent):
val_type = type(value)
if int == val_type:
return False, str(value)
elif long == val_type:
return False, str(value)
elif float == val_type:
# 1001.0 -->> 001 去除多余小数点
if int( value ) == value :
return False,str( int(value) )
return False,str( value )
if int(value) == value:
return False, str(int(value))
return False, str(value)
elif str == val_type or unicode == val_type:
return False, "".join(["\"",value,"\""])
elif tuple == val_type :
return self.tuple_to_elixir(value,indent)
elif dict == val_type :
return self.dict_to_elixir(value,indent)
elif list == val_type :
return self.list_to_elixir(value,indent)
else :
raise Exception( "invalid type",val_type )
#文件内容
def context(self,ctx):
is_indent,str_ctx = self.to_text( ctx,0 )
return "".join( [self.comment(),"",str_ctx] )
return False, "".join(["\"", value, "\""])
elif tuple == val_type:
return self.tuple_to_elixir(value, indent)
elif dict == val_type:
return self.dict_to_elixir(value, indent)
elif list == val_type:
return self.list_to_elixir(value, indent)
else:
raise Exception("invalid type", val_type)
# 文件内容
def context(self, ctx):
is_indent, str_ctx = self.to_text(ctx, 0)
return "".join([self.comment(), "", str_ctx])

+ 97
- 99
src/writer_erlang_erl.py Visa fil

@ -1,8 +1,6 @@
#! python
# -*- coding:utf-8 -*-
import os
import sys
from writer import *
try:
@ -26,6 +24,7 @@ BASE_LENGTH = 60
BASE_INDENT = " "
INDENT_LIST = {}
class ErlangerlWriter(Writer):
# 文件后缀
def suffix(self):
@ -40,41 +39,41 @@ class ErlangerlWriter(Writer):
'\n'
]
return "\n".join( comment )
return "\n".join(comment)
# 获取缩进字符串
def indent_ctx( self,indent ):
def indent_ctx(self, indent):
if indent <= 0: return ""
if indent not in INDENT_LIST:
INDENT_LIST[indent] = ""
else:
ctx = BASE_INDENT*indent
ctx = BASE_INDENT * indent
INDENT_LIST[indent] = ctx
return INDENT_LIST[indent]
def dict_to_text(self, value, indent) :
def dict_to_text(self, value, indent):
dict_text_list = []
dict_text_list.append("-compile([export_all, nowarn_export_all]).\n\n")
for k in ( value ) :
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( value[k],indent + 1 )
for k in (value):
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(value[k], indent + 1)
comment = self.comment_text[k]
val_type = type( lk )
if str == val_type :
val_type = type(lk)
if str == val_type:
lk = lk.replace("<<\"", "\'")
lk = lk.replace("\"/utf8>>", "\'")
key = "".join( ["get(",lk,") ->\n"] )
key = "".join(["get(", lk, ") ->\n"])
val = "".join( ["%% ", comment, "\n", key, " ", lv, ";\n\n"] )
val = "".join(["%% ", comment, "\n", key, " ", lv, ";\n\n"])
dict_text_list.append( val )
dict_text_list.append(val)
dict_str = "".join( dict_text_list )
dict_str = "".join(dict_text_list)
dict_str = dict_str + "get(_) ->\n undefined."
return False, dict_str
@ -84,41 +83,41 @@ class ErlangerlWriter(Writer):
list_text_list.append(val)
all_key_list = []
# 生成 get() 函数
for i, onedict in enumerate( value ) :
for i, onedict in enumerate(value):
# 生成对应的 key
key_list = []
for k in ( onedict ) :
if None != self.keys_list.get(k, None) :
is_indent,lv = self.to_target_lang( onedict[k],indent + 1 )
for k in (onedict):
if None != self.keys_list.get(k, None):
is_indent, lv = self.to_target_lang(onedict[k], indent + 1)
key_list.append(lv)
all_key_list.append(key_list)
tem = ", ".join( key_list )
tem = ", ".join(key_list)
key = "".join( ["get(",tem,") ->\n #", self.base_name, "{\n "] )
key = "".join(["get(", tem, ") ->\n #", self.base_name, "{\n "])
# 生成对应的value
value_list = []
for k in ( onedict ) :
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( onedict[k],indent + 1 )
for k in (onedict):
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(onedict[k], indent + 1)
val_type = type( lk )
if str == val_type :
val_type = type(lk)
if str == val_type:
lk = lk.replace("<<\"", "\'")
lk = lk.replace("\"/utf8>>", "\'")
oneval = "".join( [lk, " = ", lv , "\n"] )
oneval = "".join([lk, " = ", lv, "\n"])
value_list.append( oneval )
value_list.append(oneval)
value_list_str = " , ".join(value_list)
end_str = "".join( [key, value_list_str, "};\n\n"] )
end_str = "".join([key, value_list_str, "};\n\n"])
list_text_list.append( end_str )
list_text_list.append(end_str)
underline_list = []
for i in self.keys_list :
for i in self.keys_list:
underline_list.append('_')
end_str = ", ".join(underline_list)
@ -128,134 +127,133 @@ class ErlangerlWriter(Writer):
# 生成 get_all() 函数
get_all_fun = []
for i, ival in enumerate(all_key_list) :
for i, ival in enumerate(all_key_list):
oneval = '{' + ", ".join(ival) + '}\n'
get_all_fun.append(oneval)
value_list_str = " , ".join(get_all_fun)
start_str = 'getList() ->\n [\n '
end_str = "".join( [start_str, value_list_str, " ].\n\n"] )
end_str = "".join([start_str, value_list_str, " ].\n\n"])
# 生成 get_list() 函数
get_list_fun = []
keys_len = len(self.keys_list)
for key in self.keys_list :
for key in self.keys_list:
keyindex = self.keys_list[key]
if keyindex == 1 :
if keyindex == 1:
"skip"
elif keyindex <= keys_len :
elif keyindex <= keys_len:
get_tem_dict = {}
underline_list = []
for i, ival in enumerate(all_key_list) :
for i, ival in enumerate(all_key_list):
key_tem_list = []
j = 0
underline_list = []
while j < keyindex - 1 :
while j < keyindex - 1:
key_tem_list.append(ival[j])
underline_list.append('_')
j += 1
keystr = '(' + ", ".join(key_tem_list) + ')'
if None != get_tem_dict.get(keystr, None) :
if None != get_tem_dict.get(keystr, None):
oldlist = get_tem_dict[keystr]
oldlist.append(ival)
get_tem_dict[keystr] = oldlist
else :
else:
get_tem_dict[keystr] = [ival]
for onekey in get_tem_dict :
for onekey in get_tem_dict:
value_tem_list = []
valuelist = get_tem_dict[onekey]
for l, lval in enumerate(valuelist) :
for l, lval in enumerate(valuelist):
oneval = '{' + ", ".join(lval) + '}\n'
value_tem_list.append(oneval)
start = 'getList' + onekey + ' ->\n [\n '
val = "".join( [start, " , ".join(value_tem_list), " ];\n\n"] )
val = "".join([start, " , ".join(value_tem_list), " ];\n\n"])
get_list_fun.append(val)
no_match_str = "".join('getList(' + ", ".join(underline_list) + ') ->\n [].\n\n')
get_list_fun.append(no_match_str)
if self.is_list == True:
value_list = "".join(get_list_fun)
list_text_list.append( end_str )
list_text_list.append( value_list )
dict_str = "".join( list_text_list )
list_text_list.append(end_str)
list_text_list.append(value_list)
dict_str = "".join(list_text_list)
return False, dict_str
# 转换为文本数据 之前解析出来的excel数据存放方式存在LIST(array格式)和DICT(object格式)两种类型
def to_text(self,value,indent):
val_type = type( value )
if dict == val_type :
return self.dict_to_text(value, indent)
else :
return self.list_to_text(value, indent)
def to_text(self, value, indent):
val_type = type(value)
if dict == val_type:
return self.dict_to_text(value, indent)
else:
return self.list_to_text(value, indent)
# python的dict转换为erlang的map类型
def dict_to_erlang(self,value,indent):
def dict_to_erlang(self, value, indent):
dict_ctx_list = []
for k in ( value ) :
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( value[k],indent + 1 )
for k in (value):
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(value[k], indent + 1)
val_type = type( lk )
if str == val_type :
val_type = type(lk)
if str == val_type:
lk = lk.replace("<<\"", "\'")
lk = lk.replace("\"/utf8>>", "\'")
key = "".join( [lk," => "] )
val = "".join( [key, lv] )
key = "".join([lk, " => "])
val = "".join([key, lv])
dict_ctx_list.append(val)
dict_str = ", ".join( dict_ctx_list )
return False,"".join( ["#{",dict_str,"}"] )
dict_str = ", ".join(dict_ctx_list)
return False, "".join(["#{", dict_str, "}"])
# python的list转换为erlang的list类型
def list_to_erlang(self,value,indent):
def list_to_erlang(self, value, indent):
list_ctx_list = []
for v in value :
is_indent,lv = self.to_target_lang( v,indent + 1 )
list_ctx_list.append( lv )
for v in value:
is_indent, lv = self.to_target_lang(v, indent + 1)
list_ctx_list.append(lv)
list_str = ", ".join( list_ctx_list )
return False,"".join( ["[",list_str,"]"] )
list_str = ", ".join(list_ctx_list)
return False, "".join(["[", list_str, "]"])
# python的tuple转换为erlang的tuple类型
def tuple_to_erlang(self,value,indent):
def tuple_to_erlang(self, value, indent):
tuple_ctx_list = []
for v in value :
is_indent,lv = self.to_target_lang( v,indent + 1 )
tuple_ctx_list.append( lv )
for v in value:
is_indent, lv = self.to_target_lang(v, indent + 1)
tuple_ctx_list.append(lv)
# 返回 {a,b,c}这种不换行的格式
list_str = ", ".join( tuple_ctx_list )
return False,"".join( ["{",list_str,"}"] )
list_str = ", ".join(tuple_ctx_list)
return False, "".join(["{", list_str, "}"])
# 变量转换到目标语言的字符串
def to_target_lang(self,value,indent):
val_type = type( value )
if int == val_type :
return False,str( value )
elif long == val_type :
return False,str( value )
elif float == val_type :
def to_target_lang(self, value, indent):
val_type = type(value)
if int == val_type:
return False, str(value)
elif long == val_type:
return False, str(value)
elif float == val_type:
# 1001.0 -->> 001 去除多余小数点
if int( value ) == value :
return False,str( int(value) )
return False,str( value )
if int(value) == value:
return False, str(int(value))
return False, str(value)
elif str == val_type or unicode == val_type:
return False, "".join(["<<\"",value,"\"/utf8>>"])
elif tuple == val_type :
return self.tuple_to_erlang(value,indent)
elif dict == val_type :
return self.dict_to_erlang(value,indent)
elif list == val_type :
return self.list_to_erlang(value,indent)
else :
raise Exception( "invalid type",val_type )
#文件内容
def context(self,ctx):
is_indent,str_ctx = self.to_text( ctx,0 )
return "".join( [self.comment(),"",str_ctx] )
return False, "".join(["<<\"", value, "\"/utf8>>"])
elif tuple == val_type:
return self.tuple_to_erlang(value, indent)
elif dict == val_type:
return self.dict_to_erlang(value, indent)
elif list == val_type:
return self.list_to_erlang(value, indent)
else:
raise Exception("invalid type", val_type)
# 文件内容
def context(self, ctx):
is_indent, str_ctx = self.to_text(ctx, 0)
return "".join([self.comment(), "", str_ctx])

+ 68
- 70
src/writer_erlang_hrl.py Visa fil

@ -1,8 +1,6 @@
#! python
# -*- coding:utf-8 -*-
import os
import sys
from writer import *
try:
@ -26,6 +24,7 @@ BASE_LENGTH = 60
BASE_INDENT = " "
INDENT_LIST = {}
class ErlanghrlWriter(Writer):
# 文件后缀
def suffix(self):
@ -33,120 +32,119 @@ class ErlanghrlWriter(Writer):
def comment(self):
comment = [
'%% Automatic generation from -->>'
'%% Automatic generation from -->>'
'\n%% excel file name : ' + self.doc_name +
'\n%% excel sheet name : ' + self.sheet_name,
'\n-record(' + self.base_name + ', {\n '
]
return "\n".join( comment )
return "\n".join(comment)
# 获取缩进字符串
def indent_ctx( self,indent ) :
def indent_ctx(self, indent):
if indent <= 0: return ""
if indent not in INDENT_LIST :
if indent not in INDENT_LIST:
INDENT_LIST[indent] = ""
else :
ctx = BASE_INDENT*indent
else:
ctx = BASE_INDENT * indent
INDENT_LIST[indent] = ctx
return INDENT_LIST[indent]
def list_to_text(self, value, indent):
list_text_list = []
for k in self.comment_text :
for k in self.comment_text:
comment = self.comment_text[k]
k_indent,lk = self.to_target_lang( k,indent )
val_type = type( lk )
if str == val_type :
k_indent, lk = self.to_target_lang(k, indent)
val_type = type(lk)
if str == val_type:
lk = lk.replace("\"", "\'")
if None == comment :
if None == comment:
comment = ""
val = "".join( [lk.ljust(20, " "), "\t%% ", comment, "\n"] )
val = "".join([lk.ljust(20, " "), "\t%% ", comment, "\n"])
list_text_list.append( val )
list_text_list.append(val)
list_str = " , ".join( list_text_list )
list_str = " , ".join(list_text_list)
list_str = list_str + "})."
return False, list_str
# 转换为文本数据 之前解析出来的excel数据存放方式存在LIST(array格式)和DICT(object格式)两种类型
def to_text(self,value,indent):
val_type = type( value )
if list == val_type :
return self.list_to_text(value, indent)
else :
def to_text(self, value, indent):
val_type = type(value)
if list == val_type:
return self.list_to_text(value, indent)
else:
return False, None
# python的dict转换为erlang的map类型
def dict_to_erlang(self,value,indent):
def dict_to_erlang(self, value, indent):
dict_ctx_list = []
for k in ( value ) :
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( value[k],indent + 1 )
for k in (value):
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(value[k], indent + 1)
val_type = type( lk )
if str == val_type :
val_type = type(lk)
if str == val_type:
lk = lk.replace("\"", "\'")
key = "".join( [lk," => "] )
val = "".join( [key, lv] )
key = "".join([lk, " => "])
val = "".join([key, lv])
dict_ctx_list.append(val)
dict_str = ",".join( dict_ctx_list )
return False,"".join( ["#{",dict_str,"}"] )
dict_str = ",".join(dict_ctx_list)
return False, "".join(["#{", dict_str, "}"])
# python的list转换为erlang的list类型
def list_to_erlang(self,value,indent):
def list_to_erlang(self, value, indent):
list_ctx_list = []
for v in value :
is_indent,lv = self.to_target_lang( v,indent + 1 )
list_ctx_list.append( lv )
for v in value:
is_indent, lv = self.to_target_lang(v, indent + 1)
list_ctx_list.append(lv)
list_str = ",".join( list_ctx_list )
return False,"".join( ["[",list_str,"]"] )
list_str = ",".join(list_ctx_list)
return False, "".join(["[", list_str, "]"])
# python的tuple转换为erlang的tuple类型
def tuple_to_erlang(self,value,indent):
def tuple_to_erlang(self, value, indent):
tuple_ctx_list = []
for v in value :
is_indent,lv = self.to_target_lang( v,indent + 1 )
tuple_ctx_list.append( lv )
for v in value:
is_indent, lv = self.to_target_lang(v, indent + 1)
tuple_ctx_list.append(lv)
# 返回 {a,b,c}这种不换行的格式
list_str = ",".join( tuple_ctx_list )
return False,"".join( ["{",list_str,"}"] )
list_str = ",".join(tuple_ctx_list)
return False, "".join(["{", list_str, "}"])
# 变量转换到目标语言的字符串
def to_target_lang(self,value,indent):
val_type = type( value )
if int == val_type :
return False,str( value )
elif long == val_type :
return False,str( value )
elif float == val_type :
def to_target_lang(self, value, indent):
val_type = type(value)
if int == val_type:
return False, str(value)
elif long == val_type:
return False, str(value)
elif float == val_type:
# 1001.0 -->> 001 去除多余小数点
if int( value ) == value :
return False,str( int(value) )
return False,str( value )
if int(value) == value:
return False, str(int(value))
return False, str(value)
elif str == val_type or unicode == val_type:
return False, "".join(["\"",value,"\""])
elif tuple == val_type :
return self.tuple_to_erlang(value,indent)
elif dict == val_type :
return self.dict_to_erlang(value,indent)
elif list == val_type :
return self.list_to_erlang(value,indent)
else :
raise Exception( "invalid type",val_type )
#文件内容
def context(self,ctx):
is_indent,str_ctx = self.to_text( ctx,0 )
if None != str_ctx :
return "".join( [self.comment(),"",str_ctx] )
else :
return False, "".join(["\"", value, "\""])
elif tuple == val_type:
return self.tuple_to_erlang(value, indent)
elif dict == val_type:
return self.dict_to_erlang(value, indent)
elif list == val_type:
return self.list_to_erlang(value, indent)
else:
raise Exception("invalid type", val_type)
# 文件内容
def context(self, ctx):
is_indent, str_ctx = self.to_text(ctx, 0)
if None != str_ctx:
return "".join([self.comment(), "", str_ctx])
else:
return None

+ 5
- 8
src/writer_json_array.py Visa fil

@ -1,9 +1,8 @@
#! python
# -*- coding:utf-8 -*-
import os
import sys
import json
from writer import *
try:
@ -27,15 +26,13 @@ BASE_LENGTH = 60
BASE_INDENT = " "
INDENT_LIST = {}
class JsonarrayWriter(Writer):
# 文件后缀
def suffix(self):
return ".json"
# 文件内容(字符串)
def context(self,ctx):
return json.dumps(ctx,ensure_ascii=False,\
indent=4,sort_keys=True,separators=(',', ':') )
def context(self, ctx):
return json.dumps(ctx, ensure_ascii=False, \
indent=4, sort_keys=True, separators=(',', ':'))

+ 85
- 89
src/writer_json_object.py Visa fil

@ -1,8 +1,6 @@
#! python
# -*- coding:utf-8 -*-
import os
import sys
from writer import *
try:
@ -26,6 +24,7 @@ BASE_LENGTH = 60
BASE_INDENT = " "
INDENT_LIST = {}
class JsonobjectWriter(Writer):
# 文件后缀
def suffix(self):
@ -33,41 +32,41 @@ class JsonobjectWriter(Writer):
def comment(self):
comment = []
return "\n".join( comment )
return "\n".join(comment)
# 获取缩进字符串
def indent_ctx( self,indent ):
def indent_ctx(self, indent):
if indent <= 0: return ""
if indent not in INDENT_LIST:
ctx = BASE_INDENT*indent
ctx = BASE_INDENT * indent
INDENT_LIST[indent] = ctx
return INDENT_LIST[indent]
def dict_to_text(self, value, indent) :
def dict_to_text(self, value, indent):
dict_ctx_list = []
is_indent,lv = self.to_target_lang( value, indent)
is_indent, lv = self.to_target_lang(value, indent)
dict_ctx_list.append(lv)
dict_str = "".join( dict_ctx_list )
dict_str = "".join(dict_ctx_list)
return False,"".join( [dict_str] )
return False, "".join([dict_str])
def list_to_dit(self, cur_key_index, total_key_cnt, onedict, storge_dict) :
for k in ( onedict ) :
def list_to_dit(self, cur_key_index, total_key_cnt, onedict, storge_dict):
for k in (onedict):
key_index = self.keys_list.get(k, None)
if None != key_index and key_index == cur_key_index :
if None != key_index and key_index == cur_key_index:
lv = onedict[k]
if cur_key_index == total_key_cnt :
if cur_key_index == total_key_cnt:
storge_dict[lv] = onedict
else :
if None != storge_dict.get(lv, None) :
else:
if None != storge_dict.get(lv, None):
olddict = storge_dict[lv]
new_storge_dict = olddict
self.list_to_dit(cur_key_index + 1, total_key_cnt, onedict, new_storge_dict)
else :
storge_dict[lv] ={}
else:
storge_dict[lv] = {}
new_storge_dict = storge_dict[lv]
self.list_to_dit(cur_key_index + 1, total_key_cnt, onedict, new_storge_dict)
@ -77,77 +76,76 @@ class JsonobjectWriter(Writer):
## 处理多个key的情况
key_value_list = {}
key_cnt = len(self.keys_list)
for i, onedict in enumerate( value ) :
for i, onedict in enumerate(value):
self.list_to_dit(1, key_cnt, onedict, key_value_list)
is_indent,lv = self.to_target_lang( key_value_list, 0 )
list_str = "".join( lv )
is_indent, lv = self.to_target_lang(key_value_list, 0)
list_str = "".join(lv)
list_text_list.append(list_str)
return False,"".join( list_text_list )
return False, "".join(list_text_list)
# 转换为文本数据 之前解析出来的excel数据存放方式存在LIST(array格式)和DICT(object格式)两种类型
def to_text(self,value,indent):
val_type = type( value )
if dict == val_type :
def to_text(self, value, indent):
val_type = type(value)
if dict == val_type:
return self.dict_to_text(value, indent)
else :
else:
return self.list_to_text(value, indent)
# dict转换为json类型
def dict_to_json(self,value,indent):
def dict_to_json(self, value, indent):
dict_ctx_list = []
#if indent % 2 != 0 :
# if indent % 2 != 0 :
# indent += 1
cur_indent = self.indent_ctx(indent)
next_indent = self.indent_ctx(indent + 1)
dict_len = len(value)
tem_count = 0
for k in ( value ) :
for k in (value):
lvalue = value[k]
lvalue_type = type(lvalue)
if tuple != lvalue_type and dict != lvalue_type and list != lvalue_type :
if tuple != lvalue_type and dict != lvalue_type and list != lvalue_type:
tem_count += 1
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( value[k],indent + 1 )
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(value[k], indent + 1)
if lk.replace(".", "").isdigit() :
key = "".join( ["\"",lk,"\"", ':'] )
else :
if lk.replace(".", "").isdigit():
key = "".join(["\"", lk, "\"", ':'])
else:
key = lk.replace("\'", "\"") + ':'
if tem_count != dict_len :
val = "".join( [ next_indent, key + lv + ',\n' ] )
else :
val = "".join( [ next_indent, key + lv ])
dict_ctx_list.append( val )
if tem_count != dict_len:
val = "".join([next_indent, key + lv + ',\n'])
else:
val = "".join([next_indent, key + lv])
dict_ctx_list.append(val)
for k in ( value ) :
for k in (value):
lvalue = value[k]
lvalue_type = type(lvalue)
if tuple == lvalue_type or dict == lvalue_type or list == lvalue_type :
if tuple == lvalue_type or dict == lvalue_type or list == lvalue_type:
tem_count += 1
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( value[k],indent + 1 )
if lk.replace(".", "").isdigit() :
key = "".join( ["\"",lk,"\"", ':'] )
else :
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(value[k], indent + 1)
if lk.replace(".", "").isdigit():
key = "".join(["\"", lk, "\"", ':'])
else:
key = lk.replace("\'", "\"") + ':'
if tem_count != dict_len :
val = "".join( [ next_indent, key + lv + ',\n' ] )
else :
val = "".join( [ next_indent, key + lv ])
dict_ctx_list.append( val )
if tem_count != dict_len:
val = "".join([next_indent, key + lv + ',\n'])
else:
val = "".join([next_indent, key + lv])
dict_ctx_list.append(val)
dict_str = "".join(dict_ctx_list)
return True,"".join(["{\n" , dict_str, "\n",cur_indent,"}"] )
return True, "".join(["{\n", dict_str, "\n", cur_indent, "}"])
# list转换为json类型
def list_to_json(self,value,indent):
def list_to_json(self, value, indent):
list_ctx_list = []
#if indent % 2 != 0 :
# if indent % 2 != 0 :
# indent += 1
cur_indent = self.indent_ctx(indent)
next_indent = self.indent_ctx(indent + 1)
@ -155,47 +153,45 @@ class JsonobjectWriter(Writer):
index_cnt = 1
list_len = len(value)
tem_count = 0
for v in value :
for v in value:
tem_count += 1
is_indent,lv = self.to_target_lang( v,indent + 1 )
if tem_count != list_len :
val = "".join( [ next_indent, lv + ',\n' ] )
else :
val = "".join( [ next_indent, lv])
list_ctx_list.append( val )
is_indent, lv = self.to_target_lang(v, indent + 1)
if tem_count != list_len:
val = "".join([next_indent, lv + ',\n'])
else:
val = "".join([next_indent, lv])
list_ctx_list.append(val)
index_cnt += 1
list_str = "".join(list_ctx_list)
return True,"".join(["[\n" , list_str, "\n",cur_indent,"]"] )
return True, "".join(["[\n", list_str, "\n", cur_indent, "]"])
# 变量转换到目标语言的字符串
def to_target_lang(self,value,indent):
val_type = type( value )
if int == val_type :
return False,str( value )
elif long == val_type :
return False,str( value )
elif float == val_type :
def to_target_lang(self, value, indent):
val_type = type(value)
if int == val_type:
return False, str(value)
elif long == val_type:
return False, str(value)
elif float == val_type:
# 1001.0 -->> 001 去除多余小数点
if int( value ) == value :
return False,str( int(value) )
return False, str( value )
if int(value) == value:
return False, str(int(value))
return False, str(value)
elif str == val_type or unicode == val_type:
# 字符串要用单引号,因为Lua里单引号级别比双引号高
return False,"".join(["\"",value,"\""])
elif tuple == val_type :
return False, "".join(["\"", value, "\""])
elif tuple == val_type:
value1 = list(value)
return self.list_to_json(value1,indent)
elif dict == val_type :
return self.dict_to_json(value,indent)
elif list == val_type :
return self.list_to_json(value,indent)
else :
raise Exception( "invalid type",val_type )
#文件内容
def context(self,ctx):
is_indent,str_ctx = self.to_text( ctx, 0 )
return "".join( [self.comment(), str_ctx] )
return self.list_to_json(value1, indent)
elif dict == val_type:
return self.dict_to_json(value, indent)
elif list == val_type:
return self.list_to_json(value, indent)
else:
raise Exception("invalid type", val_type)
# 文件内容
def context(self, ctx):
is_indent, str_ctx = self.to_text(ctx, 0)
return "".join([self.comment(), str_ctx])

+ 114
- 118
src/writer_lua.py Visa fil

@ -1,8 +1,6 @@
#! python
# -*- coding:utf-8 -*-
import os
import sys
from writer import *
try:
@ -26,6 +24,7 @@ BASE_LENGTH = 60
BASE_INDENT = " "
INDENT_LIST = {}
class LuaWriter(Writer):
# 文件后缀
def suffix(self):
@ -38,19 +37,19 @@ class LuaWriter(Writer):
'\n-- excel sheet name: ' + self.sheet_name,
'\nlocal ' + self.base_name + ' =\n'
]
return "\n".join( comment )
return "\n".join(comment)
# 获取缩进字符串
def indent_ctx( self,indent ):
def indent_ctx(self, indent):
if indent <= 0: return ""
if indent not in INDENT_LIST:
ctx = BASE_INDENT*indent
ctx = BASE_INDENT * indent
INDENT_LIST[indent] = ctx
return INDENT_LIST[indent]
def dict_to_text(self, value, indent) :
def dict_to_text(self, value, indent):
dict_ctx_list = []
cur_indent = self.indent_ctx(indent)
@ -58,45 +57,45 @@ class LuaWriter(Writer):
tem_count = 0
total_len = len(value)
for k in ( value ) :
for k in (value):
tem_count += 1
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( value[k],indent + 1 )
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(value[k], indent + 1)
comment = self.comment_text[k]
val = '-- ' + comment + '\n'
dict_ctx_list.append(val)
val_type = type( lk )
if str == val_type :
if lk.replace(".", "").isdigit() :
key = "".join( ["[",lk,"]"] )
else :
val_type = type(lk)
if str == val_type:
if lk.replace(".", "").isdigit():
key = "".join(["[", lk, "]"])
else:
key = lk.replace("\'", "")
if tem_count != total_len :
val = "".join( [cur_indent, key," =", lv, ",\n\n", cur_indent] )
else :
val = "".join( [cur_indent, key," = ",lv] )
if tem_count != total_len:
val = "".join([cur_indent, key, " =", lv, ",\n\n", cur_indent])
else:
val = "".join([cur_indent, key, " = ", lv])
dict_ctx_list.append( val )
dict_str = "".join( dict_ctx_list )
dict_ctx_list.append(val)
dict_str = "".join(dict_ctx_list)
return False,"".join( ["{\n", cur_indent, dict_str, "\n}"] )
return False, "".join(["{\n", cur_indent, dict_str, "\n}"])
def list_to_dit(self, cur_key_index, total_key_cnt, onedict, storge_dict) :
for k in ( onedict ) :
def list_to_dit(self, cur_key_index, total_key_cnt, onedict, storge_dict):
for k in (onedict):
key_index = self.keys_list.get(k, None)
if None != key_index and key_index == cur_key_index :
if None != key_index and key_index == cur_key_index:
lv = onedict[k]
if cur_key_index == total_key_cnt :
if cur_key_index == total_key_cnt:
storge_dict[lv] = onedict
else :
if None != storge_dict.get(lv, None) :
else:
if None != storge_dict.get(lv, None):
olddict = storge_dict[lv]
new_storge_dict = olddict
self.list_to_dit(cur_key_index + 1, total_key_cnt, onedict, new_storge_dict)
else :
storge_dict[lv] ={}
else:
storge_dict[lv] = {}
new_storge_dict = storge_dict[lv]
self.list_to_dit(cur_key_index + 1, total_key_cnt, onedict, new_storge_dict)
@ -105,96 +104,96 @@ class LuaWriter(Writer):
# 先把各个字段的注释放在前面
comment_text_list = []
for k in self.comment_text :
for k in self.comment_text:
comment = self.comment_text[k]
k_indent,lk = self.to_target_lang( k,indent )
k_indent, lk = self.to_target_lang(k, indent)
lk = lk.replace("\'", "")
if None == comment :
if None == comment:
comment = ""
val = "".join( [ '--: ', lk.ljust(20, " "), "\t## ", comment, "\n"] )
val = "".join(['--: ', lk.ljust(20, " "), "\t## ", comment, "\n"])
comment_text_list.append( val )
comment_text_list.append(val)
comment_str = "".join( comment_text_list )
comment_str = "".join(comment_text_list)
list_text_list.append(comment_str)
## 处理多个key的情况
key_value_list = {}
key_cnt = len(self.keys_list)
for i, onedict in enumerate( value ) :
for i, onedict in enumerate(value):
self.list_to_dit(1, key_cnt, onedict, key_value_list)
is_indent,lv = self.to_target_lang( key_value_list, 0 )
list_str = "".join( lv )
is_indent, lv = self.to_target_lang(key_value_list, 0)
list_str = "".join(lv)
list_text_list.append(list_str)
return False,"".join( list_text_list )
return False, "".join(list_text_list)
# 转换为文本数据 之前解析出来的excel数据存放方式存在LIST(array格式)和DICT(object格式)两种类型
def to_text(self,value,indent):
val_type = type( value )
if dict == val_type :
def to_text(self, value, indent):
val_type = type(value)
if dict == val_type:
return self.dict_to_text(value, indent)
else :
else:
return self.list_to_text(value, indent)
# dict转换为lua类型
def dict_to_lua(self,value,indent):
def dict_to_lua(self, value, indent):
dict_ctx_list = []
if indent % 2 != 0 :
if indent % 2 != 0:
indent += 1
cur_indent = self.indent_ctx(indent)
next_indent = self.indent_ctx(indent + 1)
dict_len = len(value)
tem_count = 0
for k in ( value ) :
for k in (value):
lvalue = value[k]
lvalue_type = type(lvalue)
if tuple != lvalue_type and dict != lvalue_type and list != lvalue_type :
if tuple != lvalue_type and dict != lvalue_type and list != lvalue_type:
tem_count += 1
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( value[k],indent + 1 )
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(value[k], indent + 1)
if lk.replace(".", "").isdigit() :
key = "".join( ["[",lk,"]"] )
else :
if lk.replace(".", "").isdigit():
key = "".join(["[", lk, "]"])
else:
key = lk.replace("\'", "")
if tem_count != dict_len :
val = "".join( [ next_indent, key + " = " + lv + ',\n' ] )
else :
val = "".join( [ next_indent, key + " = " + lv ])
dict_ctx_list.append( val )
if tem_count != dict_len:
val = "".join([next_indent, key + " = " + lv + ',\n'])
else:
val = "".join([next_indent, key + " = " + lv])
dict_ctx_list.append(val)
for k in ( value ) :
for k in (value):
lvalue = value[k]
lvalue_type = type(lvalue)
if tuple == lvalue_type or dict == lvalue_type or list == lvalue_type :
if tuple == lvalue_type or dict == lvalue_type or list == lvalue_type:
tem_count += 1
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( value[k],indent + 1 )
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(value[k], indent + 1)
if lk.replace(".", "").isdigit() :
key = "".join( ["[",lk,"]"] )
else :
if lk.replace(".", "").isdigit():
key = "".join(["[", lk, "]"])
else:
key = lk.replace("\'", "")
if tem_count != dict_len :
val = "".join( [ next_indent, key + " = " + lv + ',\n' ] )
else :
val = "".join( [ next_indent, key + " = " + lv ])
dict_ctx_list.append( val )
if tem_count != dict_len:
val = "".join([next_indent, key + " = " + lv + ',\n'])
else:
val = "".join([next_indent, key + " = " + lv])
dict_ctx_list.append(val)
dict_str = "".join(dict_ctx_list)
return True,"".join(['\n', cur_indent,"{\n" , dict_str, "\n",cur_indent,"}"] )
return True, "".join(['\n', cur_indent, "{\n", dict_str, "\n", cur_indent, "}"])
# list转换为lua类型
def list_to_lua(self,value,indent):
def list_to_lua(self, value, indent):
list_ctx_list = []
if indent % 2 != 0 :
if indent % 2 != 0:
indent += 1
cur_indent = self.indent_ctx(indent)
next_indent = self.indent_ctx(indent + 1)
@ -202,24 +201,24 @@ class LuaWriter(Writer):
index_cnt = 1
list_len = len(value)
tem_count = 0
for v in value :
for v in value:
tem_count += 1
is_indent,lv = self.to_target_lang( v,indent + 1 )
if tem_count != list_len :
val = "".join( [ next_indent, "[" + str(index_cnt) + "] = " + lv + ',\n' ] )
else :
val = "".join( [ next_indent, "[" + str(index_cnt) + "] = " + lv ])
list_ctx_list.append( val )
is_indent, lv = self.to_target_lang(v, indent + 1)
if tem_count != list_len:
val = "".join([next_indent, "[" + str(index_cnt) + "] = " + lv + ',\n'])
else:
val = "".join([next_indent, "[" + str(index_cnt) + "] = " + lv])
list_ctx_list.append(val)
index_cnt += 1
list_str = "".join(list_ctx_list)
return True,"".join(['\n', cur_indent,"{\n" , list_str, "\n",cur_indent,"}"] )
return True, "".join(['\n', cur_indent, "{\n", list_str, "\n", cur_indent, "}"])
# tuple转换为lua类型
def tuple_to_lua(self,value1,indent):
# tuple转换为lua类型
def tuple_to_lua(self, value1, indent):
value = list(value1)
list_ctx_list = []
if indent % 2 != 0 :
if indent % 2 != 0:
indent += 1
cur_indent = self.indent_ctx(indent)
next_indent = self.indent_ctx(indent + 1)
@ -227,47 +226,44 @@ class LuaWriter(Writer):
index_cnt = 1
list_len = len(value)
tem_count = 0
for v in value :
for v in value:
tem_count += 1
is_indent,lv = self.to_target_lang( v,indent + 1 )
if tem_count != list_len :
val = "".join( [ next_indent, "[" + str(index_cnt) + "] = " + lv + ',\n' ] )
else :
val = "".join( [ next_indent, "[" + str(index_cnt) + "] = " + lv ])
list_ctx_list.append( val )
is_indent, lv = self.to_target_lang(v, indent + 1)
if tem_count != list_len:
val = "".join([next_indent, "[" + str(index_cnt) + "] = " + lv + ',\n'])
else:
val = "".join([next_indent, "[" + str(index_cnt) + "] = " + lv])
list_ctx_list.append(val)
index_cnt += 1
list_str = "".join(list_ctx_list)
return True,"".join(['\n', cur_indent,"{\n" , list_str, "\n",cur_indent,"}"] )
return True, "".join(['\n', cur_indent, "{\n", list_str, "\n", cur_indent, "}"])
# 变量转换到目标语言的字符串
def to_target_lang(self,value,indent):
val_type = type( value )
if int == val_type :
return False,str( value )
elif long == val_type :
return False,str( value )
elif float == val_type :
def to_target_lang(self, value, indent):
val_type = type(value)
if int == val_type:
return False, str(value)
elif long == val_type:
return False, str(value)
elif float == val_type:
# 1001.0 -->> 001 去除多余小数点
if int( value ) == value :
return False,str( int(value) )
return False,str( value )
if int(value) == value:
return False, str(int(value))
return False, str(value)
elif str == val_type or unicode == val_type:
# 字符串要用单引号,因为Lua里单引号级别比双引号高
return False,"".join(["'",value,"'"])
elif tuple == val_type :
return self.tuple_to_lua(value,indent)
elif dict == val_type :
return self.dict_to_lua(value,indent)
elif list == val_type :
return self.list_to_lua(value,indent)
else :
raise Exception( "invalid type",val_type )
#文件内容
def context(self,ctx):
is_indent,str_ctx = self.to_text( ctx,1 )
return "".join( [self.comment(), str_ctx, "\nreturn ", self.base_name] )
return False, "".join(["'", value, "'"])
elif tuple == val_type:
return self.tuple_to_lua(value, indent)
elif dict == val_type:
return self.dict_to_lua(value, indent)
elif list == val_type:
return self.list_to_lua(value, indent)
else:
raise Exception("invalid type", val_type)
# 文件内容
def context(self, ctx):
is_indent, str_ctx = self.to_text(ctx, 1)
return "".join([self.comment(), str_ctx, "\nreturn ", self.base_name])

+ 117
- 120
src/writer_python.py Visa fil

@ -1,8 +1,6 @@
#! python
# -*- coding:utf-8 -*-
import os
import sys
from writer import *
try:
@ -26,12 +24,14 @@ BASE_LENGTH = 60
BASE_INDENT = " "
INDENT_LIST = {}
class PythonWriter(Writer):
# 文件后缀
def suffix(self):
return ".py"
# 文件注释(千万不要加时间,影响svn)
def comment(self):
comment = [
'## Automatic generation from -->>'
@ -40,41 +40,40 @@ class PythonWriter(Writer):
'\ndefmodule ' + self.base_name.title() + ' do\n\n'
]
return "\n".join( comment )
return "\n".join(comment)
# 获取缩进字符串
def indent_ctx( self,indent ):
def indent_ctx(self, indent):
if indent <= 0: return ""
if indent not in INDENT_LIST:
INDENT_LIST[indent] = ""
else:
ctx = BASE_INDENT*indent
ctx = BASE_INDENT * indent
INDENT_LIST[indent] = ctx
return INDENT_LIST[indent]
def dict_to_text(self, value, indent) :
def dict_to_text(self, value, indent):
dict_text_list = []
for k in ( value ) :
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( value[k],indent + 1 )
for k in (value):
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(value[k], indent + 1)
comment = self.comment_text[k]
val_type = type( lk )
if str == val_type :
val_type = type(lk)
if str == val_type:
lk = ':' + lk.replace("\"", "")
key = "".join( [" def get(",lk,") do\n"] )
key = "".join([" def get(", lk, ") do\n"])
val = "".join( [" ## ", comment, "\n", key, " ", lv, "\n end\n\n"] )
val = "".join([" ## ", comment, "\n", key, " ", lv, "\n end\n\n"])
dict_text_list.append( val )
dict_text_list.append(val)
dict_str = "".join( dict_text_list )
dict_str = "".join(dict_text_list)
dict_str = dict_str + " def get(_) do\n :undefined\n end\n\nend"
return False, dict_str
@ -84,70 +83,70 @@ class PythonWriter(Writer):
struct_text_list = []
struct_len = len(self.comment_text)
tem_count = 0
for k in self.comment_text :
for k in self.comment_text:
tem_count += 1
comment = self.comment_text[k]
k_indent,lk = self.to_target_lang( k,indent )
val_type = type( lk )
if str == val_type :
if tem_count != struct_len :
k_indent, lk = self.to_target_lang(k, indent)
val_type = type(lk)
if str == val_type:
if tem_count != struct_len:
lk = ':' + lk.replace("\"", "") + ','
else :
else:
lk = ':' + lk.replace("\"", "")
if None == comment :
if None == comment:
comment = ""
val = "".join( [lk.ljust(20, " "), "\t## ", comment, "\n"] )
val = "".join([lk.ljust(20, " "), "\t## ", comment, "\n"])
struct_text_list.append( val )
struct_text_list.append(val)
struct_str = " ".join( struct_text_list )
struct_str = " ".join(struct_text_list)
end_str = " defstruct [\n " + struct_str + " ]\n\n"
list_text_list.append(end_str)
all_key_list = []
# 生成 get() 函数
for i, onedict in enumerate( value ) :
for i, onedict in enumerate(value):
# 生成对应的 key
key_list = []
for k in ( onedict ) :
if None != self.keys_list.get(k, None) :
is_indent,lv = self.to_target_lang( onedict[k],indent + 1 )
for k in (onedict):
if None != self.keys_list.get(k, None):
is_indent, lv = self.to_target_lang(onedict[k], indent + 1)
key_list.append(lv)
all_key_list.append(key_list)
tem = ", ".join( key_list )
tem = ", ".join(key_list)
key = "".join( [" def get(",tem,") do\n %", self.base_name.title(), "{\n "] )
key = "".join([" def get(", tem, ") do\n %", self.base_name.title(), "{\n "])
# 生成对应的value
value_list = []
onedict_len = len(onedict)
tem_count = 0
for k in ( onedict ) :
for k in (onedict):
tem_count += 1
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( onedict[k],indent + 1 )
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(onedict[k], indent + 1)
val_type = type( lk )
if str == val_type :
val_type = type(lk)
if str == val_type:
lk = ':' + lk.replace("\"", "")
if tem_count != onedict_len :
oneval = "".join( [lk, " => ", lv , ",\n"] )
value_list.append( oneval )
else :
oneval = "".join( [lk, " => ", lv , "\n"] )
value_list.append( oneval )
if tem_count != onedict_len:
oneval = "".join([lk, " => ", lv, ",\n"])
value_list.append(oneval)
else:
oneval = "".join([lk, " => ", lv, "\n"])
value_list.append(oneval)
value_list_str = " ".join(value_list)
end_str = "".join( [key, value_list_str, " }\n end\n\n"] )
end_str = "".join([key, value_list_str, " }\n end\n\n"])
list_text_list.append( end_str )
list_text_list.append(end_str)
underline_list = []
for i in self.keys_list :
for i in self.keys_list:
underline_list.append('_')
end_str = ", ".join(underline_list)
@ -159,149 +158,147 @@ class PythonWriter(Writer):
get_all_fun = []
allkey_len = len(all_key_list)
tem_count = 0
for i, ival in enumerate(all_key_list) :
for i, ival in enumerate(all_key_list):
tem_count += 1
if tem_count != allkey_len :
if tem_count != allkey_len:
oneval = '{' + ", ".join(ival) + '},\n'
get_all_fun.append(oneval)
else :
else:
oneval = '{' + ", ".join(ival) + '}\n'
get_all_fun.append(oneval)
value_list_str = " ".join(get_all_fun)
start_str = ' def get_all() do\n [\n '
end_str = "".join( [start_str, value_list_str, " ]\n end\n\n"] )
end_str = "".join([start_str, value_list_str, " ]\n end\n\n"])
list_text_list.append( end_str )
list_text_list.append(end_str)
# 生成 get_list() 函数
get_list_fun = []
keys_len = len(self.keys_list)
for key in self.keys_list :
for key in self.keys_list:
keyindex = self.keys_list[key]
if keyindex == 1 :
list_text_list.append( ' def get_list() do\n get_all()\n end\n\n')
elif keyindex <= keys_len :
if keyindex == 1:
list_text_list.append(' def get_list() do\n get_all()\n end\n\n')
elif keyindex <= keys_len:
get_tem_dict = {}
underline_list = []
for i, ival in enumerate(all_key_list) :
for i, ival in enumerate(all_key_list):
key_tem_list = []
j = 0
underline_list = []
while j < keyindex - 1 :
while j < keyindex - 1:
key_tem_list.append(ival[j])
underline_list.append('_')
j += 1
keystr = '(' + ", ".join(key_tem_list) + ')'
if None != get_tem_dict.get(keystr, None) :
if None != get_tem_dict.get(keystr, None):
oldlist = get_tem_dict[keystr]
oldlist.append(ival)
get_tem_dict[keystr] = oldlist
else :
else:
get_tem_dict[keystr] = [ival]
for onekey in get_tem_dict :
for onekey in get_tem_dict:
value_tem_list = []
valuelist = get_tem_dict[onekey]
value_len = len(valuelist)
tem_count = 0
for l, lval in enumerate(valuelist) :
for l, lval in enumerate(valuelist):
tem_count += 1
if tem_count != value_len :
if tem_count != value_len:
oneval = '{' + ", ".join(lval) + '},\n'
value_tem_list.append(oneval)
else :
else:
oneval = '{' + ", ".join(lval) + '}\n'
value_tem_list.append(oneval)
start_str = ' def get_list' + onekey + ' do\n [\n '
end_str = "".join( [start_str, " ".join(value_tem_list), " ]\n end\n\n"] )
end_str = "".join([start_str, " ".join(value_tem_list), " ]\n end\n\n"])
get_list_fun.append(end_str)
no_match_str = "".join(' def get_list(' + ", ".join(underline_list) + ') do\n []\n end\n\n')
no_match_str = "".join(
' def get_list(' + ", ".join(underline_list) + ') do\n []\n end\n\n')
get_list_fun.append(no_match_str)
value_list_str = "".join(get_list_fun) + 'end'
list_text_list.append( value_list_str )
dict_str = "".join( list_text_list )
list_text_list.append(value_list_str)
dict_str = "".join(list_text_list)
return False, dict_str
# 转换为erlang 文本数据 之前解析出来的excel数据存放方式存在LIST(array格式)和DICT(object格式)两种类型
def to_text(self,value,indent):
val_type = type( value )
if dict == val_type :
def to_text(self, value, indent):
val_type = type(value)
if dict == val_type:
return self.dict_to_text(value, indent)
else :
else:
return self.list_to_text(value, indent)
# python的dict转换为elixir的map类型
def dict_to_elixir(self,value,indent):
def dict_to_elixir(self, value, indent):
dict_ctx_list = []
for k in ( value ) :
k_indent,lk = self.to_target_lang( k,indent )
is_indent,lv = self.to_target_lang( value[k],indent + 1 )
for k in (value):
k_indent, lk = self.to_target_lang(k, indent)
is_indent, lv = self.to_target_lang(value[k], indent + 1)
val_type = type( lk )
if str == val_type :
val_type = type(lk)
if str == val_type:
lk = lk.replace("\"", "\'")
key = "".join( [lk," => "] )
val = "".join( [key, lv] )
key = "".join([lk, " => "])
val = "".join([key, lv])
dict_ctx_list.append(val)
dict_str = ", ".join( dict_ctx_list )
return False,"".join( ["%{",dict_str,"}"] )
dict_str = ", ".join(dict_ctx_list)
return False, "".join(["%{", dict_str, "}"])
# python的list转换为elixir的list类型
def list_to_elixir(self,value,indent):
def list_to_elixir(self, value, indent):
list_ctx_list = []
for v in value :
is_indent,lv = self.to_target_lang( v,indent + 1 )
list_ctx_list.append( lv )
for v in value:
is_indent, lv = self.to_target_lang(v, indent + 1)
list_ctx_list.append(lv)
list_str = ", ".join( list_ctx_list )
return False,"".join( ["[",list_str,"]"] )
list_str = ", ".join(list_ctx_list)
return False, "".join(["[", list_str, "]"])
# python的tuple转换为elixir的tuple类型
def tuple_to_elixir(self,value,indent):
def tuple_to_elixir(self, value, indent):
tuple_ctx_list = []
for v in value :
is_indent,lv = self.to_target_lang( v,indent + 1 )
tuple_ctx_list.append( lv )
for v in value:
is_indent, lv = self.to_target_lang(v, indent + 1)
tuple_ctx_list.append(lv)
# 返回 {a,b,c}这种不换行的格式
list_str = ", ".join( tuple_ctx_list )
return False,"".join( ["{",list_str,"}"] )
list_str = ", ".join(tuple_ctx_list)
return False, "".join(["{", list_str, "}"])
# 变量转换到目标语言字符串
def to_target_lang(self,value,indent):
val_type = type( value )
if int == val_type :
return False,str( value )
elif long == val_type :
return False,str( value )
elif float == val_type :
def to_target_lang(self, value, indent):
val_type = type(value)
if int == val_type:
return False, str(value)
elif long == val_type:
return False, str(value)
elif float == val_type:
# 1001.0 -->> 001 去除多余小数点
if int( value ) == value :
return False,str( int(value) )
return False,str( value )
if int(value) == value:
return False, str(int(value))
return False, str(value)
elif str == val_type or unicode == val_type:
return False, "".join(["\"",value,"\""])
elif tuple == val_type :
return self.tuple_to_elixir(value,indent)
elif dict == val_type :
return self.dict_to_elixir(value,indent)
elif list == val_type :
return self.list_to_elixir(value,indent)
else :
raise Exception( "invalid type",val_type )
#文件内容
def context(self,ctx):
is_indent,str_ctx = self.to_text( ctx,0 )
return "".join( [self.comment(),"",str_ctx] )
return False, "".join(["\"", value, "\""])
elif tuple == val_type:
return self.tuple_to_elixir(value, indent)
elif dict == val_type:
return self.dict_to_elixir(value, indent)
elif list == val_type:
return self.list_to_elixir(value, indent)
else:
raise Exception("invalid type", val_type)
# 文件内容
def context(self, ctx):
is_indent, str_ctx = self.to_text(ctx, 0)
return "".join([self.comment(), "", str_ctx])

+ 54
- 53
src/writer_xml.py Visa fil

@ -1,9 +1,8 @@
#! python
# -*- coding:utf-8 -*-
import os
import sys
from xml.dom.minidom import Document
from writer import *
try:
@ -27,107 +26,109 @@ BASE_LENGTH = 60
BASE_INDENT = " "
INDENT_LIST = {}
class JsonWriter(Writer):
# 文件后缀
def suffix(self):
return ".json"
# 文件内容(字符串)
def context(self,ctx):
return json.dumps(ctx,ensure_ascii=False,\
indent=4,sort_keys=True,separators=(',', ':') )
def context(self, ctx):
return json.dumps(ctx, ensure_ascii=False, \
indent=4, sort_keys=True, separators=(',', ':'))
class XmlWriter(Writer):
# 文件后缀
def suffix(self):
return ".xml"
# 注释开始
def comment_start(self):
return "<!--"
# 注释结束
def comment_end(self):
return "-->"
#创建根元素
# 创建根元素
def root_element(self):
root = self.doc.createElement( self.base_name )
root = self.doc.createElement(self.base_name)
return root
# dict类型转换为xml
def dict_to_xml(self,root,value):
def dict_to_xml(self, root, value):
# 需要对key排序,不然每次导出的xml字段是乱的,对版本管理不友好
for k in sorted( value ) :
for k in sorted(value):
v = value[k]
sub_root = self.doc.createElement( k )
sub_root = self.doc.createElement(k)
self.to_xml( sub_root,v )
root.appendChild( sub_root )
self.to_xml(sub_root, v)
root.appendChild(sub_root)
# list类型转换为xml
def list_to_xml(self,root,value):
for k,v in enumerate( value ) :
def list_to_xml(self, root, value):
for k, v in enumerate(value):
# xml中并不支持array,用item来命名,外加一个index属性
sub_root = self.doc.createElement( "item" )
sub_root.setAttribute( "index",str( k ) )
sub_root = self.doc.createElement("item")
sub_root.setAttribute("index", str(k))
self.to_xml(sub_root, v)
root.appendChild(sub_root)
self.to_xml( sub_root,v )
root.appendChild( sub_root )
# tuple类型转换为xml
def tuple_to_xml(self,root,value):
def tuple_to_xml(self, root, value):
valueList = list(value)
for k,v in enumerate( valueList ) :
for k, v in enumerate(valueList):
# xml中并不支持array,用item来命名,外加一个index属性
sub_root = self.doc.createElement( "item" )
sub_root.setAttribute( "index",str( k ) )
sub_root = self.doc.createElement("item")
sub_root.setAttribute("index", str(k))
self.to_xml( sub_root,v )
root.appendChild( sub_root )
self.to_xml(sub_root, v)
root.appendChild(sub_root)
# 转换为xml节点
def to_xml(self,root,value):
def to_xml(self, root, value):
sub_node = None
val_type_str = None
val_type = type( value )
if int == val_type :
val_type = type(value)
if int == val_type:
# python3中没有Long类型,int64也用int表示
val_type_str = "int64"
sub_node = self.doc.createTextNode( str( value ) )
elif long == val_type :
sub_node = self.doc.createTextNode(str(value))
elif long == val_type:
val_type_str = "int64"
sub_node = self.doc.createTextNode( str( value ) )
elif float == val_type :
sub_node = self.doc.createTextNode(str(value))
elif float == val_type:
val_type_str = "number"
# 去除带小数时的小数点,100.0 ==>> 100
if long( value ) == float( value ) :
sub_node = self.doc.createTextNode( str( long( value ) ) )
if long(value) == float(value):
sub_node = self.doc.createTextNode(str(long(value)))
else:
sub_node = self.doc.createTextNode( str( value ) )
elif str == val_type or unicode == val_type :
sub_node = self.doc.createTextNode(str(value))
elif str == val_type or unicode == val_type:
val_type_str = "string"
sub_node = self.doc.createTextNode( value )
elif tuple == val_type :
self.tuple_to_xml( root,value )
elif dict == val_type :
self.dict_to_xml( root,value )
elif list == val_type :
self.list_to_xml( root,value )
else :
raise Exception( "invalid type",val_type )
sub_node = self.doc.createTextNode(value)
elif tuple == val_type:
self.tuple_to_xml(root, value)
elif dict == val_type:
self.dict_to_xml(root, value)
elif list == val_type:
self.list_to_xml(root, value)
else:
raise Exception("invalid type", val_type)
# 类型为dict或者list的,没有这个type属性
if val_type_str : root.setAttribute( "type",val_type_str )
if sub_node : root.appendChild( sub_node )
if val_type_str: root.setAttribute("type", val_type_str)
if sub_node: root.appendChild(sub_node)
# 文件内容
def context(self,ctx):
#创建DOM文档对象
def context(self, ctx):
# 创建DOM文档对象
self.doc = Document()
root = self.root_element()
self.to_xml( root,ctx )
self.doc.appendChild( root )
return self.comment() + self.doc.toprettyxml( indent=" " )
self.to_xml(root, ctx)
self.doc.appendChild(root)
return self.comment() + self.doc.toprettyxml(indent=" ")

Laddar…
Avbryt
Spara