2018-11-23 08:07:08 -07:00
---
date: "2018-11-23:00:00+02:00"
title: "External renderers"
slug: "external-renderers"
2023-07-25 22:53:13 -06:00
sidebar_position: 60
2020-12-08 23:47:06 -07:00
toc: false
2018-11-23 08:07:08 -07:00
draft: false
Refactor docs (#23752)
This was intended to be a small followup for
https://github.com/go-gitea/gitea/pull/23712, but...here we are.
1. Our docs currently use `slug` as the entire URL, which makes
refactoring tricky (see https://github.com/go-gitea/gitea/pull/23712).
Instead, this PR attempts to make future refactoring easier by using
slugs as an extension of the section. (Hugo terminology)
- What the above boils down to is this PR attempts to use directory
organization as URL management. e.g. `usage/comparison.en-us.md` ->
`en-us/usage/comparison/`, `usage/packages/overview.en-us.md` ->
`en-us/usage/packages/overview/`
- Technically we could even remove `slug`, as Hugo defaults to using
filename, however at least with this PR it means `slug` only needs to be
the name for the **current file** rather than an entire URL
2. This PR adds appropriate aliases (redirects) for pages, so anything
on the internet that links to our docs should hopefully not break.
3. A minor nit I've had for a while, renaming `seek-help` to `support`.
It's a minor thing, but `seek-help` has a strange connotation to it.
4. The commits are split such that you can review the first which is the
"actual" change, and the second is added redirects so that the first
doesn't break links elsewhere.
---------
Signed-off-by: jolheiser <john.olheiser@gmail.com>
2023-04-27 21:33:41 -06:00
aliases:
- /en-us/external-renderers
2018-11-23 08:07:08 -07:00
menu:
sidebar:
2023-03-23 09:18:24 -06:00
parent: "administration"
2018-11-23 08:07:08 -07:00
name: "External renderers"
2023-07-25 22:53:13 -06:00
sidebar_position: 60
2018-11-23 08:07:08 -07:00
identifier: "external-renderers"
---
# Custom files rendering configuration
2020-11-27 23:12:22 -07:00
Gitea supports custom file renderings (i.e., Jupyter notebooks, asciidoc, etc.) through external binaries,
2019-03-09 14:15:45 -07:00
it is just a matter of:
2019-08-07 22:47:57 -06:00
2020-12-08 23:47:06 -07:00
- installing external binaries
- add some configuration to your `app.ini` file
- restart your Gitea instance
2018-11-23 08:07:08 -07:00
2023-09-03 12:45:20 -06:00
This supports rendering of whole files. If you want to render code blocks in markdown you would need to do something with javascript. See some examples on the [Customizing Gitea ](administration/customizing-gitea.md ) page.
2020-01-20 16:34:23 -07:00
2018-11-23 08:07:08 -07:00
## Installing external binaries
2020-11-27 23:12:22 -07:00
In order to get file rendering through external binaries, their associated packages must be installed.
2018-11-23 08:07:08 -07:00
If you're using a Docker image, your `Dockerfile` should contain something along this lines:
2020-12-08 23:47:06 -07:00
```docker
2023-07-25 22:53:13 -06:00
FROM gitea/gitea:@version@
2018-11-23 08:07:08 -07:00
[...]
COPY custom/app.ini /data/gitea/conf/app.ini
[...]
2024-05-27 07:54:19 -06:00
RUN apk --no-cache add asciidoctor freetype freetype-dev gcc g++ libpng libffi-dev pandoc python3-dev py3-pyzmq pipx
2018-11-23 08:07:08 -07:00
# install any other package you need for your external renderers
2024-05-27 07:54:19 -06:00
RUN pipx install jupyter docutils --include-deps
2018-11-23 08:07:08 -07:00
# add above any other python package you may need to install
```
## `app.ini` file configuration
add one `[markup.XXXXX]` section per external renderer on your custom `app.ini` :
2020-12-08 23:47:06 -07:00
```ini
2018-11-23 08:07:08 -07:00
[markup.asciidoc]
ENABLED = true
FILE_EXTENSIONS = .adoc,.asciidoc
2020-09-02 09:01:28 -06:00
RENDER_COMMAND = "asciidoctor -s -a showtitle --out-file=- -"
2018-11-23 08:07:08 -07:00
; Input is not a standard input but a file
IS_INPUT_FILE = false
[markup.jupyter]
ENABLED = true
FILE_EXTENSIONS = .ipynb
2021-06-23 15:09:51 -06:00
RENDER_COMMAND = "jupyter nbconvert --stdin --stdout --to html --template basic"
IS_INPUT_FILE = false
2018-11-23 08:07:08 -07:00
[markup.restructuredtext]
ENABLED = true
FILE_EXTENSIONS = .rst
2021-04-30 00:50:55 -06:00
RENDER_COMMAND = "timeout 30s pandoc +RTS -M512M -RTS -f rst"
2018-11-23 08:07:08 -07:00
IS_INPUT_FILE = false
```
2022-09-13 10:33:37 -06:00
If your external markup relies on additional classes and attributes on the generated HTML elements, you might need to enable custom sanitizer policies. Gitea uses the [`bluemonday` ](https://godoc.org/github.com/microcosm-cc/bluemonday ) package as our HTML sanitizer. The example below could be used to support server-side [KaTeX ](https://katex.org/ ) rendering output from [`pandoc` ](https://pandoc.org/ ).
2019-12-07 12:49:04 -07:00
```ini
2020-04-29 05:34:59 -06:00
[markup.sanitizer.TeX]
2019-12-07 12:49:04 -07:00
; Pandoc renders TeX segments as < span > s with the "math" class, optionally
; with "inline" or "display" classes depending on context.
2022-09-13 10:33:37 -06:00
; - note this is different from the built-in math support in our markdown parser which uses < code >
2019-12-07 12:49:04 -07:00
ELEMENT = span
ALLOW_ATTR = class
REGEXP = ^\s*((math(\s+|$)|inline(\s+|$)|display(\s+|$)))+
[markup.markdown]
ENABLED = true
FILE_EXTENSIONS = .md,.markdown
RENDER_COMMAND = pandoc -f markdown -t html --katex
```
2021-06-23 15:09:51 -06:00
You must define `ELEMENT` and `ALLOW_ATTR` in each section.
2020-04-29 05:34:59 -06:00
To define multiple entries, add a unique alphanumeric suffix (e.g., `[markup.sanitizer.1]` and `[markup.sanitizer.something]` ).
2019-12-07 12:49:04 -07:00
2021-06-23 15:09:51 -06:00
To apply a sanitisation rules only for a specify external renderer they must use the renderer name, e.g. `[markup.sanitizer.asciidoc.rule-1]` , `[markup.sanitizer.<renderer>.rule-1]` .
**Note**: If the rule is defined above the renderer ini section or the name does not match a renderer it is applied to every renderer.
2018-11-23 08:07:08 -07:00
Once your configuration changes have been made, restart Gitea to have changes take effect.
2020-04-29 05:34:59 -06:00
**Note**: Prior to Gitea 1.12 there was a single `markup.sanitiser` section with keys that were redefined for multiple rules, however,
2020-09-02 09:01:28 -06:00
there were significant problems with this method of configuration necessitating configuration through multiple sections.
2021-05-07 02:43:41 -06:00
2022-02-14 06:56:17 -07:00
### Example: HTML
Render HTML files directly:
```ini
[markup.html]
ENABLED = true
FILE_EXTENSIONS = .html,.htm
RENDER_COMMAND = cat
; Input is not a standard input but a file
IS_INPUT_FILE = true
[markup.sanitizer.html.1]
ELEMENT = div
ALLOW_ATTR = class
[markup.sanitizer.html.2]
ELEMENT = a
ALLOW_ATTR = class
```
2021-06-23 15:09:51 -06:00
### Example: Office DOCX
Display Office DOCX files with [`pandoc` ](https://pandoc.org/ ):
2022-07-27 19:22:47 -06:00
2021-06-23 15:09:51 -06:00
```ini
[markup.docx]
ENABLED = true
FILE_EXTENSIONS = .docx
RENDER_COMMAND = "pandoc --from docx --to html --self-contained --template /path/to/basic.html"
[markup.sanitizer.docx.img]
ALLOW_DATA_URI_IMAGES = true
```
The template file has the following content:
2022-07-27 19:22:47 -06:00
2021-06-23 15:09:51 -06:00
```
$body$
```
### Example: Jupyter Notebook
Display Jupyter Notebook files with [`nbconvert` ](https://github.com/jupyter/nbconvert ):
2022-07-27 19:22:47 -06:00
2021-06-23 15:09:51 -06:00
```ini
[markup.jupyter]
ENABLED = true
FILE_EXTENSIONS = .ipynb
RENDER_COMMAND = "jupyter-nbconvert --stdin --stdout --to html --template basic"
[markup.sanitizer.jupyter.img]
ALLOW_DATA_URI_IMAGES = true
```
2021-05-07 02:43:41 -06:00
## Customizing CSS
2022-07-27 19:22:47 -06:00
The external renderer is specified in the .ini in the format `[markup.XXXXX]` and the HTML supplied by your external renderer will be wrapped in a `<div>` with classes `markup` and `XXXXX` . The `markup` class provides out of the box styling (as does `markdown` if `XXXXX` is `markdown` ). Otherwise you can use these classes to specifically target the contents of your rendered HTML.
2021-05-07 02:43:41 -06:00
And so you could write some CSS:
2022-07-27 19:22:47 -06:00
2021-05-07 02:43:41 -06:00
```css
.markup.XXXXX html {
font-size: 100%;
overflow-y: scroll;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
.markup.XXXXX body {
color: #444 ;
font-family: Georgia, Palatino, 'Palatino Linotype', Times, 'Times New Roman', serif;
font-size: 12px;
line-height: 1.7;
padding: 1em;
margin: auto;
max-width: 42em;
background: #fefefe ;
}
.markup.XXXXX p {
color: orangered;
}
```
2023-07-18 10:06:43 -06:00
Add your stylesheet to your custom directory e.g `custom/public/assets/css/my-style-XXXXX.css` and import it using a custom header file `custom/templates/custom/header.tmpl` :
2022-07-27 19:22:47 -06:00
2021-05-07 02:43:41 -06:00
```html
2023-01-13 16:25:15 -07:00
< link rel = "stylesheet" href = "{{AppSubUrl}}/assets/css/my-style-XXXXX.css" / >
2021-05-07 02:43:41 -06:00
```