@@ -11,7 +11,7 @@ defmodule Mix.Tasks.Tableau.Build do
11
11
@ impl Mix.Task
12
12
def run ( argv ) do
13
13
{ :ok , config } = Tableau.Config . new ( @ config )
14
- site = % { config: config }
14
+ token = % { site: % { config: config } }
15
15
Mix.Task . run ( "app.start" , [ "--preload-modules" ] )
16
16
17
17
{ opts , _argv } = OptionParser . parse! ( argv , strict: [ out: :string ] )
@@ -20,11 +20,27 @@ defmodule Mix.Tasks.Tableau.Build do
20
20
21
21
mods = :code . all_available ( )
22
22
23
- for module <- pre_build_extensions ( mods ) do
24
- with :error <- module . run ( % { site: site } ) do
25
- Logger . error ( "#{ inspect ( module ) } failed to run" )
23
+ token =
24
+ for module <- pre_build_extensions ( mods ) , reduce: token do
25
+ token ->
26
+ config_mod = Module . concat ( [ module , Config ] )
27
+
28
+ { :ok , config } =
29
+ Application . get_env ( :tableau , module , % { } ) |> Map . new ( ) |> config_mod . new ( )
30
+
31
+ { :ok , key } = Tableau.Extension . key ( module )
32
+
33
+ token = put_in ( token [ key ] , config )
34
+
35
+ case module . run ( token ) do
36
+ { :ok , token } ->
37
+ token
38
+
39
+ :error ->
40
+ Logger . error ( "#{ inspect ( module ) } failed to run" )
41
+ token
42
+ end
26
43
end
27
- end
28
44
29
45
mods = :code . all_available ( )
30
46
graph = Tableau.Graph . new ( mods )
@@ -35,12 +51,12 @@ defmodule Mix.Tasks.Tableau.Build do
35
51
{ mod , Map . new ( mod . __tableau_opts__ ( ) || [ ] ) }
36
52
end
37
53
38
- { mods , pages } = Enum . unzip ( pages )
54
+ { page_mods , pages } = Enum . unzip ( pages )
39
55
40
- site = Map . put ( site , :pages , pages )
56
+ token = put_in ( token . site [ :pages ] , pages )
41
57
42
- for mod <- mods do
43
- content = Tableau.Document . render ( graph , mod , % { site: site } )
58
+ for mod <- page_mods do
59
+ content = Tableau.Document . render ( graph , mod , token )
44
60
permalink = mod . __tableau_permalink__ ( )
45
61
dir = Path . join ( out , permalink )
46
62
@@ -52,6 +68,27 @@ defmodule Mix.Tasks.Tableau.Build do
52
68
if File . exists? ( config . include_dir ) do
53
69
File . cp_r! ( config . include_dir , out )
54
70
end
71
+
72
+ for module <- post_write_extensions ( mods ) , reduce: token do
73
+ token ->
74
+ config_mod = Module . concat ( [ module , Config ] )
75
+
76
+ { :ok , config } =
77
+ Application . get_env ( :tableau , module , % { } ) |> Map . new ( ) |> config_mod . new ( )
78
+
79
+ { :ok , key } = Tableau.Extension . key ( module )
80
+
81
+ token = put_in ( token [ key ] , config )
82
+
83
+ case module . run ( token ) do
84
+ { :ok , token } ->
85
+ token
86
+
87
+ :error ->
88
+ Logger . error ( "#{ inspect ( module ) } failed to run" )
89
+ token
90
+ end
91
+ end
55
92
end
56
93
57
94
defp pre_build_extensions ( modules ) do
@@ -63,4 +100,14 @@ defmodule Mix.Tasks.Tableau.Build do
63
100
end
64
101
|> Enum . sort_by ( & & 1 . __tableau_extension_priority__ ( ) )
65
102
end
103
+
104
+ defp post_write_extensions ( modules ) do
105
+ for { mod , _ , _ } <- modules ,
106
+ mod = Module . concat ( [ to_string ( mod ) ] ) ,
107
+ match? ( { :ok , :post_write } , Tableau.Extension . type ( mod ) ) ,
108
+ Tableau.Extension . enabled? ( mod ) do
109
+ mod
110
+ end
111
+ |> Enum . sort_by ( & & 1 . __tableau_extension_priority__ ( ) )
112
+ end
66
113
end
0 commit comments