|
import gradio as gr |
|
import random |
|
|
|
def generate_initial_design(word): |
|
"""Generate initial design for the special word in black color.""" |
|
fonts = [ |
|
"'VT323', monospace", |
|
"'Josefin Sans', sans-serif", |
|
"'Rajdhani', sans-serif", |
|
"'Anton', sans-serif", |
|
"'Caveat', cursive", |
|
"'Patrick Hand', cursive", |
|
"'Nothing You Could Do', cursive", |
|
"'Reenie Beanie', cursive", |
|
"'Orbitron', sans-serif", |
|
"'Raleway', sans-serif" |
|
] |
|
font_sizes = ["18px", "19px", "20px"] |
|
font_tops = ["0px", "1px", "-1px"] |
|
letter_spacings = ["-1px", "0px", "1px"] |
|
text_shadows = [ |
|
"0px 0px 1px", |
|
"0px 0px 2px", |
|
"1px 0px 0px", |
|
"0px 0px 0px", |
|
"0px 1px 0px", |
|
"0px 2px 0px", |
|
"0px 1px 1px", |
|
"1px 1px 0px", |
|
"1px 0px 1px" |
|
] |
|
skew_angles = ["-25deg", "-20deg", "-15deg", "-10deg", "0deg", "10deg", "15deg", "20deg", "25deg"] |
|
|
|
letters = list(word) |
|
styled_letters = [] |
|
|
|
for letter in letters: |
|
style = { |
|
'font-family': random.choice(fonts), |
|
'line-height': '1.6', |
|
'font-size': random.choice(font_sizes), |
|
'letter-spacing': random.choice(letter_spacings), |
|
'text-shadow': random.choice(text_shadows), |
|
'transform': f'skew({random.choice(skew_angles)})', |
|
'margin-top': random.choice(["-0.02cm", "0.00cm", "0.02cm"]), |
|
'position': 'relative', |
|
'top': random.choice(font_tops), |
|
'color': '#000000', |
|
'display': 'inline-block', |
|
'margin': '0 1px', |
|
'vertical-align': 'middle', |
|
'cursor': 'pointer' |
|
} |
|
|
|
style_str = '; '.join([f'{k}: {v}' for k, v in style.items()]) |
|
styled_letter = f'<span class="styled-letter" style="{style_str}">{letter}</span>' |
|
styled_letters.append(styled_letter) |
|
|
|
return f''' |
|
<span style="display: inline-flex; |
|
align-items: baseline; |
|
vertical-align: middle; |
|
margin: 0 2px;"> |
|
{"".join(styled_letters)} |
|
</span>''' |
|
|
|
def generate_output_html(): |
|
paragraphs = [ |
|
"Proctors's voice quavered, “Where are we, Benshiro? This can't be real. We went full speed into that...”", |
|
"“Proctor, I hear you! Is that you? I'm so thankful, but where are you? I can't see you.” Benshiro's words echoed in the void." |
|
] |
|
|
|
result = [] |
|
|
|
for paragraph in paragraphs: |
|
words = paragraph.split() |
|
special_word = random.choice(words) |
|
styled_word = generate_initial_design(special_word) |
|
styled_paragraph = ' '.join(word if word != special_word else styled_word for word in words) |
|
result.append(styled_paragraph) |
|
|
|
output_html = '<br><br>'.join(result) |
|
|
|
return f""" |
|
<html> |
|
<head> |
|
<link href="https://fonts.googleapis.com/css?family=VT323|Josefin+Sans|Rajdhani|Anton|Caveat|Patrick+Hand|Nothing+You+Could+Do|Reenie+Beanie|Orbitron|Raleway" rel="stylesheet"> |
|
<style> |
|
body {{ |
|
background-color: #fff; |
|
color: #000; |
|
font-size: 18px; |
|
line-height: 1.6; |
|
font-family: "Josefin Sans", sans-serif; |
|
padding: 20px; |
|
}} |
|
.styled-letter {{ |
|
transition: transform 0.3s ease; |
|
display: inline-block; |
|
}} |
|
.styled-letter.animate {{ |
|
transform: rotate(10deg) scale(1.3); |
|
}} |
|
</style> |
|
<script> |
|
function typeWriter(textContentId, words) {{ |
|
const textContent = document.getElementById(textContentId); |
|
textContent.innerHTML = ''; |
|
let i = 0; |
|
function displayWord() {{ |
|
if (i < words.length) {{ |
|
textContent.innerHTML += words[i] + ' '; |
|
i++; |
|
setTimeout(displayWord, 60); // typing speed |
|
}} |
|
}} |
|
displayWord(); |
|
}} |
|
|
|
function triggerMovement() {{ |
|
document.querySelectorAll('.styled-letter').forEach(el => {{ |
|
el.classList.add('animate'); |
|
setTimeout(() => el.classList.remove('animate'), 300); |
|
}}); |
|
}} |
|
|
|
window.onload = function() {{ |
|
const words = document.getElementById('full-text').innerHTML.split(' '); |
|
typeWriter('text-content', words); |
|
}} |
|
</script> |
|
</head> |
|
<body> |
|
<div style='max-width: 800px; margin: auto;'> |
|
<div id="full-text" style="display:none;">{output_html}</div> |
|
<div id="text-content"></div> |
|
<br> |
|
<button onclick="triggerMovement()">Animate Letters</button> |
|
</div> |
|
</body> |
|
</html> |
|
""" |
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# Styled Text Display with Clickable Animation") |
|
output_html = gr.HTML() |
|
demo.load(fn=generate_output_html, outputs=output_html) |
|
|
|
demo.launch() |
|
|