summaryrefslogtreecommitdiffstats
path: root/helpers
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2017-03-23 20:05:10 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2017-03-27 15:43:56 +0200
commitd851d6b98fefbe7de91c8c58b883cca4da17eea9 (patch)
tree5171cf499aef5d69ef00ef3b4bcdca777363060b /helpers
parent8bcc08e3b0ddd5762101bb2f061e0be04ecd8d57 (diff)
Add custom protocol support in Permalink
Diffstat (limited to 'helpers')
-rw-r--r--helpers/baseURL.go74
-rw-r--r--helpers/baseURL_test.go51
-rw-r--r--helpers/url.go27
3 files changed, 125 insertions, 27 deletions
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 {
}