You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by be...@apache.org on 2014/02/13 17:06:01 UTC

[06/50] mochiweb commit: updated refs/heads/import-upstream to 8eb1f22

create <html> if we see a HTML5 doctype


Project: http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/commit/fa0b40ea
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/tree/fa0b40ea
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/diff/fa0b40ea

Branch: refs/heads/import-upstream
Commit: fa0b40ea2705dfcbe8af156851c69d737791ad70
Parents: 13f9316
Author: Bob Ippolito <bo...@redivi.com>
Authored: Mon May 6 15:14:57 2013 -0700
Committer: Bob Ippolito <bo...@redivi.com>
Committed: Mon May 6 15:21:37 2013 -0700

----------------------------------------------------------------------
 src/mochiweb_html.erl        | 32 +++++++++++++++++++++-----------
 test/mochiweb_html_tests.erl |  9 +++++++++
 2 files changed, 30 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/blob/fa0b40ea/src/mochiweb_html.erl
----------------------------------------------------------------------
diff --git a/src/mochiweb_html.erl b/src/mochiweb_html.erl
index c38f138..3732924 100644
--- a/src/mochiweb_html.erl
+++ b/src/mochiweb_html.erl
@@ -5,13 +5,14 @@
 -module(mochiweb_html).
 -export([tokens/1, parse/1, parse_tokens/1, to_tokens/1, escape/1,
          escape_attr/1, to_html/1]).
+-compile([export_all]).
 -ifdef(TEST).
 -export([destack/1, destack/2, is_singleton/1]).
 -endif.
 
 %% This is a macro to placate syntax highlighters..
--define(QUOTE, $\").
--define(SQUOTE, $\').
+-define(QUOTE, $\"). %% $\"
+-define(SQUOTE, $\'). %% $\'
 -define(ADV_COL(S, N),
         S#decoder{column=N+S#decoder.column,
                   offset=N+S#decoder.offset}).
@@ -66,18 +67,25 @@ parse(Input) ->
 %% @doc Transform the output of tokens(Doc) into a HTML tree.
 parse_tokens(Tokens) when is_list(Tokens) ->
     %% Skip over doctype, processing instructions
-    F = fun (X) ->
-                case X of
-                    {start_tag, _, _, false} ->
-                        false;
-                    _ ->
-                        true
-                end
-        end,
-    [{start_tag, Tag, Attrs, false} | Rest] = lists:dropwhile(F, Tokens),
+    [{start_tag, Tag, Attrs, false} | Rest] = find_document(Tokens, normal),
     {Tree, _} = tree(Rest, [norm({Tag, Attrs})]),
     Tree.
 
+find_document(Tokens=[{start_tag, _Tag, _Attrs, false} | _Rest], Mode) ->
+    maybe_add_html_tag(Tokens, Mode);
+find_document([{doctype, [<<"html">>]} | Rest], _Mode) ->
+    find_document(Rest, html5);
+find_document([_T | Rest], Mode) ->
+    find_document(Rest, Mode);
+find_document([], _Mode) ->
+    [].
+
+maybe_add_html_tag(Tokens=[{start_tag, Tag, _Attrs, false} | _], html5)
+  when Tag =/= <<"html">> ->
+    [{start_tag, <<"html">>, [], false} | Tokens];
+maybe_add_html_tag(Tokens, _Mode) ->
+    Tokens.
+
 %% @spec tokens(StringOrBinary) -> [html_token()]
 %% @doc Transform the input UTF-8 HTML into a token stream.
 tokens(Input) ->
@@ -302,6 +310,8 @@ tokenize(B, S=#decoder{offset=O}) ->
     case B of
         <<_:O/binary, "<!--", _/binary>> ->
             tokenize_comment(B, ?ADV_COL(S, 4));
+        <<_:O/binary, "<!doctype", _/binary>> ->
+            tokenize_doctype(B, ?ADV_COL(S, 10));
         <<_:O/binary, "<!DOCTYPE", _/binary>> ->
             tokenize_doctype(B, ?ADV_COL(S, 10));
         <<_:O/binary, "<![CDATA[", _/binary>> ->

http://git-wip-us.apache.org/repos/asf/couchdb-mochiweb/blob/fa0b40ea/test/mochiweb_html_tests.erl
----------------------------------------------------------------------
diff --git a/test/mochiweb_html_tests.erl b/test/mochiweb_html_tests.erl
index c9fec6f..3d35400 100644
--- a/test/mochiweb_html_tests.erl
+++ b/test/mochiweb_html_tests.erl
@@ -571,6 +571,15 @@ parse_unescaped_lt_test() ->
                                       [<<"Back">>]}]},
     mochiweb_html:parse(D2)).
 
+html5_doctype_test() ->
+    ?assertEqual(
+       [{doctype,[<<"html">>]},
+        {start_tag,<<"head">>,[],false},
+        {end_tag,<<"head">>},
+        {start_tag,<<"body">>,[],false},
+        {end_tag,<<"body">>}],
+       mochiweb_html:tokens("<!doctype html><head></head><body></body>")).
+
 implicit_html_test() ->
     %% https://github.com/mochi/mochiweb/issues/110
     ?assertEqual(