golang实现BBCode转HTML并支持自定义标签的插件库bbConvert的使用
Golang实现BBCode转HTML并支持自定义标签的插件库bbConvert的使用
简介
bbConvert是一个简单易用的库,用于处理BBCode和Markdown并将其转换为HTML。BBCode还支持自定义处理,允许使用自定义标签甚至转换为HTML以外的格式。
安装
go get github.com/CalebQ42/bbConvert
基本使用示例
package main
import (
"fmt"
"github.com/CalebQ42/bbConvert"
)
func main() {
// 创建转换器实例
converter := bbConvert.New()
// BBCode文本
bbcode := `[b]粗体文本[/b]
[i]斜体文本[/i]
[url=https://example.com]示例链接[/url]`
// 转换为HTML
html, err := converter.Convert(bbcode)
if err != nil {
fmt.Println("转换出错:", err)
return
}
fmt.Println(html)
}
支持的自定义标签
bbConvert支持多种BBCode标签,包括但不限于:
- 文本格式化:
[b]
,[i]
,[u]
,[s]
- 字体样式:
[font]
,[size]
,[color]
- 链接:
[url]
,[link]
- 多媒体:
[img]
,[youtube]
- 列表:
[ul]
,[ol]
- 对齐:
[align]
,[float]
自定义标签处理
你可以注册自定义标签处理器:
package main
import (
"fmt"
"github.com/CalebQ42/bbConvert"
)
func main() {
converter := bbConvert.New()
// 注册自定义标签处理器
converter.RegisterTag("custom", func(tag *bbConvert.Tag) string {
// 获取标签属性
attr := tag.Attributes()
// 获取标签内容
content := tag.Content()
// 自定义处理逻辑
return fmt.Sprintf(`<div class="custom-tag" data-attr="%s">%s</div>`, attr, content)
})
bbcode := `[custom attr="value"]自定义内容[/custom]`
html, _ := converter.Convert(bbcode)
fmt.Println(html)
}
完整示例
下面是一个完整的示例,展示如何使用bbConvert处理复杂的BBCode:
package main
import (
"fmt"
"github.com/CalebQ42/bbConvert"
)
func main() {
converter := bbConvert.New()
// 注册自定义标签
converter.RegisterTag("spoiler", func(tag *bbConvert.Tag) string {
return fmt.Sprintf(`<div class="spoiler"><button onclick="this.nextElementSibling.style.display='block'">显示剧透</button><div style="display:none">%s</div></div>`, tag.Content())
})
// 复杂的BBCode示例
bbcode := `
[title]文章标题[/title]
[t2]副标题[/t2]
[b]这是一段粗体文本[/b],[i]这是斜体[/i],[u]这是下划线[/u]。
[color=red]红色文字[/color],[size=16pt]大号文字[/size]
[url=https://example.com]示例网站[/url]
[img]https://example.com/image.jpg[/img]
[youtube]dQw4w9WgXcQ[/youtube]
[spoiler]这里是剧透内容[/spoiler]
[ul]
* 项目1
* 项目2
[/ul]
`
html, err := converter.Convert(bbcode)
if err != nil {
fmt.Println("转换出错:", err)
return
}
fmt.Println("转换结果:")
fmt.Println(html)
}
注意事项
- 该库使用了强大的正则表达式库进行解析
- 支持自定义标签处理,可以扩展功能
- 如果遇到问题,可以随时提出问题
bbConvert是一个功能强大且灵活的BBCode处理库,适用于各种需要BBCode到HTML转换的场景。通过自定义标签处理器,你可以轻松扩展其功能以满足特定需求。
更多关于golang实现BBCode转HTML并支持自定义标签的插件库bbConvert的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实现BBCode转HTML并支持自定义标签的插件库bbConvert的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用bbConvert实现BBCode转HTML并支持自定义标签
bbConvert是一个轻量级的Go库,用于将BBCode转换为HTML,同时支持自定义标签扩展。下面我将介绍如何使用这个库以及如何扩展自定义标签。
基本安装
首先安装bbConvert库:
go get github.com/StalkR/bbconvert
基本用法
package main
import (
"fmt"
"github.com/StalkR/bbconvert"
)
func main() {
// 创建转换器实例
converter := bbconvert.NewConverter()
// 示例BBCode文本
bbcode := `[b]粗体[/b] [i]斜体[/i] [u]下划线[/u]
[url=https://example.com]链接[/url]
[img]https://example.com/image.jpg[/img]
[color=red]红色文字[/color]`
// 转换为HTML
html := converter.Convert(bbcode)
fmt.Println(html)
}
输出结果:
<strong>粗体</strong> <em>斜体</em> <u>下划线</u>
<a href="https://example.com">链接</a>
<img src="https://example.com/image.jpg" alt=""/>
<span style="color:red">红色文字</span>
支持的标准标签
bbConvert默认支持以下BBCode标签:
- [b][/b] →
<strong>
- [i][/i] →
<em>
- [u][/u] →
<u>
- [s][/s] →
<del>
- [url][/url] →
<a>
- [img][/img] →
<img>
- [code][/code] →
<pre><code>
- [quote][/quote] →
<blockquote>
- [color=…][/color] →
<span style="color:...">
- [size=…][/size] →
<span style="font-size:...">
自定义标签扩展
bbConvert的强大之处在于可以轻松添加自定义标签处理器:
package main
import (
"fmt"
"github.com/StalkR/bbconvert"
)
func main() {
converter := bbconvert.NewConverter()
// 添加自定义标签处理器
converter.AddTag("youtube", func(content, arg string) string {
if arg == "" {
return content // 如果没有参数,直接返回内容
}
// 返回YouTube嵌入代码
return fmt.Sprintf(`<iframe width="560" height="315" src="https://www.youtube.com/embed/%s" frameborder="0" allowfullscreen></iframe>`, arg)
})
// 添加另一个自定义标签
converter.AddTag("spoiler", func(content, arg string) string {
title := "剧透警告"
if arg != "" {
title = arg
}
return fmt.Sprintf(`<div class="spoiler"><button onclick="this.nextElementSibling.style.display='block'">%s</button><div style="display:none">%s</div></div>`,
title, content)
})
// 使用自定义标签
bbcode := `[youtube]dQw4w9WgXcQ[/youtube]
[spoiler=结局剧透]主角最后死了[/spoiler]`
html := converter.Convert(bbcode)
fmt.Println(html)
}
输出结果:
<iframe width="560" height="315" src="https://www.youtube.com/embed/dQw4w9WgXcQ" frameborder="0" allowfullscreen></iframe>
<div class="spoiler"><button onclick="this.nextElementSibling.style.display='block'">结局剧透</button><div style="display:none">主角最后死了</div></div>
高级用法:修改默认标签
你也可以覆盖默认的标签处理器:
// 修改默认的[b]标签处理器
converter.AddTag("b", func(content, arg string) string {
return fmt.Sprintf(`<span style="font-weight:800">%s</span>`, content)
})
// 修改默认的[url]标签处理器,添加nofollow属性
converter.AddTag("url", func(content, arg string) string {
if arg == "" {
return fmt.Sprintf(`<a href="%s" rel="nofollow">%s</a>`, content, content)
}
return fmt.Sprintf(`<a href="%s" rel="nofollow">%s</a>`, arg, content)
})
安全性考虑
当处理用户输入的BBCode时,应该考虑HTML注入安全问题。bbConvert默认不会对内容进行HTML转义,因此建议:
import "html"
// 安全的标签处理器示例
converter.AddTag("safe", func(content, arg string) string {
// 对内容进行HTML转义
escapedContent := html.EscapeString(content)
return fmt.Sprintf(`<div class="safe-content">%s</div>`, escapedContent)
})
完整示例
下面是一个完整的示例,包含自定义标签和安全性处理:
package main
import (
"fmt"
"html"
"github.com/StalkR/bbconvert"
)
func main() {
converter := bbconvert.NewConverter()
// 添加自定义标签
converter.AddTag("center", func(content, arg string) string {
return fmt.Sprintf(`<div style="text-align:center">%s</div>`, content)
})
converter.AddTag("user", func(content, arg string) string {
escaped := html.EscapeString(content)
return fmt.Sprintf(`<a href="/user/%s" class="user-mention">@%s</a>`, escaped, escaped)
})
// 用户输入的BBCode
userInput := `[center]居中内容[/center]
[user]<script>alert('xss')</script>[/user]`
// 转换
htmlOutput := converter.Convert(userInput)
fmt.Println(htmlOutput)
}
输出结果:
<div style="text-align:center">居中内容</div>
<a href="/user/<script>alert('xss')</script>" class="user-mention">@<script>alert('xss')</script></a>
bbConvert是一个灵活且易于扩展的BBCode转换库,通过自定义标签处理器,你可以轻松地扩展它来满足各种需求。