summaryrefslogtreecommitdiff
path: root/vendor/github.com/rivo/uniseg/line.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/rivo/uniseg/line.go')
-rw-r--r--vendor/github.com/rivo/uniseg/line.go134
1 files changed, 0 insertions, 134 deletions
diff --git a/vendor/github.com/rivo/uniseg/line.go b/vendor/github.com/rivo/uniseg/line.go
deleted file mode 100644
index 7a46318d9..000000000
--- a/vendor/github.com/rivo/uniseg/line.go
+++ /dev/null
@@ -1,134 +0,0 @@
-package uniseg
-
-import "unicode/utf8"
-
-// FirstLineSegment returns the prefix of the given byte slice after which a
-// decision to break the string over to the next line can or must be made,
-// according to the rules of [Unicode Standard Annex #14]. This is used to
-// implement line breaking.
-//
-// Line breaking, also known as word wrapping, is the process of breaking a
-// section of text into lines such that it will fit in the available width of a
-// page, window or other display area.
-//
-// The returned "segment" may not be broken into smaller parts, unless no other
-// breaking opportunities present themselves, in which case you may break by
-// grapheme clusters (using the [FirstGraphemeCluster] function to determine the
-// grapheme clusters).
-//
-// The "mustBreak" flag indicates whether you MUST break the line after the
-// given segment (true), for example after newline characters, or you MAY break
-// the line after the given segment (false).
-//
-// This function can be called continuously to extract all non-breaking sub-sets
-// from a byte slice, as illustrated in the example below.
-//
-// If you don't know the current state, for example when calling the function
-// for the first time, you must pass -1. For consecutive calls, pass the state
-// and rest slice returned by the previous call.
-//
-// The "rest" slice is the sub-slice of the original byte slice "b" starting
-// after the last byte of the identified line segment. If the length of the
-// "rest" slice is 0, the entire byte slice "b" has been processed. The
-// "segment" byte slice is the sub-slice of the input slice containing the
-// identified line segment.
-//
-// Given an empty byte slice "b", the function returns nil values.
-//
-// Note that in accordance with [UAX #14 LB3], the final segment will end with
-// "mustBreak" set to true. You can choose to ignore this by checking if the
-// length of the "rest" slice is 0 and calling [HasTrailingLineBreak] or
-// [HasTrailingLineBreakInString] on the last rune.
-//
-// Note also that this algorithm may break within grapheme clusters. This is
-// addressed in Section 8.2 Example 6 of UAX #14. To avoid this, you can use
-// the [Step] function instead.
-//
-// [Unicode Standard Annex #14]: https://www.unicode.org/reports/tr14/
-// [UAX #14 LB3]: https://www.unicode.org/reports/tr14/#Algorithm
-func FirstLineSegment(b []byte, state int) (segment, rest []byte, mustBreak bool, newState int) {
- // An empty byte slice returns nothing.
- if len(b) == 0 {
- return
- }
-
- // Extract the first rune.
- r, length := utf8.DecodeRune(b)
- if len(b) <= length { // If we're already past the end, there is nothing else to parse.
- return b, nil, true, lbAny // LB3.
- }
-
- // If we don't know the state, determine it now.
- if state < 0 {
- state, _ = transitionLineBreakState(state, r, b[length:], "")
- }
-
- // Transition until we find a boundary.
- var boundary int
- for {
- r, l := utf8.DecodeRune(b[length:])
- state, boundary = transitionLineBreakState(state, r, b[length+l:], "")
-
- if boundary != LineDontBreak {
- return b[:length], b[length:], boundary == LineMustBreak, state
- }
-
- length += l
- if len(b) <= length {
- return b, nil, true, lbAny // LB3
- }
- }
-}
-
-// FirstLineSegmentInString is like [FirstLineSegment] but its input and outputs
-// are strings.
-func FirstLineSegmentInString(str string, state int) (segment, rest string, mustBreak bool, newState int) {
- // An empty byte slice returns nothing.
- if len(str) == 0 {
- return
- }
-
- // Extract the first rune.
- r, length := utf8.DecodeRuneInString(str)
- if len(str) <= length { // If we're already past the end, there is nothing else to parse.
- return str, "", true, lbAny // LB3.
- }
-
- // If we don't know the state, determine it now.
- if state < 0 {
- state, _ = transitionLineBreakState(state, r, nil, str[length:])
- }
-
- // Transition until we find a boundary.
- var boundary int
- for {
- r, l := utf8.DecodeRuneInString(str[length:])
- state, boundary = transitionLineBreakState(state, r, nil, str[length+l:])
-
- if boundary != LineDontBreak {
- return str[:length], str[length:], boundary == LineMustBreak, state
- }
-
- length += l
- if len(str) <= length {
- return str, "", true, lbAny // LB3.
- }
- }
-}
-
-// HasTrailingLineBreak returns true if the last rune in the given byte slice is
-// one of the hard line break code points defined in LB4 and LB5 of [UAX #14].
-//
-// [UAX #14]: https://www.unicode.org/reports/tr14/#Algorithm
-func HasTrailingLineBreak(b []byte) bool {
- r, _ := utf8.DecodeLastRune(b)
- property, _ := propertyLineBreak(r)
- return property == prBK || property == prCR || property == prLF || property == prNL
-}
-
-// HasTrailingLineBreakInString is like [HasTrailingLineBreak] but for a string.
-func HasTrailingLineBreakInString(str string) bool {
- r, _ := utf8.DecodeLastRuneInString(str)
- property, _ := propertyLineBreak(r)
- return property == prBK || property == prCR || property == prLF || property == prNL
-}