@@ -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,35 @@ 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
+ raw_config =
29
+ Application . get_env ( :tableau , module , % { } ) |> Map . new ( )
30
+
31
+ if raw_config [ :enabled ] do
32
+ { :ok , config } =
33
+ raw_config
34
+ |> config_mod . new ( )
35
+
36
+ { :ok , key } = Tableau.Extension . key ( module )
37
+
38
+ token = put_in ( token [ key ] , config )
39
+
40
+ case module . run ( token ) do
41
+ { :ok , token } ->
42
+ token
43
+
44
+ :error ->
45
+ Logger . error ( "#{ inspect ( module ) } failed to run" )
46
+ token
47
+ end
48
+ else
49
+ token
50
+ end
26
51
end
27
- end
28
52
29
53
mods = :code . all_available ( )
30
54
graph = Tableau.Graph . new ( mods )
@@ -35,12 +59,12 @@ defmodule Mix.Tasks.Tableau.Build do
35
59
{ mod , Map . new ( mod . __tableau_opts__ ( ) || [ ] ) }
36
60
end
37
61
38
- { mods , pages } = Enum . unzip ( pages )
62
+ { page_mods , pages } = Enum . unzip ( pages )
39
63
40
- site = Map . put ( site , :pages , pages )
64
+ token = put_in ( token . site [ :pages ] , pages )
41
65
42
- for mod <- mods do
43
- content = Tableau.Document . render ( graph , mod , % { site: site } )
66
+ for mod <- page_mods do
67
+ content = Tableau.Document . render ( graph , mod , token )
44
68
permalink = mod . __tableau_permalink__ ( )
45
69
dir = Path . join ( out , permalink )
46
70
@@ -52,13 +76,50 @@ defmodule Mix.Tasks.Tableau.Build do
52
76
if File . exists? ( config . include_dir ) do
53
77
File . cp_r! ( config . include_dir , out )
54
78
end
79
+
80
+ for module <- post_write_extensions ( mods ) , reduce: token do
81
+ token ->
82
+ config_mod = Module . concat ( [ module , Config ] )
83
+
84
+ raw_config =
85
+ Application . get_env ( :tableau , module , % { } ) |> Map . new ( )
86
+
87
+ if raw_config [ :enabled ] do
88
+ { :ok , config } =
89
+ raw_config
90
+ |> config_mod . new ( )
91
+
92
+ { :ok , key } = Tableau.Extension . key ( module )
93
+
94
+ token = put_in ( token [ key ] , config )
95
+
96
+ case module . run ( token ) do
97
+ { :ok , token } ->
98
+ token
99
+
100
+ :error ->
101
+ Logger . error ( "#{ inspect ( module ) } failed to run" )
102
+ token
103
+ end
104
+ else
105
+ token
106
+ end
107
+ end
55
108
end
56
109
57
110
defp pre_build_extensions ( modules ) do
58
111
for { mod , _ , _ } <- modules ,
59
112
mod = Module . concat ( [ to_string ( mod ) ] ) ,
60
- match? ( { :ok , :pre_build } , Tableau.Extension . type ( mod ) ) ,
61
- Tableau.Extension . enabled? ( mod ) do
113
+ match? ( { :ok , :pre_build } , Tableau.Extension . type ( mod ) ) do
114
+ mod
115
+ end
116
+ |> Enum . sort_by ( & & 1 . __tableau_extension_priority__ ( ) )
117
+ end
118
+
119
+ defp post_write_extensions ( modules ) do
120
+ for { mod , _ , _ } <- modules ,
121
+ mod = Module . concat ( [ to_string ( mod ) ] ) ,
122
+ match? ( { :ok , :post_write } , Tableau.Extension . type ( mod ) ) do
62
123
mod
63
124
end
64
125
|> Enum . sort_by ( & & 1 . __tableau_extension_priority__ ( ) )
0 commit comments