source: TI07-MOLES/trunk/PythonCode/wsgi/sub_orphan.py @ 1905

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI07-MOLES/trunk/PythonCode/wsgi/sub_orphan.py@2448
Revision 1905, 3.0 KB checked in by lawrence, 13 years ago (diff)

Working discovery within paste-deploy context ...

Line 
1import re
2
3class subAI:
4    ''' This is Alan Iwi's substitute and replace orphan code '''
5    def __init__(self):
6        self.r1=re.compile('<([^>]*(<|$))')
7        self.r2=re.compile('((^|>)[^<]*)>')
8
9    def sub(self,s):
10        old=''
11        while s != old:
12            old=s
13            s=self.r1.sub(r'&lt;\1',s)
14            s=self.r2.sub(r'\1&gt;',s)
15        return s
16
17class subMJ:
18
19  def __init__(self):
20
21    self.r4 = re.compile( '(<[A-z]+)|(</[A-z]>)|(<|>)' )
22
23  def sub( self, ss ):
24    self.lc = 0
25    self.rc = 0
26    self.k = 0
27    self.ll = []
28    self.ss = []
29    self.se = []
30    aa = self.r4.sub( self.p1, ss )
31    self.assess()
32    return self.r4.sub( self.p2, ss )
33   
34
35  def p2( self, mm ):
36
37##
38## substitute those flagged as unmatched.
39##
40    l = self.ll[self.k]
41    self.k +=1 
42    if len(l) == 5 or l[5] > 0:
43      return l[0]
44    else:
45      if l[0][0] == '<':
46        return '&lt;' + l[0][1:]
47      else:
48        return '&gt;' + l[0][1:]
49
50  def p1( self, mm ):
51    self.k +=1 
52##
53## type 1: starting a segment.
54    if mm.group(1):
55      self.ss.append( [self.k-1, mm.group(1)[1:], 0] )
56      obj = mm.group(1)
57      typ = 1
58## type 2: ending a segment
59    elif mm.group(2):
60      obj = mm.group(2)
61      self.find_start_seg(mm.group(2)[2:-1] )
62      typ = 2
63## type 3: none of the above
64    elif mm.group(3):
65      obj = mm.group(3)
66      typ = 3
67
68    if obj == '<':
69      self.lc +=1
70    else:
71      self.rc +=1
72    self.ll.append(  [ obj, self.k, self.lc, self.rc, typ ] )
73
74  def find_start_seg(self, gg ):
75      for s in self.ss:
76        if (s[2] == 0) and (s[1] == gg):
77          s[2] = self.k-1
78          return
79      raise 'start of segment not found'
80
81  def assess( self ):
82    for s in self.ss:
83       if s[2] != 0:
84         self.se.append( s[0] )
85         self.se.append( s[2] )
86    self.se.sort()
87
88    lli = []
89    for s in range(len(self.se[:-1])):
90      self.find_orphans( self.se[s],self.se[s+1] )
91    self.k = 0
92   
93
94  def find_orphans( self, i0, i9 ):
95    ll = self.ll[i0:i9+1]
96    if ll[0][4] == 1:
97      rc = 1
98      um= [0]
99    else:
100      rc = 0
101      ll[0].append( 1 )
102      um= []
103
104    for l in range(1,len(ll)-1):
105      if ll[l][0][0] == '<':
106        rc +=1 
107        um.append(l)
108      elif ll[l][0][0] == '>':
109        if len( um ) == 0:
110          ll[l].append( -1 )
111        else:
112          oo = um.pop()
113          ll[l].append( 1 )
114
115# append flag for all remaining unmatched right brackets.
116    for u in um:
117      ll[u].append(-1)
118
119if __name__=="__main__":
120    mystr1='<a> foo > bar > baz < quux < wibble > < dribble < gobble <a>'
121    mystr2='<a str=<fred> > foo > bar > baz < quux < wibble > < dribble < gobble <a>'
122    mystr3='<a str=< > foo > bar > baz < quux < wibble > < dribble < gobble </a>'
123
124
125    s2='<a str=<fred> > foo > bar > baz < quux < wibble > < dribble < gobble </a>'
126    s3 = '<a> < </a> <b> > </b>'
127    s4 = '<a> < </a> <a> > </a>'
128    s5 = '<p> bryan > lawrence <br/> </p>'
129   
130    ss=subr()
131    for s in (mystr1,mystr2,mystr3,s2,s3,s4,s5):
132        print s
133        print ss.sub(s)
Note: See TracBrowser for help on using the repository browser.