2016-03-21 19:28:42 -04:00
|
|
|
// Copyright 2016 The Hugo Authors. All rights reserved.
|
2015-12-10 17:19:38 -05:00
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
|
2014-11-04 00:39:37 -05:00
|
|
|
package target
|
|
|
|
|
|
|
|
import (
|
|
|
|
"html/template"
|
|
|
|
"io"
|
2014-11-06 11:06:29 -05:00
|
|
|
"path/filepath"
|
2014-11-04 00:39:37 -05:00
|
|
|
|
|
|
|
"github.com/spf13/hugo/helpers"
|
|
|
|
"github.com/spf13/hugo/hugofs"
|
|
|
|
)
|
|
|
|
|
|
|
|
type PagePublisher interface {
|
|
|
|
Translator
|
|
|
|
Publish(string, template.HTML) error
|
|
|
|
}
|
|
|
|
|
|
|
|
type PagePub struct {
|
2015-03-11 13:34:57 -04:00
|
|
|
UglyURLs bool
|
2014-11-04 00:39:37 -05:00
|
|
|
DefaultExtension string
|
|
|
|
PublishDir string
|
2016-11-26 09:50:32 -05:00
|
|
|
|
|
|
|
// LangDir will contain the subdir for the language, i.e. "en", "de" etc.
|
|
|
|
// It will be empty if the site is rendered in root.
|
|
|
|
LangDir string
|
2017-01-10 04:55:03 -05:00
|
|
|
|
|
|
|
Fs *hugofs.Fs
|
2014-11-04 00:39:37 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func (pp *PagePub) Publish(path string, r io.Reader) (err error) {
|
|
|
|
|
|
|
|
translated, err := pp.Translate(path)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-01-10 04:55:03 -05:00
|
|
|
return helpers.WriteToDisk(translated, r, pp.Fs.Destination)
|
2014-11-04 00:39:37 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func (pp *PagePub) Translate(src string) (dest string, err error) {
|
2015-05-15 18:11:39 -04:00
|
|
|
dir, err := pp.TranslateRelative(src)
|
|
|
|
if err != nil {
|
|
|
|
return dir, err
|
|
|
|
}
|
|
|
|
if pp.PublishDir != "" {
|
|
|
|
dir = filepath.Join(pp.PublishDir, dir)
|
|
|
|
}
|
|
|
|
return dir, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pp *PagePub) TranslateRelative(src string) (dest string, err error) {
|
2014-12-07 13:48:00 -05:00
|
|
|
if src == helpers.FilePathSeparator {
|
2014-11-04 00:39:37 -05:00
|
|
|
return "index.html", nil
|
|
|
|
}
|
|
|
|
|
2014-11-06 11:06:29 -05:00
|
|
|
dir, file := filepath.Split(src)
|
2015-05-14 15:37:53 -04:00
|
|
|
isRoot := dir == ""
|
2014-11-06 11:06:29 -05:00
|
|
|
ext := pp.extension(filepath.Ext(file))
|
2014-11-04 00:39:37 -05:00
|
|
|
name := filename(file)
|
|
|
|
|
2016-11-26 09:50:32 -05:00
|
|
|
// TODO(bep) Having all of this path logic here seems wrong, but I guess
|
|
|
|
// we'll clean this up when we redo the output files.
|
|
|
|
// This catches the home page in a language sub path. They should never
|
|
|
|
// have any ugly URLs.
|
|
|
|
if pp.LangDir != "" && dir == helpers.FilePathSeparator && name == pp.LangDir {
|
|
|
|
return filepath.Join(dir, name, "index"+ext), nil
|
|
|
|
}
|
|
|
|
|
2015-05-14 15:37:53 -04:00
|
|
|
if pp.UglyURLs || file == "index.html" || (isRoot && file == "404.html") {
|
2016-11-18 16:38:41 -05:00
|
|
|
return filepath.Join(dir, name+ext), nil
|
2014-11-04 00:39:37 -05:00
|
|
|
}
|
|
|
|
|
2016-11-18 16:38:41 -05:00
|
|
|
return filepath.Join(dir, name, "index"+ext), nil
|
2014-11-04 00:39:37 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func (pp *PagePub) extension(ext string) string {
|
|
|
|
switch ext {
|
|
|
|
case ".md", ".rst": // TODO make this list configurable. page.go has the list of markup types.
|
|
|
|
return ".html"
|
|
|
|
}
|
|
|
|
|
|
|
|
if ext != "" {
|
|
|
|
return ext
|
|
|
|
}
|
|
|
|
|
|
|
|
if pp.DefaultExtension != "" {
|
|
|
|
return pp.DefaultExtension
|
|
|
|
}
|
|
|
|
|
|
|
|
return ".html"
|
|
|
|
}
|