@@ -3,18 +3,46 @@ library;
33
44import 'package:petitparser/petitparser.dart' ;
55
6- final csv = _lines.end ();
6+ class CsvDefinition extends GrammarDefinition <List <List <String >>> {
7+ CsvDefinition ({
8+ this .quoteChar = '"' ,
9+ this .escapeChar = '"' ,
10+ this .delimiter = "," ,
11+ this .newline = "\n " ,
12+ });
713
8- final _lines = _records.starSeparated (newline ()).map ((list) => list.elements);
9- final _records = _field.starSeparated (char (',' )).map ((list) => list.elements);
14+ final String quoteChar;
15+ final String escapeChar;
16+ final String delimiter;
17+ final String newline;
1018
11- final _field = _quotedField | _plainField;
19+ @override
20+ Parser <List <List <String >>> start () => ref0 (lines).end ();
1221
13- final _quotedField =
14- _quotedFieldContent. skip (before : char ( '"' ), after : char ( '"' ) );
15- final _quotedFieldContent = _quotedFieldChar. star (). map ((list) => list. join ());
16- final _quotedFieldChar = string ( '""' ). map ((value ) => value[ 0 ]) | pattern ( '^"' );
22+ Parser < List < List < String >>> lines () =>
23+ ref0 (records). starSeparated ( string (newline)). map ((list) => list.elements );
24+ Parser < List < String >> records () =>
25+ ref0 (field). starSeparated ( char (delimiter)). map ((list ) => list.elements );
1726
18- final _plainField = _plainFieldContent;
19- final _plainFieldContent = _plainFieldChar.starString ();
20- final _plainFieldChar = pattern ("^,\n\r " );
27+ Parser <String > field () => [
28+ ref0 (quotedField),
29+ ref0 (plainField),
30+ ].toChoiceParser ();
31+
32+ Parser <String > quotedField () => ref0 (quotedFieldContent)
33+ .skip (before: char (quoteChar), after: char (quoteChar));
34+ Parser <String > quotedFieldContent () =>
35+ ref0 (quotedFieldChar).star ().map ((list) => list.join ());
36+ Parser <String > quotedFieldChar () => [
37+ seq2 (char (escapeChar), any ()).map2 ((_, char) => char),
38+ pattern ('^$quoteChar ' ),
39+ ].toChoiceParser ();
40+
41+ Parser <String > plainField () => ref0 (plainFieldContent);
42+ Parser <String > plainFieldContent () =>
43+ ref0 (plainFieldChar).star ().map ((list) => list.join ());
44+ Parser <String > plainFieldChar () => [
45+ seq2 (char (escapeChar), any ()).map2 ((_, char) => char),
46+ pattern ("^$delimiter $newline " )
47+ ].toChoiceParser ();
48+ }
0 commit comments