Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Stringwrap is a Go package for wrapping strings by visual width with optional word splitting and full ANSI + grapheme cluster support.

License

Notifications You must be signed in to change notification settings

galactixx/stringwrap

Repository files navigation

stringwrap logo

Stringwrap is a Go package for wrapping strings by visual width with optional word splitting and full ANSI + grapheme cluster support.

✨ Features

General Wrapping

  • Ignores ANSI escape codes for width calculations while preserving them in the output.
  • Correctly processes Unicode grapheme clusters.
  • Supports configurable tab sizes.
  • Respects hard breaks (\n) in the input string.
  • Provides optional word splitting for finer-grained control.
  • Handles non-breaking spaces (\u00A0) to prevent unwanted line breaks.

Wrapped-Line Metadata

  • Byte and rune offsets within the original string.
  • The visual width of the wrapped line.
  • The index of the segment from the original line that this wrapped line belongs to.
  • An indication of whether the line ended due to a hard break or soft wrapping.
  • A flag indicating if the segment ends with a word that was split during wrapping.

Both StringWrap and StringWrapSplit use Unicode grapheme cluster parsing (via the uniseg library) along with rune iteration.

πŸš€ Getting Started

go get github.com/galactixx/stringwrap@latest

πŸ“š Usage

Regular String Wrapping

import "github.com/galactixx/stringwrap"
wrapped, meta, err := stringwrap.StringWrap("Hello world! 🌟", 10, 4)
fmt.Println(wrapped)

Output:

Hello 
world! 🌟

String Wrapping with Word Splitting

wrapped, meta, err := stringwrap.StringWrapSplit("Supercalifragilisticexpialidocious", 10, 4)
fmt.Println(wrapped)

Output:

Supercali-
fragilist-
icexpiali-
docious

Accessing the Metadata

for _, line := range meta.WrappedLines {
	fmt.Printf(
 "Line %d: width=%d, byteOffset=%v\n",
		line.CurLineNum,
 line.Width,
 line.OrigByteOffset
 )
}

πŸ” API

func StringWrap(str string, limit int, tabSize int) (string, *WrappedStringSeq, error)

Wraps a string at a visual width limit. Words are not split.

func StringWrapSplit(str string, limit int, tabSize int) (string, *WrappedStringSeq, error)

Same as StringWrap, but allows splitting words across lines if needed.

type WrappedString struct

Metadata for one wrapped segment.

type WrappedString struct {
	CurLineNum int
	OrigLineNum int
	OrigByteOffset LineOffset
	OrigRuneOffset LineOffset
	SegmentInOrig int
	NotWithinLimit bool
	IsHardBreak bool
	Width int
	EndsWithSplitWord bool
}

type WrappedStringSeq struct

Contains all wrapped lines and wrap configuration.

type WrappedStringSeq struct {
	WrappedLines []WrappedString
	WordSplitAllowed bool
	TabSize int
	Limit int
}

🀝 License

This project is licensed under the MIT License. See the LICENSE file for more details.


πŸ“ž Contact

If you have any questions or need support, feel free to reach out by opening an issue on the GitHub repository.

About

Stringwrap is a Go package for wrapping strings by visual width with optional word splitting and full ANSI + grapheme cluster support.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

Languages

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /