Spaces:
Build error
Build error
| import streamlit as st | |
| import calendar | |
| from hijri_converter import Hijri, Gregorian | |
| from datetime import datetime | |
| import pandas as pd | |
| # Hijri Month Names | |
| hijri_months = [ | |
| "Muharram", "Safar", "Rabi' al-Awwal", "Rabi' al-Thani", "Jumada al-Awwal", | |
| "Jumada al-Thani", "Rajab", "Sha'ban", "Ramadan", "Shawwal", "Dhul-Qi'dah", "Dhul-Hijjah" | |
| ] | |
| # Helper function to get the Hijri month for a given Gregorian month and year | |
| def get_hijri_month(gregorian_year, gregorian_month): | |
| # Get the first day of the month in Gregorian | |
| first_day_of_month = Gregorian(gregorian_year, gregorian_month, 1).to_hijri() | |
| # Get the number of days in the Gregorian month | |
| _, num_days = calendar.monthrange(gregorian_year, gregorian_month) | |
| # Generate the Hijri days for this month | |
| hijri_days = [] | |
| for day in range(1, num_days + 1): | |
| gregorian_date = Gregorian(gregorian_year, gregorian_month, day) | |
| hijri_day = gregorian_date.to_hijri() | |
| hijri_days.append((day, hijri_day.month, hijri_day.day)) | |
| return hijri_months[first_day_of_month.month - 1], hijri_days | |
| # Main Streamlit App | |
| st.title("Hijri Calendar") | |
| # Get the current date in Gregorian | |
| current_date = datetime.today() | |
| gregorian_year = current_date.year | |
| # Sidebar for year navigation | |
| st.sidebar.header("Navigate Calendar") | |
| year = st.sidebar.slider("Select Year", 1900, 2100, gregorian_year) | |
| # Days of the week | |
| days_of_week = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] | |
| # Initialize the layout for displaying 12 months | |
| for i in range(12): | |
| hijri_month, hijri_days = get_hijri_month(year, i + 1) | |
| # Get Gregorian month name | |
| gregorian_month_name = calendar.month_name[i + 1] | |
| # Display both Gregorian and Hijri month names | |
| st.subheader(f"{gregorian_month_name} - {hijri_month}") | |
| # Create an empty list for the table data | |
| table_data = [] | |
| # Create a row to represent days of the week header | |
| table_data.append([f"{day}" for day in days_of_week]) | |
| # Create an empty row for the calendar days | |
| row = [None] * 7 # A row has 7 days (Sunday to Saturday) | |
| # Fill the table with the Hijri days | |
| for j, (gregorian_day, hijri_month, hijri_day) in enumerate(hijri_days): | |
| week_day = (gregorian_day + 6) % 7 # Find the weekday (0 = Sunday, 6 = Saturday) | |
| # Place the Gregorian and Hijri day in the correct position | |
| row[week_day] = f"{gregorian_day} ({hijri_day})" | |
| # If the row is full (7 days), add it to the table and reset the row | |
| if week_day == 6: | |
| table_data.append(row) | |
| row = [None] * 7 # Reset for the next row | |
| # If there are remaining days in the last row, append them | |
| if any(day is not None for day in row): | |
| table_data.append(row) | |
| # Create a DataFrame from the table data | |
| df = pd.DataFrame(table_data) | |
| # Display the table with custom styles | |
| st.markdown(f"### {hijri_month}") | |
| st.dataframe(df.style.set_properties( | |
| subset=[0, 1, 2, 3, 4, 5, 6], | |
| **{'width': '80px', 'text-align': 'center'} | |
| ).applymap(lambda x: 'background-color: #D1E8E2' if x is not None else '', subset=pd.IndexSlice[1:, :])) # Color alternating rows | |
| # Add a separator between months | |
| st.write("---") | |