forked from snxraven/p2ns
peer paste syntax highlight viewer
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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) => ({ '<': '<', '>': '>', '&': '&' }[m]))}</div>`
|
||||
: `<pre>${paste.content.replace(/[<>&]/g, (m) => ({ '<': '<', '>': '>', '&': '&' }[m]))}</pre>`}</div>
|
||||
: `<pre><code id="code-render">${paste.content.replace(/[<>&]/g, (m) => ({ '<': '<', '>': '>', '&': '&' }[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>`;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user