Skip to content

Commit

Permalink
Fix chzyer#43 , remove sub-package for gopkg compatiblity
Browse files Browse the repository at this point in the history
  • Loading branch information
chzyer authored and lunixbochs committed May 4, 2017
1 parent b3f1e61 commit 106041e
Show file tree
Hide file tree
Showing 9 changed files with 227 additions and 12 deletions.
2 changes: 0 additions & 2 deletions complete.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import (
"bytes"
"fmt"
"io"

"github.com/chzyer/readline/runes"
)

type AutoCompleter interface {
Expand Down
2 changes: 0 additions & 2 deletions complete_helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package readline
import (
"bytes"
"strings"

"github.com/chzyer/readline/runes"
)

type PrefixCompleterInterface interface {
Expand Down
2 changes: 0 additions & 2 deletions complete_segment.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package readline

import "github.com/chzyer/readline/runes"

type SegmentCompleter interface {
// a
// |- a1
Expand Down
2 changes: 0 additions & 2 deletions history.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ import (
"fmt"
"os"
"strings"

"github.com/chzyer/readline/runes"
)

type hisItem struct {
Expand Down
2 changes: 0 additions & 2 deletions runebuf.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ import (
"bytes"
"io"
"strings"

"github.com/chzyer/readline/runes"
)

type runeBufferBck struct {
Expand Down
156 changes: 156 additions & 0 deletions runes.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
package readline

import (
"bytes"
"unicode"
)

var runes = Runes{}

type Runes struct{}

func (Runes) Equal(a, b []rune) bool {
if len(a) != len(b) {
return false
}
for i := 0; i < len(a); i++ {
if a[i] != b[i] {
return false
}
}
return true
}

// Search in runes from end to front
func (Runes) IndexAllBck(r, sub []rune) int {
for i := len(r) - len(sub); i >= 0; i-- {
found := true
for j := 0; j < len(sub); j++ {
if r[i+j] != sub[j] {
found = false
break
}
}
if found {
return i
}
}
return -1
}

// Search in runes from front to end
func (Runes) IndexAll(r, sub []rune) int {
for i := 0; i < len(r); i++ {
found := true
if len(r[i:]) < len(sub) {
return -1
}
for j := 0; j < len(sub); j++ {
if r[i+j] != sub[j] {
found = false
break
}
}
if found {
return i
}
}
return -1
}

func (Runes) Index(r rune, rs []rune) int {
for i := 0; i < len(rs); i++ {
if rs[i] == r {
return i
}
}
return -1
}

func (Runes) ColorFilter(r []rune) []rune {
newr := make([]rune, 0, len(r))
for pos := 0; pos < len(r); pos++ {
if r[pos] == '\033' && r[pos+1] == '[' {
idx := runes.Index('m', r[pos+2:])
if idx == -1 {
continue
}
pos += idx + 2
continue
}
newr = append(newr, r[pos])
}
return newr
}

var zeroWidth = []*unicode.RangeTable{
unicode.Mn,
unicode.Me,
unicode.Cc,
unicode.Cf,
}

var doubleWidth = []*unicode.RangeTable{
unicode.Han,
unicode.Hangul,
unicode.Hiragana,
unicode.Katakana,
}

func (Runes) Width(r rune) int {
if unicode.IsOneOf(zeroWidth, r) {
return 0
}
if unicode.IsOneOf(doubleWidth, r) {
return 2
}
return 1
}

func (Runes) WidthAll(r []rune) (length int) {
for i := 0; i < len(r); i++ {
length += runes.Width(r[i])
}
return
}

func (Runes) Backspace(r []rune) []byte {
return bytes.Repeat([]byte{'\b'}, runes.WidthAll(r))
}

func (Runes) Copy(r []rune) []rune {
n := make([]rune, len(r))
copy(n, r)
return n
}

func (Runes) HasPrefix(r, prefix []rune) bool {
if len(r) < len(prefix) {
return false
}
return runes.Equal(r[:len(prefix)], prefix)
}

func (Runes) Aggregate(candicate [][]rune) (same []rune, size int) {
for i := 0; i < len(candicate[0]); i++ {
for j := 0; j < len(candicate)-1; j++ {
if i >= len(candicate[j]) || i >= len(candicate[j+1]) {
goto aggregate
}
if candicate[j][i] != candicate[j+1][i] {
goto aggregate
}
}
size = i + 1
}
aggregate:
if size > 0 {
same = runes.Copy(candicate[0][:size])
for i := 0; i < len(candicate); i++ {
n := runes.Copy(candicate[i])
copy(n, n[size:])
candicate[i] = n[:len(n)-size]
}
}
return
}
3 changes: 3 additions & 0 deletions runes/runes.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// deprecated.
// see https://github.com/chzyer/readline/issues/43
// use github.com/chzyer/readline/runes.go
package runes

import (
Expand Down
68 changes: 68 additions & 0 deletions runes_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package readline

import (
"reflect"
"testing"
)

type twidth struct {
r []rune
length int
}

func TestRuneWidth(t *testing.T) {
rs := []twidth{
{[]rune("☭"), 1},
{[]rune("a"), 1},
{[]rune("你"), 2},
{runes.ColorFilter([]rune("☭\033[13;1m你")), 3},
}
for _, r := range rs {
if w := runes.WidthAll(r.r); w != r.length {
t.Fatal("result not expect", r.r, r.length, w)
}
}
}

type tagg struct {
r [][]rune
e [][]rune
length int
}

func TestAggRunes(t *testing.T) {
rs := []tagg{
{
[][]rune{[]rune("ab"), []rune("a"), []rune("abc")},
[][]rune{[]rune("b"), []rune(""), []rune("bc")},
1,
},
{
[][]rune{[]rune("addb"), []rune("ajkajsdf"), []rune("aasdfkc")},
[][]rune{[]rune("ddb"), []rune("jkajsdf"), []rune("asdfkc")},
1,
},
{
[][]rune{[]rune("ddb"), []rune("ajksdf"), []rune("aasdfkc")},
[][]rune{[]rune("ddb"), []rune("ajksdf"), []rune("aasdfkc")},
0,
},
{
[][]rune{[]rune("ddb"), []rune("ddajksdf"), []rune("ddaasdfkc")},
[][]rune{[]rune("b"), []rune("ajksdf"), []rune("aasdfkc")},
2,
},
}
for _, r := range rs {
same, off := runes.Aggregate(r.r)
if off != r.length {
t.Fatal("result not expect", off)
}
if len(same) != off {
t.Fatal("result not expect", same)
}
if !reflect.DeepEqual(r.r, r.e) {
t.Fatal("result not expect")
}
}
}
2 changes: 0 additions & 2 deletions utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ import (
"bytes"
"strconv"

"github.com/chzyer/readline/runes"

"golang.org/x/crypto/ssh/terminal"
)

Expand Down

0 comments on commit 106041e

Please sign in to comment.