mirror of
https://github.com/wader/fq.git
synced 2024-12-23 13:22:58 +03:00
109 lines
2.0 KiB
Go
109 lines
2.0 KiB
Go
// Takes markdown on stdin and outputs same markdown with shell commands expanded
|
||
// lines inside sh sections ending with non-breaking-space " " will be kept and
|
||
// those starting with $ will also be exected as shell commands and output will
|
||
// be inserted.
|
||
|
||
// <pre sh>
|
||
// # comment
|
||
// $ echo test
|
||
// will be replaced
|
||
// </pre>
|
||
// Becomes:
|
||
// <pre sh>
|
||
// # comment
|
||
// $ echo test
|
||
// test
|
||
// </pre>
|
||
//
|
||
// ```sh (sh)
|
||
// # comment
|
||
// $ echo test
|
||
// will be replaced
|
||
// ```
|
||
// Becomes:
|
||
// ```sh (sh)
|
||
// # comment
|
||
// $ echo test
|
||
// test
|
||
// ```
|
||
//
|
||
// [echo test]: sh-start
|
||
// will be replaced
|
||
// [#]: sh-end
|
||
// Becomes:
|
||
// [echo test]: sh-start
|
||
// test
|
||
// [#]: sh-end
|
||
|
||
//nolint:gosec
|
||
package main
|
||
|
||
import (
|
||
"bufio"
|
||
"fmt"
|
||
"os"
|
||
"os/exec"
|
||
"regexp"
|
||
"strings"
|
||
)
|
||
|
||
func main() {
|
||
scanner := bufio.NewScanner(os.Stdin)
|
||
nextLine := func() (string, bool) {
|
||
ok := scanner.Scan()
|
||
return scanner.Text(), ok
|
||
}
|
||
|
||
preShRe := regexp.MustCompile("<pre sh>")
|
||
shRe := regexp.MustCompile("```.* \\(sh\\)")
|
||
const nonBreakingSpace = rune(0xa0) // -> " "
|
||
shStartRe := regexp.MustCompile(`\[(.*)\]: sh-start`)
|
||
shEnd := "[#]: sh-end"
|
||
|
||
for {
|
||
l, ok := nextLine()
|
||
if !ok {
|
||
break
|
||
}
|
||
|
||
preShReMatches := preShRe.MatchString(l)
|
||
shReMatches := shRe.MatchString(l)
|
||
if preShReMatches || shReMatches {
|
||
fmt.Println(l)
|
||
for {
|
||
l, ok := nextLine()
|
||
if !ok || ((shReMatches && l == "```") || preShReMatches && l == "</pre>") {
|
||
fmt.Println(l)
|
||
break
|
||
}
|
||
|
||
rl := []rune(l)
|
||
if len(rl) >= 1 && rl[len(rl)-1] == nonBreakingSpace {
|
||
fmt.Println(l)
|
||
if strings.HasPrefix(l, "$") {
|
||
cmd := exec.Command("sh", "-c", l[1:len(l)-2])
|
||
o, _ := cmd.CombinedOutput()
|
||
fmt.Print(string(o))
|
||
}
|
||
}
|
||
}
|
||
} else if sm := shStartRe.FindStringSubmatch(l); sm != nil {
|
||
fmt.Println(l)
|
||
fmt.Println()
|
||
for {
|
||
l, ok := nextLine()
|
||
if !ok || l == shEnd {
|
||
break
|
||
}
|
||
}
|
||
cmd := exec.Command("sh", "-c", sm[1])
|
||
o, _ := cmd.CombinedOutput()
|
||
fmt.Print(string(o))
|
||
fmt.Println()
|
||
fmt.Println(shEnd)
|
||
} else {
|
||
fmt.Println(l)
|
||
}
|
||
}
|
||
}
|