|
|
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Projector View</title>
- <style>
- body {
- font-family: Futura, sans-serif;
- font-size: 32px;
- background-color: green;
- color: white;
- text-align: center; /* Align text to the left */
- margin: 0;
- padding: 0;
- -webkit-text-fill-color: white;
- -webkit-text-stroke-color: black;
- -webkit-text-stroke-width: 6.00px;
- paint-order: stroke fill;
- }
-
- #container {
- overflow: hidden;
- height: 200px; /* Ensure container is tall enough for 4 lines */
- max-width: 42ch;
- position: relative;
- padding-left: 20px; /* Add some padding to the left */
- margin-left: auto;
- margin-right: auto;
- }
-
- #content {
- position: absolute;
- top: 0;
- transition: top 0.5s ease; /* Smooth scrolling */
- }
-
- .line {
- opacity: 1;
- white-space: normal; /* Allow lines to wrap */
- word-wrap: break-word; /* Break long words if needed */
- margin: 5px 0;
- }
-
- .currentLine {
- font-weight: bold;
- opacity: 1;
- }
-
- /* Ensure there's space for 4 lines to be displayed */
- #container {
- max-height: 400px;
- }
- </style>
- </head>
- <body>
- <div id="container">
- <div id="content"></div>
- </div>
-
- <script src="/socket.io/socket.io.js"></script>
- <script>
- const socket = io();
- const contentElement = document.getElementById('content');
- let speechLines = [];
- let currentLineIndex = 0;
-
- // Display 4 lines (previous, current, next, and an extra one above the current line)
- function updateDisplay() {
- contentElement.innerHTML = ''; // Clear previous lines
-
- const start = Math.max(0, currentLineIndex - 2); // Show 2 lines before current
- const end = Math.min(speechLines.length, currentLineIndex + 2); // Show 2 lines after current
-
- // Create a new block of lines
- const displayLines = speechLines.slice(start, end).map((line, index) => {
- const div = document.createElement('div');
- div.classList.add('line');
- if (index === 2) div.classList.add('currentLine'); // Highlight the current line
- div.textContent = line;
- return div;
- });
-
- displayLines.forEach(div => contentElement.appendChild(div));
-
- // Scroll animation based on the height of each line
- const lineHeight = document.querySelector('.line').offsetHeight;
- const previousLinesHeight = (currentLineIndex - start - 1) * lineHeight; // Offset for lines above the current line
- contentElement.style.top = `-${previousLinesHeight}px`;
- }
-
- // Receive updates from the server
- socket.on('update_caption', (newPosition) => {
- currentLineIndex = newPosition;
- updateDisplay();
- });
-
- // Load the speech when a new client connects
- socket.on('load_speech', (lines) => {
- speechLines = lines;
- currentLineIndex = 0;
- updateDisplay(); // Display the initial lines
- });
- </script>
- </body>
- </html>
|