11import 'dart:convert' ;
22
33import 'package:icalendar_parser/icalendar_parser.dart' ;
4- import 'package:icalendar_parser/src/exceptions/icalendar_exception.dart' ;
5- import 'package:icalendar_parser/src/model/ics_datetime.dart' ;
64import 'package:icalendar_parser/src/utils/parsing_methods.dart' ;
75
86/// Core object
@@ -67,17 +65,26 @@ class ICalendar {
6765
6866 /// Map containing the methods used to parse each kind of fields in the file.
6967 static final Map <String , Function > _objects = {
70- 'BEGIN' : (String value, Map <String , String > params, List events,
71- Map <String , dynamic > lastEvent) {
68+ 'BEGIN' : (
69+ String value,
70+ Map <String , String > params,
71+ List events,
72+ Map <String , dynamic > lastEvent,
73+ ) {
7274 if (value == 'VCALENDAR' ) return null ;
7375
7476 lastEvent = {'type' : value};
7577 events.add (lastEvent);
7678
7779 return lastEvent;
7880 },
79- 'END' : (String value, Map <String , String > params, List events,
80- Map <String , dynamic >? lastEvent, List <Map <String , dynamic >?> data) {
81+ 'END' : (
82+ String value,
83+ Map <String , String > params,
84+ List events,
85+ Map <String , dynamic >? lastEvent,
86+ List <Map <String , dynamic >?> data,
87+ ) {
8188 if (value == 'VCALENDAR' ) return lastEvent;
8289
8390 data.add (lastEvent);
@@ -104,8 +111,12 @@ class ICalendar {
104111 'DESCRIPTION' : generateSimpleParamFunction ('description' ),
105112 'LOCATION' : generateSimpleParamFunction ('location' ),
106113 'URL' : generateSimpleParamFunction ('url' ),
107- 'ORGANIZER' : (String value, Map <String , String > params, List events,
108- Map <String , dynamic > lastEvent) {
114+ 'ORGANIZER' : (
115+ String value,
116+ Map <String , String > params,
117+ List events,
118+ Map <String , dynamic > lastEvent,
119+ ) {
109120 final mail = value.replaceAll ('MAILTO:' , '' ).trim ();
110121
111122 if (params.containsKey ('CN' )) {
@@ -119,23 +130,36 @@ class ICalendar {
119130
120131 return lastEvent;
121132 },
122- 'GEO' : (String value, Map <String , String > params, List events,
123- Map <String , dynamic > lastEvent) {
133+ 'GEO' : (
134+ String value,
135+ Map <String , String > params,
136+ List events,
137+ Map <String , dynamic > lastEvent,
138+ ) {
124139 final pos = value.split (';' );
125140 if (pos.length != 2 ) return lastEvent;
126141
127- lastEvent['geo' ] = {};
128- lastEvent['geo' ]['latitude' ] = num .parse (pos[0 ]);
129- lastEvent['geo' ]['longitude' ] = num .parse (pos[1 ]);
142+ final geo = < String , dynamic > {};
143+ geo['latitude' ] = num .parse (pos[0 ]);
144+ geo['longitude' ] = num .parse (pos[1 ]);
145+ lastEvent['geo' ] = geo;
130146 return lastEvent;
131147 },
132- 'CATEGORIES' : (String value, Map <String , String > params, List events,
133- Map <String , dynamic > lastEvent) {
148+ 'CATEGORIES' : (
149+ String value,
150+ Map <String , String > params,
151+ List events,
152+ Map <String , dynamic > lastEvent,
153+ ) {
134154 lastEvent['categories' ] = value.split (',' );
135155 return lastEvent;
136156 },
137- 'ATTENDEE' : (String value, Map <String , String > params, List _,
138- Map <String , dynamic > lastEvent) {
157+ 'ATTENDEE' : (
158+ String value,
159+ Map <String , String > params,
160+ _,
161+ Map <String , dynamic > lastEvent,
162+ ) {
139163 lastEvent['attendee' ] ?? = [];
140164
141165 final mail = value.replaceAll ('MAILTO:' , '' ).trim ();
@@ -153,16 +177,14 @@ class ICalendar {
153177 return lastEvent;
154178 },
155179 'ACTION' : generateSimpleParamFunction ('action' ),
156- 'STATUS' : (String value, Map <String , String > _, List __,
157- Map <String , dynamic > lastEvent) {
180+ 'STATUS' : (String value, _, __, Map <String , dynamic > lastEvent) {
158181 lastEvent['status' ] = value.trim ().toIcsStatus ();
159182 return lastEvent;
160183 },
161184 'SEQUENCE' : generateSimpleParamFunction ('sequence' ),
162185 'REPEAT' : generateSimpleParamFunction ('repeat' ),
163186 'CLASS' : generateSimpleParamFunction ('class' ),
164- 'TRANSP' : (String value, Map <String , String > _, List __,
165- Map <String , dynamic > lastEvent) {
187+ 'TRANSP' : (String value, _, __, Map <String , dynamic > lastEvent) {
166188 lastEvent['transp' ] = value.trim ().toIcsTransp ();
167189 return lastEvent;
168190 },
@@ -185,8 +207,12 @@ class ICalendar {
185207 /// `ICalendarFormatException` .
186208 static void registerField ({
187209 required String field,
188- Function (String value, Map <String , String > params, List event,
189- Map <String , dynamic > lastEvent)?
210+ Function (
211+ String value,
212+ Map <String , String > params,
213+ List event,
214+ Map <String , dynamic > lastEvent,
215+ )?
190216 function,
191217 }) {
192218 if (_objects.containsKey (field)) {
@@ -215,8 +241,10 @@ class ICalendar {
215241 /// `List<Map<String, dynamic>> data` .
216242 ///
217243 /// If [allowEmptyLine] is false the method will throw [EmptyLineException] .
218- static List <dynamic > fromListToJson (List <String > lines,
219- {bool allowEmptyLine = true }) {
244+ static List <dynamic > fromListToJson (
245+ List <String > lines, {
246+ bool allowEmptyLine = true ,
247+ }) {
220248 final data = < Map <String , dynamic >> [];
221249 final _headData = < String , dynamic > {};
222250 final events = [];
@@ -226,13 +254,15 @@ class ICalendar {
226254 // Ensure first line is BEGIN:VCALENDAR
227255 if (lines.first.trim () != 'BEGIN:VCALENDAR' ) {
228256 throw ICalendarBeginException (
229- 'The first line must be BEGIN:VCALENDAR but was ${lines .first }.' );
257+ 'The first line must be BEGIN:VCALENDAR but was ${lines .first }.' ,
258+ );
230259 }
231260
232261 // Ensure last line is END:VCALENDAR
233262 if (lines.last.trim () != 'END:VCALENDAR' ) {
234263 throw ICalendarEndException (
235- 'The last line must be END:VCALENDAR but was ${lines .last }.' );
264+ 'The last line must be END:VCALENDAR but was ${lines .last }.' ,
265+ );
236266 }
237267
238268 for (var i = 0 ; i < lines.length; i++ ) {
@@ -242,7 +272,7 @@ class ICalendar {
242272 throw const EmptyLineException ();
243273 }
244274
245- final exp = RegExp (r '^ ' );
275+ final exp = RegExp ('^ ' );
246276 while (i + 1 < lines.length && exp.hasMatch (lines[i + 1 ])) {
247277 i += 1 ;
248278 line.write (lines[i].trim ());
@@ -254,7 +284,9 @@ class ICalendar {
254284 dataLine[0 ].toUpperCase () != dataLine[0 ] &&
255285 ! dataLine[0 ].contains (';' ))) {
256286 if (line.isNotEmpty && currentName != null ) {
257- lastEvent! [currentName] += line.toString ();
287+ final buffer = StringBuffer (lastEvent! [currentName] as String );
288+ buffer.write (line.toString ());
289+ lastEvent[currentName] = buffer.toString ();
258290 }
259291 continue ;
260292 }
@@ -271,25 +303,38 @@ class ICalendar {
271303
272304 dataLine.removeRange (0 , 1 );
273305 final value = dataLine.join (':' ).replaceAll (RegExp (r'\\,' ), ',' );
274- if (_objects.containsKey (name)) {
306+ final nameFunc = _objects[name];
307+ if (_objects.containsKey (name) && nameFunc != null ) {
275308 currentName = name.toLowerCase ();
276309 if (name == 'END' ) {
310+ final func = nameFunc as Map <String , dynamic >? Function (
311+ String ,
312+ Map <String , String >,
313+ List ,
314+ Map <String , dynamic >? ,
315+ List <Map <String , dynamic >>,
316+ );
277317 currentName = null ;
278- lastEvent = _objects[name]! (value, params, events, lastEvent, data)
279- as Map <String , dynamic >? ;
318+ lastEvent = func (value, params, events, lastEvent, data);
280319 } else {
281- lastEvent =
282- _objects[name]! (value, params, events, lastEvent ?? _headData)
283- as Map <String , dynamic >? ;
320+ final func = nameFunc as Map <String , dynamic >? Function (
321+ String ,
322+ Map <String , String >,
323+ List ,
324+ Map <String , dynamic >,
325+ );
326+ lastEvent = func (value, params, events, lastEvent ?? _headData);
284327 }
285328 }
286329 }
287330 if (! _headData.containsKey ('version' )) {
288331 throw const ICalendarNoVersionException (
289- 'The body is missing the property VERSION' );
332+ 'The body is missing the property VERSION' ,
333+ );
290334 } else if (! _headData.containsKey ('prodid' )) {
291335 throw const ICalendarNoProdidException (
292- 'The body is missing the property PRODID' );
336+ 'The body is missing the property PRODID' ,
337+ );
293338 }
294339 return [_headData, data];
295340 }
0 commit comments