|
|
- #! python
- # -*- coding:utf-8 -*-
-
- import os
- import sys
- from writer import *
-
- try:
- basestring
- except NameError:
- basestring = str
-
- try:
- long
- except NameError:
- long = int
-
- # python3中没有unicode了
- try:
- unicode
- except NameError:
- unicode = str
-
- # 加上不确定的层级缩进,60比较合适
- BASE_LENGTH = 60
- BASE_INDENT = " "
- INDENT_LIST = {}
-
- class ErlangerlWriter(Writer):
- # 文件后缀
- def suffix(self):
- return ".erl"
-
- def comment(self):
- comment = [
- '%% Automatic generation from -->>'
- '\n%% excel file name : ' + self.doc_name +
- '\n%% excel sheet name : ' + self.sheet_name,
- '\n-module(' + self.base_name + ').',
- '\n'
- ]
-
- return "\n".join( comment )
-
- # 获取缩进字符串
- def indent_ctx( self,indent ):
- if indent <= 0: return ""
-
- if indent not in INDENT_LIST:
- INDENT_LIST[indent] = ""
- else:
- ctx = BASE_INDENT*indent
- INDENT_LIST[indent] = ctx
-
- return INDENT_LIST[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 )
-
- comment = self.comment_text[k]
-
- val_type = type( lk )
- if str == val_type :
- lk = lk.replace("<<\"", "\'")
- lk = lk.replace("\"/utf8>>", "\'")
-
- key = "".join( ["get(",lk,") ->\n"] )
-
- val = "".join( ["%% ", comment, "\n", key, " ", lv, ";\n\n"] )
-
- dict_text_list.append( val )
-
- dict_str = "".join( dict_text_list )
- dict_str = dict_str + "get(_) ->\n undefined."
- return False, dict_str
-
- def list_to_text(self, value, indent):
- list_text_list = []
- val = "-include(\"" + self.base_name + ".hrl\").\n" + "-compile([export_all, nowarn_export_all]).\n\n"
- list_text_list.append(val)
- all_key_list = []
- # 生成 get() 函数
- 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 )
- key_list.append(lv)
- all_key_list.append(key_list)
-
- tem = ", ".join( key_list )
-
- 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 )
-
- val_type = type( lk )
- if str == val_type :
- lk = lk.replace("<<\"", "\'")
- lk = lk.replace("\"/utf8>>", "\'")
-
- oneval = "".join( [lk, " = ", lv , "\n"] )
-
- value_list.append( oneval )
-
- value_list_str = " , ".join(value_list)
- end_str = "".join( [key, value_list_str, "};\n\n"] )
-
- list_text_list.append( end_str )
-
- underline_list = []
- for i in self.keys_list :
- underline_list.append('_')
-
- end_str = ", ".join(underline_list)
- no_match_str = "get(" + end_str + ") ->\n undefined.\n\n"
-
- list_text_list.append(no_match_str)
-
- # 生成 get_all() 函数
- get_all_fun = []
- 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"] )
-
- # 生成 get_list() 函数
- get_list_fun = []
- keys_len = len(self.keys_list)
- for key in self.keys_list :
- keyindex = self.keys_list[key]
- if keyindex == 1 :
- "skip"
- elif keyindex <= keys_len :
- get_tem_dict = {}
- underline_list = []
- for i, ival in enumerate(all_key_list) :
- key_tem_list = []
- j = 0
- underline_list = []
- 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) :
- oldlist = get_tem_dict[keystr]
- oldlist.append(ival)
- get_tem_dict[keystr] = oldlist
- else :
- get_tem_dict[keystr] = [ival]
-
- for onekey in get_tem_dict :
- value_tem_list = []
- valuelist = get_tem_dict[onekey]
- 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"] )
- 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 )
-
- 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)
-
- # python的dict转换为erlang的map类型
- 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 )
-
- val_type = type( lk )
- if str == val_type :
- lk = lk.replace("<<\"", "\'")
- lk = lk.replace("\"/utf8>>", "\'")
-
- key = "".join( [lk," => "] )
- val = "".join( [key, lv] )
- dict_ctx_list.append(val)
-
- dict_str = ", ".join( dict_ctx_list )
- return False,"".join( ["#{",dict_str,"}"] )
-
- # python的list转换为erlang的list类型
- 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 )
-
- list_str = ", ".join( list_ctx_list )
- return False,"".join( ["[",list_str,"]"] )
-
- # python的tuple转换为erlang的tuple类型
- 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 )
-
- # 返回 {a,b,c}这种不换行的格式
- 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 :
- # 1001.0 -->> 001 去除多余小数点
- 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] )
|