summaryrefslogtreecommitdiffstats
path: root/tpl
diff options
context:
space:
mode:
Diffstat (limited to 'tpl')
-rw-r--r--tpl/tplimpl/embedded/templates/_server/error.html87
-rw-r--r--tpl/tplimpl/embedded/templates/server/error.html63
-rw-r--r--tpl/tplimpl/template.go45
-rw-r--r--tpl/tplimpl/template_errors.go2
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)
}