1 USING: accessors assocs combinators html.parser
2 html.parser.utils io kernel math math.order namespaces sequences
3 strings unicode.categories ;
4 IN: html.parser.printer
7 TUPLE: text-printer < html-printer ;
8 TUPLE: src-printer < html-printer ;
9 TUPLE: html-prettyprinter < html-printer ;
11 HOOK: print-text-tag html-printer ( tag -- )
12 HOOK: print-comment-tag html-printer ( tag -- )
13 HOOK: print-dtd-tag html-printer ( tag -- )
14 HOOK: print-opening-tag html-printer ( tag -- )
15 HOOK: print-closing-tag html-printer ( tag -- )
17 ERROR: unknown-tag-error tag ;
19 : print-tag ( tag -- )
21 { [ dup name>> text = ] [ print-text-tag ] }
22 { [ dup name>> comment = ] [ print-comment-tag ] }
23 { [ dup name>> dtd = ] [ print-dtd-tag ] }
24 { [ dup name>> string? ]
27 [ print-closing-tag ] [ print-opening-tag ] if
33 : print-tags ( vector -- ) [ print-tag ] each ;
35 : html-text. ( vector -- )
36 T{ text-printer } html-printer [ print-tags ] with-variable ;
38 : html-src. ( vector -- )
39 T{ src-printer } html-printer [ print-tags ] with-variable ;
41 M: text-printer print-opening-tag
46 { "li" [ " * " write ] }
50 M: text-printer print-closing-tag
53 { "p" "blockquote" "h1" "h2" "h3" "h4" "h5" }
54 member? [ nl nl ] when
57 { "ul" "ol" "li" "tr" } member? [ nl ] when
59 [ "td" = [ " " write ] when ] tri ;
61 M: text-printer print-comment-tag drop ;
63 M: html-printer print-text-tag ( tag -- )
66 M: html-printer print-comment-tag ( tag -- )
67 "<!--" write text>> write "-->" write ;
69 M: html-printer print-dtd-tag ( tag -- )
70 "<!" write text>> write ">" write ;
72 : print-attributes ( hashtable -- )
73 [ [ bl write "=" write ] [ ?quote write ] bi* ] assoc-each ;
75 M: src-printer print-opening-tag ( tag -- )
78 [ attributes>> dup assoc-empty? [ drop ] [ print-attributes ] if ] bi
81 M: src-printer print-closing-tag ( tag -- )
90 : prettyprint-html ( vector -- )
92 T{ html-prettyprinter } html-printer set
93 V{ } clone tagstack set
100 tab-width get #indentations get 0 max * CHAR: \s <repetition> ;
102 M: html-prettyprinter print-opening-tag ( tag -- )
104 [ tabs write "<" write write ">\n" write ]
105 ! These tags usually don't have any closing tag associated with them.
106 [ { "br" "img" } member? [ #indentations inc ] unless ] bi ;
108 M: html-prettyprinter print-closing-tag ( tag -- )
109 ! These tags usually don't have any closing tag associated with them.
110 [ { "br" "img" } member? [ #indentations dec ] unless ]
111 [ tabs write "</" write name>> write ">\n" write ] bi ;
113 M: html-prettyprinter print-text-tag ( tag -- )
114 text>> [ blank? ] trim [ tabs write write "\n" write ] unless-empty ;