[Python-checkins] CVS: python/dist/src/Lib xmllib.py,1.20,1.21

Sjoerd Mullender python-dev@python.org
2000年7月10日 01:09:51 -0700


Update of /cvsroot/python/python/dist/src/Lib
In directory slayer.i.sourceforge.net:/tmp/cvs-serv21011
Modified Files:
	xmllib.py 
Log Message:
Better error handling of bad entity references. Before when an & in
an attribute value was not escaped, you could get two syntax errors:
one about a missing semicolon and one about an unknown entity. Now
you get only one about a bogus ampersand.
Index: xmllib.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/xmllib.py,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -r1.20 -r1.21
*** xmllib.py	2000年07月04日 14:53:12	1.20
--- xmllib.py	2000年07月10日 08:09:48	1.21
***************
*** 182,197 ****
 if res is None:
 return data
! res = ref.match(data, res.start(0))
 if res is None:
 self.syntax_error("bogus `&'")
! i =i+1
 continue
 i = res.end(0)
- if data[i - 1] != ';':
- self.syntax_error("`;' missing after entity/char reference")
- i = i-1
 str = res.group(1)
! pre = data[:res.start(0)]
! post = data[i:]
 if str[0] == '#':
 if str[1] == 'x':
--- 182,194 ----
 if res is None:
 return data
! s = res.start(0)
! res = ref.match(data, s)
 if res is None:
 self.syntax_error("bogus `&'")
! i = s+1
 continue
 i = res.end(0)
 str = res.group(1)
! rescan = 0
 if str[0] == '#':
 if str[1] == 'x':
***************
*** 199,216 ****
 else:
 str = chr(string.atoi(str[1:]))
! data = pre + str + post
! i = res.start(0)+len(str)
 elif all:
 if self.entitydefs.has_key(str):
! data = pre + self.entitydefs[str] + post
! i = res.start(0) # rescan substituted text
 else:
 self.syntax_error("reference to unknown entity `&%s;'" % str)
! # can't do it, so keep the entity ref in
! data = pre + '&' + str + ';' + post
! i = res.start(0) + len(str) + 2
 else:
! # just translating character references
! pass # i is already postioned correctly
 
 # Internal -- handle data as far as reasonable. May leave state
--- 196,225 ----
 else:
 str = chr(string.atoi(str[1:]))
! if data[i - 1] != ';':
! self.syntax_error("`;' missing after char reference")
! i = i-1
 elif all:
 if self.entitydefs.has_key(str):
! str = self.entitydefs[str]
! rescan = 1
! elif data[i - 1] != ';':
! self.syntax_error("bogus `&'")
! i = s + 1 # just past the &
! continue
 else:
 self.syntax_error("reference to unknown entity `&%s;'" % str)
! str = '&' + str + ';'
! elif data[i - 1] != ';':
! self.syntax_error("bogus `&'")
! i = s + 1 # just past the &
! continue
! 
! # when we get here, str contains the translated text and i points
! # to the end of the string that is to be replaced
! data = data[:s] + str + data[i:]
! if rescan:
! i = s
 else:
! i = s + len(str)
 
 # Internal -- handle data as far as reasonable. May leave state

AltStyle によって変換されたページ (->オリジナル) /