#! 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] )