1:- module(md_span, [
2 md_span_codes/2, 3 md_span_string/2 4]).
13:- use_module(library(dcg/basics)). 14:- use_module(library(apply)). 15
16:- use_module(md_trim). 17:- use_module(md_links). 18:- use_module(md_span_link). 19:- use_module(md_span_decorate). 20:- use_module(md_escape). 21:- use_module(md_line).
28md_span_string(String, HtmlTerms):-
29 string_codes(String, Codes),
30 md_span_codes(Codes, HtmlTerms).
38md_span_codes(Codes, HtmlTerms):-
39 md_span_codes(Codes, [strong, em, code, del], HtmlTerms).
40
41md_span_codes(Codes, Allow, Out):-
42 phrase(span(Spans, Allow), Codes), !,
43 phrase(atomize(Out), Spans).
44
46
47span([Code1,Code2|Spans], Allow) -->
48 [Code1,Code2],
49 {
50 code_type(Code1, alnum),
51 code_type(Code2, alnum),
52 Code1 \= 0'h,
53 Code2 \= 0't
54 }, !,
55 span(Spans, Allow).
56
61
62span([Atom|Spans], Allow) -->
63 "\\", [Code],
64 {
65 md_escaped_code(Code),
66 atom_codes(Atom, [Code])
67 }, !,
68 span(Spans, Allow).
69
73
74span([\[Atom]|Spans], Allow) -->
75 "&", string_limit(Codes, 10), ";",
76 {
77 maplist(alnum, Codes),
78 append([0'&|Codes], [0';], Entity),
79 atom_codes(Atom, Entity)
80 }, !,
81 span(Spans, Allow).
82
86
87span(['&'|Spans], Allow) -->
88 "&", !, span(Spans, Allow).
89
93
94span(['<'|Spans], Allow) -->
95 "<", lookahead(Code),
96 {
97 \+ code_type(Code, alpha),
98 Code \= 47
99 }, !,
100 span(Spans, Allow).
101
102span(['<'], _) -->
103 "<", eos, !.
104
108
109span([br([])|Spans], Allow) -->
110 " ", whites, ln, !,
111 span(Spans, Allow).
112
114
115span([Link|Spans], Allow) -->
116 lookahead(Code),
117 {
118 119 ( Code = 0'[
120 ; Code = 0'!
121 ; Code = 0'<
122 ; Code = 0'h)
123 },
124 md_span_link(Link), !,
125 span(Spans, Allow).
126
129
130span([\[String]|Spans], Allow) -->
131 "<script", string(Codes), "</script>", !,
132 {
133 string_codes(Content, Codes),
134 atomics_to_string(['<script', Content, '</script>'], String)
135 },
136 span(Spans, Allow).
137
140
141span([Code, 0'_, 0'_|Spans], Allow) -->
142 [Code], "__",
143 { code_type(Code, alnum) }, !,
144 span(Spans, Allow).
145
146span([Code, 0'_|Spans], Allow) -->
147 [Code], "_",
148 { code_type(Code, alnum) }, !,
149 span(Spans, Allow).
150
153
154span([Span|Spans], Allow) -->
155 lookahead(Code),
156 {
157 158 ( Code = 0'`
159 ; Code = 0'_
160 ; Code = 0'*
161 ; Code = 0'~)
162 },
163 md_span_decorate(Dec, Allow), !,
164 {
165 Dec =.. [Name, Codes],
166 ( Name = code
167 -> string_codes(Atom, Codes),
168 Span =.. [Name, Atom]
169 ; select(Name, Allow, AllowNest),
170 md_span_codes(Codes, AllowNest, Nested),
171 Span =.. [Name, Nested])
172 },
173 span(Spans, Allow).
174
175span([Code|Spans], Allow) -->
176 [Code], !,
177 span(Spans, Allow).
178
179span([], _) -->
180 eos.
181
186
187atomize([]) -->
188 eos, !.
189
190atomize([\[Atom]|Tokens]) -->
191 [Num], { number(Num) }, !,
192 text_codes(Codes),
193 { string_codes(Atom, [Num|Codes]) },
194 atomize(Tokens).
195
196atomize([Token|Tokens]) -->
197 [Token], atomize(Tokens).
198
199text_codes([Code|Codes]) -->
200 [Code], { number(Code) }, !,
201 text_codes(Codes).
202
203text_codes([]) --> "".
204
207
208alnum(Code):-
209 code_type(Code, alnum)
Span-level Markdown parser
Parses span-level Markdown elements: emphasis, inline-code, links and others. More info: http://daringfireball.net/projects/markdown/syntax#span */