178: def parse_starttag(i)
179: rawdata = @rawdata
180: j = rawdata.index(Endbracket, i + 1)
181: return nil unless j
182: attrs = []
183: if rawdata[i+1] == ?>
184:
185: k = j
186: tag = @lasttag
187: else
188: match = rawdata.index(Tagfind, i + 1)
189: unless match
190: raise RuntimeError, 'unexpected call to parse_starttag'
191: end
192: k = i + 1 + ($&.length)
193: tag = $&.downcase
194: @lasttag = tag
195: end
196: while k < j
197:
198: break unless idx = rawdata.index(Attrfind, k) and idx < j
199: matched_length = $&.length
200: attrname, rest, attrvalue = $1, $2, $3
201: if not rest
202: attrvalue = ''
203:
204: elsif (attrvalue[0] == ?' && attrvalue[-1] == ?') or
205: (attrvalue[0] == ?" && attrvalue[-1] == ?")
206: attrvalue = attrvalue[1..-2]
207: end
208: attrs << [attrname.downcase, attrvalue]
209: k += matched_length
210: end
211:
212: if rawdata[j,2] == '/>'
213: j += 2
214: finish_starttag(tag, attrs)
215: finish_endtag(tag)
216: else
217: if rawdata[j] == ?>
218: j += 1
219: end
220: finish_starttag(tag, attrs)
221: end
222: return j
223: end