mirror of
https://github.com/praktimarc/kst4contest.git
synced 2026-03-30 04:31:04 +02:00
PDF User Manual Pipeline for use in Release and nightly Build
This commit is contained in:
255
.github/latex-manual/manual-template.tex
vendored
Normal file
255
.github/latex-manual/manual-template.tex
vendored
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
%% ============================================================
|
||||||
|
%% KST4Contest – pandoc LaTeX manual template
|
||||||
|
%% PDF engine: XeLaTeX
|
||||||
|
%% Usage: pandoc --template=manual-template.tex --pdf-engine=xelatex
|
||||||
|
%% ============================================================
|
||||||
|
\documentclass[11pt,a4paper]{article}
|
||||||
|
|
||||||
|
%% ─── Font / encoding ──────────────────────────────────────────────────────
|
||||||
|
\usepackage{fontspec}
|
||||||
|
% Latin Modern handles all Western European characters (umlauts etc.)
|
||||||
|
\defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase}
|
||||||
|
|
||||||
|
%% ─── Language ─────────────────────────────────────────────────────────────
|
||||||
|
\usepackage{polyglossia}
|
||||||
|
$if(polyglossia-lang)$
|
||||||
|
\setmainlanguage{$polyglossia-lang$}
|
||||||
|
$else$
|
||||||
|
\setmainlanguage{english}
|
||||||
|
$endif$
|
||||||
|
|
||||||
|
%% ─── Page layout ──────────────────────────────────────────────────────────
|
||||||
|
\usepackage[a4paper, top=2.5cm, bottom=2.5cm, left=2.5cm, right=2.5cm]{geometry}
|
||||||
|
|
||||||
|
%% ─── Colors ───────────────────────────────────────────────────────────────
|
||||||
|
\usepackage[dvipsnames,svgnames,x11names]{xcolor}
|
||||||
|
\definecolor{brand-green}{RGB}{7,166,54}
|
||||||
|
\definecolor{link-blue}{RGB}{0,86,163}
|
||||||
|
\definecolor{code-bg}{RGB}{245,247,250}
|
||||||
|
\definecolor{code-border}{RGB}{180,200,225}
|
||||||
|
\definecolor{blockquote-line}{RGB}{7,166,54}
|
||||||
|
|
||||||
|
%% ─── Hyperlinks ───────────────────────────────────────────────────────────
|
||||||
|
\usepackage{hyperref}
|
||||||
|
\hypersetup{
|
||||||
|
colorlinks = true,
|
||||||
|
linkcolor = link-blue,
|
||||||
|
urlcolor = link-blue,
|
||||||
|
filecolor = link-blue,
|
||||||
|
citecolor = link-blue,
|
||||||
|
pdftitle = {$title$},
|
||||||
|
pdfauthor = {DO5AMF (Marc Fröhlich), DN9APW (Philipp Wagner)},
|
||||||
|
pdfsubject = {KST4Contest User Manual},
|
||||||
|
pdfkeywords = {KST4Contest, pratiKST, VHF, Contest, Ham Radio},
|
||||||
|
bookmarks = true,
|
||||||
|
bookmarksnumbered = true,
|
||||||
|
bookmarksopen = true,
|
||||||
|
bookmarksopenlevel = 2,
|
||||||
|
pdfpagemode = UseOutlines,
|
||||||
|
}
|
||||||
|
|
||||||
|
%% ─── Graphics ─────────────────────────────────────────────────────────────
|
||||||
|
\usepackage{graphicx}
|
||||||
|
\graphicspath{{./}{./github_docs/}}
|
||||||
|
\makeatletter
|
||||||
|
\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}
|
||||||
|
\def\maxheight{\ifdim\Gin@nat@height>0.65\textheight 0.65\textheight\else\Gin@nat@height\fi}
|
||||||
|
\makeatother
|
||||||
|
\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
|
||||||
|
|
||||||
|
%% ─── Tables ───────────────────────────────────────────────────────────────
|
||||||
|
\usepackage{longtable}
|
||||||
|
\usepackage{booktabs}
|
||||||
|
\usepackage{array}
|
||||||
|
\usepackage{calc}
|
||||||
|
\usepackage{multirow}
|
||||||
|
\setlength{\tabcolsep}{8pt}
|
||||||
|
\renewcommand{\arraystretch}{1.35}
|
||||||
|
% Pandoc pipe-table helpers
|
||||||
|
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}}
|
||||||
|
\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}}
|
||||||
|
\newcolumntype{R}[1]{>{\raggedleft\arraybackslash}p{#1}}
|
||||||
|
|
||||||
|
%% ─── Lists ────────────────────────────────────────────────────────────────
|
||||||
|
\providecommand{\tightlist}{%
|
||||||
|
\setlength{\itemsep}{2pt}\setlength{\parskip}{0pt}}
|
||||||
|
|
||||||
|
%% ─── Code blocks (--listings flag) ───────────────────────────────────
|
||||||
|
\usepackage{listings}
|
||||||
|
\lstset{
|
||||||
|
basicstyle = \ttfamily\small,
|
||||||
|
backgroundcolor = \color{code-bg},
|
||||||
|
frame = single,
|
||||||
|
framesep = 4pt,
|
||||||
|
rulecolor = \color{code-border},
|
||||||
|
breaklines = true,
|
||||||
|
breakatwhitespace= false,
|
||||||
|
showstringspaces = false,
|
||||||
|
extendedchars = true,
|
||||||
|
xleftmargin = 6pt,
|
||||||
|
xrightmargin = 6pt,
|
||||||
|
aboveskip = 8pt,
|
||||||
|
belowskip = 8pt,
|
||||||
|
literate = {→}{{\ensuremath{\rightarrow}}}1
|
||||||
|
{←}{{\ensuremath{\leftarrow}}}1
|
||||||
|
{↔}{{\ensuremath{\leftrightarrow}}}1,
|
||||||
|
}
|
||||||
|
|
||||||
|
%% ─── Blockquotes ──────────────────────────────────────────────────────────
|
||||||
|
\usepackage{mdframed}
|
||||||
|
\newmdenv[
|
||||||
|
topline = false,
|
||||||
|
rightline = false,
|
||||||
|
bottomline = false,
|
||||||
|
leftline = true,
|
||||||
|
linewidth = 3pt,
|
||||||
|
linecolor = blockquote-line,
|
||||||
|
backgroundcolor = code-bg,
|
||||||
|
leftmargin = 0pt,
|
||||||
|
rightmargin = 0pt,
|
||||||
|
innerleftmargin = 12pt,
|
||||||
|
innerrightmargin = 8pt,
|
||||||
|
innertopmargin = 6pt,
|
||||||
|
innerbottommargin= 6pt,
|
||||||
|
skipabove = 8pt,
|
||||||
|
skipbelow = 8pt,
|
||||||
|
]{blockquotebox}
|
||||||
|
|
||||||
|
\renewenvironment{quote}
|
||||||
|
{\begin{blockquotebox}\small\itshape}
|
||||||
|
{\end{blockquotebox}}
|
||||||
|
|
||||||
|
%% ─── Section styling ──────────────────────────────────────────────────────
|
||||||
|
\usepackage{titlesec}
|
||||||
|
|
||||||
|
\titleformat{\section}
|
||||||
|
{\Large\bfseries\color{brand-green}}
|
||||||
|
{}
|
||||||
|
{0em}
|
||||||
|
{}
|
||||||
|
[\color{brand-green}\titlerule]
|
||||||
|
\titlespacing{\section}{0pt}{20pt}{10pt}
|
||||||
|
|
||||||
|
\titleformat{\subsection}
|
||||||
|
{\large\bfseries\color{brand-green}}
|
||||||
|
{}
|
||||||
|
{0em}
|
||||||
|
{}
|
||||||
|
\titlespacing{\subsection}{0pt}{14pt}{6pt}
|
||||||
|
|
||||||
|
\titleformat{\subsubsection}
|
||||||
|
{\normalsize\bfseries}
|
||||||
|
{}
|
||||||
|
{0em}
|
||||||
|
{}
|
||||||
|
\titlespacing{\subsubsection}{0pt}{10pt}{4pt}
|
||||||
|
|
||||||
|
% Level 4 (####): displayed as a named block heading in dark-grey
|
||||||
|
\titleformat{\paragraph}
|
||||||
|
{\normalsize\bfseries\color{brand-green}}
|
||||||
|
{}
|
||||||
|
{0em}
|
||||||
|
{}
|
||||||
|
\titlespacing{\paragraph}{0pt}{8pt}{2pt}
|
||||||
|
|
||||||
|
% Level 5 (#####): slightly smaller, italic, lighter grey
|
||||||
|
\titleformat{\subparagraph}
|
||||||
|
{\small\bfseries\itshape\color{brand-green!85!black}}
|
||||||
|
{}
|
||||||
|
{0em}
|
||||||
|
{}
|
||||||
|
\titlespacing{\subparagraph}{0pt}{6pt}{1pt}
|
||||||
|
|
||||||
|
% Reserve two additional section levels for future use (###### and deeper).
|
||||||
|
% Pandoc currently maps up to \subparagraph for standard Markdown headings.
|
||||||
|
\titleclass{\subsubsubsection}{straight}[\subparagraph]
|
||||||
|
\newcounter{subsubsubsection}[subparagraph]
|
||||||
|
\renewcommand\thesubsubsubsection{\thesubparagraph.\arabic{subsubsubsection}}
|
||||||
|
\titleformat{\subsubsubsection}
|
||||||
|
{\small\bfseries\color{brand-green!75!black}}
|
||||||
|
{}
|
||||||
|
{0em}
|
||||||
|
{}
|
||||||
|
\titlespacing{\subsubsubsection}{0pt}{5pt}{1pt}
|
||||||
|
|
||||||
|
\titleclass{\subsubsubsubsection}{straight}[\subsubsubsection]
|
||||||
|
\newcounter{subsubsubsubsection}[subsubsubsection]
|
||||||
|
\renewcommand\thesubsubsubsubsection{\thesubsubsubsection.\arabic{subsubsubsubsection}}
|
||||||
|
\titleformat{\subsubsubsubsection}
|
||||||
|
{\small\itshape\color{brand-green!65!black}}
|
||||||
|
{}
|
||||||
|
{0em}
|
||||||
|
{}
|
||||||
|
\titlespacing{\subsubsubsubsection}{0pt}{4pt}{1pt}
|
||||||
|
|
||||||
|
\setcounter{secnumdepth}{6}
|
||||||
|
\setcounter{tocdepth}{6}
|
||||||
|
|
||||||
|
%% ─── Header / Footer ──────────────────────────────────────────────────────
|
||||||
|
\usepackage{fancyhdr}
|
||||||
|
\pagestyle{fancy}
|
||||||
|
\fancyhf{}
|
||||||
|
\fancyhead[L]{\small\color{brand-green}\textbf{KST4Contest}}
|
||||||
|
\fancyhead[R]{\small\color{brand-green}$if(version)$$version$$endif$}
|
||||||
|
\fancyfoot[L]{\small\color{gray}DO5AMF (Marc Fröhlich) \textbar\ DN9APW (Philipp Wagner)}
|
||||||
|
\fancyfoot[C]{\small\color{gray}\thepage}
|
||||||
|
\fancyfoot[R]{\small\color{gray}$title$}
|
||||||
|
\renewcommand{\headrulewidth}{0.4pt}
|
||||||
|
\renewcommand{\footrulewidth}{0.3pt}
|
||||||
|
\renewcommand{\headrule}{\color{brand-green}\hrule width\headwidth height\headrulewidth}
|
||||||
|
|
||||||
|
%% ─── Paragraph spacing ────────────────────────────────────────────────────
|
||||||
|
\usepackage{parskip}
|
||||||
|
\setlength{\parskip}{6pt}
|
||||||
|
\setlength{\parindent}{0pt}
|
||||||
|
|
||||||
|
%% ─── TOC styling ──────────────────────────────────────────────────────────
|
||||||
|
\usepackage{tocloft}
|
||||||
|
\renewcommand{\cfttoctitlefont}{\Large\bfseries\color{brand-green}}
|
||||||
|
\renewcommand{\cftsecfont}{\bfseries\color{brand-green}}
|
||||||
|
\renewcommand{\cftsecpagefont}{\bfseries\color{brand-green}}
|
||||||
|
\renewcommand{\cftsubsecfont}{\color{brand-green}}
|
||||||
|
\renewcommand{\cftsubsecpagefont}{\color{brand-green}}
|
||||||
|
\renewcommand{\cftsubsubsecfont}{\color{brand-green!85!black}}
|
||||||
|
\renewcommand{\cftsubsubsecpagefont}{\color{brand-green!85!black}}
|
||||||
|
\renewcommand{\cftparafont}{\color{brand-green!75!black}}
|
||||||
|
\renewcommand{\cftparapagefont}{\color{brand-green!75!black}}
|
||||||
|
\renewcommand{\cftsubparafont}{\color{brand-green!65!black}}
|
||||||
|
\renewcommand{\cftsubparapagefont}{\color{brand-green!65!black}}
|
||||||
|
\setlength{\cftbeforesecskip}{4pt}
|
||||||
|
|
||||||
|
%% ─── Misc ─────────────────────────────────────────────────────────────────
|
||||||
|
\usepackage{amsmath}
|
||||||
|
\usepackage{microtype}
|
||||||
|
% Pandoc helper macros
|
||||||
|
\newcommand{\passthrough}[1]{#1}
|
||||||
|
|
||||||
|
%% ══════════════════════════════════════════════════════════════════════════
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
%% ─── Title page ───────────────────────────────────────────────────────────
|
||||||
|
\begin{titlepage}
|
||||||
|
\pagecolor{brand-green}
|
||||||
|
\centering
|
||||||
|
\vspace*{3.5cm}
|
||||||
|
{\fontsize{52}{62}\selectfont\bfseries\color{white}KST4Contest}\\[0.4cm]
|
||||||
|
{\fontsize{22}{28}\selectfont\color{white!75!brand-green}pratiKST (ON4KST Chat Client)}\\[2.8cm]
|
||||||
|
\color{white!40!brand-green}\rule{10cm}{0.6pt}\\[1.8cm]
|
||||||
|
{\LARGE\bfseries\color{white}$title$}\\[1cm]
|
||||||
|
$if(version)${\large\color{white!80!brand-green}Version:\space$version$}\\[0.6cm]$endif$
|
||||||
|
\vfill
|
||||||
|
{\large\color{white}DO5AMF · Marc Fröhlich · DM5M · DN9APW · Philipp Wagner}\\[0.4cm]
|
||||||
|
{\color{white!70!brand-green}\today}\\[2cm]
|
||||||
|
\end{titlepage}
|
||||||
|
|
||||||
|
\pagecolor{white}
|
||||||
|
\newpage
|
||||||
|
|
||||||
|
%% ─── Table of Contents ────────────────────────────────────────────────────
|
||||||
|
\tableofcontents
|
||||||
|
\newpage
|
||||||
|
|
||||||
|
%% ─── Main content ─────────────────────────────────────────────────────────
|
||||||
|
$body$
|
||||||
|
|
||||||
|
\end{document}
|
||||||
156
.github/latex-manual/strip-wiki-links.lua
vendored
Normal file
156
.github/latex-manual/strip-wiki-links.lua
vendored
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
--[[
|
||||||
|
strip-wiki-links.lua – pandoc Lua filter for KST4Contest documentation
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
1. Removes language-switch blockquotes (GitHub Wiki navigation) that
|
||||||
|
are not relevant in the printed PDF manual.
|
||||||
|
2. Converts internal GitHub-wiki-style links to in-document anchors
|
||||||
|
so links jump within the generated PDF.
|
||||||
|
3. Replaces flag emoji and other symbols that XeLaTeX cannot render with
|
||||||
|
plain-text equivalents.
|
||||||
|
--]]
|
||||||
|
|
||||||
|
local PAGE_ANCHOR_MAP = {
|
||||||
|
["de-Home"] = "kst4contest-wiki",
|
||||||
|
["de-Installation"] = "installation",
|
||||||
|
["de-Konfiguration"] = "konfiguration",
|
||||||
|
["de-Funktionen"] = "funktionen",
|
||||||
|
["de-Benutzeroberflaeche"] = "benutzeroberflache",
|
||||||
|
["de-Makros-und-Variablen"] = "makros-und-variablen",
|
||||||
|
["de-Log-Synchronisation"] = "log-synchronisation",
|
||||||
|
["de-AirScout-Integration"] = "airscout-integration",
|
||||||
|
["de-DX-Cluster-Server"] = "integrierter-dx-cluster-server",
|
||||||
|
["de-Changelog"] = "changelog",
|
||||||
|
|
||||||
|
["en-Home"] = "kst4contest-wiki",
|
||||||
|
["en-Installation"] = "installation",
|
||||||
|
["en-Configuration"] = "configuration",
|
||||||
|
["en-Features"] = "features",
|
||||||
|
["en-User-Interface"] = "user-interface",
|
||||||
|
["en-Macros-and-Variables"] = "macros-and-variables",
|
||||||
|
["en-Log-Sync"] = "log-synchronisation",
|
||||||
|
["en-AirScout-Integration"] = "airscout-integration",
|
||||||
|
["en-DX-Cluster-Server"] = "built-in-dx-cluster-server",
|
||||||
|
["en-Changelog"] = "changelog",
|
||||||
|
|
||||||
|
["Installation"] = "installation",
|
||||||
|
["Konfiguration"] = "konfiguration",
|
||||||
|
["Funktionen"] = "funktionen",
|
||||||
|
["Benutzeroberflaeche"] = "benutzeroberflache",
|
||||||
|
["Makros-und-Variablen"] = "makros-und-variablen",
|
||||||
|
["Log-Synchronisation"] = "log-synchronisation",
|
||||||
|
["AirScout-Integration"] = "airscout-integration",
|
||||||
|
["DX-Cluster-Server"] = "integrierter-dx-cluster-server",
|
||||||
|
["Changelog"] = "changelog",
|
||||||
|
|
||||||
|
["Configuration"] = "configuration",
|
||||||
|
["Features"] = "features",
|
||||||
|
["User-Interface"] = "user-interface",
|
||||||
|
["Macros-and-Variables"] = "macros-and-variables",
|
||||||
|
["Log-Sync"] = "log-synchronisation",
|
||||||
|
}
|
||||||
|
|
||||||
|
local function normalize_anchor(text)
|
||||||
|
local s = text:lower()
|
||||||
|
s = s:gsub("%%20", "-")
|
||||||
|
s = s:gsub("ä", "a"):gsub("ö", "o"):gsub("ü", "u"):gsub("ß", "ss")
|
||||||
|
s = s:gsub("[^%w%s%-_]", "")
|
||||||
|
s = s:gsub("[_%s]+", "-")
|
||||||
|
s = s:gsub("%-+", "-")
|
||||||
|
s = s:gsub("^%-", ""):gsub("%-$", "")
|
||||||
|
return s
|
||||||
|
end
|
||||||
|
|
||||||
|
local function normalize_page_key(page)
|
||||||
|
local key = page:gsub("^%./", ""):gsub("^/", "")
|
||||||
|
key = key:gsub("^github_docs/", "")
|
||||||
|
key = key:gsub("%.md$", "")
|
||||||
|
return key
|
||||||
|
end
|
||||||
|
|
||||||
|
local function resolve_page_anchor(page)
|
||||||
|
local key = normalize_page_key(page)
|
||||||
|
return PAGE_ANCHOR_MAP[key] or normalize_anchor(key)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function convert_url_token(token)
|
||||||
|
local url, trailing = token:match("^(https?://%S-)([%.%,%;%:%!%?]?)$")
|
||||||
|
if not url then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local link = pandoc.Link({pandoc.Str(url)}, url)
|
||||||
|
if trailing ~= "" then
|
||||||
|
return {link, pandoc.Str(trailing)}
|
||||||
|
end
|
||||||
|
return link
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Map of emoji / special Unicode sequences → plain-text replacements.
|
||||||
|
-- Add more entries here as needed.
|
||||||
|
local EMOJI_MAP = {
|
||||||
|
-- Flag sequences
|
||||||
|
["\xF0\x9F\x87\xAC\xF0\x9F\x87\xA7"] = "[EN]", -- 🇬🇧
|
||||||
|
["\xF0\x9F\x87\xA9\xF0\x9F\x87\xAA"] = "[DE]", -- 🇩🇪
|
||||||
|
-- Status symbols
|
||||||
|
["\xE2\x9C\x85"] = "[OK]", -- ✅
|
||||||
|
["\xE2\x9D\x8C"] = "[--]", -- ❌
|
||||||
|
-- Misc symbols used in tables / text
|
||||||
|
["\xF0\x9F\x94\xB4"] = "[red]", -- 🔴
|
||||||
|
["\xF0\x9F\x9F\xA1"] = "[yellow]", -- 🟡
|
||||||
|
["\xF0\x9F\x9F\xA2"] = "[green]", -- 🟢
|
||||||
|
}
|
||||||
|
|
||||||
|
--- Replace emoji in a plain string.
|
||||||
|
local function replace_emoji(text)
|
||||||
|
for pattern, replacement in pairs(EMOJI_MAP) do
|
||||||
|
text = text:gsub(pattern, replacement)
|
||||||
|
end
|
||||||
|
return text
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Filter: remove language-switch blockquotes from PDF output.
|
||||||
|
-- These blockquotes appear in every wiki page for GitHub navigation
|
||||||
|
-- but are not needed in the printed manual.
|
||||||
|
function BlockQuote(el)
|
||||||
|
local text = pandoc.utils.stringify(el)
|
||||||
|
if text:find("Du liest gerade die deutsche Version") or
|
||||||
|
text:find("You are reading the English version") then
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
return el
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Filter: convert internal wiki links to in-PDF anchor links.
|
||||||
|
function Link(el)
|
||||||
|
local target = el.target
|
||||||
|
-- Keep external URLs unchanged.
|
||||||
|
if target:match("^https?://") or target:match("^mailto:") then
|
||||||
|
return el
|
||||||
|
end
|
||||||
|
|
||||||
|
if target:match("^#") then
|
||||||
|
local fragment = target:gsub("^#", "")
|
||||||
|
return pandoc.Link(el.content, "#" .. normalize_anchor(fragment), el.title, el.attr)
|
||||||
|
end
|
||||||
|
|
||||||
|
local page, fragment = target:match("^([^#]+)#(.+)$")
|
||||||
|
if page and fragment then
|
||||||
|
return pandoc.Link(el.content, "#" .. normalize_anchor(fragment), el.title, el.attr)
|
||||||
|
end
|
||||||
|
|
||||||
|
return pandoc.Link(el.content, "#" .. resolve_page_anchor(target), el.title, el.attr)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Filter: replace emoji sequences in plain Str elements.
|
||||||
|
function Str(el)
|
||||||
|
local linkified = convert_url_token(el.text)
|
||||||
|
if linkified then
|
||||||
|
return linkified
|
||||||
|
end
|
||||||
|
|
||||||
|
local replaced = replace_emoji(el.text)
|
||||||
|
if replaced ~= el.text then
|
||||||
|
return pandoc.Str(replaced)
|
||||||
|
end
|
||||||
|
return el
|
||||||
|
end
|
||||||
107
.github/workflows/docs-pdf.yml
vendored
Normal file
107
.github/workflows/docs-pdf.yml
vendored
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
name: Build Documentation PDF
|
||||||
|
|
||||||
|
# Runs when documentation changes are pushed to main, or on manual trigger.
|
||||||
|
# Also triggered as a dependency from the tagged-release workflow.
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- github_docs/**
|
||||||
|
- .github/latex-manual/**
|
||||||
|
- .github/workflows/docs-pdf.yml
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-docs-pdf:
|
||||||
|
name: Build Documentation PDF
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4.1.7
|
||||||
|
|
||||||
|
- name: Resolve version string
|
||||||
|
run: |
|
||||||
|
if [[ "${{ github.ref }}" == refs/tags/* ]]; then
|
||||||
|
VERSION="${{ github.ref_name }}"
|
||||||
|
else
|
||||||
|
VERSION="$(grep -m1 '<version>' pom.xml | sed 's/.*<version>\(.*\)<\/version>.*/\1/')-${GITHUB_SHA::7}"
|
||||||
|
fi
|
||||||
|
echo "DOC_VERSION=$VERSION" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Install pandoc and LaTeX toolchain
|
||||||
|
run: |
|
||||||
|
sudo apt-get update -qq
|
||||||
|
sudo apt-get install -y --no-install-recommends \
|
||||||
|
pandoc \
|
||||||
|
texlive-xetex \
|
||||||
|
texlive-fonts-recommended \
|
||||||
|
texlive-latex-extra \
|
||||||
|
texlive-plain-generic
|
||||||
|
|
||||||
|
- name: Build English PDF manual
|
||||||
|
run: |
|
||||||
|
mkdir -p dist
|
||||||
|
pandoc \
|
||||||
|
--from=markdown-yaml_metadata_block \
|
||||||
|
--template=.github/latex-manual/manual-template.tex \
|
||||||
|
--pdf-engine=xelatex \
|
||||||
|
--lua-filter=.github/latex-manual/strip-wiki-links.lua \
|
||||||
|
--resource-path=.:github_docs \
|
||||||
|
--listings \
|
||||||
|
--toc \
|
||||||
|
--toc-depth=6 \
|
||||||
|
-V title="User Manual" \
|
||||||
|
-V polyglossia-lang=english \
|
||||||
|
-V version="${DOC_VERSION}" \
|
||||||
|
-o dist/KST4Contest-${DOC_VERSION}-manual-en.pdf \
|
||||||
|
github_docs/en-Home.md \
|
||||||
|
github_docs/en-Installation.md \
|
||||||
|
github_docs/en-Configuration.md \
|
||||||
|
github_docs/en-Features.md \
|
||||||
|
github_docs/en-User-Interface.md \
|
||||||
|
github_docs/en-Macros-and-Variables.md \
|
||||||
|
github_docs/en-Log-Sync.md \
|
||||||
|
github_docs/en-AirScout-Integration.md \
|
||||||
|
github_docs/en-DX-Cluster-Server.md \
|
||||||
|
github_docs/en-Changelog.md
|
||||||
|
|
||||||
|
- name: Build German PDF manual
|
||||||
|
run: |
|
||||||
|
pandoc \
|
||||||
|
--from=markdown-yaml_metadata_block \
|
||||||
|
--template=.github/latex-manual/manual-template.tex \
|
||||||
|
--pdf-engine=xelatex \
|
||||||
|
--lua-filter=.github/latex-manual/strip-wiki-links.lua \
|
||||||
|
--resource-path=.:github_docs \
|
||||||
|
--listings \
|
||||||
|
--toc \
|
||||||
|
--toc-depth=6 \
|
||||||
|
-V title="Benutzerhandbuch" \
|
||||||
|
-V polyglossia-lang=german \
|
||||||
|
-V version="${DOC_VERSION}" \
|
||||||
|
-o dist/KST4Contest-${DOC_VERSION}-manual-de.pdf \
|
||||||
|
github_docs/de-Home.md \
|
||||||
|
github_docs/de-Installation.md \
|
||||||
|
github_docs/de-Konfiguration.md \
|
||||||
|
github_docs/de-Funktionen.md \
|
||||||
|
github_docs/de-Benutzeroberflaeche.md \
|
||||||
|
github_docs/de-Makros-und-Variablen.md \
|
||||||
|
github_docs/de-Log-Synchronisation.md \
|
||||||
|
github_docs/de-AirScout-Integration.md \
|
||||||
|
github_docs/de-DX-Cluster-Server.md \
|
||||||
|
github_docs/de-Changelog.md
|
||||||
|
|
||||||
|
- name: Upload PDF artifacts
|
||||||
|
uses: actions/upload-artifact@v4.3.4
|
||||||
|
with:
|
||||||
|
name: docs-pdf
|
||||||
|
path: dist/KST4Contest-*-manual-*.pdf
|
||||||
|
retention-days: 30
|
||||||
94
.github/workflows/tagged-release.yml
vendored
94
.github/workflows/tagged-release.yml
vendored
@@ -134,26 +134,110 @@ jobs:
|
|||||||
name: linux-appimage
|
name: linux-appimage
|
||||||
path: dist/praktiKST-${{ github.ref_name }}-linux-x86_64.AppImage
|
path: dist/praktiKST-${{ github.ref_name }}-linux-x86_64.AppImage
|
||||||
|
|
||||||
|
build-docs-pdf:
|
||||||
|
name: Build Documentation PDF
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4.1.7
|
||||||
|
|
||||||
|
- name: Install pandoc and LaTeX toolchain
|
||||||
|
run: |
|
||||||
|
sudo apt-get update -qq
|
||||||
|
sudo apt-get install -y --no-install-recommends \
|
||||||
|
pandoc \
|
||||||
|
texlive-xetex \
|
||||||
|
texlive-fonts-recommended \
|
||||||
|
texlive-latex-extra \
|
||||||
|
texlive-plain-generic
|
||||||
|
|
||||||
|
- name: Build English PDF manual
|
||||||
|
run: |
|
||||||
|
mkdir -p dist
|
||||||
|
pandoc \
|
||||||
|
--from=markdown-yaml_metadata_block \
|
||||||
|
--template=.github/latex-manual/manual-template.tex \
|
||||||
|
--pdf-engine=xelatex \
|
||||||
|
--lua-filter=.github/latex-manual/strip-wiki-links.lua \
|
||||||
|
--resource-path=.:github_docs \
|
||||||
|
--listings \
|
||||||
|
--toc \
|
||||||
|
--toc-depth=3 \
|
||||||
|
-V title="User Manual" \
|
||||||
|
-V polyglossia-lang=english \
|
||||||
|
-V version="${{ github.ref_name }}" \
|
||||||
|
-o dist/KST4Contest-${{ github.ref_name }}-manual-en.pdf \
|
||||||
|
github_docs/en-Home.md \
|
||||||
|
github_docs/en-Installation.md \
|
||||||
|
github_docs/en-Configuration.md \
|
||||||
|
github_docs/en-Features.md \
|
||||||
|
github_docs/en-User-Interface.md \
|
||||||
|
github_docs/en-Macros-and-Variables.md \
|
||||||
|
github_docs/en-Log-Sync.md \
|
||||||
|
github_docs/en-AirScout-Integration.md \
|
||||||
|
github_docs/en-DX-Cluster-Server.md \
|
||||||
|
github_docs/en-Changelog.md
|
||||||
|
|
||||||
|
- name: Build German PDF manual
|
||||||
|
run: |
|
||||||
|
pandoc \
|
||||||
|
--from=markdown-yaml_metadata_block \
|
||||||
|
--template=.github/latex-manual/manual-template.tex \
|
||||||
|
--pdf-engine=xelatex \
|
||||||
|
--lua-filter=.github/latex-manual/strip-wiki-links.lua \
|
||||||
|
--resource-path=.:github_docs \
|
||||||
|
--listings \
|
||||||
|
--toc \
|
||||||
|
--toc-depth=3 \
|
||||||
|
-V title="Benutzerhandbuch" \
|
||||||
|
-V polyglossia-lang=german \
|
||||||
|
-V version="${{ github.ref_name }}" \
|
||||||
|
-o dist/KST4Contest-${{ github.ref_name }}-manual-de.pdf \
|
||||||
|
github_docs/de-Home.md \
|
||||||
|
github_docs/de-Installation.md \
|
||||||
|
github_docs/de-Konfiguration.md \
|
||||||
|
github_docs/de-Funktionen.md \
|
||||||
|
github_docs/de-Benutzeroberflaeche.md \
|
||||||
|
github_docs/de-Makros-und-Variablen.md \
|
||||||
|
github_docs/de-Log-Synchronisation.md \
|
||||||
|
github_docs/de-AirScout-Integration.md \
|
||||||
|
github_docs/de-DX-Cluster-Server.md \
|
||||||
|
github_docs/de-Changelog.md
|
||||||
|
|
||||||
|
- name: Upload PDF artifacts
|
||||||
|
uses: actions/upload-artifact@v4.3.4
|
||||||
|
with:
|
||||||
|
name: docs-pdf
|
||||||
|
path: dist/KST4Contest-${{ github.ref_name }}-manual-*.pdf
|
||||||
|
|
||||||
release-tag:
|
release-tag:
|
||||||
name: Publish Tagged Release
|
name: Publish Tagged Release
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs:
|
needs:
|
||||||
- build-windows-zip
|
- build-windows-zip
|
||||||
- build-linux-appimage
|
- build-linux-appimage
|
||||||
|
- build-docs-pdf
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Download Windows artifact
|
- name: Download Windows artifact
|
||||||
uses: actions/download-artifact@v4.1.1
|
uses: actions/download-artifact@v4.1.3
|
||||||
with:
|
with:
|
||||||
name: windows-zip
|
name: windows-zip
|
||||||
path: release-assets/windows
|
path: release-assets/windows
|
||||||
|
|
||||||
- name: Download Linux artifact
|
- name: Download Linux artifact
|
||||||
uses: actions/download-artifact@v4.1.1
|
uses: actions/download-artifact@v4.1.3
|
||||||
with:
|
with:
|
||||||
name: linux-appimage
|
name: linux-appimage
|
||||||
path: release-assets/linux
|
path: release-assets/linux
|
||||||
|
|
||||||
|
- name: Download PDF manuals
|
||||||
|
uses: actions/download-artifact@v4.1.3
|
||||||
|
with:
|
||||||
|
name: docs-pdf
|
||||||
|
path: release-assets/docs
|
||||||
|
|
||||||
- name: Create tagged release
|
- name: Create tagged release
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
@@ -165,4 +249,8 @@ jobs:
|
|||||||
replacesArtifacts: false
|
replacesArtifacts: false
|
||||||
makeLatest: ${{ !startsWith(github.ref_name, 'beta-') }}
|
makeLatest: ${{ !startsWith(github.ref_name, 'beta-') }}
|
||||||
generateReleaseNotes: true
|
generateReleaseNotes: true
|
||||||
artifacts: release-assets/windows/praktiKST-${{ github.ref_name }}-windows-x64.zip,release-assets/linux/praktiKST-${{ github.ref_name }}-linux-x86_64.AppImage
|
artifacts: >-
|
||||||
|
release-assets/windows/praktiKST-${{ github.ref_name }}-windows-x64.zip,
|
||||||
|
release-assets/linux/praktiKST-${{ github.ref_name }}-linux-x86_64.AppImage,
|
||||||
|
release-assets/docs/KST4Contest-${{ github.ref_name }}-manual-en.pdf,
|
||||||
|
release-assets/docs/KST4Contest-${{ github.ref_name }}-manual-de.pdf
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -30,5 +30,8 @@ target/
|
|||||||
#builds
|
#builds
|
||||||
build/
|
build/
|
||||||
|
|
||||||
|
#pdf output directory
|
||||||
|
dist/
|
||||||
|
|
||||||
#zip files for local backups
|
#zip files for local backups
|
||||||
*.zip
|
*.zip
|
||||||
@@ -48,7 +48,8 @@ In AirScout die UDP-Schnittstelle aktivieren:
|
|||||||
In den KST4Contest-Preferences → **AirScout Settings**:
|
In den KST4Contest-Preferences → **AirScout Settings**:
|
||||||
- AirScout-Kommunikation aktivieren
|
- AirScout-Kommunikation aktivieren
|
||||||
- IP und Port auf Standardwerte lassen (sofern nicht geändert)
|
- IP und Port auf Standardwerte lassen (sofern nicht geändert)
|
||||||

|
|
||||||
|
{ width=85% }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,9 @@ Nach dem ersten Start öffnet sich das **Einstellungsfenster** – dieses ist de
|
|||||||
---
|
---
|
||||||
|
|
||||||
## Station Settings (Stationseinstellungen)
|
## Station Settings (Stationseinstellungen)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Login und Chat-Kategorien
|
### Login und Chat-Kategorien
|
||||||
|
|
||||||
Hier werden die Zugangsdaten für den ON4KST-Chat eingetragen (Rufzeichen und Passwort).
|
Hier werden die Zugangsdaten für den ON4KST-Chat eingetragen (Rufzeichen und Passwort).
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
KST4Contest markiert gearbeitete Stationen automatisch in der Chat-Benutzerliste. Dafür gibt es zwei grundlegende Methoden:
|
KST4Contest markiert gearbeitete Stationen automatisch in der Chat-Benutzerliste. Dafür gibt es zwei grundlegende Methoden:
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Methode 1: Universal File Based Callsign Interpreter (Simplelogfile)
|
## Methode 1: Universal File Based Callsign Interpreter (Simplelogfile)
|
||||||
@@ -33,6 +34,7 @@ Das Logprogramm sendet beim Speichern eines QSOs ein UDP-Paket an die Broadcast-
|
|||||||
## Unterstützte Logprogramme
|
## Unterstützte Logprogramme
|
||||||
|
|
||||||
### UCXLog (DL7UCX)
|
### UCXLog (DL7UCX)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
UCXLog sendet QSO-UDP-Pakete und Transceiver-Frequenzpakete.
|
UCXLog sendet QSO-UDP-Pakete und Transceiver-Frequenzpakete.
|
||||||
|
|||||||
@@ -48,7 +48,8 @@ In AirScout, enable the UDP interface:
|
|||||||
In KST4Contest Preferences → **AirScout Settings**:
|
In KST4Contest Preferences → **AirScout Settings**:
|
||||||
- Enable AirScout communication
|
- Enable AirScout communication
|
||||||
- Leave IP and port at their default values (unless changed)
|
- Leave IP and port at their default values (unless changed)
|
||||||

|
|
||||||
|
{ width=85% }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,9 @@ After the first start, the **settings window** opens – this is the central sta
|
|||||||
---
|
---
|
||||||
|
|
||||||
## Station Settings
|
## Station Settings
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Login and Chat Categories
|
### Login and Chat Categories
|
||||||
|
|
||||||
Enter your ON4KST chat credentials here (callsign and password).
|
Enter your ON4KST chat credentials here (callsign and password).
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
KST4Contest automatically marks worked stations in the chat user list. Two basic methods are available:
|
KST4Contest automatically marks worked stations in the chat user list. Two basic methods are available:
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Method 1: Universal File Based Callsign Interpreter (Simplelogfile)
|
## Method 1: Universal File Based Callsign Interpreter (Simplelogfile)
|
||||||
@@ -33,6 +34,7 @@ When saving a QSO, the logging software sends a UDP packet to the broadcast addr
|
|||||||
## Supported Logging Software
|
## Supported Logging Software
|
||||||
|
|
||||||
### UCXLog (DL7UCX)
|
### UCXLog (DL7UCX)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
UCXLog sends QSO UDP packets and transceiver frequency packets.
|
UCXLog sends QSO UDP packets and transceiver frequency packets.
|
||||||
|
|||||||
Reference in New Issue
Block a user