1
+ use bibliography:: InputBibliography as Bibliography ;
2
+ use bibliography:: InputReference ;
3
+ use edtf:: level_1:: Edtf ;
4
+ use rayon:: prelude:: * ;
1
5
use schemars:: JsonSchema ;
2
6
use serde:: { Deserialize , Serialize } ;
3
- use rayon:: prelude:: * ;
4
7
use std:: collections:: HashMap ;
5
8
use std:: fmt:: Debug ;
6
9
use std:: fs;
7
10
use std:: option:: Option ;
8
11
use std:: sync:: { Arc , Mutex } ;
9
-
10
- use bibliography:: InputBibliography as Bibliography ;
11
- use bibliography:: InputReference ;
12
12
use style:: options:: { SortOrder , StyleSortGroupKey , StyleSorting } ;
13
13
#[ allow( unused_imports) ] // for now
14
14
use style:: template:: {
15
15
Contributors , DateForm , Dates , StyleTemplateComponent , StyleTemplateContributor ,
16
+ StyleTemplateDate , StyleTemplateList , StyleTemplateTitle , Titles ,
16
17
} ;
17
18
use style:: Style ;
18
19
@@ -116,16 +117,171 @@ impl Default for ProcHints {
116
117
}
117
118
}
118
119
119
- impl Processor {
120
+ pub trait Render < T > {
121
+ fn render ( & self , reference : & InputReference , component : & T ) -> String ;
122
+ }
123
+
124
+ // WTD???
125
+
126
+ pub trait RenderComponent {
127
+ fn render (
128
+ & self ,
129
+ reference : & InputReference ,
130
+ // context: &RenderContext<T>,
131
+ ) -> String ;
132
+ }
133
+
134
+ pub trait RenderDate {
135
+ fn render (
136
+ & self ,
137
+ reference : & InputReference ,
138
+ // context: &RenderContext<T>,
139
+ ) -> String ;
140
+
141
+ fn render_date ( & self , date_string : & str , format_string : & str ) -> String ;
142
+ }
143
+
144
+ pub trait RenderTitle {
145
+ fn render (
146
+ & self ,
147
+ reference : & InputReference ,
148
+ // context: &RenderContext<T>,
149
+ ) -> String ;
150
+ }
151
+
152
+ pub trait RenderContributor {
153
+ fn render (
154
+ & self ,
155
+ reference : & InputReference ,
156
+ ) -> String ;
157
+ }
158
+
159
+ impl RenderComponent for StyleTemplateComponent {
160
+ fn render (
161
+ & self ,
162
+ reference : & InputReference ,
163
+ // context: &RenderContext<T>,
164
+ ) -> String {
165
+ match self {
166
+ StyleTemplateComponent :: Title ( title) => title. render ( reference) ,
167
+ StyleTemplateComponent :: Contributor ( contributor) => {
168
+ contributor. render ( reference)
169
+ }
170
+ StyleTemplateComponent :: Date ( date) => date. render ( reference) ,
171
+ StyleTemplateComponent :: List ( _list) => todo ! ( ) ,
172
+ }
173
+ }
174
+ }
175
+
176
+ impl < T : RenderContributor + ?Sized > dyn Render < T > {
177
+ pub fn render ( names : Vec < String > ) -> String {
178
+ names. join ( ", " )
179
+ }
180
+ }
120
181
182
+ impl RenderTitle for StyleTemplateTitle {
183
+ fn render (
184
+ & self ,
185
+ reference : & InputReference ,
186
+ ) -> String {
187
+ let title: & str = match & self . title {
188
+ Titles :: Title => reference. title . as_ref ( ) . unwrap ( ) ,
189
+ Titles :: ContainerTitle => todo ! ( ) ,
190
+ } ;
191
+ title. to_string ( )
192
+ }
193
+ }
194
+
195
+ impl RenderContributor for StyleTemplateContributor {
196
+ fn render (
197
+ & self ,
198
+ reference : & InputReference ,
199
+ ) -> String {
200
+ match & self . contributor {
201
+ Contributors :: Author => {
202
+ let authors = reference
203
+ . author
204
+ . as_ref ( )
205
+ . unwrap_or ( & Vec :: new ( ) )
206
+ . par_iter ( )
207
+ . map ( |name| name. to_string ( ) )
208
+ . collect :: < Vec < String > > ( ) ;
209
+ authors. join ( ", " )
210
+ }
211
+ Contributors :: Editor => {
212
+ let editors = reference
213
+ . editor
214
+ . as_ref ( )
215
+ . unwrap ( )
216
+ . par_iter ( )
217
+ . map ( |editor| editor. to_string ( ) )
218
+ . collect :: < Vec < String > > ( ) ;
219
+ editors. join ( ", " )
220
+ }
221
+ Contributors :: Translator => {
222
+ let translators = reference
223
+ . translator
224
+ . as_ref ( )
225
+ . unwrap ( )
226
+ . par_iter ( )
227
+ . map ( |translator| translator. to_string ( ) )
228
+ . collect :: < Vec < String > > ( ) ;
229
+ translators. join ( ", " )
230
+ }
231
+ Contributors :: Director => todo ! ( ) ,
232
+ Contributors :: Publisher => todo ! ( ) ,
233
+ Contributors :: Recipient => todo ! ( ) ,
234
+ Contributors :: Interviewer => todo ! ( ) ,
235
+ Contributors :: Interviewee => todo ! ( ) ,
236
+ Contributors :: Composer => todo ! ( ) ,
237
+ Contributors :: Inventor => todo ! ( ) ,
238
+ Contributors :: Counsel => todo ! ( ) ,
239
+ }
240
+ }
241
+ }
242
+
243
+ impl RenderDate for StyleTemplateDate {
244
+ fn render (
245
+ & self ,
246
+ reference : & InputReference ,
247
+ ) -> String {
248
+ let date_string: & str = match self . date {
249
+ Dates :: Issued => reference. issued . as_ref ( ) . unwrap ( ) ,
250
+ Dates :: Accessed => reference. accessed . as_ref ( ) . unwrap ( ) ,
251
+ Dates :: OriginalPublished => todo ! ( ) ,
252
+ } ;
253
+
254
+ let format_string: & str = match self . form {
255
+ DateForm :: Year => "%Y" ,
256
+ DateForm :: YearMonth => "%Y-%m" ,
257
+ DateForm :: Full => "%Y-%m-%d" ,
258
+ DateForm :: MonthDay => "%m-%d" ,
259
+ } ;
260
+
261
+ self . render_date ( date_string, format_string)
262
+ }
263
+ fn render_date ( & self , date_string : & str , _format_string : & str ) -> String {
264
+ let edtf_date: Edtf = Edtf :: parse ( date_string) . unwrap ( ) ;
265
+ let formatted_date: String = match edtf_date {
266
+ // TODO need localized date rendering, using format_string
267
+ Edtf :: Date ( date) => date. to_string ( ) ,
268
+ Edtf :: DateTime { .. } => todo ! ( ) ,
269
+ Edtf :: Interval { .. } => todo ! ( ) ,
270
+ Edtf :: IntervalFrom { .. } => todo ! ( ) ,
271
+ Edtf :: IntervalTo { .. } => todo ! ( ) ,
272
+ Edtf :: YYear { .. } => todo ! ( ) ,
273
+ } ;
274
+ formatted_date
275
+ }
276
+ }
277
+
278
+ impl Processor {
121
279
/// Render references to AST.
122
280
pub fn render_references ( & self ) -> Vec < ProcTemplate > {
123
281
let sorted_references = self . sort_references ( self . get_references ( ) ) ;
124
282
sorted_references
125
283
. par_iter ( )
126
- . map ( |reference| {
127
- self . render_reference ( reference)
128
- } )
284
+ . map ( |reference| self . render_reference ( reference) )
129
285
. collect ( )
130
286
}
131
287
@@ -134,11 +290,10 @@ impl Processor {
134
290
let bibliography_style = self . style . bibliography . clone ( ) ;
135
291
bibliography_style
136
292
. map ( |style| {
137
- style. template
293
+ style
294
+ . template
138
295
. par_iter ( )
139
- . map ( |component| {
140
- self . render_template_component ( component, reference)
141
- } )
296
+ . map ( |component| self . render_template_component ( component, reference) )
142
297
. collect ( )
143
298
} )
144
299
. unwrap_or_else ( std:: vec:: Vec :: new)
@@ -149,23 +304,9 @@ impl Processor {
149
304
component : & StyleTemplateComponent ,
150
305
reference : & InputReference ,
151
306
) -> ProcTemplateComponent {
152
- let rendered = match component {
153
- StyleTemplateComponent :: Date ( date) => {
154
- reference. render_date ( date)
155
- }
156
- StyleTemplateComponent :: Contributor ( contributor) => {
157
- reference. render_contributors ( contributor)
158
- }
159
- StyleTemplateComponent :: Title ( title) => {
160
- reference. render_title ( title)
161
- }
162
- StyleTemplateComponent :: List ( list) => {
163
- reference. render_list ( list)
164
- }
165
- } ;
166
307
ProcTemplateComponent {
167
308
template_component : component. clone ( ) ,
168
- value : rendered ,
309
+ value : component . render ( reference ) ,
169
310
}
170
311
}
171
312
0 commit comments