Subscribed unsubscribe Subscribe Subscribe

枕を欹てて聴く

香炉峰の雪は簾を撥げて看る

XPathで配列にしてしまったあとから特定要素を削除する。

LDR は、アイテムを繰るのの基準としてH2要素を使っている。本来RSSしか読まないんだからそれで大丈夫なんだけど、LDR Full Feedとかで要素を付け足すと、H2があると、意味もないところでとまってしまう。
そこで今までは、HTMLDocumentにする前に、正規表現で、

// drryさんがGR Full Feedで作成なさったものです。ものすごくきれいな正規表現。
if (REMOVE_SCRIPT) text = text.replace(/<script(?:\s[^>]+?)?>[\S\s]*?<\/script\s*>/gi, "");
if (REMOVE_H2TAG)  text = text.replace(/<h2(?:\s[^>]+?)?>[\S\s]*?<\/h2\s*>/gi, "");

ってやってたんです。
が、これによるREMOVEをtrueしていると

IDEA * IDEA
url ^http://www\.ideaxidea\.com/
xpath //div[@class="entry"]/h2/following-sibling::*
priority 100

のようなH2基準でXPathによる切り出しを行うことができなくなってしまいます。
そこで、XPathによる要素切り出しの後にDOM操作で取り除こうとすると、

element.parentNode.removeChild(element);

とする必要があるのですが、帰ってきているのは配列なので、

[script, h2]

なんてものだと、parentNodeなんてないよって言われるんですね。これが困ったので、配列からspliceしてやろうとしたのですがそれだとindexが狂ってしまい失敗します。
そのときにid:brazilさんのLDR Prefavの

// copied from LDR-Prefav (c) id:brazil
function filter(a, f) {
	for (var i = a.length; i --> 0; f(a[i]) || a.splice(i, 1));
}

これを思い出したんで少し感動したんですが、これって結構有名なことなんでしょうか。
そこで、こんなの作ってみたのですが、なんかまずいところがあるかもしれないので、あったら指摘していただけるとありがたいです。

// $X関数はid:cho45さんのものです。

window.FullFeed.addFilter(function(nodes, url){
  filter(nodes, function(e){
    var n = e.nodeName;
    if(REMOVE_SCRIPT && n.indexOf('SCRIPT') == 0) return false;
    if(REMOVE_H2TAG && n.indexOf('H2') == 0) return false;
    // iframeはどうも要素を作成した時点で読みにいくようなので、textから正規表現で削除
    // なので、SITEINFOはIFRAMEを基準に作成しないでいただけるとありがたい。
    // if(REMOVE_IFRAME && n.indexOf('IFRAME') == 0) return false;
    return true;
  });
  nodes.forEach(function(e){
    // $X('descendant::*[self::script or self::h2 or self::iframe]', e)
    $X('descendant::*[self::script or self::h2]', e)
    .forEach(function(i){
      i.parentNode.removeChild(i);
    });
  });
});
// copied from LDR-Prefav (c) id:brazil
function filter(a, f) {
	for (var i = a.length; i --> 0; f(a[i]) || a.splice(i, 1));
}