def parse(self, indata, baseUri='http://rinfo.lagrummet.se/publ/sfs/9999:999#K9P9S9P9',predicate=None): if indata == '': return indata self.predicate = predicate self.baseUri = baseUri if baseUri: m = self.reUriSegments.match(baseUri) if m: self.baseUriAttrs = {'baseUri' : m.group(1), 'law' : m.group(2), 'chapter' : m.group(6), 'section' : m.group(8), 'piece' : m.group(10), 'item' : m.group(12)} else: self.baseUriAttrs = {'baseUri':baseUri} else: self.baseUriAttrs = {} fixedIndata = unicode(indata) if self.LAGRUM in self.args: fixedIndata = self.reEscapeCompound.sub(r'\1_\2_\3\4', fixedIndata) fixedIndata = self.reEscapeNamed.sub(r'|\1', fixedIndata) if isinstance(fixedIndata, unicode): fixedIndata = fixedIndata.encode(SP_CHARSET, 'xmlcharrefreplace') tagList = tag(fixedIndata, self.tagger,0,len(fixedIndata)) res = [] root = NodeTree(tagList, fixedIndata) for n in root.nodes: if n.tag in self.roots: self.clearState() res.extend(self.formatterDispatch(n)) else: assert n.tag == 'plain', 'Tag is %s' % n.tag res.append(n.text) if self.currentLaw != None: self.lastLaw = self.currentLaw self.currentLaw = None if tagList[-1] != len(fixedIndata): #TODO: Add Error raise ParseError, 'Parsed %s chars of %s (...%s...)' % (tagList[-1], len(indata), indata[(tagList[-1]-2):tagList[-1]+3]) # Normalize the result, concat and remove '|' result = [] for i in range(len(res)): if not self.reDescapeNamed.search(res[i]): node = res[i] else: if self.LAGRUM in self.args: text = self.reDescapeNamed.sub(r'\1', res[i]) text = self.reDescapeCompound.sub(r'\1 \2 \3\4', text) if isinstance(res[i], Link): # A Link obj is immutable so we have to # create a new and copy its attrs if hasattr(res[i], 'predicate'): node = LinkSubject(text, predicate=res[i].predicate, uri=res[i].uri) else: node = Link(text, uri=res[i].uri) else: node = text if (len(result) > 0 and not isinstance(result[-1], Link) and not isinstance(node, Link)): result[-1] += node else: result.append(node) for i in range(len(result)): if isinstance(result[i], Link): pass else: result[i] = self.reXmlCharref.sub(self.unescapeXmlCharref, result[i]) return result
def parse(self, indata, baseuri="http://rinfo.lagrummet.se/publ/sfs/9999:999#K9P9S9P9", predicate=None): assert isinstance(indata, six.text_type) if indata == "": return indata # this actually triggered a bug... # h = hashlib.sha1() # h.update(indata) # print "Called with %r (%s) (%s)" % (indata, h.hexdigest(), self.verbose) self.predicate = predicate self.baseuri = baseuri if baseuri: m = self.re_urisegments.match(baseuri) if m: self.baseuri_attributes = {'baseuri': m.group(1), 'law': m.group(2), 'chapter': m.group(6), 'section': m.group(8), 'piece': m.group(10), 'item': m.group(12)} else: self.baseuri_attributes = {'baseuri': baseuri} else: self.baseuri_attributes = {} # Det är svårt att få EBNF-grammatiken att känna igen # godtyckliga ord som slutar på ett givet suffix (exv # 'bokföringslagen' med suffixet 'lagen'). Därför förbehandlar # vi indatasträngen och stoppar in ett '|'-tecken innan vissa # suffix. Vi transformerar även 'Radio- och TV-lagen' till # 'Radio-_och_TV-lagen' # # FIXME: Obviously, this shouldn't be done in a general class, # but rather in a subclas or via proxy/adapter fixedindata = indata # FIXME: Nonsensical if self.LAGRUM in self.args: fixedindata = self.re_escape_compound.sub( r'\1_\2_\3\4', fixedindata) fixedindata = self.re_escape_named.sub(r'|\1', fixedindata) # print "After: %r" % type(fixedindata) # SimpleParse har inget stöd för unicodesträngar, så vi # konverterar intdatat till en bytesträng. Tyvärr får jag inte # det hela att funka med UTF8, så vi kör xml character # references istället fixedindata = fixedindata.encode(SP_CHARSET, 'xmlcharrefreplace') # Parsea texten med TextTools.tag - inte det enklaste sättet # att göra det, men om man gör enligt # Simpleparse-dokumentationen byggs taggertabellen om för # varje anrop till parse() if self.verbose: print(("calling tag with '%s'" % (fixedindata.decode(SP_CHARSET)))) # print "tagger length: %d" % len(repr(self.tagger)) taglist = tag(fixedindata, self.tagger, 0, len(fixedindata)) result = [] root = NodeTree(taglist, fixedindata) for part in root.nodes: if part.tag != 'plain' and self.verbose: sys.stdout.write(self.prettyprint(part)) if part.tag in self.roots: self.clear_state() # self.verbose = False result.extend(self.formatter_dispatch(part)) else: assert part.tag == 'plain', "Tag is %s" % part.tag result.append(part.text) # clear state if self.currentlaw is not None: self.lastlaw = self.currentlaw self.currentlaw = None if taglist[-1] != len(fixedindata): log.error('Problem (%d:%d) with %r / %r' % ( taglist[-1] - 8, taglist[-1] + 8, fixedindata, indata)) raise ParseError( "parsed %s chars of %s (...%s...)" % (taglist[-1], len(indata), indata[(taglist[-1] - 2):taglist[-1] + 3])) # Normalisera resultatet, dvs konkatenera intilliggande # textnoder, och ta bort ev '|'-tecken som vi stoppat in # tidigare. normres = [] for i in range(len(result)): if not self.re_descape_named.search(result[i]): node = result[i] else: if self.LAGRUM in self.args: text = self.re_descape_named.sub(r'\1', result[i]) text = self.re_descape_compound.sub(r'\1 \2 \3\4', text) if isinstance(result[i], Link): # Eftersom Link-objekt är immutable måste vi skapa # ett nytt och kopiera dess attribut if hasattr(result[i], 'predicate'): node = LinkSubject(text, predicate=result[i].predicate, uri=result[i].uri) else: node = Link(text, uri=result[i].uri) else: node = text if (len(normres) > 0 and not isinstance(normres[-1], Link) and not isinstance(node, Link)): normres[-1] += node else: normres.append(node) # and finally... for i in range(len(normres)): if isinstance(normres[i], Link): # deal with these later pass else: normres[i] = self.re_xmlcharref.sub( self.unescape_xmlcharref, normres[i]) return normres
def parse(self, indata, baseuri="http://rinfo.lagrummet.se/publ/sfs/9999:999#K9P9S9P9",predicate=None): if indata == "": return indata # this actually triggered a bug... # h = hashlib.sha1() # h.update(indata) # print "Called with %r (%s) (%s)" % (indata, h.hexdigest(), self.verbose) self.predicate = predicate self.baseuri = baseuri if baseuri: m = self.re_urisegments.match(baseuri) if m: self.baseuri_attributes = {'baseuri':m.group(1), 'law':m.group(2), 'chapter':m.group(6), 'section':m.group(8), 'piece':m.group(10), 'item':m.group(12)} else: self.baseuri_attributes = {'baseuri':baseuri} else: self.baseuri_attributes = {} # Det är svårt att få EBNF-grammatiken att känna igen # godtyckliga ord som slutar på ett givet suffix (exv # 'bokföringslagen' med suffixet 'lagen'). Därför förbehandlar # vi indatasträngen och stoppar in ett '|'-tecken innan vissa # suffix. Vi transformerar även 'Radio- och TV-lagen' till # 'Radio-_och_TV-lagen' # # FIXME: Obviously, this shouldn't be done in a general class, # but rather in a subclas or via proxy/adapter # if we don't do the unicode conversion and pass # BeautifulSoup.NavigableString, the later .encode call fails # (since it's not a real unicode string) fixedindata = unicode(indata) # print "Before: %r" % type(fixedindata) if self.LAGRUM in self.args: fixedindata = self.re_escape_compound.sub(r'\1_\2_\3\4', fixedindata) fixedindata = self.re_escape_named.sub(r'|\1', fixedindata) # print "After: %r" % type(fixedindata) # SimpleParse har inget stöd för unicodesträngar, så vi # konverterar intdatat till en bytesträng. Tyvärr får jag inte # det hela att funka med UTF8, så vi kör xml character # references istället if isinstance(fixedindata,unicode): fixedindata = fixedindata.encode(SP_CHARSET,'xmlcharrefreplace') # Parsea texten med TextTools.tag - inte det enklaste sättet # att göra det, men om man gör enligt # Simpleparse-dokumentationen byggs taggertabellen om för # varje anrop till parse() if self.verbose: print u"calling tag with '%s'" % (fixedindata.decode(SP_CHARSET)) # print "tagger length: %d" % len(repr(self.tagger)) taglist = tag(fixedindata, self.tagger,0,len(fixedindata)) result = [] root = NodeTree(taglist,fixedindata) for part in root.nodes: if part.tag != 'plain' and self.verbose: sys.stdout.write(self.prettyprint(part)) if part.tag in self.roots: self.clear_state() # self.verbose = False result.extend(self.formatter_dispatch(part)) else: assert part.tag == 'plain',"Tag is %s" % part.tag result.append(part.text) # clear state if self.currentlaw != None: self.lastlaw = self.currentlaw self.currentlaw = None if taglist[-1] != len(fixedindata): log.error(u'Problem (%d:%d) with %r / %r' % (taglist[-1]-8,taglist[-1]+8,fixedindata,indata)) raise ParseError, "parsed %s chars of %s (...%s...)" % (taglist[-1], len(indata), indata[(taglist[-1]-2):taglist[-1]+3]) # Normalisera resultatet, dvs konkatenera intilliggande # textnoder, och ta bort ev '|'-tecken som vi stoppat in # tidigare. normres = [] for i in range(len(result)): if not self.re_descape_named.search(result[i]): node = result[i] else: if self.LAGRUM in self.args: text = self.re_descape_named.sub(r'\1',result[i]) text = self.re_descape_compound.sub(r'\1 \2 \3\4', text) if isinstance(result[i], Link): # Eftersom Link-objekt är immutable måste vi skapa # ett nytt och kopiera dess attribut if hasattr(result[i],'predicate'): node = LinkSubject(text, predicate=result[i].predicate, uri=result[i].uri) else: node = Link(text,uri=result[i].uri) else: node = text if (len(normres) > 0 and not isinstance(normres[-1],Link) and not isinstance(node,Link)): normres[-1] += node else: normres.append(node) # and finally... for i in range(len(normres)): if isinstance(normres[i], Link): # deal with these later pass else: normres[i] = self.re_xmlcharref.sub(self.unescape_xmlcharref, normres[i]) return normres