mirror of
https://github.com/kovetskiy/mark.git
synced 2025-06-02 03:32:42 +08:00
*: Reorganize code
This commit is contained in:
parent
2c71b50438
commit
dc8842106b
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,6 +1,5 @@
|
|||||||
/mark
|
/mark
|
||||||
/docker
|
/docker
|
||||||
/testdata
|
|
||||||
.idea/
|
.idea/
|
||||||
/mark.test
|
/mark.test
|
||||||
/profile.cov
|
/profile.cov
|
||||||
|
@ -11,8 +11,8 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/kovetskiy/mark/pkg/confluence"
|
"github.com/kovetskiy/mark/confluence"
|
||||||
"github.com/kovetskiy/mark/pkg/mark/vfs"
|
"github.com/kovetskiy/mark/vfs"
|
||||||
"github.com/reconquest/karma-go"
|
"github.com/reconquest/karma-go"
|
||||||
"github.com/reconquest/pkg/log"
|
"github.com/reconquest/pkg/log"
|
||||||
)
|
)
|
@ -7,7 +7,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"text/template"
|
"text/template"
|
||||||
|
|
||||||
"github.com/kovetskiy/mark/pkg/mark/includes"
|
"github.com/kovetskiy/mark/includes"
|
||||||
"github.com/reconquest/karma-go"
|
"github.com/reconquest/karma-go"
|
||||||
"github.com/reconquest/pkg/log"
|
"github.com/reconquest/pkg/log"
|
||||||
"github.com/reconquest/regexputil-go"
|
"github.com/reconquest/regexputil-go"
|
32
main.go
32
main.go
@ -11,13 +11,15 @@ import (
|
|||||||
|
|
||||||
"github.com/bmatcuk/doublestar/v4"
|
"github.com/bmatcuk/doublestar/v4"
|
||||||
"github.com/kovetskiy/lorg"
|
"github.com/kovetskiy/lorg"
|
||||||
"github.com/kovetskiy/mark/pkg/confluence"
|
"github.com/kovetskiy/mark/attachment"
|
||||||
"github.com/kovetskiy/mark/pkg/mark"
|
"github.com/kovetskiy/mark/confluence"
|
||||||
"github.com/kovetskiy/mark/pkg/mark/attachment"
|
"github.com/kovetskiy/mark/includes"
|
||||||
"github.com/kovetskiy/mark/pkg/mark/includes"
|
"github.com/kovetskiy/mark/macro"
|
||||||
"github.com/kovetskiy/mark/pkg/mark/macro"
|
mark "github.com/kovetskiy/mark/markdown"
|
||||||
"github.com/kovetskiy/mark/pkg/mark/stdlib"
|
"github.com/kovetskiy/mark/metadata"
|
||||||
"github.com/kovetskiy/mark/pkg/mark/vfs"
|
"github.com/kovetskiy/mark/page"
|
||||||
|
"github.com/kovetskiy/mark/stdlib"
|
||||||
|
"github.com/kovetskiy/mark/vfs"
|
||||||
"github.com/reconquest/karma-go"
|
"github.com/reconquest/karma-go"
|
||||||
"github.com/reconquest/pkg/log"
|
"github.com/reconquest/pkg/log"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
@ -307,7 +309,7 @@ func processFile(
|
|||||||
|
|
||||||
parents := strings.Split(cCtx.String("parents"), cCtx.String("parents-delimiter"))
|
parents := strings.Split(cCtx.String("parents"), cCtx.String("parents-delimiter"))
|
||||||
|
|
||||||
meta, markdown, err := mark.ExtractMeta(markdown, cCtx.String("space"), cCtx.Bool("title-from-h1"), parents)
|
meta, markdown, err := metadata.ExtractMeta(markdown, cCtx.String("space"), cCtx.Bool("title-from-h1"), parents)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -386,15 +388,15 @@ func processFile(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
links, err := mark.ResolveRelativeLinks(api, meta, markdown, filepath.Dir(file), cCtx.String("space"), cCtx.Bool("title-from-h1"), parents)
|
links, err := page.ResolveRelativeLinks(api, meta, markdown, filepath.Dir(file), cCtx.String("space"), cCtx.Bool("title-from-h1"), parents)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf(err, "unable to resolve relative links")
|
log.Fatalf(err, "unable to resolve relative links")
|
||||||
}
|
}
|
||||||
|
|
||||||
markdown = mark.SubstituteLinks(markdown, links)
|
markdown = page.SubstituteLinks(markdown, links)
|
||||||
|
|
||||||
if cCtx.Bool("dry-run") {
|
if cCtx.Bool("dry-run") {
|
||||||
_, _, err := mark.ResolvePage(cCtx.Bool("dry-run"), api, meta)
|
_, _, err := page.ResolvePage(cCtx.Bool("dry-run"), api, meta)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf(err, "unable to resolve page location")
|
log.Fatalf(err, "unable to resolve page location")
|
||||||
}
|
}
|
||||||
@ -415,7 +417,7 @@ func processFile(
|
|||||||
var target *confluence.PageInfo
|
var target *confluence.PageInfo
|
||||||
|
|
||||||
if meta != nil {
|
if meta != nil {
|
||||||
parent, page, err := mark.ResolvePage(cCtx.Bool("dry-run"), api, meta)
|
parent, page, err := page.ResolvePage(cCtx.Bool("dry-run"), api, meta)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf(
|
log.Fatalf(
|
||||||
karma.Describe("title", meta.Title).Reason(err),
|
karma.Describe("title", meta.Title).Reason(err),
|
||||||
@ -542,7 +544,7 @@ func processFile(
|
|||||||
return target
|
return target
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateLabels(api *confluence.API, target *confluence.PageInfo, meta *mark.Meta) {
|
func updateLabels(api *confluence.API, target *confluence.PageInfo, meta *metadata.Meta) {
|
||||||
|
|
||||||
labelInfo, err := api.GetPageLabels(target, "global")
|
labelInfo, err := api.GetPageLabels(target, "global")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -579,7 +581,7 @@ func updateLabels(api *confluence.API, target *confluence.PageInfo, meta *mark.M
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Page has label but label not in Metadata
|
// Page has label but label not in Metadata
|
||||||
func determineLabelsToRemove(labelInfo *confluence.LabelInfo, meta *mark.Meta) []string {
|
func determineLabelsToRemove(labelInfo *confluence.LabelInfo, meta *metadata.Meta) []string {
|
||||||
var labels []string
|
var labels []string
|
||||||
for _, label := range labelInfo.Labels {
|
for _, label := range labelInfo.Labels {
|
||||||
if !slices.ContainsFunc(meta.Labels, func(metaLabel string) bool {
|
if !slices.ContainsFunc(meta.Labels, func(metaLabel string) bool {
|
||||||
@ -592,7 +594,7 @@ func determineLabelsToRemove(labelInfo *confluence.LabelInfo, meta *mark.Meta) [
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Metadata has label but Page does not have it
|
// Metadata has label but Page does not have it
|
||||||
func determineLabelsToAdd(meta *mark.Meta, labelInfo *confluence.LabelInfo) []string {
|
func determineLabelsToAdd(meta *metadata.Meta, labelInfo *confluence.LabelInfo) []string {
|
||||||
var labels []string
|
var labels []string
|
||||||
for _, metaLabel := range meta.Labels {
|
for _, metaLabel := range meta.Labels {
|
||||||
if !slices.ContainsFunc(labelInfo.Labels, func(label confluence.Label) bool {
|
if !slices.ContainsFunc(labelInfo.Labels, func(label confluence.Label) bool {
|
||||||
|
@ -2,12 +2,11 @@ package mark
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"regexp"
|
|
||||||
|
|
||||||
"github.com/kovetskiy/mark/pkg/mark/attachment"
|
"github.com/kovetskiy/mark/attachment"
|
||||||
cparser "github.com/kovetskiy/mark/pkg/mark/parser"
|
cparser "github.com/kovetskiy/mark/parser"
|
||||||
crenderer "github.com/kovetskiy/mark/pkg/mark/renderer"
|
crenderer "github.com/kovetskiy/mark/renderer"
|
||||||
"github.com/kovetskiy/mark/pkg/mark/stdlib"
|
"github.com/kovetskiy/mark/stdlib"
|
||||||
"github.com/reconquest/pkg/log"
|
"github.com/reconquest/pkg/log"
|
||||||
"github.com/yuin/goldmark"
|
"github.com/yuin/goldmark"
|
||||||
|
|
||||||
@ -104,16 +103,4 @@ func CompileMarkdown(markdown []byte, stdlib *stdlib.Lib, path string, mermaidPr
|
|||||||
log.Tracef(nil, "rendered markdown to html:\n%s", string(html))
|
log.Tracef(nil, "rendered markdown to html:\n%s", string(html))
|
||||||
|
|
||||||
return string(html), confluenceExtension.Attachments
|
return string(html), confluenceExtension.Attachments
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExtractDocumentLeadingH1 will extract leading H1 heading
|
|
||||||
func ExtractDocumentLeadingH1(markdown []byte) string {
|
|
||||||
h1 := regexp.MustCompile(`#[^#]\s*(.*)\s*\n`)
|
|
||||||
groups := h1.FindSubmatch(markdown)
|
|
||||||
if groups == nil {
|
|
||||||
return ""
|
|
||||||
} else {
|
|
||||||
return string(groups[1])
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -2,11 +2,13 @@ package mark
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/kovetskiy/mark/pkg/mark/stdlib"
|
"github.com/kovetskiy/mark/stdlib"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -29,6 +31,13 @@ func loadData(t *testing.T, filename, variant string) ([]byte, string, []byte) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCompileMarkdown(t *testing.T) {
|
func TestCompileMarkdown(t *testing.T) {
|
||||||
|
_, filename, _, _ := runtime.Caller(0)
|
||||||
|
dir := path.Join(path.Dir(filename), "..")
|
||||||
|
err := os.Chdir(dir)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
test := assert.New(t)
|
test := assert.New(t)
|
||||||
|
|
||||||
testcases, err := filepath.Glob("testdata/*.md")
|
testcases, err := filepath.Glob("testdata/*.md")
|
||||||
@ -48,6 +57,13 @@ func TestCompileMarkdown(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCompileMarkdownDropH1(t *testing.T) {
|
func TestCompileMarkdownDropH1(t *testing.T) {
|
||||||
|
_, filename, _, _ := runtime.Caller(0)
|
||||||
|
dir := path.Join(path.Dir(filename), "..")
|
||||||
|
err := os.Chdir(dir)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
test := assert.New(t)
|
test := assert.New(t)
|
||||||
|
|
||||||
testcases, err := filepath.Glob("testdata/*.md")
|
testcases, err := filepath.Glob("testdata/*.md")
|
||||||
@ -67,6 +83,13 @@ func TestCompileMarkdownDropH1(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCompileMarkdownStripNewlines(t *testing.T) {
|
func TestCompileMarkdownStripNewlines(t *testing.T) {
|
||||||
|
_, filename, _, _ := runtime.Caller(0)
|
||||||
|
dir := path.Join(path.Dir(filename), "..")
|
||||||
|
err := os.Chdir(dir)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
test := assert.New(t)
|
test := assert.New(t)
|
||||||
|
|
||||||
testcases, err := filepath.Glob("testdata/*.md")
|
testcases, err := filepath.Glob("testdata/*.md")
|
||||||
@ -84,16 +107,3 @@ func TestCompileMarkdownStripNewlines(t *testing.T) {
|
|||||||
test.EqualValues(string(html), actual, filename+" vs "+htmlname)
|
test.EqualValues(string(html), actual, filename+" vs "+htmlname)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestExtractDocumentLeadingH1(t *testing.T) {
|
|
||||||
filename := "testdata/header.md"
|
|
||||||
|
|
||||||
markdown, err := os.ReadFile(filename)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
actual := ExtractDocumentLeadingH1(markdown)
|
|
||||||
|
|
||||||
assert.Equal(t, "a", actual)
|
|
||||||
}
|
|
@ -7,7 +7,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
mermaid "github.com/dreampuf/mermaid.go"
|
mermaid "github.com/dreampuf/mermaid.go"
|
||||||
"github.com/kovetskiy/mark/pkg/mark/attachment"
|
"github.com/kovetskiy/mark/attachment"
|
||||||
"github.com/reconquest/pkg/log"
|
"github.com/reconquest/pkg/log"
|
||||||
)
|
)
|
||||||
|
|
@ -4,7 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/kovetskiy/mark/pkg/mark/attachment"
|
"github.com/kovetskiy/mark/attachment"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package mark
|
package metadata
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
@ -166,3 +166,14 @@ func ExtractMeta(data []byte, spaceFromCli string, titleFromH1 bool, parents []s
|
|||||||
|
|
||||||
return meta, data[offset:], nil
|
return meta, data[offset:], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExtractDocumentLeadingH1 will extract leading H1 heading
|
||||||
|
func ExtractDocumentLeadingH1(markdown []byte) string {
|
||||||
|
h1 := regexp.MustCompile(`#[^#]\s*(.*)\s*\n`)
|
||||||
|
groups := h1.FindSubmatch(markdown)
|
||||||
|
if groups == nil {
|
||||||
|
return ""
|
||||||
|
} else {
|
||||||
|
return string(groups[1])
|
||||||
|
}
|
||||||
|
}
|
30
metadata/metadata_test.go
Normal file
30
metadata/metadata_test.go
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package metadata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"runtime"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestExtractDocumentLeadingH1(t *testing.T) {
|
||||||
|
_, filename, _, _ := runtime.Caller(0)
|
||||||
|
dir := path.Join(path.Dir(filename), "..")
|
||||||
|
err := os.Chdir(dir)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
filename = "testdata/header.md"
|
||||||
|
|
||||||
|
markdown, err := os.ReadFile(filename)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
actual := ExtractDocumentLeadingH1(markdown)
|
||||||
|
|
||||||
|
assert.Equal(t, "a", actual)
|
||||||
|
}
|
@ -1,10 +1,10 @@
|
|||||||
package mark
|
package page
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/kovetskiy/mark/pkg/confluence"
|
"github.com/kovetskiy/mark/confluence"
|
||||||
"github.com/reconquest/karma-go"
|
"github.com/reconquest/karma-go"
|
||||||
"github.com/reconquest/pkg/log"
|
"github.com/reconquest/pkg/log"
|
||||||
)
|
)
|
@ -1,4 +1,4 @@
|
|||||||
package mark
|
package page
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@ -8,7 +8,8 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
|
||||||
"github.com/kovetskiy/mark/pkg/confluence"
|
"github.com/kovetskiy/mark/confluence"
|
||||||
|
"github.com/kovetskiy/mark/metadata"
|
||||||
"github.com/reconquest/karma-go"
|
"github.com/reconquest/karma-go"
|
||||||
"github.com/reconquest/pkg/log"
|
"github.com/reconquest/pkg/log"
|
||||||
"golang.org/x/tools/godoc/util"
|
"golang.org/x/tools/godoc/util"
|
||||||
@ -27,7 +28,7 @@ type markdownLink struct {
|
|||||||
|
|
||||||
func ResolveRelativeLinks(
|
func ResolveRelativeLinks(
|
||||||
api *confluence.API,
|
api *confluence.API,
|
||||||
meta *Meta,
|
meta *metadata.Meta,
|
||||||
markdown []byte,
|
markdown []byte,
|
||||||
base string,
|
base string,
|
||||||
spaceFromCli string,
|
spaceFromCli string,
|
||||||
@ -104,7 +105,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, spaceFromCli, titleFromH1, parents)
|
linkMeta, _, err := metadata.ExtractMeta(linkContents, spaceFromCli, titleFromH1, parents)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf(
|
log.Errorf(
|
||||||
err,
|
err,
|
@ -1,4 +1,4 @@
|
|||||||
package mark
|
package page
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
@ -1,9 +1,10 @@
|
|||||||
package mark
|
package page
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/kovetskiy/mark/pkg/confluence"
|
"github.com/kovetskiy/mark/confluence"
|
||||||
|
"github.com/kovetskiy/mark/metadata"
|
||||||
"github.com/reconquest/karma-go"
|
"github.com/reconquest/karma-go"
|
||||||
"github.com/reconquest/pkg/log"
|
"github.com/reconquest/pkg/log"
|
||||||
)
|
)
|
||||||
@ -11,7 +12,7 @@ import (
|
|||||||
func ResolvePage(
|
func ResolvePage(
|
||||||
dryRun bool,
|
dryRun bool,
|
||||||
api *confluence.API,
|
api *confluence.API,
|
||||||
meta *Meta,
|
meta *metadata.Meta,
|
||||||
) (*confluence.PageInfo, *confluence.PageInfo, error) {
|
) (*confluence.PageInfo, *confluence.PageInfo, error) {
|
||||||
page, err := api.FindPage(meta.Space, meta.Title, meta.Type)
|
page, err := api.FindPage(meta.Space, meta.Title, meta.Type)
|
||||||
if err != nil {
|
if err != nil {
|
@ -3,7 +3,7 @@ package renderer
|
|||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/kovetskiy/mark/pkg/mark/stdlib"
|
"github.com/kovetskiy/mark/stdlib"
|
||||||
|
|
||||||
"github.com/yuin/goldmark/ast"
|
"github.com/yuin/goldmark/ast"
|
||||||
"github.com/yuin/goldmark/renderer"
|
"github.com/yuin/goldmark/renderer"
|
@ -5,9 +5,9 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/kovetskiy/mark/pkg/mark/attachment"
|
"github.com/kovetskiy/mark/attachment"
|
||||||
"github.com/kovetskiy/mark/pkg/mark/mermaid"
|
"github.com/kovetskiy/mark/mermaid"
|
||||||
"github.com/kovetskiy/mark/pkg/mark/stdlib"
|
"github.com/kovetskiy/mark/stdlib"
|
||||||
"github.com/reconquest/pkg/log"
|
"github.com/reconquest/pkg/log"
|
||||||
|
|
||||||
"github.com/yuin/goldmark/ast"
|
"github.com/yuin/goldmark/ast"
|
@ -3,7 +3,7 @@ package renderer
|
|||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/kovetskiy/mark/pkg/mark/stdlib"
|
"github.com/kovetskiy/mark/stdlib"
|
||||||
|
|
||||||
"github.com/yuin/goldmark/ast"
|
"github.com/yuin/goldmark/ast"
|
||||||
"github.com/yuin/goldmark/renderer"
|
"github.com/yuin/goldmark/renderer"
|
@ -5,9 +5,9 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/kovetskiy/mark/pkg/mark/attachment"
|
"github.com/kovetskiy/mark/attachment"
|
||||||
"github.com/kovetskiy/mark/pkg/mark/stdlib"
|
"github.com/kovetskiy/mark/stdlib"
|
||||||
"github.com/kovetskiy/mark/pkg/mark/vfs"
|
"github.com/kovetskiy/mark/vfs"
|
||||||
|
|
||||||
"github.com/yuin/goldmark/ast"
|
"github.com/yuin/goldmark/ast"
|
||||||
"github.com/yuin/goldmark/renderer"
|
"github.com/yuin/goldmark/renderer"
|
@ -4,8 +4,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"text/template"
|
"text/template"
|
||||||
|
|
||||||
"github.com/kovetskiy/mark/pkg/confluence"
|
"github.com/kovetskiy/mark/confluence"
|
||||||
"github.com/kovetskiy/mark/pkg/mark/macro"
|
"github.com/kovetskiy/mark/macro"
|
||||||
"github.com/reconquest/pkg/log"
|
"github.com/reconquest/pkg/log"
|
||||||
|
|
||||||
"github.com/reconquest/karma-go"
|
"github.com/reconquest/karma-go"
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
Loading…
x
Reference in New Issue
Block a user