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)
}

注意事项

  1. 该库使用了强大的正则表达式库进行解析
  2. 支持自定义标签处理,可以扩展功能
  3. 如果遇到问题,可以随时提出问题

bbConvert是一个功能强大且灵活的BBCode处理库,适用于各种需要BBCode到HTML转换的场景。通过自定义标签处理器,你可以轻松扩展其功能以满足特定需求。


更多关于golang实现BBCode转HTML并支持自定义标签的插件库bbConvert的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于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/&lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;" class="user-mention">@&lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;</a>

bbConvert是一个灵活且易于扩展的BBCode转换库,通过自定义标签处理器,你可以轻松地扩展它来满足各种需求。

回到顶部