Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
Index: test/test_parser.rb =================================================================== --- test/test_parser.rb (revision 155) +++ test/test_parser.rb (working copy) @@ -299,10 +299,10 @@ assert_equal "blah='blah'", doc.children[2].content end - def test_buffer_error - assert_raise Hpricot::ParseError, "ran out of buffer space on element <input>, starting on line 3." do - Hpricot(%{<p>\n\n<input type="hidden" name="__VIEWSTATE" value="#{(("X" * 2000) + "\n") * 22}" />\n\n</p>}) - end + def test_no_buffer_error + viewstate = (("X" * 2000) + "\n") * 100 + doc = Hpricot(%{<p>\n\n<input type="hidden" name="__VIEWSTATE" value="#{viewstate}" />\n\n</p>}) + assert_equal viewstate, (doc/:input)[0].get_attribute('value') end def test_youtube_attr Index: ext/hpricot_scan/hpricot_scan.rl =================================================================== --- ext/hpricot_scan/hpricot_scan.rl (revision 155) +++ ext/hpricot_scan/hpricot_scan.rl (working copy) @@ -162,16 +162,30 @@ while ( !done ) { VALUE str; - char *p = buf + have, *pe; - int len, space = buffer_size - have; + char *p, *pe; + int len, space = buffer_size - have, tokstart_diff, tokend_diff, mark_tag_diff, mark_akey_diff, mark_aval_diff; if ( space == 0 ) { - /* We've used up the entire buffer storing an already-parsed token - * prefix that must be preserved. Likely caused by super-long attributes. - * See ticket #13. */ - rb_raise(rb_eHpricotParseError, "ran out of buffer space on element <%s>, starting on line %d.", RSTRING(tag)->ptr, curline); + tokstart_diff = tokstart - buf; + tokend_diff = tokend - buf; + mark_tag_diff = mark_tag - buf; + mark_akey_diff = mark_akey - buf; + mark_aval_diff = mark_aval - buf; + + buffer_size += BUFSIZE; + buf = REALLOC_N(buf, char, buffer_size); + + space = buffer_size - have; + + tokstart = buf + tokstart_diff; + tokend = buf + tokend_diff; + mark_tag = buf + mark_tag_diff; + mark_akey = buf + mark_akey_diff; + mark_aval = buf + mark_aval_diff; } + p = buf + have; + if ( rb_respond_to( port, s_read ) ) { str = rb_funcall( port, s_read, 1, INT2FIX(space) );
This paste will be private.
From the Design Piracy series on my blog: