This commit is contained in:
florian committed 2026-10-03 12:52:58 +02:00
1 parent 7ed84a1368
commit 45d3b0ec0d
11 files changed
+1106 -12

No files matched your search

Vendored
BIN
View File
Binary file not shown.
+151 -10
View File
@@ -37,6 +37,16 @@ FOOTER_PAGE = "footer" # Baustein: wird unter den Inhalt jeder Seite gesetzt
# ---------------------------------------------------------------- markdown
def inline(s):
"""Inline-Markdown: bilder, code, fett, kursiv, Links."""
s = re.sub(r"`([^`]+)`", r"<code>\1</code>", s)
s = re.sub(r"!\[([^\]]*)\]\(([^)]+)\)", r'<img src="\2" alt="\1">', s)
s = re.sub(r"\*\*([^*]+)\*\*", r"<strong>\1</strong>", s)
s = re.sub(r"\*([^*]+)\*", r"<em>\1</em>", s)
s = re.sub(r"\[([^\]]+)\]\(([^)]+)\)", r'<a href="\2">\1</a>', s)
return s
def md_to_html(text, headings=None):
"""Minimaler Markdown->HTML-Konverter:
Ueberschriften, **fett**, *kursiv*, `code`, [Links](url),
@@ -44,6 +54,8 @@ def md_to_html(text, headings=None):
Ueberschriften bekommen id-Anker; in headings (Liste) werden
optional (anker, text) aller Ueberschriften gesammelt.
"""
# vergessenes Trigger-Wort "image" direkt vor einem Bild nicht mit ausgeben
text = re.sub(r"\bimage\s*(?=!\[)", "", text, flags=re.IGNORECASE)
lines = text.replace("\r\n", "\n").split("\n")
out = []
i = 0
@@ -53,13 +65,6 @@ def md_to_html(text, headings=None):
used_ids = {}
sec_stack = [] # offene Sektionen (pro # mehr eine Ebene, eingerueckt)
def inline(s):
s = re.sub(r"`([^`]+)`", r"<code>\1</code>", s)
s = re.sub(r"\*\*([^*]+)\*\*", r"<strong>\1</strong>", s)
s = re.sub(r"\*([^*]+)\*", r"<em>\1</em>", s)
s = re.sub(r"\[([^\]]+)\]\(([^)]+)\)", r'<a href="\2">\1</a>', s)
return s
def close_list():
nonlocal in_list, list_tag
if in_list:
@@ -134,6 +139,24 @@ def md_to_html(text, headings=None):
i += 1
continue
# Tabellen: | zelle | zelle | mit --- Trennzeile
if stripped.startswith("|"):
close_list()
rows = []
j = i
while j < len(lines) and lines[j].strip().startswith("|"):
rows.append(lines[j].strip())
j += 1
tbl = _parse_table(rows)
if tbl:
out.append(tbl)
i = j
else:
# keine gueltige Tabelle -> als normaler Absatz
out.append("<p>%s</p>" % inline(_escape(stripped)))
i += 1
continue
m = re.match(r"^([-*+])\s+(.*)$", stripped)
if m:
if not in_list or list_tag != "ul":
@@ -167,7 +190,7 @@ def md_to_html(text, headings=None):
close_list()
para = [stripped]
while (i + 1 < len(lines) and lines[i + 1].strip()
and not re.match(r"^(#{1,6}\s|[-*+]\s|\d+\.\s|>|```|-{3,}$|<)",
and not re.match(r"^(#{1,6}\s|[-*+]\s|\d+\.\s|>|```|-{3,}$|<|\|)",
lines[i + 1].strip())):
i += 1
para.append(lines[i].strip())
@@ -185,6 +208,54 @@ def _escape(s):
return (s.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;"))
def _parse_table(rows):
"""Baut aus |-getrennten Zeilen eine HTML-Tabelle.
Zeile 1: Kopfzeile, Zeile 2: Trenner (---, :---, ---:, :---:),
danach: Datenzeilen. Liefert None, wenn es keine gueltige Tabelle ist.
"""
def split_row(r):
if r.startswith("|"):
r = r[1:]
if r.endswith("|"):
r = r[:-1]
return [c.strip() for c in r.split("|")]
def is_sep(c):
return re.match(r"^:?-{2,}:?$", c) is not None
if len(rows) < 2 or not all(is_sep(c) and c for c in split_row(rows[1])):
return None
aligns = []
for c in split_row(rows[1]):
left, right = c.startswith(":"), c.endswith(":")
if left and right:
aligns.append("center")
elif right:
aligns.append("right")
else:
aligns.append("left")
def cell(tag, j, text):
style = ' style="text-align: %s"' % aligns[j] if j < len(aligns) else ""
return "<%s%s>%s</%s>" % (tag, style, inline(text), tag)
out = ["<table>", "<thead><tr>"]
for j, c in enumerate(split_row(rows[0])):
out.append(cell("th", j, _escape(c)))
out.append("</tr></thead>")
if len(rows) > 2:
out.append("<tbody>")
for r in rows[2:]:
out.append("<tr>")
for j, c in enumerate(split_row(r)):
out.append(cell("td", j, _escape(c)))
out.append("</tr>")
out.append("</tbody>")
out.append("</table>")
return "".join(out)
def _slugify(s):
"""Ueberschriftentext -> HTML-id (ankertauglich, klein, ohne Sonderzeichen)."""
s = s.lower()
@@ -388,6 +459,14 @@ class Handler(BaseHTTPRequestHandler):
self._json({"slug": slug, "raw": load_page(slug)})
else:
self._json({"error": "Seite nicht gefunden"}, 404)
elif path == "/api/images":
img_dir = os.path.join(ROOT, "images")
files = []
if os.path.isdir(img_dir):
for f in sorted(os.listdir(img_dir)):
if os.path.isfile(os.path.join(img_dir, f)) and not f.startswith("."):
files.append(f)
self._json({"images": files})
elif path == "/api/export":
self._json({"exported": export_site()})
else:
@@ -433,7 +512,11 @@ ADMIN_HTML = """<!DOCTYPE html>
#side h1 { font-size: 1rem; }
#pages a { display: block; padding: .35rem .5rem; border-radius: 4px; cursor: pointer; text-decoration: none; color: #000; }
#pages a.active, #pages a:hover { background: #ddd; }
#main { flex: 1; display: flex; flex-direction: column; padding: 1rem; box-sizing: border-box; gap: .5rem; }
#main { flex: 1; display: flex; flex-direction: column; padding: 1rem; box-sizing: border-box; gap: .5rem; position: relative; }
#imgdrop { position: absolute; top: 3.2rem; left: 1rem; background: #fff; border: 1px solid #999; border-radius: 4px; box-shadow: 0 2px 10px rgba(0,0,0,.25); max-height: 220px; overflow: auto; z-index: 20; min-width: 240px; }
#imgdrop .imgdrop-title { font-size: .8rem; padding: .4rem .6rem; background: #eee; }
#imglist a { display: block; padding: .35rem .6rem; cursor: pointer; color: #000; }
#imglist a:hover { background: #dde8ff; }
#toolbar { display: flex; gap: .5rem; align-items: center; }
button { padding: .45rem .9rem; border: 1px solid #999; border-radius: 4px; background: #fff; cursor: pointer; }
button.primary { background: #0066cc; color: #fff; border-color: #0066cc; }
@@ -461,12 +544,17 @@ ADMIN_HTML = """<!DOCTYPE html>
<button id="btn-delete" style="margin-left:auto">Seite l&ouml;schen</button>
</div>
<div id="msg"></div>
<div id="imgdrop" style="display:none">
<div class="imgdrop-title">Bild aus images/ einf&uuml;gen:</div>
<div id="imglist"></div>
</div>
<textarea id="editor" spellcheck="false">---
titel: Neue Seite
beschreibung: Kurze Seitenbeschreibung fuer Suchmaschinen (SEO).
---
Hier den Inhalt schreiben. **fett**, *kursiv*, [Link](seite.html), # Ueberschrift, - Liste.</textarea>
Hier den Inhalt schreiben. **fett**, *kursiv*, [Link](seite.html), # Ueberschrift, - Liste.
Das Wort "image" tippen, um ein Bild aus dem images-Ordner einzufuegen.</textarea>
<div id="preview"></div>
</div>
<script>
@@ -557,6 +645,59 @@ $("btn-export").onclick = async () => {
msg(d.exported ? "Exportiert: " + d.exported.join(", ") : ("Fehler: " + d.error));
};
// ---- Bild einfuegen: "image" tippen -> Dropdown mit Dateien aus images/ ----
let dropGen = 0;
let lastCaret = 0;
function hideImageDrop() {
dropGen++;
$("imgdrop").style.display = "none";
}
async function showImageDrop(caret) {
const gen = ++dropGen;
lastCaret = caret;
const d = await api("/api/images");
if (gen !== dropGen) return; // inzwischen wieder geschlossen
const list = $("imglist");
list.innerHTML = "";
if (!d.images.length) {
const p = document.createElement("div");
p.style.padding = ".4rem .6rem";
p.textContent = "Keine Dateien in images/.";
list.appendChild(p);
}
for (const f of d.images) {
const a = document.createElement("a");
a.textContent = f;
a.onmousedown = e => { e.preventDefault(); insertImage(f); };
list.appendChild(a);
}
$("imgdrop").style.display = "block";
}
function insertImage(name) {
const ed = $("editor");
let pos = lastCaret;
let before = ed.value.slice(0, pos), after = ed.value.slice(pos);
const md = "![" + name.replace(/\.[^.]+$/, "") + "](images/" + name + ")";
// das getippte Wort "image" durch die Bild-Syntax ersetzen
if (before.slice(-5).toLowerCase() === "image") before = before.slice(0, -5);
ed.value = before + md + after;
ed.focus();
ed.selectionStart = ed.selectionEnd = (before + md).length;
hideImageDrop();
}
$("editor").addEventListener("input", () => {
const ed = $("editor");
const pos = ed.selectionStart;
const tail = ed.value.slice(Math.max(0, pos - 5), pos).toLowerCase();
if (tail === "image") showImageDrop(pos);
else hideImageDrop();
});
$("editor").addEventListener("keydown", e => { if (e.key === "Escape") hideImageDrop(); });
loadPages();
</script>
</body>
+40
View File
@@ -138,6 +138,24 @@ main div.sec0 {
margin-left: 0;
}
/* ---- Bilder ---- */
img {
display: block; /* Text startet immer unter dem Bild */
max-width: 500px; /* Desktop: maximal 500px breit */
height: auto;
border: 1px solid #333333; /* dunkelgrauer Rand */
margin: .8rem 0;
}
/* Smartphone: Bild ueber die volle Breite */
@media (max-width: 600px) {
img {
max-width: 100%;
width: 100%;
}
}
/* ---- Anker-Navigation im Header (Links auf die Ueberschriften) ---- */
.anker-nav {
@@ -215,6 +233,28 @@ hr {
margin: 1.5rem 0;
}
/* ---- Tabellen ---- */
table {
border-collapse: collapse;
margin: 1rem 0;
}
th, td {
border: 1px solid var(--border);
padding: .4rem .8rem;
text-align: left;
}
th {
color: var(--heading);
background: #141414;
}
td {
color: var(--text);
}
/* ---- Code ---- */
code {
+872
View File
@@ -0,0 +1,872 @@
[Version]
AppVersion=5.13
Version=353
[General]
ColorLabel=0
InTrash=false
[Exposure]
Auto=false
Clip=0.02
Compensation=0
Brightness=0
Contrast=0
Saturation=0
Black=0
HighlightCompr=0
HighlightComprThreshold=0
ShadowCompr=50
HistogramMatching=false
CurveFromHistogramMatching=false
ClampOOG=true
CurveMode=Standard
CurveMode2=Standard
Curve=0;
Curve2=0;
[HLRecovery]
Enabled=false
Method=Coloropp
Hlbl=0
Hlth=1
[Retinex]
Enabled=false
Str=20
Scal=3
Iter=1
Grad=1
Grads=1
Gam=1.3
Slope=3
Median=false
Neigh=80
Offs=0
Vart=200
Limd=8
highl=4
skal=3
complexMethod=normal
RetinexMethod=high
mapMethod=none
viewMethod=none
Retinexcolorspace=Lab
Gammaretinex=none
CDCurve=0;
MAPCurve=0;
CDHCurve=0;
LHCurve=0;
Highlights=0
HighlightTonalWidth=80
Shadows=0
ShadowTonalWidth=80
Radius=40
TransmissionCurve=1;0;0.5;0.34999999999999998;0.34999999999999998;0.59999999999999998;0.75;0.34999999999999998;0.34999999999999998;1;0.5;0.34999999999999998;0.34999999999999998;
GainTransmissionCurve=1;0;0.10000000000000001;0.34999999999999998;0;0.25;0.25;0.34999999999999998;0.34999999999999998;0.69999999999999996;0.25;0.34999999999999998;0.34999999999999998;1;0.10000000000000001;0;0;
[Local Contrast]
Enabled=false
Radius=80
Amount=0.20000000000000001
Darkness=1
Lightness=1
[Channel Mixer]
Enabled=false
Red=1000;0;0;
Green=0;1000;0;
Blue=0;0;1000;
[Black & White]
Enabled=false
Method=Desaturation
Auto=false
ComplementaryColors=true
Setting=RGB-Rel
Filter=None
MixerRed=33
MixerOrange=33
MixerYellow=33
MixerGreen=33
MixerCyan=33
MixerBlue=33
MixerMagenta=33
MixerPurple=33
GammaRed=0
GammaGreen=0
GammaBlue=0
Algorithm=SP
LuminanceCurve=0;
BeforeCurveMode=Standard
AfterCurveMode=Standard
BeforeCurve=0;
AfterCurve=0;
[Luminance Curve]
Enabled=false
Brightness=0
Contrast=0
Chromaticity=0
Gamutmunse=MUN
RedAndSkinTonesProtection=0
LCredsk=true
LCurve=0;
aCurve=0;
bCurve=0;
ccCurve=0;
chCurve=0;
lhCurve=0;
hhCurve=0;
LcCurve=0;
ClCurve=0;
[Sharpening]
Enabled=false
Contrast=20
Method=usm
Radius=0.5
BlurRadius=0.20000000000000001
Amount=200
Threshold=20;80;2000;1200;
OnlyEdges=false
EdgedetectionRadius=1.8999999999999999
EdgeTolerance=1800
HalocontrolEnabled=false
HalocontrolAmount=85
DeconvRadius=0.75
DeconvAmount=100
DeconvDamping=0
DeconvIterations=30
[Vibrance]
Enabled=false
Pastels=0
Saturated=0
PSThreshold=0;75;
ProtectSkins=false
AvoidColorShift=true
PastSatTog=true
SkinTonesCurve=0;
[SharpenEdge]
Enabled=false
Passes=2
Strength=50
ThreeChannels=false
[SharpenMicro]
Enabled=false
Matrix=false
Strength=20
Contrast=20
Uniformity=5
[White Balance]
Enabled=true
Setting=Camera
Temperature=6501
Green=1
Equal=1
TemperatureBias=0
StandardObserver=TWO_DEGREES
Itcwb_green=0
Itcwb_rangegreen=1
Itcwb_nopurple=false
Itcwb_alg=false
Itcwb_prim=beta
Itcwb_sampling=false
CompatibilityVersion=2
[Color appearance]
Enabled=false
Degree=90
AutoDegree=true
Degreeout=90
AutoDegreeout=true
Surround=Average
complex=normal
ModelCat=16
CatCat=clas
Surrsrc=Average
AdaptLum=16
Badpixsl=0
Model=RawT
Illum=i50
Algorithm=JC
J-Light=0
Q-Bright=0
C-Chroma=0
S-Chroma=0
S-Chroma-red=0
S-Chroma-green=0
S-Chroma-blue=0
M-Chroma=0
J-Contrast=0
Q-Contrast=0
H-Hue=0
H-Hue-red=0
H-Hue-green=0
H-Hue-blue=0
RSTProtection=0
AdaptScene=2000
AutoAdapscen=true
YbScene=18
Autoybscen=true
SurrSource=false
Gamut=false
Tempout=5003
Autotempout=true
Greenout=1
Tempsc=5003
Greensc=1
Ybout=18
Datacie=false
Tonecie=false
CurveMode=Lightness
CurveMode2=Brightness
CurveMode3=Chroma
Curve=0;
Curvered=0;
Curvegreen=0;
Curveblue=0;
Curve2=0;
Curve3=0;
[Impulse Denoising]
Enabled=false
Threshold=50
[Defringing]
Enabled=false
Radius=2
Threshold=13
HueCurve=1;0.16666666699999999;0;0.34999999999999998;0.34999999999999998;0.34699999999999998;0;0.34999999999999998;0.34999999999999998;0.51366742600000004;0;0.34999999999999998;0.34999999999999998;0.66894457100000004;0;0.34999999999999998;0.34999999999999998;0.82877752459999998;0.97835991;0.34999999999999998;0.34999999999999998;0.99088838270000001;0;0.34999999999999998;0.34999999999999998;
[Dehaze]
Enabled=false
Strength=50
ShowDepthMap=false
Depth=25
Saturation=50
[Directional Pyramid Denoising]
Enabled=false
Enhance=false
Median=false
Luma=0
Ldetail=0
Chroma=15
Method=Lab
LMethod=SLI
CMethod=MAN
C2Method=AUTO
SMethod=shal
MedMethod=soft
RGBMethod=soft
MethodMed=Lonly
Redchro=0
Bluechro=0
AutoGain=true
Gamma=1.7
Passes=1
LCurve=1;0.050000000000000003;0.14999999999999999;0.34999999999999998;0.34999999999999998;0.55000000000000004;0.040000000000000001;0.34999999999999998;0.34999999999999998;
CCCurve=1;0.050000000000000003;0.5;0.34999999999999998;0.34999999999999998;0.34999999999999998;0.050000000000000003;0.34999999999999998;0.34999999999999998;
[EPD]
Enabled=false
Strength=0.5
Gamma=1
EdgeStopping=1.3999999999999999
Scale=1
ReweightingIterates=0
[FattalToneMapping]
Enabled=false
Threshold=30
Amount=20
Anchor=50
[Shadows & Highlights]
Enabled=false
Highlights=0
HighlightTonalWidth=70
Shadows=0
ShadowTonalWidth=30
Radius=40
Lab=false
[Compression gamut]
Enabled=false
th_c=0.81499999999999995
th_m=0.80300000000000005
th_y=0.88
d_c=1.147
Autodc=true
d_m=1.264
Autodm=true
d_y=1.3120000000000001
Autody=true
pwr=1.2
colorspace=dcip3
rolloff=true
[ToneEqualizer]
Enabled=false
Band0=0
Band1=0
Band2=0
Band3=0
Band4=0
Band5=0
Regularization=0
Pivot=0
[Crop]
Enabled=false
X=0
Y=0
W=1920
H=1080
FixedRatio=true
Ratio=As Image
Orientation=As Image
[CropGuide]
Enabled=true
RuleOfThirds={"Enabled":false,"Red":1,"Green":1,"Blue":1,"Alpha":0.618}
RuleOfDiagonals={"Enabled":false,"Red":1,"Green":1,"Blue":1,"Alpha":0.618}
HarmonicMeans={"Enabled":false,"Red":1,"Green":1,"Blue":1,"Alpha":0.618}
Crosshair={"Enabled":false,"Red":1,"Green":1,"Blue":1,"Alpha":0.618}
Grid={"Enabled":false,"Red":1,"Green":1,"Blue":1,"Alpha":0.618}
GoldenTriangle={"Enabled":false,"Red":1,"Green":1,"Blue":1,"Alpha":0.618}
GoldenRatio={"Enabled":false,"Red":1,"Green":1,"Blue":1,"Alpha":0.618}
Epassport={"Enabled":false,"Red":1,"Green":1,"Blue":1,"Alpha":0.618}
CenteredSquare={"Enabled":false,"Red":1,"Green":1,"Blue":1,"Alpha":0.618}
GoldenTriangleMirror=false
GoldenRatioRotate=false
GoldenRatioMirror=false
Bleed=0
Basis=Scale
AspectRatios=[]
[Coarse Transformation]
Rotate=0
HorizontalFlip=false
VerticalFlip=false
[Common Properties for Transformations]
Method=log
Scale=1
Scale horizontally=1
Scale vertically=1
AutoFill=true
[Rotation]
Degree=0
[Distortion]
Amount=0
FocalLength=12
Defish=false
[LensProfile]
LcMode=none
LCPFile=
UseDistortion=true
UseVignette=true
UseCA=false
LFCameraMake=
LFCameraModel=
LFLens=
[Perspective]
Method=simple
Horizontal=0
Vertical=0
CameraCropFactor=0
CameraFocalLength=0
CameraPitch=0
CameraRoll=0
CameraShiftHorizontal=0
CameraShiftVertical=0
CameraYaw=0
ProjectionShiftHorizontal=0
ProjectionPitch=0
ProjectionRotate=0
ProjectionShiftVertical=0
ProjectionYaw=0
ControlLineValues=
ControlLineTypes=
[Gradient]
Enabled=false
Degree=0
Feather=25
Strength=0.59999999999999998
CenterX=0
CenterY=0
[Locallab]
Enabled=false
Selspot=0
[PCVignette]
Enabled=false
Strength=0.59999999999999998
Feather=50
Roundness=50
[CACorrection]
Red=0
Blue=0
[Vignetting Correction]
Amount=0
Radius=50
Strength=1
CenterX=0
CenterY=0
[Resize]
Enabled=true
Scale=0.63
AppliesTo=Cropped area
Method=Lanczos
DataSpecified=4
Width=900
Height=900
LongEdge=1200
ShortEdge=675
AllowUpscaling=false
[Framing]
Enabled=false
FramingMethod=Standard
AspectRatio=0
Orientation=AsImage
FramedWidth=800
FramedHeight=600
AllowUpscaling=false
BorderSizingMethod=Percentage
Basis=Auto
RelativeBorderSize=0.10000000000000001
MinSizeEnabled=false
MinWidth=0
MinHeight=0
AbsWidth=0
AbsHeight=0
BorderRed=255
BorderGreen=255
BorderBlue=255
[PostDemosaicSharpening]
Enabled=false
Contrast=10
AutoContrast=true
AutoRadius=true
DeconvRadius=0.75
DeconvRadiusOffset=0
DeconvIterCheck=true
Showcap=false
Noisecaptype=true
Noisecap=0
Noisecapafter=0
DeconvIterations=20
[PostResizeSharpening]
Enabled=false
Contrast=15
Method=rld
Radius=0.5
Amount=200
Threshold=20;80;2000;1200;
OnlyEdges=false
EdgedetectionRadius=1.8999999999999999
EdgeTolerance=1800
HalocontrolEnabled=false
HalocontrolAmount=85
DeconvRadius=0.45000000000000001
DeconvAmount=100
DeconvDamping=0
DeconvIterations=100
[Color Management]
InputProfile=(embedded)
ToneCurve=false
ApplyLookTable=false
ApplyBaselineExposureOffset=true
ApplyHueSatMap=true
DCPIlluminant=0
WorkingProfile=Rec2020
WorkingTRC=none
Wwgamut=none
Will=D65
Wprim=def
Wcat=brad
OpacityCurveWLI=1;0;0.5;0.34999999999999998;0.34999999999999998;0.5;0.69999999999999996;0.34999999999999998;0.34999999999999998;1;0.5;0.34999999999999998;0.34999999999999998;
WorkingTRCGamma=2.3999999999999999
WorkingTRCSlope=12.92
WorkingTRCsat=0.5
Wmidtcie=0
Sigmatrc=1
Offstrc=1
Residtrc=0
Wgampower=1
Wgamgain=0
Pyrwavtrc=2
Wsmoothcie=false
Wsmoothciesli=0
Redx=0.70799999999999996
Redy=0.29199999999999998
Grex=0.17000000000000001
Grey=0.79700000000000004
Blux=0.13100000000000001
Bluy=0.045999999999999999
Redrot=0
Redsat=0
Grerot=0
Gresat=0
Blurot=0
Blusat=0
Refi=0
Shiftx=0
Shifty=0
LabGridcieALow=0.46908899999999998
LabGridcieBLow=-0.287273
LabGridcieAHigh=-0.57999999999999996
LabGridcieBHigh=-0.81799999999999995
LabGridcieGx=-0.50900900000000004
LabGridcieGy=0.63090000000000002
LabGridcieWx=-0.24959000000000001
LabGridcieWy=-0.22
LabGridcieMx=0
LabGridcieMy=0
Preser=0
Fbw=false
TrcExp=false
WavExp=false
Gamut=true
OutputProfile=RTv4_sRGB
aIntent=Relative
OutputProfileIntent=Relative
OutputBPC=true
[Wavelet]
Enabled=false
Strength=100
Balance=0
Sigmafin=1
Sigmaton=1
Sigmacol=1
Sigmadir=1
Rangeab=20
Protab=0
Iter=0
MaxLev=7
TilesMethod=full
complexMethod=normal
mixMethod=mix7
sliMethod=sli
quaMethod=cons
DaubMethod=6_
ChoiceLevMethod=all
BackMethod=grey
LevMethod=4
DirMethod=all
CBgreenhigh=0
CBgreenmed=0
CBgreenlow=0
CBbluehigh=0
CBbluemed=0
CBbluelow=0
Ballum=7
Sigm=1
Levden=0
Thrden=0
Limden=0
Balchrom=0
Chromfine=0
Chromcoarse=0
MergeL=20
MergeC=20
Softrad=0
Softradend=0
Strend=50
Detend=0
Thrend=0
Expcontrast=false
Expchroma=false
Expedge=false
expbl=false
Expresid=false
Expfinal=false
Exptoning=false
Expnoise=false
Expclari=false
LabGridALow=0
LabGridBLow=0
LabGridAHigh=0
LabGridBHigh=0
Contrast1=0
Contrast2=0
Contrast3=0
Contrast4=0
Contrast5=0
Contrast6=0
Contrast7=0
Contrast8=0
Contrast9=0
Chroma1=0
Chroma2=0
Chroma3=0
Chroma4=0
Chroma5=0
Chroma6=0
Chroma7=0
Chroma8=0
Chroma9=0
ContExtra=0
HSMethod=with
HLRange=50;75;100;98;
SHRange=0;2;50;25;
Edgcont=0;10;75;40;
Level0noise=0;0;
Level1noise=0;0;
Level2noise=0;0;
Level3noise=0;0;
Leveldenoise=0;0;
Levelsigm=1;1;
ThresholdHighlight=4
ThresholdShadow=5
Edgedetect=90
Edgedetectthr=20
EdgedetectthrHi=0
Edgesensi=60
Edgeampli=10
ThresholdChroma=5
CHromaMethod=link
Medgreinf=less
Ushamethod=clari
CHSLromaMethod=SL
EDMethod=CU
NPMethod=none
BAMethod=none
TMMethod=cont
ChromaLink=0
ContrastCurve=1;0;0.25;0.34999999999999998;0.34999999999999998;0.5;0.75;0.34999999999999998;0.34999999999999998;0.90000000000000002;0;0.34999999999999998;0.34999999999999998;
blcurve=1;0;0;0;0.34999999999999998;0.5;0;0.34999999999999998;0.34999999999999998;1;0;0.34999999999999998;0.34999999999999998;
Pastlev=0;2;30;20;
Satlev=30;45;130;100;
OpacityCurveRG=1;0;0.5;0.34999999999999998;0.34999999999999998;1;0.5;0.34999999999999998;0.34999999999999998;
OpacityCurveBY=1;0;0.5;0.34999999999999998;0.34999999999999998;1;0.5;0.34999999999999998;0.34999999999999998;
wavdenoise=1;0;1;0.34999999999999998;0.34999999999999998;0.5;1;0.34999999999999998;0.34999999999999998;1;1;0.34999999999999998;0.34999999999999998;
wavdenoiseh=1;0;1;0.34999999999999998;0.34999999999999998;0.5;1;0.34999999999999998;0.34999999999999998;1;1;0.34999999999999998;0.34999999999999998;
OpacityCurveW=1;0;0.34999999999999998;0.34999999999999998;0;0.34999999999999998;0.75;0.34999999999999998;0.34999999999999998;0.59999999999999998;0.75;0.34999999999999998;0.34999999999999998;1;0.34999999999999998;0;0;
OpacityCurveWL=1;0;0.5;0.34999999999999998;0.34999999999999998;1;0.5;0.34999999999999998;0.34999999999999998;
HHcurve=0;
Wavguidcurve=0;
Wavhuecurve=0;
CHcurve=0;
WavclCurve=0;
Median=false
Medianlev=false
Linkedg=false
CBenab=false
Lipst=false
Skinprotect=0
chrwav=0
bluwav=1
Hueskin=-5;25;170;120;
Edgrad=15
Edgeffect=1
Edgval=0
ThrEdg=10
AvoidColorShift=false
Showmask=false
Oldsh=true
TMr=false
Sigma=1
Offset=1
Lowthr=40
ResidualcontShadow=0
ResidualcontHighlight=0
ThresholdResidShadow=30
ThresholdResidHighLight=70
Residualradius=40
Residualchroma=0
Residualblur=0
Residualblurc=0
ResidualTM=0
ResidualEDGS=1.3999999999999999
ResidualSCALE=1
Residualgamma=1
HueRangeResidual=0
HueRange=-260;-250;-130;-140;
Contrast=0
[Spot removal]
Enabled=false
[Directional Pyramid Equalizer]
Enabled=false
Gamutlab=false
cbdlMethod=bef
Mult0=1
Mult1=1
Mult2=1
Mult3=1
Mult4=1
Mult5=1
Threshold=0.20000000000000001
Skinprotect=0
Hueskin=-5;25;170;120;
[HSV Equalizer]
Enabled=false
HCurve=0;
SCurve=0;
VCurve=0;
[SoftLight]
Enabled=false
Strength=30
[Film Simulation]
Enabled=false
ClutFilename=
Strength=100
[RGB Curves]
Enabled=false
LumaMode=false
rCurve=0;
gCurve=0;
bCurve=0;
[ColorToning]
Enabled=false
Method=LabRegions
Lumamode=true
Twocolor=Std
Redlow=0
Greenlow=0
Bluelow=0
Satlow=0
Balance=0
Sathigh=0
Redmed=0
Greenmed=0
Bluemed=0
Redhigh=0
Greenhigh=0
Bluehigh=0
Autosat=true
OpacityCurve=1;0;0.29999999999999999;0.34999999999999998;0;0.25;0.80000000000000004;0.34999999999999998;0.34999999999999998;0.69999999999999996;0.80000000000000004;0.34999999999999998;0.34999999999999998;1;0.29999999999999999;0;0;
ColorCurve=1;0.050000000000000003;0.62;0.25;0.25;0.58499999999999996;0.11;0.25;0.25;
SatProtectionThreshold=30
SaturatedOpacity=80
Strength=50
HighlightsColorSaturation=60;80;
ShadowsColorSaturation=80;208;
ClCurve=3;0;0;0.34999999999999998;0.65000000000000002;1;1;
Cl2Curve=3;0;0;0.34999999999999998;0.65000000000000002;1;1;
LabGridALow=0
LabGridBLow=0
LabGridAHigh=0
LabGridBHigh=0
LabRegionA_1=0
LabRegionB_1=0
LabRegionSaturation_1=0
LabRegionSlope_1=1
LabRegionOffset_1=0
LabRegionPower_1=1
LabRegionHueMask_1=1;0.16666666699999999;1;0.34999999999999998;0.34999999999999998;0.82877752459999998;1;0.34999999999999998;0.34999999999999998;
LabRegionChromaticityMask_1=1;0;1;0.34999999999999998;0.34999999999999998;1;1;0.34999999999999998;0.34999999999999998;
LabRegionLightnessMask_1=1;0;1;0.34999999999999998;0.34999999999999998;1;1;0.34999999999999998;0.34999999999999998;
LabRegionMaskBlur_1=0
LabRegionChannel_1=-1
LabRegionsShowMask=-1
[RAW]
DarkFrame=/szeva
DarkFrameAuto=false
FlatFieldFile=/szeva
FlatFieldAutoSelect=false
FlatFieldFromMetaData=false
FlatFieldBlurRadius=32
FlatFieldBlurType=Area Flatfield
FlatFieldAutoClipControl=false
FlatFieldClipControl=0
CA=false
CAAvoidColourshift=true
CAAutoIterations=2
CARed=0
CABlue=0
HotPixelFilter=false
DeadPixelFilter=false
HotDeadPixelThresh=100
PreExposure=1
[RAW Bayer]
Method=amaze
Border=4
ImageNum=1
CcSteps=0
PreBlack0=0
PreBlack1=0
PreBlack2=0
PreBlack3=0
PreTwoGreen=true
Dehablack=false
LineDenoise=0
LineDenoiseDirection=3
GreenEqThreshold=0
DCBIterations=2
DCBEnhance=true
LMMSEIterations=2
DualDemosaicAutoContrast=true
DualDemosaicContrast=20
PixelShiftMotionCorrectionMethod=1
PixelShiftEperIso=0
PixelShiftSigma=1
PixelShiftShowMotion=false
PixelShiftShowMotionMaskOnly=false
pixelShiftHoleFill=true
pixelShiftAverage=false
pixelShiftMedian=false
pixelShiftGreen=true
pixelShiftBlur=true
pixelShiftSmoothFactor=0.69999999999999996
pixelShiftEqualBright=false
pixelShiftEqualBrightChannel=false
pixelShiftNonGreenCross=true
pixelShiftDemosaicMethod=amaze
PDAFLinesFilter=false
[RAW X-Trans]
Method=3-pass (best)
DualDemosaicAutoContrast=true
DualDemosaicContrast=20
Border=7
CcSteps=0
PreBlackRed=0
PreBlackGreen=0
PreBlackBlue=0
Dehablackx=false
[MetaData]
Mode=1
ExifKeys=*;
[Film Negative]
Enabled=false
RedRatio=1.3600000000000001
GreenExponent=1.5
BlueRatio=0.85999999999999999
ColorSpace=1
RefInput=0;0;0;
RefOutput=2739.961181640625;2740.07568359375;2739.944580078125;
[RAW Preprocess WB]
Mode=1
BIN
View File
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

+1
View File
@@ -30,6 +30,7 @@ Alle, die sich für Linux, Open Source und die Förderung von Wissen in Kunst un
Ziel ist es, den Einsatz freier Software in Kunst und Design zu fördern. Durch Workshops, den Aufbau von Wissensdatenbanken, Austausch und Debatten sollen Eigenermächtigung und Verantwortung für Technologie wiederhergestellt werden. Dazu entwickeln wir gemeinsam ein eigenes Linux-basiertes Betriebssystem und unterstützen bei allen Schritten des Wechsels zu freier Software.
# Das hfg_OS_
![hfg_os_background_1_fullhd](images/hfg_os_background_1_fullhd.jpg)
Das hfg_OS ist ein auf Debian 13 (Trixie) basierendes, Linux-basiertes Betriebssystem. Es wurde speziell für die Bedürfnisse von Künstler:innen und Designer:innen angepasst und wird kontinuierlich weiterentwickelt.
Bald verfügbar: hfg_OS_Falbella-2026-10
+40
View File
@@ -138,6 +138,24 @@ main div.sec0 {
margin-left: 0;
}
/* ---- Bilder ---- */
img {
display: block; /* Text startet immer unter dem Bild */
max-width: 500px; /* Desktop: maximal 500px breit */
height: auto;
border: 1px solid #333333; /* dunkelgrauer Rand */
margin: .8rem 0;
}
/* Smartphone: Bild ueber die volle Breite */
@media (max-width: 600px) {
img {
max-width: 100%;
width: 100%;
}
}
/* ---- Anker-Navigation im Header (Links auf die Ueberschriften) ---- */
.anker-nav {
@@ -215,6 +233,28 @@ hr {
margin: 1.5rem 0;
}
/* ---- Tabellen ---- */
table {
border-collapse: collapse;
margin: 1rem 0;
}
th, td {
border: 1px solid var(--border);
padding: .4rem .8rem;
text-align: left;
}
th {
color: var(--heading);
background: #141414;
}
td {
color: var(--text);
}
/* ---- Code ---- */
code {
BIN
View File
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

+2 -2
View File
@@ -31,7 +31,7 @@
<p>Die nächsten Termine für den Herbst/Winter 2026 werden aktuell geplant:</p>
<div class="sec">
<h2 id="hfg-linux-usergroup-date-1-music">hfg_linux_usergroup_date_1_music</h2>
<p>Platzhalter inhalt, um was geht es hier. Test für den upload.</p>
<p>Platzhalter inhalt, um was geht es hier.</p>
</div>
<div class="sec">
<h2 id="hfg-linux-usergroup-date-2-image-editing">hfg_linux_usergroup_date_2_image-editing</h2>
@@ -56,7 +56,7 @@
</div>
<div class="sec0">
<h1 id="das-hfg-os">Das hfg_OS_</h1>
<p>Das hfg_OS ist ein auf Debian 13 (Trixie) basierendes, Linux-basiertes Betriebssystem. Es wurde speziell für die Bedürfnisse von Künstler:innen und Designer:innen angepasst und wird kontinuierlich weiterentwickelt.</p>
<p><img src="images/hfg_os_background_1_fullhd.jpg" alt="hfg_os_background_1_fullhd"> Das hfg_OS ist ein auf Debian 13 (Trixie) basierendes, Linux-basiertes Betriebssystem. Es wurde speziell für die Bedürfnisse von Künstler:innen und Designer:innen angepasst und wird kontinuierlich weiterentwickelt.</p>
<p>Bald verfügbar: hfg_OS_Falbella-2026-10</p>
</div>
</main>