URI: 
       tpl/tplimpl: Update Google Analytics template and config - hugo - [fork] hugo port for 9front
  HTML git clone git@git.drkhsh.at/hugo.git
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
   DIR commit ebfca61ac4d4b62b3e4a50477826a85c06b44552
   DIR parent e1917740afe3fd08d1948947e25eff55e2c10d98
  HTML Author: Joe Mooring <joe.mooring@veriphor.com>
       Date:   Sat, 23 Mar 2024 13:07:00 -0700
       
       tpl/tplimpl: Update Google Analytics template and config
       
       Google Analytics 4 (GA4) replaced Google Universal Analytics (UA)
       effective 1 July 2023.
       
       See https://support.google.com/analytics/answer/11583528.
       
       Changes:
       
       - Update tpl/tplimpl/embedded/templates/google_analytics.html
       - Remove tpl/tplimpl/embedded/templates/google_analytics_async.html
       - Remove extraneous config settings
       
       Closes #11802
       Closes #10093
       
       Diffstat:
         M config/privacy/privacyConfig.go     |       6 ------
         M config/privacy/privacyConfig_test.… |       5 +----
         M docs/data/docs.yaml                 |       2 --
         M hugolib/embedded_templates_test.go  |      39 -------------------------------
         M hugolib/testhelpers_test.go         |       1 -
         M tpl/tplimpl/embedded/templates/goo… |      73 ++++++++++---------------------
         D tpl/tplimpl/embedded/templates/goo… |      29 -----------------------------
         M tpl/tplimpl/tplimpl_integration_te… |      44 +++++++++++++++++++++++++++++++
       
       8 files changed, 67 insertions(+), 132 deletions(-)
       ---
   DIR diff --git a/config/privacy/privacyConfig.go b/config/privacy/privacyConfig.go
       @@ -44,15 +44,9 @@ type Disqus struct {
        type GoogleAnalytics struct {
                Service `mapstructure:",squash"`
        
       -        // Enabling this will disable the use of Cookies and use Session Storage to Store the GA Client ID.
       -        UseSessionStorage bool
       -
                // Enabling this will make the GA templates respect the
                // "Do Not Track" HTTP header. See  https://www.paulfurley.com/google-analytics-dnt/.
                RespectDoNotTrack bool
       -
       -        // Enabling this will make it so the users' IP addresses are anonymized within Google Analytics.
       -        AnonymizeIP bool
        }
        
        // Instagram holds the privacy configuration settings related to the Instagram shortcode.
   DIR diff --git a/config/privacy/privacyConfig_test.go b/config/privacy/privacyConfig_test.go
       @@ -33,8 +33,6 @@ disable = true
        [privacy.googleAnalytics]
        disable = true
        respectDoNotTrack = true
       -anonymizeIP = true
       -useSessionStorage = true
        [privacy.instagram]
        disable = true
        simple = true
       @@ -60,8 +58,7 @@ simple = true
        
                got := []bool{
                        pc.Disqus.Disable, pc.GoogleAnalytics.Disable,
       -                pc.GoogleAnalytics.RespectDoNotTrack, pc.GoogleAnalytics.AnonymizeIP,
       -                pc.GoogleAnalytics.UseSessionStorage, pc.Instagram.Disable,
       +                pc.GoogleAnalytics.RespectDoNotTrack, pc.Instagram.Disable,
                        pc.Instagram.Simple, pc.Twitter.Disable, pc.Twitter.EnableDNT,
                        pc.Twitter.Simple, pc.Vimeo.Disable, pc.Vimeo.EnableDNT, pc.Vimeo.Simple,
                        pc.YouTube.PrivacyEnhanced, pc.YouTube.Disable,
   DIR diff --git a/docs/data/docs.yaml b/docs/data/docs.yaml
       @@ -1557,10 +1557,8 @@ config:
            disqus:
              disable: false
            googleAnalytics:
       -      anonymizeIP: false
              disable: false
              respectDoNotTrack: false
       -      useSessionStorage: false
            instagram:
              disable: false
              simple: false
   DIR diff --git a/hugolib/embedded_templates_test.go b/hugolib/embedded_templates_test.go
       @@ -15,8 +15,6 @@ package hugolib
        
        import (
                "testing"
       -
       -        qt "github.com/frankban/quicktest"
        )
        
        func TestInternalTemplatesImage(t *testing.T) {
       @@ -97,43 +95,6 @@ title: My Site
        `)
        }
        
       -// Just some simple test of the embedded templates to avoid
       -// https://github.com/gohugoio/hugo/issues/4757 and similar.
       -func TestEmbeddedTemplates(t *testing.T) {
       -        t.Parallel()
       -
       -        c := qt.New(t)
       -        c.Assert(true, qt.Equals, true)
       -
       -        home := []string{"index.html", `
       -GA:
       -{{ template "_internal/google_analytics.html" . }}
       -
       -GA async:
       -
       -{{ template "_internal/google_analytics_async.html" . }}
       -
       -Disqus:
       -
       -{{ template "_internal/disqus.html" . }}
       -
       -`}
       -
       -        b := newTestSitesBuilder(t)
       -        b.WithSimpleConfigFile().WithTemplatesAdded(home...)
       -
       -        b.Build(BuildCfg{})
       -
       -        // Gheck GA regular and async
       -        b.AssertFileContent("public/index.html",
       -                "'anonymizeIp', true",
       -                "'script','https://www.google-analytics.com/analytics.js','ga');\n\tga('create', 'UA-ga_id', 'auto')",
       -                "<script async src='https://www.google-analytics.com/analytics.js'>")
       -
       -        // Disqus
       -        b.AssertFileContent("public/index.html", "\"disqus_shortname\" + '.disqus.com/embed.js';")
       -}
       -
        func TestEmbeddedPaginationTemplate(t *testing.T) {
                t.Parallel()
        
   DIR diff --git a/hugolib/testhelpers_test.go b/hugolib/testhelpers_test.go
       @@ -258,7 +258,6 @@ id = "UA-ga_id"
        disable = false
        [privacy.googleAnalytics]
        respectDoNotTrack = true
       -anonymizeIP = true
        [privacy.instagram]
        simple = true
        [privacy.twitter]
   DIR diff --git a/tpl/tplimpl/embedded/templates/google_analytics.html b/tpl/tplimpl/embedded/templates/google_analytics.html
       @@ -1,51 +1,22 @@
       -{{- $pc := .Site.Config.Privacy.GoogleAnalytics -}}
       -{{- if not $pc.Disable }}{{ with .Site.Config.Services.GoogleAnalytics.ID -}}
       -{{ if hasPrefix . "G-"}}
       -<script async src="https://www.googletagmanager.com/gtag/js?id={{ . }}"></script>
       -<script>
       -{{ template "__ga_js_set_doNotTrack" $ }}
       -if (!doNotTrack) {
       -        window.dataLayer = window.dataLayer || [];
       -        function gtag(){dataLayer.push(arguments);}
       -        gtag('js', new Date());
       -        gtag('config', '{{ . }}', { 'anonymize_ip': {{- $pc.AnonymizeIP -}} });
       -}
       -</script>
       -{{ else if hasPrefix . "UA-" }}
       -<script>
       -{{ template "__ga_js_set_doNotTrack" $ }}
       -if (!doNotTrack) {
       -        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
       -        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
       -        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
       -        })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
       -        {{- if $pc.UseSessionStorage }}
       -        if (window.sessionStorage) {
       -                var GA_SESSION_STORAGE_KEY = 'ga:clientId';
       -                ga('create', '{{ . }}', {
       -            'storage': 'none',
       -            'clientId': sessionStorage.getItem(GA_SESSION_STORAGE_KEY)
       -           });
       -           ga(function(tracker) {
       -            sessionStorage.setItem(GA_SESSION_STORAGE_KEY, tracker.get('clientId'));
       -           });
       -   }
       -        {{ else }}
       -        ga('create', '{{ . }}', 'auto');
       -        {{ end -}}
       -        {{ if $pc.AnonymizeIP }}ga('set', 'anonymizeIp', true);{{ end }}
       -        ga('send', 'pageview');
       -}
       -</script>
       -{{- end -}}
       -{{- end }}{{ end -}}
       -
       -{{- define "__ga_js_set_doNotTrack" -}}{{/* This is also used in the async version. */}}
       -{{- $pc := .Site.Config.Privacy.GoogleAnalytics -}}
       -{{- if not $pc.RespectDoNotTrack -}}
       -var doNotTrack = false;
       -{{- else -}}
       -var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);
       -var doNotTrack = (dnt == "1" || dnt == "yes");
       -{{- end -}}
       -{{- end -}}
       +{{ if not site.Config.Privacy.GoogleAnalytics.Disable }}
       +  {{ with site.Config.Services.GoogleAnalytics.ID }}
       +    {{ if strings.HasPrefix (lower .) "ua-" }}
       +      {{ warnf "Google Analytics 4 (GA4) replaced Google Universal Analytics (UA) effective 1 July 2023. See https://support.google.com/analytics/answer/11583528. Create a GA4 property and data stream, then replace the Google Analytics ID in your site configuration with the new value." }}
       +    {{ else }}
       +      <script async src="https://www.googletagmanager.com/gtag/js?id={{ . }}"></script>
       +      <script>
       +        var doNotTrack = false;
       +        if ({{ site.Config.Privacy.GoogleAnalytics.RespectDoNotTrack }}) {
       +          var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);
       +          var doNotTrack = (dnt == "1" || dnt == "yes");
       +        }
       +        if (!doNotTrack) {
       +          window.dataLayer = window.dataLayer || [];
       +          function gtag(){dataLayer.push(arguments);}
       +          gtag('js', new Date());
       +          gtag('config', '{{ . }}');
       +        }
       +      </script>
       +    {{ end }}
       +  {{ end }}
       +{{ end }}
   DIR diff --git a/tpl/tplimpl/embedded/templates/google_analytics_async.html b/tpl/tplimpl/embedded/templates/google_analytics_async.html
       @@ -1,29 +0,0 @@
       -{{ warnf "_internal/google_analytics_async.html is no longer supported by Google and will be removed in a future version of Hugo" }}
       -{{- $pc := .Site.Config.Privacy.GoogleAnalytics -}}
       -{{- if not $pc.Disable -}}
       -{{ with .Site.Config.Services.GoogleAnalytics.ID }}
       -<script>
       -{{ template "__ga_js_set_doNotTrack" $ }}
       -if (!doNotTrack) {
       -        window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
       -        {{- if $pc.UseSessionStorage }}
       -        if (window.sessionStorage) {
       -                var GA_SESSION_STORAGE_KEY = 'ga:clientId';
       -                ga('create', '{{ . }}', {
       -            'storage': 'none',
       -            'clientId': sessionStorage.getItem(GA_SESSION_STORAGE_KEY)
       -           });
       -           ga(function(tracker) {
       -            sessionStorage.setItem(GA_SESSION_STORAGE_KEY, tracker.get('clientId'));
       -           });
       -   }
       -        {{ else }}
       -        ga('create', '{{ . }}', 'auto');
       -        {{ end -}}
       -        {{ if $pc.AnonymizeIP }}ga('set', 'anonymizeIp', true);{{ end }}
       -        ga('send', 'pageview');
       -}
       -</script>
       -<script async src='https://www.google-analytics.com/analytics.js'></script>
       -{{ end }}
       -{{- end -}}
   DIR diff --git a/tpl/tplimpl/tplimpl_integration_test.go b/tpl/tplimpl/tplimpl_integration_test.go
       @@ -210,3 +210,47 @@ var a = §§{{.Title }}§§;
                // This used to fail, but not in >= Hugo 0.121.0.
                b.Assert(err, qt.IsNil)
        }
       +
       +func TestGoogleAnalyticsTemplate(t *testing.T) {
       +        t.Parallel()
       +
       +        files := `
       +-- hugo.toml --
       +disableKinds = ['page','section','rss','sitemap','taxonomy','term']
       +[privacy.googleAnalytics]
       +disable = false
       +respectDoNotTrack = true
       +[services.googleAnalytics]
       +id = 'G-0123456789'
       +-- layouts/index.html --
       +{{ template "_internal/google_analytics.html" . }}
       +`
       +
       +        b := hugolib.Test(t, files)
       +
       +        b.AssertFileContent("public/index.html",
       +                `<script async src="https://www.googletagmanager.com/gtag/js?id=G-0123456789"></script>`,
       +                `var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);`,
       +        )
       +}
       +
       +func TestDisqusTemplate(t *testing.T) {
       +        t.Parallel()
       +
       +        files := `
       +-- hugo.toml --
       +disableKinds = ['page','section','rss','sitemap','taxonomy','term']
       +[services.disqus]
       +shortname = 'foo'
       +[privacy.disqus]
       +disable = false
       +-- layouts/index.html --
       +{{ template "_internal/disqus.html" . }}
       +`
       +
       +        b := hugolib.Test(t, files)
       +
       +        b.AssertFileContent("public/index.html",
       +                `s.src = '//' + "foo" + '.disqus.com/embed.js';`,
       +        )
       +}