前些天,尝试写了一个简单实用的代码排版工具(看到rustfmt痒呀,但没有办法!),于是动了自制的念头。经过几天的努力,终于解决了我很久以来Julia有关代码排版库的缺失带来的困扰(可能很少有人知道我经历了JuliaStudio->LightTable->Atom各种坑,留下了巨量的库存代码!一直无法管理。),现在CodeBeautify终可以用上了。 我已经测试过,也通过了相应的一些测试代码(如下),正常情况可以用,我的几十个.jl文件代码没有问题。当然bug肯定也是有的,其中一些代码还没有来得及优化(个别函数太长等)。如果有发现问题的,请及时和我联系。
一、如何使用?
很简单,只需要使用其中的codebeautify函数就可以。
Julia>using CodeBeautify;
Julia>path =”D:\strategyJulia\strategyGroup\old\BBGS_days_fun.jl”;
Julia>codebeautify(path) ;# 对指定路径path的.jl文件进行代码排版
另外,此代码可以实现对CodeBeautify库的自举。
二、相关的测试代码 (updated : 2016-11-20)
针对这个代码库可能存在的问题,我设定了以下的检测代码,目前全部通过:
using CodeBeautify;
# NO BUG =>
# _space =>ok
@assert _space("if !isempty(instrs) #&& isempty?")=="if !isempty(instrs) #&& isempty?"
@assert _space("if !isempty(instrs) #&& isempty?")=="if !isempty(instrs) #&& isempty?"
@assert _space("if !isempty(instrs) #&& isempty?")=="if !isempty(instrs) #&& isempty?"
@assert _space("if !isempty(instrs) # && isempty?")=="if !isempty(instrs) # && isempty?"
@assert _space("if !isempty( instrs) # && isempty?")=="if !isempty(instrs) # && isempty?"
# <: =>ok
@assert _format("function csv2H5ArrayData{T <:Any}(data)")==
"function csv2H5ArrayData{T <: Any}(data)"
@assert _format("function csv2H5ArrayData{T <: Any}(data)")==
"function csv2H5ArrayData{T <: Any}(data)"
@assert _format("getDateTime{T<: String}")=="getDateTime{T <: String}"
@assert _format("Data{T <:}") =="Data{T <: }"
@assert _format("Data{T<:}") =="Data{T <: }"
@assert _format("Data{T <: }") =="Data{T <: }"
@assert _format("Data{T<:Any}") =="Data{T <: Any}"
@assert _format("Data{T<: Any}") =="Data{T <: Any}"
@assert _format(_space("Data{T <: Any}")) =="Data{T <: Any}"
# # =>ok
@assert split_byspace("a= b # if")==["a=","b","# if"]
@assert split_byspace("a = b # if")==["a","=","b","# if"]
@assert split_byspace("for gp in groups")==["for","gp","in","groups"]
split_byspace("function getStandardDateTimeStringToMinute(dt::Dates.DateTime)")
split_byspace("# 输出:格式2012 - 1 - 2 09:40:00")
# +-*/ =>ok
@assert _add_subtract_multiply_divide("return (dayNetValue./ initialFund,dayNetValueDictData);")==
"return (dayNetValue ./ initialFund,dayNetValueDictData);"
@assert _add_subtract_multiply_divide(_space(" aAA // b"))=="aAA // b"
@assert _add_subtract_multiply_divide("aAA//b")=="aAA // b"
@assert _add_subtract_multiply_divide("a//b")=="a // b"
@assert _add_subtract_multiply_divide("a //b")=="a // b"
@assert _add_subtract_multiply_divide("a// b")=="a // b"
@assert _add_subtract_multiply_divide("a // b")=="a // b"
@assert _add_subtract_multiply_divide("aa // bb")=="aa // bb"
@assert _add_subtract_multiply_divide("aa //bb")=="aa // bb"
@assert _add_subtract_multiply_divide("aa//bb")=="aa // bb"
@assert _add_subtract_multiply_divide("io = open(path,\"w+\")")=="io = open(path,\"w+\")";
@assert _add_subtract_multiply_divide("a/b")=="a / b"
@assert _add_subtract_multiply_divide("aAA/b")=="aAA / b"
@assert _add_subtract_multiply_divide("a./b")=="a ./ b"
@assert _add_subtract_multiply_divide("aAA./b")=="aAA ./ b"
@assert _add_subtract_multiply_divide("a ./b")=="a ./ b"
@assert _add_subtract_multiply_divide("aAA ./b")=="aAA ./ b"
@assert _add_subtract_multiply_divide("a ./ b")=="a ./ b"
@assert _add_subtract_multiply_divide("aAA ./ b")=="aAA ./ b"
# 11-20
@assert _add_subtract_multiply_divide("yp = X * a.+ b;") =="yp = X * a .+ b;"
@assert _add_subtract_multiply_divide("yp = X*a.+ b;") =="yp = X * a .+ b;"
@assert _add_subtract_multiply_divide("yp = X*a .+ b;") =="yp = X * a .+ b;"
@assert _add_subtract_multiply_divide("yp = X* a;") =="yp = X * a;"
@assert _add_subtract_multiply_divide("yp = X*a;") =="yp = X * a;"
@assert _add_subtract_multiply_divide("yp = X*a.+b;") =="yp = X * a .+ b;"
@assert _add_subtract_multiply_divide("yp = X* a.")=="yp = X * a."
@assert _add_subtract_multiply_divide("yp = X* a.+;")=="yp = X * a .+ ;"
@assert _add_subtract_multiply_divide("yp = X*a.+;")=="yp = X * a .+ ;"
@assert _add_subtract_multiply_divide("yp = X*a.;")=="yp = X * a.;"
@assert _add_subtract_multiply_divide("yp = X*a.; # a+b")=="yp = X * a.; # a+b"
@assert _add_subtract_multiply_divide("a+b")=="a + b"
@assert _add_subtract_multiply_divide("a + b")=="a + b"
@assert _add_subtract_multiply_divide("a +b")=="a + b"
@assert _add_subtract_multiply_divide("aaa+b")=="aaa + b"
@assert _add_subtract_multiply_divide("aaa +b")=="aaa + b"
@assert _add_subtract_multiply_divide("aaa + b")=="aaa + b"
@assert _add_subtract_multiply_divide("aaa+ b")=="aaa + b"
@assert _add_subtract_multiply_divide("aaa.+ b")=="aaa .+ b"
@assert _add_subtract_multiply_divide("aaa .+ b")=="aaa .+ b"
@assert _add_subtract_multiply_divide("aaa .+b")=="aaa .+ b"
@assert _add_subtract_multiply_divide("aaa.+b")=="aaa .+ b"
@assert _add_subtract_multiply_divide("aaa.+")=="aaa .+"
@assert _add_subtract_multiply_divide("aaa.+ ")=="aaa .+ "
@assert _add_subtract_multiply_divide("aaa+")=="aaa +"
@assert _add_subtract_multiply_divide("aaa .+ ")=="aaa .+ "
@assert _add_subtract_multiply_divide("Th = 0.01*ratio")=="Th = 0.01 * ratio"
@assert _add_subtract_multiply_divide("unitReturn = priceDelta*tradeVolume*multiplier-tradeFee;")==
"unitReturn = priceDelta * tradeVolume * multiplier - tradeFee;"
@assert _add_subtract_multiply_divide("bool_exit_stopLoss = bar.Close > openPrice*(1.0+StopLossTh);")==
"bool_exit_stopLoss = bar.Close > openPrice * (1.0 + StopLossTh);"
@assert _add_subtract_multiply_divide("downCount = downCount+1")=="downCount = downCount + 1"
# _format =>ok
@assert _format("a=>") =="a =>"
@assert _format("a=>b") =="a => b"
@assert _format("aa=>") =="aa =>"
@assert _format("aaa=>b") =="aaa => b"
@assert _format("aaaa=>b")=="aaaa => b"
@assert _format("aaaa=>")=="aaaa =>"
@assert _format("strDict =Dict(1 =>0000)") =="strDict = Dict(1 => 0000)"
# OK
@assert _format("s/y")=="s/y"
@assert _format("s//y")=="s//y"
@assert _format("s*y")=="s*y"
@assert _format("y =y+1")=="y = y+1"
@assert _format("y++")=="y++"
@assert _format("2.+2")=="2.+2"
@assert _format("\" abec.>=\" ")=="\" abec.>=\" "
@assert _format("\" abec.>=\"")=="\" abec.>=\""
@assert _format("\" abec.>= \"")=="\" abec.>= \""
@assert _format("\" abec .>= d\" ")=="\" abec .>= d\" "
@assert _format("\" abec .>= d")=="\" abec .>= d"
@assert _format("\" abec .>=o")=="\" abec .>=o"
@assert _format("\" abec .>= ")=="\" abec .>= "
@assert _format("\" abec .>= \"")=="\" abec .>= \""
@assert _format("\"abec =d")=="\"abec =d"
@assert _format("\"abec =d\"")=="\"abec =d\""
@assert _format("\"abec =d\" ")=="\"abec =d\" "
@assert _format("\"abec =d \" ")=="\"abec =d \" "
@assert _format("\"abec ===d \" ")=="\"abec ===d \" "
@assert _format("\"abec ===d \" ")=="\"abec ===d \" "
@assert _format("\" abec .>=d \" ")=="\" abec .>=d \" "
@assert _format("\" abec.>= d\" ")=="\" abec.>= d\" "
@assert _format("\"x=y\"") =="\"x=y\""
@assert _format("abec !== d")=="abec !== d"
@assert _format(" abec >= ")==" abec >= "
@assert _format("abec!==d")=="abec !== d"
@assert _format("abec !==d ")=="abec !== d "
@assert _format("abec !==d")=="abec !== d"
@assert _format("abec!==d")=="abec !== d"
@assert _format("abec !=d")=="abec != d"
@assert _format("abec .>=d")=="abec .>= d"
@assert _format("c !==d")=="c !== d"
@assert _format("c!==d")=="c !== d"
@assert _format("c !=d")=="c != d"
@assert _format("c .>=d")=="c .>= d"
@assert _format("c !=d")=="c != d"
@assert _format("c!=d")=="c != d"
@assert _format("c !=d")=="c != d"
@assert _format("c .>=d")=="c .>= d"
@assert _format("c !=d")=="c != d"
@assert _format("c=d")=="c = d"
@assert _format("c> d")=="c > d"
@assert _format("c.>d")=="c .> d"
@assert _format("c===b")=="c === b"
@assert _format("c>b")=="c > b"
@assert _format("c.> b")=="c .> b"
@assert _format("abec !=d")=="abec != d"
@assert _format("series> windowN")=="series > windowN"
@assert _format("s> ccccc")=="s > ccccc"
@assert _format("ss> cccc")=="ss > cccc"
@assert _format("ss> c")=="ss > c"
@assert _format("ss>c")=="ss > c"
@assert _format("ssss> ")=="ssss > "
@assert _format("ssss.> ")=="ssss .> "
@assert _format("s.> ")=="s .> "
# 普通
@assert _format("x=y") =="x = y"
@assert _format("x.=y")=="x .= y"
@assert _format("abcd=y") =="abcd = y"
@assert _format(_space("abdcd = y"))=="abdcd = y"
@assert _format(_space(" abcd>y"))=="abcd > y"
@assert _format("a>y")=="a > y"
@assert _format(_space("a > y"))=="a > y"
@assert _format("a.<y")=="a .< y"
@assert _format("aaaaa.<y")=="aaaaa .< y"
@assert _format("aaaaa .< y")=="aaaaa .< y"
@assert _format("a> ")=="a > "
@assert _format("aaaaa > ")=="aaaaa > "
@assert _format("aaaa > ")=="aaaa > "
@assert _format("aaaa.>y")=="aaaa .> y"
@assert _format("x=y")=="x = y"
@assert _format("xxxxx=y")=="xxxxx = y"
@assert _format("xxx.=y")=="xxx .= y"
@assert _format(_space("xxxx = y"))=="xxxx = y"
@assert _format("xxxx = y")=="xxxx = y"
@assert _format("xxxx = ")=="xxxx = "
@assert _format("xxxx=y ")=="xxxx = y "
@assert _format("xxx===y")=="xxx === y"
@assert _format("xxx ===y")=="xxx === y"
@assert _format("xxx === y")=="xxx === y"
@assert _format("xxx === ")=="xxx === "
@assert _format("xxx=== ")=="xxx === "
@assert _format("xxx.>=u")=="xxx .>= u"
@assert _format("xxx!=u")=="xxx != u"
@assert _format("xxx != u")=="xxx != u"
@assert _format("xxx != ")=="xxx != "
@assert _format("flag==1 && return true;")=="flag == 1 && return true;"
@assert _format("upC=upC+1;")=="upC = upC+1;"
三、源代码 (updated : 2016-11-20)
让人要吐的代码如下:
module CodeBeautify
export codebeautify,stringindex,_format,_indent,_space,split_byspace,isPreIndent_left,isPreIndent_right,getHeadSpaceNum
export isCurrIndent_left,writeScript,_add_subtract_multiply_divide,_tab
const indent_num = 4;
const space_unit =" ";
# path ="D:\\strategyJulia\\testModule.jl";
# data=readlines(open(joinpath(path)))
# io =open(path,"w + ")
# write(io,strs)
# close(io)
getstrs(strs::String) = collect(take(strs,length(strs)))
getindexstrs(strs::String,n,m) = String(getstrs(strs)[n:m])
getindexstrs(strs::String,n) = getindexstrs(strs,n,n)
function stringindex(strs::String,n,m)
if isascii(strs)
return strs[n:m]
else
return getindexstrs(strs,n,m)
end
end
stringindex(strs,n) = stringindex(strs,n,n);
function codebeautify(path::String)
data = readlines(open(joinpath(path)));
newdata = String[];
len = length(data)
len == 0 && return;
for i = 1:len
strs = _tab(data[i]) # 首先对原始数据进行去制表符化,
#println("beautify i => $i 总共行数:$len")
temp = _add_subtract_multiply_divide(_format(_space(strs)))
if i != 1
prestrs = identity(newdata[end])
temp = identity(_indent(temp,prestrs));
end
#println(temp)
push!(newdata,temp);
end
writeScript(path,newdata);
end
function _indent(strs::String,prestrs::String)
# 处理缩进或突进
# 处理一个空函数
# df2[:key2] = ["发生时间:" for x in 1:19] 中括号中的for,
prenum = getHeadSpaceNum(prestrs);
prewords = split_byspace(prestrs)
currwords = split_byspace(strs)
ismove_left = isPreIndent_left(prewords) ||isCurrIndent_left(currwords);#
if ismove_left && isPreIndent_right(prewords)
return strs
end
if ismove_left
distance = prenum - indent_num
if prenum > 0
return string(repeat(space_unit,distance),strs)
else
println("is last row? distance :$distance")
end
end
if isPreIndent_right(prewords)
distance = prenum + indent_num
return string(repeat(space_unit,distance),strs)
end
return string(repeat(space_unit,prenum),strs)
end
function split_byspace(strs::String) # 考虑转义符
len = length(strs)
data = String[];
strDict = Dict("\""=>0,"\'"=>0)
(isempty(strs)||len == 0) && return data;
flag_start = 1;
flag_end = 1;
sumnum = 0
ishead = false;
isbracket_left =false;
isbracket_right =false;
if len == 1
if strs == space_unit
return data
else
return strs;
end
end
for i = 1:len
str = stringindex(strs,i)
#println(" i :$i start :$flag_start end: $flag_end len: $len")
if in(str,["[","]"])
if str =="["
isbracket_left =true
isbracket_right =false
else
isbracket_left =false;
isbracket_right =true
end
end
if isbracket_left # a = ["c" for i in 1:19]
flag_end =i;
continue;
end
if isbracket_right
isbracket_right = false;
flag_end = i;
temp = stringindex(strs,flag_start+1,flag_end)
(length(temp) > 0 && temp != repeat(space_unit,length(temp))) && push!(data,temp);
continue;
end
if in(str,["\\"]) # path
temp = stringindex(strs,flag_start,len)
(length(temp) > 0 && temp != repeat(space_unit,length(temp))) && push!(data,temp)
break;
end
if in(str,["#"])
if i == 1
temp = stringindex(strs,flag_start,len)
(length(temp) > 0 && temp != repeat(space_unit,length(temp))) && push!(data,temp)
break;
else
temp = stringindex(strs,flag_start + 1,i - 1);
(length(temp) > 0 && temp != repeat(space_unit,length(temp))) && push!(data,temp);
temp2 = stringindex(strs,i,len)
(length(temp2) > 0 && temp2 != repeat(space_unit,length(temp2))) && push!(data,temp2)
break;
end
end
if in(str,["\"","\'"])
strDict[str] = identity(strDict[str]) + 1;
sumnum = sum(values(strDict));
if rem(sumnum,2) != 0
flag_start = i;
end
if rem(sumnum,2) == 0
flag_end = i;
end
#println(sumnum)
end
if i == 1 && str == space_unit
ishead = true;
end
if str != space_unit
ishead = false;
flag_end = i;
end
if ishead && str == space_unit && i < len
flag_start = i + 1;
end
if i > 2 && stringindex(strs,i - 1) == space_unit && str != space_unit
if rem(sumnum,2) == 0 && !in(str,["\"","\'","\\"])
flag_start = i;
end
end
if in(str,["\r","\n"])
temp = stringindex(strs,flag_start,i - 1);
(length(temp) > 0 && temp != repeat(space_unit,length(temp))) && push!(data,temp)
flag_end = i;
flag_start = i;
continue;
end
if (i < len && str != space_unit && stringindex(strs,i + 1) == space_unit)||
(i == len && str != space_unit)||
in(str,["\"","\'","\\"])
if rem(sumnum,2) == 0
flag_end = i;
temp = stringindex(strs,flag_start,flag_end)
(length(temp) > 0 && temp != repeat(space_unit,length(temp))) && push!(data,temp)
#println("=> $flag_end")
end
end
end
#println("start :$flag_start end: $flag_end len: $len")
return data
end
function _format(strs::String)
data ="";
len = length(strs)
strDict = Dict("\""=>0,"\'"=>0)
for i in 1:len
str = stringindex(strs,i)
if in(str,["#","\\"]) # 跳出循还
data = string(data,stringindex(strs,i,len));
break;
elseif in(str,["\"","\'"])
strDict[str] = identity(strDict[str]) + 1;
end
sumnum = sum(values(strDict));
if str != "="
if i == 1
data = str;
continue;
end
prestr = stringindex(strs,i - 1)
# str ="\"";"\'"
if in(str,["\"","\'"]) # ="\"", .=="\"",.="\"" 大到三种模式
if prestr=="="
if i == 2
data = string(identity(data),stringindex(strs,1,len));
break;
elseif i == 3 # x=\"; x=\'
prestr2 = stringindex(strs,i - 2)
if !in(prestr2,["="])
if rem(sumnum,2) != 0 # 偶数
data = string(prestr2,space_unit,"=",space_unit,str);
else
data = string(prestr2,space_unit,"=",str)
end
else
data = string(identity(data),stringindex(strs,i,len));
break;
end
elseif i == 4 #x.=\"
prestr2 = stringindex(strs,i - 2)
prestr3 = stringindex(strs,i - 3)
if in(prestr2,["."])
if prestr3 != space_unit
if rem(sumnum,2) != 0
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,stringindex(strs,i - 2,i - 1),space_unit,str)
else
data = string(identity(stringindex(data,1,length(data) - 1)),stringindex(strs,i - 2,i - 1),str)
end
else
if rem(sumnum,2) != 0
data = string(identity(stringindex(data,1,length(data) - 1)),stringindex(strs,i - 2,i - 1),space_unit,str)
else
data = string(identity(stringindex(data,1,length(data) - 1)),stringindex(strs,i - 2,i - 1),str)
end
end
elseif in(prestr2,["="])
if prestr3 != space_unit
if rem(sumnum,2) != 0
if str != space_unit
data = string(identity(data),space_unit,stringindex(strs,i - 2,i - 1),space_unit,str)
else
data = string(identity(data),space_unit,stringindex(strs,i - 2,i - 1),str)
end
else
data = string(identity(data),stringindex(strs,i - 2,i - 1),str)
end
else
if rem(sumnum,2) != 0
if str != space_unit
data = string(identity(data),stringindex(strs,i - 2,i - 1),space_unit,str)
else
data = string(identity(data),stringindex(strs,i - 2,i - 1),str)
end
else
data = string(identity(data),stringindex(strs,i - 2,i - 1),str)
end
end
else # =\"
if prestr2 != space_unit # ba=\"
if rem(sumnum,2) != 0
data = string(identity(data),space_unit,prestr,space_unit,str)
else
data = string(identity(data),prestr,str)
end
else # a空格=\"
if rem(sumnum,2) != 0
data = string(identity(data),prestr,space_unit,str)
else
data = string(identity(data),prestr,str)
end
end
end
else # x.==\"
prestr2 = stringindex(strs,i - 2);
prestr3 = stringindex(strs,i - 3);
if prestr2=="=" # ==\"
if in(prestr3,["="])
data = string(identity(data),prestr3,prestr2,prestr,str)
else
data = string(identity(data),prestr2,prestr,str)
end
elseif in(prestr2,["."]) # a.=\"
data = string(identity(data),prestr,str)
else # b=\'
data = string(identity(data),prestr,str)
end
end
else # =d\
data = string(identity(data),str)
end
elseif in(str,[" "]) # 当前是空格 =>重新改写
if prestr =="="
if i == 2 # x=2
data = string(identity(data),stringindex(strs,1,len));
break;
elseif i == 3 # x=空格
prestr2 = stringindex(strs,i - 2)
if !in(prestr2,[">","<",".","!"])
#println("3 - >sum: $sumnum str:$(str)")
if rem(sumnum,2) == 0 # 偶数
data = string(prestr2,space_unit,"=",str);
else
data = string(prestr2,"=",str)
end
else # !=空格
data = string(identity(data),stringindex(strs,i,len));
break;
end
elseif i == 4
prestr2 = stringindex(strs,i - 2);
if prestr2 == space_unit #a空格=空格
data = string(identity(data),"=",str)
else # #a=空格
if in(prestr2,[">","<",".","!"]) # A.=空格
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,stringindex(strs,i - 2,i - 1),str)
else
data = string(identity(stringindex(data,1,length(data) - 1)),stringindex(strs,i - 2,i - 1),str)
end
else# ab=空格
if rem(sumnum,2) == 0
data = string(identity(data),space_unit,prestr,str)
else
data = string(identity(data),prestr,str)
end
end
end
else # >=5 BUG: " abec >= "
prestr2 = stringindex(strs,i - 2);
prestr3 = stringindex(strs,i - 3);
prestr4 = stringindex(strs,i - 4);
if prestr2=="=" # ==空格
if in(prestr3,["="]) # x===空格; x.==空格;
if prestr4 != space_unit
if rem(sumnum,2) == 0 # x===空格 ;
data = string(identity(data),space_unit,prestr3,prestr2,prestr,str)
else # x===空格 ;
data = string(identity(data),prestr3,prestr2,prestr,str)
end
else # x空格===空格 ;
data = string(identity(data),prestr3,prestr2,prestr,str)
end
elseif in(prestr3,[".","!"])
if prestr4 != space_unit
if rem(sumnum,2) == 0 ## xxx.==空格
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,prestr3,prestr2,prestr,str)
else
data = string(identity(data),prestr3,prestr2,prestr,str)
end
else ## xxx空格.==空格
data = string(identity(data),prestr2,prestr,str)
end
else
data = string(identity(data),space_unit,prestr2,prestr,str)
end
elseif in(prestr2,[">","<"])
if in(prestr3,["."]) # .<=
if prestr4 != space_unit # x.<=空格
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 2)),space_unit,stringindex(strs,i - 3,i - 1),str)
else
data = string(identity(stringindex(data,1,length(data) - 2)),stringindex(strs,i - 3,i - 1),str)
end
else # 空格.<=空格
data = string(identity(stringindex(data,1,length(data) - 2)),stringindex(strs,i - 3,i - 1),str)
end
elseif in(prestr3,[" "]) # a空格<=空格 " abec >= "
data = string(identity(data),prestr,str)
else # a>=空格
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,stringindex(strs,i - 2,i - 1),str)
else
data = string(identity(stringindex(data,1,length(data) - 1)),stringindex(strs,i - 2,i - 1),str)
end
end
elseif in(prestr2,[".","!"])
if prestr3 != space_unit # x.=空格 ;x!=空格
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,stringindex(strs,i - 2,i - 1),str)
else
data = string(identity(stringindex(data,1,length(data) - 1)),stringindex(strs,i - 2,i - 1),str)
end
else # 空格.=空格
data = string(identity(data),prestr,str)
end
elseif in(prestr2,[" "]) # xxxx =
data = string(data,prestr,str);
else # 不在其中
# x=空格 ;
if rem(sumnum,2) == 0
data = string(identity(data),space_unit,prestr,str)
else
data = string(identity(data),prestr,str)
end
end
end # 前一字符为=
elseif in(prestr,["<",">"]) # x<2? x:y; x.< y? 5.0<y? 5.<y; a=>b a => b
if i == 2
data = string(identity(data),str);
elseif i == 3 # x>空格
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,prestr,str)
else
data = string(identity(data),str)
end
else
prestr2 = stringindex(strs,i - 2)
prestr3 = stringindex(strs,i - 3)
if prestr2=="."
if prestr3 != space_unit
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 2)),space_unit,stringindex(strs,i - 2,i - 1),str)
else
data = string(identity(stringindex(data,1,length(data) - 2)),stringindex(strs,i - 2,i - 1),str)
end
else
if rem(sumnum,2) == 0
if str != space_unit
data = string(identity(stringindex(data,1,length(data) - 2)),stringindex(strs,i - 2,i - 1),space_unit,str)
else
data = string(identity(stringindex(data,1,length(data) - 2)),stringindex(strs,i - 2,i - 1),str)
end
else
data = string(identity(stringindex(data,1,length(data) - 2)),stringindex(strs,i - 2,i - 1),str)
end
end
else
if prestr2 != space_unit # xzy>空格
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,prestr,str)
else
data = string(identity(data),str)
end
else # xz空格>空格
if rem(sumnum,2) == 0
data = string(identity(data),str)
else
data = string(identity(data),str)
end
end
end
end
else # "xxxx = y "
data = string(identity(data),str)
end
elseif in(str,[">"])
if in(prestr,["="])
if i == 2
data = string(prestr,str);
elseif i == 3
prestr2 = stringindex(strs,i - 2)
data = string(prestr2,space_unit,prestr,str)
else # a=>
prestr2 = stringindex(strs,i - 2);
prestr3 = stringindex(strs,i - 3);
if prestr2 != space_unit # aa=>
if rem(sumnum,2) == 0
data = string(identity(data),space_unit,prestr,str)
else
data = string(identity(data),prestr,str)
end
else # aa =>
data = string(identity(data),prestr,str)
end
end
else
data = string(identity(data),str)
end
elseif in(str,[":"]) # => csv2H5ArrayData{T <:Any},
if prestr=="<"
if i==2
data =string(identity(data),stringindex(strs,i,len))
else # i>=2
if i==len # data =a < :
data =string(identity(stringindex(data,i,length(data))),str)
else
prestr2 =stringindex(strs,i-2)
str2 =stringindex(strs,i+1)
if str2!=space_unit # data =a <:b
if prestr2 !=space_unit
if rem(sumnum,2)==0
data =string(identity(stringindex(data,1,length(data)-1)),space_unit,prestr,str,space_unit)
else
data =string(identity(data),str)
end
else
if rem(sumnum,2)==0
data =string(identity(stringindex(data,1,length(data)-1)),prestr,str,space_unit)
else
data =string(identity(data),str)
end
end
else # data =a <:空格
if prestr2 !=space_unit
if rem(sumnum,2)==0
data =string(identity(stringindex(data,1,length(data)-1)),space_unit,prestr,str)
else
data =string(identity(data),str)
end
else
data =string(identity(data),str)
end
end
end
end
else
data =string(identity(data),str)
end
else # 当前字符 str 不是 \"; \',不空格
if prestr =="="# !==,>=;.>=,===,.==;=;.=;==;
if i == 2 # x=2
data = string(identity(data),stringindex(strs,1,len));
break;
elseif i == 3 # x=2
prestr2 = stringindex(strs,i - 2)
if !in(prestr2,[">","<",".","!"])
#println("3 - >sum: $sumnum str:$(str)")
if rem(sumnum,2) == 0 # 偶数
if str != space_unit
data = string(prestr2,space_unit,"=",space_unit,str);
else
data = string(prestr2,space_unit,"=",str);
end
else
data = string(prestr2,"=",str)
end
else
data = string(identity(data),stringindex(strs,i,len));
break;
end
elseif i == 4 #i==4,5....; x==2 ; x.=2; x<=3 ; 防范等号前的空号 是不是要改写一下(按i==5格式?)???
prestr2 = stringindex(strs,i - 2);
prestr3 = stringindex(strs,i - 3);
if in(prestr2,[".",">","<","!"])
if prestr3 != space_unit
if rem(sumnum,2) == 0
if str != space_unit
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,stringindex(strs,i - 2,i - 1),space_unit,str)
else
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,stringindex(strs,i - 2,i - 1),str)
end
else
data = string(identity(stringindex(data,1,length(data) - 1)),stringindex(strs,i - 2,i - 1),str)
end
else
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 1)),stringindex(strs,i - 2,i - 1),space_unit,str)
else
data = string(identity(stringindex(data,1,length(data) - 1)),stringindex(strs,i - 2,i - 1),str)
end
end
elseif in(prestr2,["="])
if prestr3 != space_unit
if rem(sumnum,2) == 0
data = string(identity(data),space_unit,stringindex(strs,i - 2,i - 1),space_unit,str)
else
data = string(identity(data),stringindex(strs,i - 2,i - 1),str)
end
else
if rem(sumnum,2) == 0
data = string(identity(data),stringindex(strs,i - 2,i - 1),space_unit,str)
else
data = string(identity(data),stringindex(strs,i - 2,i - 1),str)
end
end
elseif in(prestr2,[" "])
if rem(sumnum,2) == 0
data = string(identity(data),stringindex(strs,i - 1),space_unit,str)
else
data = string(identity(data),stringindex(strs,i - 1),str)
end
else
if rem(sumnum,2) == 0
data = string(identity(data),space_unit,stringindex(strs,i - 1),space_unit,str)
else
data = string(identity(data),stringindex(strs,i - 1),str)
end
end
else # >5 ; abec .>= d
prestr2 = stringindex(strs,i - 2);
prestr3 = stringindex(strs,i - 3);
prestr4 = stringindex(strs,i - 4);
if prestr2=="=" # ==Y ;"abec !==d"
if in(prestr3,[".","=","!"]) # x===2; x.==2;X!==2
if prestr4 != space_unit #"abec !==d"
if in(prestr3,[".","!"]) # data要少取一个字符 xxx!==y
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,prestr3,prestr2,prestr,space_unit,str)
else
data = string(identity(data),prestr2,prestr,str)
end
#println(data)
else # xxx===y
if rem(sumnum,2) == 0
data = string(identity(data),space_unit,prestr3,prestr2,prestr,space_unit,str)
else #
data = string(identity(data),prestr3,prestr2,prestr,str)
end
end
else #x空格.==2
if in(prestr3,[".","!"]) # data要少取一个字符 xxx !==y
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 1)),prestr3,prestr2,prestr,space_unit,str)
else
data = string(identity(data),prestr2,prestr,str)
end
else # x空格===2
if rem(sumnum,2) == 0
data = string(identity(data),prestr3,prestr2,prestr,space_unit,str)
else
data = string(identity(data),prestr3,prestr2,prestr,str)
end
end
end
elseif in(prestr3,[" "])# xxx空格==y
data = string(identity(data),prestr2,prestr,space_unit,str)
else # xxx==y
data = string(identity(data),space_unit,prestr2,prestr,space_unit,str)
end
elseif in(prestr2,[">","<"])
if in(prestr3,["."]) # .<=
if prestr4 != space_unit # xxx.<=y
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 2)),space_unit,prestr3,prestr2,prestr,space_unit,str)
else
data = string(identity(stringindex(data,1,length(data) - 2)),prestr3,prestr2,prestr,str)
end
else ## xxx空格.<=y
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 2)),prestr3,prestr2,prestr,space_unit,str)
else
data = string(identity(stringindex(data,1,length(data) - 2)),prestr3,prestr2,prestr,str)
end
end
elseif in(prestr3,[" "]) # a <=y
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 2)),prestr2,prestr,space_unit,str)
else
data = string(identity(data),prestr,str)
end
else # a>=y
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,prestr2,prestr,space_unit,str)
else
data = string(identity(data),prestr,str)
end
end
elseif in(prestr2,[".","!"])
if prestr3 != space_unit # x.=y ;x!=y
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,stringindex(strs,i - 2,i - 1),space_unit,str)
else
data = string(identity(stringindex(data,1,length(data) - 1)),stringindex(strs,i - 2,i - 1),str)
end
else
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 1)),stringindex(strs,i - 2,i - 1),space_unit,str)
else
data = string(identity(stringindex(data,1,length(data) - 1)),stringindex(strs,i - 2,i - 1),str)
end
end
elseif in(prestr2,[" "]) # x =y
if prestr3 == space_unit # 空格空格=y
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 1)),prestr2,prestr,space_unit,str)
else
data = string(identity(data),prestr,str)
end
else # # x空格=y
if rem(sumnum,2) == 0
data = string(identity(data),prestr,space_unit,str)
else
data = string(identity(data),prestr,str)
end
end
else # xxxxx=y
if rem(sumnum,2) == 0 # 偶数
data = string(identity(data),space_unit,prestr,space_unit,str)
else
data = string(identity(data),prestr,str)
end
end
end
elseif in(prestr,["<",">"]) # x<2? x:y; x.< y? 5.0<y? 5.<y
if i == 2
data = string(identity(data),str);
elseif i == 3
if rem(sumnum,2) == 0
if str != space_unit
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,prestr,space_unit,str)
else
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,prestr,str)
end
else
data = string(identity(data),str)
end
else # x>y
prestr2 = stringindex(strs,i - 2)
prestr3 = stringindex(strs,i - 3)
if prestr2=="."
if prestr3 != space_unit
if rem(sumnum,2) == 0
if str != space_unit
data = string(identity(stringindex(data,1,length(data) - 2)),space_unit,stringindex(strs,i - 2,i - 1),space_unit,str)
else
data = string(identity(stringindex(data,1,length(data) - 2)),space_unit,stringindex(strs,i - 2,i - 1),str)
end
else
data = string(identity(stringindex(data,1,length(data) - 2)),stringindex(strs,i - 2,i - 1),str)
end
else
if rem(sumnum,2) == 0
if str != space_unit
data = string(identity(stringindex(data,1,length(data) - 2)),stringindex(strs,i - 2,i - 1),space_unit,str)
else
data = string(identity(stringindex(data,1,length(data) - 2)),stringindex(strs,i - 2,i - 1),str)
end
else
data = string(identity(stringindex(data,1,length(data) - 2)),stringindex(strs,i - 2,i - 1),str)
end
end # x.>y ;x.<y
elseif in(prestr2,["="]) #
if prestr3 != space_unit # "a=>b " "a=<b"
if rem(sumnum,2) == 0 && in(prestr,[">"])
data = string(identity(stringindex(data,1,length(data) - 3)),space_unit,prestr2,prestr,space_unit,str)
else
data = string(identity(data),str)
end
else
data = string(identity(data),space_unit,str)
end
else # x空格>y ; xxx>y
if prestr2 != space_unit # xxx>y
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,prestr,space_unit,str)
else
data = string(identity(data),str)
end
else # x空格>y
if rem(sumnum,2) == 0
data = string(identity(data),space_unit,str)
else
data = string(identity(data),str)
end
end
end
end
elseif in(prestr,[" "])
data = string(identity(data),str)
else # xxxxy _format("aaaaa .< y")
data = string(identity(data),str)
end
end
else # str 为“=”
continue;
end
end
return data;
end
function _space(strs::String) #
data ="";
len = length(strs)
strDict = Dict("\""=>0,"\'"=>0)
for i = 1:len
#println("_space: $i")
str = stringindex(strs,i)
if in(str,["\"","\'"])
strDict[str] = identity(strDict[str]) + 1;
data = string(identity(data),str)
else
sumnum = sum(values(strDict));
if rem(sumnum,2) == 0 # 偶数
if str == space_unit # " "
if i == 1
continue;
else
prestr = stringindex(strs,i - 1)
if prestr == space_unit
continue;
else
if prestr=="(" #(空格
continue;
else
data = string(identity(data),str)
end
end
end
elseif str==")"
if i == 1
data = strs;
break;
else
prestr = stringindex(strs,i - 1)
if prestr == space_unit
data = string(identity(stringindex(data,1,length(data) - 1)),str)
else
data = string(identity(data),str);
end
end
elseif str=="&" # 第一次 &, 第二次 & ; #&&
if i == 1
data = strs;
break;
elseif i == 2
prestr = stringindex(strs,i - 1)
if prestr == space_unit && prestr =="&"
data = string(identity(data),str);
else
data = string(identity(data)," ",str);
end
else
prestr = stringindex(strs,i - 1)
prestr2 = stringindex(strs,i - 2)
# && reutrn; && return && return =>前中后
if prestr =="&"
if prestr2 == space_unit
if i < len
prostr = stringindex(strs,i + 1);
if prostr != space_unit
data = string(identity(data),str,space_unit);
else
data = string(identity(data),str);
end
else
data = string(identity(data),str);
end
else
if i < len
prostr = stringindex(strs,i + 1);
if prostr != space_unit
data = string(identity(stringindex(data,1,length(data) - 2)),space_unit,stringindex(strs,i - 1,i),space_unit);
else
data = string(identity(stringindex(data,1,length(data) - 2)),space_unit,stringindex(strs,i - 1,i));
end
else
data = string(identity(stringindex(data,1,length(data) - 2)),space_unit,stringindex(strs,i - 1,i));
end
end
else # !="&"
if prestr2 == space_unit
data = string(identity(data),str);
elseif prestr2 != space_unit
data = string(identity(data),space_unit,str);
end
end
end
elseif str=="\\"
data = string(identity(data),stringindex(strs,i,len))
break;
elseif str =="#"
data = string(identity(data),stringindex(strs,i,len))
break;
else # x =y
data = string(identity(data),str)
end
else
data = string(identity(data),str);
end
end
end
return data;
end
function _tab(strs::String) # 删除代码中的制表符
len =length(strs)
data ="";
ishead =true;
for i =1:len
str =stringindex(strs,i)
if !in(str,["\t"," "])
if ishead
data = string(identity(data),stringindex(strs,i,len))
end
ishead =false;
end
end
return data
end
function _add_subtract_multiply_divide(strs::String) # 加减乘除
# 处理其中的加减乘除
data ="";
len = length(strs)
strDict = Dict("\""=>0,"\'"=>0)
# 思路:第一个\判断,连带处理后面的\,;第二外\不做处理。
for i = 1:len
#println("_space: $i")
str = stringindex(strs,i)
if in(str,["\\","#"])
data = string(identity(data),stringindex(strs,i,len))
break;
elseif in(str,["\"","\'"])
strDict[str] = identity(strDict[str]) + 1;
data = string(identity(data),str)
elseif in(str,["/"]) #
sumnum = sum(values(strDict));
if i == 1
if i == len
data = identity(str);
else
str2 = stringindex(strs,i + 1)
if str2 =="/"
str3 = stringindex(strs,i + 2)
if str3 == space_unit
data = string(str,str2)
else
if rem(sumnum,2) == 0
data = string(str,str2,space_unit)
else
data = string(str,str2)
end
end
elseif str2 != space_unit
if rem(sumnum,2) == 0
data = string(str,space_unit)
else
data = str;
end
else
data = identity(str);
end
end
else
prestr = stringindex(strs,i - 1)
if prestr=="/"#
continue;
elseif prestr == space_unit # 空格 // ;空格 / ;
if i == len
data = string(identity(data),str)
else
str2 = stringindex(strs,i + 1);
if str2 =="/"
if i + 1 == len
data = string(identity(data),str,str2)
else
str3 = stringindex(strs,i + 2)
if str3 == space_unit
data = string(identity(data),str,str2)
else
if rem(sumnum,2) == 0
data = string(identity(data),str,str2,space_unit)
else
data = string(identity(data),str,str2)
end
end
end
elseif str2 == space_unit
data = string(identity(data),str)
else
if rem(sumnum,2) == 0
data = string(identity(data),str,space_unit)
else
data = string(identity(data),str)
end
end
end
elseif prestr == "." #
if i ==len
data = string(identity(data),str)
elseif i==2
data = string(identity(data),stringindex(strs,i,len))
break;
else
str2 = stringindex(strs,i + 1);
prestr2=stringindex(strs,i - 2);
if str2 != space_unit #
if prestr2 != space_unit # a./b
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,i - 2)),space_unit,prestr,str,space_unit);
else
data = string(identity(data),str);
end
else #a ./b;
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,i - 2)),prestr,str,space_unit);
else
data = string(identity(data),str);
end
end
else # a ./空格
if prestr2 != space_unit #a./ 空格;
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,i - 2)),space_unit,prestr,str);
else #\" a ./ b;
data = string(data,str);
end
else ##\" a ./ b;
data = string(data,str);
end
end
end
else# a / => / B
if i == len
data = string(prestr,str)
else
str2 = stringindex(strs,i + 1)
if str2 =="/"
if i + 1 == len
continue;
else
str3 = stringindex(strs,i + 2);
if str3 == space_unit #
if rem(sumnum,2) == 0
data = string(identity(data),space_unit,str,str2)
else
data = string(identity(data),str,str2)
end
else
if rem(sumnum,2) == 0
data = string(identity(data),space_unit,str,str2,space_unit)
else
data = string(identity(data),str,str2)
end
end
end
elseif str2 == space_unit
if rem(sumnum,2) == 0
data = string(identity(data),space_unit,str)
else
data = string(identity(data),str)
end
else
if rem(sumnum,2) == 0
data = string(identity(data),space_unit,str,space_unit)
else
data = string(identity(data),str)
end
end
end
end
end
elseif in(str,["+","*","-"])
sumnum = sum(values(strDict));
if i == 1
if i == len
data = identity(str);
else
str2 = stringindex(strs,i + 1)
if str2 != space_unit
if rem(sumnum,2) == 0
data = string(str,space_unit)
else
data = string(str)
end
else
data = identity(str);
end
end
elseif i == 2
prestr = stringindex(strs,i - 1);
if i == len
data = string(identity(data),str)
else # A + B
str2 = stringindex(strs,i + 1)
if str2 == space_unit
data = string(identity(data),str)
# elseif str2=="/"
# if i + 1 == len
# if rem(sumnum,2) == 0
# data = string(prestr,space_unit,str,str2)
# else
# data = string(prestr,str,str2)
# end
# else
# str3 = stringindex(strs,i + 2)
# if str3 != space_unit
# if rem(sumnum,2) == 0
# data = string(prestr,space_unit,str,str2,space_unit)
# else
# data = string(prestr,str,str2)
# end
# else
# if rem(sumnum,2) == 0
# data = string(prestr,space_unit,str,str2)
# else
# data = string(prestr,str,str2)
# end
# end
# end
else
if rem(sumnum,2) == 0
if prestr =="/"
data = string(identity(data),str)
elseif prestr != space_unit
data = string(identity(data),space_unit,str,space_unit)
else
data = string(identity(data),str,space_unit)
end
else
data = string(identity(data),str)
end
end
end
else
prestr = stringindex(strs,i - 1);
prestr2 = stringindex(strs,i - 2);
if i == len
if prestr =="."
if prestr2 != space_unit # aaa.=
if rem(sumnum,2) == 0
data = string(identity(stringindex(data,1,length(data) - 1)),space_unit,prestr,str)
else
data = string(identity(data),str)
end
else
data = string(identity(data),str)
end
else
if prestr2 != space_unit # a=
data = string(identity(data),space_unit,str)
else
data = string(identity(data),str)
end
end
else #aa + b; .+ b; a空格 + b;a空格 .+ 空格
str2 = stringindex(strs,i + 1)
if prestr=="." #
if str2 != space_unit #
if prestr2 != space_unit # X*a.+b
if rem(sumnum,2) == 0 # update 11/20
data = string(identity(stringindex(data,1,length(data)-1)),space_unit,prestr,str,space_unit);
else # X*a .+b
data = string(identity(data),str);
end
else ## X*a .+b
if rem(sumnum,2) == 0
data = string(identity(data),str,space_unit);
else
data = string(identity(data),str);
end
end
else #
if prestr2 != space_unit # X*a.+ b
if rem(sumnum,2) == 0 # update 11-20
data = string(identity(stringindex(data,1,length(data)- 1)),space_unit,prestr,str);
else #\".+b;
data = string(data,str);
end
else ## X*a .+ b
data = string(data,str);
end
end
elseif prestr == space_unit # a空格 +
if str2 != space_unit # a空格 + A
if rem(sumnum,2) == 0
data = string(identity(data),str,space_unit)
else
data = string(identity(data),str)
end
else
data = string(identity(data),str)
end
else # aaa + b; aaa + b
if str2 != space_unit
if rem(sumnum,2) == 0 # aaa + b;
data = string(identity(data),space_unit,str,space_unit)
else
data = string(identity(data),str)
end
else # aaa + b
if rem(sumnum,2) == 0
data = string(identity(data),space_unit,str)
else
data = string(identity(data),str)
end
end
end
end
end
else
data = string(identity(data),str)
end
end
return data;
end
function isPreIndent_right(prestrs::Array{String})
list_more = ["if" ,"else","elseif" ,"for" ,"while",
"function", "type","immutable","macro","try","catch","finally"] #"module",
stringindex(prestrs[1],1)=="#" && return false;
for str in prestrs
if in(str,list_more)
#println("isPreIndent_right : $str")
return true;
end
end
return false
end
# && return, && return 二种情况的
function isPreIndent_left(prestrs::Array{String})
list_less = ["return","break","continue"] # no end!
stringindex(prestrs[1],1)=="#" && return false;
flag = 0;
for str in prestrs
flag = flag + 1;
if in(str,list_less)
#println("isPreIndent_left : $str")
flag == 1 && return true;
if flag != 1
prestr = prestrs[flag - 1];
if in(prestr,["&","&&"])
return false;
end
end
return true;
end
end
return false
end
function isCurrIndent_left(strs::Array{String})
list_more = ["else","elseif" ,"end"]
stringindex(strs[1],1)=="#" && return false;
for str in strs
if in(str,list_more)
#println("isCurrIndent_left : $str")
return true;
end
end
return false
end
function getHeadSpaceNum(strs::String)
len = length(strs)
flag = 0
for i = 1:len
str = stringindex(strs,i)
if str != space_unit
break;
else
flag = flag + 1
end
end
return flag
end
function writeScript(path::String,strs::String)
#data=readlines(open(joinpath(path)))
io = open(path,"w+")
write(io,strs)
close(io)
end
function writeScript(path::String,data::Array{String})
io = open(path,"w+");
for strs in data
write(io,strs)
end
close(io);
end
end