func ForFactory(p *core.Parser, config *core.Configuration) (core.Tag, error) { name := p.ReadName() if len(name) == 0 { return nil, p.Error("Invalid variable name in for tag") } if p.SkipSpaces() != 'i' || p.Left() < 3 || p.Data[p.Position+1] != 'n' || !core.IsTokenEnd(p.Data[p.Position+2]) { return nil, p.Error("Expecting keyword 'in' after variable name in for tag") } p.ForwardBy(2) value, err := p.ReadValue() if err != nil { return nil, err } f := &For{ Common: NewCommon(), name: name, keyName: name + "[0]", valueName: name + "[1]", value: value, } for { name := p.ReadName() if name == "" { break } if name == "limit" { if p.SkipUntil(':') != ':' { return nil, p.Error("Expecting ':' after limit in for tag") } p.Forward() limit, err := p.ReadValue() if err != nil { return nil, err } f.limit = limit } else if name == "offset" { if p.SkipUntil(':') != ':' { return nil, p.Error("Expecting ':' after offset in for tag") } p.Forward() offset, err := p.ReadValue() if err != nil { return nil, err } f.offset = offset } else if name == "reverse" { f.reverse = true } else { return nil, p.Error(fmt.Sprint("%q is an inknown modifier in for tag", name)) } } p.SkipPastTag() return f, nil }