1
2
3
4local type , tostring = type , tostring
5
6local mime = mime or package . loaded . mime or require ( " mime.core " )
7local ltn12 = ltn12 or package . loaded . ltn12 or require ( " ltn12 " )
8
9local filtercycle = ltn12 . filter . cycle
10
11local function report ( fmt , first , ... )
12 if logs then
13 report = logs and logs . reporter ( " mime " )
14 report ( fmt , first , ... )
15 elseif fmt then
16 fmt = " mime: " . . fmt
17 if first then
18 print ( format ( fmt , first , ... ) )
19 else
20 print ( fmt )
21 end
22 end
23end
24
25mime . report = report
26
27local encodet = { }
28local decodet = { }
29local wrapt = { }
30
31mime . encodet = encodet
32mime . decodet = decodet
33mime . wrapt = wrapt
34
35local mime_b64 = mime . b64
36local mime_qp = mime . qp
37local mime_unb64 = mime . unb64
38local mime_unqp = mime . unqp
39local mime_wrp = mime . wrp
40local mime_qpwrp = mime . qpwrp
41local mime_eol = mime_eol
42local mime_dot = mime_dot
43
44encodet [ ' base64 ' ] = function ( )
45 return filtercycle ( mime_b64 , " " )
46end
47
48encodet [ ' quoted-printable ' ] = function ( mode )
49 return filtercycle ( mime_qp , " " , mode = = " binary " and " =0D=0A " or " \r\n " )
50end
51
52decodet [ ' base64 ' ] = function ( )
53 return filtercycle ( mime_unb64 , " " )
54end
55
56decodet [ ' quoted-printable ' ] = function ( )
57 return filtercycle ( mime_unqp , " " )
58end
59
60local wraptext = function ( length )
61 if not length then
62 length = 76
63 end
64 return filtercycle ( mime_wrp , length , length )
65end
66
67local wrapquoted = function ( )
68 return filtercycle ( mime_qpwrp , 76 , 76 )
69end
70
71wrapt [ ' text ' ] = wraptext
72wrapt [ ' base64 ' ] = wraptext
73wrapt [ ' default ' ] = wraptext
74wrapt [ ' quoted-printable ' ] = wrapquoted
75
76function mime . normalize ( marker )
77 return filtercycle ( mime_eol , 0 , marker )
78end
79
80function mime . stuff ( )
81 return filtercycle ( mime_dot , 2 )
82end
83
84local function choose ( list )
85 return function ( name , opt1 , opt2 )
86 if type ( name ) ~ = " string " then
87 name , opt1 , opt2 = " default " , name , opt1
88 end
89 local filter = list [ name or " nil " ]
90 if filter then
91 return filter ( opt1 , opt2 )
92 else
93 report ( " error: unknown key '%s' " , tostring ( name ) )
94 end
95 end
96end
97
98mime . encode = choose ( encodet )
99mime . decode = choose ( decodet )
100mime . wrap = choose ( wrapt )
101
102package . loaded [ " mime " ] = mime
103
104return mime
105 |