| 1 | def _generate(): |
|---|
| 2 | stack = [] |
|---|
| 3 | def _reverse(): |
|---|
| 4 | for kind, data, pos in reversed(stack): |
|---|
| 5 | if kind is START: |
|---|
| 6 | yield END, data[0], pos |
|---|
| 7 | else: |
|---|
| 8 | yield END_NS, data[0], pos |
|---|
| 9 | |
|---|
| 10 | for event in stream: |
|---|
| 11 | kind, data, pos = event |
|---|
| 12 | if kind is TEXT: |
|---|
| 13 | lines = data.splitlines(True) |
|---|
| 14 | for e in stack: |
|---|
| 15 | yield e |
|---|
| 16 | yield kind, lines.pop(0).rstrip('\n'), pos |
|---|
| 17 | for e in _reverse(): |
|---|
| 18 | yield e |
|---|
| 19 | if '\n' in data: |
|---|
| 20 | yield TEXT, '\n', pos |
|---|
| 21 | for line in lines: |
|---|
| 22 | for event in stack: |
|---|
| 23 | yield event |
|---|
| 24 | yield kind, line.rstrip('\n'), pos |
|---|
| 25 | if line.endswith('\n'): |
|---|
| 26 | for e in _reverse(): |
|---|
| 27 | yield e |
|---|
| 28 | yield TEXT, '\n', pos |
|---|
| 29 | else: |
|---|
| 30 | if kind is START or kind is START_NS: |
|---|
| 31 | stack.append(event) |
|---|
| 32 | elif kind is END or kind is END_NS: |
|---|
| 33 | stack.pop() |
|---|
| 34 | else: |
|---|
| 35 | yield event |
|---|