Hatena::Groupkeysnail

きすねた(ん)

2010-11-25

選択範囲に含まれるリンクのアドレスをコピー

| 17:28 | 選択範囲に含まれるリンクのアドレスをコピー - きすねた(ん) を含むブックマーク はてなブックマーク - 選択範囲に含まれるリンクのアドレスをコピー - きすねた(ん)

必要に迫られて書いた.

ext.add("copy-selected-links", function () {
    function getRanges(selection) {
        let ranges = [];

        for (let i = 0, rc = selection.rangeCount; i < rc; ++i)
            ranges.push(selection.getRangeAt(i));

        return ranges;
    }

    function getLinks(range) {
        let container = range.commonAncestorContainer;

        return Array.slice(container.querySelectorAll("a[href]"));
    }

    function unique(array) {
        let hash = {__proto__:null};
        
        for (let [, v] in Iterator(array))
            hash[v] = true;

        return [v for ([v] in Iterator(hash))];
    }

    let selection = content.getSelection();
    let links = getRanges(selection)
        .map(getLinks)
        .reduce(function (l, c) l.concat(c))
        .map(function (a) a.href);

    command.setClipboardText(unique(links).join("\n"));
});

a.href とすると絶対パスが返ってきて, a.getAttribute("href") とすると相対パスが返ってくるような雰囲気だった.