Prechádzať zdrojové kódy

[#1] Remove emojis from markdown manuals to eliminate system symbol font dependencies, and use portable relative font paths in CSS

Lange François 2 týždňov pred
rodič
commit
fe4ea0d3c0

BIN
Project.pdf


BIN
Retro Planning.pdf


BIN
delivery.zip


BIN
docs/Backup_Procedure.pdf


BIN
docs/Data_Ingestion.pdf


BIN
docs/Final_Report.pdf


BIN
docs/Installation_Guide.pdf


BIN
docs/Operator_Installation_Guide.pdf


BIN
docs/Scrum_Artifacts.pdf


BIN
docs/Scrum_Daily.pdf


BIN
docs/Scrum_Plan.pdf


BIN
docs/Scrum_Retro.pdf


BIN
docs/Scrum_Review.pdf


+ 2 - 2
docs/Scrum_Wiki.md

@@ -7,7 +7,7 @@ Welcome to the static Scrum documentation portal. This master wiki aggregates an
 
 ---
 
-## 📅 Sprint Ceremonies & Logs
+## Sprint Ceremonies & Logs
 
 ### 1. [Sprint Plans (Scrum_Plan.md)](Scrum_Plan.pdf)
 *Contains Sprint Plan formulations, active user stories selection, scope statements, and team capacity bounds for each milestone loop.*
@@ -23,7 +23,7 @@ Welcome to the static Scrum documentation portal. This master wiki aggregates an
 
 ---
 
-## 📊 Deliverables & Quality Assurance
+## Deliverables & Quality Assurance
 
 ### 5. [Scrum Artifacts (Scrum_Artifacts.md)](Scrum_Artifacts.pdf)
 *Indexes sprint velocity metrics, completed story points distributions, burndown coordinates, and final Taiga delivery milestones.*

BIN
docs/Scrum_Wiki.pdf


BIN
docs/Start_Stop_Procedures.pdf


BIN
docs/Technical_Document.pdf


BIN
docs/Test_Cases_Sprint8.pdf


BIN
docs/URL_Formats.pdf


BIN
docs/Uninstall_Guide.pdf


+ 6 - 6
docs/User_Description.md

@@ -12,25 +12,25 @@ Since the system operates entirely locally on local hypervisors, **zero patient
 
 ## 2. Core Functional Pillars
 
-### 📊 tab 1: Clinical Data Search (🔬 Clinical Search)
+### Tab 1: Clinical Data Search (Clinical Search)
 Allows practitioners to search the 24GB OpenFoodFacts dataset in real time (average query response time < 0.04 seconds).
 - **Dynamic Medical Warnings**: Based on the active patient profile, foods are immediately flagged in the search results:
-  - ⚠️ **Red Warning Flags**: Highlight high-risk ingredients (e.g. Unpasteurized dairy or raw fish for pregnant patients, high-sodium foods for hypertensive patients, or high-sugar foods for diabetic patients).
-  - 💚 **Green Recommendations**: Highlight recommended dietary components (e.g. High iron/calcium for pregnant or breastfeeding mothers, high Vitamin C for scurvy prevention, or high iron for anemia).
+  - [Warning] **Red Warning Flags**: Highlight high-risk ingredients (e.g. Unpasteurized dairy or raw fish for pregnant patients, high-sodium foods for hypertensive patients, or high-sugar foods for diabetic patients).
+  - [Recommended] **Green Recommendations**: Highlight recommended dietary components (e.g. High iron/calcium for pregnant or breastfeeding mothers, high Vitamin C for scurvy prevention, or high iron for anemia).
 - **Flexible Column Customization**: Multi-select column headers to inspect specific macro and micro-nutrients.
 
-### 💬 tab 2: AI Clinical Chat (💬 AI Chat)
+### Tab 2: AI Clinical Chat (AI Chat)
 An interactive NLP dialogue interface powered by a local lightweight LLM (**Qwen2.5:7b**).
 - **RAG-Driven Precision**: The AI dietitian automatically retrieves and reviews local database records and private meta-search results before formulating an answer.
 - **Dynamic Medical Guardrails**: The user's active illnesses, diets, and conditions are injected into the AI's system prompt in the background, forcing the AI to strictly enforce clinical safety constraints.
 
-### 🍽️ tab 3: My Plate Builder (🍽️ My Plate Builder)
+### Tab 3: My Plate Builder (My Plate Builder)
 A recipe formulation utility to calculate combined nutritional intake.
 - **Natural Language Parsing**: Enables entering quantities in natural units (e.g., "1.5 cups", "2 tablespoons", "150g").
 - **Exact Conversion**: The system translates these custom units into metric grams based on product density metrics.
 - **Macro Summaries**: Instantly calculates and displays the total combined Protein, Fat, and Carbohydrates.
 
-### 🤖 tab 4: AI Meal Planner (🤖 AI Meal Planner)
+### Tab 4: AI Meal Planner (AI Planner)
 An automated clinical diet planner.
 - Generates a multi-meal daily menu formatted strictly as a Markdown table.
 - Dynamically enforces user-defined calorie limits and active medical restrictions.

BIN
docs/User_Description.pdf


+ 4 - 4
docs/User_Guide.md

@@ -39,22 +39,22 @@ The left-hand sidebar houses several global settings:
 
 The application dashboard is split into three interactive workspace tabs:
 
-### 4.1. Clinical Data Search Tab 🔍
+### 4.1. Clinical Data Search Tab
 Use this tab to browse the local OpenFoodFacts food database.
 1. **Keyword Input**: Type a product name, brand, or barcode (e.g., "whole wheat bread" or "unpasteurized cheese").
 2. **Dynamic Results**: The database performs a rapid search, displaying the top 10 matched products.
 3. **Nutritional Score**: Shows the Nutri-Score grade (A to E) and details (Proteins, Carbs, Fats, Energy in kcal) per 100g.
 4. **Allergen Warnings**: Shows highlight flags if the product contains common allergens matching your client's needs.
 
-### 4.2. My Plate Builder Tab 🍽️
+### 4.2. My Plate Builder Tab
 Build custom meals or recipe portions to calculate total client nutritional intake.
 1. **Adding Items**: When browsing foods in the Search Tab, click **Add to Plate**.
 2. **Specifying Portions**: Input the quantity using either decimal weights (in grams) or common volume descriptors (e.g., "1.5 cups", "2 tablespoons"). The converter translates volume to metric weight based on the product density.
 3. **Cumulative Intake Table**: The tab renders a table summarizing individual macros and total energy.
 4. **Visual Metrics**: Renders a dynamic bar chart comparing Carbs, Proteins, and Fats against recommended clinical intake thresholds.
-5. **Editing the Plate**: Use the trash bin icon (🗑️) to instantly remove any item from the calculation.
+5. **Editing the Plate**: Use the trash bin icon (Delete) to instantly remove any item from the calculation.
 
-### 4.3. Consultation Chat Tab 💬
+### 4.3. Consultation Chat Tab
 Consult the built-in clinical AI dietitian assistant for recipe validation, medical profile warnings, and meal plans.
 1. **Client Profile Selection**: Select active dietary constraints (e.g., pregnancy, diabetes, kidney disease, vegetarian) in the dropdown.
 2. **Asking Questions**: Type your prompt (e.g., "Is unpasteurized brie cheese safe for a pregnant client?" or "Design a low-sodium, high-protein menu").

BIN
docs/User_Guide.pdf


BIN
docs/WSL_Deployment.pdf


BIN
docs/Wiki_Home.pdf


+ 2 - 2
docs/architecture.md

@@ -6,7 +6,7 @@ This document describes the technical architecture, database schema design, AI R
 
 ---
 
-## 🗺️ System Component Architecture
+## System Component Architecture
 
 The platform is designed around a strictly local, privacy-first microservice topology. The components integrate seamlessly to provide nutritional search, RAG-augmented clinical diet evaluations, and DevSecOps observability.
 
@@ -50,7 +50,7 @@ graph TD
 
 ---
 
-## 💾 Database Design: Grouped Vertical Partitioning
+## Database Design: Grouped Vertical Partitioning
 
 To optimize massive dataset ingestion (~24GB OpenFoodFacts dataset) and completely bypass InnoDB row size limits while maintaining sub-second RAG response times, the database utilizes a vertically partitioned structure:
 

BIN
docs/architecture.pdf


BIN
docs/disaster_recovery_plan.pdf


BIN
docs/distributed_deployment.pdf


BIN
docs/docker_connection.pdf


BIN
docs/project_report.pdf


BIN
docs/retro_planning.pdf


BIN
docs/taiga_audit_report.pdf


BIN
docs/zabbix_monitoring.pdf


+ 12 - 12
generate_docs.py

@@ -372,22 +372,22 @@ The left-hand sidebar houses several global settings:
 
 The application dashboard is split into three interactive workspace tabs:
 
-### 4.1. Clinical Data Search Tab 🔍
+### 4.1. Clinical Data Search Tab
 Use this tab to browse the local OpenFoodFacts food database.
 1. **Keyword Input**: Type a product name, brand, or barcode (e.g., "whole wheat bread" or "unpasteurized cheese").
 2. **Dynamic Results**: The database performs a rapid search, displaying the top 10 matched products.
 3. **Nutritional Score**: Shows the Nutri-Score grade (A to E) and details (Proteins, Carbs, Fats, Energy in kcal) per 100g.
 4. **Allergen Warnings**: Shows highlight flags if the product contains common allergens matching your client's needs.
 
-### 4.2. My Plate Builder Tab 🍽️
+### 4.2. My Plate Builder Tab
 Build custom meals or recipe portions to calculate total client nutritional intake.
 1. **Adding Items**: When browsing foods in the Search Tab, click **Add to Plate**.
 2. **Specifying Portions**: Input the quantity using either decimal weights (in grams) or common volume descriptors (e.g., "1.5 cups", "2 tablespoons"). The converter translates volume to metric weight based on the product density.
 3. **Cumulative Intake Table**: The tab renders a table summarizing individual macros and total energy.
 4. **Visual Metrics**: Renders a dynamic bar chart comparing Carbs, Proteins, and Fats against recommended clinical intake thresholds.
-5. **Editing the Plate**: Use the trash bin icon (🗑️) to instantly remove any item from the calculation.
+5. **Editing the Plate**: Use the trash bin icon (Delete) to instantly remove any item from the calculation.
 
-### 4.3. Consultation Chat Tab 💬
+### 4.3. Consultation Chat Tab
 Consult the built-in clinical AI dietitian assistant for recipe validation, medical profile warnings, and meal plans.
 1. **Client Profile Selection**: Select active dietary constraints (e.g., pregnancy, diabetes, kidney disease, vegetarian) in the dropdown.
 2. **Asking Questions**: Type your prompt (e.g., "Is unpasteurized brie cheese safe for a pregnant client?" or "Design a low-sodium, high-protein menu").
@@ -611,7 +611,7 @@ Welcome to the static Scrum documentation portal. This master wiki aggregates an
 
 ---
 
-## 📅 Sprint Ceremonies & Logs
+## Sprint Ceremonies & Logs
 
 ### 1. [Sprint Plans (Scrum_Plan.md)](Scrum_Plan.pdf)
 *Contains Sprint Plan formulations, active user stories selection, scope statements, and team capacity bounds for each milestone loop.*
@@ -627,7 +627,7 @@ Welcome to the static Scrum documentation portal. This master wiki aggregates an
 
 ---
 
-## 📊 Deliverables & Quality Assurance
+## Deliverables & Quality Assurance
 
 ### 5. [Scrum Artifacts (Scrum_Artifacts.md)](Scrum_Artifacts.pdf)
 *Indexes sprint velocity metrics, completed story points distributions, burndown coordinates, and final Taiga delivery milestones.*
@@ -702,25 +702,25 @@ Since the system operates entirely locally on local hypervisors, **zero patient
 
 ## 2. Core Functional Pillars
 
-### 📊 tab 1: Clinical Data Search (🔬 Clinical Search)
+### Tab 1: Clinical Data Search (Clinical Search)
 Allows practitioners to search the 24GB OpenFoodFacts dataset in real time (average query response time < 0.04 seconds).
 - **Dynamic Medical Warnings**: Based on the active patient profile, foods are immediately flagged in the search results:
-  - ⚠️ **Red Warning Flags**: Highlight high-risk ingredients (e.g. Unpasteurized dairy or raw fish for pregnant patients, high-sodium foods for hypertensive patients, or high-sugar foods for diabetic patients).
-  - 💚 **Green Recommendations**: Highlight recommended dietary components (e.g. High iron/calcium for pregnant or breastfeeding mothers, high Vitamin C for scurvy prevention, or high iron for anemia).
+  - [Warning] **Red Warning Flags**: Highlight high-risk ingredients (e.g. Unpasteurized dairy or raw fish for pregnant patients, high-sodium foods for hypertensive patients, or high-sugar foods for diabetic patients).
+  - [Recommended] **Green Recommendations**: Highlight recommended dietary components (e.g. High iron/calcium for pregnant or breastfeeding mothers, high Vitamin C for scurvy prevention, or high iron for anemia).
 - **Flexible Column Customization**: Multi-select column headers to inspect specific macro and micro-nutrients.
 
-### 💬 tab 2: AI Clinical Chat (💬 AI Chat)
+### Tab 2: AI Clinical Chat (AI Chat)
 An interactive NLP dialogue interface powered by a local lightweight LLM (**Qwen2.5:7b**).
 - **RAG-Driven Precision**: The AI dietitian automatically retrieves and reviews local database records and private meta-search results before formulating an answer.
 - **Dynamic Medical Guardrails**: The user's active illnesses, diets, and conditions are injected into the AI's system prompt in the background, forcing the AI to strictly enforce clinical safety constraints.
 
-### 🍽️ tab 3: My Plate Builder (🍽️ My Plate Builder)
+### Tab 3: My Plate Builder (My Plate Builder)
 A recipe formulation utility to calculate combined nutritional intake.
 - **Natural Language Parsing**: Enables entering quantities in natural units (e.g., "1.5 cups", "2 tablespoons", "150g").
 - **Exact Conversion**: The system translates these custom units into metric grams based on product density metrics.
 - **Macro Summaries**: Instantly calculates and displays the total combined Protein, Fat, and Carbohydrates.
 
-### 🤖 tab 4: AI Meal Planner (🤖 AI Meal Planner)
+### Tab 4: AI Meal Planner (AI Planner)
 An automated clinical diet planner.
 - Generates a multi-meal daily menu formatted strictly as a Markdown table.
 - Dynamically enforces user-defined calorie limits and active medical restrictions.

+ 34 - 38
scripts/generate_pdfs.py

@@ -13,57 +13,54 @@ def main():
         print("No markdown files found in docs/")
         return
         
-    # Resolve dynamic absolute paths for downloaded TrueType fonts
-    fonts_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'docs', 'fonts')).replace('\\', '/')
-    regular_font = f"{fonts_dir}/Roboto-Regular.ttf"
-    bold_font = f"{fonts_dir}/Roboto-Bold.ttf"
-    mono_font = f"{fonts_dir}/RobotoMono-Regular.ttf"
+    # Use relative paths for fonts to ensure portability of PDF generation
+    root_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')).replace('\\', '/')
     
-    user_css = f"""
-    @font-face {{
+    user_css = """
+    @font-face {
         font-family: 'Roboto';
-        src: url('{regular_font}');
-    }}
-    @font-face {{
+        src: url('docs/fonts/Roboto-Regular.ttf');
+    }
+    @font-face {
         font-family: 'Roboto';
         font-weight: bold;
-        src: url('{bold_font}');
-    }}
-    @font-face {{
+        src: url('docs/fonts/Roboto-Bold.ttf');
+    }
+    @font-face {
         font-family: 'RobotoMono';
-        src: url('{mono_font}');
-    }}
-    * {{
+        src: url('docs/fonts/RobotoMono-Regular.ttf');
+    }
+    * {
         color: #1a1a1a !important;
-    }}
-    body {{
+    }
+    body {
         font-family: 'Roboto', sans-serif;
         color: #1a1a1a !important;
         background-color: #ffffff !important;
-    }}
-    h1, h2, h3, h4, h5, h6, h1 *, h2 *, h3 *, h4 *, h5 *, h6 * {{
+    }
+    h1, h2, h3, h4, h5, h6, h1 *, h2 *, h3 *, h4 *, h5 *, h6 * {
         color: #000000 !important;
-    }}
-    code, pre, code *, pre * {{
+    }
+    code, pre, code *, pre * {
         font-family: 'RobotoMono', monospace !important;
         color: #b02a37 !important;
         background-color: #f8f9fa !important;
-    }}
-    a, a * {{
+    }
+    a, a * {
         color: #0d6efd !important;
-    }}
-    blockquote, blockquote * {{
+    }
+    blockquote, blockquote * {
         color: #555555 !important;
         border-left: 4px solid #ccc !important;
         padding-left: 10px !important;
-    }}
-    table, tr, td, th, table * {{
+    }
+    table, tr, td, th, table * {
         color: #1a1a1a !important;
         border-color: #cccccc !important;
-    }}
-    th {{
+    }
+    th {
         background-color: #f2f2f2 !important;
-    }}
+    }
     """
 
     for md_file in md_files:
@@ -135,24 +132,23 @@ def main():
                         landscape_part = '## 2. Project File Catalog & Documentation' + parts2[0]
                         portrait_part2 = '## 3. Directory Structure Map' + parts2[1]
                         
-                        pdf.add_section(Section(portrait_part1, paper_size="A4"), user_css=user_css)
-                        pdf.add_section(Section(landscape_part, paper_size="A4-L"), user_css=user_css)
-                        pdf.add_section(Section(portrait_part2, paper_size="A4"), user_css=user_css)
+                        pdf.add_section(Section(portrait_part1, paper_size="A4", root=root_dir), user_css=user_css)
+                        pdf.add_section(Section(landscape_part, paper_size="A4-L", root=root_dir), user_css=user_css)
+                        pdf.add_section(Section(portrait_part2, paper_size="A4", root=root_dir), user_css=user_css)
                     else:
                         print("WARNING: Could not find Directory Structure Map heading. Defaulting to full portrait.")
-                        pdf.add_section(Section(md_content, paper_size="A4"), user_css=user_css)
+                        pdf.add_section(Section(md_content, paper_size="A4", root=root_dir), user_css=user_css)
                 else:
                     print("WARNING: Could not find Project File Catalog heading. Defaulting to full portrait.")
-                    pdf.add_section(Section(md_content, paper_size="A4"), user_css=user_css)
+                    pdf.add_section(Section(md_content, paper_size="A4", root=root_dir), user_css=user_css)
             else:
-                pdf.add_section(Section(md_content, paper_size="A4"), user_css=user_css)
+                pdf.add_section(Section(md_content, paper_size="A4", root=root_dir), user_css=user_css)
                 
             pdf.save(pdf_file)
             print(f"Saved {os.path.basename(pdf_file)}")
             
             # Copy to workspace root if applicable
             import shutil
-            root_dir = os.path.join(os.path.dirname(__file__), '..')
             if base_name == 'project_report.md':
                 dest = os.path.join(root_dir, 'Project.pdf')
                 try: