1 //
2 // Copyright (c) 2007, Brian Frank and Andy Frank
3 // Licensed under the Academic Free License version 3.0
4 //
5 // History:
6 // 5 May 07 Brian Frank Creation
7 //
8
9 using compiler
10 using fandoc
11
12 **
13 ** HtmlGenerator is the base class for HTML generation which
14 ** handles all the navigation and URI concerns
15 **
16 abstract class HtmlGenerator : HtmlDocWriter
17 {
18
19 //////////////////////////////////////////////////////////////////////////
20 // Constructor
21 //////////////////////////////////////////////////////////////////////////
22
23 new make(DocCompiler compiler, Location loc, OutStream out)
24 : super(out)
25 {
26 this.compiler = compiler
27 this.loc = loc
28 }
29
30 //////////////////////////////////////////////////////////////////////////
31 // Generator
32 //////////////////////////////////////////////////////////////////////////
33
34 Void generate()
35 {
36 out.print("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n")
37 out.print(" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n")
38 out.print("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n")
39 out.print("<head>\n")
40 out.print(" <title>$title</title>\n")
41 out.print(" <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/>\n")
42 out.print(" <link rel='stylesheet' type='text/css' href='${pathToRoot}doc.css'/>\n")
43 out.print(" <script type='text/javascript' src='${pathToRoot}doc.js'></script>\n")
44 //out.print(" <script type='text/javascript' src='${pathToRoot}searchIndex.js'></script>\n")
45 out.print("</head>\n")
46 out.print("<body>\n")
47
48 out.print("<div class='header'>\n")
49 out.print("<div class='content'>\n")
50 out.print("<a href='http://www.fandev.org/'><img src='${pathToRoot}logo.png' alt='logo'/></a>\n")
51 out.print("<ul>\n")
52 out.print("<li><a href='http://www.fandev.org/'>Home</a></li>\n")
53 out.print("<li class='active'><a href='${pathToRoot}index.html'>Doc</a></li>\n")
54 out.print("<li><a href='http://www.fandev.org/discussion'>Discuss</a></li>\n")
55 out.print("</ul>")
56 out.print("</div>\n")
57 out.print("</div>\n")
58
59 out.print("<div class='subHeader'>\n")
60 out.print("<div class='content'>\n")
61 header
62 // searchBox
63 out.print("</div>\n")
64 out.print("</div>\n")
65
66 out.print("<div class='main'>\n")
67 out.print("<div class='content'>\n")
68 out.print("<div class='column1'>\n")
69 content
70 out.print("</div>\n")
71 out.print("<div class='column2'>\n")
72 sidebar
73 out.print("</div>\n")
74 out.print("</div>\n")
75 out.print("</div>\n")
76
77 out.print("<div class='footer'>\n")
78 out.print("<div class='content'>\n")
79 copyright
80 out.print("</div>\n")
81 out.print("</div>\n")
82
83 out.print("</body>\n")
84 out.print("</html>\n")
85 out.close
86 }
87
88 //////////////////////////////////////////////////////////////////////////
89 // Hooks
90 //////////////////////////////////////////////////////////////////////////
91
92 **
93 ** Return the title for this document.
94 **
95 virtual Str title()
96 {
97 return "Fandoc"
98 }
99
100 **
101 ** Returnt the relative path to the document root.
102 **
103 virtual Str pathToRoot()
104 {
105 return "../"
106 }
107
108 **
109 ** Generate the header section of the document.
110 **
virtual Void header()
112 {
113 }
114
115 **
116 ** Generate the content section of the document.
117 **
118 virtual Void content()
119 {
120 }
121
122 **
123 ** Generate the copyright section of the document.
124 **
125 virtual Void copyright()
126 {
127 out.print("<p>\n")
128 out.print("Copyright © 2007, Brian Frank and Andy Frank<br/>\n");
129 out.print("Licensed under the Academic Free License version 3.0<br/>\n");
130 out.print("</p>\n")
131
132 out.print("<p>\n")
133 if (compiler.pod != null)
134 out.print("$compiler.pod.name $compiler.pod.version\n");
135 out.print("[$DateTime.now.toLocale]\n");
136 out.print("</p>\n")
137 }
138
139 **
140 ** Generate the sidebar section of the document.
141 **
virtual Void sidebar()
143 {
144 }
145
146 **
147 ** Generate the search box.
148 **
149 Void searchBox()
150 {
151 out.print("<div class='fandocSearch'>\n")
152 out.print("<form action='' onsubmit='return false;'>\n")
153 out.print(" <div>\n")
154 out.print(" <input type='text' id='fandocSearchBox' value='Search...' class='hint'\n")
155 out.print(" onkeyup='SearchBox.search(event);'\n");
156 out.print(" onfocus='SearchBox.onfocus();' onblur='SearchBox.onblur();' />\n")
157 out.print(" </div>\n")
158 out.print(" <div id='fandocSearchResults'></div>\n")
159 out.print("</form>\n")
160 out.print("</div>\n")
161 }
162
163 //////////////////////////////////////////////////////////////////////////
164 // HtmlDocWriter
165 //////////////////////////////////////////////////////////////////////////
166
167 override Void elemStart(DocElem elem)
168 {
169 if (elem.id === DocNodeId.link)
170 {
171 link := elem as Link
172 if (!link.uri.endsWith(".html"))
173 {
174 link.uri = compiler.uriMapper.map(link.uri, loc).toStr
175 link.isCode = compiler.uriMapper.targetIsCode
176 }
177 }
178
179 super.elemStart(elem)
180 }
181
182 //////////////////////////////////////////////////////////////////////////
183 // Filters
184 //////////////////////////////////////////////////////////////////////////
185
186 static Bool showType(Type t)
187 {
188 v := t.isPublic
189 v &= !t.isSynthetic
190 v &= t == Test.type || !t.fits(Test.type)
191 return v
192 }
193
194 static Bool showSlot(Type t, Slot s)
195 {
196 // TODO - inherited slots
197 // return !s.isSynthetic
198 return !s.isSynthetic && t == s.parent
199 }
200
201 static Bool showByDefault(Type t, Slot s)
202 {
203 v := s.isPublic || s.isProtected
204 v &= t == Obj.type || s.parent != Obj.type
205 v &= t == s.parent
206 return v
207 }
208
209 static Bool isInnherited(Type t, Slot s)
210 {
211 return t != s.parent
212 }
213
214 //////////////////////////////////////////////////////////////////////////
215 // Fields
216 //////////////////////////////////////////////////////////////////////////
217
218 DocCompiler compiler
219 Location loc
220 Str docHome := "Doc Home"
221 }