hugo

Fork of github.com/gohugoio/hugo with reverse pagination support

git clone git://git.shimmy1996.com/hugo.git

shortcodes.md (16055B)

    1 ---
    2 title: Shortcodes
    3 linktitle:
    4 description: Shortcodes are simple snippets inside your content files calling built-in or custom templates.
    5 date: 2017-02-01
    6 publishdate: 2017-02-01
    7 lastmod: 2019-11-07
    8 menu:
    9   docs:
   10     parent: "content-management"
   11     weight: 35
   12 weight: 35	#rem
   13 categories: [content management]
   14 keywords: [markdown,content,shortcodes]
   15 draft: false
   16 aliases: [/extras/shortcodes/]
   17 testparam: "Hugo Rocks!"
   18 toc: true
   19 ---
   20 
   21 ## What a Shortcode is
   22 
   23 Hugo loves Markdown because of its simple content format, but there are times when Markdown falls short. Often, content authors are forced to add raw HTML (e.g., video `<iframe>`'s) to Markdown content. We think this contradicts the beautiful simplicity of Markdown's syntax.
   24 
   25 Hugo created **shortcodes** to circumvent these limitations.
   26 
   27 A shortcode is a simple snippet inside a content file that Hugo will render using a predefined template. Note that shortcodes will not work in template files. If you need the type of drop-in functionality that shortcodes provide but in a template, you most likely want a [partial template][partials] instead.
   28 
   29 In addition to cleaner Markdown, shortcodes can be updated any time to reflect new classes, techniques, or standards. At the point of site generation, Hugo shortcodes will easily merge in your changes. You avoid a possibly complicated search and replace operation.
   30 
   31 ## Use Shortcodes
   32 
   33 {{< youtube 2xkNJL4gJ9E >}}
   34 
   35 In your content files, a shortcode can be called by calling `{{%/* shortcodename parameters */%}}`. Shortcode parameters are space delimited, and parameters with internal spaces can be quoted.
   36 
   37 The first word in the shortcode declaration is always the name of the shortcode. Parameters follow the name. Depending upon how the shortcode is defined, the parameters may be named, positional, or both, although you can't mix parameter types in a single call. The format for named parameters models that of HTML with the format `name="value"`.
   38 
   39 Some shortcodes use or require closing shortcodes. Again like HTML, the opening and closing shortcodes match (name only) with the closing declaration, which is prepended with a slash.
   40 
   41 Here are two examples of paired shortcodes:
   42 
   43 ```
   44 {{%/* mdshortcode */%}}Stuff to `process` in the *center*.{{%/* /mdshortcode */%}}
   45 ```
   46 
   47 ```
   48 {{</* highlight go */>}} A bunch of code here {{</* /highlight */>}}
   49 ```
   50 
   51 The examples above use two different delimiters, the difference being the `%` character in the first and the `<>` characters in the second.
   52 
   53 ### Shortcodes with raw string parameters
   54 
   55 {{< new-in "0.64.1" >}}
   56 
   57 You can pass multiple lines as parameters to a shortcode by using raw string literals:
   58 
   59 ```
   60 {{</*  myshortcode `This is some <b>HTML</b>,
   61 and a new line with a "quoted string".` */>}}
   62 ```
   63 
   64 ### Shortcodes with Markdown
   65 
   66 In Hugo `0.55` we changed how the `%` delimiter works. Shortcodes using the `%` as the outer-most delimiter will now be fully rendered when sent to the content renderer. They can be part of the generated table of contents, footnotes, etc.
   67 
   68 If you want the old behavior, you can put the following line in the start of your shortcode template:
   69 
   70 ```
   71 {{ $_hugo_config := `{ "version": 1 }` }}
   72 ```
   73 
   74 
   75 ### Shortcodes Without Markdown
   76 
   77 The `<` character indicates that the shortcode's inner content does *not* need further rendering. Often shortcodes without markdown include internal HTML:
   78 
   79 ```
   80 {{</* myshortcode */>}}<p>Hello <strong>World!</strong></p>{{</* /myshortcode */>}}
   81 ```
   82 
   83 ### Nested Shortcodes
   84 
   85 You can call shortcodes within other shortcodes by creating your own templates that leverage the `.Parent` variable. `.Parent` allows you to check the context in which the shortcode is being called. See [Shortcode templates][sctemps].
   86 
   87 ## Use Hugo's Built-in Shortcodes
   88 
   89 Hugo ships with a set of predefined shortcodes that represent very common usage. These shortcodes are provided for author convenience and to keep your markdown content clean.
   90 
   91 ### `figure`
   92 
   93 `figure` is an extension of the image syntax in markdown, which does not provide a shorthand for the more semantic [HTML5 `<figure>` element][figureelement].
   94 
   95 The `figure` shortcode can use the following named parameters:
   96 
   97 src
   98 : URL of the image to be displayed.
   99 
  100 link
  101 : If the image needs to be hyperlinked, URL of the destination.
  102 
  103 target
  104 : Optional `target` attribute for the URL if `link` parameter is set.
  105 
  106 rel
  107 : Optional `rel` attribute for the URL if `link` parameter is set.
  108 
  109 alt
  110 : Alternate text for the image if the image cannot be displayed.
  111 
  112 title
  113 : Image title.
  114 
  115 caption
  116 : Image caption.  Markdown within the value of `caption` will be rendered.
  117 
  118 class
  119 : `class` attribute of the HTML `figure` tag.
  120 
  121 height
  122 : `height` attribute of the image.
  123 
  124 width
  125 : `width` attribute of the image.
  126 
  127 attr
  128 : Image attribution text. Markdown within the value of `attr` will be rendered.
  129 
  130 attrlink
  131 : If the attribution text needs to be hyperlinked, URL of the destination.
  132 
  133 #### Example `figure` Input
  134 
  135 {{< code file="figure-input-example.md" >}}
  136 {{</* figure src="/media/spf13.jpg" title="Steve Francia" */>}}
  137 {{< /code >}}
  138 
  139 #### Example `figure` Output
  140 
  141 {{< output file="figure-output-example.html" >}}
  142 <figure>
  143   <img src="/media/spf13.jpg"  />
  144   <figcaption>
  145       <h4>Steve Francia</h4>
  146   </figcaption>
  147 </figure>
  148 {{< /output >}}
  149 
  150 ### `gist`
  151 
  152 Bloggers often want to include GitHub gists when writing posts. Let's suppose we want to use the [gist at the following url][examplegist]:
  153 
  154 ```
  155 https://gist.github.com/spf13/7896402
  156 ```
  157 
  158 We can embed the gist in our content via username and gist ID pulled from the URL:
  159 
  160 ```
  161 {{</* gist spf13 7896402 */>}}
  162 ```
  163 
  164 #### Example `gist` Input
  165 
  166 If the gist contains several files and you want to quote just one of them, you can pass the filename (quoted) as an optional third argument:
  167 
  168 {{< code file="gist-input.md" >}}
  169 {{</* gist spf13 7896402 "img.html" */>}}
  170 {{< /code >}}
  171 
  172 #### Example `gist` Output
  173 
  174 {{< output file="gist-output.html" >}}
  175 {{< gist spf13 7896402 >}}
  176 {{< /output >}}
  177 
  178 #### Example `gist` Display
  179 
  180 To demonstrate the remarkably efficiency of Hugo's shortcode feature, we have embedded the `spf13` `gist` example in this page. The following simulates the experience for visitors to your website. Naturally, the final display will be contingent on your stylesheets and surrounding markup.
  181 
  182 {{< gist spf13 7896402 >}}
  183 
  184 ### `highlight`
  185 
  186 This shortcode will convert the source code provided into syntax-highlighted HTML. Read more on [highlighting](/content-management/syntax-highlighting/). `highlight` takes exactly one required `language` parameter and requires a closing shortcode.
  187 
  188 #### Example `highlight` Input
  189 
  190 {{< code file="content/tutorials/learn-html.md" >}}
  191 {{</* highlight html */>}}
  192 <section id="main">
  193   <div>
  194    <h1 id="title">{{ .Title }}</h1>
  195     {{ range .Pages }}
  196         {{ .Render "summary"}}
  197     {{ end }}
  198   </div>
  199 </section>
  200 {{</* /highlight */>}}
  201 {{< /code >}}
  202 
  203 #### Example `highlight` Output
  204 
  205 The `highlight` shortcode example above would produce the following HTML when the site is rendered:
  206 
  207 {{< output file="tutorials/learn-html/index.html" >}}
  208 <span style="color: #f92672">&lt;section</span> <span style="color: #a6e22e">id=</span><span style="color: #e6db74">&quot;main&quot;</span><span style="color: #f92672">&gt;</span>
  209   <span style="color: #f92672">&lt;div&gt;</span>
  210    <span style="color: #f92672">&lt;h1</span> <span style="color: #a6e22e">id=</span><span style="color: #e6db74">&quot;title&quot;</span><span style="color: #f92672">&gt;</span>{{ .Title }}<span style="color: #f92672">&lt;/h1&gt;</span>
  211     {{ range .Pages }}
  212         {{ .Render &quot;summary&quot;}}
  213     {{ end }}
  214   <span style="color: #f92672">&lt;/div&gt;</span>
  215 <span style="color: #f92672">&lt;/section&gt;</span>
  216 {{< /output >}}
  217 
  218 {{% note "More on Syntax Highlighting" %}}
  219 To see even more options for adding syntax-highlighted code blocks to your website, see [Syntax Highlighting in Developer Tools](/tools/syntax-highlighting/).
  220 {{% /note %}}
  221 
  222 ### `instagram`
  223 
  224 If you'd like to embed a photo from [Instagram][], you only need the photo's ID. You can discern an Instagram photo ID from the URL:
  225 
  226 ```
  227 https://www.instagram.com/p/BWNjjyYFxVx/
  228 ```
  229 
  230 #### Example `instagram` Input
  231 
  232 {{< code file="instagram-input.md" >}}
  233 {{</* instagram BWNjjyYFxVx */>}}
  234 {{< /code >}}
  235 
  236 You also have the option to hide the caption:
  237 
  238 {{< code file="instagram-input-hide-caption.md" >}}
  239 {{</* instagram BWNjjyYFxVx hidecaption */>}}
  240 {{< /code >}}
  241 
  242 #### Example `instagram` Output
  243 
  244 By adding the preceding `hidecaption` example, the following HTML will be added to your rendered website's markup:
  245 
  246 {{< output file="instagram-hide-caption-output.html" >}}
  247 {{< instagram BWNjjyYFxVx hidecaption >}}
  248 {{< /output >}}
  249 
  250 #### Example `instagram` Display
  251 
  252 Using the preceding `instagram` with `hidecaption` example above, the following simulates the displayed experience for visitors to your website. Naturally, the final display will be contingent on your stylesheets and surrounding markup.
  253 
  254 {{< instagram BWNjjyYFxVx hidecaption >}}
  255 
  256 
  257 
  258 {{% note %}}
  259 The `instagram`-shortcode refers an endpoint of Instagram's API, that's deprecated since October 24th, 2020. Thus, no images can be fetched from this API endpoint, resulting in an error when the `instagram`-shortcode is used. For more information please have a look at GitHub issue [#7879](https://github.com/gohugoio/hugo/issues/7879).
  260 {{% /note %}}
  261 
  262 ### `param`
  263 
  264 Gets a value from the current `Page's` params set in front matter, with a fall back to the site param value. It will log an `ERROR` if the param with the given key could not be found in either.
  265 
  266 ```bash
  267 {{</* param testparam */>}}
  268 ```
  269 
  270 Since `testparam` is a param defined in front matter of this page with the value `Hugo Rocks!`, the above will print:
  271 
  272 {{< param testparam >}}
  273 
  274 To access deeply nested params, use "dot syntax", e.g:
  275 
  276 ```bash
  277 {{</* param "my.nested.param" */>}}
  278 ```
  279 
  280 ### `ref` and `relref`
  281 
  282 These shortcodes will look up the pages by their relative path (e.g., `blog/post.md`) or their logical name (`post.md`) and return the permalink (`ref`) or relative permalink (`relref`) for the found page.
  283 
  284 `ref` and `relref` also make it possible to make fragmentary links that work for the header links generated by Hugo.
  285 
  286 {{% note "More on Cross References" %}}
  287 Read a more extensive description of `ref` and `relref` in the [cross references](/content-management/cross-references/) documentation.
  288 {{% /note %}}
  289 
  290 `ref` and `relref` take exactly one required parameter of _reference_, quoted and in position `0`.
  291 
  292 #### Example `ref` and `relref` Input
  293 
  294 ```
  295 [Neat]({{</* ref "blog/neat.md" */>}})
  296 [Who]({{</* relref "about.md#who" */>}})
  297 ```
  298 
  299 #### Example `ref` and `relref` Output
  300 
  301 Assuming that standard Hugo pretty URLs are turned on.
  302 
  303 ```
  304 <a href="https://example.com/blog/neat">Neat</a>
  305 <a href="/about/#who">Who</a>
  306 ```
  307 
  308 ### `tweet`
  309 
  310 You want to include a single tweet into your blog post? Everything you need is the URL of the tweet:
  311 
  312 ```
  313 https://twitter.com/SanDiegoZoo/status/1453110110599868418
  314 ```
  315 
  316 #### Example `tweet` Input
  317 
  318 Pass the tweet's user (case-insensitive) and id from the URL as parameters to the `tweet` shortcode.
  319 
  320 {{< code file="example-tweet-input.md" >}}
  321 {{</* tweet user="SanDiegoZoo" id="1453110110599868418" */>}}
  322 {{< /code >}}
  323 
  324 #### Example `tweet` Output
  325 
  326 Using the preceding `tweet` example, the following HTML will be added to your rendered website's markup:
  327 
  328 {{< output file="example-tweet-output.html" >}}
  329 {{< tweet user="SanDiegoZoo" id="1453110110599868418" >}}
  330 {{< /output >}}
  331 
  332 #### Example `tweet` Display
  333 
  334 Using the preceding `tweet` example, the following simulates the displayed experience for visitors to your website. Naturally, the final display will be contingent on your stylesheets and surrounding markup.
  335 
  336 {{< tweet user="SanDiegoZoo" id="1453110110599868418" >}}
  337 
  338 ### `vimeo`
  339 
  340 Adding a video from [Vimeo][] is equivalent to the [YouTube Input shortcode][].
  341 
  342 ```
  343 https://vimeo.com/channels/staffpicks/146022717
  344 ```
  345 
  346 #### Example `vimeo` Input
  347 
  348 Extract the ID from the video's URL and pass it to the `vimeo` shortcode:
  349 
  350 {{< code file="example-vimeo-input.md" >}}
  351 {{</* vimeo 146022717 */>}}
  352 {{< /code >}}
  353 
  354 #### Example `vimeo` Output
  355 
  356 Using the preceding `vimeo` example, the following HTML will be added to your rendered website's markup:
  357 
  358 {{< output file="example-vimeo-output.html" >}}
  359 {{< vimeo 146022717 >}}
  360 {{< /output >}}
  361 
  362 {{% tip %}}
  363 If you want to further customize the visual styling of the YouTube or Vimeo output, add a `class` named parameter when calling the shortcode. The new `class` will be added to the `<div>` that wraps the `<iframe>` *and* will remove the inline styles. Note that you will need to call the `id` as a named parameter as well. You can also give the vimeo video a descriptive title with `title`. 
  364 
  365 ```
  366 {{</* vimeo id="146022717" class="my-vimeo-wrapper-class" title="My vimeo video" */>}}
  367 ```
  368 {{% /tip %}}
  369 
  370 #### Example `vimeo` Display
  371 
  372 Using the preceding `vimeo` example, the following simulates the displayed experience for visitors to your website. Naturally, the final display will be contingent on your stylesheets and surrounding markup.
  373 
  374 {{< vimeo 146022717 >}}
  375 
  376 ### `youtube`
  377 
  378 The `youtube` shortcode embeds a responsive video player for [YouTube videos][]. Only the ID of the video is required, e.g.:
  379 
  380 ```
  381 https://www.youtube.com/watch?v=w7Ft2ymGmfc
  382 ```
  383 
  384 
  385 #### Example `youtube` Input
  386 
  387 Copy the YouTube video ID that follows `v=` in the video's URL and pass it to the `youtube` shortcode:
  388 
  389 {{< code file="example-youtube-input.md" >}}
  390 {{</* youtube w7Ft2ymGmfc */>}}
  391 {{< /code >}}
  392 
  393 Furthermore, you can automatically start playback of the embedded video by setting the `autoplay` parameter to `true`. Remember that you can't mix named and unnamed parameters, so you'll need to assign the yet unnamed video id to the parameter `id`:
  394 
  395 
  396 {{< code file="example-youtube-input-with-autoplay.md" >}}
  397 {{</* youtube id="w7Ft2ymGmfc" autoplay="true" */>}}
  398 {{< /code >}}
  399 
  400 For [accessibility reasons](https://dequeuniversity.com/tips/provide-iframe-titles), it's best to provide a title for your YouTube video.  You  can do this using the shortcode by providing a `title` parameter. If no title is provided, a default of "YouTube Video" will be used.
  401 
  402 {{< code file="example-youtube-input-with-title.md" >}}
  403 {{</* youtube id="w7Ft2ymGmfc" title="A New Hugo Site in Under Two Minutes" */>}}
  404 {{< /code >}}
  405 
  406 
  407 #### Example `youtube` Output
  408 
  409 Using the preceding `youtube` example, the following HTML will be added to your rendered website's markup:
  410 
  411 {{< code file="example-youtube-output.html" >}}
  412 {{< youtube id="w7Ft2ymGmfc" autoplay="true" >}}
  413 {{< /code >}}
  414 
  415 #### Example `youtube` Display
  416 
  417 Using the preceding `youtube` example (without `autoplay="true"`), the following simulates the displayed experience for visitors to your website. Naturally, the final display will be contingent on your stylesheets and surrounding markup. The video is also include in the [Quick Start of the Hugo documentation][quickstart].
  418 
  419 {{< youtube w7Ft2ymGmfc >}}
  420 
  421 ## Privacy Config
  422 
  423 To learn how to configure your Hugo site to meet the new EU privacy regulation, see [Hugo and the GDPR][].
  424 
  425 ## Create Custom Shortcodes
  426 
  427 To learn more about creating custom shortcodes, see the [shortcode template documentation][].
  428 
  429 [`figure` shortcode]: #figure
  430 [contentmanagementsection]: /content-management/formats/
  431 [examplegist]: https://gist.github.com/spf13/7896402
  432 [figureelement]: https://html5doctor.com/the-figure-figcaption-elements/ "An article from HTML5 doctor discussing the fig and figcaption elements."
  433 [Hugo and the GDPR]: /about/hugo-and-gdpr/
  434 [Instagram]: https://www.instagram.com/
  435 [pagevariables]: /variables/page/
  436 [partials]: /templates/partials/
  437 [quickstart]: /getting-started/quick-start/
  438 [sctemps]: /templates/shortcode-templates/
  439 [scvars]: /variables/shortcodes/
  440 [shortcode template documentation]: /templates/shortcode-templates/
  441 [templatessection]: /templates/
  442 [Vimeo]: https://vimeo.com/
  443 [YouTube Videos]: https://www.youtube.com/
  444 [YouTube Input shortcode]: #youtube