diff options
Diffstat (limited to 'parser/pageparser/pageparser.go')
-rw-r--r-- | parser/pageparser/pageparser.go | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/parser/pageparser/pageparser.go b/parser/pageparser/pageparser.go index 14b341ee9..db563d44c 100644 --- a/parser/pageparser/pageparser.go +++ b/parser/pageparser/pageparser.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Hugo Authors. All rights reserved. +// Copyright 2019 The Hugo Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -36,16 +36,28 @@ type Result interface { var _ Result = (*pageLexer)(nil) // Parse parses the page in the given reader according to the given Config. +// TODO(bep) now that we have improved the "lazy order" init, it *may* be +// some potential saving in doing a buffered approach where the first pass does +// the frontmatter only. func Parse(r io.Reader, cfg Config) (Result, error) { + return parseSection(r, cfg, lexIntroSection) +} + +// ParseMain parses starting with the main section. Used in tests. +func ParseMain(r io.Reader, cfg Config) (Result, error) { + return parseSection(r, cfg, lexMainSection) +} + +func parseSection(r io.Reader, cfg Config, start stateFunc) (Result, error) { b, err := ioutil.ReadAll(r) if err != nil { return nil, errors.Wrap(err, "failed to read page content") } - return parseBytes(b, cfg) + return parseBytes(b, cfg, start) } -func parseBytes(b []byte, cfg Config) (Result, error) { - lexer := newPageLexer(b, lexIntroSection, cfg) +func parseBytes(b []byte, cfg Config, start stateFunc) (Result, error) { + lexer := newPageLexer(b, start, cfg) lexer.run() return lexer, nil } @@ -60,7 +72,7 @@ type Iterator struct { // consumes and returns the next item func (t *Iterator) Next() Item { t.lastPos++ - return t.current() + return t.Current() } // Input returns the input source. @@ -70,7 +82,8 @@ func (t *Iterator) Input() []byte { var errIndexOutOfBounds = Item{tError, 0, []byte("no more tokens")} -func (t *Iterator) current() Item { +// Current will repeatably return the current item. +func (t *Iterator) Current() Item { if t.lastPos >= len(t.l.items) { return errIndexOutOfBounds } @@ -122,5 +135,5 @@ func (t *Iterator) Consume(cnt int) { // LineNumber returns the current line number. Used for logging. func (t *Iterator) LineNumber() int { - return bytes.Count(t.l.input[:t.current().Pos], lf) + 1 + return bytes.Count(t.l.input[:t.Current().Pos], lf) + 1 } |