blob: bad41677ad496a4841f761a2276dbe47cfd16617 [file] [log] [blame] [view]
<nav class="toc">
<h2>Contents</h2>
<ul>
<li><a href="#docstring-formatting">Docstring Formatting</a></li>
<li><a href="#custom-output">Custom Output</a></li>
<li><a href="#proto-output">Proto Output</a></li>
</ul>
</nav>
This document covers a number of advanced topics pertaining to using Stardoc.
<a name="docstring-formatting"></a>
## Docstring Formatting
You may want to inline various kinds of formatting in the docstrings adjacent
to your Starlark code. Use standard markdown formatting constructs instead of
HTML tags.
For example:
```starlark
def my_function(foo, bar):
"""Does some cool stuff.
Oh, by the way, have you heard about [Stardoc](https://github.com/bazelbuild/stardoc)?
Args:
foo: You don't know what a **foo** is?
bar: Two variables, `x` and `y`, walk in to a bar...
"""
...
```
Markdown formatting constructs are handled appropriately by Stardoc's default
output format ("markdown_tables"), even as part of a table.
<a name="custom-output"></a>
## Custom Output
Stardoc's output format is customizable; while Stardoc's output is markdown
by default, you may define a different output format for your documentation.
Customization is done at the level of "output templates". To customize the
doc output for a particular type of Starlark definition (such as a "rule" or a
"function"), you will need to:
1. Create a new custom output template to describe how this type of object should
be rendered.
2. In your `stardoc()` target, set the matching `_template` attribute to point to
your new output template.
For example, you might want to change the way rule documentation is generated.
You might create a new output template file `package/rule.vm` and then define your
`stardoc` target as follows:
```python
stardoc(
name = "my_docs",
input = "my_rule.bzl",
out = "my_rule_doc.md",
rule_template = "//package:rule.vm",
)
```
The default values for the available templates may be found under
[templates/markdown_tables](../stardoc/templates/markdown_tables). See the
[Stardoc rule documentation](stardoc_rule.md) for a comprehensive list of which
'_template' attributes are available.
### Writing a custom output template
Stardoc's output templates are defined using
[Velocity Template Language (VTL)](https://velocity.apache.org/engine/1.7/user-guide.html)
with utilities and model objects available in the evaluation context.
The full comprehensive list of available utilities top-level objects is available in
[the source for MarkdownRenderer](../src/main/java/com/google/devtools/build/stardoc/rendering/MarkdownRenderer.java).
Information available for raw model objects (such rule information) is defined by
Stardoc's underlying [proto schema](../stardoc/proto/stardoc_output.proto), vendored
[from the Bazel source tree](https://github.com/bazelbuild/bazel/blob/master/src/main/protobuf/stardoc_output.proto).
This is a particularly advanced feature of Stardoc, so we would recommend using
one of the existing canonical [templates](../stardoc/templates/markdown_tables) as a
springboard to get started.
<a name="proto-output"></a>
## Proto Output
Stardoc provides the option to output documentation information in raw proto
format. You may find this useful if you need output customization beyond
Stardoc's current custom-output-template capabilities: you might prefer to build
your own custom output renderer binary using the data that Stardoc acquires by
fully evaluating a Starlark file. If your changes could be incorporated into
Stardoc, please first consider [contributing](contributing.md) instead.
The proto schema may be found under
[stardoc/proto/stardoc_output.proto](../stardoc/proto/stardoc_output.proto), vendored
[from the Bazel source tree](https://github.com/bazelbuild/bazel/blob/master/src/main/protobuf/stardoc_output.proto).
To configure stardoc to output raw proto instead of markdown, use the `format`
attribute of the [stardoc rule](stardoc_rule.md#stardoc-format). Specify `"proto"`.
An example:
```starlark
stardoc(
name = "docs_proto_output",
out = "doc_output.raw",
input = ":my_rule.bzl",
deps = [":my_lib"],
format = "proto",
)
# Define a proto_library target to incorporate the stardoc_output_proto
proto_library(
name = "stardoc_output_proto",
srcs = ["@stardoc//stardoc/proto:stardoc_output.proto"],
)
# You'll need to define your own rendering target. This might be a
# `genrule` or your own custom rule.
genrule(
name = "docs_markdown_output",
tools = ["my_renderer.sh"],
srcs = ["doc_output.raw"],
outs = ["doc_output.md"],
cmd = "$(location :my_renderer.sh) $@ $(SRCS)",
)
```