1
1
use std:: borrow:: Cow ;
2
2
use std:: collections:: HashMap ;
3
3
use std:: hash:: BuildHasher ;
4
+ use std:: io:: prelude:: * ;
4
5
use std:: path:: PathBuf ;
5
6
6
7
use base64:: { decode, encode} ;
7
8
use config:: Config ;
9
+ use flate2:: { read:: ZlibDecoder , write:: ZlibEncoder , Compression } ;
8
10
use rendering:: { render_content, RenderContext } ;
9
11
use tera:: {
10
12
to_value, try_get_value, Error as TeraError , Filter as TeraFilter , Result as TeraResult , Tera ,
@@ -109,13 +111,36 @@ impl TeraFilter for NumFormatFilter {
109
111
}
110
112
}
111
113
114
+ pub fn deflate_compress < S : BuildHasher > (
115
+ value : & Value ,
116
+ _: & HashMap < String , Value , S > ,
117
+ ) -> TeraResult < Value > {
118
+ let s = try_get_value ! ( "deflate_compress" , "value" , String , value) ;
119
+ let mut e = ZlibEncoder :: new ( Vec :: new ( ) , Compression :: new ( 9 ) ) ;
120
+ e. write_all ( s. as_bytes ( ) ) ?;
121
+ let result = e. finish ( ) ?;
122
+ Ok ( to_value ( & encode ( result) ) ?)
123
+ }
124
+
125
+ pub fn deflate_decompress < S : BuildHasher > (
126
+ value : & Value ,
127
+ _: & HashMap < String , Value , S > ,
128
+ ) -> TeraResult < Value > {
129
+ let base64 = try_get_value ! ( "deflate_decompress" , "value" , String , value) ;
130
+ let s = decode ( base64) . unwrap ( ) ;
131
+ let mut d = ZlibDecoder :: new ( s. as_slice ( ) ) ;
132
+ let mut result = String :: new ( ) ;
133
+ d. read_to_string ( & mut result) ?;
134
+ Ok ( to_value ( result) ?)
135
+ }
136
+
112
137
#[ cfg( test) ]
113
138
mod tests {
114
139
use std:: { collections:: HashMap , path:: PathBuf } ;
115
140
116
141
use tera:: { to_value, Filter } ;
117
142
118
- use super :: { base64_decode, base64_encode, MarkdownFilter , NumFormatFilter } ;
143
+ use super :: { base64_decode, base64_encode, deflate_compress , deflate_decompress , MarkdownFilter , NumFormatFilter } ;
119
144
use config:: Config ;
120
145
121
146
#[ test]
@@ -135,7 +160,8 @@ mod tests {
135
160
let args = HashMap :: new ( ) ;
136
161
let config = Config :: default ( ) ;
137
162
let permalinks = HashMap :: new ( ) ;
138
- let mut tera = super :: load_tera ( & PathBuf :: new ( ) , & config) . map_err ( tera:: Error :: msg) . unwrap ( ) ;
163
+ let mut tera =
164
+ super :: load_tera ( & PathBuf :: new ( ) , & config) . map_err ( tera:: Error :: msg) . unwrap ( ) ;
139
165
tera. add_raw_template ( "shortcodes/explicitlang.html" , "a{{ lang }}a" ) . unwrap ( ) ;
140
166
let filter = MarkdownFilter { config, permalinks, tera } ;
141
167
let result = filter. filter ( & to_value ( & "{{ explicitlang(lang='jp') }}" ) . unwrap ( ) , & args) ;
@@ -294,4 +320,42 @@ mod tests {
294
320
assert_eq ! ( result. unwrap( ) , to_value( expected) . unwrap( ) ) ;
295
321
}
296
322
}
323
+
324
+ #[ test]
325
+ fn deflate_compress_filter ( ) {
326
+ let tests = vec ! [
327
+ ( "" , "eNoDAAAAAAE=" ) ,
328
+ ( "f" , "eNpLAwAAZwBn" ) ,
329
+ ( "fo" , "eNpLywcAAT0A1g==" ) ,
330
+ ( "foo" , "eNpLy88HAAKCAUU=" ) ,
331
+ ( "foob" , "eNpLy89PAgAEKQGn" ) ,
332
+ ( "fooba" , "eNpLy89PSgQABjECCA==" ) ,
333
+ ( "foobar" , "eNpLy89PSiwCAAirAno=" ) ,
334
+ ] ;
335
+ for ( input, expected) in tests {
336
+ let args = HashMap :: new ( ) ;
337
+ let result = deflate_compress ( & to_value ( input) . unwrap ( ) , & args) ;
338
+ assert ! ( result. is_ok( ) ) ;
339
+ assert_eq ! ( result. unwrap( ) , to_value( expected) . unwrap( ) ) ;
340
+ }
341
+ }
342
+
343
+ #[ test]
344
+ fn deflate_decompress_filter ( ) {
345
+ let tests = vec ! [
346
+ ( "eNoDAAAAAAE=" , "" ) ,
347
+ ( "eNpLAwAAZwBn" , "f" ) ,
348
+ ( "eNpLywcAAT0A1g==" , "fo" ) ,
349
+ ( "eNpLy88HAAKCAUU=" , "foo" ) ,
350
+ ( "eNpLy89PAgAEKQGn" , "foob" ) ,
351
+ ( "eNpLy89PSgQABjECCA==" , "fooba" ) ,
352
+ ( "eNpLy89PSiwCAAirAno=" , "foobar" ) ,
353
+ ] ;
354
+ for ( input, expected) in tests {
355
+ let args = HashMap :: new ( ) ;
356
+ let result = deflate_decompress ( & to_value ( input) . unwrap ( ) , & args) ;
357
+ assert ! ( result. is_ok( ) ) ;
358
+ assert_eq ! ( result. unwrap( ) , to_value( expected) . unwrap( ) ) ;
359
+ }
360
+ }
297
361
}
0 commit comments