# WebUI Help Content Workflow

## Front End

When a user clicks on a `Help` icon, the browser requests the following 2 URLs.

`http://[TVH_IP]:9981/markdown/class/[TVH_CLASS]?_dc=[??TIMESTAMP??]`

`http://[TVH_IP]:9981/markdown/toc?_dc=[??TIMESTAMP??]`

Both of these URLs return markdown content. The first URL consists of the `md` file that matches the URL’s class as well as all of the contents of all of the `<tvh_include>` files present in the main file followed by an `Items` section containing a description of the properties of the URL’s class.

The second URL contains the static table-of-contents in `md` format from `/docs/markdown/toc.md`.

The markdown data is converted into HTML using the third party `marked` library. This is called from the `tvheadend.mdhelp()` method in `src/webui/static/app/tvheadend.js`.

## Build Process

The script `support/doc/md_to_c.py` is called from the `Makefile` to create the C file `src/docs_inc.c`. This script is called multiple times for multiple `md` file locations with all being centralised into a single `src/docs_inc.c` file.

Each `md` file (including the `toc`) is converted to a C `const char` array. Each element of the array is a line from the source `md` files and is wrapped in an i18n translation function. The file names from the `<tvh_include>` lines are extracted and prefixed with the string `\xff\x04` via a the `MDINCLUDE` compiler preprocessor instruction and added to the array.

At the end of `src/docs_inc.c`, all of the above arrays are then indexed in a structure called `tvh_doc_page`.

In `src/webui/webui.c’` the `/markdown` URL path is configured to be handled by `page_markdown()` in `src/webui/doc_md.c`. There are various functions that are called within this module, however, the `\xff\x04` sequence is interpreted by the function `md_render()` where the `<tvh_include>` text is inserted into the content to be returned.

Once the text from the `md` files has been assembled, the `md_props()` function in `src/webui/doc_md.c` appends the `Items` markdown to the content to be returned.

A typical finally assembled result may look like this:

`[Content from first include file]`\
`Some text or separator.`\
`[Content from second include file]`\
`Main body of the md file`\
`[Content from third include file]`\
`[Content from the internal object class definition]`

All text returned to the browser is passed through the C i18n process (JS has its own i18n process) and is capable of being rendered line-by-line into any language supported by TVH provided that a translation for that text exists.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.tvheadend.org/documentation/development/webui-help-content-workflow.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
