Динамический анализ файлов
Для разбора файлов я установил переменную для template.ParseFiles, и в настоящее время я должен вручную установить каждый файл.
Две вещи:
Как я смогу пройтись по главной папке и множеству подпапок и автоматически добавить их в ParseFiles, чтобы мне не пришлось вручную добавлять каждый файл отдельно?
Как я мог бы вызвать файл с тем же именем в подпапке, потому что в настоящее время я получаю ошибку во время выполнения, если я добавляю тот же файл имени в ParseFiles.
var templates = template.Must(template.ParseFiles(
"index.html", // main file
"subfolder/index.html" // subfolder with same filename errors on runtime
"includes/header.html", "includes/footer.html",
))
func main() {
// Walk and ParseFiles
filepath.Walk("files", func(path string, info os.FileInfo, err error) {
if !info.IsDir() {
// Add path to ParseFiles
}
return
})
http.HandleFunc("/", home)
http.ListenAndServe(":8080", nil)
}
func home(w http.ResponseWriter, r *http.Request) {
render(w, "index.html")
}
func render(w http.ResponseWriter, tmpl string) {
err := templates.ExecuteTemplate(w, tmpl, nil)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
2 ответа
Чтобы просмотреть каталог для поиска файлов, см.: http://golang.org/pkg/path/filepath/ или http://golang.org/pkg/html/template/ и http://golang.org/pkg/html/template/
Что касается вашего другого вопроса, ParseFiles использует базовое имя файла в качестве имени шаблона, что приводит к коллизии в вашем шаблоне. У вас есть два варианта
- Переименуйте файл.
- использование
t := template.New("name of your choice")
создать начальный шаблон- Используйте функцию ходьбы, которую вы уже начали, и позвоните
t.Parse("text from file")
для каждого файла шаблона. Вам придется открыть и прочитать содержимое файлов шаблона самостоятельно, чтобы перейти сюда.
- Используйте функцию ходьбы, которую вы уже начали, и позвоните
Изменить: Пример кода.
func main() {
// Walk and ParseFiles
t = template.New("my template name")
filepath.Walk("files", func(path string, info os.FileInfo, err error) {
if !info.IsDir() {
// Add path to ParseFiles
content := ""
// read the file into content here
t.Parse(content)
}
return
})
http.HandleFunc("/", home)
http.ListenAndServe(":8080", nil)
}
Таким образом, в основном я устанавливаю New("путь, который я хочу").Parse("Строка из прочитанного файла"), проходя по папкам.
var templates = template.New("temp")
func main() {
// Walk and ParseFiles
parseFiles()
http.HandleFunc("/", home)
http.ListenAndServe(":8080", nil)
}
//////////////////////
// Handle Functions //
//////////////////////
func home(w http.ResponseWriter, r *http.Request) {
render(w, "index.html")
render(w, "subfolder/index.html")
}
////////////////////////
// Reusable functions //
////////////////////////
func parseFiles() {
filepath.Walk("files", func(path string, info os.FileInfo, err error) error {
if !info.IsDir() {
filetext, err := ioutil.ReadFile(path)
if err != nil {
return err
}
text := string(filetext)
templates.New(path).Parse(text)
}
return nil
})
}
func render(w http.ResponseWriter, tmpl string) {
err := templates.ExecuteTemplate(w, tmpl, nil)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}