本文档解释了 Gitea 中使用的模板和渲染系统。它涵盖了模板的组织方式、内容的渲染方式(特别是 markdown),以及渲染流程如何工作。有关模板的国际化和本地化信息,请参阅 配置和国际化。
Gitea 使用 Go 的 HTML 模板引擎来渲染其 Web 界面。模板系统包括
templates/ 目录中的模板文件(.tmpl)modules/templates 包中定义的模板辅助函数来源:templates/base/head.tmpl templates/base/footer.tmpl templates/repo/header.tmpl templates/user/profile.tmpl templates/org/home.tmpl
Gitea 中的模板遵循层级结构
templates/base/):定义页面的通用结构模板文件使用 .tmpl 扩展名,并按功能区域组织。例如,与仓库相关的模板位于 templates/repo/,与用户相关的模板位于 templates/user/ 等。
渲染流程在 Gitea 中处理从初始 HTTP 请求到最终 HTML 响应的所有内容。
来源:modules/markup/markdown/markdown.go147-198 routers/web/user/profile.go38-91 routers/web/org/home.go28-192
每个请求处理程序都会准备一个包含以下内容的上下文:
此上下文将传递给模板并用于渲染。上下文对象定义在 services/context 包中,并由不同的处理程序扩展。
模板根据处理程序进行选择,并使用 Go 的 html/template 包进行渲染。该过程通常遵循:
ctx.HTML() 使用准备好的数据渲染模板来自 user/profile.go 的示例
来源:routers/web/user/profile.go56-91 routers/web/org/home.go49-148
Gitea 渲染系统的一个关键部分是 Markdown 处理,它将用户提供的 Markdown 内容转换为 HTML。
来源:modules/markup/markdown/markdown.go104-146 modules/markup/html.go131-152 modules/markup/sanitizer.go
Markdown 渲染过程涉及几个关键组件:
modules/markup/markdown/markdown.go定义在 modules/markup 包中的 RenderContext 携带渲染的重要信息:
此上下文在整个渲染流程中传递,并影响内容的处理和显示方式。
来源:modules/markup/markdown/markdown.go58-67 modules/markup/html.go136-152
Markdown 转换为 HTML 后,Gitea 会执行几个后处理步骤:
后处理实现在 modules/markup/html.go 中,使用 PostProcessDefault 函数,该函数将一系列处理器应用于 HTML 内容。
来源:modules/markup/html.go131-152 modules/markup/html_test.go492-528
Gitea 提供了一系列丰富的辅助函数供模板使用。这些函数定义在 modules/templates/helper.go 中,并提供诸如以下功能:
来源:modules/templates/helper.go28-182 templates/repo/header.tmpl modules/templates/util_render.go
下表列出了一些常用的模板辅助函数:
| 功能 | 目的 | 示例 |
|---|---|---|
SafeHTML | 将原始内容渲染为 HTML。 | {{SafeHTML .Content}} |
HTMLEscape | 转义 HTML 特殊字符。 | {{HTMLEscape .Title}} |
DateUtils.TimeSince | 将时间格式化为相对时间。 | {{DateUtils.TimeSince .CreatedUnix}} |
svg | 渲染 SVG 图标。 | {{svg "octicon-git-pull-request"}} |
AppSubUrl | 获取应用程序的基础 URL。 | {{AppSubUrl}}/user/login |
ctx.Locale.Tr | 翻译字符串。 | {{ctx.Locale.Tr "repo.issues"}} |
QueryBuild | 构建查询字符串。 | {{QueryBuild "/user/settings" "tab=repos"}} |
来源:modules/templates/helper.go29-182 modules/templates/util_render.go36-96
Gitea 为不同类型的内容提供了特殊的渲染功能。
提交消息在渲染时会特别处理链接、问题引用和格式。
来源: modules/templates/util_render.go36-52 user/dashboard/feeds.tmpl86-104
问题和拉取请求标题以易读性和链接为重点进行渲染
来源: modules/templates/util_render.go227-236 user/notification/notification_div.tmpl54-60
Context 对象在 Gitea 的渲染系统中起着至关重要的作用,它将数据传递给各个组件
来源: routers/web/user/profile.go56-91 modules/markup/markdown/markdown.go58-67 modules/markup/html.go241-240
ctx.Data 中{{.SomeVariable}} 这样的变量来访问数据RenderContext) 的 RenderContextGitea 提供了多种方式来扩展和定制渲染系统
custom/templates/ 目录中创建自定义模板ctx.Data 映射注入自定义数据markup.Renderer 接口以支持自定义内容类型定制模板或扩展渲染系统时
来源: modules/markup/renderer.go14-74 modules/templates/helper.go28-182
Gitea 通过 CSS 类为渲染后的内容应用一致的样式
.markup 类应用于渲染内容容器渲染内容的 CSS 定义在 web_src/css/markup/content.css 中。
来源: web_src/css/markup/content.css1-568
Gitea 中的模板和渲染系统是一个全面的框架,负责
该系统使 Gitea 能够提供一致、功能丰富且安全的 UI,同时保持定制的灵活性。