Experimental Film Synopsis Generator

Experimental Film Synopsis Generator

Experimental Film Synopsis Generator

Articulate the structure, medium, and themes of your experimental film project.

The generated synopsis focuses on communicating the film's artistic process and thematic core, which is essential for experimental film submissions.

Artistic Synopsis

${protagonist} utilizes a ${medium} approach, structured by ${structure}. It explores the ${theme}. The conceptual arc moves through ${arc}.

`; } function efsg_renderDashboard(targetDiv = efsg_synopsisPreview, isPDF = false) { if (!targetDiv) return; targetDiv.innerHTML = efsg_generateSynopsisHTML(efsg_data); } // --- PDF Generation and Management --- function efsg_renderPdfClone() { const synopsisHTML = efsg_generateSynopsisHTML(efsg_data); const date = new Date().toLocaleDateString('en-US'); let structureBreakdown = ''; if (efsg_data.title) { structureBreakdown = `

Breakdown of Core Elements:

  • Visual Medium: ${efsg_escapeHTML(efsg_data.medium)}
  • Structure: ${efsg_escapeHTML(efsg_data.structure)}
  • Primary Theme: ${efsg_escapeHTML(efsg_data.theme)}
  • Conceptual Arc: ${efsg_escapeHTML(efsg_data.arc)}
`; } efsg_pdfRenderClone.innerHTML = `

Experimental Film Synopsis

Date Generated: ${date}

${synopsisHTML} ${structureBreakdown}
`; } /** * Generates and downloads a PDF of the synopsis */ async function efsg_downloadPDF() { if (!efsg_data.title || !efsg_data.medium) { alert("Please complete the Film Title and Visual Medium before downloading."); return; } if (typeof jspdf === 'undefined' || typeof html2canvas === 'undefined') { alert("Error: PDF libraries failed to load."); return; } efsg_renderPdfClone(); const { jsPDF } = window.jspdf; try { const contentDiv = efsg_pdfRenderClone.querySelector('.pdf-content'); if (!contentDiv) return; const canvas = await html2canvas(contentDiv, { scale: 1.5, useCORS: true }); const imgData = canvas.toDataURL('image/png'); const imgProps = { width: canvas.width, height: canvas.height }; const pdf = new jsPDF({ orientation: 'p', unit: 'pt', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = pdf.internal.pageSize.getHeight(); const margin = 40; const contentWidth = pdfWidth - (margin * 2); const contentHeight = (contentWidth * imgProps.height) / imgProps.width; let heightLeft = contentHeight; let position = 0; pdf.addImage(imgData, 'PNG', margin, position + margin, contentWidth, contentHeight); heightLeft -= (pdfHeight - margin * 2); while (heightLeft > 0) { position -= (pdfHeight - margin * 2); pdf.addPage(); pdf.addImage(imgData, 'PNG', margin, position + margin, contentWidth, contentHeight); heightLeft -= (pdfHeight - margin * 2); } const safeName = (efsg_data.title || 'film_synopsis').replace(/[^a-z0-9]/gi, '_').toLowerCase(); pdf.save(`${safeName}_Synopsis.pdf`); } catch (error) { console.error("PDF generation failed:", error); alert("An error occurred while generating the PDF."); } } // --- EVENT LISTENERS --- // Tab link clicks efsg_tabLinks.forEach((link, index) => { link.addEventListener('click', () => efsg_switchTab(index)); }); // Next/Prev button clicks if (efsg_prevButton) { efsg_prevButton.addEventListener('click', () => { if (efsg_currentTab > 0) efsg_switchTab(efsg_currentTab - 1); }); } if (efsg_nextButton) { efsg_nextButton.addEventListener('click', () => { if (efsg_currentTab === efsg_tabLinks.length - 1) { efsg_updateDataFromConfig(); efsg_switchTab(0); } else { if (efsg_currentTab < efsg_tabLinks.length - 1) efsg_switchTab(efsg_currentTab + 1); } }); } // PDF download if (efsg_downloadPdfButton) { efsg_downloadPdfButton.addEventListener('click', efsg_downloadPDF); } // --- INITIALIZATION --- efsg_renderConfig(); efsg_renderDashboard(); // Set initial tab state efsg_tabPanes.forEach((pane, index) => { pane.classList.toggle('hidden', index !== 0); pane.classList.toggle('efsg-active', index === 0); }); efsg_tabLinks.forEach((link, index) => { TAB_CLASSES.active.forEach(cls => link.classList.remove(cls)); TAB_CLASSES.inactive.forEach(cls => link.classList.remove(cls)); if (index === 0) { TAB_CLASSES.active.forEach(cls => link.classList.add(cls)); } else { TAB_CLASSES.inactive.forEach(cls => link.classList.add(cls)); } }); });
Scroll to Top