diff --git a/config/privacy/privacyConfig.go b/config/privacy/privacyConfig.go index 4da7efbea..ee7b7be2c 100644 --- a/config/privacy/privacyConfig.go +++ b/config/privacy/privacyConfig.go @@ -53,6 +53,10 @@ type GoogleAnalytics struct { // Instagram holds the privacy configuration settings related to the Instagram shortcode. type Instagram struct { Service `mapstructure:",squash"` + + // If simple mode is enabled, a static and no-JS version of the Instagram + // image card will be built. + Simple bool } // SpeakerDeck holds the privacy configuration settings related to the SpeakerDeck shortcode. diff --git a/config/privacy/privacyConfig_test.go b/config/privacy/privacyConfig_test.go index bca53f167..f945ac8c2 100644 --- a/config/privacy/privacyConfig_test.go +++ b/config/privacy/privacyConfig_test.go @@ -36,6 +36,7 @@ disable = true respectDoNotTrack = true [privacy.instagram] disable = true +simple = true [privacy.speakerDeck] disable = true [privacy.tweet] @@ -45,6 +46,7 @@ disable = true [privacy.youtube] disable = true privacyEnhanced = true +simple = true ` cfg, err := config.FromConfigString(tomlConfig, "toml") assert.NoError(err) @@ -57,12 +59,14 @@ privacyEnhanced = true assert.True(pc.GoogleAnalytics.Disable) assert.True(pc.GoogleAnalytics.RespectDoNotTrack) assert.True(pc.Instagram.Disable) + assert.True(pc.Instagram.Simple) assert.True(pc.SpeakerDeck.Disable) assert.True(pc.Tweet.Disable) assert.True(pc.Vimeo.Disable) assert.True(pc.YouTube.PrivacyEnhanced) assert.True(pc.YouTube.Disable) + assert.True(pc.YouTube.Simple) } func TestDecodeConfigFromTOMLCaseInsensitive(t *testing.T) { diff --git a/config/services/servicesConfig.go b/config/services/servicesConfig.go index 676174a56..d78b80948 100644 --- a/config/services/servicesConfig.go +++ b/config/services/servicesConfig.go @@ -29,6 +29,7 @@ const ( type Config struct { Disqus Disqus GoogleAnalytics GoogleAnalytics + Instagram Instagram } // Disqus holds the functional configuration settings related to the Disqus template. @@ -43,6 +44,14 @@ type GoogleAnalytics struct { ID string } +// Instagram holds the functional configuration settings related to the Instagram shortcodes. +type Instagram struct { + // The Simple variant of the Instagram is decorated with Bootstrap 4 card classes. + // This means that if you use Bootstrap 4 or want to provide your own CSS, you want + // to disable the inline CSS provided by Hugo. + DisableInlineCSS bool +} + func DecodeConfig(cfg config.Provider) (c Config, err error) { m := cfg.GetStringMap(servicesConfigKey) diff --git a/config/services/servicesConfig_test.go b/config/services/servicesConfig_test.go index 96ef839a1..69dec0350 100644 --- a/config/services/servicesConfig_test.go +++ b/config/services/servicesConfig_test.go @@ -33,6 +33,8 @@ someOtherValue = "foo" shortname = "DS" [services.googleAnalytics] id = "ga_id" +[services.instagram] +disableInlineCSS = true ` cfg, err := config.FromConfigString(tomlConfig, "toml") assert.NoError(err) @@ -44,6 +46,7 @@ id = "ga_id" assert.Equal("DS", config.Disqus.Shortname) assert.Equal("ga_id", config.GoogleAnalytics.ID) + assert.True(config.Instagram.DisableInlineCSS) } // Support old root-level GA settings etc. diff --git a/tpl/tplimpl/embedded/templates.autogen.go b/tpl/tplimpl/embedded/templates.autogen.go index 9498d8f87..3339c3888 100644 --- a/tpl/tplimpl/embedded/templates.autogen.go +++ b/tpl/tplimpl/embedded/templates.autogen.go @@ -241,7 +241,8 @@ if (!doNotTrack) { {{ end }}`}, - {`shortcodes/__h_simple_assets.html`, `{{ define "__h_simple_css" }}{{/* This is also used in other "simple" variants. These template definitions are global. */}} + {`shortcodes/__h_simple_assets.html`, `{{ define "__h_simple_css" }}{{/* These template definitions are global. */}} +{{/* TODO(bep) rename this to Youtube something. We need to add these per service. */}} {{ if not (.Page.Scratch.Get "__h_simple_css") }} {{/* Only include once */}} {{ .Page.Scratch.Set "__h_simple_css" true }} @@ -298,8 +299,62 @@ M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.5 {`shortcodes/highlight.html`, `{{ if len .Params | eq 2 }}{{ highlight (trim .Inner "\n\r") (.Get 0) (.Get 1) }}{{ else }}{{ highlight (trim .Inner "\n\r") (.Get 0) "" }}{{ end }}`}, {`shortcodes/instagram.html`, `{{- $pc := .Page.Site.Config.Privacy.Instagram -}} {{- if not $pc.Disable -}} -{{ if len .Params | eq 2 }}{{ if eq (.Get 1) "hidecaption" }}{{ with getJSON "https://api.instagram.com/oembed/?url=https://instagram.com/p/" (index .Params 0) "/&hidecaption=1" }}{{ .html | safeHTML }}{{ end }}{{ end }}{{ else }}{{ with getJSON "https://api.instagram.com/oembed/?url=https://instagram.com/p/" (index .Params 0) "/&hidecaption=0" }}{{ .html | safeHTML }}{{ end }}{{ end }} +{{- if $pc.Simple -}} +{{ template "_internal/shortcodes/instagram_simple.html" . }} +{{- else -}} +{{ $id := .Get 0 }} +{{ $hideCaption := cond (eq (.Get 1) "hidecaption") "1" "0" }} +{{ with getJSON "https://api.instagram.com/oembed/?url=https://instagram.com/p/" $id "/&hidecaption=" $hideCaption }}{{ .html | safeHTML }}{{ end }} +{{- end -}} {{- end -}}`}, + {`shortcodes/instagram_simple.html`, `{{- $pc := .Page.Site.Config.Privacy.Instagram -}} +{{- $sc := .Page.Site.Config.Services.Instagram -}} +{{- if not $pc.Disable -}} +{{- $id := .Get 0 -}} +{{- $item := getJSON "https://api.instagram.com/oembed/?url=https://www.instagram.com/p/" $id "/&maxwidth=640&omitscript=true" -}} +{{- $class1 := "__h_instagram" -}} +{{- $class2 := "s_instagram_simple" -}} +{{- $hideCaption := (eq (.Get 1) "hidecaption") -}} +{{ with $item }} +{{- $mediaURL := printf "https://instagram.com/p/%s/" $id | safeURL -}} +{{- if not $sc.DisableInlineCSS -}} +{{ template "__h_simple_instagram_css" $ }} +{{- end -}} +
{{ $item.author_name }} {{ $item.title}}
{{ end }} + Vew More on Instagram +{{ $item.author_name }} {{ $item.title}}
{{ end }} + Vew More on Instagram +