Compare commits

..

1 Commits

Author SHA1 Message Date
dw-0
393822b8b6 feat(docs): add MkDocs documentation setup with Docker support and restructure markdown files
Signed-off-by: Dominik Willner <th33xitus@gmail.com>
2025-08-29 13:39:23 +02:00
40 changed files with 178 additions and 307 deletions

View File

@@ -11,5 +11,5 @@ end_of_line = lf
[*.py] [*.py]
max_line_length = 88 max_line_length = 88
[*.{sh,yml,yaml,json}] [*.{sh,yml,yaml,json,md}]
indent_size = 2 indent_size = 2

31
.github/workflows/deploy-docs.yml vendored Normal file
View File

@@ -0,0 +1,31 @@
name: Deploy Documentation
on:
workflow_dispatch:
push:
branches:
- docs
permissions:
contents: write
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configure Git Credentials
run: |
git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
- uses: actions/setup-python@v5
with:
python-version: 3.x
- run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
- uses: actions/cache@v4
with:
key: mkdocs-material-${{ env.cache_id }}
path: .cache
restore-keys: |
mkdocs-material-
- name: Install dependencies
run: pip install -r requirements.txt
- name: Build and deploy documentation
run: mkdocs gh-deploy --force

6
Dockerfile Normal file
View File

@@ -0,0 +1,6 @@
FROM squidfunk/mkdocs-material:latest
# Install additional plugins required by our mkdocs configuration
RUN pip install \
mkdocs-git-revision-date-localized-plugin \
mkdocstrings[python]

8
docker-compose.yml Normal file
View File

@@ -0,0 +1,8 @@
services:
mkdocs:
build: .
ports:
- "8000:8000"
volumes:
- ./:/docs
command: serve --dev-addr=0.0.0.0:8000

BIN
docs/assets/logo-large.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -276,7 +276,7 @@ Each service gets its corresponding instance added to the service filename.
* The user can now choose to install Klipper as a systemd service. * The user can now choose to install Klipper as a systemd service.
* The Shell Command extension and `shell_command.py` got renamed to G-Code Shell Command extension and `gcode_shell_command.py`. In case the [pending PR](https://github.com/KevinOConnor/klipper/pull/2173) will be merged in the future, this was an early attempt to dodge possible incompatibilities. The [G-Code Shell Command docs](gcode_shell_command.md) has been updated accordingly. * The Shell Command extension and `shell_command.py` got renamed to G-Code Shell Command extension and `gcode_shell_command.py`. In case the [pending PR](https://github.com/KevinOConnor/klipper/pull/2173) will be merged in the future, this was an early attempt to dodge possible incompatibilities. The [G-Code Shell Command docs](extensions/gcode-shell-command) has been updated accordingly.
* The way how KIAUH interacts and writes to the users printer.cfg got changed. Usually KIAUH wrote everything directly into the printer.cfg. The way it will work from now on is, that a new file called `kiauh.cfg` will be created if there is something that needs to be written to the printer.cfg and everything gets written to `kiauh.cfg` instead. The only thing which then gets written to the users printer.cfg is `[include kiauh.cfg]`. This line will be located at the very top of the existing printer.cfg with a little comment as a note. The user can then decide to either keep the `kiauh.cfg` or take its content, places it into the printer.cfg directly and remove the `[include kiauh.cfg]`. * The way how KIAUH interacts and writes to the users printer.cfg got changed. Usually KIAUH wrote everything directly into the printer.cfg. The way it will work from now on is, that a new file called `kiauh.cfg` will be created if there is something that needs to be written to the printer.cfg and everything gets written to `kiauh.cfg` instead. The only thing which then gets written to the users printer.cfg is `[include kiauh.cfg]`. This line will be located at the very top of the existing printer.cfg with a little comment as a note. The user can then decide to either keep the `kiauh.cfg` or take its content, places it into the printer.cfg directly and remove the `[include kiauh.cfg]`.

20
docs/index.md Normal file
View File

@@ -0,0 +1,20 @@
<h1 align="center">
KIAUH - Klipper Installation And Update Helper
</h1>
<p align="center">
<img src="assets/logo-large.png" alt="KIAUH logo">
</p>
<p align="center">
A handy installation script that makes installing Klipper (and more) a breeze!
</p>
## Features
- Easy installation of Klipper and related components
- Support for multiple instances
- Extension system for additional functionality
- Configuration management
- And more!

View File

@@ -16,9 +16,8 @@ from typing import List
from utils.fs_utils import get_data_dir from utils.fs_utils import get_data_dir
# suffixes that are not allowed to be used for instances SUFFIX_BLACKLIST: List[str] = ["None", "mcu", "obico", "bambu", "companion"]
# because they would cause conflicts with other components or are reserved
SUFFIX_BLACKLIST: List[str] = ["None", "mcu", "obico", "bambu", "companion", "hmi"]
@dataclass(repr=True) @dataclass(repr=True)
class BaseInstance: class BaseInstance:

View File

@@ -12,7 +12,6 @@ Specialized for handling Klipper style config files.
- Option Block: A line starting with a word, followed by a `:` or `=` and a newline - Option Block: A line starting with a word, followed by a `:` or `=` and a newline
- Comment: A line starting with a `#` or `;` - Comment: A line starting with a `#` or `;`
- Blank: A line containing only whitespace characters - Blank: A line containing only whitespace characters
- SaveConfig: Klippers auto-generated SAVE_CONFIG section that can be found at the very end of the config file
--- ---

View File

@@ -49,9 +49,6 @@ LINE_COMMENT_RE = re.compile(r"^\s*[#;].*")
# - the line MUST contain only whitespace characters # - the line MUST contain only whitespace characters
EMPTY_LINE_RE = re.compile(r"^\s*$") EMPTY_LINE_RE = re.compile(r"^\s*$")
SAVE_CONFIG_START_RE = re.compile(r"^#\*# <-+ SAVE_CONFIG -+>$")
SAVE_CONFIG_CONTENT_RE = re.compile(r"^#\*#.*$")
BOOLEAN_STATES = { BOOLEAN_STATES = {
"1": True, "1": True,
"yes": True, "yes": True,

View File

@@ -18,7 +18,7 @@ from ..simple_config_parser.constants import (
LINE_COMMENT_RE, LINE_COMMENT_RE,
OPTION_RE, OPTION_RE,
OPTIONS_BLOCK_START_RE, OPTIONS_BLOCK_START_RE,
SECTION_RE, LineType, INDENT, SAVE_CONFIG_START_RE, SAVE_CONFIG_CONTENT_RE, SECTION_RE, LineType, INDENT,
) )
_UNSET = object() _UNSET = object()
@@ -61,34 +61,25 @@ class SimpleConfigParser:
def __init__(self) -> None: def __init__(self) -> None:
self.header: List[str] = [] self.header: List[str] = []
self.save_config_block: List[str] = []
self.config: Dict = {} self.config: Dict = {}
self.current_section: str | None = None self.current_section: str | None = None
self.current_opt_block: str | None = None self.current_opt_block: str | None = None
self.in_option_block: bool = False self.in_option_block: bool = False
def _match_section(self, line: str) -> bool: def _match_section(self, line: str) -> bool:
"""Whether the given line matches the definition of a section""" """Wheter or not the given line matches the definition of a section"""
return SECTION_RE.match(line) is not None return SECTION_RE.match(line) is not None
def _match_option(self, line: str) -> bool: def _match_option(self, line: str) -> bool:
"""Whether the given line matches the definition of an option""" """Wheter or not the given line matches the definition of an option"""
return OPTION_RE.match(line) is not None return OPTION_RE.match(line) is not None
def _match_options_block_start(self, line: str) -> bool: def _match_options_block_start(self, line: str) -> bool:
"""Whether the given line matches the definition of a multiline option""" """Wheter or not the given line matches the definition of a multiline option"""
return OPTIONS_BLOCK_START_RE.match(line) is not None return OPTIONS_BLOCK_START_RE.match(line) is not None
def _match_save_config_start(self, line: str) -> bool:
"""Whether the given line matches the definition of a save config start"""
return SAVE_CONFIG_START_RE.match(line) is not None
def _match_save_config_content(self, line: str) -> bool:
"""Whether the given line matches the definition of a save config content"""
return SAVE_CONFIG_CONTENT_RE.match(line) is not None
def _match_line_comment(self, line: str) -> bool: def _match_line_comment(self, line: str) -> bool:
"""Whether the given line matches the definition of a comment""" """Wheter or not the given line matches the definition of a comment"""
return LINE_COMMENT_RE.match(line) is not None return LINE_COMMENT_RE.match(line) is not None
def _match_empty_line(self, line: str) -> bool: def _match_empty_line(self, line: str) -> bool:
@@ -133,14 +124,6 @@ class SimpleConfigParser:
element["value"].append(line.strip()) # indentation is removed element["value"].append(line.strip()) # indentation is removed
break break
elif self._match_save_config_start(line):
self.current_opt_block = None
self.save_config_block.append(line)
elif self._match_save_config_content(line):
self.current_opt_block = None
self.save_config_block.append(line)
elif self._match_empty_line(line) or self._match_line_comment(line): elif self._match_empty_line(line) or self._match_line_comment(line):
self.current_opt_block = None self.current_opt_block = None
@@ -202,11 +185,6 @@ class SimpleConfigParser:
if not last_line.endswith("\n"): if not last_line.endswith("\n"):
f.write("\n") f.write("\n")
if self.save_config_block:
for line in self.save_config_block:
f.write(line)
f.write("\n")
def get_sections(self) -> List[str]: def get_sections(self) -> List[str]:
"""Return a list of all section names, but exclude any section starting with '#_'""" """Return a list of all section names, but exclude any section starting with '#_'"""
return list( return list(

View File

@@ -1,116 +0,0 @@
# a comment at the very top
# should be treated as the file header
# up to the first section, including all blank lines
[section_1]
option_1: value_1
option_1_1: True # this is a boolean
option_1_2: 5 ; this is an integer
option_1_3: 1.123 #;this is a float
[section_2] ; comment
option_2: value_2
; comment
[section_3]
option_3: value_3 # comment
[section_4]
# comment
option_4: value_4
[section number 5]
#option_5: value_5
option_5 = this.is.value-5
multi_option:
# these are multi-line values
value_5_1
value_5_2 ; here is a comment
value_5_3
option_5_1: value_5_1
[gcode_macro M117]
rename_existing: M117.1
gcode:
{% if rawparams %}
{% set escaped_msg = rawparams.split(';', 1)[0].split('\x23', 1)[0]|replace('"', '\\"') %}
SET_DISPLAY_TEXT MSG="{escaped_msg}"
RESPOND TYPE=command MSG="{escaped_msg}"
{% else %}
SET_DISPLAY_TEXT
{% endif %}
# SDCard 'looping' (aka Marlin M808 commands) support
#
# Support SDCard looping
[sdcard_loop]
[gcode_macro M486]
gcode:
# Parameters known to M486 are as follows:
# [C<flag>] Cancel the current object
# [P<index>] Cancel the object with the given index
# [S<index>] Set the index of the current object.
# If the object with the given index has been canceled, this will cause
# the firmware to skip to the next object. The value -1 is used to
# indicate something that isnt an object and shouldnt be skipped.
# [T<count>] Reset the state and set the number of objects
# [U<index>] Un-cancel the object with the given index. This command will be
# ignored if the object has already been skipped
{% if 'exclude_object' not in printer %}
{action_raise_error("[exclude_object] is not enabled")}
{% endif %}
{% if 'T' in params %}
EXCLUDE_OBJECT RESET=1
{% for i in range(params.T | int) %}
EXCLUDE_OBJECT_DEFINE NAME={i}
{% endfor %}
{% endif %}
{% if 'C' in params %}
EXCLUDE_OBJECT CURRENT=1
{% endif %}
{% if 'P' in params %}
EXCLUDE_OBJECT NAME={params.P}
{% endif %}
{% if 'S' in params %}
{% if params.S == '-1' %}
{% if printer.exclude_object.current_object %}
EXCLUDE_OBJECT_END NAME={printer.exclude_object.current_object}
{% endif %}
{% else %}
EXCLUDE_OBJECT_START NAME={params.S}
{% endif %}
{% endif %}
{% if 'U' in params %}
EXCLUDE_OBJECT RESET=1 NAME={params.U}
{% endif %}
#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [bed_mesh default]
#*# version = 1
#*# points =
#*# -0.152500, -0.133125, -0.113125, -0.159375, -0.232500
#*# -0.095000, -0.078750, -0.068125, -0.133125, -0.235000
#*# -0.092500, -0.040625, 0.004375, -0.077500, -0.193125
#*# -0.073750, 0.023750, 0.085625, 0.026875, -0.085000
#*# -0.140625, 0.038125, 0.126250, 0.097500, 0.003750
#*# tension = 0.2
#*# min_x = 26.0
#*# algo = bicubic
#*# y_count = 5
#*# mesh_y_pps = 2
#*# min_y = 5.0
#*# x_count = 5
#*# max_y = 174.0
#*# mesh_x_pps = 2
#*# max_x = 194.0

View File

@@ -1,22 +0,0 @@
#*# any content
#*#
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [bed_mesh default]
#*# version = 1
#*# points =
#*# -0.152500, -0.133125, -0.113125, -0.159375, -0.232500
#*# -0.095000, -0.078750, -0.068125, -0.133125, -0.235000
#*# -0.092500, -0.040625, 0.004375, -0.077500, -0.193125
#*# -0.073750, 0.023750, 0.085625, 0.026875, -0.085000
#*# -0.140625, 0.038125, 0.126250, 0.097500, 0.003750
#*# tension = 0.2
#*# min_x = 26.0
#*# algo = bicubic
#*# y_count = 5
#*# mesh_y_pps = 2
#*# min_y = 5.0
#*# x_count = 5
#*# max_y = 174.0
#*# mesh_x_pps = 2
#*# max_x = 194.0

View File

@@ -1,6 +0,0 @@
#*# leading space prevents match
random
*# not starting with hash-star-hash
# *# spaced out
<- SAVE_CONFIG ->
;#*# semicolon first

View File

@@ -1,37 +0,0 @@
# ======================================================================= #
# Copyright (C) 2024 Dominik Willner <th33xitus@gmail.com> #
# #
# https://github.com/dw-0/simple-config-parser #
# #
# This file may be distributed under the terms of the GNU GPLv3 license #
# ======================================================================= #
from pathlib import Path
import pytest
from src.simple_config_parser.simple_config_parser import SimpleConfigParser
from tests.utils import load_testdata_from_file
BASE_DIR = Path(__file__).parent.joinpath("test_data")
MATCHING_TEST_DATA_PATH = BASE_DIR.joinpath("matching_data.txt")
NON_MATCHING_TEST_DATA_PATH = BASE_DIR.joinpath("non_matching_data.txt")
@pytest.fixture
def parser():
return SimpleConfigParser()
def test_matching_lines(parser):
"""Alle Zeilen in matching_data.txt sollen als Save-Config-Content erkannt werden."""
matching_lines = load_testdata_from_file(MATCHING_TEST_DATA_PATH)
for line in matching_lines:
assert parser._match_save_config_content(line) is True, f"Line should be a save config content: {line!r}"
def test_non_matching_lines(parser):
"""Alle Zeilen in non_matching_data.txt sollen NICHT als Save-Config-Content erkannt werden."""
non_matching_lines = load_testdata_from_file(NON_MATCHING_TEST_DATA_PATH)
for line in non_matching_lines:
assert parser._match_save_config_content(line) is False, f"Line should not be a save config content: {line!r}"

View File

@@ -1,6 +0,0 @@
#*# <- SAVE_CONFIG ->
#*# <---- SAVE_CONFIG ---->
#*# <------------------- SAVE_CONFIG ------------------->
#*# <---------------------- SAVE_CONFIG ---------------------->
#*# <----- SAVE_CONFIG ->
#*# <- SAVE_CONFIG ----------------->

View File

@@ -1,13 +0,0 @@
#*#<- SAVE_CONFIG ->
#*# <-SAVE_CONFIG ->
#*# <- SAVE_CONFIG->
#*# <- SAVE_CONFIG -> extra
#*# SAVE_CONFIG ---->
#*# < SAVE_CONFIG >
# *# <- SAVE_CONFIG ->
<- SAVE_CONFIG ->
random text
#*# <---------------------- SAVE_CONFIG ---------------------->
#*# <---------------------- SAVE_CONFIG ----------------------> #*#
#*# <-------------------------------------------->
#*# SAVE_CONFIG

View File

@@ -1,37 +0,0 @@
# ======================================================================= #
# Copyright (C) 2024 Dominik Willner <th33xitus@gmail.com> #
# #
# https://github.com/dw-0/simple-config-parser #
# #
# This file may be distributed under the terms of the GNU GPLv3 license #
# ======================================================================= #
from pathlib import Path
import pytest
from src.simple_config_parser.simple_config_parser import SimpleConfigParser
from tests.utils import load_testdata_from_file
BASE_DIR = Path(__file__).parent.joinpath("test_data")
MATCHING_TEST_DATA_PATH = BASE_DIR.joinpath("matching_data.txt")
NON_MATCHING_TEST_DATA_PATH = BASE_DIR.joinpath("non_matching_data.txt")
@pytest.fixture
def parser():
return SimpleConfigParser()
def test_matching_lines(parser):
"""Test that all lines in the matching data file are correctly identified as save config start lines."""
matching_lines = load_testdata_from_file(MATCHING_TEST_DATA_PATH)
for line in matching_lines:
assert parser._match_save_config_start(line) is True, f"Line should be a save config start: {line!r}"
def test_non_matching_lines(parser):
"""Test that all lines in the non-matching data file are correctly identified as not save config start lines."""
non_matching_lines = load_testdata_from_file(NON_MATCHING_TEST_DATA_PATH)
for line in non_matching_lines:
assert parser._match_save_config_start(line) is False, f"Line should not be a save config start: {line!r}"

View File

@@ -13,7 +13,7 @@ from src.simple_config_parser.simple_config_parser import SimpleConfigParser
from tests.utils import load_testdata_from_file from tests.utils import load_testdata_from_file
BASE_DIR = Path(__file__).parent.parent.joinpath("assets") BASE_DIR = Path(__file__).parent.parent.joinpath("assets")
CONFIG_FILES = ["test_config_1.cfg", "test_config_2.cfg", "test_config_3.cfg", "test_config_4.cfg"] CONFIG_FILES = ["test_config_1.cfg", "test_config_2.cfg", "test_config_3.cfg"]
@pytest.fixture(params=CONFIG_FILES) @pytest.fixture(params=CONFIG_FILES)

View File

@@ -150,9 +150,9 @@ class ExtensionSubmenu(BaseMenu):
if website or repo: if website or repo:
links_lines: List[str] = ["Links:"] links_lines: List[str] = ["Links:"]
if website: if website:
links_lines.append(f" {website}") links_lines.append(f"- Website: {website}")
if repo: if repo:
links_lines.append(f" {repo}") links_lines.append(f"- GitHub: {repo}")
links_text = Logger.format_content( links_text = Logger.format_content(
links_lines, links_lines,

View File

@@ -4,7 +4,6 @@
"module": "gcode_shell_cmd_extension", "module": "gcode_shell_cmd_extension",
"maintained_by": "dw-0", "maintained_by": "dw-0",
"display_name": "G-Code Shell Command", "display_name": "G-Code Shell Command",
"description": ["Run a shell commands from gcode."], "description": ["Run a shell commands from gcode."]
"updates": false
} }
} }

View File

@@ -5,8 +5,6 @@
"maintained_by": "Staubgeborener", "maintained_by": "Staubgeborener",
"display_name": "Klipper-Backup", "display_name": "Klipper-Backup",
"description": ["Backup all your Klipper files to GitHub"], "description": ["Backup all your Klipper files to GitHub"],
"website": "https://klipperbackup.xyz",
"repo": "https://github.com/Staubgeborener/klipper-backup",
"updates": true "updates": true
} }
} }

View File

@@ -4,8 +4,6 @@
"module": "mainsail_theme_installer_extension", "module": "mainsail_theme_installer_extension",
"maintained_by": "dw-0", "maintained_by": "dw-0",
"display_name": "Mainsail Theme Installer", "display_name": "Mainsail Theme Installer",
"description": ["Install Mainsail Themes maintained by the Mainsail community."], "description": ["Install Mainsail Themes maintained by the Mainsail community."]
"website": "https://docs.mainsail.xyz/theming/themes",
"updates": false
} }
} }

View File

@@ -7,7 +7,6 @@
"description": [ "description": [
"Companion for Mobileraker, enabling push notification for Klipper using Moonraker." "Companion for Mobileraker, enabling push notification for Klipper using Moonraker."
], ],
"repo": "https://github.com/Clon1998/mobileraker_companion",
"updates": true "updates": true
} }
} }

View File

@@ -11,8 +11,6 @@
"- 25FPS High-Def Webcam Streaming", "- 25FPS High-Def Webcam Streaming",
"- Free 4.9-Star Mobile App" "- Free 4.9-Star Mobile App"
], ],
"website": "https://obico.io",
"repo": "github.com/TheSpaghettiDetective/moonraker-obico",
"updates": true "updates": true
} }
} }

View File

@@ -12,7 +12,6 @@
"- Live Gcode preview", "- Live Gcode preview",
"- And much much more!" "- And much much more!"
], ],
"repo": "https://github.com/crysxd/OctoApp-Plugin",
"updates": true "updates": true
} }
} }

View File

@@ -11,8 +11,6 @@
"- Real-time Notifications", "- Real-time Notifications",
"- Live Streaming, and More!" "- Live Streaming, and More!"
], ],
"website": "https://octoeverywhere.com",
"repo": "github.com/QuinnDamerell/OctoPrint-OctoEverywhere",
"updates": true "updates": true
} }
} }

View File

@@ -5,7 +5,6 @@
"maintained_by": "Kragrathea", "maintained_by": "Kragrathea",
"display_name": "PrettyGCode for Klipper", "display_name": "PrettyGCode for Klipper",
"description": ["3D G-Code viewer for Klipper"], "description": ["3D G-Code viewer for Klipper"],
"repo": "https://github.com/Kragrathea/pgcode",
"updates": true "updates": true
} }
} }

View File

@@ -1,16 +1,13 @@
{ {
"metadata": { "metadata": {
"index": 10, "index": 10,
"module": "simply_print_extension", "module": "simply_print_extension",
"maintained_by": "dw-0", "maintained_by": "dw-0",
"display_name": "SimplyPrint", "display_name": "SimplyPrint",
"description": [ "description": [
"3D Printer Cloud Management Software.", "3D Printer Cloud Management Software.",
"\n\n", "\n\n",
"3D printing doesn't have to be a complicated, analog, SD card-filled experience; step into the future of modern 3D printing" "3D printing doesn't have to be a complicated, analog, SD card-filled experience; step into the future of modern 3D printing"
], ]
"website": "https://simplyprint.io", }
"repo": "https://github.com/SimplyPrint",
"updates": false
}
} }

View File

@@ -13,7 +13,6 @@
"\n\n", "\n\n",
"Note: This extension installs Spoolman using Docker. Docker must be installed on your system before installing Spoolman." "Note: This extension installs Spoolman using Docker. Docker must be installed on your system before installing Spoolman."
], ],
"repo": "https://github.com/Donkie/Spoolman",
"updates": true "updates": true
} }
} }

View File

@@ -5,7 +5,7 @@
"maintained_by": "nlef", "maintained_by": "nlef",
"display_name": "Moonraker Telegram Bot", "display_name": "Moonraker Telegram Bot",
"description": ["Control your printer with the Telegram messenger app."], "description": ["Control your printer with the Telegram messenger app."],
"repo": "https://github.com/nlef/moonraker-telegram-bot", "project_url": "https://github.com/nlef/moonraker-telegram-bot",
"updates": true "updates": true
} }
} }

82
mkdocs.yml Normal file
View File

@@ -0,0 +1,82 @@
site_name: KIAUH Documentation
site_description: Documentation for the Klipper Installation And Update Helper
repo_url: https://github.com/dw-0/kiauh
repo_name: dw-0/kiauh
edit_uri: edit/master/docs
copyright: Copyright &copy; 2025 Dominik Willner
theme:
name: material
logo: assets/logo.png
favicon: assets/logo.png
icon:
repo: fontawesome/brands/github
palette:
- media: "(prefers-color-scheme: light)"
scheme: default
primary: blue-grey
accent: cyan
toggle:
icon: material/weather-night
name: Switch to dark mode
- media: "(prefers-color-scheme: dark)"
scheme: slate
primary: blue-grey
accent: cyan
toggle:
icon: material/weather-sunny
name: Switch to light mode
features:
- navigation.instant
- navigation.tracking
- navigation.sections
- navigation.expand
- navigation.indexes
- navigation.top
- toc.follow
- content.code.copy
plugins:
- search
- git-revision-date-localized:
enable_creation_date: true
- mkdocstrings:
handlers:
python:
paths: [.]
options:
docstring_style: google
markdown_extensions:
- admonition
- pymdownx.details
- pymdownx.superfences
- pymdownx.highlight:
anchor_linenums: true
- pymdownx.inlinehilite
- pymdownx.snippets
- pymdownx.superfences
- tables
- attr_list
- md_in_html
nav:
- Home: index.md
- Installation: installation.md
- Configuration: configuration.md
- Extensions:
- extensions/index.md
- extensions/gcode-shell-command.md
- Development:
- development/contributing.md
- development/changelog.md
extra:
social:
- icon: simple/github
link: https://github.com/dw-0
- icon: simple/kofi
link: https://ko-fi.com/dw__0
- icon: simple/paypal
link: https://www.paypal.com/paypalme/dwillner0

4
requirements.txt Normal file
View File

@@ -0,0 +1,4 @@
mkdocs-material
mkdocs
mkdocstrings[python]
mkdocs-git-revision-date-localized-plugin

View File

@@ -27,7 +27,7 @@ function moonraker_systemd() {
### ###
# any moonraker client that uses "moonraker" in its own name must be blacklisted using # any moonraker client that uses "moonraker" in its own name must be blacklisted using
# this variable, otherwise they will be falsely recognized as moonraker instances # this variable, otherwise they will be falsely recognized as moonraker instances
blacklist="obico|hmi|telegram-bot" blacklist="obico"
ignore="${SYSTEMD}/moonraker-(${blacklist}).service" ignore="${SYSTEMD}/moonraker-(${blacklist}).service"
match="${SYSTEMD}/moonraker(-[0-9a-zA-Z]+)?.service" match="${SYSTEMD}/moonraker(-[0-9a-zA-Z]+)?.service"