diff options
author | Leonard Richardson <leonard.richardson@canonical.com> | 2012-04-16 10:06:26 -0400 |
---|---|---|
committer | Leonard Richardson <leonard.richardson@canonical.com> | 2012-04-16 10:06:26 -0400 |
commit | 0afe0af7cd8240ab790ccbcea6ecbdf69f21461e (patch) | |
tree | bd6a8fc992d24d144466e74ea9f7b2ac4fb31fa1 /bs4/dammit.py | |
parent | c40bc98de62545aa8855311a1d046af5cd9020ba (diff) |
Attribute values are now run through the provided output formatter. Previously they were always run through the 'minimal' formatter. [bug=980237]
Diffstat (limited to 'bs4/dammit.py')
-rw-r--r-- | bs4/dammit.py | 70 |
1 files changed, 37 insertions, 33 deletions
diff --git a/bs4/dammit.py b/bs4/dammit.py index a35c213..65fd43d 100644 --- a/bs4/dammit.py +++ b/bs4/dammit.py @@ -81,58 +81,62 @@ class EntitySubstitution(object): return "&%s;" % entity @classmethod - def substitute_xml(cls, value, make_quoted_attribute=False): - """Substitute XML entities for special XML characters. + def quoted_attribute_value(self, value): + """Make a value into a quoted XML attribute, possibly escaping it. - :param value: A string to be substituted. The less-than sign will - become <, the greater-than sign will become >, and any - ampersands that are not part of an entity defition will - become &. - - :param make_quoted_attribute: If True, then the string will be - quoted, as befits an attribute value. - - Ordinarily, the string will be quoted using double quotes. + Most strings will be quoted using double quotes. Bob's Bar -> "Bob's Bar" - If the string contains double quotes, it will be quoted using + If a string contains double quotes, it will be quoted using single quotes. Welcome to "my bar" -> 'Welcome to "my bar"' - If the string contains both single and double quotes, the + If a string contains both single and double quotes, the double quotes will be escaped, and the string will be quoted using double quotes. Welcome to "Bob's Bar" -> "Welcome to "Bob's bar" """ - if make_quoted_attribute: - quote_with = '"' - if '"' in value: - if "'" in value: - # The string contains both single and double - # quotes. Turn the double quotes into - # entities. We quote the double quotes rather than - # the single quotes because the entity name is - # """ whether this is HTML or XML. If we - # quoted the single quotes, we'd have to decide - # between ' and &squot;. - replace_with = """ - value = value.replace('"', replace_with) - else: - # There are double quotes but no single quotes. - # We can use single quotes to quote the attribute. - quote_with = "'" + quote_with = '"' + if '"' in value: + if "'" in value: + # The string contains both single and double + # quotes. Turn the double quotes into + # entities. We quote the double quotes rather than + # the single quotes because the entity name is + # """ whether this is HTML or XML. If we + # quoted the single quotes, we'd have to decide + # between ' and &squot;. + replace_with = """ + value = value.replace('"', replace_with) + else: + # There are double quotes but no single quotes. + # We can use single quotes to quote the attribute. + quote_with = "'" + return quote_with + value + quote_with + + @classmethod + def substitute_xml(cls, value, make_quoted_attribute=False): + """Substitute XML entities for special XML characters. + :param value: A string to be substituted. The less-than sign will + become <, the greater-than sign will become >, and any + ampersands that are not part of an entity defition will + become &. + + :param make_quoted_attribute: If True, then the string will be + quoted, as befits an attribute value. + """ # Escape angle brackets, and ampersands that aren't part of # entities. value = cls.BARE_AMPERSAND_OR_BRACKET.sub( cls._substitute_xml_entity, value) + if make_quoted_attribute: - return quote_with + value + quote_with - else: - return value + value = cls.quoted_attribute_value(value) + return value @classmethod def substitute_html(cls, s): |