import streamlit as st
from diff_match_patch import diff_match_patch
import re
def main():
st.set_page_config(page_title="Text Comparison Tool", layout="wide")
st.title("Text Comparison Tool")
# Initialize session state
if 'old_text' not in st.session_state:
st.session_state.old_text = ""
if 'new_text' not in st.session_state:
st.session_state.new_text = ""
# Create two columns for text areas
col1, col2 = st.columns(2)
with col1:
st.session_state.old_text = st.text_area(
"Old Text:",
height=300,
value=st.session_state.old_text,
placeholder="Enter original text..."
)
with col2:
# Display diffs directly in the New Text area
new_text_display = st.empty()
# Show either editable text area or diff result
if 'show_diff' not in st.session_state or not st.session_state.show_diff:
st.session_state.new_text = new_text_display.text_area(
"New Text:",
height=300,
value=st.session_state.new_text,
placeholder="Enter modified text...",
key="new_text_editable"
)
else:
new_text_display.markdown(
st.session_state.diff_html,
unsafe_allow_html=True
)
# Button controls
col_compare, col_clear, col_copy = st.columns([1, 1, 1])
with col_compare:
if st.button("Compare"):
dmp = diff_match_patch()
diffs = dmp.diff_main(st.session_state.old_text, st.session_state.new_text)
dmp.diff_cleanupSemantic(diffs)
html = []
for op, text in diffs:
text = text.replace("\n", "
")
if op == 1: # Insertion
html.append(f'{text}')
elif op == -1: # Deletion
html.append(f'{text}')
else:
html.append(text)
st.session_state.diff_html = "".join(html)
st.session_state.show_diff = True
st.rerun()
with col_clear:
if st.button("Clear"):
st.session_state.old_text = ""
st.session_state.new_text = ""
st.session_state.show_diff = False
st.rerun()
# Copy functionality
with col_copy:
if st.button("Copy Result"):
if 'diff_html' in st.session_state:
clean_text = re.sub(r'
', '\n', st.session_state.diff_html)
clean_text = re.sub(r'<[^>]+>', '', clean_text)
try:
import pyperclip
pyperclip.copy(clean_text)
st.success("Result copied to clipboard!")
except:
st.error("Clipboard access requires extra permissions. Please copy manually:")
st.code(clean_text)
else:
st.warning("No comparison result to copy")
if __name__ == "__main__":
main()