diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2004-07-30 21:53:52 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2004-07-30 21:53:52 +0000 |
commit | d601aa71887b45b4fbd1c1c86f5cfe2971100216 (patch) | |
tree | ea9e8424f3a146984b11d29071f4aa6cc30ca92e | |
parent | 999ded28b8f0bdd35f99bedeb11ac74a4dca5279 (diff) | |
download | netsurf-d601aa71887b45b4fbd1c1c86f5cfe2971100216.tar.gz netsurf-d601aa71887b45b4fbd1c1c86f5cfe2971100216.tar.bz2 |
[project @ 2004-07-30 21:53:52 by jmb]
Implement some CSS3 attribute selectors
svn path=/import/netsurf/; revision=1167
-rw-r--r-- | !NetSurf/Resources/AdBlock,f79 | 259 | ||||
-rw-r--r-- | !NetSurf/Resources/CSS,f79 | 2 | ||||
-rw-r--r-- | css/css.c | 78 | ||||
-rw-r--r-- | css/css.h | 6 | ||||
-rw-r--r-- | css/parser.y | 42 | ||||
-rw-r--r-- | css/scanner.l | 3 |
6 files changed, 390 insertions, 0 deletions
diff --git a/!NetSurf/Resources/AdBlock,f79 b/!NetSurf/Resources/AdBlock,f79 new file mode 100644 index 000000000..12a54a571 --- /dev/null +++ b/!NetSurf/Resources/AdBlock,f79 @@ -0,0 +1,259 @@ +/* From http://texturizer.net/firefox/adblock.html */ + +/* Block Ads v.2004-06-12 by Neil Jenkins + Portions of this ruleset are derived from the ad blocking css by Joe Francis at: + http://www.floppymoose.com/ + Some code also contributed by Mike Hokenson: + http://www.gozer.org/mozilla/ad_blocking +*/ + +iframe[width="120"][height="600"], a img[width="120"][height="600"], +iframe[width="125"][height="600"], a img[width="125"][height="600"], +iframe[width="150"][height="100"], a img[width="150"][height="100"], +iframe[width="150"][height="600"], a img[width="150"][height="600"], +iframe[width="160"][height="600"], a img[width="160"][height="600"], +iframe[width="300"][height="250"], a img[width="300"][height="250"], +iframe[width="336"][height="280"], a img[width="336"][height="280"], +iframe[width="468"][height="60"], a img[width="468"][height="60"], +iframe[width="470"][height="62"], a img[width="470"][height="62"], +iframe[width="728"][height="90"], a img[width="728"][height="90"], +iframe[width="730"][height="92"], a img[width="730"][height="92"], +iframe[width="600"][height="120"], object[width="125"][height="300"], +iframe[width="180"][height="150"], +iframe[src*="/ad-"], +iframe[src*="/ad."], +iframe[src*="/ad/"], +iframe[src*="/ad_"], +iframe[src*="/adframe"], +iframe[src*="/ads"], +iframe[src*="/adv"], +iframe[src*="/adx"], +iframe[src*=".ad"], +iframe[src*="_Banner"], +iframe[src*="BET365"], +iframe[src*="/click"], +iframe[src*="?click"], +iframe[src*="googlesyndication"], +iframe[src*="promos"], +iframe[name="bsadframe"], +iframe[id="adFrame"], +iframe[id="splashFrame"], +img[src*="/ad-"], +img[src*="/ad."], +img[src*="/ad/"], +img[src*="/ad_"], +img[src*="/ads"], +img[src*="/adv"], +img[src*="/adx"], +img[src*=".ad"], +img[src*="_ad_"], +img[src*="/click"], +img[src*="?click"], +img[src*="Editorial_Promos"], +img[src*="/toms_skyscraper_"], +img[src$="images/logos/amazon_international.gif"], +img[src*="freshmeat.net/button.gif"], +img[src*="pic.geocities.com/images/"], +img[src*="i.imdb.com/Vpics/"], +img[src*="i.imdb.com/Photos/CMSIcons"], +img[src*="i.imdb.com/Icons/apix/"], +img[src*="i.imdb.com/Icons/kpix/"], +img[src*="i.imdb.com/apix/"], +img[src*="sportsbybrooks.com/farkbutton.gif"], +img[alt*="advert"], +img[alt*="Click Here To Visit Our Sponsor"], +img[alt*="Sponsored Links"], +img[name="fixedSpImg"], +a:link[href*="/ad-"] img, +a:link[href*="/ad."] img, +a:link[href*="/ad/"] img, +a:link[href*="/ad_"] img, +a:link[href*="/ads"] img, +a:link[href*="/adv"] img, +a:link[href*="/adx"] img, +a:link[href*=".ad"] img, +a:link[href*="/banner"] img, +a:link[href*="/click.cgi"] img, +a:link[href*="/clickcgi?"] img, +a:link[href*="/clickover"] img, +a:link[href*="/clickthr"] img, +a:link[href*="/click-"] img, +a:link[href*="=click"] img, +a:link[href*="?click"] img, +a:link[href*="/A="] img, +table table table[width="346"][height="280"], +table[class="metatable"], +table[id="RefAd"], +table[cellspacing="0"][width="160"][height="329"][bgcolor="#000000"], +table[cellpadding="5"][width="150"][style="border: 1px dashed rgb(221, 170, 170); background-color: rgb(236, 248, 255);"], +table[border="0"][height="600"][width="120"], +table[height="90"][cellspacing="0"][cellpadding="0"][width="728"][border="0"], +table[border="0"][cellpadding="3"][cellspacing="0"][height="40"][width="100%"], +table[border="0"][cellpadding="0"][cellspacing="4"][align="right"][width="20%"], +table[border="2"] td[valign="top"][bgcolor="#ffffff"] table[width="138"], +table[border="0"][cellpadding="1"][cellspacing="0"][width="626"][bgcolor="#6699cc"], +table[bordercolor="red"][height="225"][cellspacing="0"][cellpadding="0"][width="190"][bgcolor="white"][border="0"], +table[width="336"][border="0"][cellspacing="0"][cellpadding="0"][align="right"][style="margin-left: 10px; margin-bottom: 10px;"], +table[width="770"][border="0"] tr[valign="top"] +td[width="160"], +td[class="cnnNavAd"], +td[class="RHBarBody"], +td[class="sl-table"], +td[style="border-bottom: 1px solid rgb(204, 204, 204); padding: 7px 3px; background-color: rgb(255, 254, 249);"], +td span[class="aoltextad"], +form[name="frmLargeForm"], +form[action*="click_lx.cgi"], +form[action^="http://rd.yahoo.com/"], +form[action=""][name$="SoapCity"], +form[action=""][name^="728x90"], +form[action=""][name^="300x250"], +form[method="get"][action*="martindale"][name="MDH"], +embed[type="application/x-shockwave-flash"][src*="_Banner"], +embed[type="application/x-shockwave-flash"][src*="/ad"], +embed[type="application/x-shockwave-flash"][href*="/ad"], +embed[type="application/x-shockwave-flash"][src*=".ad"], +embed[type="application/x-shockwave-flash"][href*=".ad"], +embed[type="application/x-shockwave-flash"][src*="?click"], +embed[type="application/x-shockwave-flash"][href*="?click"], +embed[type="application/x-shockwave-flash"][src*="/click"], +embed[type="application/x-shockwave-flash"][href*="/click"], +embed[type="application/x-shockwave-flash"][href*="promos"], +embed[type="application/x-shockwave-flash"][href*="=click"], +embed[type="application/x-shockwave-flash"][href*="redirect"], +embed[type="application/x-shockwave-flash"][href*="/A="], +embed[type="application/x-shockwave-flash"][name*="advert"], +embed[type="application/x-shockwave-flash"][name*="banner"], +embed[type="application/x-shockwave-flash"][width="728"][height="90"], +embed[type="application/x-shockwave-flash"][width="468"][height="60"], +embed[type="application/x-shockwave-flash"][width="467"][height="63"], +div[id="adstrip"], +div[id*="advert"], +div[id="dropin"], +div[id="dwindow"], +div[id="dcv_EchangeLay"], +div[id="mntl"], +div[id*="popup"], +div[id="quack"], +div[id="splashLayer"], +div[id*="sponsor"], +div[id="yschsec"], +div[class="ovt"], +div#contextualLinks, +div[style="border: 1px solid rgb(221, 221, 221); padding: 5px; background-color: rgb(255, 255, 255);"], +object[id="widgeth"], +*[class="ad"], +*[class*="eSext"], +*[name*="klipad"], +*[style*="/ads/"], +*[id*="popover_"], +*[src*="120x80"], +*[src*="140x"], +*[src*="?ad"], +*[src*="-ad-"], +*[src*="/adimage"], +*[src*="/adimg"], +*[src*="advert"], +*[src*="=click"], +*[src*="banners."], +*[src*="banner_ads"], +*[src*="/images/dinkus/more-arrow-lo.gif"], +*[src*="/javaImages/ec/"], +*[src*="/offer"], +*[src*="/puffboxes/"], +*[src*="/sponsors/"], +*[src*="_sponsor_"], +*[src*="/us.yimg.com/a/ya"], +*[src*=".adbutler.de"], +*[src*=".nedstatbasic.net"], +*[src*=".tradedoubler.com"], +*[src*=".travelocity./Sponsor_gifs/"], +*[src*="a.consumer.net"], +*[src*="bannermania.nom.pl"], +*[src*="cash4banner.com"], +*[src*="crazypopups.com"], +*[src*="hit-now.com"], +*[src*="hitbox.com"], +*[src*="img.thebugs.ws"], +*[src*="kinghost.com/ban/"], +*[src*="klipmart"], +*[src*="popupad.net/ats/"], +*[src*="public"][src*="ad"], +*[src*="/publicidad/"], +*[src*="qkimg.net"], +*[src*="qksrv.net"], +*[src*="rcm-images.amazon.com"], +*[src*="rcm.amazon.com"], +*[src*="salon.com/Creatives"], +*[src*="sexcounter."], +*[src*="sideads/"], +*[src*="statse.webtrendslive.com"], +*[href*="logging.to"], +*[href*="/referral/"], +*[href*="tryaol"], +*[href*="websponsors"], +*[src*="banman.asp"], +*[href*="banman.asp"], +*[src*="bannerman"], +*[href*="bannerman"], +*[src*="?banner"], +*[href*="?banner"], +*[src*="/banner/"], +*[href*="/banner/"], +*[src*="/jump/"], +*[href*="/jump/"], +*[src*="adfarm"], +*[href*="adfarm"], +*[src*="advertising.com"], +*[href*="advertising.com"], +*[src*="ar.atwola.com"], +*[href*="ar.atwola.com"], +*[src*="atdmt.com"], +*[href*="atdmt.com"], +*[src*="bluestreak.com"], +*[href*="bluestreak.com"], +*[src*="clickxchange.com"], +*[href*="clickxchange.com"], +*[src*="doubleclick"], +*[href*="doubleclick"], +*[src*="falkag.net"], +*[href*="falkag.net"], +*[src*="fastclick.com"], +*[href*="fastclick.com"], +*[src*="mediaplex"], +*[href*="mediaplex"], +*[src*="netdirect.nl"], +*[href*="netdirect.nl"], +*[src*="spinbox."], +*[href*="spinbox."], +*[src*="tradedoubler.com"], +*[href*="tradedoubler.com"], +*[src*="transfer.go"], +*[href*="transfer.go"], +*[src*=".tribalfusion"], +*[href*=".tribalfusion"], +*[src*="valueclick"], +*[href*="valueclick"], +*[src*="http://216.92.211.171/"], +*[href*="http://216.92.211.171/"], +*[src*="http://216.92.21.16/"], +*[href*="http://216.92.21.16/"] { + display: none /*!important*/; +} + +img[src*=".advance"], +img[src*="/click_"], +img[src*="/cnn/images/clickability/"], +img[src*="/logo2.m"], +img[src$="/banners/com000.jpg"], +a:link[href*=".add"] img, +a:link[href*="admin"] img, +a:link[href*="adobe"] img, +a:link[href*=".adp"] img, +a:link[href*="/advance"] img, +a:link[href*="click.mp3"] img, +a:link[href*="/imgres?imgurl="] img, +a:link[href*=":head"] img, +a:link[href*="http://nettracker."] img, +embed[type="application/x-shockwave-flash"][src*="gallery"] { + display: inline /*!important*/; +} diff --git a/!NetSurf/Resources/CSS,f79 b/!NetSurf/Resources/CSS,f79 index 477035276..6f89ea5c1 100644 --- a/!NetSurf/Resources/CSS,f79 +++ b/!NetSurf/Resources/CSS,f79 @@ -2,6 +2,8 @@ * This file is part of NetSurf, http://netsurf.sourceforge.net/ */ +@import url('AdBlock'); + /* Elements ordered as in the HTML 4.01 specification. */ html { display: block; } @@ -870,6 +870,69 @@ bool css_match_detail(const struct css_selector *detail, match = true; break; + case CSS_SELECTOR_ATTRIB_PRE: + /* matches if the attribute begins with a certain + * value (CSS3) */ + word = strndup(detail->data, detail->data_length); + if (!word) { + /** \todo report to user */ + return false; + } + s = (char *)xmlGetProp(element, + (const xmlChar *) word); + free(word); + if (s && strncasecmp(detail->data2, s, + detail->data2_length) == 0) + match = true; + break; + + case CSS_SELECTOR_ATTRIB_SUF: + /* matches if the attribute ends with a certain + * value (CSS3) */ + word = strndup(detail->data, detail->data_length); + if (!word) { + /** \todo report to user */ + return false; + } + s = (char *)xmlGetProp(element, + (const xmlChar *) word); + free(word); + if (!s) + break; + word = s + (strlen(s) - detail->data2_length); + if (s && strncasecmp(detail->data2, word, + detail->data2_length) == 0) + match = true; + break; + + case CSS_SELECTOR_ATTRIB_SUB: + /* matches if the attribute contains a certain + * value (CSS3) */ + word = strndup(detail->data, detail->data_length); + if (!word) { + /** \todo report to user */ + return false; + } + s = (char *)xmlGetProp(element, + (const xmlChar *) word); + free(word); + if (!s) + break; + /* case insensitive strstr follows */ + /* space -> last possible start position */ + /* word -> start of string to search */ + space = s + (strlen(s) - detail->data2_length); + word = s; + while (word <= space) { + if (strncasecmp(detail->data2, word, + detail->data2_length) == 0) { + match = true; + break; + } + word++; + } + break; + case CSS_SELECTOR_PSEUDO: break; @@ -1336,6 +1399,21 @@ void css_dump_selector(const struct css_selector *r) m->data_length, m->data, m->data2_length, m->data2); break; + case CSS_SELECTOR_ATTRIB_PRE: + fprintf(stderr, "[%.*s^=%.*s]", + m->data_length, m->data, + m->data2_length, m->data2); + break; + case CSS_SELECTOR_ATTRIB_SUF: + fprintf(stderr, "[%.*s$=%.*s]", + m->data_length, m->data, + m->data2_length, m->data2); + break; + case CSS_SELECTOR_ATTRIB_SUB: + fprintf(stderr, "[%.*s*=%.*s]", + m->data_length, m->data, + m->data2_length, m->data2); + break; case CSS_SELECTOR_PSEUDO: fprintf(stderr, ":%.*s", m->data_length, m->data); @@ -222,6 +222,9 @@ typedef enum { CSS_SELECTOR_ATTRIB_EQ, CSS_SELECTOR_ATTRIB_INC, CSS_SELECTOR_ATTRIB_DM, + CSS_SELECTOR_ATTRIB_PRE, + CSS_SELECTOR_ATTRIB_SUF, + CSS_SELECTOR_ATTRIB_SUB, CSS_SELECTOR_PSEUDO, } css_selector_type; @@ -263,6 +266,9 @@ typedef enum { CSS_NODE_INCLUDES, CSS_NODE_FUNCTION, CSS_NODE_DASHMATCH, + CSS_NODE_PREFIX, + CSS_NODE_SUFFIX, + CSS_NODE_SUBSTR, CSS_NODE_COLON, CSS_NODE_COMMA, CSS_NODE_DOT, diff --git a/css/parser.y b/css/parser.y index 1dd567ff1..f043ef823 100644 --- a/css/parser.y +++ b/css/parser.y @@ -185,6 +185,36 @@ detail(A) ::= LBRAC IDENT(B) DASHMATCH STRING(C) RBRAC. if (A) { A->data2 = C.text + 1; A->data2_length = C.length - 2; A->specificity = 0x100; } else param->memory_error = true; } +detail(A) ::= LBRAC IDENT(B) PREFIX IDENT(C) RBRAC. + { A = css_new_selector(CSS_SELECTOR_ATTRIB_PRE, B.text, B.length); + if (A) { A->data2 = C.text; A->data2_length = C.length; + A->specificity = 0x100; } + else param->memory_error = true; } +detail(A) ::= LBRAC IDENT(B) PREFIX STRING(C) RBRAC. + { A = css_new_selector(CSS_SELECTOR_ATTRIB_PRE, B.text, B.length); + if (A) { A->data2 = C.text + 1; A->data2_length = C.length - 2; + A->specificity = 0x100; } + else param->memory_error = true; } +detail(A) ::= LBRAC IDENT(B) SUFFIX IDENT(C) RBRAC. + { A = css_new_selector(CSS_SELECTOR_ATTRIB_SUF, B.text, B.length); + if (A) { A->data2 = C.text; A->data2_length = C.length; + A->specificity = 0x100; } + else param->memory_error = true; } +detail(A) ::= LBRAC IDENT(B) SUFFIX STRING(C) RBRAC. + { A = css_new_selector(CSS_SELECTOR_ATTRIB_SUF, B.text, B.length); + if (A) { A->data2 = C.text + 1; A->data2_length = C.length - 2; + A->specificity = 0x100; } + else param->memory_error = true; } +detail(A) ::= LBRAC IDENT(B) SUBSTR IDENT(C) RBRAC. + { A = css_new_selector(CSS_SELECTOR_ATTRIB_SUB, B.text, B.length); + if (A) { A->data2 = C.text; A->data2_length = C.length; + A->specificity = 0x100; } + else param->memory_error = true; } +detail(A) ::= LBRAC IDENT(B) SUBSTR STRING(C) RBRAC. + { A = css_new_selector(CSS_SELECTOR_ATTRIB_SUB, B.text, B.length); + if (A) { A->data2 = C.text + 1; A->data2_length = C.length - 2; + A->specificity = 0x100; } + else param->memory_error = true; } detail(A) ::= COLON IDENT(B). { if (B.length == 4 && strncasecmp(B.text, "link", 4) == 0) { A = css_new_selector(CSS_SELECTOR_ATTRIB, "href", 4); @@ -297,6 +327,18 @@ any(A) ::= DASHMATCH. { A = css_new_node(param->stylesheet, CSS_NODE_DASHMATCH, 0, 0); if (!A) param->memory_error = true; } +any(A) ::= PREFIX. + { A = css_new_node(param->stylesheet, CSS_NODE_PREFIX, + 0, 0); + if (!A) param->memory_error = true; } +any(A) ::= SUFFIX. + { A = css_new_node(param->stylesheet, CSS_NODE_SUFFIX, + 0, 0); + if (!A) param->memory_error = true; } +any(A) ::= SUBSTR. + { A = css_new_node(param->stylesheet, CSS_NODE_SUBSTR, + 0, 0); + if (!A) param->memory_error = true; } any(A) ::= COLON. { A = css_new_node(param->stylesheet, CSS_NODE_COLON, 0, 0); if (!A) param->memory_error = true; } diff --git a/css/scanner.l b/css/scanner.l index 36347b3a8..708a9ebe8 100644 --- a/css/scanner.l +++ b/css/scanner.l @@ -86,6 +86,9 @@ ident "(" { return FUNCTION; } "=" { return EQUALS; } "~=" { return INCLUDES; } "|=" { return DASHMATCH; } +"^=" { return PREFIX; } +"$=" { return SUFFIX; } +"*=" { return SUBSTR; } ":" { return COLON; } "," { return COMMA; } "+" { return PLUS; } |