<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel rdf:about="https://let.hatelabo.jp/Cside/rss">
    <link>https://let.hatelabo.jp/Cside/rss</link>
    <description></description>
    <title>Bookmarklets from Cside</title>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://let.hatelabo.jp/Cside/let/kNiR2viWgKAA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/Cside/let/hJmcraiDtawx"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/Cside/let/hJmeqf-l8540"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/Cside/let/gYC-xb6M8riYeg"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/Cside/let/gYC-xbzs8Pn0UQ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/Cside/let/gYC-y4iC-sPdeA"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/Cside/let/gYC-x4iA5e-LNg"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/Cside/let/gYC-x4iAn4egWQ"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/Cside/let/gYC-y4TUkoy8KA"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://let.hatelabo.jp/Cside/let/kNiR2viWgKAA">
    <link>https://let.hatelabo.jp/Cside/let/kNiR2viWgKAA</link>
    <dc:date>2024-02-04T03:45:08Z</dc:date>
    <description>正規表現で OR 検索したやつを別々の色でハイライト</description>
    <dc:creator>Cside</dc:creator>
    <title>[Let] 正規表現で OR 検索したやつを別々の色でハイライト</title>
    <content:encoded>&lt;a href="javascript:const%20REGEXP%3Dnew%20RegExp%28prompt%28%27RegExp%27%29%2C%27ig%27%29%3Bconst%20getAllTextNodes%3Dcb%3D%3E%7Bconst%20walker%3Ddocument.createTreeWalker%28document.body%2CNodeFilter.SHOW_TEXT%2Cnull%2Cfalse%29%3Blet%20node%3Bwhile%28node%3Dwalker.nextNode%28%29%29%7Bif%28node.textContent.trim%28%29%21%3D%3D%27%27%29cb%28node%29%7D%7D%3Bconst%20createElementFromString%3DhtmlString%3D%3E%7Bconst%20div%3Ddocument.createElement%28%27div%27%29%3Bdiv.innerHTML%3DhtmlString%3Breturn%20div.firstChild%7D%3Bconst%20colors%3D%5B%27yellow%27%2C%27yellowgreen%27%2C%27pink%27%2C%27orange%27%5D%3Bconst%20matched%3Dnew%20Map%3Blet%20lastIndex%3D-1%3BgetAllTextNodes%28%28node%3D%3E%7Bconst%20innerHTML%3Dnode.textContent.replace%28REGEXP%2C%28str%3D%3E%7Bconst%20key%3Dstr.toLowerCase%28%29%3Bif%28matched.has%28key%29%29%7Bconst%20color%3Dmatched.get%28key%29%3Breturn%60%3Cspan%20style%3D%22padding%3A%201px%3B%20color%3A%20black%3B%20background-color%3A%20%24%7Bcolor%7D%3B%22%3E%24%7Bstr%7D%3C%2Fspan%3E%60%7Dconst%20nextColor%3Dcolors%5B%2B%2BlastIndex%5D%3Bmatched.set%28key%2CnextColor%29%3Breturn%60%3Cspan%20style%3D%22padding%3A%201px%3B%20color%3A%20black%3B%20background-color%3A%20%24%7BnextColor%7D%3B%22%3E%24%7Bstr%7D%3C%2Fspan%3E%60%7D%29%29%3Bconst%20replacementNode%3Ddocument.createElement%28%27span%27%29%3BreplacementNode.innerHTML%3DinnerHTML%3Bnode.parentNode.insertBefore%28replacementNode%2Cnode%29%3BsetTimeout%28%28%28%29%3D%3Enode.parentNode.removeChild%28node%29%29%29%7D%29%29%3B"&gt;正規表現で OR 検索したやつを別々の色でハイライト&lt;/a&gt;&lt;pre&gt;/*
 * @title 正規表現で OR 検索したやつを別々の色でハイライト
 * @description 正規表現で OR 検索したやつを別々の色でハイライト
 * @license MIT License
 * @javascript_url
 */

const REGEXP = new RegExp(prompt('RegExp'), 'ig')

const getAllTextNodes = (cb) =&amp;gt; {
  const walker = document.createTreeWalker(
    document.body,
    NodeFilter.SHOW_TEXT, // テキストノードだけを考慮
    null,
    false
  );
  let node;
  while ((node = walker.nextNode())) {
    if (node.textContent.trim() !== '')
      cb(node)
  }
};

const createElementFromString = (htmlString) =&amp;gt; {
  const div = document.createElement('div');
  div.innerHTML = htmlString;
  return div.firstChild;
};

const colors = ['yellow', 'yellowgreen', 'pink', 'orange', ];
const matched = new Map();

let lastIndex = -1;
getAllTextNodes((node) =&amp;gt; {
  const innerHTML = node.textContent.replace(REGEXP, (str) =&amp;gt; {
    const key = str.toLowerCase()
    if (matched.has(key)) {
      const color = matched.get(key);
      return `&amp;lt;span style=&amp;quot;padding: 1px; color: black; background-color: ${color};&amp;quot;&amp;gt;${str}&amp;lt;/span&amp;gt;`
    }
    const nextColor = colors[++lastIndex];
    matched.set(key, nextColor);
    return `&amp;lt;span style=&amp;quot;padding: 1px; color: black; background-color: ${nextColor};&amp;quot;&amp;gt;${str}&amp;lt;/span&amp;gt;`;
  });

  const replacementNode = document.createElement('span');
  replacementNode.innerHTML = innerHTML;
  node.parentNode.insertBefore(replacementNode, node);
  setTimeout(() =&amp;gt; node.parentNode.removeChild(node)); // 非同期じゃないと何故かエラーに...
});&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/Cside/let/hJmcraiDtawx">
    <link>https://let.hatelabo.jp/Cside/let/hJmcraiDtawx</link>
    <dc:date>2018-02-06T09:45:36Z</dc:date>
    <description>Github の /files ページで Go のテストファイルを折りたたむ</description>
    <dc:creator>Cside</dc:creator>
    <title>[Let] Collapse Go Tests</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2FCside%2Flet%2FhJmcraiDtawx.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;Collapse Go Tests&lt;/a&gt;&lt;pre&gt;/*
 * @title Collapse Go Tests
 * @description Github の /files ページで Go のテストファイルを折りたたむ
 * @include http://*
 * @license MIT License
 */

document.querySelectorAll('.file-header').forEach((header) =&amp;gt; {
  name = header.querySelector('.file-info a').innerText;
  if (!/_test.go$/.test(name)) return;
  button = header.querySelector('button.js-details-target');
  button.click();
});&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/Cside/let/hJmeqf-l8540">
    <link>https://let.hatelabo.jp/Cside/let/hJmeqf-l8540</link>
    <dc:date>2016-12-30T13:41:38Z</dc:date>
    <description>開いてるページのはてブページを開く</description>
    <dc:creator>Cside</dc:creator>
    <title>[Let] 開いてるページのはてブページを開く</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2FCside%2Flet%2FhJmeqf-l8540.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;開いてるページのはてブページを開く&lt;/a&gt;&lt;pre&gt;/*
 * @title 開いてるページのはてブページを開く
 * @description 開いてるページのはてブページを開く
 * @include http://*
 * @license MIT License
 * @require 
 */


(function(){
  location.href = 'http://b.hatena.ne.jp/entry/' + location.href;
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/Cside/let/gYC-xb6M8riYeg">
    <link>https://let.hatelabo.jp/Cside/let/gYC-xb6M8riYeg</link>
    <dc:date>2012-03-08T05:48:05Z</dc:date>
    <description>選択範囲を取得</description>
    <dc:creator>Cside</dc:creator>
    <title>[Let] 選択範囲を取得</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2FCside%2Flet%2FgYC-xb6M8riYeg.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;選択範囲を取得&lt;/a&gt;&lt;pre&gt;/*
 * @title 選択範囲を取得
 * @description  選択範囲を取得
 * @include http://*
 * @license MIT License

*/

(function(){
  var selection
      = window.getSelection   ? window.getSelection()
      : document.getSelection ? document.getSelection()
      : document.selection    ? document.selection.createRange().text
      :                         0
      ;
  console.log(encodeURIComponent(selection));
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/Cside/let/gYC-xbzs8Pn0UQ">
    <link>https://let.hatelabo.jp/Cside/let/gYC-xbzs8Pn0UQ</link>
    <dc:date>2012-03-06T07:02:25Z</dc:date>
    <description></description>
    <dc:creator>Cside</dc:creator>
    <title>[Let] </title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2FCside%2Flet%2FgYC-xbzs8Pn0UQ.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;bookmarklet&lt;/a&gt;&lt;pre&gt;// ==UserScript==
// @name           YouTubeのビデオIDをローカルサーバーに送る
// @namespace      youtube-videoid
// @include        http://www.youtube.com/*
// @require        http://stevenlevithan.com/demo/parseuri/js/assets/parseuri.js
// ==/UserScript==

var videoId = parseUri(location.href).queryKey.v;
var img = document.createElement('img');
img.setAttribute('src', 'http://localhost:6789?video_id=' + videoId);
document.body.appendChild('img');&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/Cside/let/gYC-y4iC-sPdeA">
    <link>https://let.hatelabo.jp/Cside/let/gYC-y4iC-sPdeA</link>
    <dc:date>2010-11-12T13:04:50Z</dc:date>
    <description>タグと下限ブクマ数を指定してエントリ一覧を表示</description>
    <dc:creator>Cside</dc:creator>
    <title>[Let] Tag-and-Threshold</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2FCside%2Flet%2FgYC-y4iC-sPdeA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;Tag-and-Threshold&lt;/a&gt;&lt;pre&gt;/*
 * @title Tag-and-Threshold
 * @description タグと下限ブクマ数を指定してエントリ一覧を表示
 * @include http://*
 * @license MIT License
 * @require 
 */

(function() {
    var tag = prompt(&amp;quot;タグ：&amp;quot;);
    var thr = prompt(&amp;quot;下限ブクマ数：&amp;quot;);
    window.open(&amp;quot;http://b.hatena.ne.jp/t/&amp;quot; + encodeURIComponent(tag) + &amp;quot;?sort=hot&amp;amp;threshold=&amp;quot; + thr);
})();

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/Cside/let/gYC-x4iA5e-LNg">
    <link>https://let.hatelabo.jp/Cside/let/gYC-x4iA5e-LNg</link>
    <dc:date>2010-11-12T12:59:05Z</dc:date>
    <description>今見ているページの人気エントリをブクマ数の下限を設定して表示</description>
    <dc:creator>Cside</dc:creator>
    <title>[Let] Threshold</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2FCside%2Flet%2FgYC-x4iA5e-LNg.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;Threshold&lt;/a&gt;&lt;pre&gt;/*
 * @title Threshold
 * @description 今見ているページの人気エントリをブクマ数の下限を設定して表示
 * @include http://*
 * @license MIT License
 * @require 
 */

(function() {
    var thr = prompt(&amp;quot;下限ブクマ数：&amp;quot;);
    window.open(&amp;quot;http://b.hatena.ne.jp/entrylist?sort=hot&amp;amp;threshold=&amp;quot; + thr + &amp;quot;&amp;amp;url=&amp;quot; + location.href);
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/Cside/let/gYC-x4iAn4egWQ">
    <link>https://let.hatelabo.jp/Cside/let/gYC-x4iAn4egWQ</link>
    <dc:date>2010-11-12T12:21:10Z</dc:date>
    <description>今見ているページの人気エントリを表示するブックマークレット。トップページで実行してください。</description>
    <dc:creator>Cside</dc:creator>
    <title>[Let] Sort-Count</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2FCside%2Flet%2FgYC-x4iAn4egWQ.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;Sort-Count&lt;/a&gt;&lt;pre&gt;/*
 * @title Sort-Count
 * @description 今見ているページの人気エントリを表示するブックマークレット。トップページで実行してください。
 * @include http://*
 * @license MIT License
 * @require 
 */

(function() {
    window.open('http://b.hatena.ne.jp/entrylist?sort=count&amp;amp;url='+location.href);
})();&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/Cside/let/gYC-y4TUkoy8KA">
    <link>https://let.hatelabo.jp/Cside/let/gYC-y4TUkoy8KA</link>
    <dc:date>2010-11-07T07:34:48Z</dc:date>
    <description>my bookmarklet</description>
    <dc:creator>Cside</dc:creator>
    <title>[Let] 現在閲覧しているページのタイトルとURLをalert</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2FCside%2Flet%2FgYC-y4TUkoy8KA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;現在閲覧しているページのタイトルとURLをalert&lt;/a&gt;&lt;pre&gt;/*
 * @title    現在閲覧しているページのタイトルとURLをalert
 * @description my bookmarklet
 * @include http://*
 * @license MIT License
 * @require 
 */

(function() {
    alert(document.getElementsByTagName('title')[0].innerText + ' -  ' + location.href);
})();&lt;/pre&gt;</content:encoded>
  </item>
</rdf:RDF>
