forked from open-webui/open-webui
		
	refac: changelog api
This commit is contained in:
		
							parent
							
								
									ea0253828d
								
							
						
					
					
						commit
						a84070c6d3
					
				
					 2 changed files with 65 additions and 66 deletions
				
			
		|  | @ -6,6 +6,8 @@ from base64 import b64encode | ||||||
| from constants import ERROR_MESSAGES | from constants import ERROR_MESSAGES | ||||||
| from pathlib import Path | from pathlib import Path | ||||||
| import json | import json | ||||||
|  | import markdown | ||||||
|  | from bs4 import BeautifulSoup | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| try: | try: | ||||||
|  | @ -31,6 +33,67 @@ except: | ||||||
| 
 | 
 | ||||||
| VERSION = PACKAGE_DATA["version"] | VERSION = PACKAGE_DATA["version"] | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | # Function to parse each section | ||||||
|  | def parse_section(section): | ||||||
|  |     items = [] | ||||||
|  |     for li in section.find_all("li"): | ||||||
|  |         # Extract raw HTML string | ||||||
|  |         raw_html = str(li) | ||||||
|  | 
 | ||||||
|  |         # Extract text without HTML tags | ||||||
|  |         text = li.get_text(separator=" ", strip=True) | ||||||
|  | 
 | ||||||
|  |         # Split into title and content | ||||||
|  |         parts = text.split(": ", 1) | ||||||
|  |         title = parts[0].strip() if len(parts) > 1 else "" | ||||||
|  |         content = parts[1].strip() if len(parts) > 1 else text | ||||||
|  | 
 | ||||||
|  |         items.append({"title": title, "content": content, "raw": raw_html}) | ||||||
|  |     return items | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | try: | ||||||
|  |     with open("../CHANGELOG.md", "r") as file: | ||||||
|  |         changelog_content = file.read() | ||||||
|  | except: | ||||||
|  |     changelog_content = "" | ||||||
|  | 
 | ||||||
|  | # Convert markdown content to HTML | ||||||
|  | html_content = markdown.markdown(changelog_content) | ||||||
|  | 
 | ||||||
|  | # Parse the HTML content | ||||||
|  | soup = BeautifulSoup(html_content, "html.parser") | ||||||
|  | 
 | ||||||
|  | # Initialize JSON structure | ||||||
|  | changelog_json = {} | ||||||
|  | 
 | ||||||
|  | # Iterate over each version | ||||||
|  | for version in soup.find_all("h2"): | ||||||
|  |     version_number = version.get_text().strip().split(" - ")[0][1:-1]  # Remove brackets | ||||||
|  |     date = version.get_text().strip().split(" - ")[1] | ||||||
|  | 
 | ||||||
|  |     version_data = {"date": date} | ||||||
|  | 
 | ||||||
|  |     # Find the next sibling that is a h3 tag (section title) | ||||||
|  |     current = version.find_next_sibling() | ||||||
|  | 
 | ||||||
|  |     print(current) | ||||||
|  | 
 | ||||||
|  |     while current and current.name != "h2": | ||||||
|  |         if current.name == "h3": | ||||||
|  |             section_title = current.get_text().lower()  # e.g., "added", "fixed" | ||||||
|  |             section_items = parse_section(current.find_next_sibling("ul")) | ||||||
|  |             version_data[section_title] = section_items | ||||||
|  | 
 | ||||||
|  |         # Move to the next element | ||||||
|  |         current = current.find_next_sibling() | ||||||
|  | 
 | ||||||
|  |     changelog_json[version_number] = version_data | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | CHANGELOG = changelog_json | ||||||
|  | 
 | ||||||
| #################################### | #################################### | ||||||
| # DATA/FRONTEND BUILD DIR | # DATA/FRONTEND BUILD DIR | ||||||
| #################################### | #################################### | ||||||
|  |  | ||||||
|  | @ -20,7 +20,7 @@ from apps.rag.main import app as rag_app | ||||||
| 
 | 
 | ||||||
| from apps.web.main import app as webui_app | from apps.web.main import app as webui_app | ||||||
| 
 | 
 | ||||||
| from config import ENV, VERSION, FRONTEND_BUILD_DIR | from config import ENV, VERSION, CHANGELOG, FRONTEND_BUILD_DIR | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class SPAStaticFiles(StaticFiles): | class SPAStaticFiles(StaticFiles): | ||||||
|  | @ -79,73 +79,9 @@ async def get_app_config(): | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # Function to parse each section |  | ||||||
| def parse_section(section): |  | ||||||
|     items = [] |  | ||||||
|     for li in section.find_all("li"): |  | ||||||
|         # Extract raw HTML string |  | ||||||
|         raw_html = str(li) |  | ||||||
| 
 |  | ||||||
|         # Extract text without HTML tags |  | ||||||
|         text = li.get_text(separator=" ", strip=True) |  | ||||||
| 
 |  | ||||||
|         # Split into title and content |  | ||||||
|         parts = text.split(": ", 1) |  | ||||||
|         title = parts[0].strip() if len(parts) > 1 else "" |  | ||||||
|         content = parts[1].strip() if len(parts) > 1 else text |  | ||||||
| 
 |  | ||||||
|         items.append({"title": title, "content": content, "raw": raw_html}) |  | ||||||
|     return items |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @app.get("/api/changelog") | @app.get("/api/changelog") | ||||||
| async def get_app_changelog(): | async def get_app_changelog(): | ||||||
|     try: |     return CHANGELOG | ||||||
|         with open("../CHANGELOG.md", "r") as file: |  | ||||||
|             changelog_content = file.read() |  | ||||||
|         # Convert markdown content to HTML |  | ||||||
|         html_content = markdown.markdown(changelog_content) |  | ||||||
| 
 |  | ||||||
|         # Parse the HTML content |  | ||||||
|         soup = BeautifulSoup(html_content, "html.parser") |  | ||||||
| 
 |  | ||||||
|         print(soup) |  | ||||||
|         # Initialize JSON structure |  | ||||||
|         changelog_json = {} |  | ||||||
| 
 |  | ||||||
|         # Iterate over each version |  | ||||||
|         for version in soup.find_all("h2"): |  | ||||||
|             version_number = ( |  | ||||||
|                 version.get_text().strip().split(" - ")[0][1:-1] |  | ||||||
|             )  # Remove brackets |  | ||||||
|             date = version.get_text().strip().split(" - ")[1] |  | ||||||
| 
 |  | ||||||
|             version_data = {"date": date} |  | ||||||
| 
 |  | ||||||
|             # Find the next sibling that is a h3 tag (section title) |  | ||||||
|             current = version.find_next_sibling() |  | ||||||
| 
 |  | ||||||
|             print(current) |  | ||||||
| 
 |  | ||||||
|             while current and current.name != "h2": |  | ||||||
|                 if current.name == "h3": |  | ||||||
|                     section_title = current.get_text().lower()  # e.g., "added", "fixed" |  | ||||||
|                     section_items = parse_section(current.find_next_sibling("ul")) |  | ||||||
|                     version_data[section_title] = section_items |  | ||||||
| 
 |  | ||||||
|                 # Move to the next element |  | ||||||
|                 current = current.find_next_sibling() |  | ||||||
| 
 |  | ||||||
|             changelog_json[version_number] = version_data |  | ||||||
| 
 |  | ||||||
|         # print(changelog_json) |  | ||||||
| 
 |  | ||||||
|         # Return content as JSON string |  | ||||||
|         return changelog_json |  | ||||||
|     except FileNotFoundError: |  | ||||||
|         return {"error": "readme.md not found"} |  | ||||||
|     except Exception as e: |  | ||||||
|         return {"error": f"An error occurred: {e}"} |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| app.mount( | app.mount( | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy J. Baek
						Timothy J. Baek