Julia: 自制的Julia代码排版工具CodeBeautify

    xiaoxiao2021-08-17  116

    前些天,尝试写了一个简单实用的代码排版工具(看到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
    转载请注明原文地址: https://ju.6miu.com/read-676512.html

    最新回复(0)