diff --git a/build.ps1 b/build.ps1
index a881534..d0faba3 100644
--- a/build.ps1
+++ b/build.ps1
@@ -70,7 +70,7 @@ New-Item -ItemType Directory -Force -Path docs | Out-Null
Write-Host "Preparing documentation structure..."
$dirsToCopy = @('images', 'calibration', 'developer-reference', 'general-settings',
- 'material_settings', 'print_prepare', 'print_settings', 'printer_settings')
+ 'material_settings', 'print_prepare', 'print_settings', 'printer_settings')
foreach ($dir in $dirsToCopy) {
if (Test-Path $dir) {
@@ -109,7 +109,7 @@ if ($DownloadSvg) {
Write-Host "Downloading SVG icons from OrcaSlicer main repo..."
$iconUrls = Select-String -Path docs\*.md -Pattern 'https://github.com/OrcaSlicer/OrcaSlicer/blob/main/resources/images/[^?)"]*' -AllMatches |
- ForEach-Object { $_.Matches.Value } | Sort-Object -Unique
+ ForEach-Object { $_.Matches.Value } | Sort-Object -Unique
foreach ($url in $iconUrls) {
$filename = [System.IO.Path]::GetFileName($url)
@@ -133,7 +133,8 @@ if ($DownloadSvg) {
}
}
}
-} else {
+}
+else {
Write-Host "Skipping SVG icon download (use --download-svg or -d to enable)"
}
@@ -144,7 +145,7 @@ Get-ChildItem -Path docs -Filter *.md -Recurse | ForEach-Object {
$docsFull = (Get-Item -Path docs -Force).FullName
# Calculate relative path from docs to current file (as string)
- $relPathFromDocs = $mdFile.Substring($docsFull.Length).TrimStart('\','/')
+ $relPathFromDocs = $mdFile.Substring($docsFull.Length).TrimStart('\', '/')
# Count how many directory levels deep we are (number of \ or /)
$depth = ($relPathFromDocs -split '[\\/]').Count - 1 # -1 because file itself doesn't count as level
@@ -155,11 +156,11 @@ Get-ChildItem -Path docs -Filter *.md -Recurse | ForEach-Object {
# Replace GitHub wiki image URLs
$content = $content -replace 'https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/images/([^?)"]*)\?raw=true',
- "${prefix}images/`$1"
+ "${prefix}images/`$1"
# Replace OrcaSlicer repo icon URLs
$content = $content -replace 'https://github.com/OrcaSlicer/OrcaSlicer/blob/main/resources/images/([^?)"]*)\?raw=true',
- "${prefix}images/orcaslicer-icons/`$1"
+ "${prefix}images/orcaslicer-icons/`$1"
Set-Content -Path $mdFile -Value $content -NoNewline
}
@@ -174,7 +175,7 @@ Get-ChildItem -Path wiki -Filter *.html -Recurse | Where-Object { $_.Name -ne 'i
$wikiFull = (Get-Item -Path wiki -Force).FullName
# Calculate relative path from wiki/ to the current HTML file
- $relPath = $htmlFile.Substring($wikiFull.Length).TrimStart('\','/')
+ $relPath = $htmlFile.Substring($wikiFull.Length).TrimStart('\', '/')
# Normalize path separators to forward slashes for URLs
$relPath = $relPath -replace '\\', '/'
@@ -234,7 +235,8 @@ New-Item -ItemType Directory -Path "wiki\assets\javascripts" -Force | Out-Null
if (Test-Path "web_extras\extra.css") {
Copy-Item "web_extras\extra.css" "wiki\assets\stylesheets\extra.css" -Force
Write-Host "Copied extra.css"
-} else {
+}
+else {
Write-Host "Warning: web_extras\extra.css not found - skipping" -ForegroundColor Yellow
}
@@ -242,28 +244,32 @@ if (Test-Path "web_extras\extra.css") {
if (Test-Path "web_extras\OrcaSlicer.ico") {
Copy-Item "web_extras\OrcaSlicer.ico" "wiki\assets\images\OrcaSlicer.ico" -Force
Write-Host "Copied OrcaSlicer.ico"
-} else {
+}
+else {
Write-Host "Warning: web_extras\OrcaSlicer.ico not found - skipping" -ForegroundColor Yellow
}
if (Test-Path "web_extras\OrcaSlicer.png") {
Copy-Item "web_extras\OrcaSlicer.png" "wiki\assets\images\OrcaSlicer.png" -Force
Write-Host "Copied OrcaSlicer.png"
-} else {
+}
+else {
Write-Host "Warning: web_extras\OrcaSlicer.png not found - skipping" -ForegroundColor Yellow
}
if (Test-Path "web_extras\icon-theme.js") {
Copy-Item "web_extras\icon-theme.js" "wiki\assets\javascripts\icon-theme.js" -Force
Write-Host "Copied icon-theme.js"
-} else {
+}
+else {
Write-Host "Warning: web_extras\icon-theme.js not found - skipping" -ForegroundColor Yellow
}
if (Test-Path "web_extras\katex.js") {
Copy-Item "web_extras\katex.js" "wiki\assets\javascripts\katex.js" -Force
Write-Host "Copied katex.js"
-} else {
+}
+else {
Write-Host "Warning: web_extras\katex.js not found - skipping" -ForegroundColor Yellow
}
@@ -271,7 +277,8 @@ if (Test-Path "web_extras") {
New-Item -ItemType Directory -Path "wiki\web_extras" -Force | Out-Null
Copy-Item -Path "web_extras\*" -Destination "wiki\web_extras" -Recurse -Force -ErrorAction SilentlyContinue
Write-Host "Copied web_extras directory"
-} else {
+}
+else {
Write-Host "Warning: web_extras directory not found - skipping" -ForegroundColor Yellow
}
diff --git a/generate_nav.py b/generate_nav.py
index 375faa4..7f0a21b 100644
--- a/generate_nav.py
+++ b/generate_nav.py
@@ -34,7 +34,7 @@ def folder_to_title(name: str) -> str:
"""Convert a folder name to a readable title."""
# Replace separators with spaces
title = name.replace('_', ' ').replace('-', ' ')
-
+
# Title case, preserving certain patterns
words = title.split()
result = []
@@ -74,11 +74,11 @@ def extract_title_from_md(filepath: Path) -> Optional[str]:
def filename_to_title(filename: str) -> str:
"""Convert a filename to a readable title."""
name = filename
-
+
# Remove common prefixes (settings files often have category prefixes)
# This regex removes patterns like "printer_basic_information_", "quality_settings_", etc.
name = re.sub(r'^[a-z]+_(?:[a-z]+_)*(?=\w)', '', name)
-
+
return folder_to_title(name)
@@ -115,65 +115,65 @@ def get_sort_key(path: Path) -> tuple:
def scan_folder(folder: Path, base_path: Path) -> list:
"""Recursively scan a folder and build nav structure."""
nav_items = []
-
+
try:
items = list(folder.iterdir())
except PermissionError:
return nav_items
-
+
# Separate and sort files and folders
md_files = sorted(
[f for f in items if f.is_file() and f.suffix == '.md'],
key=get_sort_key
)
subfolders = sorted(
- [d for d in items if d.is_dir()
- and not d.name.startswith('.')
+ [d for d in items if d.is_dir()
+ and not d.name.startswith('.')
and d.name.lower() not in EXCLUDED_FOLDERS],
key=get_sort_key
)
-
+
# Process markdown files
for md_file in md_files:
title = get_file_title(md_file)
rel_path = md_file.relative_to(base_path)
nav_items.append((title, str(rel_path).replace('\\', '/')))
-
+
# Process subfolders recursively
for subfolder in subfolders:
sub_items = scan_folder(subfolder, base_path)
if sub_items:
folder_title = get_display_name(subfolder.name)
nav_items.append((folder_title, sub_items))
-
+
return nav_items
def generate_nav(base_path: Path) -> list:
"""Generate the complete navigation structure by scanning all folders."""
nav = []
-
+
# Check for Home.md -> becomes index.md
if (base_path / 'Home.md').exists():
nav.append(("Home", "index.md"))
-
+
# Scan all top-level folders that contain markdown files
top_level_folders = sorted(
- [d for d in base_path.iterdir()
- if d.is_dir()
+ [d for d in base_path.iterdir()
+ if d.is_dir()
and not d.name.startswith('.')
and d.name.lower() not in EXCLUDED_FOLDERS
and any(d.rglob('*.md'))], # Only include if has .md files
key=get_sort_key
)
-
+
# Build nav from each folder
for folder in top_level_folders:
items = scan_folder(folder, base_path)
if items:
section_title = get_display_name(folder.name)
nav.append((section_title, items))
-
+
return nav
@@ -192,14 +192,14 @@ def nav_to_yaml(nav: list, indent: int = 2) -> str:
"""Convert nav structure to YAML string."""
lines = []
base_indent = " " * indent
-
+
def format_item(item, level):
prefix = base_indent * level + "- "
title, value = item
-
+
# Escape title to handle special characters
escaped_title = escape_yaml_string(title)
-
+
if isinstance(value, list):
lines.append(f"{prefix}{escaped_title}:")
for sub_item in value:
@@ -208,50 +208,40 @@ def nav_to_yaml(nav: list, indent: int = 2) -> str:
# Escape path value
escaped_value = escape_yaml_string(value)
lines.append(f"{prefix}{escaped_title}: {escaped_value}")
-
+
for item in nav:
format_item(item, 0)
-
+
return '\n'.join(lines)
def update_mkdocs_yml(mkdocs_path: Path, nav_yaml: str) -> None:
"""Update the nav section in mkdocs.yml."""
content = mkdocs_path.read_text(encoding='utf-8')
-
+
# Find and replace the nav section
# Match nav: followed by lines starting with - or whitespace until next top-level key or EOF
nav_pattern = re.compile(
r'^nav:\s*\n((?:[ \t-].*\n)*)',
re.MULTILINE
)
-
+
match = nav_pattern.search(content)
if match:
new_content = content[:match.start()] + f"nav:\n{nav_yaml}\n" + content[match.end():]
else:
new_content = content.rstrip() + f"\n\nnav:\n{nav_yaml}\n"
-
+
# Validate YAML before writing (basic check - try importing yaml if available)
try:
import yaml
-
- class _MkDocsSafeLoader(yaml.SafeLoader):
- """SafeLoader that tolerates mkdocs Python tags."""
-
- # Allow !!python/name:... tags used by MkDocs/pymdownx without executing code
- _MkDocsSafeLoader.add_constructor(
- 'tag:yaml.org,2002:python/name',
- lambda loader, node: loader.construct_scalar(node)
- )
-
- yaml.load(new_content, Loader=_MkDocsSafeLoader)
+ yaml.safe_load(new_content)
except ImportError:
# yaml module not available, skip validation
pass
except yaml.YAMLError as e:
raise ValueError(f"Generated YAML is invalid: {e}") from e
-
+
mkdocs_path.write_text(new_content, encoding='utf-8')
print(f"ā Updated {mkdocs_path}")
@@ -280,7 +270,7 @@ def count_items(nav: list) -> int:
def main():
import argparse
-
+
parser = argparse.ArgumentParser(
description='Generate mkdocs.yml navigation from folder structure (fully dynamic)'
)
@@ -289,23 +279,23 @@ def main():
help='Update mkdocs.yml directly (default: preview only)'
)
args = parser.parse_args()
-
+
script_dir = Path(__file__).parent
mkdocs_path = script_dir / 'mkdocs.yml'
-
+
if not mkdocs_path.exists():
print(f"ā Error: {mkdocs_path} not found")
return 1
-
+
print(f"š Scanning: {script_dir}\n")
nav = generate_nav(script_dir)
nav_yaml = nav_to_yaml(nav)
-
+
print("š Navigation Structure:\n")
print_nav_tree(nav)
print(f"\nš Total pages: {count_items(nav)}")
print(f"š Total sections: {len(nav) - 1}") # -1 for Home
-
+
if args.update:
print()
update_mkdocs_yml(mkdocs_path, nav_yaml)
@@ -315,7 +305,7 @@ def main():
print("nav:")
print(nav_yaml)
print("=" * 60)
-
+
return 0
diff --git a/images/Precision/PreciseWallOff.svg b/images/Precision/PreciseWallOff.svg
index 99fe13f..f8ad44e 100644
--- a/images/Precision/PreciseWallOff.svg
+++ b/images/Precision/PreciseWallOff.svg
@@ -1,3 +1,3 @@
-
\ No newline at end of file
+
diff --git a/images/Precision/PreciseWallOn.svg b/images/Precision/PreciseWallOn.svg
index 48d1fca..b67c1db 100644
--- a/images/Precision/PreciseWallOn.svg
+++ b/images/Precision/PreciseWallOn.svg
@@ -1,3 +1,3 @@
-
\ No newline at end of file
+
diff --git a/images/Precision/arc-fitting.svg b/images/Precision/arc-fitting.svg
index acb997c..87d1209 100644
--- a/images/Precision/arc-fitting.svg
+++ b/images/Precision/arc-fitting.svg
@@ -1,3 +1,3 @@
-
\ No newline at end of file
+
diff --git a/images/Precision/elephant-foot.svg b/images/Precision/elephant-foot.svg
index c51403c..030f886 100644
--- a/images/Precision/elephant-foot.svg
+++ b/images/Precision/elephant-foot.svg
@@ -1,3 +1,3 @@
-
\ No newline at end of file
+
diff --git a/images/Precision/layer-height.svg b/images/Precision/layer-height.svg
index d86cfe8..b7f72cc 100644
--- a/images/Precision/layer-height.svg
+++ b/images/Precision/layer-height.svg
@@ -1,3 +1,3 @@
-
\ No newline at end of file
+
diff --git a/images/STL-Transformation/stl-transformation-params.svg b/images/STL-Transformation/stl-transformation-params.svg
index f5542f4..65a3fd8 100644
--- a/images/STL-Transformation/stl-transformation-params.svg
+++ b/images/STL-Transformation/stl-transformation-params.svg
@@ -1,3 +1,3 @@
-
\ No newline at end of file
+
diff --git a/images/Tolerance/tolerance_hole.svg b/images/Tolerance/tolerance_hole.svg
index 927be09..f3772a8 100644
--- a/images/Tolerance/tolerance_hole.svg
+++ b/images/Tolerance/tolerance_hole.svg
@@ -1,3 +1,3 @@
-
\ No newline at end of file
+
diff --git a/images/brim/brim-use-efc-outline.svg b/images/brim/brim-use-efc-outline.svg
index 740b4f2..762bfc2 100644
--- a/images/brim/brim-use-efc-outline.svg
+++ b/images/brim/brim-use-efc-outline.svg
@@ -1,3 +1,3 @@
-
\ No newline at end of file
+
diff --git a/images/fill/InfillWallOverlapOff.svg b/images/fill/InfillWallOverlapOff.svg
index a524a6b..550dfdf 100644
--- a/images/fill/InfillWallOverlapOff.svg
+++ b/images/fill/InfillWallOverlapOff.svg
@@ -1,3 +1,3 @@
-
\ No newline at end of file
+
diff --git a/images/fill/InfillWallOverlapOn.svg b/images/fill/InfillWallOverlapOn.svg
index cc348c0..321c678 100644
--- a/images/fill/InfillWallOverlapOn.svg
+++ b/images/fill/InfillWallOverlapOn.svg
@@ -1,3 +1,3 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-better-0.svg b/images/misc/level-to-better-0.svg
index 003c5e1..c22e199 100644
--- a/images/misc/level-to-better-0.svg
+++ b/images/misc/level-to-better-0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-better-1.svg b/images/misc/level-to-better-1.svg
index 7c89cd8..7bc201a 100644
--- a/images/misc/level-to-better-1.svg
+++ b/images/misc/level-to-better-1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-better-2.svg b/images/misc/level-to-better-2.svg
index f79ec80..00c3383 100644
--- a/images/misc/level-to-better-2.svg
+++ b/images/misc/level-to-better-2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-better-3.svg b/images/misc/level-to-better-3.svg
index 6b6358c..ad86f06 100644
--- a/images/misc/level-to-better-3.svg
+++ b/images/misc/level-to-better-3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-better-4.svg b/images/misc/level-to-better-4.svg
index 0de687b..8c49226 100644
--- a/images/misc/level-to-better-4.svg
+++ b/images/misc/level-to-better-4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-better-5.svg b/images/misc/level-to-better-5.svg
index b3ddfa8..e79fadb 100644
--- a/images/misc/level-to-better-5.svg
+++ b/images/misc/level-to-better-5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-better-6.svg b/images/misc/level-to-better-6.svg
index fd25e62..944477b 100644
--- a/images/misc/level-to-better-6.svg
+++ b/images/misc/level-to-better-6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-better-7.svg b/images/misc/level-to-better-7.svg
index 274021b..01c9aa0 100644
--- a/images/misc/level-to-better-7.svg
+++ b/images/misc/level-to-better-7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-better-8.svg b/images/misc/level-to-better-8.svg
index 280f401..380baf4 100644
--- a/images/misc/level-to-better-8.svg
+++ b/images/misc/level-to-better-8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-worse-0.svg b/images/misc/level-to-worse-0.svg
index 2845a52..80fb560 100644
--- a/images/misc/level-to-worse-0.svg
+++ b/images/misc/level-to-worse-0.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-worse-1.svg b/images/misc/level-to-worse-1.svg
index d3f084c..7e64102 100644
--- a/images/misc/level-to-worse-1.svg
+++ b/images/misc/level-to-worse-1.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-worse-2.svg b/images/misc/level-to-worse-2.svg
index 84610c8..310c6c6 100644
--- a/images/misc/level-to-worse-2.svg
+++ b/images/misc/level-to-worse-2.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-worse-3.svg b/images/misc/level-to-worse-3.svg
index b95bdfc..906a5a6 100644
--- a/images/misc/level-to-worse-3.svg
+++ b/images/misc/level-to-worse-3.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-worse-4.svg b/images/misc/level-to-worse-4.svg
index 0de687b..8c49226 100644
--- a/images/misc/level-to-worse-4.svg
+++ b/images/misc/level-to-worse-4.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-worse-5.svg b/images/misc/level-to-worse-5.svg
index cae9864..9140a59 100644
--- a/images/misc/level-to-worse-5.svg
+++ b/images/misc/level-to-worse-5.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-worse-6.svg b/images/misc/level-to-worse-6.svg
index 23f9016..7c91b98 100644
--- a/images/misc/level-to-worse-6.svg
+++ b/images/misc/level-to-worse-6.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-worse-7.svg b/images/misc/level-to-worse-7.svg
index d2bd5d6..b1f515f 100644
--- a/images/misc/level-to-worse-7.svg
+++ b/images/misc/level-to-worse-7.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/images/misc/level-to-worse-8.svg b/images/misc/level-to-worse-8.svg
index 26d55f3..38e074c 100644
--- a/images/misc/level-to-worse-8.svg
+++ b/images/misc/level-to-worse-8.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/print_settings/speed/speed_settings_other_layers_speed.md b/print_settings/speed/speed_settings_other_layers_speed.md
index f142990..26f796c 100644
--- a/print_settings/speed/speed_settings_other_layers_speed.md
+++ b/print_settings/speed/speed_settings_other_layers_speed.md
@@ -51,7 +51,7 @@ $$
\frac{\text{Perimeter Length}}{2\pi} \leq \text{Threshold}
$$
-For example, if the threshold is set to 5 mm, then the perimeter length must be less than or equal to 31.4 mm (2 * Ļ * 5 mm) to be considered a small perimeter.
+For example, if the threshold is set to 5 mm, then the perimeter length must be less than or equal to 31.4 mm `(2 * Ļ * 5 mm)` to be considered a small perimeter.
- A Circle with a diameter of 10 mm will have a perimeter length of approximately 31.4 mm, which is equal to the threshold, so it will be considered a small perimeter.
- A Cube of 10mm x 10mm will have a perimeter length of 40 mm, which is greater than the threshold, so it will not be considered a small perimeter.