File size: 5,264 Bytes
d6caebb 28c3b21 9d12e16 28c3b21 20dfeac 28c3b21 9d12e16 fed1cb1 20dfeac 28c3b21 20dfeac 9d12e16 20dfeac 28c3b21 9d12e16 20dfeac 9d12e16 20dfeac 9d12e16 20dfeac 9d12e16 20dfeac 28c3b21 9d12e16 28c3b21 20dfeac 28c3b21 9d12e16 28c3b21 9d12e16 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
# to-do: add credits + improvize the app a bit more!
import streamlit as st
from few_shot import FewShotPosts
from post_generator import generate_post
import json
def main():
st.set_page_config(page_title="LinkedIn Post Generator", layout="wide")
st.title("π LinkedIn Post Generator")
st.markdown("**Create impactful LinkedIn posts effortlessly.** Customize your post with advanced options, analyze generated content, and save your creations.")
# Sidebar for settings
st.sidebar.title("π§ Customization Options")
st.sidebar.markdown("Use these settings to personalize your post.")
fs = FewShotPosts()
tags = fs.get_tags()
# User input sections
st.sidebar.subheader("Post Preferences")
selected_tag = st.sidebar.selectbox("Topic (Tag):", options=tags)
selected_length = st.sidebar.radio("Post Length:", ["Short", "Medium", "Long"])
selected_language = st.sidebar.radio("Language:", ["English", "Hinglish"])
selected_tone = st.sidebar.selectbox("Tone/Style:", ["Motivational", "Professional", "Informal", "Neutral"])
custom_context = st.sidebar.text_area("Additional Context (Optional):", placeholder="Provide extra details...")
# Initialize session state
if "generated_posts" not in st.session_state:
st.session_state.generated_posts = []
# Tabs for different modes
tabs = st.tabs(["Generate Post", "Edit Post", "Analyze Post", "History", "Save/Share"])
# Tab 1: Generate Post
with tabs[0]:
st.subheader("Create a Post")
if st.button("Generate Post"):
with st.spinner("Generating your post..."):
try:
post = generate_post(selected_length, selected_language, selected_tag, selected_tone)
# Add tone and context dynamically
if selected_tone:
post = f"**Tone**: {selected_tone}\n\n{post}"
if custom_context:
post += f"\n\n**Additional Context**: {custom_context}"
# Save to session history
st.session_state.generated_posts.append(post)
st.success("Post generated successfully!")
st.markdown("### Your LinkedIn Post:")
st.markdown(f"<div style='background-color: #f9f9f9; padding: 10px; border-radius: 5px;'>{post}</div>", unsafe_allow_html=True)
except Exception as e:
st.error(f"An error occurred: {e}")
# Tab 2: Edit Post
with tabs[1]:
st.subheader("Edit Your Post")
if st.session_state.generated_posts:
editable_post = st.text_area("Edit your post:", st.session_state.generated_posts[-1])
if st.button("Save Changes"):
st.session_state.generated_posts[-1] = editable_post
st.success("Post updated!")
else:
st.info("Generate a post to edit.")
# Tab 3: Analyze Post
with tabs[2]:
st.subheader("Analyze Your Post")
if st.session_state.generated_posts:
post_to_analyze = st.session_state.generated_posts[-1]
st.markdown("### Post for Analysis:")
st.write(post_to_analyze)
post_analysis(post_to_analyze)
else:
st.info("Generate a post to analyze.")
# Tab 4: Post History
with tabs[3]:
st.subheader("Generated Posts History")
if st.session_state.generated_posts:
for i, post in enumerate(reversed(st.session_state.generated_posts), start=1):
with st.expander(f"Post {i}"):
st.write(post)
else:
st.info("No posts generated yet.")
# Tab 5: Save or Share
with tabs[4]:
st.subheader("Save or Share Your Post")
if st.session_state.generated_posts:
if st.button("Download All Posts"):
download_posts(st.session_state.generated_posts)
if st.button("Clear History"):
st.session_state.generated_posts = []
st.info("History cleared!")
else:
st.info("No posts to save or share.")
def post_analysis(post):
"""Perform basic analysis of the generated post."""
word_count = len(post.split())
char_count = len(post)
tone_keywords = {
"Motivational": ["inspire", "achieve", "goal", "success"],
"Professional": ["expertise", "career", "opportunity", "industry"],
"Informal": ["hey", "cool", "fun", "awesome"],
}
st.metric("Word Count", word_count)
st.metric("Character Count", char_count)
# Detect tone based on keywords (simple heuristic)
detected_tone = "Neutral"
for tone, keywords in tone_keywords.items():
if any(keyword in post.lower() for keyword in keywords):
detected_tone = tone
break
st.metric("Detected Tone", detected_tone)
def download_posts(posts):
"""Allow users to download their posts."""
posts_json = json.dumps(posts, indent=4)
st.download_button(
label="π₯ Download Posts",
data=posts_json,
file_name="generated_posts.json",
mime="application/json",
)
if __name__ == "__main__":
main()
|