Skip to content

Commit

Permalink
feat: preserve indentation of multiline go string literals (#765)
Browse files Browse the repository at this point in the history
  • Loading branch information
joerdav authored Jun 5, 2024
1 parent 73474f6 commit 38d9eca
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
-- in --
package main

templ x() {
@something(`Hi
some cool text

foo

bar

`)
@something(`
something
`,
`
something
`,
)
}
-- out --
package main

templ x() {
@something(`Hi
some cool text

foo

bar

`)
@something(`
something
`,
`
something
`,
)
}
42 changes: 26 additions & 16 deletions parser/v2/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,20 +194,6 @@ func (exp TemplateFileGoExpression) Write(w io.Writer, indent int) error {
return err
}

func writeLinesIndented(w io.Writer, level int, s string) (err error) {
indent := strings.Repeat("\t", level)
lines := strings.Split(s, "\n")
indented := strings.Join(lines, "\n"+indent)
if _, err = io.WriteString(w, indent); err != nil {
return err
}
_, err = io.WriteString(w, indented)
if err != nil {
return
}
return
}

func writeIndent(w io.Writer, level int, s ...string) (err error) {
indent := strings.Repeat("\t", level)
if _, err = io.WriteString(w, indent); err != nil {
Expand Down Expand Up @@ -963,8 +949,32 @@ func (tee TemplElementExpression) Write(w io.Writer, indent int) error {
if err != nil {
source = []byte(tee.Expression.Value)
}
if err := writeLinesIndented(w, indent, "@"+string(source)); err != nil {
return err
// Indent all lines and re-format, we can then use this to only re-indent lines that gofmt would modify.
reformattedSource, err := format.Source(bytes.ReplaceAll(source, []byte("\n"), []byte("\n\t")))
if err != nil {
reformattedSource = source
}
sourceLines := bytes.Split(source, []byte("\n"))
reformattedSourceLines := bytes.Split(reformattedSource, []byte("\n"))
for i := range sourceLines {
if i == 0 {
if err := writeIndent(w, indent, "@"+string(sourceLines[i])); err != nil {
return err
}
continue
}
if _, err := io.WriteString(w, "\n"); err != nil {
return err
}
if string(sourceLines[i]) != string(reformattedSourceLines[i]) {
if _, err := io.WriteString(w, string(sourceLines[i])); err != nil {
return err
}
continue
}
if err := writeIndent(w, indent, string(sourceLines[i])); err != nil {
return err
}
}
if len(tee.Children) == 0 {
return nil
Expand Down

0 comments on commit 38d9eca

Please sign in to comment.