77package main
88
99import (
10- "bytes"
1110 "fmt"
1211 "os"
13- "path/filepath"
14- "strings"
1512
1613 recipemd "github.com/xcapaldi/recipemd-go"
14+ "github.com/xcapaldi/recipemd-go/examples/helper"
1715)
1816
1917func main () {
@@ -36,124 +34,10 @@ func main() {
3634 os .Exit (1 )
3735 }
3836
39- if err := flatten (p , r , os .Args [1 ]); err != nil {
37+ if err := helper . Flatten (p , r , os .Args [1 ]); err != nil {
4038 fmt .Fprintln (os .Stderr , err )
4139 os .Exit (1 )
4240 }
4341
4442 fmt .Print (p .RenderMarkdown (r , 2 ))
4543}
46-
47- func flatten (p * recipemd.Parser , r * recipemd.Recipe , recipeFile string ) error {
48- baseDir := filepath .Dir (recipeFile )
49- ingredients , err := flattenIngredients (p , r .Ingredients , baseDir )
50- if err != nil {
51- return fmt .Errorf ("flattenIngredients: %w" , err )
52- }
53- r .Ingredients = ingredients
54- groups , err := flattenIngredientGroups (p , r .IngredientGroups , baseDir )
55- if err != nil {
56- return fmt .Errorf ("flattenIngredientGroups: %w" , err )
57- }
58- r .IngredientGroups = groups
59- return nil
60- }
61-
62- func flattenIngredients (p * recipemd.Parser , ingredients []recipemd.Ingredient , baseDir string ) ([]recipemd.Ingredient , error ) {
63- result := make ([]recipemd.Ingredient , 0 , len (ingredients ))
64- for _ , ing := range ingredients {
65- if ing .Link != nil {
66- resolved , err := resolveLinkedRecipe (p , * ing .Link , baseDir , & ing )
67- if err != nil {
68- return nil , fmt .Errorf ("resolveLinkedRecipe: %w" , err )
69- }
70- result = append (result , resolved ... )
71- } else {
72- result = append (result , ing )
73- }
74- }
75- return result , nil
76- }
77-
78- func flattenIngredientGroups (p * recipemd.Parser , groups []recipemd.IngredientGroup , baseDir string ) ([]recipemd.IngredientGroup , error ) {
79- result := make ([]recipemd.IngredientGroup , 0 , len (groups ))
80- for _ , g := range groups {
81- ingredients , err := flattenIngredients (p , g .Ingredients , baseDir )
82- if err != nil {
83- return nil , fmt .Errorf ("flattenIngredients: %w" , err )
84- }
85- subGroups , err := flattenIngredientGroups (p , g .IngredientGroups , baseDir )
86- if err != nil {
87- return nil , fmt .Errorf ("flattenIngredientGroups: %w" , err )
88- }
89- result = append (result , recipemd.IngredientGroup {
90- Title : g .Title ,
91- Ingredients : ingredients ,
92- IngredientGroups : subGroups ,
93- })
94- }
95- return result , nil
96- }
97-
98- func resolveLinkedRecipe (p * recipemd.Parser , link string , baseDir string , parent * recipemd.Ingredient ) ([]recipemd.Ingredient , error ) {
99- if strings .Contains (link , "://" ) {
100- return []recipemd.Ingredient {* parent }, nil
101- }
102-
103- path := filepath .Join (baseDir , link )
104- data , err := os .ReadFile (path )
105- if err != nil {
106- return nil , fmt .Errorf ("os.ReadFile: %w" , err )
107- }
108-
109- linked , err := p .Parse (bytes .NewReader (data ))
110- if err != nil {
111- return nil , fmt .Errorf ("Parse: %w" , err )
112- }
113-
114- if parent .Amount != nil && len (linked .Yields ) > 0 {
115- if err := linked .ScaleForYield (* parent .Amount ); err != nil {
116- return nil , fmt .Errorf ("linked.ScaleForYield: %w" , err )
117- }
118- }
119-
120- linkedDir := filepath .Dir (path )
121- flatIngredients , err := flattenIngredients (p , linked .Ingredients , linkedDir )
122- if err != nil {
123- return nil , fmt .Errorf ("flattenIngredients: %w" , err )
124- }
125- for _ , g := range linked .IngredientGroups {
126- ingredients , err := flattenIngredients (p , g .Ingredients , linkedDir )
127- if err != nil {
128- return nil , fmt .Errorf ("flattenIngredients: %w" , err )
129- }
130- flatIngredients = append (flatIngredients , ingredients ... )
131- groupIngredients , err := flattenGroupIngredients (p , g .IngredientGroups , linkedDir )
132- if err != nil {
133- return nil , fmt .Errorf ("flattenGroupIngredients: %w" , err )
134- }
135- flatIngredients = append (flatIngredients , groupIngredients ... )
136- }
137-
138- if len (flatIngredients ) == 0 {
139- return []recipemd.Ingredient {* parent }, nil
140- }
141- return flatIngredients , nil
142- }
143-
144- func flattenGroupIngredients (p * recipemd.Parser , groups []recipemd.IngredientGroup , baseDir string ) ([]recipemd.Ingredient , error ) {
145- result := make ([]recipemd.Ingredient , 0 , len (groups ))
146- for _ , g := range groups {
147- ingredients , err := flattenIngredients (p , g .Ingredients , baseDir )
148- if err != nil {
149- return nil , fmt .Errorf ("flattenIngredients: %w" , err )
150- }
151- result = append (result , ingredients ... )
152- groupIngredients , err := flattenGroupIngredients (p , g .IngredientGroups , baseDir )
153- if err != nil {
154- return nil , fmt .Errorf ("flattenGroupIngredients: %w" , err )
155- }
156- result = append (result , groupIngredients ... )
157- }
158- return result , nil
159- }
0 commit comments