utils.py
changeset 6409 d75535983224
parent 6376 f8662240ed4d
parent 6406 39663630ca3c
child 6448 8590d82e9b1b
equal deleted inserted replaced
6404:2013ef8f56e9 6409:d75535983224
   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