Index: sgml/SGMLLexer.py =================================================================== RCS file: /projects/cvsroot/grail/dist/src/sgml/SGMLLexer.py,v retrieving revision 1.45 diff -c -r1.45 SGMLLexer.py *** SGMLLexer.py 1999/03/05 21:29:51 1.45 --- SGMLLexer.py 1999/04/02 18:37:40 *************** *** 528,536 **** elif attrvalue[:1] == LITA == attrvalue[-1:] or \ attrvalue[:1] == LIT == attrvalue[-1:]: attrvalue = attrvalue[1:-1] - if '&' in attrvalue: - from SGMLReplacer import replace - attrvalue = replace(attrvalue, self.entitydefs) attrs[self._normfunc(attrname)] = attrvalue # close the start-tag xx = tagend.match(rawdata, k) --- 528,533 ---- Index: sgml/SGMLParser.py =================================================================== RCS file: /projects/cvsroot/grail/dist/src/sgml/SGMLParser.py,v retrieving revision 1.27 diff -c -r1.27 SGMLParser.py *** SGMLParser.py 1999/03/19 16:56:10 1.27 --- SGMLParser.py 1999/04/02 19:09:22 *************** *** 8,14 **** --- 8,16 ---- SGMLError = SGMLLexer.SGMLError + from SGMLReplacer import replace + # SGML parser class -- find tags and call handler functions. # Usage: p = SGMLParser(); p.feed(data); ...; p.close(). # The dtd is defined by deriving a class which defines methods *************** *** 135,141 **** self.lex_data = handler def lex_starttag(self, tag, attrs): ! #print 'received start tag', `tag` if not tag: if self.omittag and self.stack: tag = self.lasttag --- 137,146 ---- self.lex_data = handler def lex_starttag(self, tag, attrs): ! #print 'received start tag <%s>' % tag ! for attr, value in attrs.items(): ! if value and '&' in value: ! attrs[attr] = replace(value, self.entitydefs) if not tag: if self.omittag and self.stack: tag = self.lasttag Index: sgml/SGMLReplacer.py =================================================================== RCS file: /projects/cvsroot/grail/dist/src/sgml/SGMLReplacer.py,v retrieving revision 1.12 diff -c -r1.12 SGMLReplacer.py *** SGMLReplacer.py 1999/03/05 22:10:50 1.12 --- SGMLReplacer.py 1999/04/02 19:05:50 *************** *** 1,12 **** """Simple parser that handles only what's allowed in attribute values.""" __version__ = '$Revision: 1.2 $' ! import regex import string - from SGMLLexer import * ! _entref_exp = regex.compile("&\(\(#\|\)[a-zA-Z0-9][-.a-zA-Z0-9]*\)\(;\|\)") _named_chars = {'#re' : '\r', '#rs' : '\n', --- 1,12 ---- """Simple parser that handles only what's allowed in attribute values.""" __version__ = '$Revision: 1.2 $' ! import re import string ! _entref_search = re.compile("&(#?([a-zA-Z0-9][-.a-zA-Z0-9]*));?").search ! del re _named_chars = {'#re' : '\r', '#rs' : '\n', *************** *** 23,46 **** _chartable = string.joinfields(_chartable, '') ! def replace(data, entities = None): ! """Perform general entity replacement on a string. ! """ data = string.translate(data, _chartable) ! if '&' in data and entities: value = None ! pos = _entref_exp.search(data) ! while pos >= 0 and pos + 1 < len(data): ! ref, term = _entref_exp.group(1, 3) if entities.has_key(ref): value = entities[ref] elif _named_chars.has_key(string.lower(ref)): value = _named_chars[string.lower(ref)] if value is not None: ! data = data[:pos] + value + data[pos+len(ref)+len(term)+1:] pos = pos + len(value) value = None else: ! pos = pos + len(ref) + len(term) + 1 ! pos = _entref_exp.search(data, pos) return data --- 23,47 ---- _chartable = string.joinfields(_chartable, '') ! def replace(data, entities={}): ! """Perform general entity replacement on a string.""" data = string.translate(data, _chartable) ! if '&' in data: value = None ! m = _entref_search(data) ! while m: ! ref, term = m.group(1, 2) ! print "replacing:", (ref, term) ! pos = m.start() if entities.has_key(ref): value = entities[ref] elif _named_chars.has_key(string.lower(ref)): value = _named_chars[string.lower(ref)] if value is not None: ! data = data[:pos] + value + data[m.end():] pos = pos + len(value) value = None else: ! pos = m.end() ! m = _entref_search(data, pos) return data