unreal-doc 1.0.9

Tool for generating documentation from Unreal C++ sources.
# Unreal Doc

Tool for generating documentation from Unreal C++ sources.

## Table of contents

1. [About]#about
1. [Installation]#installation
1. [Config file]#config-file
    1. [Simple config setup for baking into JSON portable format]#simple-config-setup-for-baking-into-json-portable-format
    1. [Simple config setup for baking into MD Book]#simple-config-setup-for-baking-into-md-book
    1. [Advanced config setup for baking into MD Book]#advanced-config-setup-for-baking-into-md-book
1. [Markdown doc comments]#markdown-doc-comments
1. [Markdown book pages]#markdown-book-pages
1. [Run documentation baking command]#run-documentation-baking-command
1. [Examples]#examples

## About


Do you create an Unreal Engine plugin and need to generate a documentation combined with book
for it, but Doxygen seems limited or sometimes not working at all?

Fear not - this tool understands Unreal C++ header files syntax and Markdown doc comments, it
can also bake a book pages out of Markdown files, all of that being able to cross-reference
each other!

## Installation


- Installation using `cargo-install` from [Rust toolset]https://rustup.rs/:
    ```bash
    cargo install unreal-doc

    ```
- [Pre-built binaries]https://github.com/PsichiX/unreal-doc/releases

## Config file


Config TOML file tells this tool evenrythig about how to build documentation for your project.
At this moment there are two baking backends available:
- **`Json`**
    
    Portable representation of documentation and book that can be used in third party
    applications with custom way of baking documentation.

- **`MdBook`**

    Uses [MD Book]https://github.com/rust-lang/mdBook for baking HTML5 bundle for online or
    offline web books.

> Although config file can be named whatever you want, it's a good rule to give config file
`UnrealDoc.toml` name.

### Simple config setup for baking into JSON portable format


```toml
input_dirs = ["./source"]
output_dir = "./docs"
```

- `input_dirs`
    
    List of directories and Unreal C++ header or Markdown files this tool should read.

- `output_dir`

    Path to directory where generated documentation should be put.

### Simple config setup for baking into MD Book


```toml
input_dirs = ["./source"]
output_dir = "./docs"
backend = "MdBook"

[backend_mdbook]
title = "Documentation"
build = true
cleanup = true
```

- `backend`
    
    Specifies MD Book baking backend.

- `backend_mdbook.title`

    Title of the generated documentation and book bundle.

- `backend_mdbook.build`

    Set to true if this tool should also run `mdbook build` command on generated files to
    build HTML5 version of the bundle, ready to put online.

- `backend_mdbook.cleanup`

    Set to true if this tool should cleanup `output_dir` directory before baking new files.
    Useful for ensuring no old/unwanted files will exist between iterations of documentation
    baking.

### Advanced config setup for baking into MD Book


```toml
input_dirs = ["./source"]
output_dir = "./docs"
backend = "MdBook"

[settings]
document_private = true
document_protected = true
show_all = true

[backend_mdbook]
title = "Documentation"
build = true
cleanup = true
header = "header.md"
footer = "footer.md"
assets = "assets/"
```

- `backend_mdbook.header`

    Path to file that contains Markdown content that will be put on every documentation and
    book page header section.

- `backend_mdbook.footer`

    Path to file that contains Markdown content that will be put on every documentation and
    book page footer section.

- `backend_mdbook.assets`

    Path to directory that contains assets (usually images/animations/videos) referenced in
    documentation and book pages.

## Markdown doc comments


Overview of all possible things you can do with Markdown doc comments.
```c++
#pragma once


using Foo = std::vector<int>;

enum class Something : uint8;

template <typename T>
struct BAR Foo : public Bar;

class FOO Bar;

template <typename T>
void* Main(const Foo& Arg);

/// Description of enum
///
/// More information and examples.
UENUM(BlueprintType, Meta = (Foo = Bar))
enum class Something : uint8
{
	A,
	B
};

/// Description of struct
///
/// More information and examples.
///
/// [`struct: Self::Foo`]()
/// [`struct: Self::A`]()
USTRUCT(BlueprintType, Meta = (Foo = Bar))
template <typename T>
struct BAR Foo : public Bar
{
protected:
	/// What is this method
	///
	/// What it does
	UFUNCTION()
	virtual void Foo(
		/// Argument
		int A,
		/// Argument with default value
		AActor* B = nullptr) const override;

private:
	/// What is this property
	///
	/// What impact does it have
	UPROPERTY()
	int A[] = {0};
};

/// Description of class
///
/// More information and examples.
///
/// [`class: Self::Bar`]()
UCLASS()
class FOO Bar
{
public:
	/// What is this method
	///
	/// What it does
	Bar();
};

/// What is this function
///
/// What does it do
///
/// [`function: Self`]()
///
/// See:
/// - [`enum: Something`]()
/// - [`struct: Foo`]()
/// - [`struct: Foo::Foo`]()
/// - [`struct: Foo::A`]()
/// - [`class: Bar`]()
/// - [`function: Main`]()
///
/// # Examples
/// ```snippet
/// hello_world
/// ```
/// ```snippet
/// hello_world2
/// ```
/// ```snippet
/// wait_what
/// ```
template <typename T>
void* Main(
	/// Some referenced data
	const Foo& Arg)
{
	//// [snippet: hello_world]
	if (true)
	{
		printf("Hello");
	}
	//// [/snippet]

	//// [snippet: hello_world2]
	printf("World");
	//// [/snippet]
}

//// [snippet: wait_what]
struct Wait
{
	int What = 0;
};
//// [/snippet]

/// Proxy documentation for injecting code with macros.
///
//// [proxy: injectable]
//// void Injected() const;
//// [/proxy]
#define INJECT            \

	void Injected() const \
	{                     \
	}

struct Who
{
	int What = 0;

	void SetWhat(int InWhat)
	{
		//// [ignore]
		this->What = InWhat;
		//// [/ignore]
	}

    /// Operator overload.
	friend bool operator==(const Who& Lhs, const Who& Rhs)
	{
		//// [ignore]
		return Lhs.What == Rhs.What;
		//// [/ignore]
	}

	//// [inject: injectable]
	INJECT
};
```

## Markdown book pages


Standard expected structure of the book Markdown files:

- `documentation.md` (optional)

    This is essentially the content of main page of your documentation + book,
    a hello page you can call it. it has to be placed in root of book source
    Markdown files directory.

- `index.txt` (required)

    This file contains a list of files or directories with optional names (useful
    mostly for directories). The order specified in this file will match order on
    side pages index.

    ```
    some_book_page.md
    directory_with_subpages: Title on side pages index
    ```

- `index.md` (optional)

    Markdown file content used in to describe content of given directory content.
    First line of the content will be used as title of the directory on side pages
    index.

    ```md
    # Book

    Optional directory content description
    ```

- `hello.md`

    Content for given book page. First line will be used as page title on side
    pages index.

        # Hello World!

        Lorem ipsum dolor amet

        ```cpp
        void main() {
            printf("Hello World!");
        }
        ```

## Run documentation baking command


Once you have config file and documentation itself all in place, it's time to
actually bake documentation and book bundle:

```bash
unreal-doc -i path/to/UnrealDoc.toml
```

## Example


If you want to see an example of decoumentation and book source files structure,
take a look at [/resources](/resources) directory in this repository or more real
life example that can be found here:
https://github.com/PsichiX/Unreal-Systems-Architecture/tree/master/Plugins/Systems/Documentation

Real life example of baked plugin documentation:
https://psichix.github.io/Unreal-Systems-Architecture/systems