https://github.com/t34-dev/go-text-replacer
Package for nested text (byte/rune) replacement in a single pass with Unicode support
https://github.com/t34-dev/go-text-replacer
go golang replacer runes string-manipulation text-replacer text-substitution unicode
Last synced: 17 days ago
JSON representation
Package for nested text (byte/rune) replacement in a single pass with Unicode support
- Host: GitHub
- URL: https://github.com/t34-dev/go-text-replacer
- Owner: t34-dev
- License: isc
- Created: 2024-07-19T20:56:55.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2024-09-02T18:15:54.000Z (8 months ago)
- Last Synced: 2025-03-20T03:05:09.877Z (about 1 month ago)
- Topics: go, golang, replacer, runes, string-manipulation, text-replacer, text-substitution, unicode
- Language: Go
- Homepage:
- Size: 24.4 KB
- Stars: 3
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](http://copyfree.org)
[](https://coveralls.io/github/t34-dev/go-text-replacer?branch=main&ver=1723898449)


# Go-Text-Replacer
Go-Text-Replacer is a Go package that provides functionality for performing nested replacements in text content. It allows you to replace multiple sections of text while maintaining the original structure and handling overlapping replacements.
## Features
- Replace multiple sections of text in a single operation
- Handle overlapping replacements
- Support for both byte slices and strings
- Find all occurrences of a given text
- Find first or last occurrence of a given text
- Convert between rune and byte positions
- Create replacement blocks from strings or byte slices## Installation
To install Go-Text-Replacer, use `go get`:
```
go get github.com/t34-dev/go-text-replacer
```## Usage
Here's a simple example of how to use Go-Text-Replacer with strings:
```go
package mainimport (
"fmt"
textreplacer "github.com/t34-dev/go-text-replacer"
"log"
)func main() {
content := `
Chapter 1: Introduction to Programming (编程简介)1.1 What is Programming (什么是编程)
Programming is the art of creating instructions for computers.
It includes many aspects such as:
- Algorithmic thinking (算法思维)
- Block structures
- Programming language syntax
`replacer := textreplacer.NewFromString(content)
blocks := []textreplacer.Block{
replacer.CreateBlockFromString("Introduction", "Getting Started with"),
replacer.CreateBlockFromString("Programming", "Coding"),
replacer.CreateBlockFromString("(算法思维)", "(Algorithmic Thinking)"),
}result, err := replacer.Enter(blocks)
if err != nil {
log.Fatalln(err)
}// output:
//Chapter 1: Getting Started with to Coding (编程简介)
//
//1.1 What is Programming (什么是编程)
//Programming is the art of creating instructions for computers.
// It includes many aspects such as:
//- Algorithmic thinking (Algorithmic Thinking)
//- Block structures
//- Programming language syntax
fmt.Println(string(result))
}```
And here's an example using byte slices:
```go
package mainimport (
"fmt"
textreplacer "github.com/t34-dev/go-text-replacer"
"log"
)var content = `
Chapter 1: Introduction to Programming (编程简介)1.1 What is Programming (什么是编程)
Programming is the art of creating instructions for computers.
It includes many aspects such as:
- Algorithmic thinking (算法思维)
- Block structures
- Programming language syntax
`func main() {
// analyze the file
replacer := textreplacer.New([]byte(content))// if we want to find the byte range for the searched word
position := replacer.FindFirstPosition([]byte("Introduction"), 0)
// output: 'Introduction' found at positions 12 to 24
if position != nil {
fmt.Printf("'Introduction' found at positions %d to %d\n", position.Start, position.End)
} else {
log.Fatalln("'Introduction' not found")
}blocks := []textreplacer.Block{
// if we know exactly the byte numbers to replace
// output: 'Introduction' found at positions 12 to 24
{
Start: 12,
End: 24,
Txt: []byte("What_stuck a bit"),
},
// if we don't know the byte numbers
replacer.CreateBlock([]byte("to"), []byte("is your")),
replacer.CreateBlockFromString("Programming", "[用户名]"),
replacer.CreateBlockFromString("(算法思维)", "\n - 另一个要点"),
}
// perform replacement
result, err := replacer.Enter(blocks)if err != nil {
log.Fatalln(err)
}replacer = textreplacer.New(result)
result, err = replacer.Enter([]textreplacer.Block{
replacer.CreateBlock([]byte("Block"), []byte("END")),
})if err != nil {
log.Fatalln(err)
}// output:
// 1.1 What is Programming (什么是编程)
// Programming is the art of creating instructions for computers.
// It includes many aspects such as:
// - Algorithmic thinking
// - 另一个要点
// - END structures
// - Programming language syntax
fmt.Println(string(result))
}
```## API Reference
### Types
- `Block`: Represents a replacement block with Start, End, and Txt fields.
- `Position`: Represents the position of found text with Start and End fields.### Functions
- `New(content []byte) *textreplacer`: Creates a new instance of textreplacer with the given content.
- `NewFromString(content string) *textreplacer`: Creates a new instance of textreplacer from a string.### Methods
- `Enter(blocks []Block) ([]byte, error)`: Applies replacement blocks to the original content.
- `FindAllPositions(text []byte) []Position`: Finds all positions of the given text in the content.
- `FindFirstPosition(text []byte, startIndex int) *Position`: Finds the first position of the given text in the content, starting from the specified index.
- `FindLastPosition(text []byte, startIndex int) *Position`: Finds the last position of the given text in the content, starting from the specified index from the end.
- `CreateBlock(find, txt []byte) Block`: Creates a block using the given find and replacement text.
- `RuneToBytePosition(runeStart, runeEnd int) (byteStart, byteEnd int)`: Converts a position in runes to a position in bytes.
- `ByteToRunePosition(byteStart, byteEnd int) (runeStart, runeEnd int)`: Converts a position in bytes to a position in runes.
- `CreateBlockFromString(findRunes, txtRunes string) Block`: Creates a block using rune positions.## License
This project is licensed under the ISC License. See the [LICENSE](LICENSE) file for details.
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
---
Developed with ❤️ by [T34](https://github.com/t34-dev)