Skip to content

Commit

Permalink
source: Normalize file name to NFC
Browse files Browse the repository at this point in the history
Fixes #2203
  • Loading branch information
ks888 authored and bep committed Aug 8, 2016
1 parent b33bfd4 commit 39df772
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 0 deletions.
7 changes: 7 additions & 0 deletions source/filesystem.go
Expand Up @@ -18,9 +18,11 @@ import (
"os"
"path/filepath"
"regexp"
"runtime"
"strings"

"github.com/spf13/hugo/hugofs"
"golang.org/x/text/unicode/norm"

"github.com/spf13/viper"

Expand Down Expand Up @@ -66,6 +68,11 @@ func (f *Filesystem) Files() []*File {
func (f *Filesystem) add(name string, reader io.Reader) (err error) {
var file *File

if runtime.GOOS == "darwin" {
// When a file system is HFS+, its filepath is in NFD form.
name = norm.NFC.String(name)
}

file, err = NewFileFromAbs(f.Base, name, reader)

if err == nil {
Expand Down
27 changes: 27 additions & 0 deletions source/filesystem_test.go
Expand Up @@ -16,6 +16,8 @@ package source
import (
"bytes"
"path/filepath"
"runtime"
"strings"
"testing"
)

Expand Down Expand Up @@ -82,3 +84,28 @@ func TestAddFile(t *testing.T) {
}
}
}

func TestUnicodeNorm(t *testing.T) {
if runtime.GOOS != "darwin" {
// Normalization code is only for Mac OS, since it is not necessary for other OSes.
return
}

paths := []struct {
NFC string
NFD string
}{
{NFC: "å", NFD: "\x61\xcc\x8a"},
{NFC: "é", NFD: "\x65\xcc\x81"},
}

for _, path := range paths {
src := new(Filesystem)
_ = src.add(path.NFD, strings.NewReader(""))
f := src.Files()[0]
if f.BaseFileName() != path.NFC {
t.Fatalf("file name in NFD form should be normalized (%s)", path.NFC)
}
}

}

0 comments on commit 39df772

Please sign in to comment.