from typing import List import streamlit as st import extra_streamlit_components as stx from streamlit_searchbox import st_searchbox from pathlib import Path from streamlit_tags import st_tags from src.tools import hf_pull_skill, time_ago from src.skill_db import SkillsDB from src.schema import Skill st.title("Skill Library Hub") skill_db = SkillsDB('skills.db') all_skills = skill_db.get_skills() all_tags = skill_db.get_tags() if all_skills is None: all_skills = [] def search(searchterm: str) -> List[any]: global all_skills global skill_db if all_skills is None: if skill_db is None: skill_db = SkillsDB('skills.db') all_skills = skill_db.get_skills() result = [] if all_skills is not None and len(all_skills) > 0: for skill in all_skills: if searchterm.lower() in skill.skill_name.lower(): result.append(skill.skill_name.lower()) if searchterm.lower() in skill.author.lower(): result.append(skill.author.lower()) if len(result)>10: return result if len(result)<3: for skill in all_skills: if searchterm.lower() in skill.skill_description.lower(): result.append(skill.skill_description.lower()) if len(result)>10: return result return result return result program_languages = ["python", "r", "julia", "javascript", "html", "shell", "applescript"] def main_page(): global all_skills global skill_db if all_skills is None: if skill_db is None: skill_db = SkillsDB('skills.db') all_skills = skill_db.get_skills() selected_languages = [] selected_tags = [] with st.sidebar: st.title("🎈 Search Skills") with st.expander("✨ PROGRAM", True): if st.checkbox("Python"): selected_languages.append("python") if st.checkbox("Julia"): selected_languages.append("julia") if st.checkbox("R"): selected_languages.append("r") if st.checkbox("Javascript"): selected_languages.append("javascript") if st.checkbox("Html"): selected_languages.append("html") if st.checkbox("Shell"): selected_languages.append("shell") if st.checkbox("AppleScript"): selected_languages.append("applescript") with st.expander("🔖 TAGS", True): if all_tags is not None: for tag in all_tags: if st.checkbox(tag): selected_tags.append(tag) if not selected_languages: selected_languages = program_languages all_skills = [item for item in all_skills if item.skill_program_language in selected_languages] if not selected_tags and all_tags: selected_tags = all_tags all_skills = [item for item in all_skills if set(item.skill_tags) & set(selected_tags)] selected_value = st_searchbox( search, key="", ) print(f"selected_value: {selected_value}") selected_skills = all_skills if selected_value is None and len(selected_skills)!= len(all_skills): selected_skills = all_skills if selected_value is not None: all_skills = [item for item in all_skills if selected_value.lower() in item.skill_name.lower() or selected_value.lower() in item.author.lower() or selected_value.lower() in item.skill_description.lower()] if all_skills is not None and len(all_skills) > 0: for skill in all_skills: with st.expander(f"{skill.author}/{skill.skill_name}", expanded=True): tags = "`{}`".format("`\t\t`".join(skill.skill_tags)) st.markdown(f"{tags}") st.markdown(f"**{skill.author}/{skill.skill_name}**", unsafe_allow_html=True) st.markdown(f">**{skill.skill_description}**") st.markdown("Install:") install = f"import creator\ncreator.create(huggingface_repo_id=\"{skill.repo_id}\", huggingface_skill_path=\"{skill.skill_name}\")" st.code(install, language=skill.skill_program_language) st.markdown("Usage:") usage = f"{skill.skill_usage_example}" if skill.skill_program_language.lower() == "python": usage = f"from {skill.repo_id.replace('/', '.')}.skill_code import {skill.skill_name}\n"+usage st.code(usage, language=skill.skill_program_language) st.markdown(f"`Created {time_ago(skill.created_at)}` `{skill.skill_program_language}`") else: st.markdown(f"### 🎉 Search results for `{selected_value}`") st.markdown(f"**No results found**") def about_page(): file_path = "About.md" with open(file_path, 'r', encoding='utf-8') as file: content = file.read() st.write(content, unsafe_allow_html=True) def submit_page(): global all_skills global skill_db if all_skills is None: if skill_db is None: skill_db = SkillsDB('skills.db') all_skills = skill_db.get_skills() st.markdown(f"### ✉️✨ Submit your skill here!") with st.form(key='my_form'): skill_repository = st.text_input('Skill Repo Id:') skill_names = st_tags( label="Skills' name:", text='Press enter to add every skill folder', value=[], suggestions=[], maxtags = 10, key='1') if st.form_submit_button('Submit'): skills = [] if skill_names is not None and len(skill_names) > 0: for skill_name in skill_names: skill = hf_pull_skill(skill_repository, skill_name) skill["repo_id"] = skill_repository skills.append(skill) if skills is not None and len(skills) > 0: for skill in skills: if skill is not None: if skill not in all_skills: skill_obj = Skill(skill["repo_id"], skill["skill_name"], skill["skill_description"], skill["skill_metadata"]["author"], skill["skill_metadata"]["created_at"], skill["skill_usage_example"], skill["skill_program_language"], skill["skill_tags"]) result = skill_db.add_skill(skill_obj) if result != "ok": st.error(result) continue all_skills.append(skill_obj) chosen_id = stx.tab_bar(data=[ stx.TabBarItemData(id=1, title="🏅 Skill Library", description=""), stx.TabBarItemData(id=2, title="📝 About", description=""), stx.TabBarItemData(id=3, title="🚀 Submit here!", description=""), ], default=1) if chosen_id == '1': main_page() elif chosen_id == '2': about_page() elif chosen_id == '3': submit_page()