Динамический анализ файлов

Для разбора файлов я установил переменную для 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 использует базовое имя файла в качестве имени шаблона, что приводит к коллизии в вашем шаблоне. У вас есть два варианта

  1. Переименуйте файл.
  2. использование t := template.New("name of your choice") создать начальный шаблон
    1. Используйте функцию ходьбы, которую вы уже начали, и позвоните 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)
    }
}
Другие вопросы по тегам