diff --git a/present/code.go b/present/code.go index 2816a8797d..a17643564b 100644 --- a/present/code.go +++ b/present/code.go @@ -238,6 +238,8 @@ func parseArgs(name string, line int, args []string) (res []interface{}, err err res[i] = v case '$': res[i] = "$" + case '_': + // Do nothing; '_' indicates an intentionally empty parameter. default: return nil, fmt.Errorf("%s:%d bad code argument %q", name, line, v) } diff --git a/present/doc.go b/present/doc.go index afd50e79e9..da71e8d371 100644 --- a/present/doc.go +++ b/present/doc.go @@ -168,10 +168,14 @@ The template uses the function "image" to inject picture files. The syntax is simple: 1 or 3 space-separated arguments. The first argument is always the file name. If there are more arguments, they are the height and width; -both must be present. +both must be present, or substituted with an underscore. +Replacing a dimension argument with the underscore parameter +preserves the aspect ratio of the image when scaling. .image images/betsy.jpg 100 200 + .image images/janet.jpg _ 300 + iframe: The function "iframe" injects iframes (pages inside pages). diff --git a/present/image.go b/present/image.go index 2bab429c7d..cfa2af9ba2 100644 --- a/present/image.go +++ b/present/image.go @@ -32,6 +32,11 @@ func parseImage(ctx *Context, fileName string, lineno int, text string) (Elem, e case 0: // no size parameters case 2: + // If a parameter is empty (underscore) or invalid + // leave the field set to zero. The "image" action + // template will then omit that img tag attribute and + // the browser will calculate the value to preserve + // the aspect ratio. if v, ok := a[0].(int); ok { img.Height = v }