You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

407 lines
15 KiB
Python

import os
import shutil
import json
import subprocess
import markdown
from jinja2 import Environment, FileSystemLoader
# automatico open click
def delete_project():
cms_file = "cms.json"
if not os.path.exists(cms_file):
print("No projects found. Please generate a template directory first.")
return
with open(cms_file, 'r') as f:
cms_data = json.load(f)
# Check if categories exist
if not cms_data.get("categories"):
print("Error: No categories found in the CMS.")
return
# List available projects
print("Available projects:")
for i, (project_slug, project_data) in enumerate(cms_data["projects"].items(), start=1):
project_name = project_data.get("name", "")
print("{}. {}".format(i, project_name))
# Ask user to choose a project to edit
project_index = int(input("Enter the number of the project to edit: ")) - 1
project_slug = list(cms_data["projects"].keys())[project_index]
cms_data['projects'].pop(project_slug)
with open(cms_file, 'w') as file:
json.dump(cms_data, file, indent=2)
shutil.rmtree(f'website/projects/{project_slug}')
print(f"Removed '{project_index}' from the projects.")
def generate_template():
project_name_it = input("Enter the name of the project in italian: ")
project_name_en = input("Enter the name of the project in english: ")
project_slug = project_name_it.lower().replace(" ", "_")
project_dir = os.path.join("website/projects", project_slug)
en_dir = os.path.join(project_dir, "en")
assets_dir = os.path.join(project_dir, "assets")
markdown_file = os.path.join(project_dir, "content.md")
markdown_en_file = os.path.join(en_dir, "content.md")
cms_file = "cms.json"
os.makedirs(en_dir, exist_ok=True)
os.makedirs(assets_dir, exist_ok=True)
open(markdown_file, 'a').close() # Create empty markdown files
open(markdown_en_file, 'a').close()
# Update or create a key in the JSON file
if os.path.exists(cms_file):
with open(cms_file, 'r') as f:
cms_data = json.load(f)
else:
os.makedirs("website/en", exist_ok=True)
cms_data = {"projects":{}, "categories":[]} # Initialize categories list
cms_data["projects"][project_slug] = {"name": [project_name_it, project_name_en]}
with open(cms_file, 'w') as f:
json.dump(cms_data, f, indent=4)
print("Template directory created for project '{}'.\n"
"Add images to '{}' and write content in '{}'.".format(project_name_it, assets_dir, markdown_file))
def add_categories_to_cms():
cms_file = "cms.json"
if not os.path.exists(cms_file):
print("No projects found. Please generate a template directory first.")
return
with open(cms_file, 'r') as f:
cms_data = json.load(f)
category = []
categories = cms_data.get("categories", [])
categoryIt = input("Enter the name of the category to add in italian: ")
categoryEn = input("Enter the name of the category to add in english: ")
category = [categoryIt, categoryEn]
categories.append(category)
cms_data["categories"] = categories
with open(cms_file, 'w') as f:
json.dump(cms_data, f, indent=4)
print("Category '{}' added to CMS.".format(category))
def prepare_project():
cms_file = "cms.json"
if not os.path.exists(cms_file):
print("No projects found. Please generate a template directory first.")
return
with open(cms_file, 'r') as f:
cms_data = json.load(f)
# Check if categories exist
if not cms_data.get("categories"):
print("Error: No categories found in the CMS.")
return
# List available projects
print("Available projects:")
for i, (project_slug, project_data) in enumerate(cms_data["projects"].items(), start=1):
project_name = project_data.get("name", "")
print("{}. {}".format(i, project_name))
# Ask user to choose a project to edit
project_index = int(input("Enter the number of the project to edit: ")) - 1
project_slug = list(cms_data["projects"].keys())[project_index]
project_data = cms_data["projects"][project_slug]
project_name = project_data.get("name", "")
# List available categories
print("Available categories:")
for i, category in enumerate(cms_data["categories"], start=1):
print("{}. {}".format(i, category))
# Check if there are no categories
if not cms_data["categories"]:
print("Error: No categories found in the CMS.")
return
# Ask user to choose a category
category_index = int(input("Enter the number of the category to assign to the project: ")) - 1
selected_category = cms_data["categories"][category_index]
# Update project data with the selected category
project_data["category"] = selected_category
# Proceed with editing the selected project
project_dir = os.path.join("website/projects", project_slug)
en_dir = os.path.join(project_dir, "en")
assets_dir = os.path.join(project_dir, "assets")
# compressed_dir = os.path.join(assets_dir, "compressed")
markdown_file = os.path.join(project_dir, "content.md")
markdown_en_file = os.path.join(en_dir, "content.md")
# Check if assets folder exists
if not os.path.exists(assets_dir):
print("Error: Assets folder not found for project '{}'. "
"Please make sure the 'assets' folder exists.".format(project_name))
return
# Check if there are no pictures in the assets folder
if not os.listdir(assets_dir):
print("Error: No pictures found in the 'assets' folder for project '{}'."
" Please add pictures before proceeding.".format(project_name))
return
# Compress/resize images
# os.makedirs(compressed_dir, exist_ok=True)
image_files = [f for f in sorted(os.listdir(assets_dir)) if os.path.isfile(os.path.join(assets_dir, f))]
for image_file in image_files:
if not image_file.startswith('compress') and image_file != '.DS_Store':
# print(image_file)
subprocess.run(["magick", os.path.join(assets_dir, image_file), "-unsharp", "0.25x0.25+8+0.065", "-resize", "1280x1024\>", "-density", "180", os.path.join(assets_dir, image_file)])
os.rename(os.path.join(assets_dir, image_file), os.path.join(assets_dir, 'compressed_'+image_file.replace(' ', '_')))
image_files = [f for f in sorted(os.listdir(assets_dir)) if os.path.isfile(os.path.join(assets_dir, f))]
# Prompt user to select main picture
print("Available pictures:")
for i, image_file in enumerate(image_files, start=1):
if image_file != '.DS_Store':
print("{}. {}".format(i, image_file))
print("Enter the number of the main picture (or press Enter to keep current): ")
main_picture_index = input()
if main_picture_index:
main_picture_index = int(main_picture_index) - 1
if 0 <= main_picture_index < len(image_files):
main_picture = image_files[main_picture_index]
else:
print("Invalid picture number. Keeping current main picture.")
main_picture = project_data.get("main_picture", "")
else:
main_picture = project_data.get("main_picture", "")
# Prompt user to choose if main picture appears in the gallery
main_in_gallery = True
main_in_gallery_boolean = input("Do you want the main picture be in the gallery? Yes / No: ")
if main_in_gallery_boolean == "yes" or main_in_gallery_boolean == "Yes":
main_in_gallery = True
else:
main_in_gallery = False
# Prompt user to update captions for images
captions_it = project_data.get("captions_it", {})
captions_en = project_data.get("captions_en", {})
# clear the dictionary???
captions_it.clear()
captions_en.clear()
for image_file in image_files:
if image_file != '.DS_Store':
if not main_in_gallery:
if image_file == main_picture:
continue
# print("Current caption for '{}' (Italian): {}".format(image_file, captions_it.get(image_file, "No caption")))
# new_caption_it = input("Enter new caption for '{}' (Italian) (press Enter to keep current): ".format(image_file)).strip()
# if new_caption_it:
# captions_it[image_file] = new_caption_it
# elif image_file not in captions_it:
captions_it[image_file] = ""
# print("Current caption for '{}' (English): {}".format(image_file, captions_en.get(image_file, "No caption")))
# new_caption_en = input("Enter new caption for '{}' (English) (press Enter to keep current): ".format(image_file)).strip()
# if new_caption_en:
# captions_en[image_file] = new_caption_en
# elif image_file not in captions_en:
captions_en[image_file] = ""
# Prompt user to update video URL
print("Current video URL: {}".format(project_data.get("video_url", "None")))
video_url = input("Enter new video URL (press Enter to keep current): ").strip()
if not video_url:
video_url = project_data.get("video_url", "")
# Convert markdown file to HTML for Italian
with open(markdown_file, 'r') as f:
markdown_content_it = f.read()
markdown_content_it = markdown.markdown(markdown_content_it)
html_content_it = markdown_content_it
# Convert markdown file to HTML for English
with open(markdown_en_file, 'r') as f:
markdown_content_en = f.read()
markdown_content_en = markdown.markdown(markdown_content_en)
html_content_en = markdown_content_en
# Update project data in JSON file
project_data["main_picture"] = main_picture
project_data["captions_it"] = captions_it
project_data["captions_en"] = captions_en
project_data["video_url"] = video_url
project_data["html_content_it"] = html_content_it
project_data["html_content_en"] = html_content_en
# Save updated JSON file
with open(cms_file, 'w') as f:
json.dump(cms_data, f, indent=4)
print("Project preparation complete.")
def generate_website():
cms_file = "cms.json"
if not os.path.exists(cms_file):
print("No projects found. Please generate a template directory first.")
return
with open(cms_file, 'r') as f:
cms_data = json.load(f)
# markdown misc content
misc_content_en = {}
misc_content_it = {}
# Get a list of Markdown files in the 'en' folder
markdown_files_en = [f for f in os.listdir('misc/en') if f.endswith('.md')]
# Iterate through each Markdown file in the 'en' folder
for file_name in markdown_files_en:
file_path = os.path.join('misc/en', file_name)
# Read the content of the Markdown file
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
# Convert Markdown content to HTML
html_content = markdown.markdown(content)
# Store the HTML content in the dictionary with the file name as the key
misc_content_en[file_name.replace('.md','')] = html_content
# Get a list of Markdown files in the 'it' folder
markdown_files_it = [f for f in os.listdir('misc/it') if f.endswith('.md')]
# Iterate through each Markdown file in the 'it' folder
for file_name in markdown_files_it:
file_path = os.path.join('misc/it', file_name)
# Read the content of the Markdown file
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
# Convert Markdown content to HTML
html_content = markdown.markdown(content)
# Store the HTML content in the dictionary with the file name as the key
misc_content_it[file_name.replace('.md','')] = html_content
gallery_pics = [f for f in sorted(os.listdir('website/galleria')) if not f.startswith('.')]
# Get gallery images
# os.makedirs('website/galleria/compressed', exist_ok=True)
# Compress/resize images
for gallery_pic in gallery_pics:
if not gallery_pic.startswith('compress') and gallery_pic != '.DS_Store':
subprocess.run(["magick", os.path.join('website/galleria', gallery_pic), "-unsharp", "0.25x0.25+8+0.065", "-resize", "1280x1024\>", "-density", "180", os.path.join('website/galleria/', gallery_pic)])
os.rename(os.path.join('website/galleria', gallery_pic), os.path.join('website/galleria', 'compressed_'+gallery_pic.replace(' ', '_')))
# Initialize Jinja environment
env = Environment(loader=FileSystemLoader('.'))
# Render index page
# In italian
index_template_it = env.get_template('template/index_template.html')
index_html_it = index_template_it.render(cms_data=cms_data, gallery_pics=gallery_pics, misc_content=misc_content_it)
with open('website/index.html', 'w') as index_file:
index_file.write(index_html_it)
# In english
index_template_en = env.get_template('template/index_template_en.html')
index_html_en = index_template_en.render(cms_data=cms_data, gallery_pics=gallery_pics, misc_content=misc_content_en)
with open('website/en/index.html', 'w') as index_file:
index_file.write(index_html_en)
# Render project pages
# In Italian
project_template = env.get_template('template/project_template.html')
for project, values in cms_data["projects"].items():
project_html = project_template.render(values=values, cms_data=cms_data, misc_content=misc_content_it)
project_dir = os.path.join("website/projects", project)
with open(os.path.join(project_dir, "index.html"), 'w') as project_file:
project_file.write(project_html)
# In english
project_template_en = env.get_template('template/project_template_en.html')
for project, values in cms_data["projects"].items():
project_html = project_template_en.render(values=values, cms_data=cms_data, misc_content=misc_content_en)
project_dir = os.path.join("website/projects/", project,'en/')
with open(os.path.join(project_dir, "index.html"), 'w') as project_file:
project_file.write(project_html)
print("Website generation complete.")
def main():
print("Select an option:")
print("1. Generate a template directory")
print("2. Prepare a project by scanning the directory")
print("3. Add categories")
print("4. Generate the website")
print("5. Delete a project")
print("6. Exit")
choice = input("Enter your choice (1, 2, 3, 4, 5 or 6): ")
if choice == '1':
generate_template()
elif choice == '2':
prepare_project()
elif choice == '3':
add_categories_to_cms()
elif choice == '4':
generate_website()
elif choice == '5':
delete_project()
elif choice == '6':
exit()
else:
print("Invalid choice. Please enter 1, 2, 3, 4, 5 or 6.")
main()
if __name__ == "__main__":
main()