2015-09-19 23:51:49 +06:00
package main
import (
"os"
2025-03-10 15:47:03 -06:00
"github.com/kovetskiy/mark/util"
2020-11-03 17:12:51 +03:00
"github.com/reconquest/pkg/log"
2023-04-18 15:06:16 +02:00
"github.com/urfave/cli/v2"
"github.com/urfave/cli/v2/altsrc"
2015-09-19 23:51:49 +06:00
)
const (
2025-02-21 16:41:04 +01:00
version = "12.1.2"
2023-04-18 15:06:16 +02:00
usage = "A tool for updating Atlassian Confluence pages from markdown."
2023-04-12 13:43:34 +02:00
description = ` Mark is a tool to update Atlassian Confluence pages from markdown. Documentation is available here: https://github.com/kovetskiy/mark `
2015-09-19 23:51:49 +06:00
)
2023-04-18 15:06:16 +02:00
var flags = [ ] cli . Flag {
altsrc . NewStringFlag ( & cli . StringFlag {
2023-05-03 15:59:18 +02:00
Name : "files" ,
Aliases : [ ] string { "f" } ,
Value : "" ,
Usage : "use specified markdown file(s) for converting to html. Supports file globbing patterns (needs to be quoted)." ,
TakesFile : true ,
EnvVars : [ ] string { "MARK_FILES" } ,
2023-04-18 15:06:16 +02:00
} ) ,
2025-02-19 14:50:10 -05:00
altsrc . NewBoolFlag ( & cli . BoolFlag {
Name : "continue-on-error" ,
Value : false ,
2025-02-20 13:34:34 -05:00
Usage : "don't exit if an error occurs while processing a file, continue processing remaining files." ,
2025-02-19 14:50:10 -05:00
EnvVars : [ ] string { "MARK_CONTINUE_ON_ERROR" } ,
} ) ,
2023-04-18 15:06:16 +02:00
altsrc . NewBoolFlag ( & cli . BoolFlag {
Name : "compile-only" ,
Value : false ,
Usage : "show resulting HTML and don't update Confluence page content." ,
EnvVars : [ ] string { "MARK_COMPILE_ONLY" } ,
} ) ,
altsrc . NewBoolFlag ( & cli . BoolFlag {
Name : "dry-run" ,
Value : false ,
Usage : "resolve page and ancestry, show resulting HTML and exit." ,
EnvVars : [ ] string { "MARK_DRY_RUN" } ,
} ) ,
altsrc . NewBoolFlag ( & cli . BoolFlag {
Name : "edit-lock" ,
Value : false ,
Aliases : [ ] string { "k" } ,
Usage : "lock page editing to current user only to prevent accidental manual edits over Confluence Web UI." ,
EnvVars : [ ] string { "MARK_EDIT_LOCK" } ,
} ) ,
altsrc . NewBoolFlag ( & cli . BoolFlag {
Name : "drop-h1" ,
Value : false ,
2023-04-20 12:43:08 +02:00
Aliases : [ ] string { "h1_drop" } ,
2023-05-19 18:47:55 +02:00
Usage : "don't include the first H1 heading in Confluence output." ,
2023-04-18 15:06:16 +02:00
EnvVars : [ ] string { "MARK_H1_DROP" } ,
} ) ,
2023-09-06 16:19:09 -07:00
altsrc . NewBoolFlag ( & cli . BoolFlag {
Name : "strip-linebreaks" ,
Value : false ,
Aliases : [ ] string { "L" } ,
Usage : "remove linebreaks inside of tags, to accomodate non-standard Confluence behavior" ,
2024-12-04 17:25:00 +01:00
EnvVars : [ ] string { "MARK_STRIP_LINEBREAKS" } ,
2023-09-06 16:19:09 -07:00
} ) ,
2023-04-18 15:06:16 +02:00
altsrc . NewBoolFlag ( & cli . BoolFlag {
Name : "title-from-h1" ,
Value : false ,
2023-04-20 12:43:08 +02:00
Aliases : [ ] string { "h1_title" } ,
2023-04-18 15:06:16 +02:00
Usage : "extract page title from a leading H1 heading. If no H1 heading on a page exists, then title must be set in the page metadata." ,
EnvVars : [ ] string { "MARK_H1_TITLE" } ,
} ) ,
2024-09-30 21:00:49 -04:00
altsrc . NewBoolFlag ( & cli . BoolFlag {
Name : "title-append-generated-hash" ,
Value : false ,
Usage : "appends a short hash generated from the path of the page (space, parents, and title) to the title" ,
EnvVars : [ ] string { "MARK_TITLE_APPEND_GENERATED_HASH" } ,
} ) ,
2023-04-18 15:06:16 +02:00
altsrc . NewBoolFlag ( & cli . BoolFlag {
Name : "minor-edit" ,
Value : false ,
Usage : "don't send notifications while updating Confluence page." ,
EnvVars : [ ] string { "MARK_MINOR_EDIT" } ,
} ) ,
2024-04-10 10:45:16 +01:00
altsrc . NewStringFlag ( & cli . StringFlag {
Name : "version-message" ,
Value : "" ,
2024-04-11 19:39:11 +02:00
Usage : "add a message to the page version, to explain the edit (default: \"\")" ,
2024-04-10 10:45:16 +01:00
EnvVars : [ ] string { "MARK_VERSION_MESSAGE" } ,
} ) ,
2023-04-18 15:06:16 +02:00
altsrc . NewStringFlag ( & cli . StringFlag {
Name : "color" ,
Value : "auto" ,
Usage : "display logs in color. Possible values: auto, never." ,
EnvVars : [ ] string { "MARK_COLOR" } ,
} ) ,
2024-12-30 21:40:33 +02:00
altsrc . NewStringFlag ( & cli . StringFlag {
Name : "log-level" ,
Value : "info" ,
Usage : "set the log level. Possible values: TRACE, DEBUG, INFO, WARNING, ERROR, FATAL." ,
EnvVars : [ ] string { "MARK_LOG_LEVEL" } ,
2023-04-18 15:06:16 +02:00
} ) ,
altsrc . NewStringFlag ( & cli . StringFlag {
Name : "username" ,
Aliases : [ ] string { "u" } ,
Value : "" ,
Usage : "use specified username for updating Confluence page." ,
EnvVars : [ ] string { "MARK_USERNAME" } ,
} ) ,
altsrc . NewStringFlag ( & cli . StringFlag {
Name : "password" ,
Aliases : [ ] string { "p" } ,
Value : "" ,
Usage : "use specified token for updating Confluence page. Specify - as password to read password from stdin, or your Personal access token. Username is not mandatory if personal access token is provided. For more info please see: https://developer.atlassian.com/server/confluence/confluence-server-rest-api/#authentication." ,
EnvVars : [ ] string { "MARK_PASSWORD" } ,
} ) ,
altsrc . NewStringFlag ( & cli . StringFlag {
Name : "target-url" ,
Aliases : [ ] string { "l" } ,
Value : "" ,
Usage : "edit specified Confluence page. If -l is not specified, file should contain metadata (see above)." ,
EnvVars : [ ] string { "MARK_TARGET_URL" } ,
} ) ,
altsrc . NewStringFlag ( & cli . StringFlag {
Name : "base-url" ,
2023-04-20 12:43:08 +02:00
Aliases : [ ] string { "b" , "base_url" } ,
2023-04-18 15:06:16 +02:00
Value : "" ,
Usage : "base URL for Confluence. Alternative option for base_url config field." ,
EnvVars : [ ] string { "MARK_BASE_URL" } ,
} ) ,
& cli . StringFlag {
Name : "config" ,
Aliases : [ ] string { "c" } ,
2025-03-10 15:47:03 -06:00
Value : util . ConfigFilePath ( ) ,
2023-04-18 15:06:16 +02:00
Usage : "use the specified configuration file." ,
TakesFile : true ,
EnvVars : [ ] string { "MARK_CONFIG" } ,
} ,
altsrc . NewBoolFlag ( & cli . BoolFlag {
Name : "ci" ,
Value : false ,
Usage : "run on CI mode. It won't fail if files are not found." ,
EnvVars : [ ] string { "MARK_CI" } ,
} ) ,
altsrc . NewStringFlag ( & cli . StringFlag {
Name : "space" ,
Value : "" ,
Usage : "use specified space key. If the space key is not specified, it must be set in the page metadata." ,
EnvVars : [ ] string { "MARK_SPACE" } ,
} ) ,
2023-08-09 13:06:31 +02:00
altsrc . NewStringFlag ( & cli . StringFlag {
Name : "parents" ,
Value : "" ,
2023-11-22 15:11:55 +00:00
Usage : "A list containing the parents of the document separated by parents-delimiter (default: '/'). These will be prepended to the ones defined in the document itself." ,
2023-08-09 13:06:31 +02:00
EnvVars : [ ] string { "MARK_PARENTS" } ,
} ) ,
altsrc . NewStringFlag ( & cli . StringFlag {
Name : "parents-delimiter" ,
Value : "/" ,
Usage : "The delimiter used for the parents list" ,
EnvVars : [ ] string { "MARK_PARENTS_DELIMITER" } ,
} ) ,
2023-04-12 13:43:34 +02:00
altsrc . NewStringFlag ( & cli . StringFlag {
Name : "mermaid-provider" ,
Value : "cloudscript" ,
Usage : "defines the mermaid provider to use. Supported options are: cloudscript, mermaid-go." ,
EnvVars : [ ] string { "MARK_MERMAID_PROVIDER" } ,
} ) ,
2023-08-30 14:50:53 +02:00
altsrc . NewFloat64Flag ( & cli . Float64Flag {
Name : "mermaid-scale" ,
Value : 1.0 ,
Usage : "defines the scaling factor for mermaid renderings." ,
EnvVars : [ ] string { "MARK_MERMAID_SCALE" } ,
} ) ,
2023-10-17 12:53:10 +02:00
altsrc . NewStringFlag ( & cli . StringFlag {
Name : "include-path" ,
Value : "" ,
Usage : "Path for shared includes, used as a fallback if the include doesn't exist in the current directory." ,
TakesFile : true ,
EnvVars : [ ] string { "MARK_INCLUDE_PATH" } ,
} ) ,
2025-01-09 18:39:18 -06:00
altsrc . NewBoolFlag ( & cli . BoolFlag {
Name : "changes-only" ,
Value : false ,
Usage : "Avoids re-uploading pages that haven't changed since the last run." ,
2025-01-13 10:27:42 -06:00
EnvVars : [ ] string { "MARK_CHANGES_ONLY" } ,
2025-01-09 18:39:18 -06:00
} ) ,
2023-04-18 15:06:16 +02:00
}
2015-09-19 23:51:49 +06:00
func main ( ) {
2023-04-18 15:06:16 +02:00
app := & cli . App {
Name : "mark" ,
Usage : usage ,
Description : description ,
Version : version ,
Flags : flags ,
Before : altsrc . InitInputSourceWithContext ( flags ,
func ( context * cli . Context ) ( altsrc . InputSourceContext , error ) {
if context . IsSet ( "config" ) {
filePath := context . String ( "config" )
return altsrc . NewTomlSourceFromFile ( filePath )
} else {
2023-04-25 22:45:15 +02:00
// Fall back to default if config is unset and path exists
2025-03-10 15:47:03 -06:00
_ , err := os . Stat ( util . ConfigFilePath ( ) )
2023-04-25 22:45:15 +02:00
if os . IsNotExist ( err ) {
return & altsrc . MapInputSource { } , nil
}
2025-03-10 15:47:03 -06:00
return altsrc . NewTomlSourceFromFile ( util . ConfigFilePath ( ) )
2023-04-18 15:06:16 +02:00
}
} ) ,
EnableBashCompletion : true ,
HideHelpCommand : true ,
2025-03-10 15:47:03 -06:00
Action : util . RunMark ,
2015-09-19 23:51:49 +06:00
}
2023-04-18 15:06:16 +02:00
if err := app . Run ( os . Args ) ; err != nil {
2021-04-05 07:56:25 +03:00
log . Fatal ( err )
2021-04-02 13:15:54 -04:00
}
2023-04-18 15:06:16 +02:00
}