Snippet Collector

Snippet Collector

Add New Snippet

My Snippets

No snippets found. Add one to get started!

'; return; } snippetsToRender.forEach(snippet => { const card = document.createElement('div'); card.className = 'sc-snippet-card'; card.dataset.id = snippet.id; const tagsHTML = snippet.tags.map(tag => `${tag}`).join(''); // Sanitize code for HTML display const sanitizedCode = snippet.code.replace(//g, ">"); card.innerHTML = `

${snippet.title}

${sanitizedCode}
`; snippetsList.appendChild(card); }); // After appending, highlight all code blocks Prism.highlightAll(); }; /** * Resets the form to its initial state. */ const resetForm = () => { editMode = false; snippetForm.reset(); snippetIdInput.value = ''; formTitle.textContent = 'Add New Snippet'; submitBtn.textContent = 'Add Snippet'; cancelEditBtn.style.display = 'none'; }; // --- EVENT HANDLERS --- // snippetForm.addEventListener('submit', (e) => { e.preventDefault(); const title = snippetTitleInput.value.trim(); const language = snippetLanguageInput.value.trim(); const code = snippetCodeInput.value.trim(); const tags = snippetTagsInput.value.split(',').map(tag => tag.trim()).filter(Boolean); const id = parseInt(snippetIdInput.value, 10); if (!title || !language || !code) { // A more user-friendly notification could be added here console.error("Title, Language, and Code are required."); return; } if (editMode && id) { // Update existing snippet const index = snippets.findIndex(s => s.id === id); if (index > -1) { snippets[index] = { id, title, language, code, tags }; } } else { // Add new snippet const newSnippet = { id: nextId++, title, language, code, tags }; snippets.push(newSnippet); } renderSnippets(); resetForm(); }); cancelEditBtn.addEventListener('click', resetForm); snippetsList.addEventListener('click', (e) => { const button = e.target.closest('.sc-action-btn'); if (!button) return; const card = e.target.closest('.sc-snippet-card'); const snippetId = parseInt(card.dataset.id, 10); const snippet = snippets.find(s => s.id === snippetId); if (button.classList.contains('delete-btn')) { if (confirm(`Are you sure you want to delete "${snippet.title}"?`)) { snippets = snippets.filter(s => s.id !== snippetId); renderSnippets(); } } else if (button.classList.contains('edit-btn')) { editMode = true; snippetIdInput.value = snippet.id; snippetTitleInput.value = snippet.title; snippetLanguageInput.value = snippet.language; snippetCodeInput.value = snippet.code; snippetTagsInput.value = snippet.tags.join(', '); formTitle.textContent = 'Edit Snippet'; submitBtn.textContent = 'Save Changes'; cancelEditBtn.style.display = 'block'; window.scrollTo({ top: 0, behavior: 'smooth' }); } else if (button.classList.contains('copy-btn')) { // Use document.execCommand for broader compatibility within iframes const textArea = document.createElement('textarea'); textArea.value = snippet.code; document.body.appendChild(textArea); textArea.select(); try { document.execCommand('copy'); // Simple visual feedback button.innerHTML = 'Copied!'; setTimeout(() => { button.innerHTML = ``; }, 1500); } catch (err) { console.error('Failed to copy text: ', err); } document.body.removeChild(textArea); } }); searchInput.addEventListener('input', (e) => { const searchTerm = e.target.value.toLowerCase(); const filteredSnippets = snippets.filter(s => s.title.toLowerCase().includes(searchTerm) || s.language.toLowerCase().includes(searchTerm) || s.code.toLowerCase().includes(searchTerm) || s.tags.some(tag => tag.toLowerCase().includes(searchTerm)) ); renderSnippets(filteredSnippets); }); downloadPdfBtn.addEventListener('click', () => { const { jsPDF } = window.jspdf; const doc = new jsPDF(); doc.setFontSize(22); doc.text("My Snippet Collection", 105, 20, null, null, "center"); let yPos = 30; snippets.forEach((snippet, index) => { if (yPos > 260) { // Check for page break doc.addPage(); yPos = 20; } doc.setFontSize(14); doc.setFont(undefined, 'bold'); doc.text(`${snippet.title} (${snippet.language})`, 14, yPos); yPos += 7; doc.setFontSize(10); doc.setFont(undefined, 'normal'); doc.text(`Tags: ${snippet.tags.join(', ')}`, 14, yPos); yPos += 10; doc.setFont('Courier', 'normal'); doc.setFontSize(9); // Split text to fit page width const lines = doc.splitTextToSize(snippet.code, 180); doc.text(lines, 14, yPos); yPos += (lines.length * 4) + 10; // Adjust y position after code block // Add a separator if (index < snippets.length - 1) { doc.setDrawColor(200); doc.line(14, yPos - 5, 196, yPos - 5); } }); doc.save("snippet-collection.pdf"); }); // --- INITIALIZATION --- // renderSnippets(); });
Scroll to Top