github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgGoSource/kmgFormat/source.go (about) 1 package kmgFormat 2 3 import ( 4 "bytes" 5 "github.com/bronze1man/kmg/kmgGoSource/kmgGoReader" 6 "go/format" 7 ) 8 9 func Source(src []byte) ([]byte, error) { 10 src = RemoteEmptyLine(src) 11 out, err := format.Source(src) 12 if err != nil { 13 return out, err 14 } 15 return out, nil 16 } 17 18 func RemoteEmptyLine(src []byte) []byte { 19 r := kmgGoReader.NewReader(src, nil) 20 outBuf := &bytes.Buffer{} 21 r.ReadAllSpaceWithoutLineBreak() 22 if r.IsEof() { 23 return []byte{} 24 } 25 b := r.ReadByte() 26 if b != '\n' { 27 outBuf.Write(r.BufToCurrent(0)) 28 } 29 for { 30 if r.IsEof() { 31 return outBuf.Bytes() 32 } 33 b := r.ReadByte() 34 if b == '\n' { 35 startPos := r.Pos() - 1 // 包括那个\n 36 r.ReadAllSpaceWithoutLineBreak() 37 if r.IsEof() { 38 outBuf.WriteByte('\n') 39 return outBuf.Bytes() 40 } 41 b := r.ReadByte() 42 if b == '\n' { 43 r.UnreadByte() 44 } else { 45 outBuf.Write(r.BufToCurrent(startPos)) 46 } 47 } else { 48 outBuf.WriteByte(b) 49 } 50 } 51 }