Stanislav N. aka pztrn
48d43ca097
Pagination now works. Temporary hardcoded 10 pastes per page, will be put in configuration later. Maybe. From now user will receive readable error message if error occured. Started to work on syntax highlighting, tried to make lexers detection work but apparently to no avail.
88 lines
1.6 KiB
Go
88 lines
1.6 KiB
Go
package syntax
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
)
|
|
|
|
type ReplacerData struct {
|
|
Rep string
|
|
Strings []string
|
|
Rules []int
|
|
}
|
|
|
|
const (
|
|
replaceSpecials = 4
|
|
replaceLeftPortion = -1
|
|
replaceRightPortion = -2
|
|
replaceLastGroup = -3
|
|
replaceWholeString = -4
|
|
)
|
|
|
|
//ErrReplacementError is a general error during parsing the replacement text
|
|
var ErrReplacementError = errors.New("Replacement pattern error.")
|
|
|
|
// NewReplacerData will populate a reusable replacer data struct based on the given replacement string
|
|
// and the capture group data from a regexp
|
|
func NewReplacerData(rep string, caps map[int]int, capsize int, capnames map[string]int, op RegexOptions) (*ReplacerData, error) {
|
|
p := parser{
|
|
options: op,
|
|
caps: caps,
|
|
capsize: capsize,
|
|
capnames: capnames,
|
|
}
|
|
p.setPattern(rep)
|
|
concat, err := p.scanReplacement()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if concat.t != ntConcatenate {
|
|
panic(ErrReplacementError)
|
|
}
|
|
|
|
sb := &bytes.Buffer{}
|
|
var (
|
|
strings []string
|
|
rules []int
|
|
)
|
|
|
|
for _, child := range concat.children {
|
|
switch child.t {
|
|
case ntMulti:
|
|
child.writeStrToBuf(sb)
|
|
|
|
case ntOne:
|
|
sb.WriteRune(child.ch)
|
|
|
|
case ntRef:
|
|
if sb.Len() > 0 {
|
|
rules = append(rules, len(strings))
|
|
strings = append(strings, sb.String())
|
|
sb.Reset()
|
|
}
|
|
slot := child.m
|
|
|
|
if len(caps) > 0 && slot >= 0 {
|
|
slot = caps[slot]
|
|
}
|
|
|
|
rules = append(rules, -replaceSpecials-1-slot)
|
|
|
|
default:
|
|
panic(ErrReplacementError)
|
|
}
|
|
}
|
|
|
|
if sb.Len() > 0 {
|
|
rules = append(rules, len(strings))
|
|
strings = append(strings, sb.String())
|
|
}
|
|
|
|
return &ReplacerData{
|
|
Rep: rep,
|
|
Strings: strings,
|
|
Rules: rules,
|
|
}, nil
|
|
}
|