Skip to content

Commit f49414c

Browse files
authored
Add option to preserve header (#58)
* Add popHeader option Signed-off-by: Saswata Mukherjee <saswataminsta@yahoo.com> * Make root file popHeader default Signed-off-by: Saswata Mukherjee <saswataminsta@yahoo.com> * Fix test Signed-off-by: Saswata Mukherjee <saswataminsta@yahoo.com>
1 parent 26c4495 commit f49414c

6 files changed

Lines changed: 32 additions & 4 deletions

File tree

pkg/transform/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ type TransformationConfig struct {
6868
// TODO(bwplotka): Explain ** and * suffixes and ability to specify "invalid" paths like "/../".
6969
Path string
7070

71+
PopHeader *bool `yaml:"popHeader"`
72+
7173
// FrontMatter holds front matter transformations.
7274
FrontMatter *MatterConfig `yaml:"frontMatter"`
7375

pkg/transform/testdata/expected/test3/3/Proposals/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ slug: README.md
44
lastmod: 'TODO: Allow testing last mod .Origin.LastMod'
55
---
66

7+
# Proposals
8+
79
[RelLink](../_index.md)
810

911
[RelLink](../Team/doc.md)

pkg/transform/testdata/mdox1.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ transformations:
1818
path: "/**"
1919
2020
- glob: "**/README.md"
21+
popHeader: true
2122
frontMatter:
2223
template: |
2324
title: "{{ .Origin.FirstHeader }}"

pkg/transform/testdata/mdox2.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ transformations:
1717

1818
- glob: "../test.md"
1919
path: /_index.md
20+
popHeader: true
2021
frontMatter:
2122
template: |
2223
title: "{{ .Origin.FirstHeader }}"
@@ -27,20 +28,23 @@ transformations:
2728
path: "/**"
2829
2930
- glob: "doc.md"
31+
popHeader: true
3032
frontMatter:
3133
template: |
3234
title: "{{ .Origin.FirstHeader }}"
3335
slug: "{{ .Target.FileName }}"
3436
3537
- glob: "Team/doc.md"
3638
path: inner/doc.md
39+
popHeader: true
3740
frontMatter:
3841
template: |
3942
title: "{{ .Origin.FirstHeader }}"
4043
yolo: "yolo"
4144
4245
- glob: "**/README.md"
4346
path: /test1/_index.md
47+
popHeader: true
4448
frontMatter:
4549
template: |
4650
title: "{{ .Origin.FirstHeader }}"

pkg/transform/testdata/mdox3.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ transformations:
3535
3636
3737
- glob: "**.md"
38+
popHeader: true
3839
backMatter:
3940
template: |
4041
Found a typo, inconsistency or missing information in our docs?

pkg/transform/transform.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -171,14 +171,29 @@ func (t *transformer) transformFile(path string, info os.FileInfo, err error) er
171171
return errors.Errorf("front matter option set on file that after transformation is non-markdown: %v", target)
172172
}
173173

174-
firstHeader, rest, err := popFirstHeader(path)
174+
dir, file := filepath.Split(path)
175+
// Remove trailing slash after split and check if root file.
176+
if dir[:len(dir)-1] == t.c.InputDir && isMDFile(file) && tr.PopHeader == nil {
177+
// Default popHeader to true for inputDir root file.
178+
tr.PopHeader = func() *bool { b := true; return &b }()
179+
}
180+
181+
// If unset and not root file.
182+
if tr.PopHeader == nil {
183+
tr.PopHeader = func() *bool { b := false; return &b }()
184+
}
185+
186+
firstHeader, rest, err := getFirstHeader(path, *tr.PopHeader)
175187
if err != nil {
176188
return errors.Wrap(err, "read first header")
177189
}
178190

179-
if err := ioutil.WriteFile(target, rest, os.ModePerm); err != nil {
180-
return err
191+
if rest != nil {
192+
if err := ioutil.WriteFile(target, rest, os.ModePerm); err != nil {
193+
return err
194+
}
181195
}
196+
182197
_, originFilename := filepath.Split(path)
183198
_, targetFilename := filepath.Split(target)
184199
opts = append(opts, mdformatter.WithFrontMatterTransformer(&frontMatterTransformer{
@@ -413,7 +428,7 @@ func copyFiles(src, dst string) (err error) {
413428

414429
// TODO(bwplotka): Use formatter, remove the title etc.
415430
// Super hacky for now.
416-
func popFirstHeader(path string) (_ string, rest []byte, err error) {
431+
func getFirstHeader(path string, popHeader bool) (_ string, rest []byte, err error) {
417432
file, err := os.Open(path)
418433
if err != nil {
419434
return "", nil, err
@@ -424,6 +439,9 @@ func popFirstHeader(path string) (_ string, rest []byte, err error) {
424439
for scanner.Scan() {
425440
text := scanner.Text()
426441
if strings.HasPrefix(text, "#") {
442+
if !popHeader {
443+
return strings.TrimPrefix(text, "# "), rest, scanner.Err()
444+
}
427445
if _, err := file.Seek(int64(len(text)), 0); err != nil {
428446
return "", nil, errors.Wrap(err, "seek")
429447
}

0 commit comments

Comments
 (0)