peer paste syntax highlight viewer

This commit is contained in:
Raven Scott
2026-05-27 23:39:43 -04:00
parent 0ab92f1922
commit 55b7547b3a
2 changed files with 29 additions and 4 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "Peer Paste",
"version": "1.3.5",
"version": "1.3.6",
"domain": "peer.paste",
"enabled": true,
"description": "Temporary P2P text snippets with expiration and burn-after-read options",
+28 -3
View File
@@ -659,6 +659,7 @@ function renderPastePage(paste) {
.meta{font-size:.9rem;color:#94a3b8;margin:.5rem 0 1rem}
pre{white-space:pre-wrap;word-break:break-word;background:#020617;border:1px solid #1e293b;border-radius:8px;padding:1rem}
.key-row{display:flex;gap:.5rem;margin:.75rem 0}
.key-row.hidden{display:none}
input{flex:1;background:#020617;color:#e2e8f0;border:1px solid #334155;border-radius:8px;padding:.5rem}
button{background:#2563eb;color:#fff;border:0;border-radius:8px;padding:.5rem .85rem;cursor:pointer}
.preview{white-space:pre-wrap;word-break:break-word}
@@ -668,7 +669,7 @@ function renderPastePage(paste) {
<div class="wrap">
<h1>paste ${paste.id}</h1>
<div class="meta">Encrypted ${safePaste.format} paste (${safePaste.encryptionMode || 'aes-gcm'}). Key must be present in URL fragment.</div>
<div class="key-row">
<div class="key-row" id="key-row">
<input id="manual-key" placeholder="Paste key (base64url) if missing from URL" />
<button id="decrypt-btn" type="button">Decrypt</button>
</div>
@@ -721,6 +722,7 @@ function renderPastePage(paste) {
}
const btn = document.getElementById('decrypt-btn');
const input = document.getElementById('manual-key');
const keyRow = document.getElementById('key-row');
btn.addEventListener('click', () => decryptAndRender(input.value));
input.addEventListener('keydown', (e) => {
if (e.key === 'Enter') decryptAndRender(input.value);
@@ -728,12 +730,15 @@ function renderPastePage(paste) {
const initial = readKeyFromHash();
if (initial) {
input.value = initial;
keyRow.classList.add('hidden');
decryptAndRender(initial);
} else {
keyRow.classList.remove('hidden');
decryptAndRender('');
}
</script>
<script src="/api/vendor/marked.min.js"></script>
<script src="/api/vendor/highlight.min.js"></script>
</body>
</html>`;
}
@@ -763,12 +768,13 @@ function renderPastePage(paste) {
<div class="meta">Language: ${language} | Format: ${safePaste.format} | Expires in: ${hours}h ${minutes}m</div>
<div class="card">${safePaste.format === 'markdown'
? `<div id="md-render">${paste.content.replace(/[<>&]/g, (m) => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;' }[m]))}</div>`
: `<pre>${paste.content.replace(/[<>&]/g, (m) => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;' }[m]))}</pre>`}</div>
: `<pre><code id="code-render">${paste.content.replace(/[<>&]/g, (m) => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;' }[m]))}</code></pre>`}</div>
${attachments.length ? `<div class="card"><h3>Attachments</h3>${attachments.map((a) => `<p><a download="${a.name}" href="${a.data}">${a.name}</a> (${a.size} bytes)</p>`).join('')}</div>` : ''}
<p><a href="/">Create another paste</a></p>
</div>
${safePaste.format === 'markdown'
? `<script src="/api/vendor/marked.min.js"></script>
<script src="/api/vendor/highlight.min.js"></script>
<script>
const el = document.getElementById('md-render');
const src = el.textContent || '';
@@ -778,8 +784,27 @@ function renderPastePage(paste) {
.replace(/\\son\\w+='[^']*'/gi, '')
.replace(/javascript:/gi, '');
el.innerHTML = sanitize(marked.parse(src));
if (window.hljs) {
el.querySelectorAll('pre code').forEach((block) => {
try { hljs.highlightElement(block); } catch {}
});
}
</script>`
: ''}
: `<script src="/api/vendor/highlight.min.js"></script>
<script>
const block = document.getElementById('code-render');
if (block && window.hljs) {
try {
const detected = hljs.highlightAuto(block.textContent || '');
if (detected && detected.value) {
block.innerHTML = detected.value;
block.className = 'hljs language-' + (detected.language || 'plaintext');
} else {
hljs.highlightElement(block);
}
} catch {}
}
</script>`}
</body>
</html>`;
}