Commit 3928f385c6ff
Changed files (1)
tools
readwise-reader
tools/readwise-reader/readwise-reader.py
@@ -756,10 +756,6 @@ def _doc_html(d):
f'</div>'
f'<div class="doc-meta"><span class="loc {lc}">{loc}</span> {src} ยท {rt} ยท {age_label(age)} ago {th}</div></div>'
f'<div class="doc-right">'
- f'<div class="doc-actions">'
- f'<button class="act-btn act-archive" onclick="actOnDoc(\'{doc_id}\',\'archive\',this)" title="Archive">๐ฆ</button>'
- f'<button class="act-btn act-delete" onclick="actOnDoc(\'{doc_id}\',\'delete\',this)" title="Delete">๐๏ธ</button>'
- f'</div>'
f'{"<a href=" + chr(34) + sl + chr(34) + " target=" + chr(34) + "_blank" + chr(34) + ">โ</a>" if source_url else ""}'
f'</div></li>'
)
@@ -820,7 +816,7 @@ body{{font-family:'Inter',-apple-system,system-ui,sans-serif;background:var(--bg
.cluster-hdr h3{{font-size:.95rem}}.cnt{{background:rgba(255,255,255,.08);padding:.15rem .5rem;border-radius:10px;font-size:.78rem}}
.cluster-insights{{padding:.5rem 1rem;font-size:.8rem;color:var(--dim);border-top:1px solid rgba(255,255,255,.04)}}
.doc-list{{list-style:none}}.doc{{padding:.5rem 1rem;border-top:1px solid rgba(255,255,255,.04);display:grid;grid-template-columns:2.8rem 2.5rem 1fr auto;gap:.6rem;align-items:center;transition:background .1s}}
-.doc:hover{{background:rgba(255,255,255,.03)}}.doc.acted{{opacity:.3;text-decoration:line-through}}
+.doc:hover{{background:rgba(255,255,255,.03)}}
.doc-rel{{text-align:center;font-weight:700;font-size:.9rem}}
.doc-prog{{text-align:center;font-size:.75rem}}.doc-prog .bar{{width:2.2rem;height:3px;background:rgba(255,255,255,.1);border-radius:2px;margin:2px auto 0;overflow:hidden}}
.doc-prog .fill{{height:100%;border-radius:2px}}
@@ -833,10 +829,7 @@ body{{font-family:'Inter',-apple-system,system-ui,sans-serif;background:var(--bg
.doc-summary .full.open{{display:block}}
.doc-summary .reason{{font-size:.72rem;color:var(--accent);margin-top:.2rem;font-style:italic}}
.doc-right{{text-align:right;font-size:.73rem;white-space:nowrap;display:flex;flex-direction:column;align-items:flex-end;gap:.3rem}}.doc-right a{{color:var(--link)}}
-.doc-actions{{display:flex;gap:.2rem}}
-.act-btn{{background:none;border:1px solid rgba(255,255,255,.1);border-radius:4px;cursor:pointer;font-size:.7rem;padding:.1rem .3rem;opacity:.4;transition:opacity .15s}}
-.act-btn:hover{{opacity:1}}.act-archive:hover{{border-color:var(--accent)}}.act-delete:hover{{border-color:var(--red)}}
-.act-btn.done{{opacity:.2;pointer-events:none}}
+
.tag{{display:inline-block;padding:.05rem .35rem;border-radius:6px;font-size:.65rem;margin-right:.15rem;background:rgba(255,255,255,.06)}}
.loc{{display:inline-block;padding:.05rem .3rem;border-radius:6px;font-size:.65rem;font-weight:600}}
.loc-new{{background:#14532d;color:#86efac}}.loc-later{{background:#1e3a5f;color:#93c5fd}}
@@ -844,8 +837,7 @@ body{{font-family:'Inter',-apple-system,system-ui,sans-serif;background:var(--bg
.filter-bar{{background:var(--surface);padding:.8rem 1rem;border-radius:8px;margin:1rem 0;display:flex;gap:.5rem;flex-wrap:wrap;align-items:center}}
.filter-bar label{{font-size:.8rem;color:var(--dim)}}
.filter-bar select,.filter-bar input{{background:var(--surface2);color:var(--text);border:1px solid rgba(255,255,255,.1);border-radius:6px;padding:.3rem .6rem;font-size:.8rem}}
-.toast{{position:fixed;bottom:1rem;right:1rem;background:var(--surface);border:1px solid rgba(255,255,255,.1);border-radius:8px;padding:.6rem 1rem;font-size:.85rem;display:none;z-index:999;box-shadow:0 4px 12px rgba(0,0,0,.4)}}
-.toast.show{{display:block}}
+
@media(max-width:768px){{.doc{{grid-template-columns:2rem 2rem 1fr}}.doc-right{{display:none}}.stats{{gap:.5rem}}.stat{{padding:.4rem .8rem;min-width:70px}}.stat .n{{font-size:1.2rem}}}}
</style></head><body>
<div class="header"><h1>๐ Readwise Reader Triage</h1>
@@ -857,37 +849,14 @@ body{{font-family:'Inter',-apple-system,system-ui,sans-serif;background:var(--bg
<input type="text" id="search" placeholder="Search titles/summaries..." oninput="filterDocs()">
<select id="relFilter" onchange="filterDocs()"><option value="">All relevance</option><option value="5">5โ
</option><option value="4">4โ
+</option><option value="3">3โ
+</option></select>
<select id="tagFilter" onchange="filterDocs()"><option value="">All tags</option>{tag_opts}</select></div>
-<div id="toast" class="toast"></div>"""
+"""
def _report_foot():
return """<script>
function toggle(el){const b=el.parentElement.querySelector('.group-body,.doc-list');if(!b)return;const a=el.querySelector('.arrow');if(b.style.display==='none'){b.style.display='';a?.classList.remove('shut')}else{b.style.display='none';a?.classList.add('shut')}}
function filterDocs(){const q=document.getElementById('search').value.toLowerCase();const r=document.getElementById('relFilter').value;const t=document.getElementById('tagFilter').value;document.querySelectorAll('.doc').forEach(el=>{const title=(el.dataset.title||'');const summary=(el.querySelector('.doc-summary')?.textContent||'').toLowerCase();const rv=parseInt(el.dataset.rel||'3');const tags=el.dataset.tags||'';let s=true;if(q&&!title.includes(q)&&!summary.includes(q))s=false;if(r&&rv<parseInt(r))s=false;if(t&&!tags.includes(t))s=false;el.style.display=s?'':'none'})}
-function showToast(msg,ms){const t=document.getElementById('toast');t.textContent=msg;t.classList.add('show');setTimeout(()=>t.classList.remove('show'),ms||3000)}
-// Readwise API token โ prompted once, stored in sessionStorage
-function getToken(){let t=sessionStorage.getItem('rw_token');if(t)return Promise.resolve(t);return new Promise(resolve=>{t=prompt('Enter your Readwise access token (from readwise.io/access_token):');if(t){sessionStorage.setItem('rw_token',t);resolve(t)}else{resolve(null)}})}
-
-async function actOnDoc(id,action,btn){
- const token=await getToken();
- if(!token){showToast('No token provided');return}
- const row=btn.closest('.doc');
- try{
- if(action==='archive'){
- const r=await fetch('https://readwise.io/api/v3/update/'+id+'/',{method:'PATCH',headers:{'Authorization':'Token '+token,'Content-Type':'application/json'},body:JSON.stringify({location:'archive'})});
- if(!r.ok)throw new Error(r.status);
- row.classList.add('acted');btn.classList.add('done');
- showToast('๐ฆ Archived');
- }else if(action==='delete'){
- if(!confirm('Delete this document permanently?'))return;
- const r=await fetch('https://readwise.io/api/v3/delete/'+id+'/',{method:'DELETE',headers:{'Authorization':'Token '+token}});
- if(r.status!==204)throw new Error(r.status);
- row.classList.add('acted');btn.classList.add('done');
- showToast('๐๏ธ Deleted');
- }
- }catch(e){showToast('โ Failed: '+e.message,5000)}
-}
</script></div></body></html>"""