diff options
author | Bjørn Erik Pedersen <[email protected]> | 2022-05-12 11:43:20 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2022-05-14 13:40:56 +0200 |
commit | 5c96bda70a7afb2ce97cbb3cd70c64fc8cb94446 (patch) | |
tree | 394a557b0dc7db1f6753cf2a09e8cb0577f18442 /tpl | |
parent | 4a96df96d958a8ce122f103c4b417eaba52e6cb1 (diff) | |
download | hugo-5c96bda70a7afb2ce97cbb3cd70c64fc8cb94446.tar.gz hugo-5c96bda70a7afb2ce97cbb3cd70c64fc8cb94446.zip |
errors: Misc improvements
* Redo the server error template
* Always add the content file context if relevant
* Remove some now superflous error string matching
* Move the server error template to _server/error.html
* Add file context (with position) to codeblock render blocks
* Improve JS build errors
Fixes #9892
Fixes #9891
Fixes #9893
Diffstat (limited to 'tpl')
-rw-r--r-- | tpl/tplimpl/embedded/templates/_server/error.html | 87 | ||||
-rw-r--r-- | tpl/tplimpl/embedded/templates/server/error.html | 63 | ||||
-rw-r--r-- | tpl/tplimpl/template.go | 45 | ||||
-rw-r--r-- | tpl/tplimpl/template_errors.go | 2 |
4 files changed, 115 insertions, 82 deletions
diff --git a/tpl/tplimpl/embedded/templates/_server/error.html b/tpl/tplimpl/embedded/templates/_server/error.html new file mode 100644 index 000000000..77d581391 --- /dev/null +++ b/tpl/tplimpl/embedded/templates/_server/error.html @@ -0,0 +1,87 @@ +<!DOCTYPE html> +<html class="no-js" lang=""> + <head> + <meta charset="utf-8" /> + <title>Hugo Server: Error</title> + <style type="text/css"> + body { + font-family: "Muli", system-ui, -apple-system, "Segoe UI", Roboto, + "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, + "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", + "Noto Color Emoji"; + font-size: 14px; + background-color: #272a36; + } + main { + max-width: 100ch; + padding: 2ch; + margin: auto; + } + + .version { + font-size: 0.75rem; + color: #7c7c7c; + } + + hr { + margin-bottom: 1rem; + border: none; + height: 1px; + background-color: #3d3d3d; + } + pre, + code { + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace; + } + .error pre { + line-height: 1.5; + } + .filename { + color: #eef78a; + font-size: 0.9rem; + line-height: 1.5; + } + .highlight { + overflow-x: auto; + } + a { + color: #0594cb; + text-decoration: none; + } + a:hover { + color: #ccc; + } + </style> + </head> + <body> + <main> + {{ $codeStyle := "dracula" }} + <div class="error"> + {{ highlight .Error "apl" (printf "linenos=false,noclasses=true,style=%s" $codeStyle ) }} + </div> + <hr /> + {{ range $i, $e := .Files }} + {{ if not .ErrorContext }} + {{ continue }} + {{ end }} + {{ $params := printf "noclasses=true,style=%s,linenos=table,hl_lines=%d,linenostart=%d" $codeStyle (add .ErrorContext.LinesPos 1) (sub .Position.LineNumber .ErrorContext.LinesPos) }} + {{ $lexer := .ErrorContext.ChromaLexer | default "go-html-template" }} + {{ with .Position }} + <code class="filename" + >{{ printf "%s:%d:%d" .Filename .LineNumber .ColumnNumber }}:</code + > + {{ end }} + {{ highlight (delimit .ErrorContext.Lines "\n") $lexer $params }} + <hr /> + {{ end }} + <p class="version">{{ .Version }}</p> + <a href="">Reload Page</a> + </main> + </body> +</html> diff --git a/tpl/tplimpl/embedded/templates/server/error.html b/tpl/tplimpl/embedded/templates/server/error.html deleted file mode 100644 index e5c6d0cbf..000000000 --- a/tpl/tplimpl/embedded/templates/server/error.html +++ /dev/null @@ -1,63 +0,0 @@ -<!DOCTYPE html> -<html class="no-js" lang=""> - <head> - <meta charset="utf-8" /> - <title>Hugo Server: Error</title> - <style type="text/css"> - body { - font-family: "Muli", avenir, -apple-system, BlinkMacSystemFont, - "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", - "Segoe UI Emoji", "Segoe UI Symbol"; - font-size: 16px; - color: #48b685; - background-color: #2f1e2e; - } - main { - margin: auto; - width: 95%; - padding: 1rem; - } - .version { - color: #ccc; - padding: 1rem 0; - } - .stack { - margin-top: 4rem; - } - pre { - white-space: pre-wrap; - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word; - } - .highlight { - overflow-x: auto; - margin-bottom: 1rem; - } - a { - color: #0594cb; - text-decoration: none; - } - a:hover { - color: #ccc; - } - </style> - </head> - <body> - <main> - {{ highlight .Error "apl" "linenos=false,noclasses=true,style=paraiso-dark" }} - {{ range $i, $e := .Files }} - {{ if not .ErrorContext }} - {{ continue }} - {{ end }} - {{ $params := printf "noclasses=true,style=paraiso-dark,linenos=table,hl_lines=%d,linenostart=%d" (add .ErrorContext.LinesPos 1) (sub .Position.LineNumber .ErrorContext.LinesPos) }} - {{ $lexer := .ErrorContext.ChromaLexer | default "go-html-template" }} - <h3><code>{{ path.Base .Position.Filename }}:</code></h3> - {{ highlight (delimit .ErrorContext.Lines "\n") $lexer $params }} - {{ end }} - <p class="version">{{ .Version }}</p> - <a href="">Reload Page</a> - </main> - </body> -</html> diff --git a/tpl/tplimpl/template.go b/tpl/tplimpl/template.go index c092ff638..25f7957fd 100644 --- a/tpl/tplimpl/template.go +++ b/tpl/tplimpl/template.go @@ -61,6 +61,7 @@ const ( // The identifiers may be truncated in the log, e.g. // "executing "main" at <$scaled.SRelPermalin...>: can't evaluate field SRelPermalink in type *resource.Image" +// We need this to identify position in templates with base templates applied. var identifiersRe = regexp.MustCompile(`at \<(.*?)(\.{3})?\>:`) var embeddedTemplatesAliases = map[string][]string{ @@ -524,25 +525,27 @@ func (t *templateHandler) addFileContext(templ tpl.Template, inerr error) error return inerr } + identifiers := t.extractIdentifiers(inerr.Error()) + //lint:ignore ST1008 the error is the main result checkFilename := func(info templateInfo, inErr error) (error, bool) { if info.filename == "" { return inErr, false } - lineMatcher := func(m herrors.LineMatcher) bool { + lineMatcher := func(m herrors.LineMatcher) int { if m.Position.LineNumber != m.LineNumber { - return false + return -1 } - identifiers := t.extractIdentifiers(m.Error.Error()) - for _, id := range identifiers { if strings.Contains(m.Line, id) { - return true + // We found the line, but return a 0 to signal to + // use the column from the error message. + return 0 } } - return false + return -1 } f, err := t.layoutsFs.Open(info.filename) @@ -551,7 +554,13 @@ func (t *templateHandler) addFileContext(templ tpl.Template, inerr error) error } defer f.Close() - return herrors.NewFileError(info.realFilename, inErr).UpdateContent(f, lineMatcher), true + fe := herrors.NewFileError(info.realFilename, inErr) + fe.UpdateContent(f, lineMatcher) + + if !fe.ErrorContext().Position.IsValid() { + return inErr, false + } + return fe, true } inerr = fmt.Errorf("execute of template failed: %w", inerr) @@ -565,6 +574,15 @@ func (t *templateHandler) addFileContext(templ tpl.Template, inerr error) error return err } +func (t *templateHandler) extractIdentifiers(line string) []string { + m := identifiersRe.FindAllStringSubmatch(line, -1) + identifiers := make([]string, len(m)) + for i := 0; i < len(m); i++ { + identifiers[i] = m[i][1] + } + return identifiers +} + func (t *templateHandler) addShortcodeVariant(ts *templateState) { name := ts.Name() base := templateBaseName(templateShortcode, name) @@ -721,18 +739,9 @@ func (t *templateHandler) applyTemplateTransformers(ns *templateNamespace, ts *t return c, err } -func (t *templateHandler) extractIdentifiers(line string) []string { - m := identifiersRe.FindAllStringSubmatch(line, -1) - identifiers := make([]string, len(m)) - for i := 0; i < len(m); i++ { - identifiers[i] = m[i][1] - } - return identifiers -} - //go:embed embedded/templates/* //go:embed embedded/templates/_default/* -//go:embed embedded/templates/server/* +//go:embed embedded/templates/_server/* var embededTemplatesFs embed.FS func (t *templateHandler) loadEmbedded() error { @@ -755,7 +764,7 @@ func (t *templateHandler) loadEmbedded() error { // For the render hooks and the server templates it does not make sense to preseve the // double _indternal double book-keeping, // just add it if its now provided by the user. - if !strings.Contains(path, "_default/_markup") && !strings.HasPrefix(name, "server/") { + if !strings.Contains(path, "_default/_markup") && !strings.HasPrefix(name, "_server/") { templateName = internalPathPrefix + name } diff --git a/tpl/tplimpl/template_errors.go b/tpl/tplimpl/template_errors.go index d553a12e9..751b4ddbc 100644 --- a/tpl/tplimpl/template_errors.go +++ b/tpl/tplimpl/template_errors.go @@ -59,6 +59,6 @@ func (info templateInfo) errWithFileContext(what string, err error) error { return err } defer f.Close() - return fe.UpdateContent(f, herrors.SimpleLineMatcher) + return fe.UpdateContent(f, nil) } |