Cosense をブックマーク的に使うためのブックマークレット
任意のページで実行すると、そのページのブックマーク的なページを Cosense に生成するブックマークレット
GeminiGemini.icon に作ってもらった
先頭にある const PROJECT_NAME='ここに Cosense のプロジェクトID を指定する'; を適宜修正する
code:js
javascript:(function(){const PROJECT_NAME='ここに Cosense のプロジェクトID を指定する';const BASE_TAG='#ブックマーク';const YT_TAG='#YouTube';const X_TAG='#Twitter';const DESC_LIMIT=500;const getMeta=q=>document.querySelector(q)?.content?.trim()||'';const isYT=location.host.includes('youtube.com')||location.host.includes('youtu.be');const isX=location.host.includes('x.com')||location.host.includes('twitter.com');const title=window.prompt('Scrap to Scrapbox',document.title);if(!title)return;const sel=window.getSelection().toString().trim();const meta={desc:getMeta('metaname="description"')||getMeta('metaproperty="og:description"'),site:getMeta('metaproperty="og:site_name"'),img:getMeta('metaproperty="og:image"')||getMeta('metaname="twitter:image"')};const getXContent=()=>{const textEl=document.querySelector('article divdata-testid="tweetText"');const imgs=Array.from(new Set(Array.from(document.querySelectorAll('article imgsrc*="pbs.twimg.com/media/"')).map(img=>img.src.replace(/&name=\w+/g,'')+'&name=orig')));return{text:textEl?textEl.innerText:'',imgs:imgs.map(src=>%60${src}#.jpg%60)};};const xData=isX?getXContent():{text:'',imgs:[]};const tags=BASE_TAG,isYT?YT_TAG:'',isX?X_TAG:''.filter(v=>v).join(' ');const lines=['',...(isX?[location.href,...(xData.text?'',...xData.text.split('\n').map(l=>%60 > ${l}%60):[]),'',...xData.imgs]:isYT?location.href:meta.img?[%60${meta.img} ${location.href}%60]:[%60${location.href} ${document.title}%60]),...(meta.site&&!isX?[%60site: ${meta.site}%60]:[]),...(meta.desc&&!isX?%60%60,...meta.desc.substring(0,DESC_LIMIT).split('\n').map(l=>%60 > ${l}%60):[]),...(sel?%60%60,...sel.split('\n').map(l=>%60 > ${l}%60):[]),'',tags];const body=encodeURIComponent(lines.join('\n'));window.open(%60https://scrapbox.io/${PROJECT_NAME}/${encodeURIComponent(title.trim())}?body=${body}%60)})();