Skip to content

Commit

Permalink
Adding Description heading for Actions
Browse files Browse the repository at this point in the history
  • Loading branch information
mw-root committed Sep 18, 2023
1 parent 4b24753 commit c7e56ba
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 7 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ GitHub Action that generates beautiful, easy-to-read markdown tables with just a

## Usage

Add the `Inputs` and/or `Outputs` and/or `Secrets` (only supported by reusable workflows) [`H2` header](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#headers) to any markdown file.
Add the `Inputs` and/or `Outputs` and/or `Secrets` (only supported by reusable workflows) and/or `Description` (only supported by actions) [`H2` header](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#headers) to any markdown file.

```yaml
...
Expand Down
9 changes: 9 additions & 0 deletions internal/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ package internal

import "fmt"

// DescriptionHeader represents the markdown header of description
const DescriptionHeader = "## Description"

// InputsHeader represents the markdown header of inputs
const InputsHeader = "## Inputs"

Expand All @@ -39,6 +42,12 @@ const PipeSeparator = "|"
// NewLineSeparator used for splitting lines
const NewLineSeparator = "\n"

// InputAutoDocStart is the start of the input
var DescriptionAutoDocStart = fmt.Sprintf(AutoDocStart, "DESCRIPTION")

// InputAutoDocEnd is the end of the input
var DescriptionAutoDocEnd = fmt.Sprintf(AutoDocEnd, "DESCRIPTION")

// InputAutoDocStart is the start of the input
var InputAutoDocStart = fmt.Sprintf(AutoDocStart, "INPUT")

Expand Down
65 changes: 59 additions & 6 deletions internal/types/action.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ type Action struct {
OutputColumns []string
Inputs map[string]ActionInput `yaml:"inputs,omitempty"`
Outputs map[string]ActionOutput `yaml:"outputs,omitempty"`
Description string `yaml:"description,omitempty"`
InputMarkdownLinks bool
}

Expand All @@ -72,7 +73,7 @@ func (a *Action) GetData() error {
}

// WriteDocumentation write the table to the output file
func (a *Action) WriteDocumentation(inputTable, outputTable *strings.Builder) error {
func (a *Action) WriteDocumentation(inputTable, outputTable, description *strings.Builder) error {
var err error
input, err := os.ReadFile(a.OutputFileName)
if err != nil {
Expand All @@ -81,17 +82,43 @@ func (a *Action) WriteDocumentation(inputTable, outputTable *strings.Builder) er

var output []byte

hasInputsData, indices := utils.HasBytesInBetween(
hasDescriptionData, indices := utils.HasBytesInBetween(
input,
[]byte(internal.DescriptionAutoDocStart),
[]byte(internal.DescriptionAutoDocEnd),
)
output = input

descriptionStr := strings.TrimSpace(description.String())


if hasDescriptionData {
output = utils.ReplaceBytesInBetween(output, indices, []byte(descriptionStr))
} else {
re := regexp.MustCompile(fmt.Sprintf("(?m)^%s", internal.DescriptionHeader))
output = re.ReplaceAllFunc(input, func(match []byte) []byte {
if bytes.HasPrefix(match, []byte(internal.DescriptionHeader)) {
if descriptionStr != "" {
return []byte(fmt.Sprintf("%s\n\n%v", internal.DescriptionHeader, descriptionStr))
} else {
return []byte(internal.DescriptionHeader)
}
}
return match
})
}

hasInputsData, indices := utils.HasBytesInBetween(
output,
[]byte(internal.InputAutoDocStart),
[]byte(internal.InputAutoDocEnd),
)

output = input

inputsStr := strings.TrimSpace(inputTable.String())

if hasInputsData {
output = utils.ReplaceBytesInBetween(output, indices, []byte(inputsStr))
output = utils.ReplaceBytesInBetween(output, indices, []byte(inputsStr))
} else {
re := regexp.MustCompile(fmt.Sprintf("(?m)^%s", internal.InputsHeader))
output = re.ReplaceAllFunc(input, func(match []byte) []byte {
Expand All @@ -105,7 +132,6 @@ func (a *Action) WriteDocumentation(inputTable, outputTable *strings.Builder) er
return match
})
}

hasOutputsData, indices := utils.HasBytesInBetween(
output,
[]byte(internal.OutputAutoDocStart),
Expand Down Expand Up @@ -150,6 +176,11 @@ func (a *Action) RenderOutput() error {
return err
}

descriptionOutput, err := renderDescription(a.Description)
if err != nil {
return err
}

inputTableOutput, err := renderActionInputTableOutput(a.Inputs, a.InputColumns, a.InputMarkdownLinks, maxWidth, maxWords)
if err != nil {
return err
Expand All @@ -160,14 +191,36 @@ func (a *Action) RenderOutput() error {
return err
}

err = a.WriteDocumentation(inputTableOutput, outputTableOutput)
err = a.WriteDocumentation(inputTableOutput, outputTableOutput, descriptionOutput)
if err != nil {
return err
}

return nil
}

// renderDescription
func renderDescription(description string) (*strings.Builder, error) {
descriptionOutput := &strings.Builder{}
_, err := fmt.Fprintln(descriptionOutput, internal.DescriptionAutoDocStart)
if err != nil {
return descriptionOutput, err
}

_, err = fmt.Fprintln(descriptionOutput)
if err != nil {
return descriptionOutput, err
}
descriptionOutput.WriteString(description)
descriptionOutput.WriteString("\n")

_, err = fmt.Fprint(descriptionOutput, internal.DescriptionAutoDocEnd)
if err != nil {
return descriptionOutput, err
}
return descriptionOutput, nil
}

// renderActionOutputTableOutput renders the action input table

func renderActionInputTableOutput(inputs map[string]ActionInput, inputColumns []string, markdownLinks bool, maxWidth int, maxWords int) (*strings.Builder, error) {
Expand Down

0 comments on commit c7e56ba

Please sign in to comment.