From d851d6b98fefbe7de91c8c58b883cca4da17eea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 23 Mar 2017 20:05:10 +0100 Subject: Add custom protocol support in Permalink --- helpers/baseURL.go | 74 +++++++++++++++++++++++++++++++++++++++++++++++++ helpers/baseURL_test.go | 51 ++++++++++++++++++++++++++++++++++ helpers/url.go | 27 ------------------ 3 files changed, 125 insertions(+), 27 deletions(-) create mode 100644 helpers/baseURL.go create mode 100644 helpers/baseURL_test.go (limited to 'helpers') diff --git a/helpers/baseURL.go b/helpers/baseURL.go new file mode 100644 index 000000000..9a4b77edd --- /dev/null +++ b/helpers/baseURL.go @@ -0,0 +1,74 @@ +// Copyright 2017-present The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package helpers + +import ( + "fmt" + "net/url" + "strings" +) + +// A BaseURL in Hugo is normally on the form scheme://path, but the +// form scheme: is also valid (mailto:hugo@rules.com). +type BaseURL struct { + url *url.URL + urlStr string +} + +func (b BaseURL) String() string { + return b.urlStr +} + +// Protocol is normaly on the form "scheme://", i.e. "webcal://". +func (b BaseURL) WithProtocol(protocol string) (string, error) { + u := b.URL() + + scheme := protocol + isFullProtocol := strings.HasSuffix(scheme, "://") + isOpaqueProtocol := strings.HasSuffix(scheme, ":") + + if isFullProtocol { + scheme = strings.TrimSuffix(scheme, "://") + } else if isOpaqueProtocol { + scheme = strings.TrimSuffix(scheme, ":") + } + + u.Scheme = scheme + + if isFullProtocol && u.Opaque != "" { + u.Opaque = "//" + u.Opaque + } else if isOpaqueProtocol && u.Opaque == "" { + return "", fmt.Errorf("Cannot determine BaseURL for protocol %q", protocol) + } + + return u.String(), nil +} + +func (b BaseURL) URL() *url.URL { + // create a copy as it will be modified. + c := *b.url + return &c +} + +func newBaseURLFromString(b string) (BaseURL, error) { + var result BaseURL + + base, err := url.Parse(b) + if err != nil { + return result, err + } + + // TODO(bep) output consider saving original URL? + return BaseURL{url: base, urlStr: base.String()}, nil +} diff --git a/helpers/baseURL_test.go b/helpers/baseURL_test.go new file mode 100644 index 000000000..eaa27ddb9 --- /dev/null +++ b/helpers/baseURL_test.go @@ -0,0 +1,51 @@ +// Copyright 2017-present The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package helpers + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestBaseURL(t *testing.T) { + b, err := newBaseURLFromString("http://example.com") + require.NoError(t, err) + require.Equal(t, "http://example.com", b.String()) + + p, err := b.WithProtocol("webcal://") + require.NoError(t, err) + require.Equal(t, "webcal://example.com", p) + + p, err = b.WithProtocol("webcal") + require.NoError(t, err) + require.Equal(t, "webcal://example.com", p) + + _, err = b.WithProtocol("mailto:") + require.Error(t, err) + + b, err = newBaseURLFromString("mailto:hugo@rules.com") + require.NoError(t, err) + require.Equal(t, "mailto:hugo@rules.com", b.String()) + + // These are pretty constructed + p, err = b.WithProtocol("webcal") + require.NoError(t, err) + require.Equal(t, "webcal:hugo@rules.com", p) + + p, err = b.WithProtocol("webcal://") + require.NoError(t, err) + require.Equal(t, "webcal://hugo@rules.com", p) + +} diff --git a/helpers/url.go b/helpers/url.go index a73e54999..defde6a17 100644 --- a/helpers/url.go +++ b/helpers/url.go @@ -23,33 +23,6 @@ import ( "github.com/PuerkitoBio/purell" ) -type BaseURL struct { - url *url.URL - urlStr string -} - -func (b BaseURL) String() string { - return b.urlStr -} - -func (b BaseURL) URL() *url.URL { - // create a copy as it will be modified. - c := *b.url - return &c -} - -func newBaseURLFromString(b string) (BaseURL, error) { - var result BaseURL - - base, err := url.Parse(b) - if err != nil { - return result, err - } - - // TODO(bep) output consider saving original URL? - return BaseURL{url: base, urlStr: base.String()}, nil -} - type pathBridge struct { } -- cgit v1.2.3