@ -1,2 +1,5 @@ | |||||
# Auto detect text files and perform LF normalization | |||||
* text=auto | |||||
* text eol=lf | |||||
*.zip binary | |||||
*.tar.gz binary | |||||
*.tar.bz2 binary | |||||
*.xlsx binary |
@ -0,0 +1,110 @@ | |||||
# Byte-compiled / optimized / DLL files | |||||
__pycache__/ | |||||
*.py[cod] | |||||
*$py.class | |||||
# C extensions | |||||
*.so | |||||
# yongzhong office temp file | |||||
$* | |||||
# xlsx temp file | |||||
~*.xlsx | |||||
.~*.xlsx | |||||
# Distribution / packaging | |||||
.Python | |||||
env/ | |||||
build/ | |||||
develop-eggs/ | |||||
dist/ | |||||
downloads/ | |||||
eggs/ | |||||
.eggs/ | |||||
lib/ | |||||
lib64/ | |||||
parts/ | |||||
sdist/ | |||||
var/ | |||||
wheels/ | |||||
*.egg-info/ | |||||
.installed.cfg | |||||
*.egg | |||||
# PyInstaller | |||||
# Usually these files are written by a python script from a template | |||||
# before PyInstaller builds the exe, so as to inject date/other infos into it. | |||||
*.manifest | |||||
*.spec | |||||
# Installer logs | |||||
pip-log.txt | |||||
pip-delete-this-directory.txt | |||||
# Unit test / coverage reports | |||||
htmlcov/ | |||||
.tox/ | |||||
.coverage | |||||
.coverage.* | |||||
.cache | |||||
nosetests.xml | |||||
coverage.xml | |||||
*.cover | |||||
.hypothesis/ | |||||
# Translations | |||||
*.mo | |||||
*.pot | |||||
# Django stuff: | |||||
*.log | |||||
local_settings.py | |||||
# Flask stuff: | |||||
instance/ | |||||
.webassets-cache | |||||
# Scrapy stuff: | |||||
.scrapy | |||||
# Sphinx documentation | |||||
docs/_build/ | |||||
# PyBuilder | |||||
target/ | |||||
# Jupyter Notebook | |||||
.ipynb_checkpoints | |||||
# pyenv | |||||
.python-version | |||||
# celery beat schedule file | |||||
celerybeat-schedule | |||||
# SageMath parsed files | |||||
*.sage.py | |||||
# dotenv | |||||
.env | |||||
# virtualenv | |||||
.venv | |||||
venv/ | |||||
ENV/ | |||||
# Spyder project settings | |||||
.spyderproject | |||||
.spyproject | |||||
# Rope project settings | |||||
.ropeproject | |||||
# mkdocs documentation | |||||
/site | |||||
# mypy | |||||
.mypy_cache/ | |||||
@ -0,0 +1,3 @@ | |||||
[submodule "slpp"] | |||||
path = slpp | |||||
url = https://github.com/changnet/slpp.git |
@ -0,0 +1,112 @@ | |||||
#! python | |||||
# -*- coding:utf-8 -*- | |||||
import os | |||||
import time | |||||
from writer import * | |||||
from writer_erlang_erl import * | |||||
from writer_erlang_hrl import * | |||||
from writer_elixir import * | |||||
from writer_lua import * | |||||
from writer_xml import * | |||||
from writer_json_object import * | |||||
from writer_json_array import * | |||||
from writer_python import * | |||||
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): | |||||
self.input_path = input_path | |||||
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" ) | |||||
def attention(self): | |||||
print("*****************************开始导表*****************************\n") | |||||
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 self.timeout > 0: | |||||
now = time.time() | |||||
mtime = os.path.getmtime( abspath ) | |||||
if now - mtime > self.timeout: return False | |||||
return True | |||||
def read(self): | |||||
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)) | |||||
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 ) | |||||
for file in file_list: | |||||
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 ) ) | |||||
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__': | |||||
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" ) | |||||
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.attention() | |||||
reader.read() |
@ -0,0 +1,71 @@ | |||||
# py_exceltools | |||||
python3 基于openpyxl的excel转换工具。支持xlsx文件转换为erlang,elixir,lua,json,xml,python等配置文件。 | |||||
关于openpyxl库:https://pypi.python.org/pypi/openpyxl。 | |||||
## python和openpyxl安装 | |||||
linux安装 | |||||
apt-get install python-pip | |||||
pip install openpyxl | |||||
win安装 | |||||
安装python(同时安装pip并添加到Path) | |||||
安装openpyxl, 在安装python后在cmd中运行: pip install openpyxl | |||||
# 使用 | |||||
lancher.bat(win)和lancher.sh(linux)为对应运行脚本。 | |||||
当前配置了用于参考的参数来转换example.xlsx, | |||||
可在对应server、client输出文件夹查看生成配置效果。 | |||||
参数: | |||||
--input :需要转换的excel文件所在目录 | |||||
--srv : 服务端配置文件输出目录 | |||||
--clt : 客户端配置文件输出目录 | |||||
--timeout : 需要转换的excel文件最后更新时间距当前时间秒数。-1转换所有 | |||||
--suffix :excel文件后缀,通常为.xlsx | |||||
--swriter : 服务端配置文件转换器,可以指定为: erlanghrl,erlangerl,elixir,lua,jsonarray,jsonobject,xml,python | |||||
--cwriter : 客户端配置文件转换器,可以指定为: erlanghrl,erlangerl,elixir,lua,jsonarray,jsonobject,xml,python | |||||
注:对于client和server,如果未配置输出目录或转换器,则不会导出。 | |||||
# 数据类型 | |||||
支持int(int64), number(float), string, tuple, list, dict, json、lua | |||||
其中tuple, list, dict 为 python原生数据结构 json 为json数据类型 Lua为 lua table | |||||
# 数据格式示范(可以参考本工具自带的示例配置表) | |||||
int 整数 1,2,1000 64位 | |||||
number 整数或者小数都OK | |||||
string 字符串 excel表中配置时不需要额外加双引号 | |||||
tuple (元素, 元素, ...) 元素可以为 int number string tuple list dict | |||||
list [元素, 元素, ...] 元素可以为 int number string tuple list dict | |||||
dict [key:value, key:value, ...] key可以为 int number string tuple value可以为 int number string tuple list dict | |||||
特别注意该类型的使用 因为在一些语言中 对应dict类似的类型的key不支持 int 比如 jsonarray和xml,如果在转成jsonarray和xml时key不能配置为int和number | |||||
json {key:value, key:value, ...}该类型为json的对象类型 Key为字符串, Value可以为任意Json数据类型即可以是对象,数字,基本数据类型。 | |||||
lua 该类型为lua的table类型 | |||||
其中 list dict json 三种数据格式可以互相嵌套 | |||||
转换时会将这些数据类型转换为其他语言支持的数据类型,另外注意点是一些其他语言的一些限制 | |||||
比如 json不能用数字做为对象的Key(), xml的也不能用数字作为标签, 在配置的时候需要注意 | |||||
而且导出xml和jsonjsonarray都是用的库,出错的时候不太好找到对应配置错误的数据,需要配置前 | |||||
就额外注意,以免不必要的懵逼和浪费时间,策划不太明白的可以请教程序或者百度 | |||||
# 打包exe | |||||
部署时,可以将python打包成exe。建议使用pyinstaller。 | |||||
pyinstaller3.2.1尚不支持python3.6.1,建议使用python 3.5。 | |||||
pip install pyinstaller | |||||
pyinstaller -F -c ConfigConvertTool.py | |||||
excel文件名命名格式 | |||||
为了表名的可视化和可理解性,文件命名支持 MMM-NNN.xlsx的方式。MMM可以是任意字符(一般为文件中文名,但是不用下划线结尾), | |||||
作为文件名的注释性描述。NNN只能是数字,字母和下划线(不能以下划线开头和数字开头),作为导出的配置以NNN做为表名前缀 | |||||
excel sheet命名格式 | |||||
为了考虑策划会使用一个excel配置同一的功能的多个配置子表,且方便导出和查看,sheet命名为YYY-XXX或者 YYY+XXX, | |||||
或者YYY (里面不包含 "+"""-"), YYY可以为任意字符(一般为中文描述),XXX为导出配置的表名后缀, | |||||
当sheet命名为 YYY-XXX或者 YYY+XXX时 导出文件名为: NNN_XXX.lang(此种命名一般用于 一个excel配置多个需要导出的sheet页签) | |||||
当sheet命名为 YYY 时 导出文件名为: NNN.lang (此种命名用法仅仅用于一个excel只配置一个需要导出的sheet页签) | |||||
lang为目标语言的后缀名 | |||||
具体示例 | |||||
A_arrary表示例--cfg_array.xlsx 前缀Y可以用方便排序显示 更多具体参见配置excel示例 | |||||
* 在string中无法直接使用换行等特殊称号。请用\n等转义字符替代。 | |||||
* 由于xml并不存在数组等结构,不建议使用。 | |||||
* 工具会检测server和client标识。如果不存在,则不导出些表。方便策划做备注 |
@ -0,0 +1,289 @@ | |||||
<?xml version="1.0" ?> | |||||
<cfg_array_example1> | |||||
<item index="0"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">900</item> | |||||
</item> | |||||
</attr> | |||||
<desc type="string">从小城镇</desc> | |||||
<id type="int64">1001</id> | |||||
<level type="int64">88</level> | |||||
<name type="string">黑切+蓝盾</name> | |||||
<str type="string">pos1</str> | |||||
<sub_level type="number">1</sub_level> | |||||
</item> | |||||
<item index="1"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">900</item> | |||||
</item> | |||||
</attr> | |||||
<desc type="string">有钱就可以买</desc> | |||||
<id type="int64">1001</id> | |||||
<level type="int64">88</level> | |||||
<name type="string">黑切+蓝盾</name> | |||||
<str type="string">pos1</str> | |||||
<sub_level type="number">2</sub_level> | |||||
</item> | |||||
<item index="2"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">900</item> | |||||
</item> | |||||
</attr> | |||||
<desc type="string">有钱就可以买</desc> | |||||
<id type="int64">1001</id> | |||||
<level type="int64">89</level> | |||||
<name type="string">黑切+蓝盾</name> | |||||
<str type="string">pos1</str> | |||||
<sub_level type="number">89</sub_level> | |||||
</item> | |||||
<item index="3"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">900</item> | |||||
</item> | |||||
</attr> | |||||
<desc type="string">有钱就可以买</desc> | |||||
<id type="int64">1001</id> | |||||
<level type="int64">88</level> | |||||
<name type="string">黑切+蓝盾</name> | |||||
<str type="string">pos2</str> | |||||
<sub_level type="number">88.9</sub_level> | |||||
</item> | |||||
<item index="4"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">900</item> | |||||
</item> | |||||
</attr> | |||||
<desc type="string">有钱就可以买</desc> | |||||
<id type="int64">1001</id> | |||||
<level type="int64">89</level> | |||||
<name type="string">黑切+蓝盾</name> | |||||
<str type="string">pos2</str> | |||||
<sub_level type="number">89</sub_level> | |||||
</item> | |||||
<item index="5"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">901</item> | |||||
</item> | |||||
</attr> | |||||
<desc type="string">有钱就可以买</desc> | |||||
<id type="int64">1002</id> | |||||
<level type="int64">88</level> | |||||
<name type="string">黑切+蓝盾</name> | |||||
<str type="string">pos1</str> | |||||
<sub_level type="number">88</sub_level> | |||||
</item> | |||||
<item index="6"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">900</item> | |||||
</item> | |||||
</attr> | |||||
<desc type="string">有钱就可以买</desc> | |||||
<id type="int64">1002</id> | |||||
<level type="int64">89</level> | |||||
<name type="string">黑切+蓝盾</name> | |||||
<str type="string">pos1</str> | |||||
<sub_level type="number">89</sub_level> | |||||
</item> | |||||
<item index="7"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">901</item> | |||||
</item> | |||||
</attr> | |||||
<desc type="string">有钱就可以买</desc> | |||||
<id type="int64">1002</id> | |||||
<level type="int64">90</level> | |||||
<name type="string">黑切+蓝盾</name> | |||||
<str type="string">pos1</str> | |||||
<sub_level type="number">90</sub_level> | |||||
</item> | |||||
<item index="8"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">901</item> | |||||
</item> | |||||
</attr> | |||||
<desc type="string">有钱就可以买</desc> | |||||
<id type="int64">1002</id> | |||||
<level type="int64">88</level> | |||||
<name type="string">黑切+蓝盾</name> | |||||
<str type="string">pos2</str> | |||||
<sub_level type="number">88</sub_level> | |||||
</item> | |||||
<item index="9"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">900</item> | |||||
</item> | |||||
</attr> | |||||
<desc type="string">有钱就可以买</desc> | |||||
<id type="int64">1002</id> | |||||
<level type="int64">89</level> | |||||
<name type="string">黑切+蓝盾</name> | |||||
<str type="string">pos2</str> | |||||
<sub_level type="number">89</sub_level> | |||||
</item> | |||||
<item index="10"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">901</item> | |||||
</item> | |||||
</attr> | |||||
<desc type="string">有钱就可以买</desc> | |||||
<id type="int64">1002</id> | |||||
<level type="int64">90</level> | |||||
<name type="string">黑切+蓝盾</name> | |||||
<str type="string">pos2</str> | |||||
<sub_level type="number">90</sub_level> | |||||
</item> | |||||
<item index="11"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">902</item> | |||||
</item> | |||||
</attr> | |||||
<desc type="string">有钱就可以买</desc> | |||||
<id type="int64">1003</id> | |||||
<level type="int64">85</level> | |||||
<name type="string">黑切+蓝盾</name> | |||||
<str type="string">pos1</str> | |||||
<sub_level type="number">85</sub_level> | |||||
</item> | |||||
<item index="12"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">903</item> | |||||
</item> | |||||
</attr> | |||||
<desc type="string">有钱就可以买</desc> | |||||
<id type="int64">1004</id> | |||||
<level type="int64">80</level> | |||||
<name type="string">黑切+蓝盾</name> | |||||
<str type="string">pos1</str> | |||||
<sub_level type="number">80</sub_level> | |||||
</item> | |||||
</cfg_array_example1> |
@ -0,0 +1,243 @@ | |||||
<?xml version="1.0" ?> | |||||
<cfg_array_example2> | |||||
<item index="0"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">900</item> | |||||
</item> | |||||
<item index="3"> | |||||
<add> | |||||
<item index="0" type="int64">4</item> | |||||
<item index="1" type="int64">100</item> | |||||
</add> | |||||
</item> | |||||
</attr> | |||||
<award1> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">2</item> | |||||
<item index="2" type="int64">3</item> | |||||
</award1> | |||||
<award2> | |||||
<id type="int64">1</id> | |||||
<num type="int64">3</num> | |||||
<type type="int64">2</type> | |||||
</award2> | |||||
<desc> | |||||
<item index="0" type="string">来源1</item> | |||||
<item index="1" type="string">来源2</item> | |||||
<item index="2" type="string">来源4</item> | |||||
</desc> | |||||
<id type="number">1</id> | |||||
<material> | |||||
<item index="0"> | |||||
<count type="int64">1</count> | |||||
<id type="int64">10001</id> | |||||
<res type="int64">1</res> | |||||
</item> | |||||
<item index="1"> | |||||
<count type="int64">1</count> | |||||
<id type="int64">10001</id> | |||||
<res type="int64">1</res> | |||||
</item> | |||||
</material> | |||||
<name type="string">examp1001</name> | |||||
</item> | |||||
<item index="1"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">901</item> | |||||
</item> | |||||
<item index="3"> | |||||
<add> | |||||
<item index="0" type="int64">5</item> | |||||
<item index="1" type="int64">100</item> | |||||
</add> | |||||
</item> | |||||
</attr> | |||||
<award1> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">2</item> | |||||
<item index="2" type="int64">3</item> | |||||
</award1> | |||||
<award2> | |||||
<id type="int64">1</id> | |||||
<num type="int64">3</num> | |||||
<type type="int64">2</type> | |||||
</award2> | |||||
<desc> | |||||
<item index="0" type="string">来源1</item> | |||||
<item index="1" type="string">来源2</item> | |||||
<item index="2" type="string">来源4</item> | |||||
</desc> | |||||
<id type="number">2</id> | |||||
<material> | |||||
<count type="int64">1</count> | |||||
<id type="int64">10001</id> | |||||
<res type="int64">1</res> | |||||
</material> | |||||
<name type="string">examp1002</name> | |||||
</item> | |||||
<item index="2"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">902</item> | |||||
</item> | |||||
<item index="3"> | |||||
<add> | |||||
<item index="0" type="int64">6</item> | |||||
<item index="1" type="int64">100</item> | |||||
</add> | |||||
</item> | |||||
</attr> | |||||
<award1> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">2</item> | |||||
<item index="2" type="int64">3</item> | |||||
</award1> | |||||
<award2> | |||||
<id type="int64">1</id> | |||||
<num type="int64">3</num> | |||||
<type type="int64">2</type> | |||||
</award2> | |||||
<desc> | |||||
<item index="0" type="string">来源1</item> | |||||
<item index="1" type="string">来源2</item> | |||||
<item index="2" type="string">来源5</item> | |||||
</desc> | |||||
<id type="number">3</id> | |||||
<material> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">2</item> | |||||
<item index="2" type="int64">3</item> | |||||
<item index="3" type="int64">4</item> | |||||
<item index="4" type="int64">5</item> | |||||
<item index="5" type="int64">6</item> | |||||
<item index="6" type="int64">7</item> | |||||
<item index="7" type="int64">8</item> | |||||
<item index="8" type="int64">9</item> | |||||
<item index="9" type="int64">9</item> | |||||
<item index="10" type="int64">9</item> | |||||
<item index="11" type="int64">9</item> | |||||
<item index="12" type="int64">9</item> | |||||
<item index="13" type="int64">9</item> | |||||
<item index="14" type="int64">9</item> | |||||
<item index="15" type="int64">9</item> | |||||
<item index="16" type="int64">9</item> | |||||
<item index="17" type="int64">9</item> | |||||
</material> | |||||
<name type="string">examp1003</name> | |||||
</item> | |||||
<item index="3"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">903</item> | |||||
</item> | |||||
<item index="3"> | |||||
<add> | |||||
<item index="0" type="int64">7</item> | |||||
<item index="1" type="int64">100</item> | |||||
</add> | |||||
</item> | |||||
</attr> | |||||
<award1> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">2</item> | |||||
<item index="2" type="int64">3</item> | |||||
</award1> | |||||
<award2> | |||||
<id type="int64">1</id> | |||||
<num type="int64">3</num> | |||||
<type type="int64">2</type> | |||||
</award2> | |||||
<desc> | |||||
<item index="0" type="string">来源1</item> | |||||
<item index="1" type="string">来源2</item> | |||||
<item index="2" type="string">来源6</item> | |||||
</desc> | |||||
<id type="number">4</id> | |||||
<material> | |||||
<item index="0" type="string">测试数据</item> | |||||
<item index="1" type="string">测试数据2</item> | |||||
<item index="2" type="string">测试数据3</item> | |||||
</material> | |||||
<name type="string">examp1004</name> | |||||
</item> | |||||
<item index="4"> | |||||
<attr> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">700</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">2</item> | |||||
<item index="1" type="int64">800</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">3</item> | |||||
<item index="1" type="int64">903</item> | |||||
</item> | |||||
<item index="3"> | |||||
<add> | |||||
<item index="0" type="int64">7</item> | |||||
<item index="1" type="int64">100</item> | |||||
</add> | |||||
</item> | |||||
</attr> | |||||
<award1> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">2</item> | |||||
<item index="2" type="int64">3</item> | |||||
</award1> | |||||
<award2> | |||||
<id type="int64">1</id> | |||||
<num type="int64">3</num> | |||||
<type type="int64">2</type> | |||||
</award2> | |||||
<desc> | |||||
<item index="0" type="string">来源1</item> | |||||
<item index="1" type="string">来源2</item> | |||||
<item index="2" type="string">来源6</item> | |||||
</desc> | |||||
<id type="number">5</id> | |||||
<material> | |||||
<item index="0" type="string">test</item> | |||||
</material> | |||||
<name type="string">examp1004</name> | |||||
</item> | |||||
</cfg_array_example2> |
@ -0,0 +1,4 @@ | |||||
<?xml version="1.0" ?> | |||||
<cfg_array_example3> | |||||
<level type="string">啦啦啦!!!</level> | |||||
</cfg_array_example3> |
@ -0,0 +1,88 @@ | |||||
<?xml version="1.0" ?> | |||||
<cfg_object> | |||||
<actId type="number">1001</actId> | |||||
<add_value1 type="number">100.1</add_value1> | |||||
<add_value2 type="int64">100</add_value2> | |||||
<award1> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1001</item> | |||||
<item index="1" type="int64">20</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">1002</item> | |||||
<item index="1" type="int64">20</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">1003</item> | |||||
<item index="1" type="int64">30</item> | |||||
</item> | |||||
</award1> | |||||
<award2> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1001</item> | |||||
<item index="1" type="int64">10</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">1002</item> | |||||
<item index="1" type="int64">20</item> | |||||
</item> | |||||
</award2> | |||||
<award4> | |||||
<aa> | |||||
<item index="0" type="int64">7003</item> | |||||
<item index="1" type="int64">1</item> | |||||
</aa> | |||||
<ff> | |||||
<item index="0" type="int64">3006</item> | |||||
<item index="1" type="int64">99</item> | |||||
</ff> | |||||
<rr> | |||||
<item index="0" type="int64">1001</item> | |||||
<item index="1" type="int64">20</item> | |||||
</rr> | |||||
<test type="string">这就是一个测试</test> | |||||
</award4> | |||||
<award6> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1001</item> | |||||
<item index="1" type="int64">20</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">3006</item> | |||||
<item index="1" type="int64">99</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">7003</item> | |||||
<item index="1" type="int64">1</item> | |||||
</item> | |||||
<item index="3"> | |||||
<jsonobject> | |||||
<item index="0" type="int64">12356</item> | |||||
<item index="1" type="int64">654321</item> | |||||
</jsonobject> | |||||
</item> | |||||
</award6> | |||||
<award7> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">2</item> | |||||
<item index="2" type="int64">3</item> | |||||
<item index="3" type="int64">4</item> | |||||
<item index="4" type="int64">5</item> | |||||
<item index="5" type="int64">6</item> | |||||
<item index="6" type="int64">7</item> | |||||
<item index="7" type="int64">8</item> | |||||
<item index="8" type="int64">9</item> | |||||
<item index="9" type="int64">9</item> | |||||
<item index="10" type="int64">9</item> | |||||
<item index="11" type="int64">9</item> | |||||
<item index="12" type="int64">9</item> | |||||
<item index="13" type="int64">9</item> | |||||
<item index="14" type="int64">9</item> | |||||
<item index="15" type="int64">9</item> | |||||
<item index="16" type="int64">9</item> | |||||
<item index="17" type="int64">9</item> | |||||
</award7> | |||||
<jj10000 type="string">前面字段为errorID,这里是错误描述,是的object配置的server,client字段名还支持数字作为key(但是转出格式为xml和jsonarray时就不支持了)</jj10000> | |||||
<open type="string">18:00:0</open> | |||||
<open_level type="int64">90</open_level> | |||||
</cfg_object> |
@ -0,0 +1,88 @@ | |||||
<?xml version="1.0" ?> | |||||
<cfg_object1_cfg_object> | |||||
<actId type="number">1001</actId> | |||||
<add_value1 type="number">100.1</add_value1> | |||||
<add_value2 type="int64">100</add_value2> | |||||
<award1> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1001</item> | |||||
<item index="1" type="int64">20</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">1002</item> | |||||
<item index="1" type="int64">20</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">1003</item> | |||||
<item index="1" type="int64">30</item> | |||||
</item> | |||||
</award1> | |||||
<award2> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1001</item> | |||||
<item index="1" type="int64">10</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">1002</item> | |||||
<item index="1" type="int64">20</item> | |||||
</item> | |||||
</award2> | |||||
<award4> | |||||
<aa> | |||||
<item index="0" type="int64">7003</item> | |||||
<item index="1" type="int64">1</item> | |||||
</aa> | |||||
<ff> | |||||
<item index="0" type="int64">3006</item> | |||||
<item index="1" type="int64">99</item> | |||||
</ff> | |||||
<rr> | |||||
<item index="0" type="int64">1001</item> | |||||
<item index="1" type="int64">20</item> | |||||
</rr> | |||||
<test type="string">这就是一个测试</test> | |||||
</award4> | |||||
<award6> | |||||
<item index="0"> | |||||
<item index="0" type="int64">1001</item> | |||||
<item index="1" type="int64">20</item> | |||||
</item> | |||||
<item index="1"> | |||||
<item index="0" type="int64">3006</item> | |||||
<item index="1" type="int64">99</item> | |||||
</item> | |||||
<item index="2"> | |||||
<item index="0" type="int64">7003</item> | |||||
<item index="1" type="int64">1</item> | |||||
</item> | |||||
<item index="3"> | |||||
<jsonobject> | |||||
<item index="0" type="int64">12356</item> | |||||
<item index="1" type="int64">654321</item> | |||||
</jsonobject> | |||||
</item> | |||||
</award6> | |||||
<award7> | |||||
<item index="0" type="int64">1</item> | |||||
<item index="1" type="int64">2</item> | |||||
<item index="2" type="int64">3</item> | |||||
<item index="3" type="int64">4</item> | |||||
<item index="4" type="int64">5</item> | |||||
<item index="5" type="int64">6</item> | |||||
<item index="6" type="int64">7</item> | |||||
<item index="7" type="int64">8</item> | |||||
<item index="8" type="int64">9</item> | |||||
<item index="9" type="int64">9</item> | |||||
<item index="10" type="int64">9</item> | |||||
<item index="11" type="int64">9</item> | |||||
<item index="12" type="int64">9</item> | |||||
<item index="13" type="int64">9</item> | |||||
<item index="14" type="int64">9</item> | |||||
<item index="15" type="int64">9</item> | |||||
<item index="16" type="int64">9</item> | |||||
<item index="17" type="int64">9</item> | |||||
</award7> | |||||
<jj10000 type="string">前面字段为errorID,这里是错误描述,是的object配置的server,client字段名还支持数字作为key(但是转出格式为xml和jsonarray时就不支持了)</jj10000> | |||||
<open type="string">fgfdg</open> | |||||
<open_level type="int64">90</open_level> | |||||
</cfg_object1_cfg_object> |
@ -0,0 +1,219 @@ | |||||
# -*- coding: gb2312 -*- | |||||
""" | |||||
打印颜色 | |||||
""" | |||||
import ctypes | |||||
import sys | |||||
STD_INPUT_HANDLE = -10 | |||||
STD_OUTPUT_HANDLE = -11 | |||||
STD_ERROR_HANDLE = -12 | |||||
# 字体颜色定义 ,关键在于颜色编码,由2位十六进制组成,分别取0~f,前一位指的是背景色,后一位指的是字体色 | |||||
#由于该函数的限制,应该是只有这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. | |||||
# 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. | |||||
# 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 | |||||
def resetColor(): | |||||
set_cmd_text_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE) | |||||
############################################################### | |||||
#暗蓝色 | |||||
#dark blue | |||||
def printDarkBlue(mess): | |||||
set_cmd_text_color(FOREGROUND_DARKBLUE) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#暗绿色 | |||||
#dark green | |||||
def printDarkGreen(mess): | |||||
set_cmd_text_color(FOREGROUND_DARKGREEN) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#暗天蓝色 | |||||
#dark sky blue | |||||
def printDarkSkyBlue(mess): | |||||
set_cmd_text_color(FOREGROUND_DARKSKYBLUE) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#暗红色 | |||||
#dark red | |||||
def printDarkRed(mess): | |||||
set_cmd_text_color(FOREGROUND_DARKRED) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#暗粉红色 | |||||
#dark pink | |||||
def printDarkPink(mess): | |||||
set_cmd_text_color(FOREGROUND_DARKPINK) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#暗黄色 | |||||
#dark yellow | |||||
def printDarkYellow(mess): | |||||
set_cmd_text_color(FOREGROUND_DARKYELLOW) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#暗白色 | |||||
#dark white | |||||
def printDarkWhite(mess): | |||||
set_cmd_text_color(FOREGROUND_DARKWHITE) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#暗灰色 | |||||
#dark gray | |||||
def printDarkGray(mess): | |||||
set_cmd_text_color(FOREGROUND_DARKGRAY) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#蓝色 | |||||
#blue | |||||
def printBlue(mess): | |||||
set_cmd_text_color(FOREGROUND_BLUE) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#绿色 | |||||
#green | |||||
def printGreen(mess): | |||||
set_cmd_text_color(FOREGROUND_GREEN) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#天蓝色 | |||||
#sky blue | |||||
def printSkyBlue(mess): | |||||
set_cmd_text_color(FOREGROUND_SKYBLUE) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#红色 | |||||
#red | |||||
def printRed(mess): | |||||
set_cmd_text_color(FOREGROUND_RED) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#粉红色 | |||||
#pink | |||||
def printPink(mess): | |||||
set_cmd_text_color(FOREGROUND_PINK) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#黄色 | |||||
#yellow | |||||
def printYellow(mess): | |||||
set_cmd_text_color(FOREGROUND_YELLOW) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#白色 | |||||
#white | |||||
def printWhite(mess): | |||||
set_cmd_text_color(FOREGROUND_WHITE) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
################################################## | |||||
#白底黑字 | |||||
#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 | |||||
def printWhiteBlack_2(mess): | |||||
set_cmd_text_color(0xf0) | |||||
sys.stdout.write(mess) | |||||
resetColor() | |||||
#黄底蓝字 | |||||
#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' ) |
@ -0,0 +1,442 @@ | |||||
#! python | |||||
# -*- coding:utf-8 -*- | |||||
import os | |||||
import re | |||||
import sys | |||||
import json | |||||
import openpyxl | |||||
import color_print | |||||
from slpp.slpp import slpp as lua | |||||
# array数组模式下,各个栏的分布 | |||||
# 1、2行是文档注释,不导出 | |||||
ACMT_ROW = 3 # comment row 注释 | |||||
ATPE_ROW = 4 # type row 类型 | |||||
ASRV_ROW = 5 # server row 服务器 | |||||
ACLT_ROW = 6 # client row 客户端 | |||||
AKEY_COL = 1 # key column key所在列 | |||||
# object(kv)模式下,各个栏的分布 | |||||
OCMT_COL = 1 # comment column 注释 | |||||
OTPE_COL = 2 # type column 类型 | |||||
OSRV_COL = 3 # server column 服务器 | |||||
OCLT_COL = 4 # client column 客户端 | |||||
OCTX_COL = 5 # content column 内容所在列 | |||||
# 1、2行是文档注释,不导出 | |||||
OFLG_ROW = 3 # flag row server client所在行 | |||||
SRV_FLAG = "server" | |||||
CLT_FLAG = "client" | |||||
SHEET_FLAG_ROW = 3 # 3列1行表示是array 还是object 或者是不用导出的表 | |||||
SHEET_FLAG_COL = 1 # 3列1行表示是array 还是object 或者是不用导出的表 | |||||
# 用于标识表的类型 不是这两种就不会导出数据 | |||||
ARRAY_FLAG = "array" # 标识表的是array类型的表 | |||||
OBJECT_FLAG = "object" # 标识表的是object类型的表 | |||||
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} | |||||
try: | |||||
basestring | |||||
except NameError: | |||||
basestring = str | |||||
# python3中没有uincode了,int能表示int64 | |||||
try: | |||||
long | |||||
except NameError: | |||||
long = int | |||||
# python3中没有unicode了 | |||||
try: | |||||
unicode | |||||
except NameError: | |||||
unicode = str | |||||
# 类型转换器 | |||||
class ValueConverter(object): | |||||
def __init__(self): | |||||
pass | |||||
# 在python中,字符串和unicode是不一样的。默认从excel读取的数据都是unicode。 | |||||
# str可以通过decode转换为unicode | |||||
# ascii' codec can't encode characters | |||||
# 这个函数在python3中没用 | |||||
def to_unicode_str( self,val ): | |||||
if isinstance( val,str ) : | |||||
return val | |||||
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 : | |||||
# 去除带小数时的小数点,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 list(eval(val)) | |||||
elif "dict" == val_type : | |||||
return dict(eval(val)) | |||||
else : | |||||
self.raise_error( "invalid type",value ) | |||||
class Sheet(object): | |||||
def __init__(self,base_name,wb_sheet,srv_writer,clt_writer): | |||||
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_keys = {} # 服务器key | |||||
self.clt_keys = {} # 客户端key | |||||
self.converter = ValueConverter() | |||||
self.wb_sheet = wb_sheet | |||||
self.base_name = 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" ) | |||||
self.base_file_name = match_list[0] | |||||
# 记录出错时的行列,方便策划定位问题 | |||||
self.error_row = 0 | |||||
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 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 ) | |||||
def to_value(self,val_type,val): | |||||
try: | |||||
return self.converter.to_value(val_type,val) | |||||
except Exception : | |||||
t, e = sys.exc_info()[:2] | |||||
self.raise_error( "ConverError",e ) | |||||
# 解析一个表格 | |||||
def decode_sheet(self): | |||||
wb_sheet = self.wb_sheet | |||||
self.decode_type () | |||||
self.decode_field() | |||||
self.decode_ctx () | |||||
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): | |||||
# 有些配置可能只导出客户端或只导出服务器 | |||||
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 : | |||||
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] | |||||
wt = writer(self.base_name,self.wb_sheet.title, write_file_name, keys_list, comment_text) | |||||
ctx = wt.context( ctx ) | |||||
suffix = wt.suffix() | |||||
if None != ctx : | |||||
path = base_path + write_file_name + suffix | |||||
#必须为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) | |||||
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 ) | |||||
# 导出数组类型配置,A1格子的内容有array标识 | |||||
class ArraySheet(Sheet): | |||||
def __init__(self,base_name,wb_sheet,srv_writer,clt_writer): | |||||
# 记录导出各行的内容 | |||||
self.srv_ctx = [] | |||||
self.clt_ctx = [] | |||||
super( ArraySheet, self ).__init__( | |||||
base_name,wb_sheet,srv_writer,clt_writer ) | |||||
# 解析各列的类型(string、number...) | |||||
def decode_type(self): | |||||
# 第一列没数据,类型可以不填,默认为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 | |||||
# 单元格为空的时候,wb_sheet.cell(row=1, column=2).value == None | |||||
# 类型那一行必须连续,空白表示后面的数据都不导出了 | |||||
if value == None : | |||||
break | |||||
if value not in TYPES : | |||||
self.raise_error( "invalid type",value ) | |||||
self.types.append( value ) | |||||
# 解析客户端、服务器的字段名(server、client)那两行 | |||||
def decode_one_field(self,fields,row_index, keys): | |||||
key_index = 1 | |||||
for col_index in range( AKEY_COL,len( self.types ) + 1 ): | |||||
value = self.wb_sheet.cell( | |||||
row = row_index, column = col_index ).value | |||||
# 对于array类型的表 一条数据可以有多个值作为KEY 需要处理一下 | |||||
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 ) | |||||
# 解析注释那一行 | |||||
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 | |||||
key = self.wb_sheet.cell( | |||||
row = key_index, column = col_index ).value | |||||
if None == key : | |||||
continue | |||||
# 对于不需要导出的field,可以为空。即value为None | |||||
if key.find(KEY_FLAG) >= 0 : | |||||
key = key[KEY_FLAG_LEN:] | |||||
fields[key] = value | |||||
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_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 | |||||
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 ) | |||||
# 解析出一行的内容 | |||||
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 | |||||
srv_key = self.srv_fields[col_idx - 1] | |||||
clt_key = self.clt_fields[col_idx - 1] | |||||
if srv_key : | |||||
srv_row[srv_key] = value | |||||
if clt_key : | |||||
clt_row[clt_key] = value | |||||
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 ) | |||||
if row_idx > 57 : | |||||
break | |||||
# 不为空才追加 | |||||
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): | |||||
def __init__(self,base_name,wb_sheet,srv_writer,clt_writer): | |||||
# 记录导出各行的内容 | |||||
self.srv_ctx = {} | |||||
self.clt_ctx = {} | |||||
super( ObjectSheet, self ).__init__( | |||||
base_name,wb_sheet,srv_writer,clt_writer ) | |||||
# 解析各字段的类型 | |||||
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 | |||||
# 类型必须连续,遇到空则认为后续数据不再导出 | |||||
if value == None : | |||||
break | |||||
if value not in TYPES : | |||||
self.raise_error( "invalid type",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 | |||||
# 对于不需要导出的field,可以为空。即value为None | |||||
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 | |||||
key = self.wb_sheet.cell( row = row_idx, column = key_index ).value | |||||
if None == value: | |||||
continue | |||||
# 导出存在值的fields的注释 | |||||
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_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 | |||||
# 在object的结构中,数据是从第二行开始的,所以types的下标偏移2 | |||||
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 ) | |||||
if row_idx > 54 : | |||||
break | |||||
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 | |||||
class ExcelDoc: | |||||
def __init__(self, file,abspath): | |||||
self.file = file | |||||
self.abspath = abspath | |||||
# 是否需要解析 | |||||
# 返回解析的对象类型 | |||||
def need_decode(self,wb_sheet): | |||||
sheet_val = wb_sheet.cell( | |||||
row = SHEET_FLAG_ROW, column = SHEET_FLAG_COL ).value | |||||
sheeter = None | |||||
srv_value = None | |||||
clt_value = None | |||||
if ARRAY_FLAG == sheet_val : | |||||
if wb_sheet.max_row <= ACLT_ROW or wb_sheet.max_column <= AKEY_COL: | |||||
return None | |||||
sheeter = ArraySheet | |||||
srv_value = wb_sheet.cell( row = ASRV_ROW, column = AKEY_COL ).value | |||||
clt_value = wb_sheet.cell( row = ACLT_ROW, column = AKEY_COL ).value | |||||
elif OBJECT_FLAG == sheet_val : | |||||
sheeter = ObjectSheet | |||||
srv_value = wb_sheet.cell( row = OFLG_ROW, column = OSRV_COL ).value | |||||
clt_value = wb_sheet.cell( row = OFLG_ROW, column = OCLT_COL ).value | |||||
else : | |||||
return None | |||||
# 没有这两个标识就不是配置表。可能是策划的一些备注说明 | |||||
if SRV_FLAG != srv_value or CLT_FLAG != clt_value : | |||||
return None | |||||
return sheeter | |||||
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 ) | |||||
for wb_sheet in wb.worksheets: | |||||
Sheeter = 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 ) | |||||
if sheet.decode_sheet() : | |||||
sheet.write_files( srv_path,clt_path ) |
@ -0,0 +1,12 @@ | |||||
@echo off | |||||
:python ConfigConvertTool.py --input ./config_excel --srv server/ --clt client/ --timeout -1 --suffix .xlsx --swriter lua --cwriter lua | |||||
:python ConfigConvertTool.py --input ./config_excel --srv server/ --clt client/ --timeout -1 --suffix .xlsx --swriter erlanghrl | |||||
:python ConfigConvertTool.py --input ./config_excel --srv server/ --clt client/ --timeout -1 --suffix .xlsx --swriter erlangerl | |||||
:python ConfigConvertTool.py --input ./config_excel --srv server/ --clt client/ --timeout -1 --suffix .xlsx --swriter elixir | |||||
:python ConfigConvertTool.py --input ./config_excel --srv server/ --clt client/ --timeout -1 --suffix .xlsx --swriter jsonobject | |||||
:python ConfigConvertTool.py --input ./config_excel --srv server/ --clt client/ --timeout -1 --suffix .xlsx --cwriter jsonarray | |||||
python ConfigConvertTool.py --input ./config_excel --srv server/ --clt client/ --timeout -1 --suffix .xlsx --swriter elixir --cwriter xml | |||||
pause |
@ -0,0 +1,6 @@ | |||||
#!/bin/bash | |||||
python reader.py --input ./ --srv server/ --clt client/ --timeout -1 --suffix .xlsx --swriter lua --cwriter json | |||||
python reader.py --input ./ --srv server/ --clt client/ --timeout -1 --suffix .xlsx --cwriter xml | |||||
python reader.py --input ./ --srv server/ --clt client/ --timeout -1 --suffix .xlsx --cwriter lua | |||||
@ -0,0 +1,14 @@ | |||||
%% Automatic generation from -->> | |||||
%% excel file name : A_object表示例--cfg_array | |||||
%% excel sheet name : +example3 | |||||
-module(cfg_array). | |||||
-compile(export_all). | |||||
%% 演示 | |||||
get('level') -> | |||||
"啦啦啦!!!"; | |||||
get(_) -> | |||||
undefined. |
@ -0,0 +1,16 @@ | |||||
## Automatic generation from -->> | |||||
## excel file name: A_object表示例--cfg_array | |||||
## excel sheet name: +example3 | |||||
defmodule Cfg_Array do | |||||
## 演示 | |||||
def get(:level) do | |||||
"啦啦啦!!!" | |||||
end | |||||
def get(_) do | |||||
:undefined | |||||
end | |||||
end |
@ -0,0 +1,3 @@ | |||||
{ | |||||
"level":"啦啦啦!!!" | |||||
} |
@ -0,0 +1,10 @@ | |||||
-- Automatic generation from -->> | |||||
-- excel file name: A_object表示例--cfg_array | |||||
-- excel sheet name: +example3 | |||||
local cfg_array = | |||||
{ | |||||
-- 演示 | |||||
level = '啦啦啦!!!' | |||||
} | |||||
return cfg_array |
@ -0,0 +1,311 @@ | |||||
%% Automatic generation from -->> | |||||
%% excel file name : A_array表示例--cfg_array | |||||
%% excel sheet name : 示例1-example1 | |||||
-module(cfg_array_example1). | |||||
-include("cfg_array_example1.hrl"). | |||||
-compile(export_all). | |||||
get(1001, "pos1", 88, 1) -> | |||||
#cfg_array_example1{ | |||||
'id' = 1001 | |||||
,'str' = "pos1" | |||||
,'level' = 88 | |||||
,'sub_level' = 1 | |||||
,'name' = "黑切+蓝盾" | |||||
,'attr' = [[1, 700], [2, 800], [3, 900]] | |||||
,'desc1' = "从小城镇" | |||||
}; | |||||
get(1001, "pos1", 88, 2) -> | |||||
#cfg_array_example1{ | |||||
'id' = 1001 | |||||
,'str' = "pos1" | |||||
,'level' = 88 | |||||
,'sub_level' = 2 | |||||
,'name' = "黑切+蓝盾" | |||||
,'attr' = [[1, 700], [2, 800], [3, 900]] | |||||
,'desc1' = "有钱就可以买" | |||||
}; | |||||
get(1001, "pos1", 89, 89) -> | |||||
#cfg_array_example1{ | |||||
'id' = 1001 | |||||
,'str' = "pos1" | |||||
,'level' = 89 | |||||
,'sub_level' = 89 | |||||
,'name' = "黑切+蓝盾" | |||||
,'attr' = [[1, 700], [2, 800], [3, 900]] | |||||
,'desc1' = "有钱就可以买" | |||||
}; | |||||
get(1001, "pos2", 88, 88.9) -> | |||||
#cfg_array_example1{ | |||||
'id' = 1001 | |||||
,'str' = "pos2" | |||||
,'level' = 88 | |||||
,'sub_level' = 88.9 | |||||
,'name' = "黑切+蓝盾" | |||||
,'attr' = [[1, 700], [2, 800], [3, 900]] | |||||
,'desc1' = "有钱就可以买" | |||||
}; | |||||
get(1001, "pos2", 89, 89) -> | |||||
#cfg_array_example1{ | |||||
'id' = 1001 | |||||
,'str' = "pos2" | |||||
,'level' = 89 | |||||
,'sub_level' = 89 | |||||
,'name' = "黑切+蓝盾" | |||||
,'attr' = [[1, 700], [2, 800], [3, 900]] | |||||
,'desc1' = "有钱就可以买" | |||||
}; | |||||
get(1002, "pos1", 88, 88) -> | |||||
#cfg_array_example1{ | |||||
'id' = 1002 | |||||
,'str' = "pos1" | |||||
,'level' = 88 | |||||
,'sub_level' = 88 | |||||
,'name' = "黑切+蓝盾" | |||||
,'attr' = [[1, 700], [2, 800], [3, 901]] | |||||
,'desc1' = "有钱就可以买" | |||||
}; | |||||
get(1002, "pos1", 89, 89) -> | |||||
#cfg_array_example1{ | |||||
'id' = 1002 | |||||
,'str' = "pos1" | |||||
,'level' = 89 | |||||
,'sub_level' = 89 | |||||
,'name' = "黑切+蓝盾" | |||||
,'attr' = [[1, 700], [2, 800], [3, 900]] | |||||
,'desc1' = "有钱就可以买" | |||||
}; | |||||
get(1002, "pos1", 90, 90) -> | |||||
#cfg_array_example1{ | |||||
'id' = 1002 | |||||
,'str' = "pos1" | |||||
,'level' = 90 | |||||
,'sub_level' = 90 | |||||
,'name' = "黑切+蓝盾" | |||||
,'attr' = [[1, 700], [2, 800], [3, 901]] | |||||
,'desc1' = "有钱就可以买" | |||||
}; | |||||
get(1002, "pos2", 88, 88) -> | |||||
#cfg_array_example1{ | |||||
'id' = 1002 | |||||
,'str' = "pos2" | |||||
,'level' = 88 | |||||
,'sub_level' = 88 | |||||
,'name' = "黑切+蓝盾" | |||||
,'attr' = [[1, 700], [2, 800], [3, 901]] | |||||
,'desc1' = "有钱就可以买" | |||||
}; | |||||
get(1002, "pos2", 89, 89) -> | |||||
#cfg_array_example1{ | |||||
'id' = 1002 | |||||
,'str' = "pos2" | |||||
,'level' = 89 | |||||
,'sub_level' = 89 | |||||
,'name' = "黑切+蓝盾" | |||||
,'attr' = [[1, 700], [2, 800], [3, 900]] | |||||
,'desc1' = "有钱就可以买" | |||||
}; | |||||
get(1002, "pos2", 90, 90) -> | |||||
#cfg_array_example1{ | |||||
'id' = 1002 | |||||
,'str' = "pos2" | |||||
,'level' = 90 | |||||
,'sub_level' = 90 | |||||
,'name' = "黑切+蓝盾" | |||||
,'attr' = [[1, 700], [2, 800], [3, 901]] | |||||
,'desc1' = "有钱就可以买" | |||||
}; | |||||
get(1003, "pos1", 85, 85) -> | |||||
#cfg_array_example1{ | |||||
'id' = 1003 | |||||
,'str' = "pos1" | |||||
,'level' = 85 | |||||
,'sub_level' = 85 | |||||
,'name' = "黑切+蓝盾" | |||||
,'attr' = [[1, 700], [2, 800], [3, 902]] | |||||
,'desc1' = "有钱就可以买" | |||||
}; | |||||
get(1004, "pos1", 80, 80) -> | |||||
#cfg_array_example1{ | |||||
'id' = 1004 | |||||
,'str' = "pos1" | |||||
,'level' = 80 | |||||
,'sub_level' = 80 | |||||
,'name' = "黑切+蓝盾" | |||||
,'attr' = [[1, 700], [2, 800], [3, 903]] | |||||
,'desc1' = "有钱就可以买" | |||||
}; | |||||
get(_, _, _, _) -> | |||||
undefined. | |||||
get_all() -> | |||||
[ | |||||
{1001, "pos1", 88, 1} | |||||
,{1001, "pos1", 88, 2} | |||||
,{1001, "pos1", 89, 89} | |||||
,{1001, "pos2", 88, 88.9} | |||||
,{1001, "pos2", 89, 89} | |||||
,{1002, "pos1", 88, 88} | |||||
,{1002, "pos1", 89, 89} | |||||
,{1002, "pos1", 90, 90} | |||||
,{1002, "pos2", 88, 88} | |||||
,{1002, "pos2", 89, 89} | |||||
,{1002, "pos2", 90, 90} | |||||
,{1003, "pos1", 85, 85} | |||||
,{1004, "pos1", 80, 80} | |||||
]. | |||||
get_list() -> | |||||
get_all(). | |||||
get_list(1001) -> | |||||
[ | |||||
{1001, "pos1", 88, 1} | |||||
,{1001, "pos1", 88, 2} | |||||
,{1001, "pos1", 89, 89} | |||||
,{1001, "pos2", 88, 88.9} | |||||
,{1001, "pos2", 89, 89} | |||||
]; | |||||
get_list(1002) -> | |||||
[ | |||||
{1002, "pos1", 88, 88} | |||||
,{1002, "pos1", 89, 89} | |||||
,{1002, "pos1", 90, 90} | |||||
,{1002, "pos2", 88, 88} | |||||
,{1002, "pos2", 89, 89} | |||||
,{1002, "pos2", 90, 90} | |||||
]; | |||||
get_list(1003) -> | |||||
[ | |||||
{1003, "pos1", 85, 85} | |||||
]; | |||||
get_list(1004) -> | |||||
[ | |||||
{1004, "pos1", 80, 80} | |||||
]; | |||||
get_list(_) -> | |||||
[]. | |||||
get_list(1001, "pos1") -> | |||||
[ | |||||
{1001, "pos1", 88, 1} | |||||
,{1001, "pos1", 88, 2} | |||||
,{1001, "pos1", 89, 89} | |||||
]; | |||||
get_list(1001, "pos2") -> | |||||
[ | |||||
{1001, "pos2", 88, 88.9} | |||||
,{1001, "pos2", 89, 89} | |||||
]; | |||||
get_list(1002, "pos1") -> | |||||
[ | |||||
{1002, "pos1", 88, 88} | |||||
,{1002, "pos1", 89, 89} | |||||
,{1002, "pos1", 90, 90} | |||||
]; | |||||
get_list(1002, "pos2") -> | |||||
[ | |||||
{1002, "pos2", 88, 88} | |||||
,{1002, "pos2", 89, 89} | |||||
,{1002, "pos2", 90, 90} | |||||
]; | |||||
get_list(1003, "pos1") -> | |||||
[ | |||||
{1003, "pos1", 85, 85} | |||||
]; | |||||
get_list(1004, "pos1") -> | |||||
[ | |||||
{1004, "pos1", 80, 80} | |||||
]; | |||||
get_list(_, _) -> | |||||
[]. | |||||
get_list(1001, "pos1", 88) -> | |||||
[ | |||||
{1001, "pos1", 88, 1} | |||||
,{1001, "pos1", 88, 2} | |||||
]; | |||||
get_list(1001, "pos1", 89) -> | |||||
[ | |||||
{1001, "pos1", 89, 89} | |||||
]; | |||||
get_list(1001, "pos2", 88) -> | |||||
[ | |||||
{1001, "pos2", 88, 88.9} | |||||
]; | |||||
get_list(1001, "pos2", 89) -> | |||||
[ | |||||
{1001, "pos2", 89, 89} | |||||
]; | |||||
get_list(1002, "pos1", 88) -> | |||||
[ | |||||
{1002, "pos1", 88, 88} | |||||
]; | |||||
get_list(1002, "pos1", 89) -> | |||||
[ | |||||
{1002, "pos1", 89, 89} | |||||
]; | |||||
get_list(1002, "pos1", 90) -> | |||||
[ | |||||
{1002, "pos1", 90, 90} | |||||
]; | |||||
get_list(1002, "pos2", 88) -> | |||||
[ | |||||
{1002, "pos2", 88, 88} | |||||
]; | |||||
get_list(1002, "pos2", 89) -> | |||||
[ | |||||
{1002, "pos2", 89, 89} | |||||
]; | |||||
get_list(1002, "pos2", 90) -> | |||||
[ | |||||
{1002, "pos2", 90, 90} | |||||
]; | |||||
get_list(1003, "pos1", 85) -> | |||||
[ | |||||
{1003, "pos1", 85, 85} | |||||
]; | |||||
get_list(1004, "pos1", 80) -> | |||||
[ | |||||
{1004, "pos1", 80, 80} | |||||
]; | |||||
get_list(_, _, _) -> | |||||
[]. | |||||
@ -0,0 +1,360 @@ | |||||
## Automatic generation from -->> | |||||
## excel file name: A_array表示例--cfg_array | |||||
## excel sheet name: 示例1-example1 | |||||
defmodule Cfg_Array_Example1 do | |||||
defstruct [ | |||||
:id, ## 唯一id | |||||
:str, ## 佩戴位置 | |||||
:level, ## 等级 | |||||
:sub_level, ## 等级 | |||||
:name, ## 装备名字 | |||||
:attr, ## 装备增加属性 | |||||
:desc1 ## 装备来源描述 | |||||
] | |||||
def get(1001, "pos1", 88, 1) do | |||||
%Cfg_Array_Example1{ | |||||
:id => 1001, | |||||
:str => "pos1", | |||||
:level => 88, | |||||
:sub_level => 1, | |||||
:name => "黑切+蓝盾", | |||||
:attr => [[1, 700], [2, 800], [3, 900]], | |||||
:desc1 => "从小城镇" | |||||
} | |||||
end | |||||
def get(1001, "pos1", 88, 2) do | |||||
%Cfg_Array_Example1{ | |||||
:id => 1001, | |||||
:str => "pos1", | |||||
:level => 88, | |||||
:sub_level => 2, | |||||
:name => "黑切+蓝盾", | |||||
:attr => [[1, 700], [2, 800], [3, 900]], | |||||
:desc1 => "有钱就可以买" | |||||
} | |||||
end | |||||
def get(1001, "pos1", 89, 89) do | |||||
%Cfg_Array_Example1{ | |||||
:id => 1001, | |||||
:str => "pos1", | |||||
:level => 89, | |||||
:sub_level => 89, | |||||
:name => "黑切+蓝盾", | |||||
:attr => [[1, 700], [2, 800], [3, 900]], | |||||
:desc1 => "有钱就可以买" | |||||
} | |||||
end | |||||
def get(1001, "pos2", 88, 88.9) do | |||||
%Cfg_Array_Example1{ | |||||
:id => 1001, | |||||
:str => "pos2", | |||||
:level => 88, | |||||
:sub_level => 88.9, | |||||
:name => "黑切+蓝盾", | |||||
:attr => [[1, 700], [2, 800], [3, 900]], | |||||
:desc1 => "有钱就可以买" | |||||
} | |||||
end | |||||
def get(1001, "pos2", 89, 89) do | |||||
%Cfg_Array_Example1{ | |||||
:id => 1001, | |||||
:str => "pos2", | |||||
:level => 89, | |||||
:sub_level => 89, | |||||
:name => "黑切+蓝盾", | |||||
:attr => [[1, 700], [2, 800], [3, 900]], | |||||
:desc1 => "有钱就可以买" | |||||
} | |||||
end | |||||
def get(1002, "pos1", 88, 88) do | |||||
%Cfg_Array_Example1{ | |||||
:id => 1002, | |||||
:str => "pos1", | |||||
:level => 88, | |||||
:sub_level => 88, | |||||
:name => "黑切+蓝盾", | |||||
:attr => [[1, 700], [2, 800], [3, 901]], | |||||
:desc1 => "有钱就可以买" | |||||
} | |||||
end | |||||
def get(1002, "pos1", 89, 89) do | |||||
%Cfg_Array_Example1{ | |||||
:id => 1002, | |||||
:str => "pos1", | |||||
:level => 89, | |||||
:sub_level => 89, | |||||
:name => "黑切+蓝盾", | |||||
:attr => [[1, 700], [2, 800], [3, 900]], | |||||
:desc1 => "有钱就可以买" | |||||
} | |||||
end | |||||
def get(1002, "pos1", 90, 90) do | |||||
%Cfg_Array_Example1{ | |||||
:id => 1002, | |||||
:str => "pos1", | |||||
:level => 90, | |||||
:sub_level => 90, | |||||
:name => "黑切+蓝盾", | |||||
:attr => [[1, 700], [2, 800], [3, 901]], | |||||
:desc1 => "有钱就可以买" | |||||
} | |||||
end | |||||
def get(1002, "pos2", 88, 88) do | |||||
%Cfg_Array_Example1{ | |||||
:id => 1002, | |||||
:str => "pos2", | |||||
:level => 88, | |||||
:sub_level => 88, | |||||
:name => "黑切+蓝盾", | |||||
:attr => [[1, 700], [2, 800], [3, 901]], | |||||
:desc1 => "有钱就可以买" | |||||
} | |||||
end | |||||
def get(1002, "pos2", 89, 89) do | |||||
%Cfg_Array_Example1{ | |||||
:id => 1002, | |||||
:str => "pos2", | |||||
:level => 89, | |||||
:sub_level => 89, | |||||
:name => "黑切+蓝盾", | |||||
:attr => [[1, 700], [2, 800], [3, 900]], | |||||
:desc1 => "有钱就可以买" | |||||
} | |||||
end | |||||
def get(1002, "pos2", 90, 90) do | |||||
%Cfg_Array_Example1{ | |||||
:id => 1002, | |||||
:str => "pos2", | |||||
:level => 90, | |||||
:sub_level => 90, | |||||
:name => "黑切+蓝盾", | |||||
:attr => [[1, 700], [2, 800], [3, 901]], | |||||
:desc1 => "有钱就可以买" | |||||
} | |||||
end | |||||
def get(1003, "pos1", 85, 85) do | |||||
%Cfg_Array_Example1{ | |||||
:id => 1003, | |||||
:str => "pos1", | |||||
:level => 85, | |||||
:sub_level => 85, | |||||
:name => "黑切+蓝盾", | |||||
:attr => [[1, 700], [2, 800], [3, 902]], | |||||
:desc1 => "有钱就可以买" | |||||
} | |||||
end | |||||
def get(1004, "pos1", 80, 80) do | |||||
%Cfg_Array_Example1{ | |||||
:id => 1004, | |||||
:str => "pos1", | |||||
:level => 80, | |||||
:sub_level => 80, | |||||
:name => "黑切+蓝盾", | |||||
:attr => [[1, 700], [2, 800], [3, 903]], | |||||
:desc1 => "有钱就可以买" | |||||
} | |||||
end | |||||
def get(_, _, _, _) do | |||||
:undefined | |||||
end | |||||
def get_all() do | |||||
[ | |||||
{1001, "pos1", 88, 1}, | |||||
{1001, "pos1", 88, 2}, | |||||
{1001, "pos1", 89, 89}, | |||||
{1001, "pos2", 88, 88.9}, | |||||
{1001, "pos2", 89, 89}, | |||||
{1002, "pos1", 88, 88}, | |||||
{1002, "pos1", 89, 89}, | |||||
{1002, "pos1", 90, 90}, | |||||
{1002, "pos2", 88, 88}, | |||||
{1002, "pos2", 89, 89}, | |||||
{1002, "pos2", 90, 90}, | |||||
{1003, "pos1", 85, 85}, | |||||
{1004, "pos1", 80, 80} | |||||
] | |||||
end | |||||
def get_list() do | |||||
get_all() | |||||
end | |||||
def get_list(1001) do | |||||
[ | |||||
{1001, "pos1", 88, 1}, | |||||
{1001, "pos1", 88, 2}, | |||||
{1001, "pos1", 89, 89}, | |||||
{1001, "pos2", 88, 88.9}, | |||||
{1001, "pos2", 89, 89} | |||||
] | |||||
end | |||||
def get_list(1002) do | |||||
[ | |||||
{1002, "pos1", 88, 88}, | |||||
{1002, "pos1", 89, 89}, | |||||
{1002, "pos1", 90, 90}, | |||||
{1002, "pos2", 88, 88}, | |||||
{1002, "pos2", 89, 89}, | |||||
{1002, "pos2", 90, 90} | |||||
] | |||||
end | |||||
def get_list(1003) do | |||||
[ | |||||
{1003, "pos1", 85, 85} | |||||
] | |||||
end | |||||
def get_list(1004) do | |||||
[ | |||||
{1004, "pos1", 80, 80} | |||||
] | |||||
end | |||||
def get_list(_) do | |||||
[] | |||||
end | |||||
def get_list(1001, "pos1") do | |||||
[ | |||||
{1001, "pos1", 88, 1}, | |||||
{1001, "pos1", 88, 2}, | |||||
{1001, "pos1", 89, 89} | |||||
] | |||||
end | |||||
def get_list(1001, "pos2") do | |||||
[ | |||||
{1001, "pos2", 88, 88.9}, | |||||
{1001, "pos2", 89, 89} | |||||
] | |||||
end | |||||
def get_list(1002, "pos1") do | |||||
[ | |||||
{1002, "pos1", 88, 88}, | |||||
{1002, "pos1", 89, 89}, | |||||
{1002, "pos1", 90, 90} | |||||
] | |||||
end | |||||
def get_list(1002, "pos2") do | |||||
[ | |||||
{1002, "pos2", 88, 88}, | |||||
{1002, "pos2", 89, 89}, | |||||
{1002, "pos2", 90, 90} | |||||
] | |||||
end | |||||
def get_list(1003, "pos1") do | |||||
[ | |||||
{1003, "pos1", 85, 85} | |||||
] | |||||
end | |||||
def get_list(1004, "pos1") do | |||||
[ | |||||
{1004, "pos1", 80, 80} | |||||
] | |||||
end | |||||
def get_list(_, _) do | |||||
[] | |||||
end | |||||
def get_list(1001, "pos1", 88) do | |||||
[ | |||||
{1001, "pos1", 88, 1}, | |||||
{1001, "pos1", 88, 2} | |||||
] | |||||
end | |||||
def get_list(1001, "pos1", 89) do | |||||
[ | |||||
{1001, "pos1", 89, 89} | |||||
] | |||||
end | |||||
def get_list(1001, "pos2", 88) do | |||||
[ | |||||
{1001, "pos2", 88, 88.9} | |||||
] | |||||
end | |||||
def get_list(1001, "pos2", 89) do | |||||
[ | |||||
{1001, "pos2", 89, 89} | |||||
] | |||||
end | |||||
def get_list(1002, "pos1", 88) do | |||||
[ | |||||
{1002, "pos1", 88, 88} | |||||
] | |||||
end | |||||
def get_list(1002, "pos1", 89) do | |||||
[ | |||||
{1002, "pos1", 89, 89} | |||||
] | |||||
end | |||||
def get_list(1002, "pos1", 90) do | |||||
[ | |||||
{1002, "pos1", 90, 90} | |||||
] | |||||
end | |||||
def get_list(1002, "pos2", 88) do | |||||
[ | |||||
{1002, "pos2", 88, 88} | |||||
] | |||||
end | |||||
def get_list(1002, "pos2", 89) do | |||||
[ | |||||
{1002, "pos2", 89, 89} | |||||
] | |||||
end | |||||
def get_list(1002, "pos2", 90) do | |||||
[ | |||||
{1002, "pos2", 90, 90} | |||||
] | |||||
end | |||||
def get_list(1003, "pos1", 85) do | |||||
[ | |||||
{1003, "pos1", 85, 85} | |||||
] | |||||
end | |||||
def get_list(1004, "pos1", 80) do | |||||
[ | |||||
{1004, "pos1", 80, 80} | |||||
] | |||||
end | |||||
def get_list(_, _, _) do | |||||
[] | |||||
end | |||||
end |
@ -0,0 +1,13 @@ | |||||
%% Automatic generation from -->> | |||||
%% excel file name : A_array表示例--cfg_array | |||||
%% excel sheet name : 示例1-example1 | |||||
-record(cfg_array_example1, { | |||||
'id' %% 唯一id | |||||
,'str' %% 佩戴位置 | |||||
,'level' %% 等级 | |||||
,'sub_level' %% 等级 | |||||
,'name' %% 装备名字 | |||||
,'attr' %% 装备增加属性 | |||||
,'desc1' %% 装备来源描述 | |||||
}). |
@ -0,0 +1,332 @@ | |||||
{ | |||||
"1001":{ | |||||
"pos1":{ | |||||
"88":{ | |||||
"1":{ | |||||
"id":1001, | |||||
"str":"pos1", | |||||
"level":88, | |||||
"sub_level":1, | |||||
"name":"黑切+蓝盾", | |||||
"desc1":"从小城镇", | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
900 | |||||
] | |||||
] | |||||
}, | |||||
"2":{ | |||||
"id":1001, | |||||
"str":"pos1", | |||||
"level":88, | |||||
"sub_level":2, | |||||
"name":"黑切+蓝盾", | |||||
"desc1":"有钱就可以买", | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
900 | |||||
] | |||||
] | |||||
} | |||||
}, | |||||
"89":{ | |||||
"89":{ | |||||
"id":1001, | |||||
"str":"pos1", | |||||
"level":89, | |||||
"sub_level":89, | |||||
"name":"黑切+蓝盾", | |||||
"desc1":"有钱就可以买", | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
900 | |||||
] | |||||
] | |||||
} | |||||
} | |||||
}, | |||||
"pos2":{ | |||||
"88":{ | |||||
"88.9":{ | |||||
"id":1001, | |||||
"str":"pos2", | |||||
"level":88, | |||||
"sub_level":88.9, | |||||
"name":"黑切+蓝盾", | |||||
"desc1":"有钱就可以买", | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
900 | |||||
] | |||||
] | |||||
} | |||||
}, | |||||
"89":{ | |||||
"89":{ | |||||
"id":1001, | |||||
"str":"pos2", | |||||
"level":89, | |||||
"sub_level":89, | |||||
"name":"黑切+蓝盾", | |||||
"desc1":"有钱就可以买", | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
900 | |||||
] | |||||
] | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
"1002":{ | |||||
"pos1":{ | |||||
"88":{ | |||||
"88":{ | |||||
"id":1002, | |||||
"str":"pos1", | |||||
"level":88, | |||||
"sub_level":88, | |||||
"name":"黑切+蓝盾", | |||||
"desc1":"有钱就可以买", | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
901 | |||||
] | |||||
] | |||||
} | |||||
}, | |||||
"89":{ | |||||
"89":{ | |||||
"id":1002, | |||||
"str":"pos1", | |||||
"level":89, | |||||
"sub_level":89, | |||||
"name":"黑切+蓝盾", | |||||
"desc1":"有钱就可以买", | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
900 | |||||
] | |||||
] | |||||
} | |||||
}, | |||||
"90":{ | |||||
"90":{ | |||||
"id":1002, | |||||
"str":"pos1", | |||||
"level":90, | |||||
"sub_level":90, | |||||
"name":"黑切+蓝盾", | |||||
"desc1":"有钱就可以买", | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
901 | |||||
] | |||||
] | |||||
} | |||||
} | |||||
}, | |||||
"pos2":{ | |||||
"88":{ | |||||
"88":{ | |||||
"id":1002, | |||||
"str":"pos2", | |||||
"level":88, | |||||
"sub_level":88, | |||||
"name":"黑切+蓝盾", | |||||
"desc1":"有钱就可以买", | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
901 | |||||
] | |||||
] | |||||
} | |||||
}, | |||||
"89":{ | |||||
"89":{ | |||||
"id":1002, | |||||
"str":"pos2", | |||||
"level":89, | |||||
"sub_level":89, | |||||
"name":"黑切+蓝盾", | |||||
"desc1":"有钱就可以买", | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
900 | |||||
] | |||||
] | |||||
} | |||||
}, | |||||
"90":{ | |||||
"90":{ | |||||
"id":1002, | |||||
"str":"pos2", | |||||
"level":90, | |||||
"sub_level":90, | |||||
"name":"黑切+蓝盾", | |||||
"desc1":"有钱就可以买", | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
901 | |||||
] | |||||
] | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
"1003":{ | |||||
"pos1":{ | |||||
"85":{ | |||||
"85":{ | |||||
"id":1003, | |||||
"str":"pos1", | |||||
"level":85, | |||||
"sub_level":85, | |||||
"name":"黑切+蓝盾", | |||||
"desc1":"有钱就可以买", | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
902 | |||||
] | |||||
] | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
"1004":{ | |||||
"pos1":{ | |||||
"80":{ | |||||
"80":{ | |||||
"id":1004, | |||||
"str":"pos1", | |||||
"level":80, | |||||
"sub_level":80, | |||||
"name":"黑切+蓝盾", | |||||
"desc1":"有钱就可以买", | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
903 | |||||
] | |||||
] | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,433 @@ | |||||
-- Automatic generation from -->> | |||||
-- excel file name: A_array表示例--cfg_array | |||||
-- excel sheet name: 示例1-example1 | |||||
local cfg_array_example1 = | |||||
--: id ## 唯一id | |||||
--: str ## 佩戴位置 | |||||
--: level ## 等级 | |||||
--: sub_level ## 等级 | |||||
--: name ## 装备名字 | |||||
--: attr ## 装备增加属性 | |||||
--: desc1 ## 装备来源描述 | |||||
{ | |||||
[1001] = | |||||
{ | |||||
pos1 = | |||||
{ | |||||
[88] = | |||||
{ | |||||
[1] = | |||||
{ | |||||
id = 1001, | |||||
str = 'pos1', | |||||
level = 88, | |||||
sub_level = 1, | |||||
name = '黑切+蓝盾', | |||||
desc1 = '从小城镇', | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 900 | |||||
} | |||||
} | |||||
}, | |||||
[2] = | |||||
{ | |||||
id = 1001, | |||||
str = 'pos1', | |||||
level = 88, | |||||
sub_level = 2, | |||||
name = '黑切+蓝盾', | |||||
desc1 = '有钱就可以买', | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 900 | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
[89] = | |||||
{ | |||||
[89] = | |||||
{ | |||||
id = 1001, | |||||
str = 'pos1', | |||||
level = 89, | |||||
sub_level = 89, | |||||
name = '黑切+蓝盾', | |||||
desc1 = '有钱就可以买', | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 900 | |||||
} | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
pos2 = | |||||
{ | |||||
[88] = | |||||
{ | |||||
[88.9] = | |||||
{ | |||||
id = 1001, | |||||
str = 'pos2', | |||||
level = 88, | |||||
sub_level = 88.9, | |||||
name = '黑切+蓝盾', | |||||
desc1 = '有钱就可以买', | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 900 | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
[89] = | |||||
{ | |||||
[89] = | |||||
{ | |||||
id = 1001, | |||||
str = 'pos2', | |||||
level = 89, | |||||
sub_level = 89, | |||||
name = '黑切+蓝盾', | |||||
desc1 = '有钱就可以买', | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 900 | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
[1002] = | |||||
{ | |||||
pos1 = | |||||
{ | |||||
[88] = | |||||
{ | |||||
[88] = | |||||
{ | |||||
id = 1002, | |||||
str = 'pos1', | |||||
level = 88, | |||||
sub_level = 88, | |||||
name = '黑切+蓝盾', | |||||
desc1 = '有钱就可以买', | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 901 | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
[89] = | |||||
{ | |||||
[89] = | |||||
{ | |||||
id = 1002, | |||||
str = 'pos1', | |||||
level = 89, | |||||
sub_level = 89, | |||||
name = '黑切+蓝盾', | |||||
desc1 = '有钱就可以买', | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 900 | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
[90] = | |||||
{ | |||||
[90] = | |||||
{ | |||||
id = 1002, | |||||
str = 'pos1', | |||||
level = 90, | |||||
sub_level = 90, | |||||
name = '黑切+蓝盾', | |||||
desc1 = '有钱就可以买', | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 901 | |||||
} | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
pos2 = | |||||
{ | |||||
[88] = | |||||
{ | |||||
[88] = | |||||
{ | |||||
id = 1002, | |||||
str = 'pos2', | |||||
level = 88, | |||||
sub_level = 88, | |||||
name = '黑切+蓝盾', | |||||
desc1 = '有钱就可以买', | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 901 | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
[89] = | |||||
{ | |||||
[89] = | |||||
{ | |||||
id = 1002, | |||||
str = 'pos2', | |||||
level = 89, | |||||
sub_level = 89, | |||||
name = '黑切+蓝盾', | |||||
desc1 = '有钱就可以买', | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 900 | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
[90] = | |||||
{ | |||||
[90] = | |||||
{ | |||||
id = 1002, | |||||
str = 'pos2', | |||||
level = 90, | |||||
sub_level = 90, | |||||
name = '黑切+蓝盾', | |||||
desc1 = '有钱就可以买', | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 901 | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
[1003] = | |||||
{ | |||||
pos1 = | |||||
{ | |||||
[85] = | |||||
{ | |||||
[85] = | |||||
{ | |||||
id = 1003, | |||||
str = 'pos1', | |||||
level = 85, | |||||
sub_level = 85, | |||||
name = '黑切+蓝盾', | |||||
desc1 = '有钱就可以买', | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 902 | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
[1004] = | |||||
{ | |||||
pos1 = | |||||
{ | |||||
[80] = | |||||
{ | |||||
[80] = | |||||
{ | |||||
id = 1004, | |||||
str = 'pos1', | |||||
level = 80, | |||||
sub_level = 80, | |||||
name = '黑切+蓝盾', | |||||
desc1 = '有钱就可以买', | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 903 | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
return cfg_array_example1 |
@ -0,0 +1,74 @@ | |||||
%% Automatic generation from -->> | |||||
%% excel file name : A_array表示例--cfg_array | |||||
%% excel sheet name : 示例2+example2 | |||||
-module(cfg_array_example2). | |||||
-include("cfg_array_example2.hrl"). | |||||
-compile(export_all). | |||||
get(1) -> | |||||
#cfg_array_example2{ | |||||
'id' = 1 | |||||
,'name' = "examp1001" | |||||
,'material' = [#{'res' => 1, 'id' => 10001, 'count' => 1}, #{'res' => 1, 'id' => 10001, 'count' => 1}] | |||||
,'attr' = [[1, 700], [2, 800], [3, 900], #{'add' => [4, 100]}] | |||||
,'award1' = {1, 2, 3} | |||||
,'award2' = #{'id' => 1, 'type' => 2, 'num' => 3} | |||||
}; | |||||
get(2) -> | |||||
#cfg_array_example2{ | |||||
'id' = 2 | |||||
,'name' = "examp1002" | |||||
,'material' = #{'res' => 1, 'id' => 10001, 'count' => 1} | |||||
,'attr' = [[1, 700], [2, 800], [3, 901], #{'add' => [5, 100]}] | |||||
,'award1' = {1, 2, 3} | |||||
,'award2' = #{'id' => 1, 'type' => 2, 'num' => 3} | |||||
}; | |||||
get(3) -> | |||||
#cfg_array_example2{ | |||||
'id' = 3 | |||||
,'name' = "examp1003" | |||||
,'material' = [1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9] | |||||
,'attr' = [[1, 700], [2, 800], [3, 902], #{'add' => [6, 100]}] | |||||
,'award1' = {1, 2, 3} | |||||
,'award2' = #{'id' => 1, 'type' => 2, 'num' => 3} | |||||
}; | |||||
get(4) -> | |||||
#cfg_array_example2{ | |||||
'id' = 4 | |||||
,'name' = "examp1004" | |||||
,'material' = ["测试数据", "测试数据2", "测试数据3"] | |||||
,'attr' = [[1, 700], [2, 800], [3, 903], #{'add' => [7, 100]}] | |||||
,'award1' = {1, 2, 3} | |||||
,'award2' = #{'id' => 1, 'type' => 2, 'num' => 3} | |||||
}; | |||||
get(5) -> | |||||
#cfg_array_example2{ | |||||
'id' = 5 | |||||
,'name' = "examp1004" | |||||
,'material' = ["test"] | |||||
,'attr' = [[1, 700], [2, 800], [3, 903], #{'add' => [7, 100]}] | |||||
,'award1' = {1, 2, 3} | |||||
,'award2' = #{'id' => 1, 'type' => 2, 'num' => 3} | |||||
}; | |||||
get(_) -> | |||||
undefined. | |||||
get_all() -> | |||||
[ | |||||
{1} | |||||
,{2} | |||||
,{3} | |||||
,{4} | |||||
,{5} | |||||
]. | |||||
get_list() -> | |||||
get_all(). | |||||
@ -0,0 +1,89 @@ | |||||
## Automatic generation from -->> | |||||
## excel file name: A_array表示例--cfg_array | |||||
## excel sheet name: 示例2+example2 | |||||
defmodule Cfg_Array_Example2 do | |||||
defstruct [ | |||||
:id, ## 英雄id | |||||
:name, ## 英雄名字 | |||||
:material, ## 合成消耗 | |||||
:attr, ## 属性 | |||||
:award1, ## 奖励1 | |||||
:award2 ## 奖励2 | |||||
] | |||||
def get(1) do | |||||
%Cfg_Array_Example2{ | |||||
:id => 1, | |||||
:name => "examp1001", | |||||
:material => [%{:res => 1, :id => 10001, :count => 1}, %{:res => 1, :id => 10001, :count => 1}], | |||||
:attr => [[1, 700], [2, 800], [3, 900], %{:add => [4, 100]}], | |||||
:award1 => {1, 2, 3}, | |||||
:award2 => %{:id => 1, :type => 2, :num => 3} | |||||
} | |||||
end | |||||
def get(2) do | |||||
%Cfg_Array_Example2{ | |||||
:id => 2, | |||||
:name => "examp1002", | |||||
:material => %{:res => 1, :id => 10001, :count => 1}, | |||||
:attr => [[1, 700], [2, 800], [3, 901], %{:add => [5, 100]}], | |||||
:award1 => {1, 2, 3}, | |||||
:award2 => %{:id => 1, :type => 2, :num => 3} | |||||
} | |||||
end | |||||
def get(3) do | |||||
%Cfg_Array_Example2{ | |||||
:id => 3, | |||||
:name => "examp1003", | |||||
:material => [1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9], | |||||
:attr => [[1, 700], [2, 800], [3, 902], %{:add => [6, 100]}], | |||||
:award1 => {1, 2, 3}, | |||||
:award2 => %{:id => 1, :type => 2, :num => 3} | |||||
} | |||||
end | |||||
def get(4) do | |||||
%Cfg_Array_Example2{ | |||||
:id => 4, | |||||
:name => "examp1004", | |||||
:material => ["测试数据", "测试数据2", "测试数据3"], | |||||
:attr => [[1, 700], [2, 800], [3, 903], %{:add => [7, 100]}], | |||||
:award1 => {1, 2, 3}, | |||||
:award2 => %{:id => 1, :type => 2, :num => 3} | |||||
} | |||||
end | |||||
def get(5) do | |||||
%Cfg_Array_Example2{ | |||||
:id => 5, | |||||
:name => "examp1004", | |||||
:material => ["test"], | |||||
:attr => [[1, 700], [2, 800], [3, 903], %{:add => [7, 100]}], | |||||
:award1 => {1, 2, 3}, | |||||
:award2 => %{:id => 1, :type => 2, :num => 3} | |||||
} | |||||
end | |||||
def get(_) do | |||||
:undefined | |||||
end | |||||
def get_all() do | |||||
[ | |||||
{1}, | |||||
{2}, | |||||
{3}, | |||||
{4}, | |||||
{5} | |||||
] | |||||
end | |||||
def get_list() do | |||||
get_all() | |||||
end | |||||
end |
@ -0,0 +1,12 @@ | |||||
%% Automatic generation from -->> | |||||
%% excel file name : A_array表示例--cfg_array | |||||
%% excel sheet name : 示例2+example2 | |||||
-record(cfg_array_example2, { | |||||
'id' %% 英雄id | |||||
,'name' %% 英雄名字 | |||||
,'material' %% 合成消耗 | |||||
,'attr' %% 属性 | |||||
,'award1' %% 奖励1 | |||||
,'award2' %% 奖励2 | |||||
}). |
@ -0,0 +1,217 @@ | |||||
{ | |||||
"1":{ | |||||
"id":1, | |||||
"name":"examp1001", | |||||
"material":[ | |||||
{ | |||||
"res":1, | |||||
"id":10001, | |||||
"count":1 | |||||
}, | |||||
{ | |||||
"res":1, | |||||
"id":10001, | |||||
"count":1 | |||||
} | |||||
], | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
900 | |||||
], | |||||
{ | |||||
"add":[ | |||||
4, | |||||
100 | |||||
] | |||||
} | |||||
], | |||||
"award1":[ | |||||
1, | |||||
2, | |||||
3 | |||||
], | |||||
"award2":{ | |||||
"id":1, | |||||
"type":2, | |||||
"num":3 | |||||
} | |||||
}, | |||||
"2":{ | |||||
"id":2, | |||||
"name":"examp1002", | |||||
"material":{ | |||||
"res":1, | |||||
"id":10001, | |||||
"count":1 | |||||
}, | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
901 | |||||
], | |||||
{ | |||||
"add":[ | |||||
5, | |||||
100 | |||||
] | |||||
} | |||||
], | |||||
"award1":[ | |||||
1, | |||||
2, | |||||
3 | |||||
], | |||||
"award2":{ | |||||
"id":1, | |||||
"type":2, | |||||
"num":3 | |||||
} | |||||
}, | |||||
"3":{ | |||||
"id":3, | |||||
"name":"examp1003", | |||||
"material":[ | |||||
1, | |||||
2, | |||||
3, | |||||
4, | |||||
5, | |||||
6, | |||||
7, | |||||
8, | |||||
9, | |||||
9, | |||||
9, | |||||
9, | |||||
9, | |||||
9, | |||||
9, | |||||
9, | |||||
9, | |||||
9 | |||||
], | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
902 | |||||
], | |||||
{ | |||||
"add":[ | |||||
6, | |||||
100 | |||||
] | |||||
} | |||||
], | |||||
"award1":[ | |||||
1, | |||||
2, | |||||
3 | |||||
], | |||||
"award2":{ | |||||
"id":1, | |||||
"type":2, | |||||
"num":3 | |||||
} | |||||
}, | |||||
"4":{ | |||||
"id":4, | |||||
"name":"examp1004", | |||||
"material":[ | |||||
"测试数据", | |||||
"测试数据2", | |||||
"测试数据3" | |||||
], | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
903 | |||||
], | |||||
{ | |||||
"add":[ | |||||
7, | |||||
100 | |||||
] | |||||
} | |||||
], | |||||
"award1":[ | |||||
1, | |||||
2, | |||||
3 | |||||
], | |||||
"award2":{ | |||||
"id":1, | |||||
"type":2, | |||||
"num":3 | |||||
} | |||||
}, | |||||
"5":{ | |||||
"id":5, | |||||
"name":"examp1004", | |||||
"material":[ | |||||
"test" | |||||
], | |||||
"attr":[ | |||||
[ | |||||
1, | |||||
700 | |||||
], | |||||
[ | |||||
2, | |||||
800 | |||||
], | |||||
[ | |||||
3, | |||||
903 | |||||
], | |||||
{ | |||||
"add":[ | |||||
7, | |||||
100 | |||||
] | |||||
} | |||||
], | |||||
"award1":[ | |||||
1, | |||||
2, | |||||
3 | |||||
], | |||||
"award2":{ | |||||
"id":1, | |||||
"type":2, | |||||
"num":3 | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,282 @@ | |||||
-- Automatic generation from -->> | |||||
-- excel file name: A_array表示例--cfg_array | |||||
-- excel sheet name: 示例2+example2 | |||||
local cfg_array_example2 = | |||||
--: id ## 英雄id | |||||
--: name ## 英雄名字 | |||||
--: material ## 合成消耗 | |||||
--: attr ## 属性 | |||||
--: award1 ## 奖励1 | |||||
--: award2 ## 奖励2 | |||||
{ | |||||
[1] = | |||||
{ | |||||
id = 1, | |||||
name = 'examp1001', | |||||
material = | |||||
{ | |||||
[1] = | |||||
{ | |||||
res = 1, | |||||
id = 10001, | |||||
count = 1 | |||||
}, | |||||
[2] = | |||||
{ | |||||
res = 1, | |||||
id = 10001, | |||||
count = 1 | |||||
} | |||||
}, | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 900 | |||||
}, | |||||
[4] = | |||||
{ | |||||
add = | |||||
{ | |||||
[1] = 4, | |||||
[2] = 100 | |||||
} | |||||
} | |||||
}, | |||||
award1 = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 2, | |||||
[3] = 3 | |||||
}, | |||||
award2 = | |||||
{ | |||||
id = 1, | |||||
type = 2, | |||||
num = 3 | |||||
} | |||||
}, | |||||
[2] = | |||||
{ | |||||
id = 2, | |||||
name = 'examp1002', | |||||
material = | |||||
{ | |||||
res = 1, | |||||
id = 10001, | |||||
count = 1 | |||||
}, | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 901 | |||||
}, | |||||
[4] = | |||||
{ | |||||
add = | |||||
{ | |||||
[1] = 5, | |||||
[2] = 100 | |||||
} | |||||
} | |||||
}, | |||||
award1 = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 2, | |||||
[3] = 3 | |||||
}, | |||||
award2 = | |||||
{ | |||||
id = 1, | |||||
type = 2, | |||||
num = 3 | |||||
} | |||||
}, | |||||
[3] = | |||||
{ | |||||
id = 3, | |||||
name = 'examp1003', | |||||
material = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 2, | |||||
[3] = 3, | |||||
[4] = 4, | |||||
[5] = 5, | |||||
[6] = 6, | |||||
[7] = 7, | |||||
[8] = 8, | |||||
[9] = 9, | |||||
[10] = 9, | |||||
[11] = 9, | |||||
[12] = 9, | |||||
[13] = 9, | |||||
[14] = 9, | |||||
[15] = 9, | |||||
[16] = 9, | |||||
[17] = 9, | |||||
[18] = 9 | |||||
}, | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 902 | |||||
}, | |||||
[4] = | |||||
{ | |||||
add = | |||||
{ | |||||
[1] = 6, | |||||
[2] = 100 | |||||
} | |||||
} | |||||
}, | |||||
award1 = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 2, | |||||
[3] = 3 | |||||
}, | |||||
award2 = | |||||
{ | |||||
id = 1, | |||||
type = 2, | |||||
num = 3 | |||||
} | |||||
}, | |||||
[4] = | |||||
{ | |||||
id = 4, | |||||
name = 'examp1004', | |||||
material = | |||||
{ | |||||
[1] = '测试数据', | |||||
[2] = '测试数据2', | |||||
[3] = '测试数据3' | |||||
}, | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 903 | |||||
}, | |||||
[4] = | |||||
{ | |||||
add = | |||||
{ | |||||
[1] = 7, | |||||
[2] = 100 | |||||
} | |||||
} | |||||
}, | |||||
award1 = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 2, | |||||
[3] = 3 | |||||
}, | |||||
award2 = | |||||
{ | |||||
id = 1, | |||||
type = 2, | |||||
num = 3 | |||||
} | |||||
}, | |||||
[5] = | |||||
{ | |||||
id = 5, | |||||
name = 'examp1004', | |||||
material = | |||||
{ | |||||
[1] = 'test' | |||||
}, | |||||
attr = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 700 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 2, | |||||
[2] = 800 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 3, | |||||
[2] = 903 | |||||
}, | |||||
[4] = | |||||
{ | |||||
add = | |||||
{ | |||||
[1] = 7, | |||||
[2] = 100 | |||||
} | |||||
} | |||||
}, | |||||
award1 = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 2, | |||||
[3] = 3 | |||||
}, | |||||
award2 = | |||||
{ | |||||
id = 1, | |||||
type = 2, | |||||
num = 3 | |||||
} | |||||
} | |||||
} | |||||
return cfg_array_example2 |
@ -0,0 +1,14 @@ | |||||
%% Automatic generation from -->> | |||||
%% excel file name : A_array表示例--cfg_array | |||||
%% excel sheet name : +example3 | |||||
-module(cfg_array_example3). | |||||
-compile(export_all). | |||||
%% 演示 | |||||
get('level') -> | |||||
"啦啦啦!!!"; | |||||
get(_) -> | |||||
undefined. |
@ -0,0 +1,16 @@ | |||||
## Automatic generation from -->> | |||||
## excel file name: A_array表示例--cfg_array | |||||
## excel sheet name: +example3 | |||||
defmodule Cfg_Array_Example3 do | |||||
## 演示 | |||||
def get(:level) do | |||||
"啦啦啦!!!" | |||||
end | |||||
def get(_) do | |||||
:undefined | |||||
end | |||||
end |
@ -0,0 +1,3 @@ | |||||
{ | |||||
"level":"啦啦啦!!!" | |||||
} |
@ -0,0 +1,10 @@ | |||||
-- Automatic generation from -->> | |||||
-- excel file name: A_array表示例--cfg_array | |||||
-- excel sheet name: +example3 | |||||
local cfg_array_example3 = | |||||
{ | |||||
-- 演示 | |||||
level = '啦啦啦!!!' | |||||
} | |||||
return cfg_array_example3 |
@ -0,0 +1,58 @@ | |||||
%% Automatic generation from -->> | |||||
%% excel file name : A_object表示例--cfg_object | |||||
%% excel sheet name : 武器(这个sheet就不会附加到导出名后部分) | |||||
-module(cfg_object). | |||||
-compile(export_all). | |||||
%% 开放等级 | |||||
get('open_level') -> | |||||
90; | |||||
%% 额外添加属性值1 | |||||
get('add_value1') -> | |||||
100.1; | |||||
%% 额外添加属性值2 | |||||
get('add_value2') -> | |||||
100; | |||||
%% 活动id | |||||
get('act_id') -> | |||||
1001; | |||||
%% 开始时间 | |||||
get('open') -> | |||||
"18:00:0"; | |||||
%% 错误信息 | |||||
get(10000) -> | |||||
"前面字段为errorID,这里是错误描述,是的object配置的server,client字段名还支持数字作为key(但是转出格式为xml和jsonarray时就不支持了)"; | |||||
%% 奖励1 | |||||
get('award1') -> | |||||
[[1001, 20], {1002, 20}, [1003, 30]]; | |||||
%% 奖励2 | |||||
get('award2') -> | |||||
{{1001, 10}, [1002, 20]}; | |||||
%% 奖励3(这条转成xml是就会报错) | |||||
get('award3') -> | |||||
#{1 => #{'res' => 1001, 'id' => 10001, 'count' => 1}, 2 => #{'res' => [1002, 1], 'id' => 10001, 'count' => 1}}; | |||||
%% 奖励4 | |||||
get('award4') -> | |||||
#{'rr' => [1001, 20], 'ff' => [3006, 99], 'aa' => [7003, 1], 'test' => "这就是一个测试"}; | |||||
%% 奖励5 | |||||
get('award5') -> | |||||
[1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]; | |||||
%% 奖励 | |||||
get('award6') -> | |||||
[[1001, 20], [3006, 99], [7003, 1], #{'jsonobject' => [12356, 654321]}]; | |||||
get(_) -> | |||||
undefined. |
@ -0,0 +1,71 @@ | |||||
## Automatic generation from -->> | |||||
## excel file name: A_object表示例--cfg_object | |||||
## excel sheet name: 武器(这个sheet就不会附加到导出名后部分) | |||||
defmodule Cfg_Object do | |||||
## 开放等级 | |||||
def get(:open_level) do | |||||
90 | |||||
end | |||||
## 额外添加属性值1 | |||||
def get(:add_value1) do | |||||
100.1 | |||||
end | |||||
## 额外添加属性值2 | |||||
def get(:add_value2) do | |||||
100 | |||||
end | |||||
## 活动id | |||||
def get(:act_id) do | |||||
1001 | |||||
end | |||||
## 开始时间 | |||||
def get(:open) do | |||||
"18:00:0" | |||||
end | |||||
## 错误信息 | |||||
def get(10000) do | |||||
"前面字段为errorID,这里是错误描述,是的object配置的server,client字段名还支持数字作为key(但是转出格式为xml和jsonarray时就不支持了)" | |||||
end | |||||
## 奖励1 | |||||
def get(:award1) do | |||||
[[1001, 20], {1002, 20}, [1003, 30]] | |||||
end | |||||
## 奖励2 | |||||
def get(:award2) do | |||||
{{1001, 10}, [1002, 20]} | |||||
end | |||||
## 奖励3(这条转成xml是就会报错,因为KEY为数字) | |||||
def get(:award3) do | |||||
%{1 => %{:res => 1001, :id => 10001, :count => 1}, 2 => %{:res => [1002, 1], :id => 10001, :count => 1}} | |||||
end | |||||
## 奖励4 | |||||
def get(:award4) do | |||||
%{:rr => [1001, 20], :ff => [3006, 99], :aa => [7003, 1], :test => "这就是一个测试"} | |||||
end | |||||
## 奖励5 | |||||
def get(:award5) do | |||||
[1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9] | |||||
end | |||||
## 奖励 | |||||
def get(:award6) do | |||||
[[1001, 20], [3006, 99], [7003, 1], %{:jsonobject => [12356, 654321]}] | |||||
end | |||||
def get(_) do | |||||
:undefined | |||||
end | |||||
end |
@ -0,0 +1,102 @@ | |||||
{ | |||||
"open_level":90, | |||||
"add_value1":100.1, | |||||
"add_value2":100, | |||||
"act_id":1001, | |||||
"open":"18:00:0", | |||||
"10000":"前面字段为errorID,这里是错误描述,是的object配置的server,client字段名还支持数字作为key(但是转出格式为xml和jsonarray时就不支持了)", | |||||
"award1":[ | |||||
[ | |||||
1001, | |||||
20 | |||||
], | |||||
[ | |||||
1002, | |||||
20 | |||||
], | |||||
[ | |||||
1003, | |||||
30 | |||||
] | |||||
], | |||||
"award2":[ | |||||
[ | |||||
1001, | |||||
10 | |||||
], | |||||
[ | |||||
1002, | |||||
20 | |||||
] | |||||
], | |||||
"award3":{ | |||||
"1":{ | |||||
"res":1001, | |||||
"id":10001, | |||||
"count":1 | |||||
}, | |||||
"2":{ | |||||
"id":10001, | |||||
"count":1, | |||||
"res":[ | |||||
1002, | |||||
1 | |||||
] | |||||
} | |||||
}, | |||||
"award4":{ | |||||
"test":"这就是一个测试", | |||||
"rr":[ | |||||
1001, | |||||
20 | |||||
], | |||||
"ff":[ | |||||
3006, | |||||
99 | |||||
], | |||||
"aa":[ | |||||
7003, | |||||
1 | |||||
] | |||||
}, | |||||
"award5":[ | |||||
1, | |||||
2, | |||||
3, | |||||
4, | |||||
5, | |||||
6, | |||||
7, | |||||
8, | |||||
9, | |||||
9, | |||||
9, | |||||
9, | |||||
9, | |||||
9, | |||||
9, | |||||
9, | |||||
9, | |||||
9 | |||||
], | |||||
"award6":[ | |||||
[ | |||||
1001, | |||||
20 | |||||
], | |||||
[ | |||||
3006, | |||||
99 | |||||
], | |||||
[ | |||||
7003, | |||||
1 | |||||
], | |||||
{ | |||||
"jsonobject":[ | |||||
12356, | |||||
654321 | |||||
] | |||||
} | |||||
] | |||||
} |
@ -0,0 +1,153 @@ | |||||
-- Automatic generation from -->> | |||||
-- excel file name: A_object表示例--cfg_object | |||||
-- excel sheet name: 武器(这个sheet就不会附加到导出名后部分) | |||||
local cfg_object = | |||||
{ | |||||
-- 开放等级 | |||||
open_level =90, | |||||
-- 额外添加属性值1 | |||||
add_value1 =100.1, | |||||
-- 额外添加属性值2 | |||||
add_value2 =100, | |||||
-- 活动id | |||||
act_id =1001, | |||||
-- 开始时间 | |||||
open ='18:00:0', | |||||
-- 错误信息 | |||||
[10000] ='前面字段为errorID,这里是错误描述,是的object配置的server,client字段名还支持数字作为key(但是转出格式为xml和jsonarray时就不支持了)', | |||||
-- 奖励1 | |||||
award1 = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1001, | |||||
[2] = 20 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 1002, | |||||
[2] = 20 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 1003, | |||||
[2] = 30 | |||||
} | |||||
}, | |||||
-- 奖励2 | |||||
award2 = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1001, | |||||
[2] = 10 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 1002, | |||||
[2] = 20 | |||||
} | |||||
}, | |||||
-- 奖励3(这条转成xml是就会报错) | |||||
award3 = | |||||
{ | |||||
[1] = | |||||
{ | |||||
res = 1001, | |||||
id = 10001, | |||||
count = 1 | |||||
}, | |||||
[2] = | |||||
{ | |||||
id = 10001, | |||||
count = 1, | |||||
res = | |||||
{ | |||||
[1] = 1002, | |||||
[2] = 1 | |||||
} | |||||
} | |||||
}, | |||||
-- 奖励4 | |||||
award4 = | |||||
{ | |||||
test = '这就是一个测试', | |||||
rr = | |||||
{ | |||||
[1] = 1001, | |||||
[2] = 20 | |||||
}, | |||||
ff = | |||||
{ | |||||
[1] = 3006, | |||||
[2] = 99 | |||||
}, | |||||
aa = | |||||
{ | |||||
[1] = 7003, | |||||
[2] = 1 | |||||
} | |||||
}, | |||||
-- 奖励5 | |||||
award5 = | |||||
{ | |||||
[1] = 1, | |||||
[2] = 2, | |||||
[3] = 3, | |||||
[4] = 4, | |||||
[5] = 5, | |||||
[6] = 6, | |||||
[7] = 7, | |||||
[8] = 8, | |||||
[9] = 9, | |||||
[10] = 9, | |||||
[11] = 9, | |||||
[12] = 9, | |||||
[13] = 9, | |||||
[14] = 9, | |||||
[15] = 9, | |||||
[16] = 9, | |||||
[17] = 9, | |||||
[18] = 9 | |||||
}, | |||||
-- 奖励 | |||||
award6 = | |||||
{ | |||||
[1] = | |||||
{ | |||||
[1] = 1001, | |||||
[2] = 20 | |||||
}, | |||||
[2] = | |||||
{ | |||||
[1] = 3006, | |||||
[2] = 99 | |||||
}, | |||||
[3] = | |||||
{ | |||||
[1] = 7003, | |||||
[2] = 1 | |||||
}, | |||||
[4] = | |||||
{ | |||||
jsonobject = | |||||
{ | |||||
[1] = 12356, | |||||
[2] = 654321 | |||||
} | |||||
} | |||||
} | |||||
} | |||||
return cfg_object |
@ -0,0 +1,71 @@ | |||||
## Automatic generation from -->> | |||||
## excel file name: A_object表示例--cfg_object1 | |||||
## excel sheet name: A_object表示例--cfg_object | |||||
defmodule Cfg_Object1_Cfg_Object do | |||||
## 开放等级 | |||||
def get(:open_level) do | |||||
90 | |||||
end | |||||
## 额外添加属性值1 | |||||
def get(:add_value1) do | |||||
100.1 | |||||
end | |||||
## 额外添加属性值2 | |||||
def get(:add_value2) do | |||||
100 | |||||
end | |||||
## 活动id | |||||
def get(:act_id) do | |||||
1001 | |||||
end | |||||
## 开始时间 | |||||
def get(:open) do | |||||
"fgfdg" | |||||
end | |||||
## 错误信息 | |||||
def get(10000) do | |||||
"前面字段为errorID,这里是错误描述,是的object配置的server,client字段名还支持数字作为key(但是转出格式为xml和jsonarray时就不支持了)" | |||||
end | |||||
## 奖励1 | |||||
def get(:award1) do | |||||
[[1001, 20], {1002, 20}, [1003, 30]] | |||||
end | |||||
## 奖励2 | |||||
def get(:award2) do | |||||
{{1001, 10}, [1002, 20]} | |||||
end | |||||
## 奖励3(这条转成xml是就会报错,因为KEY为数字) | |||||
def get(:award3) do | |||||
%{1 => %{:res => 1001, :id => 10001, :count => 1}, 2 => %{:res => [1002, 1], :id => 10001, :count => 1}} | |||||
end | |||||
## 奖励4 | |||||
def get(:award4) do | |||||
%{:rr => [1001, 20], :ff => [3006, 99], :aa => [7003, 1], :test => "这就是一个测试"} | |||||
end | |||||
## 奖励5 | |||||
def get(:award5) do | |||||
[1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9] | |||||
end | |||||
## 奖励 | |||||
def get(:award6) do | |||||
[[1001, 20], [3006, 99], [7003, 1], %{:jsonobject => [12356, 654321]}] | |||||
end | |||||
def get(_) do | |||||
:undefined | |||||
end | |||||
end |
@ -0,0 +1,4 @@ | |||||
*.pyc | |||||
*~ | |||||
@ -0,0 +1,19 @@ | |||||
Copyright (c) 2010, 2011, 2012 SirAnthony <anthony at adsorbtion.org> | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
of this software and associated documentation files (the "Software"), to deal | |||||
in the Software without restriction, including without limitation the rights | |||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
copies of the Software, and to permit persons to whom the Software is | |||||
furnished to do so, subject to the following conditions: | |||||
The above copyright notice and this permission notice shall be included in | |||||
all copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
THE SOFTWARE. |
@ -0,0 +1,41 @@ | |||||
#### SLPP | |||||
SLPP is a simple lua-python data structures parser. | |||||
Lua data check: | |||||
```lua | |||||
data = '{ array = { 65, 23, 5 }, dict = { string = "value", array = { 3, 6, 4}, mixed = { 43, 54.3, false, string = "value", 9 } } }' | |||||
> data = assert(loadstring('return ' .. data))() | |||||
> for i,j in pairs(data['dict']) do print(i,j) end | |||||
mixed table: 0x2014290 | |||||
string value | |||||
array table: 0x2014200 | |||||
``` | |||||
Parse lua data: | |||||
```python | |||||
>>> from slpp import slpp as lua | |||||
>>> data = lua.decode('{ array = { 65, 23, 5 }, dict = { string = "value", array = { 3, 6, 4}, mixed = { 43, 54.3, false, string = "value", 9 } } }') | |||||
>>> print data | |||||
{'array': [65, 23, 5], 'dict': {'mixed': {0: 43, 1: 54.33, 2: False, 4: 9, 'string': 'value'}, 'array': [3, 6, 4], 'string': 'value'}} | |||||
``` | |||||
Dump python object: | |||||
```python | |||||
>>> lua.encode(data) | |||||
'{array = {65,23,5},dict = {mixed = {43,54.33,false,9,string = "value"},array = {3,6,4},string = "value"}}' | |||||
``` | |||||
Dump test: | |||||
```lua | |||||
> data = assert(loadstring('return ' .. '{array = {65,23,5,},dict = {mixed = {43,54.33,false,9,string = "value",},array = {3,6,4,},string = "value",},}'))() | |||||
> print(data['dict']) | |||||
table: 0x1b64ea0 | |||||
> for i,j in pairs(data['dict']) do print(i,j) end | |||||
mixed table: 0x880afe0 | |||||
array table: 0x880af60 | |||||
string value | |||||
``` |
@ -0,0 +1,13 @@ | |||||
#!/usr/bin/env python | |||||
from distutils.core import setup | |||||
setup( | |||||
name='SLPP', | |||||
description='SLPP is a simple lua-python data structures parser', | |||||
version='1.0', | |||||
author='SirAnthony', | |||||
url='https://github.com/SirAnthony/slpp', | |||||
license='https://github.com/SirAnthony/slpp/blob/master/LICENSE', | |||||
keywords=['lua'], | |||||
py_modules=['slpp'], | |||||
) |
@ -0,0 +1,4 @@ | |||||
*.pyc | |||||
*~ | |||||
@ -0,0 +1,19 @@ | |||||
Copyright (c) 2010, 2011, 2012 SirAnthony <anthony at adsorbtion.org> | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
of this software and associated documentation files (the "Software"), to deal | |||||
in the Software without restriction, including without limitation the rights | |||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
copies of the Software, and to permit persons to whom the Software is | |||||
furnished to do so, subject to the following conditions: | |||||
The above copyright notice and this permission notice shall be included in | |||||
all copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
THE SOFTWARE. |
@ -0,0 +1,41 @@ | |||||
#### SLPP | |||||
SLPP is a simple lua-python data structures parser. | |||||
Lua data check: | |||||
```lua | |||||
data = '{ array = { 65, 23, 5 }, dict = { string = "value", array = { 3, 6, 4}, mixed = { 43, 54.3, false, string = "value", 9 } } }' | |||||
> data = assert(loadstring('return ' .. data))() | |||||
> for i,j in pairs(data['dict']) do print(i,j) end | |||||
mixed table: 0x2014290 | |||||
string value | |||||
array table: 0x2014200 | |||||
``` | |||||
Parse lua data: | |||||
```python | |||||
>>> from slpp import slpp as lua | |||||
>>> data = lua.decode('{ array = { 65, 23, 5 }, dict = { string = "value", array = { 3, 6, 4}, mixed = { 43, 54.3, false, string = "value", 9 } } }') | |||||
>>> print data | |||||
{'array': [65, 23, 5], 'dict': {'mixed': {0: 43, 1: 54.33, 2: False, 4: 9, 'string': 'value'}, 'array': [3, 6, 4], 'string': 'value'}} | |||||
``` | |||||
Dump python object: | |||||
```python | |||||
>>> lua.encode(data) | |||||
'{array = {65,23,5},dict = {mixed = {43,54.33,false,9,string = "value"},array = {3,6,4},string = "value"}}' | |||||
``` | |||||
Dump test: | |||||
```lua | |||||
> data = assert(loadstring('return ' .. '{array = {65,23,5,},dict = {mixed = {43,54.33,false,9,string = "value",},array = {3,6,4,},string = "value",},}'))() | |||||
> print(data['dict']) | |||||
table: 0x1b64ea0 | |||||
> for i,j in pairs(data['dict']) do print(i,j) end | |||||
mixed table: 0x880afe0 | |||||
array table: 0x880af60 | |||||
string value | |||||
``` |
@ -0,0 +1,13 @@ | |||||
#!/usr/bin/env python | |||||
from distutils.core import setup | |||||
setup( | |||||
name='SLPP', | |||||
description='SLPP is a simple lua-python data structures parser', | |||||
version='1.0', | |||||
author='SirAnthony', | |||||
url='https://github.com/SirAnthony/slpp', | |||||
license='https://github.com/SirAnthony/slpp/blob/master/LICENSE', | |||||
keywords=['lua'], | |||||
py_modules=['slpp'], | |||||
) |
@ -0,0 +1,262 @@ | |||||
import re | |||||
import sys | |||||
ERRORS = { | |||||
'unexp_end_string': u'Unexpected end of string while parsing Lua string.', | |||||
'unexp_end_table': u'Unexpected end of table while parsing Lua string.', | |||||
'mfnumber_minus': u'Malformed number (no digits after initial minus).', | |||||
'mfnumber_dec_point': u'Malformed number (no digits after decimal point).', | |||||
'mfnumber_sci': u'Malformed number (bad scientific format).', | |||||
} | |||||
# Python 3 renamed the unicode type to str, | |||||
# the old str type has been replaced by bytes | |||||
try: | |||||
basestring | |||||
except NameError: | |||||
basestring = str | |||||
try: | |||||
unicode | |||||
except NameError: | |||||
unicode = str | |||||
class ParseError(Exception): | |||||
pass | |||||
class SLPP(object): | |||||
def __init__(self): | |||||
self.text = '' | |||||
self.ch = '' | |||||
self.at = 0 | |||||
self.len = 0 | |||||
self.depth = 0 | |||||
self.space = re.compile('\s', re.M) | |||||
self.alnum = re.compile('\w', re.M) | |||||
self.newline = '\n' | |||||
self.tab = '\t' | |||||
def decode(self, text): | |||||
if not text or not isinstance(text, basestring): | |||||
return | |||||
#FIXME: only short comments removed | |||||
reg = re.compile('--.*$', re.M) | |||||
text = reg.sub('', text, 0) | |||||
self.text = text | |||||
self.at, self.ch, self.depth = 0, '', 0 | |||||
self.len = len(text) | |||||
self.next_chr() | |||||
result = self.value() | |||||
return result | |||||
def encode(self, obj): | |||||
self.depth = 0 | |||||
return self.__encode(obj) | |||||
def __encode(self, obj): | |||||
s = '' | |||||
tab = self.tab | |||||
newline = self.newline | |||||
tp = type(obj) | |||||
if isinstance(obj, str): | |||||
s += '"%s"' % obj.replace(r'"', r'\"') | |||||
if isinstance(obj, unicode): | |||||
s += '"%s"' % obj.encode('utf-8').replace(r'"', r'\"') | |||||
elif tp in [int, float, long, complex]: | |||||
s += str(obj) | |||||
elif tp is bool: | |||||
s += str(obj).lower() | |||||
elif obj is None: | |||||
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) ): | |||||
newline = tab = '' | |||||
dp = tab * self.depth | |||||
s += "%s{%s" % (tab * (self.depth - 2), newline) | |||||
if tp is dict: | |||||
contents = [] | |||||
for k, v in obj.iteritems(): | |||||
if type(k) is int: | |||||
contents.append(self.__encode(v)) | |||||
else: | |||||
contents.append(dp + '%s = %s' % (k, self.__encode(v))) | |||||
s += (',%s' % newline).join(contents) | |||||
else: | |||||
s += (',%s' % newline).join( | |||||
[dp + self.__encode(el) for el in obj]) | |||||
self.depth -= 1 | |||||
s += "%s%s}" % (newline, tab * self.depth) | |||||
return s | |||||
def white(self): | |||||
while self.ch: | |||||
if self.space.match(self.ch): | |||||
self.next_chr() | |||||
else: | |||||
break | |||||
def next_chr(self): | |||||
if self.at >= self.len: | |||||
self.ch = None | |||||
return None | |||||
self.ch = self.text[self.at] | |||||
self.at += 1 | |||||
return True | |||||
def value(self): | |||||
self.white() | |||||
if not self.ch: | |||||
return | |||||
if self.ch == '{': | |||||
return self.object() | |||||
if self.ch == "[": | |||||
self.next_chr() | |||||
if self.ch in ['"', "'", '[']: | |||||
return self.string(self.ch) | |||||
if self.ch.isdigit() or self.ch == '-': | |||||
return self.number() | |||||
return self.word() | |||||
def string(self, end=None): | |||||
s = '' | |||||
start = self.ch | |||||
if end == '[': | |||||
end = ']' | |||||
if start in ['"', "'", '[']: | |||||
while self.next_chr(): | |||||
if self.ch == end: | |||||
self.next_chr() | |||||
if start != "[" or self.ch == ']': | |||||
return s | |||||
if self.ch == '\\' and start == end: | |||||
self.next_chr() | |||||
if self.ch != end: | |||||
s += '\\' | |||||
s += self.ch | |||||
raise Exception(ERRORS['unexp_end_string']) | |||||
def object(self): | |||||
o = {} | |||||
k = None | |||||
idx = 0 | |||||
numeric_keys = False | |||||
self.depth += 1 | |||||
self.next_chr() | |||||
self.white() | |||||
if self.ch and self.ch == '}': | |||||
self.depth -= 1 | |||||
self.next_chr() | |||||
return o #Exit here | |||||
else: | |||||
while self.ch: | |||||
self.white() | |||||
if self.ch == '{': | |||||
o[idx] = self.object() | |||||
idx += 1 | |||||
continue | |||||
elif self.ch == '}': | |||||
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: | |||||
ar = [] | |||||
for key in o: | |||||
ar.insert(key, o[key]) | |||||
o = ar | |||||
return o #or here | |||||
else: | |||||
if self.ch == ',': | |||||
self.next_chr() | |||||
continue | |||||
else: | |||||
k = self.value() | |||||
if self.ch == ']': | |||||
numeric_keys = True | |||||
self.next_chr() | |||||
self.white() | |||||
ch = self.ch | |||||
if ch in ('=', ','): | |||||
self.next_chr() | |||||
self.white() | |||||
if ch == '=': | |||||
o[k] = self.value() | |||||
else: | |||||
o[idx] = k | |||||
idx += 1 | |||||
k = None | |||||
raise Exception(ERRORS['unexp_end_table']) #Bad exit here | |||||
words = {'true': True, 'false': False, 'nil': None} | |||||
def word(self): | |||||
s = '' | |||||
if self.ch != '\n': | |||||
s = self.ch | |||||
self.next_chr() | |||||
while self.ch is not None and self.alnum.match(self.ch) and s not in self.words: | |||||
s += self.ch | |||||
self.next_chr() | |||||
return self.words.get(s, s) | |||||
def number(self): | |||||
def next_digit(err): | |||||
n = self.ch | |||||
self.next_chr() | |||||
if not self.ch or not self.ch.isdigit(): | |||||
raise ParseError(err) | |||||
return n | |||||
n = '' | |||||
try: | |||||
if self.ch == '-': | |||||
n += next_digit(ERRORS['mfnumber_minus']) | |||||
n += self.digit() | |||||
if n == '0' and self.ch in ['x', 'X']: | |||||
n += self.ch | |||||
self.next_chr() | |||||
n += self.hex() | |||||
else: | |||||
if self.ch and self.ch == '.': | |||||
n += next_digit(ERRORS['mfnumber_dec_point']) | |||||
n += self.digit() | |||||
if self.ch and self.ch in ['e', 'E']: | |||||
n += self.ch | |||||
self.next_chr() | |||||
if not self.ch or self.ch not in ('+', '-'): | |||||
raise ParseError(ERRORS['mfnumber_sci']) | |||||
n += next_digit(ERRORS['mfnumber_sci']) | |||||
n += self.digit() | |||||
except ParseError: | |||||
t, e = sys.exc_info()[:2] | |||||
print(e) | |||||
return 0 | |||||
try: | |||||
return int(n, 0) | |||||
except: | |||||
pass | |||||
return float(n) | |||||
def digit(self): | |||||
n = '' | |||||
while self.ch and self.ch.isdigit(): | |||||
n += self.ch | |||||
self.next_chr() | |||||
return n | |||||
def hex(self): | |||||
n = '' | |||||
while self.ch and \ | |||||
(self.ch in 'ABCDEFabcdef' or self.ch.isdigit()): | |||||
n += self.ch | |||||
self.next_chr() | |||||
return n | |||||
slpp = SLPP() | |||||
__all__ = ['slpp'] |
@ -0,0 +1,182 @@ | |||||
#!/usr/bin/python | |||||
# -*- coding: utf-8 -*- | |||||
from slpp import slpp as lua | |||||
""" | |||||
Tests for slpp | |||||
""" | |||||
def is_iterator(obj): | |||||
""" | |||||
>>> assert is_iterator(list()) is True | |||||
>>> assert is_iterator(int) is False | |||||
""" | |||||
if isinstance(obj, (list, tuple)): | |||||
return True | |||||
try: | |||||
iter(obj) | |||||
return True | |||||
except TypeError: | |||||
return False | |||||
def differ(value, origin): | |||||
""" | |||||
Same: | |||||
>>> differ(1, 1) | |||||
>>> differ([2, 3], [2, 3]) | |||||
>>> differ({'1': 3, '4': '6'}, {'4': '6', '1': 3}) | |||||
>>> differ('4', '4') | |||||
Different: | |||||
>>> differ(1, 2) | |||||
Traceback (most recent call last): | |||||
... | |||||
AssertionError: 1 not match original: 2. | |||||
>>> differ([2, 3], [3, 2]) | |||||
Traceback (most recent call last): | |||||
... | |||||
AssertionError: 2 not match original: 3. | |||||
>>> differ({'6': 4, '3': '1'}, {'4': '6', '1': 3}) | |||||
Traceback (most recent call last): | |||||
... | |||||
AssertionError: {'3': '1', '6': 4} not match original: {'1': 3, '4': '6'}; | |||||
Key: 1, item: 3 | |||||
>>> differ('4', 'no') | |||||
Traceback (most recent call last): | |||||
... | |||||
AssertionError: 4 not match original: no. | |||||
""" | |||||
if type(value) is not type(origin): | |||||
raise AssertionError('Types does not match: {0}, {1}'.format(type(value), type(origin))) | |||||
if isinstance(origin, dict): | |||||
for key, item in origin.items(): | |||||
try: | |||||
differ(value[key], item) | |||||
except KeyError: | |||||
raise AssertionError('''{0} not match original: {1}; | |||||
Key: {2}, item: {3}'''.format(value, origin, key, item)) | |||||
return | |||||
if isinstance(origin, basestring): | |||||
assert value == origin, '{0} not match original: {1}.'.format(value, origin) | |||||
return | |||||
if is_iterator(origin): | |||||
for i in range(0, len(origin)): | |||||
try: | |||||
differ(value[i], origin[i]) | |||||
except IndexError: | |||||
raise AssertionError( | |||||
'{0} not match original: {1}. Item {2} not found'.format( | |||||
response, origin, origin[i])) | |||||
except Exception, e: | |||||
raise e | |||||
return | |||||
assert value == origin, '{0} not match original: {1}.'.format(value, origin) | |||||
def number_test(): | |||||
""" | |||||
Integer and float: | |||||
>>> assert lua.decode('3') == 3 | |||||
>>> assert lua.decode('4.1') == 4.1 | |||||
Negative float: | |||||
>>> assert lua.decode('-0.45') == -0.45 | |||||
Scientific: | |||||
>>> assert lua.decode('3e-7') == 3e-7 | |||||
>>> assert lua.decode('-3.23e+17') == -3.23e+17 | |||||
Hex: | |||||
>>> assert lua.decode('0x3a') == 0x3a | |||||
#4 | |||||
>>> differ(lua.decode('''{ \ | |||||
ID = 0x74fa4cae, \ | |||||
Version = 0x07c2, \ | |||||
Manufacturer = 0x21544948 \ | |||||
}'''), { \ | |||||
'ID': 0x74fa4cae, \ | |||||
'Version': 0x07c2, \ | |||||
'Manufacturer': 0x21544948 \ | |||||
}) | |||||
""" | |||||
pass | |||||
def test_bool(): | |||||
""" | |||||
>>> assert lua.decode('false') == False | |||||
>>> assert lua.decode('true') == True | |||||
>>> assert lua.encode(False) == 'false' | |||||
>>> assert lua.encode(True) == 'true' | |||||
""" | |||||
pass | |||||
def test_nil(): | |||||
""" | |||||
>>> assert lua.decode('nil') == None | |||||
>>> assert lua.encode(None) == 'nil' | |||||
""" | |||||
pass | |||||
def table_test(): | |||||
""" | |||||
Bracketed string key: | |||||
>>> assert lua.decode('{[10] = 1}') == {10: 1} | |||||
Void table: | |||||
>>> assert lua.decode('{nil}') == [] | |||||
Values-only table: | |||||
>>> assert lua.decode('{"10"}') == ["10"] | |||||
Last zero | |||||
>>> assert lua.decode('{0, 1, 0}') == [0,1,0] | |||||
""" | |||||
pass | |||||
def string_test(): | |||||
r""" | |||||
Escape test: | |||||
>>> assert lua.decode(r"'test\'s string'") == "test's string" | |||||
Add escaping on encode: | |||||
>>> assert lua.encode({'a': 'func("call()");'}) == '{\n\ta = "func(\\"call()\\");"\n}' | |||||
""" | |||||
pass | |||||
def basic_test(): | |||||
""" | |||||
No data loss: | |||||
>>> data = '{ array = { 65, 23, 5 }, dict = { string = "value", array = { 3, 6, 4}, mixed = { 43, 54.3, false, string = "value", 9 } } }' | |||||
>>> d = lua.decode(data) | |||||
>>> differ(d, lua.decode(lua.encode(d))) | |||||
""" | |||||
pass | |||||
def unicode_test(): | |||||
ur""" | |||||
>>> assert lua.encode(u'Привет') == '"\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82"' | |||||
>>> assert lua.encode({'s': u'Привет'}) == '{\n\ts = "Привет"\n}' | |||||
""" | |||||
pass | |||||
if __name__ == '__main__': | |||||
import doctest | |||||
doctest.testmod() |
@ -0,0 +1,262 @@ | |||||
import re | |||||
import sys | |||||
ERRORS = { | |||||
'unexp_end_string': u'Unexpected end of string while parsing Lua string.', | |||||
'unexp_end_table': u'Unexpected end of table while parsing Lua string.', | |||||
'mfnumber_minus': u'Malformed number (no digits after initial minus).', | |||||
'mfnumber_dec_point': u'Malformed number (no digits after decimal point).', | |||||
'mfnumber_sci': u'Malformed number (bad scientific format).', | |||||
} | |||||
# Python 3 renamed the unicode type to str, | |||||
# the old str type has been replaced by bytes | |||||
try: | |||||
basestring | |||||
except NameError: | |||||
basestring = str | |||||
try: | |||||
unicode | |||||
except NameError: | |||||
unicode = str | |||||
class ParseError(Exception): | |||||
pass | |||||
class SLPP(object): | |||||
def __init__(self): | |||||
self.text = '' | |||||
self.ch = '' | |||||
self.at = 0 | |||||
self.len = 0 | |||||
self.depth = 0 | |||||
self.space = re.compile('\s', re.M) | |||||
self.alnum = re.compile('\w', re.M) | |||||
self.newline = '\n' | |||||
self.tab = '\t' | |||||
def decode(self, text): | |||||
if not text or not isinstance(text, basestring): | |||||
return | |||||
#FIXME: only short comments removed | |||||
reg = re.compile('--.*$', re.M) | |||||
text = reg.sub('', text, 0) | |||||
self.text = text | |||||
self.at, self.ch, self.depth = 0, '', 0 | |||||
self.len = len(text) | |||||
self.next_chr() | |||||
result = self.value() | |||||
return result | |||||
def encode(self, obj): | |||||
self.depth = 0 | |||||
return self.__encode(obj) | |||||
def __encode(self, obj): | |||||
s = '' | |||||
tab = self.tab | |||||
newline = self.newline | |||||
tp = type(obj) | |||||
if isinstance(obj, str): | |||||
s += '"%s"' % obj.replace(r'"', r'\"') | |||||
if isinstance(obj, unicode): | |||||
s += '"%s"' % obj.encode('utf-8').replace(r'"', r'\"') | |||||
elif tp in [int, float, long, complex]: | |||||
s += str(obj) | |||||
elif tp is bool: | |||||
s += str(obj).lower() | |||||
elif obj is None: | |||||
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) ): | |||||
newline = tab = '' | |||||
dp = tab * self.depth | |||||
s += "%s{%s" % (tab * (self.depth - 2), newline) | |||||
if tp is dict: | |||||
contents = [] | |||||
for k, v in obj.iteritems(): | |||||
if type(k) is int: | |||||
contents.append(self.__encode(v)) | |||||
else: | |||||
contents.append(dp + '%s = %s' % (k, self.__encode(v))) | |||||
s += (',%s' % newline).join(contents) | |||||
else: | |||||
s += (',%s' % newline).join( | |||||
[dp + self.__encode(el) for el in obj]) | |||||
self.depth -= 1 | |||||
s += "%s%s}" % (newline, tab * self.depth) | |||||
return s | |||||
def white(self): | |||||
while self.ch: | |||||
if self.space.match(self.ch): | |||||
self.next_chr() | |||||
else: | |||||
break | |||||
def next_chr(self): | |||||
if self.at >= self.len: | |||||
self.ch = None | |||||
return None | |||||
self.ch = self.text[self.at] | |||||
self.at += 1 | |||||
return True | |||||
def value(self): | |||||
self.white() | |||||
if not self.ch: | |||||
return | |||||
if self.ch == '{': | |||||
return self.object() | |||||
if self.ch == "[": | |||||
self.next_chr() | |||||
if self.ch in ['"', "'", '[']: | |||||
return self.string(self.ch) | |||||
if self.ch.isdigit() or self.ch == '-': | |||||
return self.number() | |||||
return self.word() | |||||
def string(self, end=None): | |||||
s = '' | |||||
start = self.ch | |||||
if end == '[': | |||||
end = ']' | |||||
if start in ['"', "'", '[']: | |||||
while self.next_chr(): | |||||
if self.ch == end: | |||||
self.next_chr() | |||||
if start != "[" or self.ch == ']': | |||||
return s | |||||
if self.ch == '\\' and start == end: | |||||
self.next_chr() | |||||
if self.ch != end: | |||||
s += '\\' | |||||
s += self.ch | |||||
raise Exception(ERRORS['unexp_end_string']) | |||||
def object(self): | |||||
o = {} | |||||
k = None | |||||
idx = 0 | |||||
numeric_keys = False | |||||
self.depth += 1 | |||||
self.next_chr() | |||||
self.white() | |||||
if self.ch and self.ch == '}': | |||||
self.depth -= 1 | |||||
self.next_chr() | |||||
return o #Exit here | |||||
else: | |||||
while self.ch: | |||||
self.white() | |||||
if self.ch == '{': | |||||
o[idx] = self.object() | |||||
idx += 1 | |||||
continue | |||||
elif self.ch == '}': | |||||
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: | |||||
ar = [] | |||||
for key in o: | |||||
ar.insert(key, o[key]) | |||||
o = ar | |||||
return o #or here | |||||
else: | |||||
if self.ch == ',': | |||||
self.next_chr() | |||||
continue | |||||
else: | |||||
k = self.value() | |||||
if self.ch == ']': | |||||
numeric_keys = True | |||||
self.next_chr() | |||||
self.white() | |||||
ch = self.ch | |||||
if ch in ('=', ','): | |||||
self.next_chr() | |||||
self.white() | |||||
if ch == '=': | |||||
o[k] = self.value() | |||||
else: | |||||
o[idx] = k | |||||
idx += 1 | |||||
k = None | |||||
raise Exception(ERRORS['unexp_end_table']) #Bad exit here | |||||
words = {'true': True, 'false': False, 'nil': None} | |||||
def word(self): | |||||
s = '' | |||||
if self.ch != '\n': | |||||
s = self.ch | |||||
self.next_chr() | |||||
while self.ch is not None and self.alnum.match(self.ch) and s not in self.words: | |||||
s += self.ch | |||||
self.next_chr() | |||||
return self.words.get(s, s) | |||||
def number(self): | |||||
def next_digit(err): | |||||
n = self.ch | |||||
self.next_chr() | |||||
if not self.ch or not self.ch.isdigit(): | |||||
raise ParseError(err) | |||||
return n | |||||
n = '' | |||||
try: | |||||
if self.ch == '-': | |||||
n += next_digit(ERRORS['mfnumber_minus']) | |||||
n += self.digit() | |||||
if n == '0' and self.ch in ['x', 'X']: | |||||
n += self.ch | |||||
self.next_chr() | |||||
n += self.hex() | |||||
else: | |||||
if self.ch and self.ch == '.': | |||||
n += next_digit(ERRORS['mfnumber_dec_point']) | |||||
n += self.digit() | |||||
if self.ch and self.ch in ['e', 'E']: | |||||
n += self.ch | |||||
self.next_chr() | |||||
if not self.ch or self.ch not in ('+', '-'): | |||||
raise ParseError(ERRORS['mfnumber_sci']) | |||||
n += next_digit(ERRORS['mfnumber_sci']) | |||||
n += self.digit() | |||||
except ParseError: | |||||
t, e = sys.exc_info()[:2] | |||||
print(e) | |||||
return 0 | |||||
try: | |||||
return int(n, 0) | |||||
except: | |||||
pass | |||||
return float(n) | |||||
def digit(self): | |||||
n = '' | |||||
while self.ch and self.ch.isdigit(): | |||||
n += self.ch | |||||
self.next_chr() | |||||
return n | |||||
def hex(self): | |||||
n = '' | |||||
while self.ch and \ | |||||
(self.ch in 'ABCDEFabcdef' or self.ch.isdigit()): | |||||
n += self.ch | |||||
self.next_chr() | |||||
return n | |||||
slpp = SLPP() | |||||
__all__ = ['slpp'] |
@ -0,0 +1,182 @@ | |||||
#!/usr/bin/python | |||||
# -*- coding: utf-8 -*- | |||||
from slpp import slpp as lua | |||||
""" | |||||
Tests for slpp | |||||
""" | |||||
def is_iterator(obj): | |||||
""" | |||||
>>> assert is_iterator(list()) is True | |||||
>>> assert is_iterator(int) is False | |||||
""" | |||||
if isinstance(obj, (list, tuple)): | |||||
return True | |||||
try: | |||||
iter(obj) | |||||
return True | |||||
except TypeError: | |||||
return False | |||||
def differ(value, origin): | |||||
""" | |||||
Same: | |||||
>>> differ(1, 1) | |||||
>>> differ([2, 3], [2, 3]) | |||||
>>> differ({'1': 3, '4': '6'}, {'4': '6', '1': 3}) | |||||
>>> differ('4', '4') | |||||
Different: | |||||
>>> differ(1, 2) | |||||
Traceback (most recent call last): | |||||
... | |||||
AssertionError: 1 not match original: 2. | |||||
>>> differ([2, 3], [3, 2]) | |||||
Traceback (most recent call last): | |||||
... | |||||
AssertionError: 2 not match original: 3. | |||||
>>> differ({'6': 4, '3': '1'}, {'4': '6', '1': 3}) | |||||
Traceback (most recent call last): | |||||
... | |||||
AssertionError: {'3': '1', '6': 4} not match original: {'1': 3, '4': '6'}; | |||||
Key: 1, item: 3 | |||||
>>> differ('4', 'no') | |||||
Traceback (most recent call last): | |||||
... | |||||
AssertionError: 4 not match original: no. | |||||
""" | |||||
if type(value) is not type(origin): | |||||
raise AssertionError('Types does not match: {0}, {1}'.format(type(value), type(origin))) | |||||
if isinstance(origin, dict): | |||||
for key, item in origin.items(): | |||||
try: | |||||
differ(value[key], item) | |||||
except KeyError: | |||||
raise AssertionError('''{0} not match original: {1}; | |||||
Key: {2}, item: {3}'''.format(value, origin, key, item)) | |||||
return | |||||
if isinstance(origin, basestring): | |||||
assert value == origin, '{0} not match original: {1}.'.format(value, origin) | |||||
return | |||||
if is_iterator(origin): | |||||
for i in range(0, len(origin)): | |||||
try: | |||||
differ(value[i], origin[i]) | |||||
except IndexError: | |||||
raise AssertionError( | |||||
'{0} not match original: {1}. Item {2} not found'.format( | |||||
response, origin, origin[i])) | |||||
except Exception, e: | |||||
raise e | |||||
return | |||||
assert value == origin, '{0} not match original: {1}.'.format(value, origin) | |||||
def number_test(): | |||||
""" | |||||
Integer and float: | |||||
>>> assert lua.decode('3') == 3 | |||||
>>> assert lua.decode('4.1') == 4.1 | |||||
Negative float: | |||||
>>> assert lua.decode('-0.45') == -0.45 | |||||
Scientific: | |||||
>>> assert lua.decode('3e-7') == 3e-7 | |||||
>>> assert lua.decode('-3.23e+17') == -3.23e+17 | |||||
Hex: | |||||
>>> assert lua.decode('0x3a') == 0x3a | |||||
#4 | |||||
>>> differ(lua.decode('''{ \ | |||||
ID = 0x74fa4cae, \ | |||||
Version = 0x07c2, \ | |||||
Manufacturer = 0x21544948 \ | |||||
}'''), { \ | |||||
'ID': 0x74fa4cae, \ | |||||
'Version': 0x07c2, \ | |||||
'Manufacturer': 0x21544948 \ | |||||
}) | |||||
""" | |||||
pass | |||||
def test_bool(): | |||||
""" | |||||
>>> assert lua.decode('false') == False | |||||
>>> assert lua.decode('true') == True | |||||
>>> assert lua.encode(False) == 'false' | |||||
>>> assert lua.encode(True) == 'true' | |||||
""" | |||||
pass | |||||
def test_nil(): | |||||
""" | |||||
>>> assert lua.decode('nil') == None | |||||
>>> assert lua.encode(None) == 'nil' | |||||
""" | |||||
pass | |||||
def table_test(): | |||||
""" | |||||
Bracketed string key: | |||||
>>> assert lua.decode('{[10] = 1}') == {10: 1} | |||||
Void table: | |||||
>>> assert lua.decode('{nil}') == [] | |||||
Values-only table: | |||||
>>> assert lua.decode('{"10"}') == ["10"] | |||||
Last zero | |||||
>>> assert lua.decode('{0, 1, 0}') == [0,1,0] | |||||
""" | |||||
pass | |||||
def string_test(): | |||||
r""" | |||||
Escape test: | |||||
>>> assert lua.decode(r"'test\'s string'") == "test's string" | |||||
Add escaping on encode: | |||||
>>> assert lua.encode({'a': 'func("call()");'}) == '{\n\ta = "func(\\"call()\\");"\n}' | |||||
""" | |||||
pass | |||||
def basic_test(): | |||||
""" | |||||
No data loss: | |||||
>>> data = '{ array = { 65, 23, 5 }, dict = { string = "value", array = { 3, 6, 4}, mixed = { 43, 54.3, false, string = "value", 9 } } }' | |||||
>>> d = lua.decode(data) | |||||
>>> differ(d, lua.decode(lua.encode(d))) | |||||
""" | |||||
pass | |||||
def unicode_test(): | |||||
ur""" | |||||
>>> assert lua.encode(u'Привет') == '"\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82"' | |||||
>>> assert lua.encode({'s': u'Привет'}) == '{\n\ts = "Привет"\n}' | |||||
""" | |||||
pass | |||||
if __name__ == '__main__': | |||||
import doctest | |||||
doctest.testmod() |
@ -0,0 +1,56 @@ | |||||
#! python | |||||
# -*- coding:utf-8 -*- | |||||
import os | |||||
import sys | |||||
import json | |||||
from xml.dom.minidom import Document | |||||
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 Writer(object): | |||||
def __init__(self,doc_name,sheet_name, base_name, keys_list, comment_text): | |||||
# 文件名包含中文则需要转unicode | |||||
#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 | |||||
# 文件后缀 | |||||
def suffix(self): | |||||
pass | |||||
# 文件内容 | |||||
def context(self,ctx): | |||||
pass | |||||
# 注释开始 | |||||
def comment_start(self): | |||||
pass | |||||
# 注释结束 | |||||
def comment_end(self): | |||||
pass | |||||
# 文件注释(千万不要加时间,影响svn) | |||||
def comment(self): | |||||
comment = [] | |||||
return "".join( comment ) | |||||
@ -0,0 +1,319 @@ | |||||
#! 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 ElixirWriter(Writer): | |||||
# 文件后缀 | |||||
def suffix(self): | |||||
return ".ex" | |||||
def comment(self): | |||||
comment = [ | |||||
'## Automatic generation from -->>' | |||||
'\n## excel file name: ' + self.doc_name + | |||||
'\n## excel sheet name: ' + self.sheet_name, | |||||
'\ndefmodule ' + self.base_name.title() + ' do\n\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 = [] | |||||
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() : | |||||
lk.replace("\"", "") | |||||
else : | |||||
lk = ':' + lk.replace("\"", "") | |||||
key = "".join( [" def get(",lk,") do\n"] ) | |||||
val = "".join( [" ## ", comment, "\n", key, " ", lv, "\n end\n\n"] ) | |||||
dict_text_list.append( val ) | |||||
dict_str = "".join( dict_text_list ) | |||||
dict_str = dict_str + " def get(_) do\n :undefined\n end\n\nend" | |||||
return False, dict_str | |||||
def list_to_text(self, value, indent): | |||||
list_text_list = [] | |||||
# 先定义 struct | |||||
struct_text_list = [] | |||||
struct_len = len(self.comment_text) | |||||
tem_count = 0 | |||||
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() : | |||||
lk.replace("\"", "") | |||||
else : | |||||
lk = ':' + lk.replace("\"", "") | |||||
if tem_count != struct_len : | |||||
lk = lk + ',' | |||||
else : | |||||
lk = lk | |||||
if None == comment : | |||||
comment = "" | |||||
val = "".join( [lk.ljust(20, " "), "\t## ", comment, "\n"] ) | |||||
struct_text_list.append( val ) | |||||
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 ) : | |||||
# 生成对应的 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( [" def get(",tem,") do\n %", self.base_name.title(), "{\n "] ) | |||||
# 生成对应的value | |||||
value_list = [] | |||||
onedict_len = len(onedict) | |||||
tem_count = 0 | |||||
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 ) | |||||
val_type = type( lk ) | |||||
if str == val_type : | |||||
if lk.replace(".", "").isdigit() : | |||||
lk.replace("\"", "") | |||||
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 ) | |||||
value_list_str = " ".join(value_list) | |||||
end_str = "".join( [key, value_list_str, " }\n end\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 = " def get(" + end_str + ") do\n :undefined\n end\n\n" | |||||
list_text_list.append(no_match_str) | |||||
# 生成 get_all() 函数 | |||||
get_all_fun = [] | |||||
allkey_len = len(all_key_list) | |||||
tem_count = 0 | |||||
for i, ival in enumerate(all_key_list) : | |||||
tem_count += 1 | |||||
if tem_count != allkey_len : | |||||
oneval = '{' + ", ".join(ival) + '},\n' | |||||
get_all_fun.append(oneval) | |||||
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"] ) | |||||
list_text_list.append( end_str ) | |||||
# 生成 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 : | |||||
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) : | |||||
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] | |||||
value_len = len(valuelist) | |||||
tem_count = 0 | |||||
for l, lval in enumerate(valuelist) : | |||||
tem_count += 1 | |||||
if tem_count != value_len : | |||||
oneval = '{' + ", ".join(lval) + '},\n' | |||||
value_tem_list.append(oneval) | |||||
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"] ) | |||||
get_list_fun.append(end_str) | |||||
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 ) | |||||
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转换为elixir的map类型 | |||||
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 ) | |||||
val_type = type( lk ) | |||||
if str == val_type : | |||||
if lk.replace(".", "").isdigit() : | |||||
lk.replace("\"", "") | |||||
else : | |||||
lk = ':' + lk.replace("\"", "") | |||||
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转换为elixir的list类型 | |||||
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 ) | |||||
list_str = ", ".join( list_ctx_list ) | |||||
return False,"".join( ["[",list_str,"]"] ) | |||||
# python的tuple转换为elixir的tuple类型 | |||||
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 ) | |||||
# 返回 {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,"\""]) | |||||
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] ) |
@ -0,0 +1,259 @@ | |||||
#! 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).\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("\"", "\'") | |||||
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).\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("\"", "\'") | |||||
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 = 'get_all() ->\n [\n ' | |||||
end_str = "".join( [start_str, value_list_str, " ].\n\n"] ) | |||||
list_text_list.append( end_str ) | |||||
# 生成 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 : | |||||
list_text_list.append( 'get_list() ->\n get_all().\n\n') | |||||
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 = 'get_list' + onekey + ' ->\n [\n ' | |||||
val = "".join( [start, " ,".join(value_tem_list), " ];\n\n"] ) | |||||
get_list_fun.append(val) | |||||
no_match_str = "".join('get_list(' + ", ".join(underline_list) + ') ->\n [].\n\n') | |||||
get_list_fun.append(no_match_str) | |||||
value_list = "".join(get_list_fun) | |||||
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("\"", "\'") | |||||
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,"\""]) | |||||
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] ) |
@ -0,0 +1,152 @@ | |||||
#! 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 ErlanghrlWriter(Writer): | |||||
# 文件后缀 | |||||
def suffix(self): | |||||
return ".hrl" | |||||
def comment(self): | |||||
comment = [ | |||||
'%% 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 ) | |||||
# 获取缩进字符串 | |||||
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 list_to_text(self, value, indent): | |||||
list_text_list = [] | |||||
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 : | |||||
lk = lk.replace("\"", "\'") | |||||
if None == comment : | |||||
comment = "" | |||||
val = "".join( [lk.ljust(20, " "), "\t%% ", comment, "\n"] ) | |||||
list_text_list.append( val ) | |||||
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 : | |||||
return False, None | |||||
# 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("\"", "\'") | |||||
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,"\""]) | |||||
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 |
@ -0,0 +1,41 @@ | |||||
#! python | |||||
# -*- coding:utf-8 -*- | |||||
import os | |||||
import sys | |||||
import json | |||||
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 JsonarrayWriter(Writer): | |||||
# 文件后缀 | |||||
def suffix(self): | |||||
return ".json" | |||||
# 文件内容(字符串) | |||||
def context(self,ctx): | |||||
return json.dumps(ctx,ensure_ascii=False,\ | |||||
indent=4,sort_keys=True,separators=(',', ':') ) | |||||
@ -0,0 +1,201 @@ | |||||
#! 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 JsonobjectWriter(Writer): | |||||
# 文件后缀 | |||||
def suffix(self): | |||||
return ".json" | |||||
def comment(self): | |||||
comment = [] | |||||
return "\n".join( comment ) | |||||
# 获取缩进字符串 | |||||
def indent_ctx( self,indent ): | |||||
if indent <= 0: return "" | |||||
if indent not in INDENT_LIST: | |||||
ctx = BASE_INDENT*indent | |||||
INDENT_LIST[indent] = ctx | |||||
return INDENT_LIST[indent] | |||||
def dict_to_text(self, value, indent) : | |||||
dict_ctx_list = [] | |||||
is_indent,lv = self.to_target_lang( value, indent) | |||||
dict_ctx_list.append(lv) | |||||
dict_str = "".join( dict_ctx_list ) | |||||
return False,"".join( [dict_str] ) | |||||
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 : | |||||
lv = onedict[k] | |||||
if cur_key_index == total_key_cnt : | |||||
storge_dict[lv] = onedict | |||||
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] ={} | |||||
new_storge_dict = storge_dict[lv] | |||||
self.list_to_dit(cur_key_index + 1, total_key_cnt, onedict, new_storge_dict) | |||||
def list_to_text(self, value, indent): | |||||
list_text_list = [] | |||||
## 处理多个key的情况 | |||||
key_value_list = {} | |||||
key_cnt = len(self.keys_list) | |||||
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 ) | |||||
list_text_list.append(list_str) | |||||
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 : | |||||
return self.dict_to_text(value, indent) | |||||
else : | |||||
return self.list_to_text(value, indent) | |||||
# dict转换为json类型 | |||||
def dict_to_json(self,value,indent): | |||||
dict_ctx_list = [] | |||||
#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 ) : | |||||
lvalue = value[k] | |||||
lvalue_type = type(lvalue) | |||||
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 ) | |||||
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 ) | |||||
for k in ( value ) : | |||||
lvalue = value[k] | |||||
lvalue_type = type(lvalue) | |||||
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 : | |||||
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 ) | |||||
dict_str = "".join(dict_ctx_list) | |||||
return True,"".join(["{\n" , dict_str, "\n",cur_indent,"}"] ) | |||||
# list转换为json类型 | |||||
def list_to_json(self,value,indent): | |||||
list_ctx_list = [] | |||||
#if indent % 2 != 0 : | |||||
# indent += 1 | |||||
cur_indent = self.indent_ctx(indent) | |||||
next_indent = self.indent_ctx(indent + 1) | |||||
index_cnt = 1 | |||||
list_len = len(value) | |||||
tem_count = 0 | |||||
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 ) | |||||
index_cnt += 1 | |||||
list_str = "".join(list_ctx_list) | |||||
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 : | |||||
# 1001.0 -->> 001 去除多余小数点 | |||||
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 : | |||||
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] ) | |||||
@ -0,0 +1,273 @@ | |||||
#! 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 LuaWriter(Writer): | |||||
# 文件后缀 | |||||
def suffix(self): | |||||
return ".lua" | |||||
def comment(self): | |||||
comment = [ | |||||
'-- Automatic generation from -->>' | |||||
'\n-- excel file name: ' + self.doc_name + | |||||
'\n-- excel sheet name: ' + self.sheet_name, | |||||
'\nlocal ' + self.base_name + ' =\n' | |||||
] | |||||
return "\n".join( comment ) | |||||
# 获取缩进字符串 | |||||
def indent_ctx( self,indent ): | |||||
if indent <= 0: return "" | |||||
if indent not in INDENT_LIST: | |||||
ctx = BASE_INDENT*indent | |||||
INDENT_LIST[indent] = ctx | |||||
return INDENT_LIST[indent] | |||||
def dict_to_text(self, value, indent) : | |||||
dict_ctx_list = [] | |||||
cur_indent = self.indent_ctx(indent) | |||||
next_indent = self.indent_ctx(indent + 1) | |||||
tem_count = 0 | |||||
total_len = len(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 ) | |||||
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 : | |||||
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] ) | |||||
dict_ctx_list.append( val ) | |||||
dict_str = "".join( dict_ctx_list ) | |||||
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 ) : | |||||
key_index = self.keys_list.get(k, None) | |||||
if None != key_index and key_index == cur_key_index : | |||||
lv = onedict[k] | |||||
if cur_key_index == total_key_cnt : | |||||
storge_dict[lv] = onedict | |||||
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] ={} | |||||
new_storge_dict = storge_dict[lv] | |||||
self.list_to_dit(cur_key_index + 1, total_key_cnt, onedict, new_storge_dict) | |||||
def list_to_text(self, value, indent): | |||||
list_text_list = [] | |||||
# 先把各个字段的注释放在前面 | |||||
comment_text_list = [] | |||||
for k in self.comment_text : | |||||
comment = self.comment_text[k] | |||||
k_indent,lk = self.to_target_lang( k,indent ) | |||||
lk = lk.replace("\'", "") | |||||
if None == comment : | |||||
comment = "" | |||||
val = "".join( [ '--: ', lk.ljust(20, " "), "\t## ", comment, "\n"] ) | |||||
comment_text_list.append( val ) | |||||
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 ) : | |||||
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 ) | |||||
list_text_list.append(list_str) | |||||
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 : | |||||
return self.dict_to_text(value, indent) | |||||
else : | |||||
return self.list_to_text(value, indent) | |||||
# dict转换为lua类型 | |||||
def dict_to_lua(self,value,indent): | |||||
dict_ctx_list = [] | |||||
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 ) : | |||||
lvalue = value[k] | |||||
lvalue_type = type(lvalue) | |||||
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 ) | |||||
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 ) | |||||
for k in ( value ) : | |||||
lvalue = value[k] | |||||
lvalue_type = type(lvalue) | |||||
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 : | |||||
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 ) | |||||
dict_str = "".join(dict_ctx_list) | |||||
return True,"".join(['\n', cur_indent,"{\n" , dict_str, "\n",cur_indent,"}"] ) | |||||
# list转换为lua类型 | |||||
def list_to_lua(self,value,indent): | |||||
list_ctx_list = [] | |||||
if indent % 2 != 0 : | |||||
indent += 1 | |||||
cur_indent = self.indent_ctx(indent) | |||||
next_indent = self.indent_ctx(indent + 1) | |||||
index_cnt = 1 | |||||
list_len = len(value) | |||||
tem_count = 0 | |||||
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 ) | |||||
index_cnt += 1 | |||||
list_str = "".join(list_ctx_list) | |||||
return True,"".join(['\n', cur_indent,"{\n" , list_str, "\n",cur_indent,"}"] ) | |||||
# tuple转换为lua类型 | |||||
def tuple_to_lua(self,value1,indent): | |||||
value = list(value1) | |||||
list_ctx_list = [] | |||||
if indent % 2 != 0 : | |||||
indent += 1 | |||||
cur_indent = self.indent_ctx(indent) | |||||
next_indent = self.indent_ctx(indent + 1) | |||||
index_cnt = 1 | |||||
list_len = len(value) | |||||
tem_count = 0 | |||||
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 ) | |||||
index_cnt += 1 | |||||
list_str = "".join(list_ctx_list) | |||||
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 : | |||||
# 1001.0 -->> 001 去除多余小数点 | |||||
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] ) | |||||
@ -0,0 +1,307 @@ | |||||
#! 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 PythonWriter(Writer): | |||||
# 文件后缀 | |||||
def suffix(self): | |||||
return ".py" | |||||
# 文件注释(千万不要加时间,影响svn) | |||||
def comment(self): | |||||
comment = [ | |||||
'## Automatic generation from -->>' | |||||
'\n## excel file name: ' + self.doc_name + | |||||
'\n## excel sheet name: ' + self.sheet_name, | |||||
'\ndefmodule ' + self.base_name.title() + ' do\n\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 = [] | |||||
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("\"", "") | |||||
key = "".join( [" def get(",lk,") do\n"] ) | |||||
val = "".join( [" ## ", comment, "\n", key, " ", lv, "\n end\n\n"] ) | |||||
dict_text_list.append( val ) | |||||
dict_str = "".join( dict_text_list ) | |||||
dict_str = dict_str + " def get(_) do\n :undefined\n end\n\nend" | |||||
return False, dict_str | |||||
def list_to_text(self, value, indent): | |||||
list_text_list = [] | |||||
# 先定义 struct | |||||
struct_text_list = [] | |||||
struct_len = len(self.comment_text) | |||||
tem_count = 0 | |||||
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 : | |||||
lk = ':' + lk.replace("\"", "") + ',' | |||||
else : | |||||
lk = ':' + lk.replace("\"", "") | |||||
if None == comment : | |||||
comment = "" | |||||
val = "".join( [lk.ljust(20, " "), "\t## ", comment, "\n"] ) | |||||
struct_text_list.append( val ) | |||||
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 ) : | |||||
# 生成对应的 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( [" def get(",tem,") do\n %", self.base_name.title(), "{\n "] ) | |||||
# 生成对应的value | |||||
value_list = [] | |||||
onedict_len = len(onedict) | |||||
tem_count = 0 | |||||
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 ) | |||||
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 ) | |||||
value_list_str = " ".join(value_list) | |||||
end_str = "".join( [key, value_list_str, " }\n end\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 = " def get(" + end_str + ") do\n :undefined\n end\n\n" | |||||
list_text_list.append(no_match_str) | |||||
# 生成 get_all() 函数 | |||||
get_all_fun = [] | |||||
allkey_len = len(all_key_list) | |||||
tem_count = 0 | |||||
for i, ival in enumerate(all_key_list) : | |||||
tem_count += 1 | |||||
if tem_count != allkey_len : | |||||
oneval = '{' + ", ".join(ival) + '},\n' | |||||
get_all_fun.append(oneval) | |||||
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"] ) | |||||
list_text_list.append( end_str ) | |||||
# 生成 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 : | |||||
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) : | |||||
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] | |||||
value_len = len(valuelist) | |||||
tem_count = 0 | |||||
for l, lval in enumerate(valuelist) : | |||||
tem_count += 1 | |||||
if tem_count != value_len : | |||||
oneval = '{' + ", ".join(lval) + '},\n' | |||||
value_tem_list.append(oneval) | |||||
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"] ) | |||||
get_list_fun.append(end_str) | |||||
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 ) | |||||
return False, dict_str | |||||
# 转换为erlang 文本数据 之前解析出来的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转换为elixir的map类型 | |||||
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 ) | |||||
val_type = type( lk ) | |||||
if str == val_type : | |||||
lk = lk.replace("\"", "\'") | |||||
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转换为elixir的list类型 | |||||
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 ) | |||||
list_str = ", ".join( list_ctx_list ) | |||||
return False,"".join( ["[",list_str,"]"] ) | |||||
# python的tuple转换为elixir的tuple类型 | |||||
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 ) | |||||
# 返回 {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,"\""]) | |||||
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] ) |
@ -0,0 +1,133 @@ | |||||
#! python | |||||
# -*- coding:utf-8 -*- | |||||
import os | |||||
import sys | |||||
from xml.dom.minidom import Document | |||||
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 JsonWriter(Writer): | |||||
# 文件后缀 | |||||
def suffix(self): | |||||
return ".json" | |||||
# 文件内容(字符串) | |||||
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 ) | |||||
return root | |||||
# dict类型转换为xml | |||||
def dict_to_xml(self,root,value): | |||||
# 需要对key排序,不然每次导出的xml字段是乱的,对版本管理不友好 | |||||
for k in sorted( value ) : | |||||
v = value[k] | |||||
sub_root = self.doc.createElement( k ) | |||||
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 ) : | |||||
# xml中并不支持array,用item来命名,外加一个index属性 | |||||
sub_root = self.doc.createElement( "item" ) | |||||
sub_root.setAttribute( "index",str( k ) ) | |||||
self.to_xml( sub_root,v ) | |||||
root.appendChild( sub_root ) | |||||
# tuple类型转换为xml | |||||
def tuple_to_xml(self,root,value): | |||||
valueList = list(value) | |||||
for k,v in enumerate( valueList ) : | |||||
# xml中并不支持array,用item来命名,外加一个index属性 | |||||
sub_root = self.doc.createElement( "item" ) | |||||
sub_root.setAttribute( "index",str( k ) ) | |||||
self.to_xml( sub_root,v ) | |||||
root.appendChild( sub_root ) | |||||
# 转换为xml节点 | |||||
def to_xml(self,root,value): | |||||
sub_node = None | |||||
val_type_str = None | |||||
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 : | |||||
val_type_str = "int64" | |||||
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 ) ) ) | |||||
else: | |||||
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 ) | |||||
# 类型为dict或者list的,没有这个type属性 | |||||
if val_type_str : root.setAttribute( "type",val_type_str ) | |||||
if sub_node : root.appendChild( sub_node ) | |||||
# 文件内容 | |||||
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=" " ) | |||||