diff --git a/README.md b/README.md index e73e80a..363b41a 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,8 @@ to the template relative to current working dir, e.g.: ``` +If the template cannot be found relative to the current directory, a fallback directory can be defined via `--include-path`. This way it is possible to have global include files while local ones will still take precedence. + Optionally the delimiters can be defined: ```markdown @@ -767,6 +769,7 @@ GLOBAL OPTIONS: --parents-delimiter value The delimiter used for the nested parent (default: "/") [$MARK_PARENTS_DELIMITER] --mermaid-provider value defines the mermaid provider to use. Supported options are: cloudscript, mermaid-go. (default: "cloudscript") [$MARK_MERMAID_PROVIDER] --mermaid-scale value defines the scaling factor for mermaid renderings. (default: 1) [$MARK_MERMAID_SCALE] + --include-path value Path for shared includes, used as a fallback if the include doesn't exist in the current directory. [$MARK_INCLUDE_PATH] --help, -h show help --version, -v print the version ``` diff --git a/main.go b/main.go index 8f8f7f1..45a361f 100644 --- a/main.go +++ b/main.go @@ -173,6 +173,13 @@ var flags = []cli.Flag{ Usage: "defines the scaling factor for mermaid renderings.", EnvVars: []string{"MARK_MERMAID_SCALE"}, }), + 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"}, + }), } func main() { @@ -339,6 +346,7 @@ func processFile( for { templates, markdown, recurse, err = includes.ProcessIncludes( filepath.Dir(file), + cCtx.String("include-path"), markdown, templates, ) @@ -353,6 +361,7 @@ func processFile( macros, markdown, err := macro.ExtractMacros( filepath.Dir(file), + cCtx.String("include-path"), markdown, templates, ) diff --git a/pkg/mark/attachment/attachment_test.go b/pkg/mark/attachment/attachment_test.go index 683b0f4..a89324f 100644 --- a/pkg/mark/attachment/attachment_test.go +++ b/pkg/mark/attachment/attachment_test.go @@ -45,7 +45,7 @@ func TestPrepareAttachmentsWithWorkDirBase(t *testing.T) { } attaches, err := prepareAttachments(testingOpener, ".", replacements) - t.Logf("attatches: %s", err) + t.Logf("attaches: %s", err) if err != nil { println(err.Error()) t.Fatal(err) diff --git a/pkg/mark/includes/templates.go b/pkg/mark/includes/templates.go index 3cb4905..9bd1078 100644 --- a/pkg/mark/includes/templates.go +++ b/pkg/mark/includes/templates.go @@ -28,6 +28,7 @@ var reIncludeDirective = regexp.MustCompile( func LoadTemplate( base string, + includePath string, path string, left string, right string, @@ -46,12 +47,17 @@ func LoadTemplate( body, err := os.ReadFile(filepath.Join(base, path)) if err != nil { - err = facts.Format( - err, - "unable to read template file", - ) + if includePath != "" { + body, err = os.ReadFile(filepath.Join(includePath, path)) + } + if err != nil { + err = facts.Format( + err, + "unable to read template file", + ) + return nil, err + } - return nil, err } body = bytes.ReplaceAll( @@ -75,6 +81,7 @@ func LoadTemplate( func ProcessIncludes( base string, + includePath string, contents []byte, templates *template.Template, ) (*template.Template, []byte, bool, error) { @@ -141,10 +148,9 @@ func ProcessIncludes( log.Tracef(vardump(facts, data), "including template %q", path) - templates, err = LoadTemplate(base, path, left, right, templates) + templates, err = LoadTemplate(base, includePath, path, left, right, templates) if err != nil { err = facts.Format(err, "unable to load template") - return nil } diff --git a/pkg/mark/macro/macro.go b/pkg/mark/macro/macro.go index 2c4b547..34f8233 100644 --- a/pkg/mark/macro/macro.go +++ b/pkg/mark/macro/macro.go @@ -106,6 +106,7 @@ func (macro *Macro) configure(node interface{}, groups [][]byte) interface{} { func ExtractMacros( base string, + includePath string, contents []byte, templates *template.Template, ) ([]Macro, []byte, error) { @@ -167,7 +168,7 @@ func ExtractMacros( return nil } } else { - macro.Template, err = includes.LoadTemplate(base, template, "{{", "}}", templates) + macro.Template, err = includes.LoadTemplate(base, includePath, template, "{{", "}}", templates) if err != nil { err = karma.Format(err, "unable to load template") diff --git a/pkg/mark/stdlib/stdlib.go b/pkg/mark/stdlib/stdlib.go index 74124bc..a8b4c54 100644 --- a/pkg/mark/stdlib/stdlib.go +++ b/pkg/mark/stdlib/stdlib.go @@ -41,6 +41,7 @@ func macros(templates *template.Template) ([]macro.Macro, error) { } macros, _, err := macro.ExtractMacros( + "", "", text( `