diff --git a/main.go b/main.go index cdff75dcb6fe0a3e979131c023a9135a174237c3..86742ed457f7fbfdbd0cf02202f2751ac4e298c6 100644 --- a/main.go +++ b/main.go @@ -33,9 +33,11 @@ var ( flagHelp *bool = flag.BoolP("help", "h", false, "Show the help message") flagInput *string = flag.StringP("input", "i", "", "Path to input Markdown") flagOutput *string = flag.StringP("output", "o", "", "Path to output PNG") - flagMetaSize *int = flag.IntP("metasize", "m", 40, "Size of font for meta information") - flagPostTitleSize *int = flag.IntP("posttitlesize", "p", 60, "Size of font for post title") - flagSiteTitleSize *int = flag.IntP("sitetitlesize", "s", 50, "Size of font for site title") + flagMetaSize *int = flag.IntP("metasize", "M", 40, "Size of font for meta information") + flagPostTitleSize *int = flag.IntP("posttitlesize", "P", 60, "Size of font for post title") + flagSiteTitleSize *int = flag.IntP("sitetitlesize", "S", 50, "Size of font for site title") + flagTitle *string = flag.StringP("posttitle", "t", "", "Title displayed in the generated image") + flagSubtitle *string = flag.StringP("subtitle", "s", "", "Subtitle displayed in the generated image") ) //go:embed fonts @@ -49,12 +51,17 @@ func main() { os.Exit(0) } - validateFlags() + manual := validateFlags() + + var postTitle, postDate, postContent, postReadTime, dateEdited string + + if !manual { + postTitle, postDate, postContent = getPostInfo(*flagInput) + postReadTime = getReadTime(postContent) + dateEdited = getEditDate(*flagInput) + } - postTitle, postDate, postContent := getPostInfo(*flagInput) - postReadTime := getReadTime(postContent) siteTitle := getSiteTitle() - dateEdited := getEditDate(*flagInput) collection := fontCollection() @@ -88,67 +95,79 @@ func main() { layout.Rigid(func(gtx layout.Context) layout.Dimensions { gtx.Constraints.Max.X = int(float64(gtx.Constraints.Max.X) * .9) gtx.Constraints.Min.X = gtx.Constraints.Max.X - title := material.Label(th, unit.Sp(float32(*flagPostTitleSize)), postTitle) + var title material.LabelStyle + if manual { + title = material.Label(th, unit.Sp(float32(*flagPostTitleSize)), *flagTitle) + } else { + title = material.Label(th, unit.Sp(float32(*flagPostTitleSize)), postTitle) + } title.Font = text.Font{Typeface: "Primary font", Variant: "", Style: text.Regular, Weight: text.Bold} title.Alignment = text.Middle return title.Layout(gtx) }), layout.Rigid(func(gtx layout.Context) layout.Dimensions { - gtx.Constraints.Max.X = int(float64(gtx.Constraints.Max.X) * .7) - gtx.Constraints.Min.X = gtx.Constraints.Max.X - return layout.Flex{Axis: layout.Vertical}.Layout(gtx, - layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return layout.Flex{Axis: layout.Horizontal, Spacing: layout.SpaceBetween}.Layout(gtx, - layout.Rigid(func(gtx layout.Context) layout.Dimensions { - rTime := material.Label(th, unit.Sp(float32(*flagMetaSize)), "Reading Time: ") - rTime.Font = text.Font{Typeface: "Primary font", Variant: "", Style: text.Regular, Weight: text.Bold} - rTime.Alignment = text.Start - return rTime.Layout(gtx) - }), - layout.Rigid(func(gtx layout.Context) layout.Dimensions { - rTime := material.Label(th, unit.Sp(float32(*flagMetaSize)), postReadTime) - rTime.Font = text.Font{Typeface: "Primary font", Variant: "", Style: text.Regular, Weight: text.Normal} - rTime.Alignment = text.End - return rTime.Layout(gtx) - }), - ) - }), - - layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return layout.Flex{Axis: layout.Horizontal, Spacing: layout.SpaceBetween}.Layout(gtx, - layout.Rigid(func(gtx layout.Context) layout.Dimensions { - pDate := material.Label(th, unit.Sp(float32(*flagMetaSize)), "Published: ") - pDate.Font = text.Font{Typeface: "Primary font", Variant: "", Style: text.Regular, Weight: text.Bold} - pDate.Alignment = text.Start - return pDate.Layout(gtx) - }), - layout.Rigid(func(gtx layout.Context) layout.Dimensions { - pDate := material.Label(th, unit.Sp(float32(*flagMetaSize)), fmt.Sprint(postDate)) - pDate.Font = text.Font{Typeface: "Primary font", Variant: "", Style: text.Regular, Weight: text.Normal} - pDate.Alignment = text.End - return pDate.Layout(gtx) - }), - ) - }), - - layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return layout.Flex{Axis: layout.Horizontal, Spacing: layout.SpaceBetween}.Layout(gtx, - layout.Rigid(func(gtx layout.Context) layout.Dimensions { - eDate := material.Label(th, unit.Sp(float32(*flagMetaSize)), "Edited: ") - eDate.Font = text.Font{Typeface: "Primary font", Variant: "", Style: text.Regular, Weight: text.Bold} - eDate.Alignment = text.Start - return eDate.Layout(gtx) - }), - layout.Rigid(func(gtx layout.Context) layout.Dimensions { - eDate := material.Label(th, unit.Sp(float32(*flagMetaSize)), fmt.Sprint(dateEdited)) - eDate.Font = text.Font{Typeface: "Primary font", Variant: "", Style: text.Regular, Weight: text.Normal} - eDate.Alignment = text.End - return eDate.Layout(gtx) - }), - ) - }), - ) + if manual { + subtitle := material.Label(th, unit.Sp(float32(*flagMetaSize)), *flagSubtitle) + subtitle.Font = text.Font{Typeface: "Primary font", Variant: "", Style: text.Italic, Weight: text.Normal} + subtitle.Alignment = text.Middle + return subtitle.Layout(gtx) + } else { + gtx.Constraints.Max.X = int(float64(gtx.Constraints.Max.X) * .7) + gtx.Constraints.Min.X = gtx.Constraints.Max.X + return layout.Flex{Axis: layout.Vertical}.Layout(gtx, + layout.Rigid(func(gtx layout.Context) layout.Dimensions { + return layout.Flex{Axis: layout.Horizontal, Spacing: layout.SpaceBetween}.Layout(gtx, + layout.Rigid(func(gtx layout.Context) layout.Dimensions { + rTime := material.Label(th, unit.Sp(float32(*flagMetaSize)), "Reading Time: ") + rTime.Font = text.Font{Typeface: "Primary font", Variant: "", Style: text.Regular, Weight: text.Bold} + rTime.Alignment = text.Start + return rTime.Layout(gtx) + }), + layout.Rigid(func(gtx layout.Context) layout.Dimensions { + rTime := material.Label(th, unit.Sp(float32(*flagMetaSize)), postReadTime) + rTime.Font = text.Font{Typeface: "Primary font", Variant: "", Style: text.Regular, Weight: text.Normal} + rTime.Alignment = text.End + return rTime.Layout(gtx) + }), + ) + }), + + layout.Rigid(func(gtx layout.Context) layout.Dimensions { + return layout.Flex{Axis: layout.Horizontal, Spacing: layout.SpaceBetween}.Layout(gtx, + layout.Rigid(func(gtx layout.Context) layout.Dimensions { + pDate := material.Label(th, unit.Sp(float32(*flagMetaSize)), "Published: ") + pDate.Font = text.Font{Typeface: "Primary font", Variant: "", Style: text.Regular, Weight: text.Bold} + pDate.Alignment = text.Start + return pDate.Layout(gtx) + }), + layout.Rigid(func(gtx layout.Context) layout.Dimensions { + pDate := material.Label(th, unit.Sp(float32(*flagMetaSize)), fmt.Sprint(postDate)) + pDate.Font = text.Font{Typeface: "Primary font", Variant: "", Style: text.Regular, Weight: text.Normal} + pDate.Alignment = text.End + return pDate.Layout(gtx) + }), + ) + }), + + layout.Rigid(func(gtx layout.Context) layout.Dimensions { + return layout.Flex{Axis: layout.Horizontal, Spacing: layout.SpaceBetween}.Layout(gtx, + layout.Rigid(func(gtx layout.Context) layout.Dimensions { + eDate := material.Label(th, unit.Sp(float32(*flagMetaSize)), "Edited: ") + eDate.Font = text.Font{Typeface: "Primary font", Variant: "", Style: text.Regular, Weight: text.Bold} + eDate.Alignment = text.Start + return eDate.Layout(gtx) + }), + layout.Rigid(func(gtx layout.Context) layout.Dimensions { + eDate := material.Label(th, unit.Sp(float32(*flagMetaSize)), fmt.Sprint(dateEdited)) + eDate.Font = text.Font{Typeface: "Primary font", Variant: "", Style: text.Regular, Weight: text.Normal} + eDate.Alignment = text.End + return eDate.Layout(gtx) + }), + ) + }), + ) + } }), layout.Rigid(func(gtx layout.Context) layout.Dimensions { @@ -314,16 +333,31 @@ It looks at... `) } -// Validate flags -func validateFlags() { - if *flagInput == "" { - fmt.Println("Error: No input file specified") +// Validate flags and return true if the user is manually specifying the title +// and subtitle +func validateFlags() bool { + ret := false + if *flagInput == "" && (*flagTitle == "" || *flagSubtitle == "") { + fmt.Println("Error: input file not specified and title or subtitle not specified. Please specify EITHER an input file or both a title AND subtitle.") + os.Exit(1) + } else if *flagInput != "" && (*flagTitle != "" || *flagSubtitle != "") { + fmt.Println("Warning: input file specified and title or subtitle specified. Ignoring title and subtitle flags and continuing with input file") + } else if *flagTitle != "" && *flagSubtitle != "" { + ret = true + } else if *flagTitle == "" && *flagSubtitle != "" { + fmt.Println("Error: subtitle specified but title not specified") + os.Exit(1) + } else if *flagTitle != "" && *flagSubtitle == "" { + fmt.Println("Error: title specified but subtitle not specified") os.Exit(1) } + if *flagOutput == "" { fmt.Println("Error: No output file specified") os.Exit(1) } + + return ret } // Get the post's title, subtitle, and date