This repository was archived by the owner on Aug 18, 2026. It is now read-only.

Latest commit

History

360 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Documentation Generator

Generates documentation based upon a yaml- or JSON-file. Describe how your database looks, in a single file (or files) and then generate the corresponding documentation.

Warning

Documentation Generator is being sunset! Instead of maintaining two separate projects, the Documentation Generator will be merged into: Provenance

To Help you transition, you can use convert_to_provenance.py to convert your existing Documentation Generator JSON files to the Provenance format. The script will handle the necessary transformations to ensure compatibility with Provenance.

This document covers:

Badges

GitHub Release


Idea of the Documentation Generator

The basic idea of the Documentation Generator is one place to have a single model and then generate and distribute documentation into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["documentation file"] docgen["Documentation Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The documentation file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json

Example of a documentation file:

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.jsondocumentationTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json",
"documentationTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

See an example in the demo where generator-configuration.yml is located.

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then it's fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md
- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md

Destinations

Destination is the where Documentation Generator will send the documentation. You can implement you own if you want or use these.

DirectoryDestination

Class name: dk.fust.docgen.destination.DirectoryDestination

Sends to separate files in the directory

SettingTypeDescriptionDefault
directoryFileWhere the files will be stored
createParentDirectoriesbooleanShould the directory's parent directories be created if missingfalse

FileDestination

Class name: dk.fust.docgen.destination.FileDestination

Replace an entire file with the document.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

Base64FileDestination

Class name: dk.fust.docgen.destination.Base64FileDestination

Base64 decodes the document and replaces the entire file with binary content. Can for instance be used in conjunction with ExcelBase64TableFormatter.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

MarkdownDestination

Class name: dk.fust.docgen.destination.MarkdownDestination

SettingTypeDescriptionDefault
fileFileMarkdown file to be updated

In order for the MarkdownDestination being able to substitute parts of a markdown-file, you'll mark a start and an end placeholder, and everything in between will be substituted.

Markup in Markdown

For instance this shows a substitution with the key MY_KEY, where the beginning and end is. Everything in between will be substituted.

[//]: #MY_KEY_START()
... this is replaced ...
[//]: #MY_KEY_END()

ConfluenceDestination

Class name: dk.fust.docgen.confluence.destination.ConfluenceDestination

In order to use Confluence as destination, you'll need to add the extension documentation-generator-confluence.

Read the documentation here


Table format

Some generators use tables and needs a formatter to create a string representation of the table. The table formatter you want to use, is configured when you configure the generator.

Example

- className: dk.fust.docgen.datadict.DataDictionaryConfigurationdocumentationFile: data-dictionary.ymltableFormatter:
className: dk.fust.docgen.csv.format.table.CSVTableFormatterdestination:
className: dk.fust.docgen.destination.FileDestinationfile: data_dictionary-output.csv

MarkdownTableFormatter

Class name: dk.fust.docgen.format.table.MarkdownTableFormatter

Default table formatter for most generators.

Generates the table in a format that can be used i Markdown files.

Use it together with MarkdownDestination.

HTMLTableFormatter

Class name: 'dk.fust.docgen.format.table.HTMLTableFormatter'

SettingTypeDescriptionDefault
dataFieldsMap<String, String>Data fields to be appended to the table
columnWidthsListSetting column withs

Example

tableFormatter:
className: dk.fust.docgen.format.table.HTMLTableFormatterdataFields:
table-width: "1800"columnWidths:
- "255"
- "328"
- "114"
- "115"
- "149"
- "242"

JsonTableFormatter

Class name: 'dk.fust.docgen.format.table.JsonTableFormatter'

Generates JSON.

SettingTypeDescriptionDefault
yamlbooleanIf true, it's rendered as yaml otherwise as jsonfalse
prettyPrintbooleanShould the json be pretty printed?true

Example

tableFormatter:
className: dk.fust.docgen.format.table.JsonTableFormatteryaml: true

CSVTableFormatter

Class name: dk.fust.docgen.csv.format.table.CSVTableFormatter

Read the documentation here

ExcelBase64TableFormatter

Class name: dk.fust.docgen.excel.format.table.ExcelBase64TableFormatter

Read the documentation here


Usage

You can use Documentation Generator as:


Documentation types

The documentation generator support these documentation types, but you're free to create your own. Just implement dk.fust.docgen.Generator and dk.fust.docgen.GeneratorConfiguration.

Add a dependency in your buildscript with the corresponding artifact id.

Documentation types supported

Artifact idDescription
documentation-generator-data-dictionaryGenerates Data Dictionary
documentation-generator-datalineageGenerates Data lineage
documentation-generator-erdiagramGenerates Entity-Relation diagrams
documentation-generator-sqlscriptGenerates SQL-files

Demos

In the demos folder you can see examples on how to use the documentation generator.

About

Generates documentation based upon a yaml-file

Resources

Code of conduct

Stars

3 stars

Watchers

2 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Aug 18, 2026. It is now read-only.

Latest commit

History

360 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Documentation Generator

Generates documentation based upon a yaml- or JSON-file. Describe how your database looks, in a single file (or files) and then generate the corresponding documentation.

Warning

Documentation Generator is being sunset! Instead of maintaining two separate projects, the Documentation Generator will be merged into: Provenance

To Help you transition, you can use convert_to_provenance.py to convert your existing Documentation Generator JSON files to the Provenance format. The script will handle the necessary transformations to ensure compatibility with Provenance.

This document covers:

Badges

GitHub Release


Idea of the Documentation Generator

The basic idea of the Documentation Generator is one place to have a single model and then generate and distribute documentation into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["documentation file"] docgen["Documentation Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The documentation file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json

Example of a documentation file:

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.jsondocumentationTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json",
"documentationTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

See an example in the demo where generator-configuration.yml is located.

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then it's fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md
- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md

Destinations

Destination is the where Documentation Generator will send the documentation. You can implement you own if you want or use these.

DirectoryDestination

Class name: dk.fust.docgen.destination.DirectoryDestination

Sends to separate files in the directory

SettingTypeDescriptionDefault
directoryFileWhere the files will be stored
createParentDirectoriesbooleanShould the directory's parent directories be created if missingfalse

FileDestination

Class name: dk.fust.docgen.destination.FileDestination

Replace an entire file with the document.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

Base64FileDestination

Class name: dk.fust.docgen.destination.Base64FileDestination

Base64 decodes the document and replaces the entire file with binary content. Can for instance be used in conjunction with ExcelBase64TableFormatter.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

MarkdownDestination

Class name: dk.fust.docgen.destination.MarkdownDestination

SettingTypeDescriptionDefault
fileFileMarkdown file to be updated

In order for the MarkdownDestination being able to substitute parts of a markdown-file, you'll mark a start and an end placeholder, and everything in between will be substituted.

Markup in Markdown

For instance this shows a substitution with the key MY_KEY, where the beginning and end is. Everything in between will be substituted.

[//]: #MY_KEY_START()
... this is replaced ...
[//]: #MY_KEY_END()

ConfluenceDestination

Class name: dk.fust.docgen.confluence.destination.ConfluenceDestination

In order to use Confluence as destination, you'll need to add the extension documentation-generator-confluence.

Read the documentation here


Table format

Some generators use tables and needs a formatter to create a string representation of the table. The table formatter you want to use, is configured when you configure the generator.

Example

- className: dk.fust.docgen.datadict.DataDictionaryConfigurationdocumentationFile: data-dictionary.ymltableFormatter:
className: dk.fust.docgen.csv.format.table.CSVTableFormatterdestination:
className: dk.fust.docgen.destination.FileDestinationfile: data_dictionary-output.csv

MarkdownTableFormatter

Class name: dk.fust.docgen.format.table.MarkdownTableFormatter

Default table formatter for most generators.

Generates the table in a format that can be used i Markdown files.

Use it together with MarkdownDestination.

HTMLTableFormatter

Class name: 'dk.fust.docgen.format.table.HTMLTableFormatter'

SettingTypeDescriptionDefault
dataFieldsMap<String, String>Data fields to be appended to the table
columnWidthsListSetting column withs

Example

tableFormatter:
className: dk.fust.docgen.format.table.HTMLTableFormatterdataFields:
table-width: "1800"columnWidths:
- "255"
- "328"
- "114"
- "115"
- "149"
- "242"

JsonTableFormatter

Class name: 'dk.fust.docgen.format.table.JsonTableFormatter'

Generates JSON.

SettingTypeDescriptionDefault
yamlbooleanIf true, it's rendered as yaml otherwise as jsonfalse
prettyPrintbooleanShould the json be pretty printed?true

Example

tableFormatter:
className: dk.fust.docgen.format.table.JsonTableFormatteryaml: true

CSVTableFormatter

Class name: dk.fust.docgen.csv.format.table.CSVTableFormatter

Read the documentation here

ExcelBase64TableFormatter

Class name: dk.fust.docgen.excel.format.table.ExcelBase64TableFormatter

Read the documentation here


Usage

You can use Documentation Generator as:


Documentation types

The documentation generator support these documentation types, but you're free to create your own. Just implement dk.fust.docgen.Generator and dk.fust.docgen.GeneratorConfiguration.

Add a dependency in your buildscript with the corresponding artifact id.

Documentation types supported

Artifact idDescription
documentation-generator-data-dictionaryGenerates Data Dictionary
documentation-generator-datalineageGenerates Data lineage
documentation-generator-erdiagramGenerates Entity-Relation diagrams
documentation-generator-sqlscriptGenerates SQL-files

Demos

In the demos folder you can see examples on how to use the documentation generator.

About

Generates documentation based upon a yaml-file

Resources

Code of conduct

Stars

3 stars

Watchers

2 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 18, 2026. It is now read-only.

Latest commit

History

360 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Documentation Generator

Generates documentation based upon a yaml- or JSON-file. Describe how your database looks, in a single file (or files) and then generate the corresponding documentation.

Warning

Documentation Generator is being sunset! Instead of maintaining two separate projects, the Documentation Generator will be merged into: Provenance

To Help you transition, you can use convert_to_provenance.py to convert your existing Documentation Generator JSON files to the Provenance format. The script will handle the necessary transformations to ensure compatibility with Provenance.

This document covers:

Badges

GitHub Release


Idea of the Documentation Generator

The basic idea of the Documentation Generator is one place to have a single model and then generate and distribute documentation into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["documentation file"] docgen["Documentation Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The documentation file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json

Example of a documentation file:

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.jsondocumentationTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json",
"documentationTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

See an example in the demo where generator-configuration.yml is located.

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then it's fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md
- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md

Destinations

Destination is the where Documentation Generator will send the documentation. You can implement you own if you want or use these.

DirectoryDestination

Class name: dk.fust.docgen.destination.DirectoryDestination

Sends to separate files in the directory

SettingTypeDescriptionDefault
directoryFileWhere the files will be stored
createParentDirectoriesbooleanShould the directory's parent directories be created if missingfalse

FileDestination

Class name: dk.fust.docgen.destination.FileDestination

Replace an entire file with the document.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

Base64FileDestination

Class name: dk.fust.docgen.destination.Base64FileDestination

Base64 decodes the document and replaces the entire file with binary content. Can for instance be used in conjunction with ExcelBase64TableFormatter.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

MarkdownDestination

Class name: dk.fust.docgen.destination.MarkdownDestination

SettingTypeDescriptionDefault
fileFileMarkdown file to be updated

In order for the MarkdownDestination being able to substitute parts of a markdown-file, you'll mark a start and an end placeholder, and everything in between will be substituted.

Markup in Markdown

For instance this shows a substitution with the key MY_KEY, where the beginning and end is. Everything in between will be substituted.

[//]: #MY_KEY_START()
... this is replaced ...
[//]: #MY_KEY_END()

ConfluenceDestination

Class name: dk.fust.docgen.confluence.destination.ConfluenceDestination

In order to use Confluence as destination, you'll need to add the extension documentation-generator-confluence.

Read the documentation here


Table format

Some generators use tables and needs a formatter to create a string representation of the table. The table formatter you want to use, is configured when you configure the generator.

Example

- className: dk.fust.docgen.datadict.DataDictionaryConfigurationdocumentationFile: data-dictionary.ymltableFormatter:
className: dk.fust.docgen.csv.format.table.CSVTableFormatterdestination:
className: dk.fust.docgen.destination.FileDestinationfile: data_dictionary-output.csv

MarkdownTableFormatter

Class name: dk.fust.docgen.format.table.MarkdownTableFormatter

Default table formatter for most generators.

Generates the table in a format that can be used i Markdown files.

Use it together with MarkdownDestination.

HTMLTableFormatter

Class name: 'dk.fust.docgen.format.table.HTMLTableFormatter'

SettingTypeDescriptionDefault
dataFieldsMap<String, String>Data fields to be appended to the table
columnWidthsListSetting column withs

Example

tableFormatter:
className: dk.fust.docgen.format.table.HTMLTableFormatterdataFields:
table-width: "1800"columnWidths:
- "255"
- "328"
- "114"
- "115"
- "149"
- "242"

JsonTableFormatter

Class name: 'dk.fust.docgen.format.table.JsonTableFormatter'

Generates JSON.

SettingTypeDescriptionDefault
yamlbooleanIf true, it's rendered as yaml otherwise as jsonfalse
prettyPrintbooleanShould the json be pretty printed?true

Example

tableFormatter:
className: dk.fust.docgen.format.table.JsonTableFormatteryaml: true

CSVTableFormatter

Class name: dk.fust.docgen.csv.format.table.CSVTableFormatter

Read the documentation here

ExcelBase64TableFormatter

Class name: dk.fust.docgen.excel.format.table.ExcelBase64TableFormatter

Read the documentation here


Usage

You can use Documentation Generator as:


Documentation types

The documentation generator support these documentation types, but you're free to create your own. Just implement dk.fust.docgen.Generator and dk.fust.docgen.GeneratorConfiguration.

Add a dependency in your buildscript with the corresponding artifact id.

Documentation types supported

Artifact idDescription
documentation-generator-data-dictionaryGenerates Data Dictionary
documentation-generator-datalineageGenerates Data lineage
documentation-generator-erdiagramGenerates Entity-Relation diagrams
documentation-generator-sqlscriptGenerates SQL-files

Demos

In the demos folder you can see examples on how to use the documentation generator.

About

Generates documentation based upon a yaml-file

Resources

Code of conduct

Stars

3 stars

Watchers

2 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 18, 2026. It is now read-only.

Latest commit

History

360 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Documentation Generator

Generates documentation based upon a yaml- or JSON-file. Describe how your database looks, in a single file (or files) and then generate the corresponding documentation.

Warning

Documentation Generator is being sunset! Instead of maintaining two separate projects, the Documentation Generator will be merged into: Provenance

To Help you transition, you can use convert_to_provenance.py to convert your existing Documentation Generator JSON files to the Provenance format. The script will handle the necessary transformations to ensure compatibility with Provenance.

This document covers:

Badges

GitHub Release


Idea of the Documentation Generator

The basic idea of the Documentation Generator is one place to have a single model and then generate and distribute documentation into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["documentation file"] docgen["Documentation Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The documentation file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json

Example of a documentation file:

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.jsondocumentationTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json",
"documentationTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

See an example in the demo where generator-configuration.yml is located.

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then it's fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md
- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md

Destinations

Destination is the where Documentation Generator will send the documentation. You can implement you own if you want or use these.

DirectoryDestination

Class name: dk.fust.docgen.destination.DirectoryDestination

Sends to separate files in the directory

SettingTypeDescriptionDefault
directoryFileWhere the files will be stored
createParentDirectoriesbooleanShould the directory's parent directories be created if missingfalse

FileDestination

Class name: dk.fust.docgen.destination.FileDestination

Replace an entire file with the document.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

Base64FileDestination

Class name: dk.fust.docgen.destination.Base64FileDestination

Base64 decodes the document and replaces the entire file with binary content. Can for instance be used in conjunction with ExcelBase64TableFormatter.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

MarkdownDestination

Class name: dk.fust.docgen.destination.MarkdownDestination

SettingTypeDescriptionDefault
fileFileMarkdown file to be updated

In order for the MarkdownDestination being able to substitute parts of a markdown-file, you'll mark a start and an end placeholder, and everything in between will be substituted.

Markup in Markdown

For instance this shows a substitution with the key MY_KEY, where the beginning and end is. Everything in between will be substituted.

[//]: #MY_KEY_START()
... this is replaced ...
[//]: #MY_KEY_END()

ConfluenceDestination

Class name: dk.fust.docgen.confluence.destination.ConfluenceDestination

In order to use Confluence as destination, you'll need to add the extension documentation-generator-confluence.

Read the documentation here


Table format

Some generators use tables and needs a formatter to create a string representation of the table. The table formatter you want to use, is configured when you configure the generator.

Example

- className: dk.fust.docgen.datadict.DataDictionaryConfigurationdocumentationFile: data-dictionary.ymltableFormatter:
className: dk.fust.docgen.csv.format.table.CSVTableFormatterdestination:
className: dk.fust.docgen.destination.FileDestinationfile: data_dictionary-output.csv

MarkdownTableFormatter

Class name: dk.fust.docgen.format.table.MarkdownTableFormatter

Default table formatter for most generators.

Generates the table in a format that can be used i Markdown files.

Use it together with MarkdownDestination.

HTMLTableFormatter

Class name: 'dk.fust.docgen.format.table.HTMLTableFormatter'

SettingTypeDescriptionDefault
dataFieldsMap<String, String>Data fields to be appended to the table
columnWidthsListSetting column withs

Example

tableFormatter:
className: dk.fust.docgen.format.table.HTMLTableFormatterdataFields:
table-width: "1800"columnWidths:
- "255"
- "328"
- "114"
- "115"
- "149"
- "242"

JsonTableFormatter

Class name: 'dk.fust.docgen.format.table.JsonTableFormatter'

Generates JSON.

SettingTypeDescriptionDefault
yamlbooleanIf true, it's rendered as yaml otherwise as jsonfalse
prettyPrintbooleanShould the json be pretty printed?true

Example

tableFormatter:
className: dk.fust.docgen.format.table.JsonTableFormatteryaml: true

CSVTableFormatter

Class name: dk.fust.docgen.csv.format.table.CSVTableFormatter

Read the documentation here

ExcelBase64TableFormatter

Class name: dk.fust.docgen.excel.format.table.ExcelBase64TableFormatter

Read the documentation here


Usage

You can use Documentation Generator as:


Documentation types

The documentation generator support these documentation types, but you're free to create your own. Just implement dk.fust.docgen.Generator and dk.fust.docgen.GeneratorConfiguration.

Add a dependency in your buildscript with the corresponding artifact id.

Documentation types supported

Artifact idDescription
documentation-generator-data-dictionaryGenerates Data Dictionary
documentation-generator-datalineageGenerates Data lineage
documentation-generator-erdiagramGenerates Entity-Relation diagrams
documentation-generator-sqlscriptGenerates SQL-files

Demos

In the demos folder you can see examples on how to use the documentation generator.

About

Generates documentation based upon a yaml-file

Resources

Code of conduct

Stars

3 stars

Watchers

2 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Aug 18, 2026. It is now read-only.

Latest commit

History

360 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Documentation Generator

Generates documentation based upon a yaml- or JSON-file. Describe how your database looks, in a single file (or files) and then generate the corresponding documentation.

Warning

Documentation Generator is being sunset! Instead of maintaining two separate projects, the Documentation Generator will be merged into: Provenance

To Help you transition, you can use convert_to_provenance.py to convert your existing Documentation Generator JSON files to the Provenance format. The script will handle the necessary transformations to ensure compatibility with Provenance.

This document covers:

Badges

GitHub Release


Idea of the Documentation Generator

The basic idea of the Documentation Generator is one place to have a single model and then generate and distribute documentation into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["documentation file"] docgen["Documentation Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The documentation file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json

Example of a documentation file:

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.jsondocumentationTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json",
"documentationTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

See an example in the demo where generator-configuration.yml is located.

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then it's fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md
- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md

Destinations

Destination is the where Documentation Generator will send the documentation. You can implement you own if you want or use these.

DirectoryDestination

Class name: dk.fust.docgen.destination.DirectoryDestination

Sends to separate files in the directory

SettingTypeDescriptionDefault
directoryFileWhere the files will be stored
createParentDirectoriesbooleanShould the directory's parent directories be created if missingfalse

FileDestination

Class name: dk.fust.docgen.destination.FileDestination

Replace an entire file with the document.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

Base64FileDestination

Class name: dk.fust.docgen.destination.Base64FileDestination

Base64 decodes the document and replaces the entire file with binary content. Can for instance be used in conjunction with ExcelBase64TableFormatter.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

MarkdownDestination

Class name: dk.fust.docgen.destination.MarkdownDestination

SettingTypeDescriptionDefault
fileFileMarkdown file to be updated

In order for the MarkdownDestination being able to substitute parts of a markdown-file, you'll mark a start and an end placeholder, and everything in between will be substituted.

Markup in Markdown

For instance this shows a substitution with the key MY_KEY, where the beginning and end is. Everything in between will be substituted.

[//]: #MY_KEY_START()
... this is replaced ...
[//]: #MY_KEY_END()

ConfluenceDestination

Class name: dk.fust.docgen.confluence.destination.ConfluenceDestination

In order to use Confluence as destination, you'll need to add the extension documentation-generator-confluence.

Read the documentation here


Table format

Some generators use tables and needs a formatter to create a string representation of the table. The table formatter you want to use, is configured when you configure the generator.

Example

- className: dk.fust.docgen.datadict.DataDictionaryConfigurationdocumentationFile: data-dictionary.ymltableFormatter:
className: dk.fust.docgen.csv.format.table.CSVTableFormatterdestination:
className: dk.fust.docgen.destination.FileDestinationfile: data_dictionary-output.csv

MarkdownTableFormatter

Class name: dk.fust.docgen.format.table.MarkdownTableFormatter

Default table formatter for most generators.

Generates the table in a format that can be used i Markdown files.

Use it together with MarkdownDestination.

HTMLTableFormatter

Class name: 'dk.fust.docgen.format.table.HTMLTableFormatter'

SettingTypeDescriptionDefault
dataFieldsMap<String, String>Data fields to be appended to the table
columnWidthsListSetting column withs

Example

tableFormatter:
className: dk.fust.docgen.format.table.HTMLTableFormatterdataFields:
table-width: "1800"columnWidths:
- "255"
- "328"
- "114"
- "115"
- "149"
- "242"

JsonTableFormatter

Class name: 'dk.fust.docgen.format.table.JsonTableFormatter'

Generates JSON.

SettingTypeDescriptionDefault
yamlbooleanIf true, it's rendered as yaml otherwise as jsonfalse
prettyPrintbooleanShould the json be pretty printed?true

Example

tableFormatter:
className: dk.fust.docgen.format.table.JsonTableFormatteryaml: true

CSVTableFormatter

Class name: dk.fust.docgen.csv.format.table.CSVTableFormatter

Read the documentation here

ExcelBase64TableFormatter

Class name: dk.fust.docgen.excel.format.table.ExcelBase64TableFormatter

Read the documentation here


Usage

You can use Documentation Generator as:


Documentation types

The documentation generator support these documentation types, but you're free to create your own. Just implement dk.fust.docgen.Generator and dk.fust.docgen.GeneratorConfiguration.

Add a dependency in your buildscript with the corresponding artifact id.

Documentation types supported

Artifact idDescription
documentation-generator-data-dictionaryGenerates Data Dictionary
documentation-generator-datalineageGenerates Data lineage
documentation-generator-erdiagramGenerates Entity-Relation diagrams
documentation-generator-sqlscriptGenerates SQL-files

Demos

In the demos folder you can see examples on how to use the documentation generator.

About

Generates documentation based upon a yaml-file

Resources

Code of conduct

Stars

3 stars

Watchers

2 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 18, 2026. It is now read-only.

Latest commit

History

360 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Documentation Generator

Generates documentation based upon a yaml- or JSON-file. Describe how your database looks, in a single file (or files) and then generate the corresponding documentation.

Warning

Documentation Generator is being sunset! Instead of maintaining two separate projects, the Documentation Generator will be merged into: Provenance

To Help you transition, you can use convert_to_provenance.py to convert your existing Documentation Generator JSON files to the Provenance format. The script will handle the necessary transformations to ensure compatibility with Provenance.

This document covers:

Badges

GitHub Release


Idea of the Documentation Generator

The basic idea of the Documentation Generator is one place to have a single model and then generate and distribute documentation into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["documentation file"] docgen["Documentation Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The documentation file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json

Example of a documentation file:

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.jsondocumentationTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json",
"documentationTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

See an example in the demo where generator-configuration.yml is located.

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then it's fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md
- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md

Destinations

Destination is the where Documentation Generator will send the documentation. You can implement you own if you want or use these.

DirectoryDestination

Class name: dk.fust.docgen.destination.DirectoryDestination

Sends to separate files in the directory

SettingTypeDescriptionDefault
directoryFileWhere the files will be stored
createParentDirectoriesbooleanShould the directory's parent directories be created if missingfalse

FileDestination

Class name: dk.fust.docgen.destination.FileDestination

Replace an entire file with the document.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

Base64FileDestination

Class name: dk.fust.docgen.destination.Base64FileDestination

Base64 decodes the document and replaces the entire file with binary content. Can for instance be used in conjunction with ExcelBase64TableFormatter.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

MarkdownDestination

Class name: dk.fust.docgen.destination.MarkdownDestination

SettingTypeDescriptionDefault
fileFileMarkdown file to be updated

In order for the MarkdownDestination being able to substitute parts of a markdown-file, you'll mark a start and an end placeholder, and everything in between will be substituted.

Markup in Markdown

For instance this shows a substitution with the key MY_KEY, where the beginning and end is. Everything in between will be substituted.

[//]: #MY_KEY_START()
... this is replaced ...
[//]: #MY_KEY_END()

ConfluenceDestination

Class name: dk.fust.docgen.confluence.destination.ConfluenceDestination

In order to use Confluence as destination, you'll need to add the extension documentation-generator-confluence.

Read the documentation here


Table format

Some generators use tables and needs a formatter to create a string representation of the table. The table formatter you want to use, is configured when you configure the generator.

Example

- className: dk.fust.docgen.datadict.DataDictionaryConfigurationdocumentationFile: data-dictionary.ymltableFormatter:
className: dk.fust.docgen.csv.format.table.CSVTableFormatterdestination:
className: dk.fust.docgen.destination.FileDestinationfile: data_dictionary-output.csv

MarkdownTableFormatter

Class name: dk.fust.docgen.format.table.MarkdownTableFormatter

Default table formatter for most generators.

Generates the table in a format that can be used i Markdown files.

Use it together with MarkdownDestination.

HTMLTableFormatter

Class name: 'dk.fust.docgen.format.table.HTMLTableFormatter'

SettingTypeDescriptionDefault
dataFieldsMap<String, String>Data fields to be appended to the table
columnWidthsListSetting column withs

Example

tableFormatter:
className: dk.fust.docgen.format.table.HTMLTableFormatterdataFields:
table-width: "1800"columnWidths:
- "255"
- "328"
- "114"
- "115"
- "149"
- "242"

JsonTableFormatter

Class name: 'dk.fust.docgen.format.table.JsonTableFormatter'

Generates JSON.

SettingTypeDescriptionDefault
yamlbooleanIf true, it's rendered as yaml otherwise as jsonfalse
prettyPrintbooleanShould the json be pretty printed?true

Example

tableFormatter:
className: dk.fust.docgen.format.table.JsonTableFormatteryaml: true

CSVTableFormatter

Class name: dk.fust.docgen.csv.format.table.CSVTableFormatter

Read the documentation here

ExcelBase64TableFormatter

Class name: dk.fust.docgen.excel.format.table.ExcelBase64TableFormatter

Read the documentation here


Usage

You can use Documentation Generator as:


Documentation types

The documentation generator support these documentation types, but you're free to create your own. Just implement dk.fust.docgen.Generator and dk.fust.docgen.GeneratorConfiguration.

Add a dependency in your buildscript with the corresponding artifact id.

Documentation types supported

Artifact idDescription
documentation-generator-data-dictionaryGenerates Data Dictionary
documentation-generator-datalineageGenerates Data lineage
documentation-generator-erdiagramGenerates Entity-Relation diagrams
documentation-generator-sqlscriptGenerates SQL-files

Demos

In the demos folder you can see examples on how to use the documentation generator.

About

Generates documentation based upon a yaml-file

Resources

Code of conduct

Stars

3 stars

Watchers

2 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 18, 2026. It is now read-only.

Latest commit

History

360 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Documentation Generator

Generates documentation based upon a yaml- or JSON-file. Describe how your database looks, in a single file (or files) and then generate the corresponding documentation.

Warning

Documentation Generator is being sunset! Instead of maintaining two separate projects, the Documentation Generator will be merged into: Provenance

To Help you transition, you can use convert_to_provenance.py to convert your existing Documentation Generator JSON files to the Provenance format. The script will handle the necessary transformations to ensure compatibility with Provenance.

This document covers:

Badges

GitHub Release


Idea of the Documentation Generator

The basic idea of the Documentation Generator is one place to have a single model and then generate and distribute documentation into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["documentation file"] docgen["Documentation Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The documentation file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json

Example of a documentation file:

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.jsondocumentationTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json",
"documentationTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

See an example in the demo where generator-configuration.yml is located.

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then it's fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md
- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md

Destinations

Destination is the where Documentation Generator will send the documentation. You can implement you own if you want or use these.

DirectoryDestination

Class name: dk.fust.docgen.destination.DirectoryDestination

Sends to separate files in the directory

SettingTypeDescriptionDefault
directoryFileWhere the files will be stored
createParentDirectoriesbooleanShould the directory's parent directories be created if missingfalse

FileDestination

Class name: dk.fust.docgen.destination.FileDestination

Replace an entire file with the document.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

Base64FileDestination

Class name: dk.fust.docgen.destination.Base64FileDestination

Base64 decodes the document and replaces the entire file with binary content. Can for instance be used in conjunction with ExcelBase64TableFormatter.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

MarkdownDestination

Class name: dk.fust.docgen.destination.MarkdownDestination

SettingTypeDescriptionDefault
fileFileMarkdown file to be updated

In order for the MarkdownDestination being able to substitute parts of a markdown-file, you'll mark a start and an end placeholder, and everything in between will be substituted.

Markup in Markdown

For instance this shows a substitution with the key MY_KEY, where the beginning and end is. Everything in between will be substituted.

[//]: #MY_KEY_START()
... this is replaced ...
[//]: #MY_KEY_END()

ConfluenceDestination

Class name: dk.fust.docgen.confluence.destination.ConfluenceDestination

In order to use Confluence as destination, you'll need to add the extension documentation-generator-confluence.

Read the documentation here


Table format

Some generators use tables and needs a formatter to create a string representation of the table. The table formatter you want to use, is configured when you configure the generator.

Example

- className: dk.fust.docgen.datadict.DataDictionaryConfigurationdocumentationFile: data-dictionary.ymltableFormatter:
className: dk.fust.docgen.csv.format.table.CSVTableFormatterdestination:
className: dk.fust.docgen.destination.FileDestinationfile: data_dictionary-output.csv

MarkdownTableFormatter

Class name: dk.fust.docgen.format.table.MarkdownTableFormatter

Default table formatter for most generators.

Generates the table in a format that can be used i Markdown files.

Use it together with MarkdownDestination.

HTMLTableFormatter

Class name: 'dk.fust.docgen.format.table.HTMLTableFormatter'

SettingTypeDescriptionDefault
dataFieldsMap<String, String>Data fields to be appended to the table
columnWidthsListSetting column withs

Example

tableFormatter:
className: dk.fust.docgen.format.table.HTMLTableFormatterdataFields:
table-width: "1800"columnWidths:
- "255"
- "328"
- "114"
- "115"
- "149"
- "242"

JsonTableFormatter

Class name: 'dk.fust.docgen.format.table.JsonTableFormatter'

Generates JSON.

SettingTypeDescriptionDefault
yamlbooleanIf true, it's rendered as yaml otherwise as jsonfalse
prettyPrintbooleanShould the json be pretty printed?true

Example

tableFormatter:
className: dk.fust.docgen.format.table.JsonTableFormatteryaml: true

CSVTableFormatter

Class name: dk.fust.docgen.csv.format.table.CSVTableFormatter

Read the documentation here

ExcelBase64TableFormatter

Class name: dk.fust.docgen.excel.format.table.ExcelBase64TableFormatter

Read the documentation here


Usage

You can use Documentation Generator as:


Documentation types

The documentation generator support these documentation types, but you're free to create your own. Just implement dk.fust.docgen.Generator and dk.fust.docgen.GeneratorConfiguration.

Add a dependency in your buildscript with the corresponding artifact id.

Documentation types supported

Artifact idDescription
documentation-generator-data-dictionaryGenerates Data Dictionary
documentation-generator-datalineageGenerates Data lineage
documentation-generator-erdiagramGenerates Entity-Relation diagrams
documentation-generator-sqlscriptGenerates SQL-files

Demos

In the demos folder you can see examples on how to use the documentation generator.

About

Generates documentation based upon a yaml-file

Resources

Code of conduct

Stars

3 stars

Watchers

2 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Aug 18, 2026. It is now read-only.

Latest commit

History

360 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Documentation Generator

Generates documentation based upon a yaml- or JSON-file. Describe how your database looks, in a single file (or files) and then generate the corresponding documentation.

Warning

Documentation Generator is being sunset! Instead of maintaining two separate projects, the Documentation Generator will be merged into: Provenance

To Help you transition, you can use convert_to_provenance.py to convert your existing Documentation Generator JSON files to the Provenance format. The script will handle the necessary transformations to ensure compatibility with Provenance.

This document covers:

Badges

GitHub Release


Idea of the Documentation Generator

The basic idea of the Documentation Generator is one place to have a single model and then generate and distribute documentation into different places.

Each Generator generates something and a Destination can send the output to somewhere.

Some generators are supplied in-the-box, but you're able to design your own generator and destinations.

The generators acts as plugin - Just implement GeneratorConfiguration.

---
title: Basic idea
---
flowchart TD
docFile["documentation file"] docgen["Documentation Generator"]
generator1["Generator 1"]
generator1Generate[[Generates SQL-scripts]]
destination1["Destination 1"]
database[(Database)]
generator2["Generator 2"]
destination2["Destination 2"]
markdown(["Markdown"])
generator3["Generator 3"]
destination3["Destination 3"]
confluence(["Confluence"])
generator4["Generator 4"]
destination4["Destination 4"]
csv(["CSV file"])
generator5["Generator 5"]
destination5["Destination 5"]
excel(["Excel workbook"])
generatorX["Generator X"]
destinationX["Destination X"]
something(["Something else"])
docFile --> docgen
docgen --> generator1
docgen --> generator2
docgen --> generator3
docgen --> generator4
docgen --> generator5
docgen --> generatorX
generator1 --> generator1Generate
generator1Generate --> destination1
destination1 --> database
generator2 --> destination2
destination2 --> markdown
generator3 --> destination3
destination3 --> confluence
generator4 --> destination4
destination4 --> csv
generator5 --> destination5
destination5 --> excel
generatorX --> destinationX
destinationX --> something
Loading

Documentation structure

The documentation file or files can be yaml- or json-files.

If you in the beginning of your file add a reference to the schema, so your IDE can validate and have code completion.

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json

Example of a documentation file:

$schema: https://patrickfust.github.io/documentation-generator/v4/documentation-schema.jsondocumentationTitle: My databaseschemaName: theSchematables:
- name: table_acreateTableScript: create_table_a.sqlfields:
- name: field_adataType: intforeignKey:
tableName: table_bcolumnName: field_bonDelete: cascade
- name: table_bfields:
- name: field_bdataType: int
- name: table_in_groupfields:
- name: field_bdataType: int

or as JSON:

{
"$schema": "https://patrickfust.github.io/documentation-generator/v4/documentation-schema.json",
"documentationTitle": "My database",
"schemaName": "theSchema",
"tables": [
{
"name": "table_a",
"createTableScript": "create_table_a.sql",
"fields": [
{
"name": "field_a",
"dataType": "int",
"foreignKey": {
"tableName": "table_b",
"columnName": "field_b"
}
}
]
},
{
"name": "table_b",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
},
{
"name": "table_in_group",
"fields": [
{
"name": "field_b",
"dataType": "int"
}
]
}
]
}

Generator Configuration File

You can either configure your Gradle directly, or have a configuration file. The configuration file is the only way to use the Maven plugin

See an example in the demo where generator-configuration.yml is located.

The generator configuration file contains a list of configurations. Each configuration consist of the class name of the configuration class and then it's fields. You can have nested objects, you just have to specify which class name it is.

Example of configuration file

- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator: MERMAIDgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_PLACEHOLDER
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_MERMAID_GROUP_PLACEHOLDERfilterTags: my_groupdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md
- className: dk.fust.docgen.erdiagram.ERDiagramConfigurationdocumentationFile: documentation.yamlumlGenerator : PLANTUMLgenerateKeys:
- className: dk.fust.docgen.erdiagram.GenerateKeydestinationKey: MODEL_PLANTUML_PLACEHOLDERdestination:
className: dk.fust.docgen.destination.MarkdownDestinationfile: README.md

Destinations

Destination is the where Documentation Generator will send the documentation. You can implement you own if you want or use these.

DirectoryDestination

Class name: dk.fust.docgen.destination.DirectoryDestination

Sends to separate files in the directory

SettingTypeDescriptionDefault
directoryFileWhere the files will be stored
createParentDirectoriesbooleanShould the directory's parent directories be created if missingfalse

FileDestination

Class name: dk.fust.docgen.destination.FileDestination

Replace an entire file with the document.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

Base64FileDestination

Class name: dk.fust.docgen.destination.Base64FileDestination

Base64 decodes the document and replaces the entire file with binary content. Can for instance be used in conjunction with ExcelBase64TableFormatter.

SettingTypeDescriptionDefault
fileFileLocation of the file. Must be writeable

MarkdownDestination

Class name: dk.fust.docgen.destination.MarkdownDestination

SettingTypeDescriptionDefault
fileFileMarkdown file to be updated

In order for the MarkdownDestination being able to substitute parts of a markdown-file, you'll mark a start and an end placeholder, and everything in between will be substituted.

Markup in Markdown

For instance this shows a substitution with the key MY_KEY, where the beginning and end is. Everything in between will be substituted.

[//]: #MY_KEY_START()
... this is replaced ...
[//]: #MY_KEY_END()

ConfluenceDestination

Class name: dk.fust.docgen.confluence.destination.ConfluenceDestination

In order to use Confluence as destination, you'll need to add the extension documentation-generator-confluence.

Read the documentation here


Table format

Some generators use tables and needs a formatter to create a string representation of the table. The table formatter you want to use, is configured when you configure the generator.

Example

- className: dk.fust.docgen.datadict.DataDictionaryConfigurationdocumentationFile: data-dictionary.ymltableFormatter:
className: dk.fust.docgen.csv.format.table.CSVTableFormatterdestination:
className: dk.fust.docgen.destination.FileDestinationfile: data_dictionary-output.csv

MarkdownTableFormatter

Class name: dk.fust.docgen.format.table.MarkdownTableFormatter

Default table formatter for most generators.

Generates the table in a format that can be used i Markdown files.

Use it together with MarkdownDestination.

HTMLTableFormatter

Class name: 'dk.fust.docgen.format.table.HTMLTableFormatter'

SettingTypeDescriptionDefault
dataFieldsMap<String, String>Data fields to be appended to the table
columnWidthsListSetting column withs

Example

tableFormatter:
className: dk.fust.docgen.format.table.HTMLTableFormatterdataFields:
table-width: "1800"columnWidths:
- "255"
- "328"
- "114"
- "115"
- "149"
- "242"

JsonTableFormatter

Class name: 'dk.fust.docgen.format.table.JsonTableFormatter'

Generates JSON.

SettingTypeDescriptionDefault
yamlbooleanIf true, it's rendered as yaml otherwise as jsonfalse
prettyPrintbooleanShould the json be pretty printed?true

Example

tableFormatter:
className: dk.fust.docgen.format.table.JsonTableFormatteryaml: true

CSVTableFormatter

Class name: dk.fust.docgen.csv.format.table.CSVTableFormatter

Read the documentation here

ExcelBase64TableFormatter

Class name: dk.fust.docgen.excel.format.table.ExcelBase64TableFormatter

Read the documentation here


Usage

You can use Documentation Generator as:


Documentation types

The documentation generator support these documentation types, but you're free to create your own. Just implement dk.fust.docgen.Generator and dk.fust.docgen.GeneratorConfiguration.

Add a dependency in your buildscript with the corresponding artifact id.

Documentation types supported

Artifact idDescription
documentation-generator-data-dictionaryGenerates Data Dictionary
documentation-generator-datalineageGenerates Data lineage
documentation-generator-erdiagramGenerates Entity-Relation diagrams
documentation-generator-sqlscriptGenerates SQL-files

Demos

In the demos folder you can see examples on how to use the documentation generator.

About

Generates documentation based upon a yaml-file

Resources

Code of conduct

Stars

3 stars

Watchers

2 watching

Forks

Releases

Used by

Contributors

Languages