| from .models import Resource | from .models import Resource | ||||
| from .resources import * | from .resources import * | ||||
| from .relationships import * | from .relationships import * | ||||
| from .practice_markdown import * | |||||
| from . import db | from . import db | ||||
| import os | import os | ||||
| import re | import re |
| # @name: practice_markdown.py | |||||
| # @creation_date: 2024-02-07 | |||||
| # @license: The MIT License <https://opensource.org/licenses/MIT> | |||||
| # @author: Simon Bowie <ad7588@coventry.ac.uk> | |||||
| # @purpose: functions for retrieving Markdown for practices | |||||
| # @acknowledgements: | |||||
| import os | |||||
| import markdown | |||||
| # function to get practice from Markdown file | |||||
| def get_practice_markdown(practice_name, option='html'): | |||||
| practice_name = practice_name.replace(" ", "_") | |||||
| file_path = f'content/practices/{practice_name}.md' | |||||
| if not os.path.exists(file_path): | |||||
| return "" | |||||
| try: | |||||
| with open(file_path, 'r') as f: | |||||
| practice_text = f.read() | |||||
| if option == 'html': | |||||
| practice_text = markdown.markdown(practice_text) | |||||
| return practice_text | |||||
| except Exception as e: | |||||
| return f"Error: {str(e)}" | |||||
| # function to write new or edited practice to Markdown file | |||||
| def write_practice_markdown(practice_name, markdown): | |||||
| practice_name = practice_name.replace(" ", "_") | |||||
| with open(f'content/practices/{practice_name}.md', 'w+') as f: | |||||
| f.write(markdown) | |||||
| # function to extract only the first paragraph of practice Markdown | |||||
| def extract_first_paragraph(markdown): | |||||
| # Split the text into lines | |||||
| lines = markdown.split("\n") | |||||
| # Initialize a flag to track when we find the first paragraph | |||||
| paragraph = [] | |||||
| for line in lines: | |||||
| # Ignore headings (lines starting with #) | |||||
| if line.startswith("#"): | |||||
| continue | |||||
| # If the line is not empty, it's part of a paragraph | |||||
| if line.strip(): | |||||
| paragraph.append(line.strip()) | |||||
| elif paragraph: # Stop once we have collected a paragraph and hit an empty line | |||||
| break | |||||
| return " ".join(paragraph) |
| from .models import Resource | from .models import Resource | ||||
| from .models import Relationship | from .models import Relationship | ||||
| from . import db | from . import db | ||||
| from .practice_markdown import get_practice_markdown, extract_first_paragraph | |||||
| import markdown | import markdown | ||||
| # function to retrieve linked resources | # function to retrieve linked resources | ||||
| else: | else: | ||||
| resource.__dict__['tools'].append(relationship) | resource.__dict__['tools'].append(relationship) | ||||
| elif relationship.type == 'practice': | elif relationship.type == 'practice': | ||||
| # render Markdown as HTML | |||||
| relationship.description = markdown.markdown(relationship.description) | |||||
| if not relationship.description: | |||||
| # fill the description field with the first paragraph of the associated practice Markdown file | |||||
| practice_markdown = get_practice_markdown(relationship.name, 'markdown') | |||||
| if practice_markdown: | |||||
| description = extract_first_paragraph(practice_markdown) | |||||
| relationship.description = description | |||||
| if 'practices' not in resource.__dict__.keys(): | if 'practices' not in resource.__dict__.keys(): | ||||
| resource.__dict__['practices'] = [] | resource.__dict__['practices'] = [] | ||||
| resource.__dict__['practices'].append(relationship) | resource.__dict__['practices'].append(relationship) |
| resource.__dict__['commitDate'] = date | resource.__dict__['commitDate'] = date | ||||
| return resource | return resource | ||||
| # function to get practice from Markdown file | |||||
| def get_practice_markdown(practice_name, option='html'): | |||||
| file_name = practice_name.replace(" ", "_") | |||||
| with open(f'content/practices/{file_name}.md', 'r') as f: | |||||
| practice_text = f.read() | |||||
| if option == 'html': | |||||
| practice_text = markdown.markdown(practice_text) | |||||
| return practice_text | |||||
| # function to write new or edited practice to Markdown file | |||||
| def write_practice_markdown(practice_name, markdown): | |||||
| practice_name = practice_name.replace(" ", "_") | |||||
| with open(f'content/practices/{practice_name}.md', 'w+') as f: | |||||
| f.write(markdown) | |||||
| # function to extract only the first paragraph of practice Markdown | |||||
| def extract_first_paragraph(markdown): | |||||
| # Split the text into lines | |||||
| lines = markdown.split("\n") | |||||
| # Initialize a flag to track when we find the first paragraph | |||||
| paragraph = [] | |||||
| for line in lines: | |||||
| # Ignore headings (lines starting with #) | |||||
| if line.startswith("#"): | |||||
| continue | |||||
| # If the line is not empty, it's part of a paragraph | |||||
| if line.strip(): | |||||
| paragraph.append(line.strip()) | |||||
| elif paragraph: # Stop once we have collected a paragraph and hit an empty line | |||||
| break | |||||
| return " ".join(paragraph) | |||||
| # function to retrieve data about a curated list of resources | # function to retrieve data about a curated list of resources | ||||
| def get_curated_resources(resource_ids): | def get_curated_resources(resource_ids): | ||||
| resources = Resource.query.filter(Resource.id.in_(resource_ids)).filter_by(published=True).order_by(func.random()).all() | resources = Resource.query.filter(Resource.id.in_(resource_ids)).filter_by(published=True).order_by(func.random()).all() |
| {% endmacro %} | {% endmacro %} | ||||
| {% macro relationships_links(resource) %} | {% macro relationships_links(resource) %} | ||||
| {% if resource.tools %} | |||||
| <div class=""> | |||||
| <div class="px-4 mt-16 lg:mt-0"> | |||||
| Tools | |||||
| </div> | |||||
| {% for tool in resource.tools %} | |||||
| <div class="cell"> | |||||
| {{ resource_lead(tool,size=2) }} | |||||
| </div> | |||||
| {% endfor %} | |||||
| {% if resource.tools %} | |||||
| <div class=""> | |||||
| <div class="px-4 mt-16 lg:mt-0"> | |||||
| Tools | |||||
| </div> | |||||
| {% for tool in resource.tools %} | |||||
| <div class="cell"> | |||||
| {{ resource_lead(tool,size=2) }} | |||||
| </div> | |||||
| {% endfor %} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% if resource.books %} | |||||
| <div class=""> | |||||
| <div class="px-4 mt-16 lg:mt-0"> | |||||
| Books | |||||
| </div> | </div> | ||||
| {% endif %} | |||||
| {% if resource.books %} | |||||
| <div class=""> | |||||
| <div class="px-4 mt-16 lg:mt-0"> | |||||
| Books | |||||
| </div> | |||||
| {% for book in resource.books %} | |||||
| <div class="cell"> | |||||
| {{ resource_lead(book,size=2) }} | |||||
| </div> | |||||
| {% endfor %} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% if resource.practices %} | |||||
| <div class=""> | |||||
| <div class="px-4 mt-16 lg:mt-0"> | |||||
| Practices | |||||
| {% for book in resource.books %} | |||||
| <div class="cell"> | |||||
| {{ resource_lead(book,size=2) }} | |||||
| </div> | |||||
| {% endfor %} | |||||
| </div> | </div> | ||||
| {% endif %} | |||||
| {% if resource.practices %} | |||||
| <div class=""> | |||||
| <div class="px-4 mt-16 lg:mt-0"> | |||||
| Practices | |||||
| </div> | |||||
| {% for practice in resource.practices %} | |||||
| <div class="cell"> | |||||
| {{ resource_lead(practice,size=2) }} | |||||
| {% for practice in resource.practices %} | |||||
| <div class="cell"> | |||||
| {{ resource_lead(practice,size=2) }} | |||||
| </div> | |||||
| {% endfor %} | |||||
| </div> | </div> | ||||
| {% endfor %} | |||||
| </div> | |||||
| {% endif %} | |||||
| {% endif %} | |||||
| {% endmacro %} | {% endmacro %} | ||||
| {% macro resource_list(resource, loop, show_number=true) %} | {% macro resource_list(resource, loop, show_number=true) %} |