Reuse parsed validation content by blob
This commit is contained in:
@@ -2,6 +2,7 @@ package validation
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -30,19 +31,29 @@ type markdownDocument struct {
|
||||
}
|
||||
|
||||
type markdownCache struct {
|
||||
tree *CandidateTree
|
||||
documents map[string]*markdownDocument
|
||||
tree *CandidateTree
|
||||
byPath map[string]*markdownDocument
|
||||
byObjectID map[string]*markdownDocument
|
||||
}
|
||||
|
||||
func newMarkdownCache(tree *CandidateTree) *markdownCache {
|
||||
return &markdownCache{
|
||||
tree: tree,
|
||||
documents: make(map[string]*markdownDocument),
|
||||
tree: tree,
|
||||
byPath: make(map[string]*markdownDocument),
|
||||
byObjectID: make(map[string]*markdownDocument),
|
||||
}
|
||||
}
|
||||
|
||||
func (cache *markdownCache) document(ctx context.Context, path string) (*markdownDocument, error) {
|
||||
if document, ok := cache.documents[path]; ok {
|
||||
if document, ok := cache.byPath[path]; ok {
|
||||
return document, nil
|
||||
}
|
||||
entry, ok := cache.tree.Entry(path)
|
||||
if !ok || !isRegularFile(entry) {
|
||||
return nil, fmt.Errorf("committed path %q is not a regular file", path)
|
||||
}
|
||||
if document, ok := cache.byObjectID[entry.ObjectID]; ok {
|
||||
cache.byPath[path] = document
|
||||
return document, nil
|
||||
}
|
||||
source, err := cache.tree.ReadFile(ctx, path)
|
||||
@@ -50,7 +61,9 @@ func (cache *markdownCache) document(ctx context.Context, path string) (*markdow
|
||||
return nil, err
|
||||
}
|
||||
document := parseMarkdown(source)
|
||||
cache.documents[path] = document
|
||||
source = nil
|
||||
cache.byObjectID[entry.ObjectID] = document
|
||||
cache.byPath[path] = document
|
||||
return document, nil
|
||||
}
|
||||
|
||||
@@ -69,15 +82,15 @@ func parseMarkdown(source []byte) *markdownDocument {
|
||||
switch node := node.(type) {
|
||||
case *ast.Link:
|
||||
document.links = append(document.links, markdownLink{
|
||||
Destination: node.Destination.Value(source),
|
||||
Title: node.Title.Value(source),
|
||||
Destination: strings.Clone(string(node.Destination.Value(source))),
|
||||
Title: strings.Clone(string(node.Title.Value(source))),
|
||||
Reference: node.Reference != nil,
|
||||
Location: markdownLocationAt(lineStarts, node.Pos()),
|
||||
})
|
||||
case *ast.Image:
|
||||
document.links = append(document.links, markdownLink{
|
||||
Destination: node.Destination.Value(source),
|
||||
Title: node.Title.Value(source),
|
||||
Destination: strings.Clone(string(node.Destination.Value(source))),
|
||||
Title: strings.Clone(string(node.Title.Value(source))),
|
||||
Image: true,
|
||||
Reference: node.Reference != nil,
|
||||
Location: markdownLocationAt(lineStarts, node.Pos()),
|
||||
@@ -86,7 +99,7 @@ func parseMarkdown(source []byte) *markdownDocument {
|
||||
return ast.WalkSkipChildren, nil
|
||||
case *ast.AutoLink:
|
||||
document.links = append(document.links, markdownLink{
|
||||
Destination: node.Destination.Value(source),
|
||||
Destination: strings.Clone(string(node.Destination.Value(source))),
|
||||
Location: markdownLocationAt(lineStarts, node.Pos()),
|
||||
})
|
||||
case *ast.Heading:
|
||||
|
||||
Reference in New Issue
Block a user