Spaces:
Sleeping
Sleeping
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("---") | |