567 ['this', 'is', 'a small', 'test'] |
567 ['this', 'is', 'a small', 'test'] |
568 """ |
568 """ |
569 |
569 |
570 def _parse_plain(parts, s, offset): |
570 def _parse_plain(parts, s, offset): |
571 whitespace = False |
571 whitespace = False |
572 while offset < len(s) and (s[offset].isspace() or s[offset] == ','): |
572 while offset < len(s) and (s[offset:offset + 1].isspace() |
|
573 or s[offset:offset + 1] == ','): |
573 whitespace = True |
574 whitespace = True |
574 offset += 1 |
575 offset += 1 |
575 if offset >= len(s): |
576 if offset >= len(s): |
576 return None, parts, offset |
577 return None, parts, offset |
577 if whitespace: |
578 if whitespace: |
578 parts.append('') |
579 parts.append('') |
579 if s[offset] == '"' and not parts[-1]: |
580 if s[offset:offset + 1] == '"' and not parts[-1]: |
580 return _parse_quote, parts, offset + 1 |
581 return _parse_quote, parts, offset + 1 |
581 elif s[offset] == '"' and parts[-1][-1] == '\\': |
582 elif s[offset:offset + 1] == '"' and parts[-1][-1] == '\\': |
582 parts[-1] = parts[-1][:-1] + s[offset] |
583 parts[-1] = parts[-1][:-1] + s[offset:offset + 1] |
583 return _parse_plain, parts, offset + 1 |
584 return _parse_plain, parts, offset + 1 |
584 parts[-1] += s[offset] |
585 parts[-1] += s[offset:offset + 1] |
585 return _parse_plain, parts, offset + 1 |
586 return _parse_plain, parts, offset + 1 |
586 |
587 |
587 def _parse_quote(parts, s, offset): |
588 def _parse_quote(parts, s, offset): |
588 if offset < len(s) and s[offset] == '"': # "" |
589 if offset < len(s) and s[offset:offset + 1] == '"': # "" |
589 parts.append('') |
590 parts.append('') |
590 offset += 1 |
591 offset += 1 |
591 while offset < len(s) and (s[offset].isspace() or |
592 while offset < len(s) and (s[offset:offset + 1].isspace() or |
592 s[offset] == ','): |
593 s[offset:offset + 1] == ','): |
593 offset += 1 |
594 offset += 1 |
594 return _parse_plain, parts, offset |
595 return _parse_plain, parts, offset |
595 |
596 |
596 while offset < len(s) and s[offset] != '"': |
597 while offset < len(s) and s[offset:offset + 1] != '"': |
597 if (s[offset] == '\\' and offset + 1 < len(s) |
598 if (s[offset:offset + 1] == '\\' and offset + 1 < len(s) |
598 and s[offset + 1] == '"'): |
599 and s[offset + 1:offset + 2] == '"'): |
599 offset += 1 |
600 offset += 1 |
600 parts[-1] += '"' |
601 parts[-1] += '"' |
601 else: |
602 else: |
602 parts[-1] += s[offset] |
603 parts[-1] += s[offset:offset + 1] |
603 offset += 1 |
604 offset += 1 |
604 |
605 |
605 if offset >= len(s): |
606 if offset >= len(s): |
606 real_parts = _configlist(parts[-1]) |
607 real_parts = _configlist(parts[-1]) |
607 if not real_parts: |
608 if not real_parts: |