-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathcli.go
183 lines (161 loc) · 4.92 KB
/
cli.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
package scripttool
import (
"flag"
"fmt"
"os"
"path"
"strings"
// My packages
"github.com/rsdoiel/fountain"
)
func FmtCliText(s string, appName string, verb string, version string) string {
return strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(s, "{app_name}", appName), "{verb}", verb), "{version}", version)
}
func FmtCliHelp(appName string, verb string) string {
return fmt.Sprintf("%s %s is not documented", appName, verb)
}
func RunScripttool(in *os.File, out *os.File, eout *os.File, args []string) error {
var (
// Options
showHelp bool
inputFName string
outputFName string
alphaSort bool
err error
)
appName := path.Base(args[0])
if len(args) == 1 {
return fmt.Errorf("%s", FmtCliText(HelpText, appName, "", Version))
}
verb := strings.ToLower(strings.TrimSpace(args[1]))
// Standard flags
flagSet := flag.NewFlagSet(fmt.Sprintf("%s.%s", appName, verb), flag.ExitOnError)
flagSet.BoolVar(&showHelp, "h", false, "display verb help")
flagSet.BoolVar(&showHelp, "help", false, "display verb help")
flagSet.StringVar(&inputFName, "i", "", "set input filename")
flagSet.StringVar(&outputFName, "o", "", "set output filename")
flagSet.BoolVar(&fountain.ShowNotes, "notes", false, "include notes in output")
flagSet.BoolVar(&fountain.ShowSynopsis, "synopsis", false, "include synopsis in output")
flagSet.BoolVar(&fountain.ShowSection, "section", false, "include section headings in output")
flagSet.IntVar(&fountain.MaxWidth, "width", fountain.MaxWidth, "set width in integers")
flagSet.BoolVar(&fountain.AsHTMLPage, "html", false, "output as HTML")
flagSet.BoolVar(&fountain.InlineCSS, "inline-css", false, "include inline CSS")
flagSet.BoolVar(&fountain.LinkCSS, "link-css", false, "include CSS link")
flagSet.BoolVar(&fountain.PrettyPrint, "pretty", false, "prety print output")
flagSet.BoolVar(&alphaSort, "alpha", false, "sort a character list alpha betically versus order of appearence")
flagSet.Parse(args[2:])
args = flagSet.Args()
if showHelp {
fmt.Fprintln(out, FmtCliHelp(appName, verb))
return nil
}
if inputFName == "" && len(args) >= 1 {
inputFName = args[0]
}
if outputFName == "" && len(args) >= 2 {
outputFName = args[1]
}
// Figure out if we need to open files or use in, out, eout
if inputFName != "" && inputFName != "-" {
in, err = os.Open(inputFName)
if err != nil {
return err
}
defer in.Close()
}
if outputFName != "" && outputFName != "-" {
out, err = os.Create(outputFName)
if err != nil {
return err
}
defer out.Close()
}
switch verb {
// fadein to something
case "fadein2fdx":
if inputFName != "" {
return FadeInToFDX(inputFName, out)
}
return fmt.Errorf("A FadeIn filename required for input")
case "fadein2fountain":
if inputFName != "" {
return FadeInToFountain(inputFName, out)
}
return fmt.Errorf("A FadeIn filename required for input")
case "fadein2json":
if inputFName != "" {
return FadeInToJSON(inputFName, out)
}
return fmt.Errorf("A FadeIn filename required for input")
case "fadein2yaml":
if inputFName != "" {
return FadeInToYAML(inputFName, out)
}
case "fadein2osf":
if inputFName != "" {
return FadeInToOSF(inputFName, out)
}
return fmt.Errorf("A FadeIn filename required for input")
// fdx to something
case "fdx2fadein":
if outputFName != "" {
return FdxToFadeIn(in, outputFName)
}
return fmt.Errorf("A FadeIn filename required for output")
case "fdx2fountain":
return FdxToFountain(in, out)
case "fdx2json":
return FdxToJSON(in, out)
case "fdx2yaml":
return FdxToYAML(in, out)
case "fdx2osf":
return FdxToOSF(in, out)
// fountain to something
case "fountain2fadein":
if outputFName != "" {
return FountainToFadeIn(in, outputFName)
}
return fmt.Errorf("A FadeIn filename required for output")
case "fountain2fdx":
return FountainToFdx(in, out)
case "fountain2json":
return FountainToJSON(in, out)
case "fountain2yaml":
return FountainToYAML(in, out)
case "fountain2osf":
return FountainToOSF(in, out)
// osf to something
case "osf2fadein":
if outputFName != "" {
return OSFToFadeIn(in, outputFName)
}
return fmt.Errorf("A FadeIn filename required for output")
case "osf2fdx":
return OSFToFdx(in, out)
case "osf2fountain":
return OSFToFountain(in, out)
case "osf2json":
return OSFToJSON(in, out)
case "osf2yaml":
return OSFToYAML(in, out)
// Utility fountain functions
case "fountain2fountain":
return FountainToFountain(in, out)
case "fountainfmt":
return FountainFmt(in, out)
case "fountain2html":
return FountainToHTML(in, out)
case "characters":
//FIXME: add detection of file type, convert to fountain then
// run report.
return CharacterList(in, out, alphaSort)
// Help system
case "help":
fmt.Fprintln(out, FmtCliText(HelpText, appName, verb, Version))
return nil
// If we got this far we have an unknown verb
default:
return fmt.Errorf("do not understand %q in %q", verb, strings.Join(args, " "))
}
return nil
}