remove options mode

This commit is contained in:
Egor Kovetskiy 2019-04-08 22:12:00 +03:00
parent 9d91b6cb7a
commit 7fe4542c0a
3 changed files with 110 additions and 136 deletions

View File

@ -16,14 +16,6 @@ password = "matrixishere"
base_url = "http://confluence.local"
```
Mark can read Confluence page URL and markdown file path from another specified
configuration file, which you can specify using -c <file> flag. It is very
usable for git hooks. That file should have following format:
```toml
url = "http://confluence.local/pages/viewpage.action?pageId=123456"
file = "docs/README.md"
```
Mark understands extended file format, which, still being valid markdown,
contains several metadata headers, which can be used to locate page inside
Confluence instance and update it accordingly.

146
main.go
View File

@ -1,8 +1,6 @@
package main
import (
"bufio"
"bytes"
"fmt"
"io/ioutil"
"net/url"
@ -81,8 +79,6 @@ Options:
-b --base-url <url> Base URL for Confluence.
Alternative option for base_url config field.
-f <file> Use specified markdown file for converting to html.
-c <file> Specify configuration file which should be used for reading
Confluence page URL and markdown file path.
-k Lock page editing to current user only to prevent accidental
manual edits over Confluence Web UI.
--dry-run Show resulting HTML and don't update Confluence page content.
@ -110,24 +106,27 @@ type PageInfo struct {
} `json:"_links"`
}
const (
HeaderParent string = `Parent`
HeaderSpace = `Space`
HeaderTitle = `Title`
HeaderLayout = `Layout`
)
type Meta struct {
Parents []string
Space string
Title string
Layout string
}
var (
logger = lorg.NewLog()
)
func initLogger(trace bool) {
if trace {
logger.SetLevel(lorg.LevelTrace)
}
logFormat := `${time} ${level:[%s]:right:true} %s`
if format := os.Getenv("LOG_FORMAT"); format != "" {
logFormat = format
}
logger.SetFormat(colorgful.MustApplyDefaultTheme(
logFormat,
colorgful.Default,
))
}
func main() {
args, err := godocs.Parse(usage, "mark 1.0", godocs.UsePager)
if err != nil {
@ -142,55 +141,15 @@ func main() {
dryRun = args["--dry-run"].(bool)
editLock = args["-k"].(bool)
trace = args["--trace"].(bool)
optionsFile, shouldReadOptions = args["-c"].(string)
)
if trace {
logger.SetLevel(lorg.LevelTrace)
}
logFormat := `${time} ${level:[%s]:right:true} %s`
if format := os.Getenv("LOG_FORMAT"); format != "" {
logFormat = format
}
logger.SetFormat(colorgful.MustApplyDefaultTheme(
logFormat,
colorgful.Default,
))
initLogger(trace)
config, err := getConfig(filepath.Join(os.Getenv("HOME"), ".config/mark"))
if err != nil && !os.IsNotExist(err) {
logger.Fatal(err)
}
if shouldReadOptions {
optionsConfig, err := getConfig(optionsFile)
if err != nil {
logger.Fatalf(
"can't read options config '%s': %s", optionsFile, err,
)
}
targetURL, err = optionsConfig.GetString("url")
if err != nil {
logger.Fatal(
"can't read `url` value from options file (%s): %s",
optionsFile, err,
)
}
targetFile, err = optionsConfig.GetString("file")
if err != nil {
logger.Fatal(
"can't read `file` value from options file (%s): %s",
optionsFile, err,
)
}
}
markdownData, err := ioutil.ReadFile(targetFile)
if err != nil {
logger.Fatal(err)
@ -597,72 +556,3 @@ func getConfig(path string) (zhash.Hash, error) {
return zhash.HashFromMap(configData), nil
}
func extractMeta(data []byte) (*Meta, error) {
headerPattern := regexp.MustCompile(`\[\]:\s*#\s*\(([^:]+):\s*(.*)\)`)
var meta *Meta
scanner := bufio.NewScanner(bytes.NewBuffer(data))
for scanner.Scan() {
line := scanner.Text()
if err := scanner.Err(); err != nil {
return nil, err
}
matches := headerPattern.FindStringSubmatch(line)
if matches == nil {
break
}
if meta == nil {
meta = &Meta{}
}
header := strings.Title(matches[1])
switch header {
case HeaderParent:
meta.Parents = append(meta.Parents, matches[2])
case HeaderSpace:
meta.Space = strings.ToUpper(matches[2])
case HeaderTitle:
meta.Title = strings.TrimSpace(matches[2])
case HeaderLayout:
meta.Layout = strings.TrimSpace(matches[2])
default:
logger.Errorf(
`encountered unknown header '%s' line: %#v`,
header,
line,
)
continue
}
}
if meta == nil {
return nil, nil
}
if meta.Space == "" {
return nil, fmt.Errorf(
"space key is not set (%s header is not set)",
HeaderSpace,
)
}
if meta.Title == "" {
return nil, fmt.Errorf(
"page title is not set (%s header is not set)",
HeaderTitle,
)
}
return meta, nil
}

92
meta.go Normal file
View File

@ -0,0 +1,92 @@
package main
import (
"bufio"
"bytes"
"fmt"
"regexp"
"strings"
)
const (
HeaderParent string = `Parent`
HeaderSpace = `Space`
HeaderTitle = `Title`
HeaderLayout = `Layout`
)
type Meta struct {
Parents []string
Space string
Title string
Layout string
}
func extractMeta(data []byte) (*Meta, error) {
headerPattern := regexp.MustCompile(`\[\]:\s*#\s*\(([^:]+):\s*(.*)\)`)
var meta *Meta
scanner := bufio.NewScanner(bytes.NewBuffer(data))
for scanner.Scan() {
line := scanner.Text()
if err := scanner.Err(); err != nil {
return nil, err
}
matches := headerPattern.FindStringSubmatch(line)
if matches == nil {
break
}
if meta == nil {
meta = &Meta{}
}
header := strings.Title(matches[1])
switch header {
case HeaderParent:
meta.Parents = append(meta.Parents, matches[2])
case HeaderSpace:
meta.Space = strings.ToUpper(matches[2])
case HeaderTitle:
meta.Title = strings.TrimSpace(matches[2])
case HeaderLayout:
meta.Layout = strings.TrimSpace(matches[2])
default:
logger.Errorf(
`encountered unknown header '%s' line: %#v`,
header,
line,
)
continue
}
}
if meta == nil {
return nil, nil
}
if meta.Space == "" {
return nil, fmt.Errorf(
"space key is not set (%s header is not set)",
HeaderSpace,
)
}
if meta.Title == "" {
return nil, fmt.Errorf(
"page title is not set (%s header is not set)",
HeaderTitle,
)
}
return meta, nil
}