aboutsummaryrefslogtreecommitdiff
path: root/themes/hugo-pt2021/layouts/shortcodes/pe-picture.html
blob: 3135fcfd76b5d4c7ea10e1c235a8cd48db1833c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
{{/*
https://github.com/pablotron/hugo-shortcode-ppic

Custom Hugo table shortcode which renders progressive picture elements
from front matter data.

This short code exists because the figure shortcode in Hugo does not
support the picture element and does not support progressive image
enhancement.

Features:
... TODO ...

*/}}

{{/* image mime types */}}
{{- $MIME_TYPES := (dict ".webp" "image/webp" ".avif" "image/avif" ".png" "image/png") -}}

{{/* get picture data */}}
{{- $pic := (index $.Page.Params "pics" (.Get 0)) -}}

{{- if (reflect.IsSlice $pic) -}}
  {{- $pic = (dict "sources" $pic) -}}
{{- end -}}

<picture
  id='{{- $pic.id -}}'
  class='{{- $pic.css -}}'
  title='{{- $pic.tip -}}'
>
  {{- if $pic.sources -}}
    {{/* get source count */}}
    {{- $num_sources := len $pic.sources -}}

    {{/* render sources */}}
    {{- range $x, $src := $pic.sources -}}
      {{- $is_map := reflect.IsMap $src -}}

      {{- if $is_map -}}
        {{/* source is a map, reference keys */}}

        {{- if (lt $x (sub $num_sources 1)) -}}
          {{/* emit source tag */}}
          <source
            {{if $src.src}} src='{{- $src.src -}}'{{- end}}
            {{if $src.srcset}} srcset='{{- $src.srcset -}}'{{- end}}
            {{if $src.media}} media='{{- $src.media -}}'{{- end}}

            {{if $src.type}}
              type='{{- $src.type -}}'
            {{else}}
              {{/* get file extension */}}
              {{- $ext := path.Ext $src.srcset -}}

              {{if (index $MIME_TYPES $ext)}}
                type='{{- index $MIME_TYPES $ext -}}'
              {{end}}
            {{- end}}

            {{if (or $pic.tip $src.tip)}} title='{{- default $pic.tip $src.tip -}}'{{- end}}
            {{if (or $pic.tip $src.tip)}} alt='{{- default $pic.tip $src.tip -}}'{{- end}}
          />
        {{- else -}}
          {{/* emit img tag */}}
          <img
            {{if $src.src}} src='{{- $src.src -}}'{{- end}}
            {{if $src.srcset}} srcset='{{- $src.srcset -}}'{{- end}}
            {{if $src.css}} class='{{- $src.css -}}'{{- end}}
            {{if $src.width}} width='{{- $src.width -}}'{{- end}}
            {{if $src.height}} height='{{- $src.height -}}'{{- end}}

            {{if (or $pic.tip $src.tip)}} alt='{{- default $pic.tip $src.tip -}}'{{- end}}
          />
        {{- end -}}
      {{- else -}}
        {{/* src is a string */}}

        {{- if (lt $x (sub $num_sources 1)) -}}
          {{/* emit source */}}

          {{/* get file extension */}}
          {{- $ext := path.Ext $src -}}

          <source
            srcset='{{- $src -}}'

            {{/* determine type from extension */}}
            {{if (index $MIME_TYPES $ext) -}}
              type='{{- index $MIME_TYPES $ext -}}'
            {{- end -}}
          />
        {{- else -}}
          {{/* emit img */}}
          <img
            src='{{- $src -}}'
            {{if $pic.tip}} alt='{{- $pic.tip -}}'{{end}}
          />
        {{- end -}}
      {{- end -}}
    {{- end -}}
  {{- end -}}
</picture>