diff options
author | Leonard Richardson <leonardr@segfault.org> | 2023-03-21 11:38:27 -0400 |
---|---|---|
committer | Leonard Richardson <leonardr@segfault.org> | 2023-03-21 11:38:27 -0400 |
commit | 74e53f0c5997c8b28f449dcc038f928b50b1314e (patch) | |
tree | b73f086e2df34e7aec649de46456eee8dac89068 | |
parent | 3be39f46ec502fe20d5a95ed3292d0dccd3b1aec (diff) |
Removed old implementation code.
-rw-r--r-- | bs4/element.py | 61 |
1 files changed, 23 insertions, 38 deletions
diff --git a/bs4/element.py b/bs4/element.py index bcfad08..8d6251c 100644 --- a/bs4/element.py +++ b/bs4/element.py @@ -1660,23 +1660,31 @@ class Tag(PageElement): for i in self.descendants: yield i - def saxlike(self): - """Yield a sequence of SAX-like events that can be used to - reconstruct this parse tree. + CLOSE_EVENT = object() + + def saxlike(self, iterator=None): + """Yield a sequence of SAX-like events that can be used to reconstruct + the DOM for this element. - This lets us recreate the nested structure of the document - without using recursive method calls. + This lets us recreate the nested structure of this element + (e.g. when formatting as a string) without using recursive + method calls. + + :param iterator: An alternate iterator to use when traversing + the tree. """ tag_stack = [] - for c in self.self_and_descendants: + iterator = iterator or self.self_and_descendants + + for c in iterator: # If the parent of the element we're about to yield is not # the tag currently on the stack, it means that the tag on # the stack closed before this element appeared. while tag_stack and c.parent != tag_stack[-1]: now_closed_tag = tag_stack.pop() - yield "close", now_closed_tag + yield self.CLOSE_EVENT, now_closed_tag if isinstance(c, Tag): if c.is_empty_element: @@ -1691,11 +1699,12 @@ class Tag(PageElement): while tag_stack: now_closed_tag = tag_stack.pop() prettyprint_suppressed_by = None - yield "close", now_closed_tag + yield self.CLOSE_EVENT, now_closed_tag def decode(self, indent_level=None, - eventual_encoding=DEFAULT_OUTPUT_ENCODING, - formatter="minimal"): + eventual_encoding=DEFAULT_OUTPUT_ENCODING, + formatter="minimal", + iterator=None): pieces = [] # First off, turn a non-Formatter `formatter` into a Formatter # object. This will stop the lookup from happening over and @@ -1707,11 +1716,11 @@ class Tag(PageElement): indent_level = 0 string_literal_mode = False - for event, element in self.saxlike(): + for event, element in self.saxlike(iterator): if event in ('open', 'openclose'): piece = element._format_tag( eventual_encoding, formatter, opening=True) - elif event == 'close': + elif event == self.CLOSE_EVENT: piece = element._format_tag( eventual_encoding, formatter, opening=False) if indent_level is not None: @@ -1862,32 +1871,8 @@ class Tag(PageElement): the standard Formatters. """ - # First off, turn a string formatter into a Formatter object. This - # will stop the lookup from happening over and over again. - if not isinstance(formatter, Formatter): - formatter = self.formatter_for_name(formatter) - - pretty_print = (indent_level is not None) - s = [] - for c in self: - text = None - if isinstance(c, NavigableString): - text = c.output_ready(formatter) - elif isinstance(c, Tag): - s.append(c.decode(indent_level, eventual_encoding, - formatter)) - preserve_whitespace = ( - self.preserve_whitespace_tags and self.name in self.preserve_whitespace_tags - ) - if text and indent_level and not preserve_whitespace: - text = text.strip() - if text: - if pretty_print and not preserve_whitespace: - s.append(formatter.indent * (indent_level - 1)) - s.append(text) - if pretty_print and not preserve_whitespace: - s.append("\n") - return ''.join(s) + return self.decode(indent_level, eventual_encoding, formatter, + iterator=self.descendants) def encode_contents( self, indent_level=None, encoding=DEFAULT_OUTPUT_ENCODING, |