Changeset 2849:bf893a70b64b in livinglogic.python.xist

Show
Ignore:
Timestamp:
08/03/07 16:39:21 (12 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

html.itercssrules() is a generator now, instead of an iterable class.

Add media tests to test_html.py.

Files:
2 modified

Legend:

Unmodified
Added
Removed
  • src/ll/xist/ns/html.py

    r2846 r2849  
    13881388 
    13891389 
    1390 class itercssrules(object_): 
    1391     def __init__(self, node, base=None, media=None): 
    1392         self.node = node 
    1393         if base is not None: 
    1394             base = url.URL(base) 
    1395         self.base = base 
    1396         self.media = media 
    1397  
    1398     def _fixurl(self, rule, base): 
    1399         if base is not None: 
    1400             for proplist in rule.style.seq: 
    1401                 if not isinstance(proplist, css.CSSComment): 
    1402                     for prop in proplist: 
    1403                         newvalue = [] 
    1404                         for value in prop.cssValue.seq: 
    1405                             if value.startswith("url(") and value.endswith(")"): 
    1406                                 value = "url(%s)" % (base/value[4:-1]) 
    1407                             newvalue.append(value) 
    1408                         prop.cssValue = "".join(newvalue) 
    1409  
    1410     def _doimport(self, parentsheet, base): 
    1411         media = self._getmedia(parentsheet) 
    1412         if media is None or self.media is None or self.media in media: 
    1413             for rule in parentsheet.cssRules: 
    1414                 if rule.type == css.CSSRule.IMPORT_RULE: 
    1415                     href = url.URL(rule.href) 
    1416                     if base is not None: 
    1417                         href = base/href 
    1418                     media = rule.media 
    1419                     with contextlib.closing(href.open("rb")) as r: 
    1420                         href = r.finalurl() 
    1421                         text = r.read() 
    1422                     sheet = css.CSSStyleSheet(href=str(href), media=media, parentStyleSheet=parentsheet) 
    1423                     sheet.cssText = text 
    1424                     for rule in self._doimport(sheet, href): 
    1425                         yield rule 
    1426                 elif rule.type == css.CSSRule.STYLE_RULE: 
    1427                     self._fixurl(rule, base) 
     1390def _fixurl(rule, base): 
     1391    if base is not None: 
     1392        for proplist in rule.style.seq: 
     1393            if not isinstance(proplist, css.CSSComment): 
     1394                for prop in proplist: 
     1395                    newvalue = [] 
     1396                    for value in prop.cssValue.seq: 
     1397                        if value.startswith("url(") and value.endswith(")"): 
     1398                            value = "url(%s)" % (base/value[4:-1]) 
     1399                        newvalue.append(value) 
     1400                    prop.cssValue = "".join(newvalue) 
     1401 
     1402 
     1403def _getmedia(stylesheet): 
     1404    while stylesheet is not None: 
     1405        if stylesheet.media is not None: 
     1406            # FIXME: remove extensions: see http://www.w3.org/TR/css3-mediaqueries/#idx-media-descriptor-1 
     1407            return stylesheet.media 
     1408        stylesheet = stylesheet.parentStyleSheet 
     1409    return None 
     1410 
     1411 
     1412def _doimport(wantmedia, parentsheet, base): 
     1413    havemedia = _getmedia(parentsheet) 
     1414    if wantmedia is None or havemedia is None or wantmedia in havemedia: 
     1415        for rule in parentsheet.cssRules: 
     1416            if rule.type == css.CSSRule.IMPORT_RULE: 
     1417                href = url.URL(rule.href) 
     1418                if base is not None: 
     1419                    href = base/href 
     1420                havemedia = rule.media 
     1421                with contextlib.closing(href.open("rb")) as r: 
     1422                    href = r.finalurl() 
     1423                    text = r.read() 
     1424                sheet = css.CSSStyleSheet(href=str(href), media=havemedia, parentStyleSheet=parentsheet) 
     1425                sheet.cssText = text 
     1426                for rule in self._doimport(wantmedia, sheet, href): 
    14281427                    yield rule 
    1429  
    1430     def __getitem__(self, index): 
    1431         return misc.item(self, index) 
    1432  
    1433     def _getmedia(self, stylesheet): 
    1434         while stylesheet is not None: 
    1435             if stylesheet.media is not None: 
    1436                 # FIXME: remove extensions: see http://www.w3.org/TR/css3-mediaqueries/#idx-media-descriptor-1 
    1437                 return stylesheet.media 
    1438             stylesheet = stylesheet.parentStyleSheet 
    1439         return None 
    1440          
    1441     def __iter__(self): 
    1442         for cssnode in self.node.walknode(_isstyle): 
     1428            elif rule.type == css.CSSRule.STYLE_RULE: 
     1429                _fixurl(rule, base) 
     1430                yield rule 
     1431 
     1432 
     1433def itercssrules(node, base=None, media=None): 
     1434    if base is not None: 
     1435        base = url.URL(base) 
     1436 
     1437    def doiter(node, base, media): 
     1438        for cssnode in node.walknode(_isstyle): 
    14431439            if isinstance(cssnode, style): 
    14441440                stylesheet = cssutils.parseString(unicode(cssnode.content)) 
    1445                 if self.base is not None: 
     1441                if base is not None: 
    14461442                    stylesheet.href = str(self.base) 
    14471443                if "media" in cssnode.attrs: 
    14481444                    stylesheet.media = unicode(cssnode.attrs["media"]) 
    1449                 for rule in self._doimport(stylesheet, self.base): 
     1445                for rule in _doimport(media, stylesheet, base): 
    14501446                    yield rule 
    14511447            else: # link 
    14521448                if "href" in cssnode.attrs: 
    14531449                    href = cssnode.attrs["href"].asURL() 
    1454                     if self.base is not None: 
     1450                    if base is not None: 
    14551451                        href = self.base/href 
    14561452                    with contextlib.closing(href.open("rb")) as r: 
     
    14601456                    if "media" in cssnode.attrs: 
    14611457                        stylesheet.media = unicode(cssnode.attrs["media"]) 
    1462                     for rule in self._doimport(stylesheet, href): 
     1458                    for rule in _doimport(media, stylesheet, href): 
    14631459                        yield rule 
     1460    return misc.Iterator(doiter(node, base, media)) 
    14641461 
    14651462 
  • test/test_html.py

    r2848 r2849  
    6868 
    6969 
    70 def test_applycss4(): 
     70def test_applycss5(): 
    7171    with html.html() as e: 
    7272        with html.head(): 
     
    8080    assert str(e.walknode(html.p)[0].attrs.style) == "color: red;" 
    8181    assert list(e.walknode(html.style)) == [] 
     82 
     83 
     84def test_applycss6(): 
     85    with html.html() as e: 
     86        with html.head(): 
     87            +html.style("p {color: red;}", type="text/css", media="screen") 
     88        with html.body(): 
     89            +html.p("gurk") 
     90 
     91    html.applycss(e, media="screen") 
     92 
     93    assert str(e.walknode(html.p)[0].attrs.style) == "color: red;" 
     94 
     95 
     96def test_applycss7(): 
     97    with html.html() as e: 
     98        with html.head(): 
     99            +html.style("p {color: red;}", type="text/css", media="screen") 
     100        with html.body(): 
     101            +html.p("gurk") 
     102 
     103    html.applycss(e, media="print") 
     104 
     105    # Check that media="screen" doesn't pick up the print stylesheet 
     106    assert str(e.walknode(html.p)[0].attrs.style) == ""