1:- module(
2 dcg_html,
3 [
4 dcg_html//1, 5 html_attribute//1, 6 html_element//1, 7 html_element//2, 8 html_element//3, 9 html_entity//1, 10 html_graphic//1, 11 html_string//1, 12 html_style//1 13 ]
14).
20:- use_module(library(abnf)). 21:- use_module(library(dcg)). 22
23:- meta_predicate
24 html_element(+, +, //, ?, ?).
32html_attribute(Attr) -->
33 {
34 compound_name_arguments(Attr, Name0, [Arg]),
35 upcase_atom(Name0, Name)
36 },
37 " ",
38 atom(Name),
39 "=\"",
40 html_string(Arg),
41 "\"".
48dcg_html([tag(Name,Attrs)|T]) --> !,
49 html_element(Name, Attrs),
50 dcg_html(T).
52dcg_html([tag(Name,Attrs,Contents)|T]) --> !,
53 html_element(Name, Attrs, dcg_html(Contents)),
54 dcg_html(T).
56dcg_html([H|T]) -->
57 {atom(H)}, !,
58 atom(H),
59 dcg_html(T).
61dcg_html([H|T]) -->
62 html_string(H), !,
63 dcg_html(T).
65dcg_html([]) --> !, "".
71html_entity(Name) -->
72 "&",
73 atom(Name),
74 ";".
81html_element(Name) -->
82 html_element(Name, []).
83
84
85html_element(Name, Attrs) -->
86 "<",
87 atom(Name),
88 *(html_attribute, Attrs),
89 "/>".
94html_element(Name0, Attrs, Content_0) -->
95 "<",
96 {upcase_atom(Name0, Name)},
97 atom(Name),
98 *(html_attribute, Attrs), !,
99 ">",
100 Content_0,
101 "</",
102 atom(Name),
103 ">".
117html_graphic(0'&) --> !, "&".
118html_graphic(0'') --> !, "'".
119html_graphic(0'") --> !, """. 120html_graphic(0'<) --> !, "<".
121html_graphic(0'>) --> !, ">".
122html_graphic(C) --> [C].
131html_string(S) -->
132 {atom_codes(S, Cs)},
133 *(html_graphic, Cs).
139html_style(Name-Value) -->
140 atom(Name),
141 ":",
142 (" ", ! ; ""),
143 atom(Value),
144 ";"
DCG grammar for generating HTML snippets
*/