Skip to content
Snippets Groups Projects
Verified Commit ee198072 authored by MickGe's avatar MickGe :tiger2:
Browse files

build

parent a4ef0388
Branches dev
No related tags found
No related merge requests found
:root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:dark;color:#ffffffde;background-color:#000;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%}*{box-sizing:border-box}a{font-weight:500;color:#9ec5e8;text-decoration:inherit}a:hover{color:#5ea0da}body{margin:0;min-height:100vh}h1{font-size:2em;line-height:1.1;margin:2rem auto;padding-bottom:1rem;text-align:center;position:sticky;top:0;background-color:#000;box-shadow:#000 0 20px 20px}h1 em{opacity:50%}#bm_nb{margin-right:1rem;font-size:95%}#app,.presentation{max-width:920px;margin:0 auto;text-align:center;padding:2rem}.presentation{padding:0 2rem;text-align:start}.presentation .logo{max-width:1em}button{border-radius:8px;border:solid #827d7d 1px;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;min-height:2.5rem;cursor:pointer;transition:all .2s .1s ease-out}button:hover{transform:translate(2px,-2px) scale(1.05);box-shadow:#000 -3px 3px 3px,#fff -3px 3px 4px 1px}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}.actionbar button{margin:0 1em}.news-feed-el{display:flex;flex-direction:column;position:relative}.news-feed-el.reverse{flex-direction:column-reverse}.toot{width:100%;padding:1em;margin:1.2em auto;border:solid #827d7d 1px;border-radius:8px;background:#242424;position:relative;z-index:20;overflow:hidden;text-overflow:ellipsis;max-height:1000vh;transition:opacity 1s .2s ease-in-out,max-height 1.5s .1s ease-out,padding 1s .8s ease-in-out,margin 1s .8s ease-in-out}.toot .banner{display:flex;align-items:center;flex-direction:row;justify-content:space-between}.toot .banner button.unbookmark{background-color:#6c0a0a}.toot-content{text-align:start}.toot .attachments{display:flex;overflow:scroll;align-items:center;column-gap:1em}.toot .attachments img{max-width:380px;max-height:380px;margin:auto;border-radius:4px}.toot .account{display:flex;flex-direction:row;justify-content:start;align-items:center}.toot .account-avatar{width:46px;height:46px;border-radius:4px;overflow:hidden;margin-right:1em}.toot .account-avatar img{width:100%;height:100;object-fit:cover}.toot.disappeared{opacity:0;max-height:0;padding:0 1em;margin:0 auto}.date-modified{font-size:small;font-style:italic;text-align:end}
:root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:dark;color:#ffffffde;background-color:#000;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%}*{box-sizing:border-box}a{font-weight:500;color:#9ec5e8;text-decoration:inherit}a:hover{color:#5ea0da}body{margin:0;min-height:100vh}h1{font-size:2em;line-height:1.1;margin:2rem auto;padding:1rem 0;text-align:center;position:sticky;top:0;background-color:#000;box-shadow:#000 0 20px 20px;z-index:1}h1 em{opacity:50%}#bm_nb{margin-right:1rem;font-size:95%}#app,.presentation{max-width:920px;margin:0 auto;text-align:center;padding:2rem}.presentation{padding:0 2rem;text-align:start}.presentation .logo{max-width:1em}button{border-radius:8px;border:solid #827d7d 1px;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;min-height:2.5rem;cursor:pointer;transition:all .2s .1s ease-out}button:hover{transform:translate(2px,-2px) scale(1.05);box-shadow:#000 -3px 3px 3px,#fff -3px 3px 4px 1px}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}.actionbar button{margin:0 1em}.news-feed-el{display:flex;flex-direction:column;position:relative;z-index:20}.news-feed-el.reverse{flex-direction:column-reverse}.toot{width:100%;padding:1em;margin:1.2em auto;border:solid #827d7d 1px;border-radius:8px;background:#242424;position:relative;overflow:hidden;text-overflow:ellipsis;max-height:1000vh;transition:opacity 1s .2s ease-in-out,max-height 1.5s .1s ease-out,padding 1s .8s ease-in-out,margin 1s .8s ease-in-out}.toot .banner{display:flex;align-items:center;flex-direction:row;justify-content:space-between}.toot .banner button.unbookmark{background-color:#6c0a0a}.toot-content{text-align:start}.toot .attachments{display:flex;overflow:scroll;align-items:center;column-gap:1em}.toot .attachments img,.toot .attachments video,.toot .attachments audio{max-width:380px;max-height:380px;margin:auto;border-radius:4px}.toot .account{display:flex;flex-direction:row;justify-content:start;align-items:center}.toot .account-avatar{width:46px;height:46px;border-radius:4px;overflow:hidden;margin-right:1em}.toot .account-avatar img{width:100%;height:100;object-fit:cover}.toot.disappeared{opacity:0;max-height:0;padding:0 1em;margin:0 auto}.date-modified{font-size:small;font-style:italic;text-align:end}
(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const t of document.querySelectorAll('link[rel="modulepreload"]'))r(t);new MutationObserver(t=>{for(const n of t)if(n.type==="childList")for(const s of n.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function i(t){const n={};return t.integrity&&(n.integrity=t.integrity),t.referrerPolicy&&(n.referrerPolicy=t.referrerPolicy),t.crossOrigin==="use-credentials"?n.credentials="include":t.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function r(t){if(t.ep)return;t.ep=!0;const n=i(t);fetch(t.href,n)}})();const m=document.createElement("div");m.classList.add("news-feed-el");const L=async(e,a)=>await fetch(e,{mode:"cors",headers:{Authorization:`Bearer ${a}`}}).then(r=>r.json().then(t=>{const n=r.headers.get("link").split(",").map(s=>s.match(/&m(ax|in)_id=\d+/g));return[t,...n]}),r=>{console.error(r)}),w=async(e,a,i,r)=>{const t=`${e}api/v1/statuses/${i}/unbookmark`;try{await fetch(t,{mode:"cors",method:"POST",headers:{Authorization:`Bearer ${a}`}}).then(n=>{console.info(n.url),r.classList.add("disappeared");const s=document.querySelector("#bm_nb").textContent-=1;document.title=`${s} Mastodon unBookmarks`},n=>{console.error(n)})}catch(n){console.error(n)}},E=e=>e.charAt(0).toUpperCase()+e.slice(1),$=async(e,a)=>await L(e,a),C=(e,a)=>`<div id="${e.id}" class="toot">
<div class="banner">
<a href="${e.account.url}" target="_blank" title="Voir le profil sur l'instance d'origine"><div class="account"><div class="account-avatar"><img src="${e.account.avatar}" /></div><div class="account.username">${e.account.display_name}</div></div></a>
<button title="Cliquer pour retirer le marque-page" class="unbookmark">&#128278;</button>
</div>
<div class="toot-content">${e.content}</div>
${a.length?a.join(""):""}
<div class="date-modified">
<a href="${e.uri}" target="_blank" title="Voir le pouet sur Mastodon">${E(e.created_at)} <i class="fa fa-up-right-from-square" aria-hidden="true"></i></a>
</div>
</div>`,R=async(e,a)=>{const i=`${e}api/v1/bookmarks/?limit=40`;try{const r=[];let t,n="";do{const o=await $(i+t,a);r.push(...o[0]),[t,n]=[o[1],o[2]]}while(n);r.reverse();const s={weekday:"long",year:"numeric",month:"long",day:"numeric",hour:"numeric",minute:"numeric",timeZone:"Europe/Paris"};r.forEach(o=>{o.created_at=new Date(o.created_at).toLocaleString("fr-FR",s),o.account.display_name=o.account.display_name.replaceAll(/:\w+:/g,"").trim()||o.account.username;const d=new RegExp('(?<=rel="tag")',"g");o.content=o.content.replaceAll(d,' target="_blank"');const l=o.media_attachments.filter(u=>u.type=="image").map(u=>`<img src="${u.preview_url}" title="${u.description}"/>`);l.length&&l.unshift('<div class="attachments">')&&l.push("</div>"),m.innerHTML+=C(o,l)}),m.querySelectorAll(".unbookmark").forEach(o=>{const d=o.parentElement.parentElement,l=d.id;o.addEventListener("click",()=>w(e,a,l,d))});const y=r.length;return{newsFeedEl:m,bookmarksNb:y}}catch(r){console.error(r)}return"Nothing to display…"},h=document.createElement("div");h.classList.add("actionbar");const k=document.createElement("button");h.appendChild(k);k.innerHTML="&#x21C5;";k.title="Cliquer pour inverser l'ordre";const f=document.createElement("button");h.appendChild(f);f.innerHTML="&#127850;";f.title="Cliquer pour supprimer les cookies";const x=()=>{document.querySelector(".news-feed-el").classList.toggle("reverse")},U=()=>{document.cookie='token=""; expires=Thu, 01 Jan 1970 00:00:01 GMT"; samesite=lax; secure',document.cookie='instanceURL=""; expires=Thu, 01 Jan 1970 00:00:01 GMT"; samesite=lax; secure'};k.addEventListener("click",x);f.addEventListener("click",U);var g;const c=Object.fromEntries((g=document.cookie)==null?void 0:g.split(";").map(e=>e.trim().split("="))),b=prompt("Token? (read:bookmarks & write:bookmarks)",c==null?void 0:c.token),_=c!=null&&c.instanceURL?decodeURIComponent(c.instanceURL):"";let p=prompt("URL instance?",_);p.startsWith("https://")||(p="https://".concat(p));const v=new URL(p);document.cookie=`token=${b}; max-age=604800; samesite=lax; secure`;document.cookie=`instanceURL=${encodeURIComponent(v)}; max-age=604800; samesite=lax; secure`;const q=async()=>{const e=await R(v,b);document.querySelector("#app").appendChild(h),document.querySelector("#app").appendChild((e==null?void 0:e.newsFeedEl)||e),document.querySelector("#bm_nb").textContent=(e==null?void 0:e.bookmarksNb)||"Ø",e!=null&&e.bookmarksNb&&(document.title=`${e.bookmarksNb} Mastodon unBookmarks`)};q();
(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const t of document.querySelectorAll('link[rel="modulepreload"]'))r(t);new MutationObserver(t=>{for(const n of t)if(n.type==="childList")for(const i of n.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function d(t){const n={};return t.integrity&&(n.integrity=t.integrity),t.referrerPolicy&&(n.referrerPolicy=t.referrerPolicy),t.crossOrigin==="use-credentials"?n.credentials="include":t.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function r(t){if(t.ep)return;t.ep=!0;const n=d(t);fetch(t.href,n)}})();const m=document.createElement("div");m.classList.add("news-feed-el");const $=async(e,s)=>await fetch(e,{mode:"cors",headers:{Authorization:`Bearer ${s}`}}).then(r=>r.json().then(t=>{const n=r.headers.get("link").split(",").map(i=>i.match(/&m(ax|in)_id=\d+/g));return[t,...n]}),r=>{console.error(r)}),w=async(e,s,d,r)=>{const t=`${e}api/v1/statuses/${d}/unbookmark`;try{await fetch(t,{mode:"cors",method:"POST",headers:{Authorization:`Bearer ${s}`}}).then(n=>{console.info(n.url),r.classList.add("disappeared");const i=document.querySelector("#bm_nb").textContent-=1;document.title=`${i} Mastodon unBookmarks`},n=>{console.error(n)})}catch(n){console.error(n)}},L=e=>e.charAt(0).toUpperCase()+e.slice(1),E=async(e,s)=>await $(e,s),_=(e,s)=>`<div id="${e.id}" class="toot">
<div class="banner">
<a href="${e.account.url}" target="_blank" title="Voir le profil sur l'instance d'origine"><div class="account"><div class="account-avatar"><img src="${e.account.avatar}" /></div><div class="account.username">${e.account.display_name}</div></div></a>
<button title="Cliquer pour retirer le marque-page" class="unbookmark">&#128278;</button>
</div>
<div class="toot-content">${e.content}</div>
${s.length?s.join(""):""}
<div class="date-modified">
<a href="${e.uri}" target="_blank" title="Voir le pouet sur Mastodon">${L(e.created_at)} <i class="fa fa-up-right-from-square" aria-hidden="true"></i></a>
</div>
</div>`,x=async(e,s)=>{const d=`${e}api/v1/bookmarks/?limit=40`;try{const r=[];let t,n="";do{const o=await E(d+t,s);r.push(...o[0]),[t,n]=[o[1],o[2]]}while(n);r.reverse();const i={weekday:"long",year:"numeric",month:"long",day:"numeric",hour:"numeric",minute:"numeric",timeZone:"Europe/Paris"};r.forEach(o=>{o.created_at=new Date(o.created_at).toLocaleString("fr-FR",i),o.account.display_name=o.account.display_name.replaceAll(/:\w+:/g,"").trim()||o.account.username;const u=new RegExp('(?<=rel="tag")',"g");o.content=o.content.replaceAll(u,' target="_blank"');const l=o.media_attachments.filter(a=>["image","video","audio"].includes(a.type)).map(a=>{switch(a.type){case"image":return`<img src="${a.preview_url}" title="${a.description}"/>`;case"video":return`<video controls src="${a.remote_url}" poster="${a.preview_url}" title="${a.description}" preload="none" role="button" tabindex="0" width="${a.meta.small.width}" height="${a.meta.small.height}" volume="1"/>`;case"audio":return`<audio controls src="${a.remote_url}" poster="${a.preview_remote_url}" title="${a.description}" preload="none" role="button" tabindex="0" width="${a.meta.small.width}" height="${a.meta.small.height}" volume="1"/>`;default:console.info("Type not prepared…",a.type);break}});l.length&&l.unshift('<div class="attachments">')&&l.push("</div>"),m.innerHTML+=_(o,l)}),m.querySelectorAll(".unbookmark").forEach(o=>{const u=o.parentElement.parentElement,l=u.id;o.addEventListener("click",()=>w(e,s,l,u))});const y=r.length;return{newsFeedEl:m,bookmarksNb:y}}catch(r){console.error(r)}return"Nothing to display…"},h=document.createElement("div");h.classList.add("actionbar");const f=document.createElement("button");h.appendChild(f);f.innerHTML="&#x21C5;";f.title="Cliquer pour inverser l'ordre";const k=document.createElement("button");h.appendChild(k);k.innerHTML="&#127850;";k.title="Cliquer pour supprimer les cookies";const C=()=>{document.querySelector(".news-feed-el").classList.toggle("reverse")},R=()=>{document.cookie='token=""; expires=Thu, 01 Jan 1970 00:00:01 GMT"; samesite=lax; secure',document.cookie='instanceURL=""; expires=Thu, 01 Jan 1970 00:00:01 GMT"; samesite=lax; secure'};f.addEventListener("click",C);k.addEventListener("click",R);var g;const c=Object.fromEntries((g=document.cookie)==null?void 0:g.split(";").map(e=>e.trim().split("="))),b=prompt("Token? (read:bookmarks & write:bookmarks)",c==null?void 0:c.token),U=c!=null&&c.instanceURL?decodeURIComponent(c.instanceURL):"";let p=prompt("URL instance?",U);p.startsWith("https://")||(p="https://".concat(p));const v=new URL(p);document.cookie=`token=${b}; max-age=604800; samesite=lax; secure`;document.cookie=`instanceURL=${encodeURIComponent(v)}; max-age=604800; samesite=lax; secure`;const q=async()=>{const e=await x(v,b);document.querySelector("#app").appendChild(h),document.querySelector("#app").appendChild((e==null?void 0:e.newsFeedEl)||e),document.querySelector("#bm_nb").textContent=(e==null?void 0:e.bookmarksNb)||"Ø",e!=null&&e.bookmarksNb&&(document.title=`${e.bookmarksNb} Mastodon unBookmarks`)};q();
......@@ -5,15 +5,15 @@
<link rel="icon" type="image/svg+xml" href="/Mastodon_Logotype_(Simple).svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Mastodon unBookmarks</title>
<script type="module" crossorigin src="/assets/index-85fb6efb.js"></script>
<link rel="stylesheet" href="/assets/index-37a7e3fb.css">
<script type="module" crossorigin src="/assets/index-8b06c2c7.js"></script>
<link rel="stylesheet" href="/assets/index-39659396.css">
</head>
<body>
<h1><span id="bm_nb"></span>Mastodon <em>un</em>Bookmarks</h1>
<div class="presentation">
<p>Tout se passe dans le navigateur.</p>
<p>Depuis son compte <em>Mastodon</em>, il faut générer un jeton d'accès ayant pour droit <code>read:bookmarks</code> et <code>write:bookmarks</code>.</p>
<p>Un cookie permet de stocker le jeton et l'adresse de l'intance pendant 7 jours, il faut donc supprimer le cookie (en cliquant sur le bouton ci-dessous) ou utiliser la navigation privée pour ne pas qu'il demeure.</p>
<p>Un cookie permet de stocker le jeton et l'adresse de l'intance pendant 7 jours. Il est possible de supprimer le cookie (en cliquant sur le bouton ci-dessous) ou utiliser la navigation privée pour ne pas qu'il demeure.</p>
<p><img class="logo" src="https://about.gitlab.com/nuxt-images/ico/favicon-32x32.png" alt="Logo de GitLab"/> Le code source est là : <a href="https://forge.tedomum.net/mickge/mastodon-bookmarks" target="_blank">https://forge.tedomum.net/mickge/mastodon-bookmarks</a>.</p>
</div>
<div id="app"></div>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment