Jelajahi Sumber

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

Lange François 2 minggu lalu
induk
melakukan
6caac32d02
37 mengubah file dengan 60 tambahan dan 64 penghapusan
  1. TEMPAT SAMPAH
      Project.pdf
  2. TEMPAT SAMPAH
      Retro Planning.pdf
  3. TEMPAT SAMPAH
      delivery.zip
  4. TEMPAT SAMPAH
      docs/Backup_Procedure.pdf
  5. TEMPAT SAMPAH
      docs/Data_Ingestion.pdf
  6. TEMPAT SAMPAH
      docs/Final_Report.pdf
  7. TEMPAT SAMPAH
      docs/Installation_Guide.pdf
  8. TEMPAT SAMPAH
      docs/Operator_Installation_Guide.pdf
  9. TEMPAT SAMPAH
      docs/Scrum_Artifacts.pdf
  10. TEMPAT SAMPAH
      docs/Scrum_Daily.pdf
  11. TEMPAT SAMPAH
      docs/Scrum_Plan.pdf
  12. TEMPAT SAMPAH
      docs/Scrum_Retro.pdf
  13. TEMPAT SAMPAH
      docs/Scrum_Review.pdf
  14. 2 2
      docs/Scrum_Wiki.md
  15. TEMPAT SAMPAH
      docs/Scrum_Wiki.pdf
  16. TEMPAT SAMPAH
      docs/Start_Stop_Procedures.pdf
  17. TEMPAT SAMPAH
      docs/Technical_Document.pdf
  18. TEMPAT SAMPAH
      docs/Test_Cases_Sprint8.pdf
  19. TEMPAT SAMPAH
      docs/URL_Formats.pdf
  20. TEMPAT SAMPAH
      docs/Uninstall_Guide.pdf
  21. 6 6
      docs/User_Description.md
  22. TEMPAT SAMPAH
      docs/User_Description.pdf
  23. 4 4
      docs/User_Guide.md
  24. TEMPAT SAMPAH
      docs/User_Guide.pdf
  25. TEMPAT SAMPAH
      docs/WSL_Deployment.pdf
  26. TEMPAT SAMPAH
      docs/Wiki_Home.pdf
  27. 2 2
      docs/architecture.md
  28. TEMPAT SAMPAH
      docs/architecture.pdf
  29. TEMPAT SAMPAH
      docs/disaster_recovery_plan.pdf
  30. TEMPAT SAMPAH
      docs/distributed_deployment.pdf
  31. TEMPAT SAMPAH
      docs/docker_connection.pdf
  32. TEMPAT SAMPAH
      docs/project_report.pdf
  33. TEMPAT SAMPAH
      docs/retro_planning.pdf
  34. TEMPAT SAMPAH
      docs/taiga_audit_report.pdf
  35. TEMPAT SAMPAH
      docs/zabbix_monitoring.pdf
  36. 12 12
      generate_docs.py
  37. 34 38
      scripts/generate_pdfs.py

TEMPAT SAMPAH
Project.pdf


TEMPAT SAMPAH
Retro Planning.pdf


TEMPAT SAMPAH
delivery.zip


TEMPAT SAMPAH
docs/Backup_Procedure.pdf


TEMPAT SAMPAH
docs/Data_Ingestion.pdf


TEMPAT SAMPAH
docs/Final_Report.pdf


TEMPAT SAMPAH
docs/Installation_Guide.pdf


TEMPAT SAMPAH
docs/Operator_Installation_Guide.pdf


TEMPAT SAMPAH
docs/Scrum_Artifacts.pdf


TEMPAT SAMPAH
docs/Scrum_Daily.pdf


TEMPAT SAMPAH
docs/Scrum_Plan.pdf


TEMPAT SAMPAH
docs/Scrum_Retro.pdf


TEMPAT SAMPAH
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.*

TEMPAT SAMPAH
docs/Scrum_Wiki.pdf


TEMPAT SAMPAH
docs/Start_Stop_Procedures.pdf


TEMPAT SAMPAH
docs/Technical_Document.pdf


TEMPAT SAMPAH
docs/Test_Cases_Sprint8.pdf


TEMPAT SAMPAH
docs/URL_Formats.pdf


TEMPAT SAMPAH
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.

TEMPAT SAMPAH
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").

TEMPAT SAMPAH
docs/User_Guide.pdf


TEMPAT SAMPAH
docs/WSL_Deployment.pdf


TEMPAT SAMPAH
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:
 

TEMPAT SAMPAH
docs/architecture.pdf


TEMPAT SAMPAH
docs/disaster_recovery_plan.pdf


TEMPAT SAMPAH
docs/distributed_deployment.pdf


TEMPAT SAMPAH
docs/docker_connection.pdf


TEMPAT SAMPAH
docs/project_report.pdf


TEMPAT SAMPAH
docs/retro_planning.pdf


TEMPAT SAMPAH
docs/taiga_audit_report.pdf


TEMPAT SAMPAH
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: