/** * Removes the range between start and end from the given exception handlers. * * @param h an exception handler list. * @param start the start of the range to be removed. * @param end the end of the range to be removed. Maybe null. * @return the exception handler list with the start-end range removed. */ static Handler remove(Handler h, Label start, Label end) { if (h == null) { return null; } else { h.next = remove(h.next, start, end); } int hstart = h.start.position; int hend = h.end.position; int s = start.position; int e = end == null ? Integer.MAX_VALUE : end.position; // if [hstart,hend[ and [s,e[ intervals intersect... if (s < hend && e > hstart) { if (s <= hstart) { if (e >= hend) { // [hstart,hend[ fully included in [s,e[, h removed h = h.next; } else { // [hstart,hend[ minus [s,e[ = [e,hend[ h.start = end; } } else if (e >= hend) { // [hstart,hend[ minus [s,e[ = [hstart,s[ h.end = start; } else { // [hstart,hend[ minus [s,e[ = [hstart,s[ + [e,hend[ Handler g = new Handler(); g.start = end; g.end = h.end; g.handler = h.handler; g.desc = h.desc; g.type = h.type; g.next = h.next; h.end = start; h.next = g; } } return h; }
public void parseStreaming(InputStream is, OutputStream os, Context context) { // HTML5 may violate XML correctness. It shouldn't, but hey, shit happens. HtmlParser hp = new HtmlParser(XmlViolationPolicy.ALLOW); // true streaming for max awesomeness hp.setStreamabilityViolationPolicy(XmlViolationPolicy.FATAL); handler.setOutput(os); handler.setContext(context); hp.setContentHandler(handler); try { hp.parse(new InputSource(is)); handler.end(); } catch (IOException | SAXException ex) { Logger.getLogger(getClass()).error("HTML parsing failed", ex); } }