From 1ba7a12c72cfb645c36187bbb95ea9160c8a3284 Mon Sep 17 00:00:00 2001 From: Christopher Lenz Date: Tue, 24 Feb 2009 22:10:04 +0000 Subject: Update MochiWeb in trunk to r97. Closes COUCHDB-255. git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@747575 13f79535-47bb-0310-9956-ffa450edef68 --- src/mochiweb/mochiweb_html.erl | 49 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) (limited to 'src/mochiweb/mochiweb_html.erl') diff --git a/src/mochiweb/mochiweb_html.erl b/src/mochiweb/mochiweb_html.erl index 59181686..d9a3cf2e 100644 --- a/src/mochiweb/mochiweb_html.erl +++ b/src/mochiweb/mochiweb_html.erl @@ -129,7 +129,9 @@ escape_attr(F) when is_float(F) -> test() -> test_destack(), test_tokens(), + test_tokens2(), test_parse(), + test_parse2(), test_parse_tokens(), test_escape(), test_escape_attr(), @@ -426,6 +428,34 @@ test_parse() -> Expect = parse(D0), ok. +test_tokens2() -> + D0 = <<"from __future__ import *http://bob.pythonmac.orgBob's Rants">>, + Expect = [{start_tag,<<"channel">>,[],false}, + {start_tag,<<"title">>,[],false}, + {data,<<"from __future__ import *">>,false}, + {end_tag,<<"title">>}, + {start_tag,<<"link">>,[],true}, + {data,<<"http://bob.pythonmac.org">>,false}, + {end_tag,<<"link">>}, + {start_tag,<<"description">>,[],false}, + {data,<<"Bob's Rants">>,false}, + {end_tag,<<"description">>}, + {end_tag,<<"channel">>}], + Expect = tokens(D0), + ok. + +test_parse2() -> + D0 = <<"from __future__ import *http://bob.pythonmac.org
fooBob's Rants
">>, + Expect = {<<"channel">>,[], + [{<<"title">>,[],[<<"from __future__ import *">>]}, + {<<"link">>,[],[ + <<"http://bob.pythonmac.org">>, + {<<"br">>,[],[]}, + <<"foo">>]}, + {<<"description">>,[],[<<"Bob's Rants">>]}]}, + Expect = parse(D0), + ok. + test_parse_tokens() -> D0 = [{doctype,[<<"HTML">>,<<"PUBLIC">>,<<"-//W3C//DTD HTML 4.01 Transitional//EN">>]}, {data,<<"\n">>,true}, @@ -562,8 +592,23 @@ destack(TagName, Stack) when is_list(Stack) -> end, case lists:splitwith(F, Stack) of {_, []} -> - %% No match, no state change - Stack; + %% If we're parsing something like XML we might find + %% a tag that is normally a singleton + %% in HTML but isn't here + case {is_singleton(TagName), Stack} of + {true, [{T0, A0, Acc0} | Post0]} -> + case lists:splitwith(F, Acc0) of + {_, []} -> + %% Actually was a singleton + Stack; + {Pre, [{T1, A1, []} | Post1]} -> + [{T0, A0, [{T1, A1, lists:reverse(Pre)} | Post1]} + | Post0] + end; + _ -> + %% No match, no state change + Stack + end; {_Pre, [_T]} -> %% Unfurl the whole stack, we're done destack(Stack); -- cgit v1.2.3