equal
deleted
inserted
replaced
216 |
216 |
217 Request objects use a HTMLHead instance to ease adding of |
217 Request objects use a HTMLHead instance to ease adding of |
218 javascripts and stylesheets |
218 javascripts and stylesheets |
219 """ |
219 """ |
220 js_unload_code = u'jQuery(window).unload(unloadPageData);' |
220 js_unload_code = u'jQuery(window).unload(unloadPageData);' |
|
221 # Making <script> tag content work properly with all possible |
|
222 # content-types (xml/html) and all possible browsers is very |
|
223 # tricky, see http://www.hixie.ch/advocacy/xhtml for an in-depth discussion |
|
224 xhtml_safe_script_opening = u'<script type="text/javascript"><!--//--><![CDATA[//><!--\n' |
|
225 xhtml_safe_script_closing = u'\n//--><!]]></script>' |
221 |
226 |
222 def __init__(self): |
227 def __init__(self): |
223 super(HTMLHead, self).__init__() |
228 super(HTMLHead, self).__init__() |
224 self.jsvars = [] |
229 self.jsvars = [] |
225 self.jsfiles = [] |
230 self.jsfiles = [] |
289 resources declaration |
294 resources declaration |
290 """ |
295 """ |
291 w = self.write |
296 w = self.write |
292 # 1/ variable declaration if any |
297 # 1/ variable declaration if any |
293 if self.jsvars: |
298 if self.jsvars: |
294 w(u'<script type="text/javascript"><!--//--><![CDATA[//><!--\n') |
299 w(self.xhtml_safe_script_opening) |
295 for var, value, override in self.jsvars: |
300 for var, value, override in self.jsvars: |
296 vardecl = u'%s = %s;' % (var, json.dumps(value)) |
301 vardecl = u'%s = %s;' % (var, json.dumps(value)) |
297 if not override: |
302 if not override: |
298 vardecl = (u'if (typeof %s == "undefined") {%s}' % |
303 vardecl = (u'if (typeof %s == "undefined") {%s}' % |
299 (var, vardecl)) |
304 (var, vardecl)) |
300 w(vardecl + u'\n') |
305 w(vardecl + u'\n') |
301 w(u'//--><!]]></script>\n') |
306 w(self.xhtml_safe_script_closing) |
302 # 2/ css files |
307 # 2/ css files |
303 for cssfile, media in self.cssfiles: |
308 for cssfile, media in self.cssfiles: |
304 w(u'<link rel="stylesheet" type="text/css" media="%s" href="%s"/>\n' % |
309 w(u'<link rel="stylesheet" type="text/css" media="%s" href="%s"/>\n' % |
305 (media, xml_escape(cssfile))) |
310 (media, xml_escape(cssfile))) |
306 # 3/ ie css if necessary |
311 # 3/ ie css if necessary |
314 for jsfile in self.jsfiles: |
319 for jsfile in self.jsfiles: |
315 w(u'<script type="text/javascript" src="%s"></script>\n' % |
320 w(u'<script type="text/javascript" src="%s"></script>\n' % |
316 xml_escape(jsfile)) |
321 xml_escape(jsfile)) |
317 # 5/ post inlined scripts (i.e. scripts depending on other JS files) |
322 # 5/ post inlined scripts (i.e. scripts depending on other JS files) |
318 if self.post_inlined_scripts: |
323 if self.post_inlined_scripts: |
319 w(u'<script type="text/javascript">\n') |
324 w(self.xhtml_safe_script_opening) |
320 w(u'\n\n'.join(self.post_inlined_scripts)) |
325 w(u'\n\n'.join(self.post_inlined_scripts)) |
321 w(u'\n</script>\n') |
326 w(self.xhtml_safe_script_closing) |
322 header = super(HTMLHead, self).getvalue() |
327 header = super(HTMLHead, self).getvalue() |
323 if skiphead: |
328 if skiphead: |
324 return header |
329 return header |
325 return u'<head>\n%s</head>\n' % header |
330 return u'<head>\n%s</head>\n' % header |
326 |
331 |