Ticket #13978: inlinemedia.diff

File inlinemedia.diff, 3.5 KB (added by Nathan Reynolds, 10 years ago)

Patch

  • django/forms/widgets.py

     
    2828MEDIA_TYPES = ('css','js')
    2929
    3030class Media(StrAndUnicode):
     31    class Inline(object):
     32        def __init__(self, content):
     33            self.content = content
     34   
    3135    def __init__(self, media=None, **kwargs):
    3236        if media:
    3337            media_attrs = media.__dict__
     
    5155        return mark_safe(u'\n'.join(chain(*[getattr(self, 'render_' + name)() for name in MEDIA_TYPES])))
    5256
    5357    def render_js(self):
    54         return [u'<script type="text/javascript" src="%s"></script>' % self.absolute_path(path) for path in self._js]
     58        html = []
     59        for script in self._js:
     60            if isinstance(script, self.Inline):
     61                html.append(u'<script type="text/javascript">%s</script>' % script.content)
     62            else:
     63                html.append(u'<script type="text/javascript" src="%s"></script>' % self.absolute_path(script))
     64        return html
    5565
    5666    def render_css(self):
    5767        # To keep rendering order consistent, we can't just iterate over items().
    5868        # We need to sort the keys, and iterate over the sorted list.
    5969        media = self._css.keys()
    6070        media.sort()
    61         return chain(*[
    62             [u'<link href="%s" type="text/css" media="%s" rel="stylesheet" />' % (self.absolute_path(path), medium)
    63                     for path in self._css[medium]]
    64                 for medium in media])
     71        html = []
     72        for medium in media:
     73            for style in self._css[medium]:
     74                if isinstance(style, self.Inline):
     75                    html.append(u'<style type="text/css" media="%s">%s</style>' % (medium, style.content))
     76                else:
     77                    html.append(u'<link href="%s" type="text/css" media="%s" rel="stylesheet" />' % (self.absolute_path(style), medium))
     78        return html
    6579
    6680    def absolute_path(self, path):
    6781        if path.startswith(u'http://') or path.startswith(u'https://') or path.startswith(u'/'):
     
    7488            return Media(**{str(name): getattr(self, '_' + name)})
    7589        raise KeyError('Unknown media type "%s"' % name)
    7690
    77     def add_js(self, data):
    78         if data:
    79             for path in data:
    80                 if path not in self._js:
    81                     self._js.append(path)
     91    def add_js(self, scripts):
     92        if scripts:
     93            for script in scripts:
     94                if isinstance(script, self.Inline):
     95                    self._js.append(script)
     96                else:
     97                    if script not in self._js:
     98                        self._js.append(script)
    8299
    83     def add_css(self, data):
    84         if data:
    85             for medium, paths in data.items():
    86                 for path in paths:
    87                     if not self._css.get(medium) or path not in self._css[medium]:
    88                         self._css.setdefault(medium, []).append(path)
     100    def add_css(self, media):
     101        if media:
     102            for medium, styles in media.items():
     103                for style in styles:
     104                    if isinstance(style, self.Inline):
     105                        self._css.setdefault(medium, []).append(style)
     106                    else:
     107                        if not self._css.get(medium) or style not in self._css[medium]:
     108                            self._css.setdefault(medium, []).append(style)
    89109
    90110    def __add__(self, other):
    91111        combined = Media()
Back to Top