mirror of https://github.com/docker/cli.git
vendor: golang.org/x/text v0.3.7
full diff: https://github.com/golang/text/compare/v0.3.4...v0.3.7 Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
7880acb052
commit
576e4dce44
|
@ -42,7 +42,7 @@ require (
|
||||||
github.com/xeipuuv/gojsonschema v1.2.0
|
github.com/xeipuuv/gojsonschema v1.2.0
|
||||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9
|
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
|
||||||
golang.org/x/text v0.3.4
|
golang.org/x/text v0.3.7
|
||||||
google.golang.org/grpc v1.38.0 // indirect
|
google.golang.org/grpc v1.38.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
gotest.tools/v3 v3.1.0
|
gotest.tools/v3 v3.1.0
|
||||||
|
|
|
@ -894,8 +894,9 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc=
|
|
||||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
||||||
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build go1.10
|
||||||
// +build go1.10
|
// +build go1.10
|
||||||
|
|
||||||
package bidirule
|
package bidirule
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build !go1.10
|
||||||
// +build !go1.10
|
// +build !go1.10
|
||||||
|
|
||||||
package bidirule
|
package bidirule
|
||||||
|
|
|
@ -12,15 +12,14 @@
|
||||||
// and without notice.
|
// and without notice.
|
||||||
package bidi // import "golang.org/x/text/unicode/bidi"
|
package bidi // import "golang.org/x/text/unicode/bidi"
|
||||||
|
|
||||||
// TODO:
|
// TODO
|
||||||
// The following functionality would not be hard to implement, but hinges on
|
|
||||||
// the definition of a Segmenter interface. For now this is up to the user.
|
|
||||||
// - Iterate over paragraphs
|
|
||||||
// - Segmenter to iterate over runs directly from a given text.
|
|
||||||
// Also:
|
|
||||||
// - Transformer for reordering?
|
// - Transformer for reordering?
|
||||||
// - Transformer (validator, really) for Bidi Rule.
|
// - Transformer (validator, really) for Bidi Rule.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
)
|
||||||
|
|
||||||
// This API tries to avoid dealing with embedding levels for now. Under the hood
|
// This API tries to avoid dealing with embedding levels for now. Under the hood
|
||||||
// these will be computed, but the question is to which extent the user should
|
// these will be computed, but the question is to which extent the user should
|
||||||
// know they exist. We should at some point allow the user to specify an
|
// know they exist. We should at some point allow the user to specify an
|
||||||
|
@ -49,7 +48,9 @@ const (
|
||||||
Neutral
|
Neutral
|
||||||
)
|
)
|
||||||
|
|
||||||
type options struct{}
|
type options struct {
|
||||||
|
defaultDirection Direction
|
||||||
|
}
|
||||||
|
|
||||||
// An Option is an option for Bidi processing.
|
// An Option is an option for Bidi processing.
|
||||||
type Option func(*options)
|
type Option func(*options)
|
||||||
|
@ -66,12 +67,62 @@ type Option func(*options)
|
||||||
// DefaultDirection sets the default direction for a Paragraph. The direction is
|
// DefaultDirection sets the default direction for a Paragraph. The direction is
|
||||||
// overridden if the text contains directional characters.
|
// overridden if the text contains directional characters.
|
||||||
func DefaultDirection(d Direction) Option {
|
func DefaultDirection(d Direction) Option {
|
||||||
panic("unimplemented")
|
return func(opts *options) {
|
||||||
|
opts.defaultDirection = d
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// A Paragraph holds a single Paragraph for Bidi processing.
|
// A Paragraph holds a single Paragraph for Bidi processing.
|
||||||
type Paragraph struct {
|
type Paragraph struct {
|
||||||
// buffers
|
p []byte
|
||||||
|
o Ordering
|
||||||
|
opts []Option
|
||||||
|
types []Class
|
||||||
|
pairTypes []bracketType
|
||||||
|
pairValues []rune
|
||||||
|
runes []rune
|
||||||
|
options options
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize the p.pairTypes, p.pairValues and p.types from the input previously
|
||||||
|
// set by p.SetBytes() or p.SetString(). Also limit the input up to (and including) a paragraph
|
||||||
|
// separator (bidi class B).
|
||||||
|
//
|
||||||
|
// The function p.Order() needs these values to be set, so this preparation could be postponed.
|
||||||
|
// But since the SetBytes and SetStrings functions return the length of the input up to the paragraph
|
||||||
|
// separator, the whole input needs to be processed anyway and should not be done twice.
|
||||||
|
//
|
||||||
|
// The function has the same return values as SetBytes() / SetString()
|
||||||
|
func (p *Paragraph) prepareInput() (n int, err error) {
|
||||||
|
p.runes = bytes.Runes(p.p)
|
||||||
|
bytecount := 0
|
||||||
|
// clear slices from previous SetString or SetBytes
|
||||||
|
p.pairTypes = nil
|
||||||
|
p.pairValues = nil
|
||||||
|
p.types = nil
|
||||||
|
|
||||||
|
for _, r := range p.runes {
|
||||||
|
props, i := LookupRune(r)
|
||||||
|
bytecount += i
|
||||||
|
cls := props.Class()
|
||||||
|
if cls == B {
|
||||||
|
return bytecount, nil
|
||||||
|
}
|
||||||
|
p.types = append(p.types, cls)
|
||||||
|
if props.IsOpeningBracket() {
|
||||||
|
p.pairTypes = append(p.pairTypes, bpOpen)
|
||||||
|
p.pairValues = append(p.pairValues, r)
|
||||||
|
} else if props.IsBracket() {
|
||||||
|
// this must be a closing bracket,
|
||||||
|
// since IsOpeningBracket is not true
|
||||||
|
p.pairTypes = append(p.pairTypes, bpClose)
|
||||||
|
p.pairValues = append(p.pairValues, r)
|
||||||
|
} else {
|
||||||
|
p.pairTypes = append(p.pairTypes, bpNone)
|
||||||
|
p.pairValues = append(p.pairValues, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bytecount, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetBytes configures p for the given paragraph text. It replaces text
|
// SetBytes configures p for the given paragraph text. It replaces text
|
||||||
|
@ -80,70 +131,150 @@ type Paragraph struct {
|
||||||
// consumed from b including this separator. Error may be non-nil if options are
|
// consumed from b including this separator. Error may be non-nil if options are
|
||||||
// given.
|
// given.
|
||||||
func (p *Paragraph) SetBytes(b []byte, opts ...Option) (n int, err error) {
|
func (p *Paragraph) SetBytes(b []byte, opts ...Option) (n int, err error) {
|
||||||
panic("unimplemented")
|
p.p = b
|
||||||
|
p.opts = opts
|
||||||
|
return p.prepareInput()
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetString configures p for the given paragraph text. It replaces text
|
// SetString configures s for the given paragraph text. It replaces text
|
||||||
// previously set by SetBytes or SetString. If b contains a paragraph separator
|
// previously set by SetBytes or SetString. If s contains a paragraph separator
|
||||||
// it will only process the first paragraph and report the number of bytes
|
// it will only process the first paragraph and report the number of bytes
|
||||||
// consumed from b including this separator. Error may be non-nil if options are
|
// consumed from s including this separator. Error may be non-nil if options are
|
||||||
// given.
|
// given.
|
||||||
func (p *Paragraph) SetString(s string, opts ...Option) (n int, err error) {
|
func (p *Paragraph) SetString(s string, opts ...Option) (n int, err error) {
|
||||||
panic("unimplemented")
|
p.p = []byte(s)
|
||||||
|
p.opts = opts
|
||||||
|
return p.prepareInput()
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsLeftToRight reports whether the principle direction of rendering for this
|
// IsLeftToRight reports whether the principle direction of rendering for this
|
||||||
// paragraphs is left-to-right. If this returns false, the principle direction
|
// paragraphs is left-to-right. If this returns false, the principle direction
|
||||||
// of rendering is right-to-left.
|
// of rendering is right-to-left.
|
||||||
func (p *Paragraph) IsLeftToRight() bool {
|
func (p *Paragraph) IsLeftToRight() bool {
|
||||||
panic("unimplemented")
|
return p.Direction() == LeftToRight
|
||||||
}
|
}
|
||||||
|
|
||||||
// Direction returns the direction of the text of this paragraph.
|
// Direction returns the direction of the text of this paragraph.
|
||||||
//
|
//
|
||||||
// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral.
|
// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral.
|
||||||
func (p *Paragraph) Direction() Direction {
|
func (p *Paragraph) Direction() Direction {
|
||||||
panic("unimplemented")
|
return p.o.Direction()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: what happens if the position is > len(input)? This should return an error.
|
||||||
|
|
||||||
// RunAt reports the Run at the given position of the input text.
|
// RunAt reports the Run at the given position of the input text.
|
||||||
//
|
//
|
||||||
// This method can be used for computing line breaks on paragraphs.
|
// This method can be used for computing line breaks on paragraphs.
|
||||||
func (p *Paragraph) RunAt(pos int) Run {
|
func (p *Paragraph) RunAt(pos int) Run {
|
||||||
panic("unimplemented")
|
c := 0
|
||||||
|
runNumber := 0
|
||||||
|
for i, r := range p.o.runes {
|
||||||
|
c += len(r)
|
||||||
|
if pos < c {
|
||||||
|
runNumber = i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return p.o.Run(runNumber)
|
||||||
|
}
|
||||||
|
|
||||||
|
func calculateOrdering(levels []level, runes []rune) Ordering {
|
||||||
|
var curDir Direction
|
||||||
|
|
||||||
|
prevDir := Neutral
|
||||||
|
prevI := 0
|
||||||
|
|
||||||
|
o := Ordering{}
|
||||||
|
// lvl = 0,2,4,...: left to right
|
||||||
|
// lvl = 1,3,5,...: right to left
|
||||||
|
for i, lvl := range levels {
|
||||||
|
if lvl%2 == 0 {
|
||||||
|
curDir = LeftToRight
|
||||||
|
} else {
|
||||||
|
curDir = RightToLeft
|
||||||
|
}
|
||||||
|
if curDir != prevDir {
|
||||||
|
if i > 0 {
|
||||||
|
o.runes = append(o.runes, runes[prevI:i])
|
||||||
|
o.directions = append(o.directions, prevDir)
|
||||||
|
o.startpos = append(o.startpos, prevI)
|
||||||
|
}
|
||||||
|
prevI = i
|
||||||
|
prevDir = curDir
|
||||||
|
}
|
||||||
|
}
|
||||||
|
o.runes = append(o.runes, runes[prevI:])
|
||||||
|
o.directions = append(o.directions, prevDir)
|
||||||
|
o.startpos = append(o.startpos, prevI)
|
||||||
|
return o
|
||||||
}
|
}
|
||||||
|
|
||||||
// Order computes the visual ordering of all the runs in a Paragraph.
|
// Order computes the visual ordering of all the runs in a Paragraph.
|
||||||
func (p *Paragraph) Order() (Ordering, error) {
|
func (p *Paragraph) Order() (Ordering, error) {
|
||||||
panic("unimplemented")
|
if len(p.types) == 0 {
|
||||||
|
return Ordering{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, fn := range p.opts {
|
||||||
|
fn(&p.options)
|
||||||
|
}
|
||||||
|
lvl := level(-1)
|
||||||
|
if p.options.defaultDirection == RightToLeft {
|
||||||
|
lvl = 1
|
||||||
|
}
|
||||||
|
para, err := newParagraph(p.types, p.pairTypes, p.pairValues, lvl)
|
||||||
|
if err != nil {
|
||||||
|
return Ordering{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
levels := para.getLevels([]int{len(p.types)})
|
||||||
|
|
||||||
|
p.o = calculateOrdering(levels, p.runes)
|
||||||
|
return p.o, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Line computes the visual ordering of runs for a single line starting and
|
// Line computes the visual ordering of runs for a single line starting and
|
||||||
// ending at the given positions in the original text.
|
// ending at the given positions in the original text.
|
||||||
func (p *Paragraph) Line(start, end int) (Ordering, error) {
|
func (p *Paragraph) Line(start, end int) (Ordering, error) {
|
||||||
panic("unimplemented")
|
lineTypes := p.types[start:end]
|
||||||
|
para, err := newParagraph(lineTypes, p.pairTypes[start:end], p.pairValues[start:end], -1)
|
||||||
|
if err != nil {
|
||||||
|
return Ordering{}, err
|
||||||
|
}
|
||||||
|
levels := para.getLevels([]int{len(lineTypes)})
|
||||||
|
o := calculateOrdering(levels, p.runes[start:end])
|
||||||
|
return o, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// An Ordering holds the computed visual order of runs of a Paragraph. Calling
|
// An Ordering holds the computed visual order of runs of a Paragraph. Calling
|
||||||
// SetBytes or SetString on the originating Paragraph invalidates an Ordering.
|
// SetBytes or SetString on the originating Paragraph invalidates an Ordering.
|
||||||
// The methods of an Ordering should only be called by one goroutine at a time.
|
// The methods of an Ordering should only be called by one goroutine at a time.
|
||||||
type Ordering struct{}
|
type Ordering struct {
|
||||||
|
runes [][]rune
|
||||||
|
directions []Direction
|
||||||
|
startpos []int
|
||||||
|
}
|
||||||
|
|
||||||
// Direction reports the directionality of the runs.
|
// Direction reports the directionality of the runs.
|
||||||
//
|
//
|
||||||
// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral.
|
// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral.
|
||||||
func (o *Ordering) Direction() Direction {
|
func (o *Ordering) Direction() Direction {
|
||||||
panic("unimplemented")
|
return o.directions[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
// NumRuns returns the number of runs.
|
// NumRuns returns the number of runs.
|
||||||
func (o *Ordering) NumRuns() int {
|
func (o *Ordering) NumRuns() int {
|
||||||
panic("unimplemented")
|
return len(o.runes)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run returns the ith run within the ordering.
|
// Run returns the ith run within the ordering.
|
||||||
func (o *Ordering) Run(i int) Run {
|
func (o *Ordering) Run(i int) Run {
|
||||||
panic("unimplemented")
|
r := Run{
|
||||||
|
runes: o.runes[i],
|
||||||
|
direction: o.directions[i],
|
||||||
|
startpos: o.startpos[i],
|
||||||
|
}
|
||||||
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: perhaps with options.
|
// TODO: perhaps with options.
|
||||||
|
@ -155,16 +286,19 @@ func (o *Ordering) Run(i int) Run {
|
||||||
|
|
||||||
// A Run is a continuous sequence of characters of a single direction.
|
// A Run is a continuous sequence of characters of a single direction.
|
||||||
type Run struct {
|
type Run struct {
|
||||||
|
runes []rune
|
||||||
|
direction Direction
|
||||||
|
startpos int
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns the text of the run in its original order.
|
// String returns the text of the run in its original order.
|
||||||
func (r *Run) String() string {
|
func (r *Run) String() string {
|
||||||
panic("unimplemented")
|
return string(r.runes)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bytes returns the text of the run in its original order.
|
// Bytes returns the text of the run in its original order.
|
||||||
func (r *Run) Bytes() []byte {
|
func (r *Run) Bytes() []byte {
|
||||||
panic("unimplemented")
|
return []byte(r.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: methods for
|
// TODO: methods for
|
||||||
|
@ -174,25 +308,52 @@ func (r *Run) Bytes() []byte {
|
||||||
|
|
||||||
// Direction reports the direction of the run.
|
// Direction reports the direction of the run.
|
||||||
func (r *Run) Direction() Direction {
|
func (r *Run) Direction() Direction {
|
||||||
panic("unimplemented")
|
return r.direction
|
||||||
}
|
}
|
||||||
|
|
||||||
// Position of the Run within the text passed to SetBytes or SetString of the
|
// Pos returns the position of the Run within the text passed to SetBytes or SetString of the
|
||||||
// originating Paragraph value.
|
// originating Paragraph value.
|
||||||
func (r *Run) Pos() (start, end int) {
|
func (r *Run) Pos() (start, end int) {
|
||||||
panic("unimplemented")
|
return r.startpos, r.startpos + len(r.runes) - 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// AppendReverse reverses the order of characters of in, appends them to out,
|
// AppendReverse reverses the order of characters of in, appends them to out,
|
||||||
// and returns the result. Modifiers will still follow the runes they modify.
|
// and returns the result. Modifiers will still follow the runes they modify.
|
||||||
// Brackets are replaced with their counterparts.
|
// Brackets are replaced with their counterparts.
|
||||||
func AppendReverse(out, in []byte) []byte {
|
func AppendReverse(out, in []byte) []byte {
|
||||||
panic("unimplemented")
|
ret := make([]byte, len(in)+len(out))
|
||||||
|
copy(ret, out)
|
||||||
|
inRunes := bytes.Runes(in)
|
||||||
|
|
||||||
|
for i, r := range inRunes {
|
||||||
|
prop, _ := LookupRune(r)
|
||||||
|
if prop.IsBracket() {
|
||||||
|
inRunes[i] = prop.reverseBracket(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, j := 0, len(inRunes)-1; i < j; i, j = i+1, j-1 {
|
||||||
|
inRunes[i], inRunes[j] = inRunes[j], inRunes[i]
|
||||||
|
}
|
||||||
|
copy(ret[len(out):], string(inRunes))
|
||||||
|
|
||||||
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReverseString reverses the order of characters in s and returns a new string.
|
// ReverseString reverses the order of characters in s and returns a new string.
|
||||||
// Modifiers will still follow the runes they modify. Brackets are replaced with
|
// Modifiers will still follow the runes they modify. Brackets are replaced with
|
||||||
// their counterparts.
|
// their counterparts.
|
||||||
func ReverseString(s string) string {
|
func ReverseString(s string) string {
|
||||||
panic("unimplemented")
|
input := []rune(s)
|
||||||
|
li := len(input)
|
||||||
|
ret := make([]rune, li)
|
||||||
|
for i, r := range input {
|
||||||
|
prop, _ := LookupRune(r)
|
||||||
|
if prop.IsBracket() {
|
||||||
|
ret[li-i-1] = prop.reverseBracket(r)
|
||||||
|
} else {
|
||||||
|
ret[li-i-1] = r
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return string(ret)
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
package bidi
|
package bidi
|
||||||
|
|
||||||
import "log"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
// This implementation is a port based on the reference implementation found at:
|
// This implementation is a port based on the reference implementation found at:
|
||||||
// https://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/
|
// https://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/
|
||||||
|
@ -97,13 +100,20 @@ type paragraph struct {
|
||||||
// rune (suggested is the rune of the open bracket for opening and matching
|
// rune (suggested is the rune of the open bracket for opening and matching
|
||||||
// close brackets, after normalization). The embedding levels are optional, but
|
// close brackets, after normalization). The embedding levels are optional, but
|
||||||
// may be supplied to encode embedding levels of styled text.
|
// may be supplied to encode embedding levels of styled text.
|
||||||
//
|
func newParagraph(types []Class, pairTypes []bracketType, pairValues []rune, levels level) (*paragraph, error) {
|
||||||
// TODO: return an error.
|
var err error
|
||||||
func newParagraph(types []Class, pairTypes []bracketType, pairValues []rune, levels level) *paragraph {
|
if err = validateTypes(types); err != nil {
|
||||||
validateTypes(types)
|
return nil, err
|
||||||
validatePbTypes(pairTypes)
|
}
|
||||||
validatePbValues(pairValues, pairTypes)
|
if err = validatePbTypes(pairTypes); err != nil {
|
||||||
validateParagraphEmbeddingLevel(levels)
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = validatePbValues(pairValues, pairTypes); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = validateParagraphEmbeddingLevel(levels); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
p := ¶graph{
|
p := ¶graph{
|
||||||
initialTypes: append([]Class(nil), types...),
|
initialTypes: append([]Class(nil), types...),
|
||||||
|
@ -115,7 +125,7 @@ func newParagraph(types []Class, pairTypes []bracketType, pairValues []rune, lev
|
||||||
resultTypes: append([]Class(nil), types...),
|
resultTypes: append([]Class(nil), types...),
|
||||||
}
|
}
|
||||||
p.run()
|
p.run()
|
||||||
return p
|
return p, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *paragraph) Len() int { return len(p.initialTypes) }
|
func (p *paragraph) Len() int { return len(p.initialTypes) }
|
||||||
|
@ -1001,58 +1011,61 @@ func typeForLevel(level level) Class {
|
||||||
return R
|
return R
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: change validation to not panic
|
func validateTypes(types []Class) error {
|
||||||
|
|
||||||
func validateTypes(types []Class) {
|
|
||||||
if len(types) == 0 {
|
if len(types) == 0 {
|
||||||
log.Panic("types is null")
|
return fmt.Errorf("types is null")
|
||||||
}
|
}
|
||||||
for i, t := range types[:len(types)-1] {
|
for i, t := range types[:len(types)-1] {
|
||||||
if t == B {
|
if t == B {
|
||||||
log.Panicf("B type before end of paragraph at index: %d", i)
|
return fmt.Errorf("B type before end of paragraph at index: %d", i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateParagraphEmbeddingLevel(embeddingLevel level) {
|
func validateParagraphEmbeddingLevel(embeddingLevel level) error {
|
||||||
if embeddingLevel != implicitLevel &&
|
if embeddingLevel != implicitLevel &&
|
||||||
embeddingLevel != 0 &&
|
embeddingLevel != 0 &&
|
||||||
embeddingLevel != 1 {
|
embeddingLevel != 1 {
|
||||||
log.Panicf("illegal paragraph embedding level: %d", embeddingLevel)
|
return fmt.Errorf("illegal paragraph embedding level: %d", embeddingLevel)
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateLineBreaks(linebreaks []int, textLength int) {
|
func validateLineBreaks(linebreaks []int, textLength int) error {
|
||||||
prev := 0
|
prev := 0
|
||||||
for i, next := range linebreaks {
|
for i, next := range linebreaks {
|
||||||
if next <= prev {
|
if next <= prev {
|
||||||
log.Panicf("bad linebreak: %d at index: %d", next, i)
|
return fmt.Errorf("bad linebreak: %d at index: %d", next, i)
|
||||||
}
|
}
|
||||||
prev = next
|
prev = next
|
||||||
}
|
}
|
||||||
if prev != textLength {
|
if prev != textLength {
|
||||||
log.Panicf("last linebreak was %d, want %d", prev, textLength)
|
return fmt.Errorf("last linebreak was %d, want %d", prev, textLength)
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func validatePbTypes(pairTypes []bracketType) {
|
func validatePbTypes(pairTypes []bracketType) error {
|
||||||
if len(pairTypes) == 0 {
|
if len(pairTypes) == 0 {
|
||||||
log.Panic("pairTypes is null")
|
return fmt.Errorf("pairTypes is null")
|
||||||
}
|
}
|
||||||
for i, pt := range pairTypes {
|
for i, pt := range pairTypes {
|
||||||
switch pt {
|
switch pt {
|
||||||
case bpNone, bpOpen, bpClose:
|
case bpNone, bpOpen, bpClose:
|
||||||
default:
|
default:
|
||||||
log.Panicf("illegal pairType value at %d: %v", i, pairTypes[i])
|
return fmt.Errorf("illegal pairType value at %d: %v", i, pairTypes[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func validatePbValues(pairValues []rune, pairTypes []bracketType) {
|
func validatePbValues(pairValues []rune, pairTypes []bracketType) error {
|
||||||
if pairValues == nil {
|
if pairValues == nil {
|
||||||
log.Panic("pairValues is null")
|
return fmt.Errorf("pairValues is null")
|
||||||
}
|
}
|
||||||
if len(pairTypes) != len(pairValues) {
|
if len(pairTypes) != len(pairValues) {
|
||||||
log.Panic("pairTypes is different length from pairValues")
|
return fmt.Errorf("pairTypes is different length from pairValues")
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build go1.10 && !go1.13
|
||||||
// +build go1.10,!go1.13
|
// +build go1.10,!go1.13
|
||||||
|
|
||||||
package bidi
|
package bidi
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build go1.13 && !go1.14
|
||||||
// +build go1.13,!go1.14
|
// +build go1.13,!go1.14
|
||||||
|
|
||||||
package bidi
|
package bidi
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build go1.14 && !go1.16
|
||||||
// +build go1.14,!go1.16
|
// +build go1.14,!go1.16
|
||||||
|
|
||||||
package bidi
|
package bidi
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build go1.16
|
||||||
// +build go1.16
|
// +build go1.16
|
||||||
|
|
||||||
package bidi
|
package bidi
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build !go1.10
|
||||||
// +build !go1.10
|
// +build !go1.10
|
||||||
|
|
||||||
package bidi
|
package bidi
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build go1.10 && !go1.13
|
||||||
// +build go1.10,!go1.13
|
// +build go1.10,!go1.13
|
||||||
|
|
||||||
package norm
|
package norm
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build go1.13 && !go1.14
|
||||||
// +build go1.13,!go1.14
|
// +build go1.13,!go1.14
|
||||||
|
|
||||||
package norm
|
package norm
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build go1.14 && !go1.16
|
||||||
// +build go1.14,!go1.16
|
// +build go1.14,!go1.16
|
||||||
|
|
||||||
package norm
|
package norm
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build go1.16
|
||||||
// +build go1.16
|
// +build go1.16
|
||||||
|
|
||||||
package norm
|
package norm
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build !go1.10
|
||||||
// +build !go1.10
|
// +build !go1.10
|
||||||
|
|
||||||
package norm
|
package norm
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build go1.10 && !go1.13
|
||||||
// +build go1.10,!go1.13
|
// +build go1.10,!go1.13
|
||||||
|
|
||||||
package width
|
package width
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build go1.13 && !go1.14
|
||||||
// +build go1.13,!go1.14
|
// +build go1.13,!go1.14
|
||||||
|
|
||||||
package width
|
package width
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build go1.14 && !go1.16
|
||||||
// +build go1.14,!go1.16
|
// +build go1.14,!go1.16
|
||||||
|
|
||||||
package width
|
package width
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build go1.16
|
||||||
// +build go1.16
|
// +build go1.16
|
||||||
|
|
||||||
package width
|
package width
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build !go1.10
|
||||||
// +build !go1.10
|
// +build !go1.10
|
||||||
|
|
||||||
package width
|
package width
|
||||||
|
|
|
@ -251,7 +251,7 @@ golang.org/x/sys/windows
|
||||||
# golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
|
# golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
|
||||||
## explicit
|
## explicit
|
||||||
golang.org/x/term
|
golang.org/x/term
|
||||||
# golang.org/x/text v0.3.4
|
# golang.org/x/text v0.3.7
|
||||||
## explicit
|
## explicit
|
||||||
golang.org/x/text/secure/bidirule
|
golang.org/x/text/secure/bidirule
|
||||||
golang.org/x/text/transform
|
golang.org/x/text/transform
|
||||||
|
|
Loading…
Reference in New Issue