Documentation
¶
Index ¶
Constants ¶
View Source
const Version = "0.2.0"
Variables ¶
View Source
var Defaults = map[string]any{ "lex": map[string]any{ "order": 4500000, }, }
Defaults contains the default Hoover plugin options, matching TS Hoover.defaults. These are deep-merged with user-provided options by tabnas.UseDefaults().
View Source
var Hoover tabnas.Plugin = func(j *tabnas.Tabnas, opts map[string]any) (err error) { defer func() { if r := recover(); r != nil { err = fmt.Errorf("hoover: %v", r) } }() if val, ok := j.RSM()["val"]; !ok || val == nil || len(val.OpenAlts()) == 0 { return fmt.Errorf( "hoover: the 'val' rule is missing; register a grammar that defines it before the hoover plugin") } blockDefs, _ := opts["block"].([]*Block) action, _ := opts["action"].(tabnas.AltAction) blocks := buildBlocks(blockDefs) tokenMap := map[string]tabnas.Tin{} for _, block := range blocks { tin := j.Token(block.Token) block.tin = tin if _, exists := tokenMap[block.Token]; !exists { localTin := tin j.Rule("val", func(rs *tabnas.RuleSpec, _ *tabnas.Parser) { rs.PrependOpen(&tabnas.AltSpec{ S: [][]tabnas.Tin{{localTin}}, A: action, }) }) } tokenMap[block.Token] = tin } makeHooverMatcher := func(cfg *tabnas.LexConfig, _opts *tabnas.Options) tabnas.LexMatcher { var hooverMatcher tabnas.LexMatcher hooverMatcher = func(lex *tabnas.Lex, rule *tabnas.Rule) (tkn *tabnas.Token) { defer func() { if r := recover(); r != nil { tkn = lex.Bad("invalid_text") } }() for _, block := range blocks { pnt := lex.Cursor() hvpnt := &tabnas.Point{ Len: pnt.Len, SI: pnt.SI, RI: pnt.RI, CI: pnt.CI, } sr := matchStart(lex, hvpnt, block) if sr.match { result := parseToEnd(lex, hvpnt, block, cfg) if result.done { src := lex.Src[pnt.SI:hvpnt.SI] out := lex.Token(block.Token, block.tin, result.val, src) pnt.SI = hvpnt.SI pnt.RI = hvpnt.RI pnt.CI = hvpnt.CI return out } if result.err != "" { return lex.Bad(result.err) } return lex.Bad("invalid_text") } } return nil } return hooverMatcher } j.SetOptions(tabnas.Options{ Lex: &tabnas.LexOptions{ Match: map[string]*tabnas.MatchSpec{ "hoover": { Order: lexOrder(opts), Make: makeHooverMatcher, }, }, }, }) return nil }
Hoover is the plugin function, matching the TS Hoover plugin. Use with tabnas.UseDefaults to apply Defaults automatically:
j.UseDefaults(tabnashoover.Hoover, tabnashoover.Defaults, map[string]any{
"block": []*tabnashoover.Block{ ... },
})
Functions ¶
This section is empty.
Types ¶
type Block ¶
type Block struct {
Name string
Start StartSpec
End EndSpec
Token string // Token name, default "#HV"
EscapeChar string
Escape map[string]string
AllowUnknownEscape *bool // default true
PreserveEscapeChar bool
Trim bool
// contains filtered or unexported fields
}
Block defines a hoover block configuration.
type EndSpec ¶
type EndSpec struct {
Fixed []string // End delimiter(s)
Consume any // bool or []string; nil = true
}
EndSpec defines how a block ends.
type HooverRuleFilter ¶
HooverRuleFilter defines include/exclude lists for rule matching.
type HooverRuleSpec ¶
type HooverRuleSpec struct {
Parent *HooverRuleFilter
Current *HooverRuleFilter
State string // "o"/"c"/"oc" = check; "" (unset) defaults to "o" (no "don't check", unlike TS)
}
HooverRuleSpec defines rule context conditions for matching.
type StartSpec ¶
type StartSpec struct {
Fixed []string // Start delimiter(s)
Consume any // bool, *bool or []string; nil = true. A []string consumes only the listed delimiters.
Rule *HooverRuleSpec // Rule context matching
}
StartSpec defines how a block starts.
Click to show internal directories.
Click to hide internal directories.