Golang库:如何将Pug模板转换为HTML

Golang库:如何将Pug模板转换为HTML 有没有人知道一个能将Pug预编译为HTML的库?除了 https://github.com/Joker/jade 之外,有没有其他选择?或者,能否具体解释一下如何使用这个库?

2 回复

以下是我为此准备的包:

https://pkg.go.dev/search?q=pug

更多关于Golang库:如何将Pug模板转换为HTML的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go中处理Pug模板,除了github.com/Joker/jade外,目前没有广泛使用的成熟替代库。以下是使用该库的具体方法:

安装

go get github.com/Joker/jade

基本使用示例

1. 简单转换

package main

import (
    "fmt"
    "github.com/Joker/jade"
)

func main() {
    pugTemplate := `
doctype html
html(lang="en")
    head
        title My Page
    body
        h1 Hello, #{name}!
        p This is Pug to HTML conversion.
    `

    html, err := jade.Parse("template", pugTemplate)
    if err != nil {
        panic(err)
    }
    
    fmt.Println(html)
}

2. 带变量的模板

package main

import (
    "bytes"
    "fmt"
    "github.com/Joker/jade"
    "html/template"
)

func main() {
    // Pug模板
    pugStr := `
doctype html
html
    body
        h1 #{Title}
        each item in Items
            li= item
    `

    // 解析Pug
    htmlStr, err := jade.Parse("template", pugStr)
    if err != nil {
        panic(err)
    }

    // 使用Go标准模板引擎渲染变量
    tmpl, err := template.New("html").Parse(htmlStr)
    if err != nil {
        panic(err)
    }

    data := struct {
        Title string
        Items []string
    }{
        Title: "My List",
        Items: []string{"Go", "Pug", "HTML"},
    }

    var buf bytes.Buffer
    err = tmpl.Execute(&buf, data)
    if err != nil {
        panic(err)
    }

    fmt.Println(buf.String())
}

3. 从文件读取Pug模板

package main

import (
    "fmt"
    "github.com/Joker/jade"
    "io/ioutil"
    "log"
)

func main() {
    // 读取.pug文件
    pugBytes, err := ioutil.ReadFile("template.pug")
    if err != nil {
        log.Fatal(err)
    }

    html, err := jade.Parse("template", string(pugBytes))
    if err != nil {
        log.Fatal(err)
    }

    // 输出或保存HTML
    fmt.Println(html)
    
    // 保存到文件
    err = ioutil.WriteFile("output.html", []byte(html), 0644)
    if err != nil {
        log.Fatal(err)
    }
}

4. 集成到HTTP服务器

package main

import (
    "github.com/Joker/jade"
    "html/template"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    pugTemplate := `
doctype html
html
    body
        h1 Welcome #{.Name}
        p Current path: #{.Path}
    `

    // 解析Pug
    htmlStr, err := jade.Parse("page", pugTemplate)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // 创建Go模板
    tmpl, err := template.New("webpage").Parse(htmlStr)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // 执行模板
    data := struct {
        Name string
        Path string
    }{
        Name: "User",
        Path: r.URL.Path,
    }
    
    err = tmpl.Execute(w, data)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

注意事项

  1. jade.Parse() 第一个参数是模板名称,用于错误报告
  2. 该库支持大部分Pug语法,但可能不支持最新的Pug特性
  3. 变量插值使用 #{variable} 语法
  4. 输出的是纯HTML字符串,需要配合 html/template 进行数据绑定

目前Go生态中Pug模板处理库选择有限,github.com/Joker/jade 是相对最完整的实现。如果需要更完整的Pug特性支持,可能需要考虑使用Node.js工具链预编译,或在Go中调用外部进程处理。

回到顶部