summaryrefslogtreecommitdiffstats
path: root/helpers/path.go
diff options
context:
space:
mode:
Diffstat (limited to 'helpers/path.go')
-rw-r--r--helpers/path.go120
1 files changed, 120 insertions, 0 deletions
diff --git a/helpers/path.go b/helpers/path.go
new file mode 100644
index 000000000..024b0e941
--- /dev/null
+++ b/helpers/path.go
@@ -0,0 +1,120 @@
+// Copyright © 2014 Steve Francia <spf@spf13.com>.
+//
+// Licensed under the Simple Public 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://opensource.org/licenses/Simple-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 (
+ "os"
+ "path"
+ "regexp"
+ "strings"
+ "unicode"
+)
+
+var sanitizeRegexp = regexp.MustCompile("[^a-zA-Z0-9./_-]")
+
+// Take a string with any characters and replace it so the string could be used in a path.
+// E.g. Social Media -> social-media
+func MakePath(s string) string {
+ return UnicodeSanitize(strings.ToLower(strings.Replace(strings.TrimSpace(s), " ", "-", -1)))
+}
+
+func Sanitize(s string) string {
+ return sanitizeRegexp.ReplaceAllString(s, "")
+}
+
+func UnicodeSanitize(s string) string {
+ source := []rune(s)
+ target := make([]rune, 0, len(source))
+
+ for _, r := range source {
+ if unicode.IsLetter(r) || unicode.IsDigit(r) || r == '.' || r == '/' || r == '_' || r == '-' {
+ target = append(target, r)
+ }
+ }
+
+ return string(target)
+}
+
+func ReplaceExtension(path string, newExt string) string {
+ f, _ := FileAndExt(path)
+ return f + "." + newExt
+}
+
+// Check if Exists && is Directory
+func DirExists(path string) (bool, error) {
+ fi, err := os.Stat(path)
+ if err == nil && fi.IsDir() {
+ return true, nil
+ }
+ if os.IsNotExist(err) {
+ return false, nil
+ }
+ return false, err
+}
+
+// Check if File / Directory Exists
+func Exists(path string) (bool, error) {
+ _, err := os.Stat(path)
+ if err == nil {
+ return true, nil
+ }
+ if os.IsNotExist(err) {
+ return false, nil
+ }
+ return false, err
+}
+
+func FileAndExt(in string) (name string, ext string) {
+ ext = path.Ext(in)
+ base := path.Base(in)
+
+ if strings.Contains(base, ".") {
+ name = base[:strings.LastIndex(base, ".")]
+ } else {
+ name = in
+ }
+
+ return
+}
+
+func PathPrep(ugly bool, in string) string {
+ if ugly {
+ return Uglify(in)
+ } else {
+ return PrettifyPath(in)
+ }
+}
+
+// /section/name.html -> /section/name/index.html
+// /section/name/ -> /section/name/index.html
+// /section/name/index.html -> /section/name/index.html
+func PrettifyPath(in string) string {
+ if path.Ext(in) == "" {
+ // /section/name/ -> /section/name/index.html
+ if len(in) < 2 {
+ return "/"
+ }
+ return path.Join(path.Clean(in), "index.html")
+ } else {
+ name, ext := FileAndExt(in)
+ if name == "index" {
+ // /section/name/index.html -> /section/name/index.html
+ return path.Clean(in)
+ } else {
+ // /section/name.html -> /section/name/index.html
+ return path.Join(path.Dir(in), name, "index"+ext)
+ }
+ }
+ return in
+}