Merge pull request #262 from mrueg/fix-relative-links

fix: Support relative links with titleFromH1
This commit is contained in:
Manuel Rüger 2023-03-21 11:07:59 +01:00 committed by GitHub
commit 530ff5cc3c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 23 deletions

18
main.go
View File

@ -181,7 +181,7 @@ func processFile(
markdown = bytes.ReplaceAll(markdown, []byte("\r\n"), []byte("\n")) markdown = bytes.ReplaceAll(markdown, []byte("\r\n"), []byte("\n"))
meta, markdown, err := mark.ExtractMeta(markdown) meta, markdown, err := mark.ExtractMeta(markdown, flags.Space, flags.TitleFromH1)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -196,29 +196,17 @@ func processFile(
} }
if pageID == "" && meta == nil { if pageID == "" && meta == nil {
if flags.TitleFromH1 && flags.Space != "" {
meta = &mark.Meta{}
meta.Type = "page"
} else {
log.Fatal( log.Fatal(
`specified file doesn't contain metadata ` + `specified file doesn't contain metadata ` +
`and URL is not specified via command line ` + `and URL is not specified via command line ` +
`or doesn't contain pageId GET-parameter`, `or doesn't contain pageId GET-parameter`,
) )
} }
}
switch { if meta.Space == "" {
case meta.Space == "" && flags.Space == "":
log.Fatal( log.Fatal(
"space is not set ('Space' header is not set and '--space' option is not set)", "space is not set ('Space' header is not set and '--space' option is not set)",
) )
case meta.Space == "" && flags.Space != "":
meta.Space = flags.Space
}
if meta.Title == "" && flags.TitleFromH1 {
meta.Title = mark.ExtractDocumentLeadingH1(markdown)
} }
if meta.Title == "" { if meta.Title == "" {
@ -270,7 +258,7 @@ func processFile(
} }
} }
links, err := mark.ResolveRelativeLinks(api, meta, markdown, ".") links, err := mark.ResolveRelativeLinks(api, meta, markdown, filepath.Dir(file), flags.Space, flags.TitleFromH1)
if err != nil { if err != nil {
log.Fatalf(err, "unable to resolve relative links") log.Fatalf(err, "unable to resolve relative links")
} }

View File

@ -29,6 +29,8 @@ func ResolveRelativeLinks(
meta *Meta, meta *Meta,
markdown []byte, markdown []byte,
base string, base string,
spaceFromCli string,
titleFromH1 bool,
) ([]LinkSubstitution, error) { ) ([]LinkSubstitution, error) {
matches := parseLinks(string(markdown)) matches := parseLinks(string(markdown))
@ -42,7 +44,7 @@ func ResolveRelativeLinks(
match.hash, match.hash,
) )
resolved, err := resolveLink(api, base, match) resolved, err := resolveLink(api, base, match, spaceFromCli, titleFromH1)
if err != nil { if err != nil {
return nil, karma.Format(err, "resolve link: %q", match.full) return nil, karma.Format(err, "resolve link: %q", match.full)
} }
@ -64,12 +66,15 @@ func resolveLink(
api *confluence.API, api *confluence.API,
base string, base string,
link markdownLink, link markdownLink,
spaceFromCli string,
titleFromH1 bool,
) (string, error) { ) (string, error) {
var result string var result string
if len(link.filename) > 0 { if len(link.filename) > 0 {
filepath := filepath.Join(base, link.filename) filepath := filepath.Join(base, link.filename)
log.Tracef(nil, "filepath: %s", filepath)
stat, err := os.Stat(filepath) stat, err := os.Stat(filepath)
if err != nil { if err != nil {
return "", nil return "", nil
@ -92,7 +97,7 @@ func resolveLink(
// This helps to determine if found link points to file that's // This helps to determine if found link points to file that's
// not markdown or have mark required metadata // not markdown or have mark required metadata
linkMeta, _, err := ExtractMeta(linkContents) linkMeta, _, err := ExtractMeta(linkContents, spaceFromCli, titleFromH1)
if err != nil { if err != nil {
log.Errorf( log.Errorf(
err, err,
@ -107,6 +112,13 @@ func resolveLink(
return "", nil return "", nil
} }
log.Tracef(
nil,
"extracted metadata: space=%s title=%s",
linkMeta.Space,
linkMeta.Title,
)
result, err = getConfluenceLink(api, linkMeta.Space, linkMeta.Title) result, err = getConfluenceLink(api, linkMeta.Space, linkMeta.Title)
if err != nil { if err != nil {
return "", karma.Format( return "", karma.Format(

View File

@ -46,7 +46,7 @@ var (
reHeaderPatternMacro = regexp.MustCompile(`<!-- Macro: .*`) reHeaderPatternMacro = regexp.MustCompile(`<!-- Macro: .*`)
) )
func ExtractMeta(data []byte) (*Meta, []byte, error) { func ExtractMeta(data []byte, spaceFromCli string, titleFromH1 bool) (*Meta, []byte, error) {
var ( var (
meta *Meta meta *Meta
offset int offset int
@ -146,6 +146,27 @@ func ExtractMeta(data []byte) (*Meta, []byte, error) {
} }
} }
if titleFromH1 || spaceFromCli != "" {
if meta == nil {
meta = &Meta{}
}
if meta.Type == "" {
meta.Type = "page"
}
if meta.ContentAppearance == "" {
meta.ContentAppearance = FullWidthContentAppearance // Default to full-width for backwards compatibility
}
if titleFromH1 && meta.Title == "" {
meta.Title = ExtractDocumentLeadingH1(data)
}
if spaceFromCli != "" && meta.Space == "" {
meta.Space = spaceFromCli
}
}
if meta == nil { if meta == nil {
return nil, data, nil return nil, data, nil
} }