aboutsummaryrefslogtreecommitdiffstats
path: root/lib/docbuilder/src/docb_html.erl
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/docbuilder/src/docb_html.erl
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/docbuilder/src/docb_html.erl')
-rw-r--r--lib/docbuilder/src/docb_html.erl394
1 files changed, 394 insertions, 0 deletions
diff --git a/lib/docbuilder/src/docb_html.erl b/lib/docbuilder/src/docb_html.erl
new file mode 100644
index 0000000000..9aea4c8a66
--- /dev/null
+++ b/lib/docbuilder/src/docb_html.erl
@@ -0,0 +1,394 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved via the world wide web at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999-2000, Ericsson
+%% Utvecklings AB. All Rights Reserved.''
+%%
+%% $Id$
+%%
+-module(docb_html).
+
+-export([rule/2, rule/3]).
+
+rule([p, item, list|_], {_, _, _}) ->
+ {"", "<br />\n"};
+rule([p, item, taglist|_], {_, _, _}) ->
+ {"", "<br />\n"};
+rule([p|_], _) ->
+ {"\n<p>", "\n</p>"};
+
+rule([pre|_], _) ->
+ {"\n<div class=\"example\"><pre>\n", "\n</pre></div>\n"};
+
+rule([input|_], _) ->
+ {"<strong>", "</strong>"};
+
+rule([quote|_], _) ->
+ {"\n<blockquote>\n", "\n</blockquote>\n"};
+
+rule([i|_], _) ->
+ {"<em>", "</em>"};
+
+rule([b|_], _) ->
+ {"<strong>", "</strong>"};
+
+rule([c|_], _) ->
+ {"<span class=\"code\">", "</span>"};
+
+rule([em|_], _) ->
+ {"<strong>", "</strong>"};
+
+rule([sub|_], _) ->
+ {"<sub>", "</sub>"};
+
+rule([sup|_], _) ->
+ {"<sup>", "</sup>"};
+
+rule([termdef|_], _) ->
+ {drop, ""};
+
+rule([citedef|_], _) ->
+ {drop, ""};
+
+rule([br|_], _) ->
+ {"<br />\n", ""};
+
+rule([digression|_], _) ->
+ {"<table>\n"
+ " <tr>\n"
+ " <td width=\"23\"></td>\n"
+ " <td>\n"
+ " <font size=\"-1\">\n",
+ " </font>\n"
+ " </td>\n"
+ " </tr>\n"
+ "</table>\n"};
+
+rule([list, item, list|_], {_, ["ORDERED"], _}) ->
+ {"\n<ol>\n", "\n</ol>\n"};
+rule([list, item, taglist|_], {_, ["ORDERED"], _}) ->
+ {"\n<ol>\n", "\n</ol>\n"};
+rule([list|_], {_, ["ORDERED"], _}) ->
+ {"\n<ol>\n", "\n</ol>\n"};
+rule([list, item, list|_], {_, ["BULLETED"], _}) ->
+ {"\n<ul>\n", "\n</ul>\n"};
+rule([list, item, taglist|_], {_, ["BULLETED"], _}) ->
+ {"\n<ul>\n", "\n</ul>\n"};
+rule([list|_], {_, ["BULLETED"], _}) ->
+ {"\n<ul>\n", "\n</ul>\n"};
+
+rule([taglist, item, taglist|_], _) ->
+ {"\n<dl>\n", "\n</dl>\n"};
+rule([taglist, item, list|_], _) ->
+ {"\n<dl>\n", "\n</dl>\n"};
+rule([taglist|_], _) ->
+ {"\n<dl>\n", "\n</dl>\n"};
+
+rule([tag|_], _) ->
+ {"\n<dt>\n", "\n</dt>\n"};
+
+rule([item, list|_], _) ->
+ {"\n<li>\n", "\n</li>\n\n"};
+rule([item, taglist|_], _) ->
+ {"\n<dd>\n", "\n</dd>\n"};
+
+rule([image|_], {_, [File], _}) ->
+ File2 =
+ case filename:extension(File) of
+ [] -> File ++ ".gif";
+ _ -> File
+ end,
+ {["\n<center>\n", "<img alt=\"", File2, "\" src=\"", File2,
+ "\"/><br/>\n"],
+ "\n</center>\n"};
+
+rule([icaption|_], _) ->
+ {"<em>", "</em>\n"};
+
+rule([url|_], {_, [HREF], _}) ->
+ URI = docb_html_util:make_uri(HREF),
+ {io_lib:format("<a target=\"_top\" href=\"~s\">", [URI]), "</a>"};
+
+rule([marker|_], {_, [ID], _}) ->
+ %% remove all chars before first # including the #
+ {ok, NewID, _} = regexp:sub(ID, "^[^#]*#", ""),
+ %% replace "/" with "-" because "/" xhtml does not
+ %% allow "/" in the name attribute of element <a>
+ %% so we have to do the same as for marker i.e
+ %% Function/Arity is translated to an anchor in xhtml
+ %% like this : <a name="Function-Arity"/>
+ NewID2 = [case X of $/ -> $-;_->X end||X <- NewID],
+ {drop, ["<a name=\"", NewID2, "\"><!-- Empty --></a>"]};
+
+rule([table|_], {_, ["", ""], Ts}) ->
+ {newargs,
+ "\n<center>\n"
+ "<table cellspacing=\"0\" cellpadding=\"2\" border=\"1\">\n",
+ reorder_table(Ts),
+ "\n</table>\n"
+ "</center>\n"};
+rule([table|_], {_, [Width, ""], Ts}) ->
+ {newargs,
+ ["\n<center>\n"
+ "<table cellspacing=\"0\" cellpadding=\"2\" border=\"1\" ",
+ "width=\"", Width, "%\">\n"],
+ reorder_table(Ts),
+ "\n</table>\n"
+ "</center>\n"};
+
+%% The clauses above are for the report DTD. This one is for the other
+%% DTDs.
+rule([table|_], {_, ["LEFT"], Ts}) ->
+ {newargs,
+ "\n"
+ "<table cellspacing=\"0\" cellpadding=\"2\" border=\"1\">\n",
+ reorder_table(Ts),
+ "\n</table>\n"};
+
+rule([table|_], {_, _, Ts}) ->
+ {newargs,
+ "\n<center>\n"
+ "<table cellspacing=\"0\" cellpadding=\"2\" border=\"1\">\n",
+ reorder_table(Ts),
+ "\n</table>\n"
+ "</center>\n"};
+
+rule([row|_], _) ->
+ {" <tr>\n", "\n </tr>\n"};
+
+rule([cell|_], {_, ["", ""], _}) ->
+ {" <td>\n", "\n </td>\n"};
+rule([cell|_], {_, [Align, ""], _}) ->
+ {[" <td align=\"", string:to_lower(Align), "\">\n"], "\n </td>\n"};
+rule([cell|_], {_, ["", VAlign], _}) ->
+ {[" <td valign=\"", string:to_lower(VAlign), "\">\n"], "\n </td>\n"};
+rule([cell|_], {_, [Align, VAlign], _}) ->
+ {[" <td align=\"", string:to_lower(Align), "\" valign=\"", string:to_lower(VAlign), "\">\n"],
+ "\n </td>\n"};
+
+rule([tcaption|_], _) ->
+ {" <caption align=\"bottom\"><em>", "</em></caption>\n"};
+
+rule([codeinclude|_], {_, [File, Tag, _Type], _}) ->
+%% Type can be "ERL", "C" or "NONE"
+ {ok,Data} = docb_html_util:code_include(File, Tag),
+ {drop, ["\n<div class=\"example\"><pre>\n", Data,
+ "\n</pre></div>\n"]};
+
+rule([erleval|_], {_, [Expr], _}) ->
+ docb_html_util:erl_eval(Expr);
+
+rule([pcdata, pre|_], {_, _, Data}) ->
+ %% Do not remove leading spaces.
+ {drop, docb_html_util:pcdata_to_html(Data, false)};
+
+rule([pcdata|_], {_, _, Data}) ->
+ {drop, docb_html_util:pcdata_to_html(Data)}.
+
+rule([seealso|_], {_, [Marker], _}, Opts) ->
+ Href =
+ case docb_util:html_snippet(seealso, Marker, Opts) of
+ "" ->
+ %% DocBuilder default behavior:
+ %% Marker is of format "Path#Fragment", both optional.
+ %% Translated to <A HREF="Path.html#Fragment">
+ case string:chr(Marker, $#) of
+ 0 -> % No Fragment
+ Marker++".html";
+ 1 -> % No Path
+ %% replace "/" with "-" because "/" xhtml does not
+ %% allow "/" in the name attribute of element <a>
+ %% so we have to do the same as for marker i.e
+ %% Function/Arity is translated to an anchor in xhtml
+ %% like this : <a name="Function-Arity"/>
+ [case X of $/ -> $-;_->X end||X <- Marker];
+ _ ->
+ Marker1 = [case X of $/ -> $-;_->X end||X <- Marker],
+ case string:tokens(Marker1, "#") of
+ [Path] -> % # at end, remove it
+ Path++".html";
+ [Path | Frag0] ->
+ Path++".html#"++
+ docb_util:join(Frag0, "#")
+ end
+ end;
+ Href0 ->
+ %% User defined behavior, use result as-is
+ Href0
+ end,
+ {{["<a href=\"", Href, "\">"], "</a>"}, Opts};
+
+rule([warning|_], _, Opts) ->
+ docb_html_util:copy_pics("warning.gif", "warning.gif", Opts),
+ {{"\n<div class=\"warning\">\n"
+ "<div class=\"label\">Warning</div>\n"
+ "<div class=\"content\">\n",
+ "\n</div>"
+ "\n</div>\n"}, Opts};
+
+rule([note|_], _, Opts) ->
+ docb_html_util:copy_pics("note.gif", "note.gif", Opts),
+ {{"\n<div class=\"note\">\n"
+ "<div class=\"label\">Note</div>\n"
+ "<div class=\"content\">",
+ "\n</div>"
+ "\n</div>\n"}, Opts};
+
+rule([path|_], {_, [UNIX, Windows], [{pcdata, _, Text}]}, Opts) ->
+ UnixPart =
+ docb_util:an_option({ptype,"unix"}, Opts) and (UNIX/=""),
+ WinPart =
+ docb_util:an_option({ptype,"windows"}, Opts) and (Windows/=""),
+ if
+ UnixPart, WinPart ->
+ {{drop, [docb_html_util:pcdata_to_html(Text),
+ " <font size=\"-2\">(<code>UNIX: ",
+ docb_html_util:attribute_cdata_to_html(UNIX),
+ ", ",
+ "Windows: ",
+ docb_html_util:attribute_cdata_to_html(Windows),
+ "</code>)</font>"]},
+ Opts};
+ UnixPart ->
+ {{drop, [docb_html_util:pcdata_to_html(Text),
+ " <font size=\"-1\">(<code>UNIX: ",
+ docb_html_util:attribute_cdata_to_html(UNIX),
+ "</code>)</font>"]},
+ Opts};
+ WinPart ->
+ {{drop, [docb_html_util:pcdata_to_html(Text),
+ " <font size=\"-1\">(<code>Windows: ",
+ docb_html_util:attribute_cdata_to_html(Windows),
+ "</code>)</font>"]},
+ Opts};
+ true ->
+ {{drop, docb_html_util:pcdata_to_html(Text)}, Opts}
+ end;
+
+rule([term|_], {_, [ID], _}, Opts) ->
+ case docb_util:an_option(dict, Opts) of
+ false ->
+ case docb_util:lookup_option({defs, term}, Opts) of
+ false ->
+ {{drop, ["<em><strong>",
+ ID,
+ "</strong></em> "]}, Opts};
+ TermList ->
+ case lists:keysearch(ID, 1, TermList) of
+ false ->
+ {{drop, ["<em><strong>", ID,
+ "</strong></em> "]},
+ Opts};
+ {value, {ID, Name, _Description, _Resp}} ->
+ {{drop, ["<em><strong>", Name,
+ "</strong></em> "]},
+ Opts};
+ {value, {ID, Name, _Description}} ->
+ {{drop, [ "<em><strong>", Name,
+ "</strong></em> "]},
+ Opts}
+ end
+ end;
+ true ->
+ case docb_util:lookup_option({defs, term}, Opts) of
+ false ->
+ {{drop, ["<em><strong>", ID,
+ "</strong></em> "]}, Opts};
+ TermList ->
+ PartApplication =
+ docb_util:lookup_option(part_application, Opts),
+ case lists:keysearch(ID, 1, TermList) of
+ false ->
+ {{drop, ["<a href=\"", PartApplication,
+ "_term.html#", ID, "\">", ID,
+ "</a> "]}, Opts};
+ {value, {ID, Name, _Description, _Resp}} ->
+ {{drop, ["<a href=\"", PartApplication,
+ "_term.html#", ID, "\">", Name,
+ "</a> "]}, Opts};
+ {value, {ID, Name, _Description}} ->
+ {{drop, ["<a href=\"", PartApplication,
+ "_term.html#", ID, "\">", Name,
+ "</a> "]}, Opts}
+ end
+ end
+ end;
+
+rule([cite|_], {_, [ID], _}, Opts) ->
+ case docb_util:an_option(dict, Opts) of
+ false ->
+ case docb_util:lookup_option({defs, cite}, Opts) of
+ false ->
+ {{drop, ["<em><strong>", ID, "</strong></em> "]},
+ Opts};
+ CiteList ->
+ case lists:keysearch(ID, 1, CiteList) of
+ false ->
+ {{drop,
+ ["<em><strong>", ID, "</strong></em> "]},
+ Opts};
+
+ {value, {ID, Name, _Description, _Resp}} ->
+ {{drop, ["<em><strong>", Name,
+ "</strong></em> "]},
+ Opts};
+ {value, {ID, Name, _Description}} ->
+ {{drop, ["<em><strong>", Name,
+ "</strong></em> "]},
+ Opts}
+ end
+ end;
+ true ->
+ case docb_util:lookup_option({defs, cite}, Opts) of
+ false ->
+ {{drop, ["<em><strong>", ID, "</strong></em> "]},
+ Opts};
+ CiteList ->
+ PartApp =
+ docb_util:lookup_option(part_application, Opts),
+ case lists:keysearch(ID, 1, CiteList) of
+ false ->
+ {{drop, ["<a href=\"", PartApp,
+ "_cite.html#", ID, "\">", ID,
+ "</a> "]},
+ Opts};
+ {value, {ID, Name, _Description, _Resp}} ->
+ {{drop, ["<a href=\"", PartApp,
+ "_cite.html#", ID, "\">", Name,
+ "</a> "]},
+ Opts};
+ {value, {ID, Name, _Description}} ->
+ {{drop, ["<a href=\"", PartApp,
+ "_cite.html#", ID, "\">", Name,
+ "</a> "]},
+ Opts}
+ end
+ end
+ end;
+
+rule([code|_], {_, [Type], [{pcdata, _, Code}]}, Opts) ->
+ case lists:member(Type,["ERL","C","NONE"]) of
+ true ->
+ {{drop, ["\n<div class=\"example\"><pre>\n", docb_html_util:element_cdata_to_html(Code),
+ "\n</pre></div>\n"]}, Opts};
+ false ->
+ exit({error,"unknown type of <code>"})
+ end.
+
+reorder_table(TableContent) ->
+ reorder_table(TableContent, [], []).
+reorder_table([], Caption, NewTableContent) ->
+ Caption ++ lists:reverse(NewTableContent);
+reorder_table([{tcaption,_,_} = Caption | TableContent], _, NewTableContent) ->
+ reorder_table(TableContent, [Caption], NewTableContent);
+reorder_table([Row | TableContent], Caption, NewTableContent) ->
+ reorder_table(TableContent, Caption, [Row | NewTableContent]).