    def _generate():
        stack = []
        def _reverse():
            for event in reversed(stack):
                if event[0] is START:
                    yield Stream.End(event)
                else:
                    yield Stream.EndNs(event)

        for event in stream:
            kind, data, pos = event
            if kind is TEXT:
                lines = data.splitlines(True)
                for e in stack:
                    yield e
                yield Stream.text(event, lines.pop(0).rstrip('\n'))
                for e in _reverse():
                    yield e
                if '\n' in data:
                    yield Stream.text(event, '\n')
                    for line in lines:
                        for event in stack:
                            yield event
                        yield Stream.text(event, line.rstrip('\n'))
                        if line.endswith('\n'):
                            for e in _reverse():
                                yield e
                            yield Stream.text(event, '\n')
            else:
                if kind is START or kind is START_NS:
                    stack.append(event)
                elif kind is END or kind is END_NS:
                    stack.pop()
                else:
                    yield event


