handle new lines

This commit is contained in:
yair-mantis 2024-01-20 18:00:05 +02:00
parent 7c28b8a958
commit bb42eec31f
2 changed files with 93 additions and 56 deletions

27
nik2.py Normal file
View File

@ -0,0 +1,27 @@
import streamlit as st
from wand.image import Image as wImage
from wand.drawing import Drawing
from wand.color import Color
draw = Drawing()
font = "fonts\\DejaVuSans.ttf"
draw.font = font
img = wImage(width=696, height=100, background=Color('#ffffff'))
# draw.fill_color(Color('#000000'))
draw.text_alignment = 'right'
draw.text_antialias = True
draw.text_encoding = 'utf-8'
# draw.text_interline_spacing = 1
# draw.text_interword_spacing = 15.0
# draw.text_kerning = 0.0
draw.font_size = 40
draw.text(
int(img.width / 2),
int(img.height / 2),
u'יֵשׁ לְךָ חָבֵר חָדָשׁ'
)
draw(img)
img_bytes = img.make_blob(format='png')
st.image(img_bytes)

106
nikud.py
View File

@ -1,21 +1,22 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os
from dotenv import load_dotenv
import streamlit as st import streamlit as st
import requests import requests
from PIL import Image, ImageDraw, ImageFont
from dotenv import load_dotenv from wand.image import Image
import os from wand.drawing import Drawing
from bidi.algorithm import get_display from wand.color import Color
# Load environment variables from .env file # Load environment variables from .env file
load_dotenv() load_dotenv()
# Read API key from .env file
api_key = os.getenv("API_KEY") api_key = os.getenv("API_KEY")
# Specify the font size # Specify the font size
font_size = 80 font_size = 40
# font = ImageFont.truetype("fonts/BonaNova-Regular.ttf", font_size, encoding='unic') # Create an image
font = ImageFont.truetype("fonts/DejaVuSans.ttf", font_size) # only one that works img_width = 696
# place the api_key in the .env file # place the api_key in the .env file
@ -53,63 +54,72 @@ def main():
st.title('Dicta Nakdan API Interface') st.title('Dicta Nakdan API Interface')
# Input fields for user # Input fields for user
hebrew_text = st.text_area("Enter Hebrew Text:", "טקסט טקסט טקסט") hebrew_text = st.text_area("Enter Hebrew Text:", "רסק שמופי טקסט", )
# Button to send request # Button to send request
if st.button("Process Text"): if st.button("Process Text",):
response = get_nakdan_response(hebrew_text, api_key) response = get_nakdan_response(hebrew_text, api_key)
if not isinstance(response, dict): if not isinstance(response, dict):
response = {'data': []} response = {'data': []}
# st.json(response) # st.json(response)
# Extract words # Extract words or newline from response
words = [ words = []
for item in response['data']:
if 'nakdan' in item:
if item['nakdan']['word'] == "\n": # Check if the word is a newline
words.append("\n")
else:
words.extend(
option['w'].replace("|", "") option['w'].replace("|", "")
for item in response['data']
if 'nakdan' in item
for option in item['nakdan'].get('options', []) for option in item['nakdan'].get('options', [])
] )
st.text(" ".join(words)) # printwords after each other # st.text(" ".join(words)) # Print words, including newlines
# Create an image draw = Drawing()
img_width = 696 fontw = "fonts\\DejaVuSans.ttf"
img_height = 400 # font_size * (len(words) // 10 + 2) # Adjust the multiplier as needed draw.font = fontw
img = Image.new('RGB', (img_width, img_height), color=(255, 255, 255)) draw.text_antialias = True
d = ImageDraw.Draw(img) draw.text_encoding = 'utf-8'
draw.font_size = font_size
# Position for the first word imgw = Image(width=696, height=400, background=Color('#ffffff'))
x, y = 10, 0
max_width = img_width - 20 # Maximum width for each line
line_width = 0 # Current line width
spacing = 10
line_width = 0
y = font_size
x = 0
for word in words: for word in words:
bidi_word = get_display(word) # Convert word to RTL format if word == "\n":
word_width = font.getbbox(bidi_word)[2] - font.getbbox(bidi_word)[0] # Width of the word y += font_size
line_width = 0
continue
# Create a dummy image to get the text metrics
with Image(width=1, height=1) as img:
metrics = draw.get_font_metrics(img, word)
word_width = int(metrics.text_width)
word_height = int(metrics.text_height)
line_width += word_width + spacing
# Position for the first word
# Check if the word fits in the current line # Check if the word fits in the current line
if line_width + word_width <= img_width - 20: if line_width <= img_width - 20:
x = img_width - (line_width) - 20
# Render the word in the current line # Render the word in the current line
d.text((img_width - (x + line_width + word_width), y), bidi_word, fill=(0, 0, 0), font=font) draw.text(x, y, word)
line_width += word_width + 10 # Add word width and spacing x += word_width + spacing # Add word width and spacing to x
else: else:
# Move to the next line y += word_height
y += font_size # Move to the next line line_width = 0
line_width = 0 # Reset line width # crop the image height to the text height
imgw.crop(0, 0, img_width, y+spacing)
# Check if the word fits in the new line draw(imgw)
if word_width <= img_width - 20: img_bytes = imgw.make_blob(format='png')
# Render the word in the new line st.image(img_bytes)
d.text((img_width - (x + line_width + word_width), y), bidi_word, fill=(0, 0, 0), font=font) # st.image(img)
line_width += word_width + 10 # Add word width and spacing
else:
# Word is too long for a single line, truncate it
truncated_word = bidi_word[:max_width // font_size] + "..."
d.text((img_width - (x + line_width + font.getsize(truncated_word)[0]), y), truncated_word, fill=(0, 0, 0), font=font)
line_width += font.getsize(truncated_word)[0] + 10 # Add truncated word width and spacing
# st.text(f"Word: '{bidi_word}', Position: (x={x + line_width - word_width}, y={y}), {len(bidi_word)} characters")
st.image(img)
if __name__ == "__main__": if __name__ == "__main__":