561 lines
22 KiB
HTML
561 lines
22 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en" dir="auto">
|
|
|
|
<head><meta charset="utf-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
<meta name="robots" content="index, follow">
|
|
<title>Repo Package List | </title>
|
|
<meta name="keywords" content="">
|
|
<meta name="description" content="The below packages are currently what is shipped as Hibbian in alphabetical order, any of the names can be used for an apt install:
|
|
chirp Version 1:20241108
|
|
Homepage https://chirpmyradio.com/
|
|
Description Configuration tool for amateur radios CHIRP is a free, open-source tool for programming your amateur radio. It supports a large number of manufacturers and models, as well as provides a way to interface with multiple data sources and formats. . CHIRP can handle data in the following formats:">
|
|
<meta name="author" content="Hibby">
|
|
<link rel="canonical" href="https://www.hibbian.org/articles/hibbian-packages/">
|
|
<link crossorigin="anonymous" href="/assets/css/stylesheet.min.94ca6368315b3c15b0f0e79bc7ec5d1dd70d3eb8ba8449219f5e1027772e645f.css" integrity="sha256-lMpjaDFbPBWw8Oebx+xdHdcNPri6hEkhn14QJ3cuZF8=" rel="preload stylesheet" as="style">
|
|
<link rel="icon" href="https://www.hibbian.org/favicon.ico">
|
|
<link rel="apple-touch-icon" href="https://www.hibbian.org/apple-touch-icon.png">
|
|
<link rel="alternate" hreflang="en" href="https://www.hibbian.org/articles/hibbian-packages/">
|
|
|
|
<meta name="twitter:title" content="Repo Package List | " />
|
|
<meta name="twitter:description" content="The below packages are currently what is shipped as Hibbian in alphabetical order, any of the names can be used for an apt install:
|
|
chirp Version 1:20241108
|
|
Homepage https://chirpmyradio.com/
|
|
Description Configuration tool for amateur radios CHIRP is a free, open-source tool for programming your amateur radio. It supports a large number of manufacturers and models, as well as provides a way to interface with multiple data sources and formats. . CHIRP can handle data in the following formats:" />
|
|
<meta property="og:title" content="Repo Package List | " />
|
|
<meta property="og:description" content="The below packages are currently what is shipped as Hibbian in alphabetical order, any of the names can be used for an apt install:
|
|
chirp Version 1:20241108
|
|
Homepage https://chirpmyradio.com/
|
|
Description Configuration tool for amateur radios CHIRP is a free, open-source tool for programming your amateur radio. It supports a large number of manufacturers and models, as well as provides a way to interface with multiple data sources and formats. . CHIRP can handle data in the following formats:" />
|
|
<meta property="og:type" content="article" />
|
|
<meta property="og:url" content="https://www.hibbian.org/articles/hibbian-packages/" />
|
|
<meta property="article:section" content="articles" />
|
|
<meta property="article:published_time" content="2024-11-26T23:34:26+01:00" />
|
|
<meta property="article:modified_time" content="2024-11-26T23:34:26+01:00" /><meta property="og:site_name" content="Hibbian Linux" />
|
|
|
|
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "BreadcrumbList",
|
|
"itemListElement": [
|
|
{
|
|
"@type": "ListItem",
|
|
"position": 1 ,
|
|
"name": "Articles",
|
|
"item": "https://www.hibbian.org/articles/"
|
|
},
|
|
{
|
|
"@type": "ListItem",
|
|
"position": 2 ,
|
|
"name": "Repo Package List",
|
|
"item": "https://www.hibbian.org/articles/hibbian-packages/"
|
|
}
|
|
]
|
|
}
|
|
</script>
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "BlogPosting",
|
|
"headline": "Repo Package List | ",
|
|
"name": "Repo Package List",
|
|
"description": "The below packages are currently what is shipped as Hibbian in alphabetical order, any of the names can be used for an apt install:\nchirp Version 1:20241108\nHomepage https://chirpmyradio.com/\nDescription Configuration tool for amateur radios CHIRP is a free, open-source tool for programming your amateur radio. It supports a large number of manufacturers and models, as well as provides a way to interface with multiple data sources and formats. . CHIRP can handle data in the following formats:",
|
|
"keywords": [
|
|
|
|
],
|
|
"wordCount" : "603",
|
|
"inLanguage": "en",
|
|
"datePublished": "2024-11-26T23:34:26+01:00",
|
|
"dateModified": "2024-11-26T23:34:26+01:00",
|
|
"author":{
|
|
"@type": "Person",
|
|
"name": "Hibby"
|
|
},
|
|
"mainEntityOfPage": {
|
|
"@type": "WebPage",
|
|
"@id": "https://www.hibbian.org/articles/hibbian-packages/"
|
|
},
|
|
"publisher": {
|
|
"@type": "Organization",
|
|
"name": "",
|
|
"logo": {
|
|
"@type": "ImageObject",
|
|
"url": "https://www.hibbian.org/favicon.ico"
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
<noscript>
|
|
<style>
|
|
#theme-toggle,
|
|
.top-link {
|
|
display: none;
|
|
}
|
|
|
|
</style>
|
|
<style>
|
|
@media (prefers-color-scheme: dark) {
|
|
:root {
|
|
--theme: rgb(29, 30, 32);
|
|
--entry: rgb(46, 46, 51);
|
|
--primary: rgb(218, 218, 219);
|
|
--secondary: rgb(155, 156, 157);
|
|
--tertiary-bg: rgb(65, 66, 68);
|
|
--content: rgb(196, 196, 197);
|
|
--code-bg: rgb(55, 56, 62);
|
|
--border: rgb(51, 51, 51);
|
|
}
|
|
|
|
.list-page {
|
|
background: var(--theme);
|
|
}
|
|
|
|
.list-page:not(.dark)::-webkit-scrollbar-track {
|
|
background: 0 0;
|
|
}
|
|
|
|
.list-page:not(.dark)::-webkit-scrollbar-thumb {
|
|
border-color: var(--theme);
|
|
}
|
|
}
|
|
|
|
</style>
|
|
</noscript>
|
|
|
|
</head>
|
|
|
|
<body class=" type-articles kind-page layout-" id="top"><script data-no-instant>
|
|
function switchTheme(theme) {
|
|
switch (theme) {
|
|
case 'light':
|
|
document.body.classList.remove('dark');
|
|
break;
|
|
case 'dark':
|
|
document.body.classList.add('dark');
|
|
break;
|
|
|
|
default:
|
|
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
|
document.body.classList.add('dark');
|
|
}
|
|
}
|
|
}
|
|
|
|
function isDarkTheme() {
|
|
return document.body.className.includes("dark");
|
|
}
|
|
|
|
function getPrefTheme() {
|
|
return localStorage.getItem("pref-theme");
|
|
}
|
|
|
|
function setPrefTheme(theme) {
|
|
switchTheme(theme)
|
|
localStorage.setItem("pref-theme", theme);
|
|
}
|
|
|
|
const toggleThemeCallbacks = {}
|
|
toggleThemeCallbacks['main'] = (isDark) => {
|
|
|
|
if (isDark) {
|
|
setPrefTheme('light');
|
|
} else {
|
|
setPrefTheme('dark');
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
window.addEventListener('toggle-theme', function() {
|
|
|
|
const isDark = isDarkTheme()
|
|
for (const key in toggleThemeCallbacks) {
|
|
toggleThemeCallbacks[key](isDark)
|
|
}
|
|
});
|
|
|
|
|
|
function toggleThemeListener() {
|
|
|
|
window.dispatchEvent(new CustomEvent('toggle-theme'));
|
|
}
|
|
|
|
</script>
|
|
<script>
|
|
|
|
(function() {
|
|
const defaultTheme = 'auto';
|
|
const prefTheme = getPrefTheme();
|
|
const theme = prefTheme ? prefTheme : defaultTheme;
|
|
|
|
switchTheme(theme);
|
|
})();
|
|
</script>
|
|
|
|
<header class="header">
|
|
<nav class="nav">
|
|
<div class="logo">
|
|
<span class="logo-switches">
|
|
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
|
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
|
|
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
|
stroke-linejoin="round">
|
|
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
|
</svg>
|
|
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
|
|
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
|
stroke-linejoin="round">
|
|
<circle cx="12" cy="12" r="5"></circle>
|
|
<line x1="12" y1="1" x2="12" y2="3"></line>
|
|
<line x1="12" y1="21" x2="12" y2="23"></line>
|
|
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
|
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
|
<line x1="1" y1="12" x2="3" y2="12"></line>
|
|
<line x1="21" y1="12" x2="23" y2="12"></line>
|
|
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
|
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
|
</svg>
|
|
</button>
|
|
</span>
|
|
</div>
|
|
<ul id="menu">
|
|
<li>
|
|
<a href="https://www.hibbian.org/" title="Home" class="active"
|
|
>Home
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://guide.hibbian.org/repo/" title="Install"
|
|
>Install
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://www.hibbian.org/news/" title="News"
|
|
>News
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://www.hibbian.org/articles/" title="Articles" class="active"
|
|
>Articles
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://guide.hibbian.org/" title="Guide"
|
|
>Guide
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://git.hibbian.org/" title="Git"
|
|
>Git
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
</header>
|
|
<main class="main post">
|
|
|
|
<article class="post-single">
|
|
<header class="post-header">
|
|
<h1 class="post-title">Repo Package List</h1>
|
|
<div class="post-meta"><span class="meta-item">
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-calendar" style="user-select: text;"><rect x="3" y="4" width="18" height="18" rx="2" ry="2" style="user-select: text;"></rect><line x1="16" y1="2" x2="16" y2="6" style="user-select: text;"></line><line x1="8" y1="2" x2="8" y2="6" style="user-select: text;"></line><line x1="3" y1="10" x2="21" y2="10" style="user-select: text;"></line></svg>
|
|
<span>November 26, 2024</span></span>
|
|
|
|
|
|
|
|
</div>
|
|
</header>
|
|
<div class="post-content"><p>The below packages are currently what is shipped as Hibbian in alphabetical
|
|
order, any of the names can be used for an <code>apt install</code>:</p>
|
|
<h2 id="chirp">chirp<a hidden class="anchor" aria-hidden="true" href="#chirp">¶</a></h2>
|
|
<h3 id="version">Version<a hidden class="anchor" aria-hidden="true" href="#version">¶</a></h3>
|
|
<p>1:20241108</p>
|
|
<h3 id="homepage">Homepage<a hidden class="anchor" aria-hidden="true" href="#homepage">¶</a></h3>
|
|
<p><a href="https://chirpmyradio.com/">https://chirpmyradio.com/</a></p>
|
|
<h3 id="description">Description<a hidden class="anchor" aria-hidden="true" href="#description">¶</a></h3>
|
|
<p>Configuration tool for amateur radios
|
|
CHIRP is a free, open-source tool for programming your amateur radio. It
|
|
supports a large number of manufacturers and models, as well as provides a way
|
|
to interface with multiple data sources and formats.
|
|
.
|
|
CHIRP can handle data in the following formats:</p>
|
|
<ul>
|
|
<li>Comma Separated Values (.csv)</li>
|
|
<li>Comma Separated Values generated by RT Systems (.csv)</li>
|
|
<li>EVE for Yaesu VX-5 (.eve)</li>
|
|
<li>Kenwood HMK format (.hmk)</li>
|
|
<li>Kenwood commercial ITM format (.itm)</li>
|
|
<li>Icom Data Files (.icf)</li>
|
|
<li>ARRL TravelPlus (.tpe)</li>
|
|
<li>VX5 Commander Files (.vx5)</li>
|
|
<li>VX7 Commander Files (.vx7)
|
|
.
|
|
Most popular modern amateur radios are supported by CHIRP via their interface
|
|
cables.</li>
|
|
</ul>
|
|
<h2 id="direwolf">direwolf<a hidden class="anchor" aria-hidden="true" href="#direwolf">¶</a></h2>
|
|
<h3 id="version-1">Version<a hidden class="anchor" aria-hidden="true" href="#version-1">¶</a></h3>
|
|
<p>1.7</p>
|
|
<h3 id="homepage-1">Homepage<a hidden class="anchor" aria-hidden="true" href="#homepage-1">¶</a></h3>
|
|
<p><a href="https://github.com/wb2osz/direwolf">https://github.com/wb2osz/direwolf</a></p>
|
|
<h3 id="description-1">Description<a hidden class="anchor" aria-hidden="true" href="#description-1">¶</a></h3>
|
|
<p>Soundcard TNC for APRS
|
|
Dire Wolf is a software “soundcard” modem/TNC and APRS encoder/decoder. It can
|
|
be used stand-alone to receive APRS messages, as a digipeater, APRStt gateway,
|
|
or Internet Gateway (IGate). It can also be used as a virtual TNC for other
|
|
applications such as APRSIS32, UI-View32, Xastir, APRS-TW, YAAC, UISS, Linux
|
|
AX25, SARTrack, and many others.</p>
|
|
<h2 id="hibbian-archive-keyring">hibbian-archive-keyring<a hidden class="anchor" aria-hidden="true" href="#hibbian-archive-keyring">¶</a></h2>
|
|
<h3 id="description-2">Description<a hidden class="anchor" aria-hidden="true" href="#description-2">¶</a></h3>
|
|
<p>mini-buildd archive keys (and sources.lists) for hibbian
|
|
Automatic archive keys and APT sources.list library for
|
|
mini-buildd instance id hibbian.</p>
|
|
<h2 id="linbpq">linbpq<a hidden class="anchor" aria-hidden="true" href="#linbpq">¶</a></h2>
|
|
<h3 id="version-2">Version<a hidden class="anchor" aria-hidden="true" href="#version-2">¶</a></h3>
|
|
<p>6.0.24.50</p>
|
|
<h3 id="homepage-2">Homepage<a hidden class="anchor" aria-hidden="true" href="#homepage-2">¶</a></h3>
|
|
<p><a href="https://www.cantab.net/users/john.wiseman/Documents/">https://www.cantab.net/users/john.wiseman/Documents/</a></p>
|
|
<h3 id="description-3">Description<a hidden class="anchor" aria-hidden="true" href="#description-3">¶</a></h3>
|
|
<p>Packet node and ax25 stack
|
|
LINBPQ is a Linux version of the BPQ32 Node, BBS and Chat Server components.
|
|
It is actively developed by John G8BPQ and contains a complete, independent
|
|
implementation of ax.25 and net/rom as well as BBS and Chat applications and
|
|
can be used either as a packet switch or as a full featured node.</p>
|
|
<h2 id="qttermtcp">qttermtcp<a hidden class="anchor" aria-hidden="true" href="#qttermtcp">¶</a></h2>
|
|
<h3 id="version-3">Version<a hidden class="anchor" aria-hidden="true" href="#version-3">¶</a></h3>
|
|
<p>0.0.0.73</p>
|
|
<h3 id="homepage-3">Homepage<a hidden class="anchor" aria-hidden="true" href="#homepage-3">¶</a></h3>
|
|
<p><a href="https://www.cantab.net/users/john.wiseman/Documents/QtTermTCP.html">https://www.cantab.net/users/john.wiseman/Documents/QtTermTCP.html</a></p>
|
|
<h3 id="description-4">Description<a hidden class="anchor" aria-hidden="true" href="#description-4">¶</a></h3>
|
|
<p>Qt-based Terminal for packet
|
|
QtTermTCP is a multiplatform terminal for packet that will work over TCP, KISS
|
|
and other modes of connectivity</p>
|
|
<h2 id="ssdv">ssdv<a hidden class="anchor" aria-hidden="true" href="#ssdv">¶</a></h2>
|
|
<h3 id="version-4">Version<a hidden class="anchor" aria-hidden="true" href="#version-4">¶</a></h3>
|
|
<p>20240409-1958</p>
|
|
<h3 id="homepage-4">Homepage<a hidden class="anchor" aria-hidden="true" href="#homepage-4">¶</a></h3>
|
|
<p><a href="https://github.com/fsphil/ssdv">https://github.com/fsphil/ssdv</a></p>
|
|
<h3 id="description-5">Description<a hidden class="anchor" aria-hidden="true" href="#description-5">¶</a></h3>
|
|
<p>Simple command line app for encoding / decoding SSDV image data
|
|
Robust version of the JPEG image format, for transmission over an unreliable medium.</p>
|
|
<h2 id="uronode">uronode<a hidden class="anchor" aria-hidden="true" href="#uronode">¶</a></h2>
|
|
<h3 id="version-5">Version<a hidden class="anchor" aria-hidden="true" href="#version-5">¶</a></h3>
|
|
<p>2.15</p>
|
|
<h3 id="homepage-5">Homepage<a hidden class="anchor" aria-hidden="true" href="#homepage-5">¶</a></h3>
|
|
<p><a href="https://uronode.sourceforge.net/">https://uronode.sourceforge.net/</a></p>
|
|
<h3 id="description-6">Description<a hidden class="anchor" aria-hidden="true" href="#description-6">¶</a></h3>
|
|
<p>Node front end for AX.25, NET/ROM, Rose and TCP
|
|
URONode is a packet radio node front end for amateur radio operators.
|
|
It provides a shell modelled after those of LinuxNode, AWZNode and
|
|
Flexnode. It is capable of initiating connections to remote stations
|
|
and exposing services installed on them to users.</p>
|
|
<h2 id="wsjtx">wsjtx<a hidden class="anchor" aria-hidden="true" href="#wsjtx">¶</a></h2>
|
|
<h3 id="version-6">Version<a hidden class="anchor" aria-hidden="true" href="#version-6">¶</a></h3>
|
|
<p>2.7.0~rc7</p>
|
|
<h3 id="homepage-6">Homepage<a hidden class="anchor" aria-hidden="true" href="#homepage-6">¶</a></h3>
|
|
<p><a href="https://sourceforge.net/projects/wsjt/">https://sourceforge.net/projects/wsjt/</a></p>
|
|
<h3 id="description-7">Description<a hidden class="anchor" aria-hidden="true" href="#description-7">¶</a></h3>
|
|
<p>Weak-signal amateur radio communications
|
|
WSJT-X implements amateur radio communication protocols or “modes” called
|
|
FST4, FST4W, FT4, FT8, JT4, JT9, JT65, Q65, MSK144, and WSPR, as well as one
|
|
called Echo for detecting and measuring your own radio signals reflected from
|
|
the Moon. These modes were all designed for making reliable, confirmed QSOs
|
|
under extreme weak-signal conditions.
|
|
.
|
|
JT4, JT9, and JT65 use nearly identical message structure and source encoding
|
|
(the efficient compression of standard messages used for minimal QSOs). They
|
|
use timed 60-second T/R sequences synchronized with UTC. JT4 and JT65 were
|
|
designed for EME (“moonbounce”) on the VHF/UHF/microwave bands. JT9 is
|
|
optimized for the MF, and HF bands. It is about 2 dB more sensitive than
|
|
JT65 while using less than 10% of the bandwidth. Q65 offers submodes with a
|
|
wide range of T/R sequence lengths and tone spacings.
|
|
.
|
|
FT4 and FT8 are operationally similar but use T/R cycles only 7.5 and 15 s
|
|
long, respectively. MSK144 is designed for Meteor Scatter on the VHF bands.
|
|
These modes offer enhanced message formats with support for nonstandard
|
|
callsigns and some popular contests.
|
|
.
|
|
FST4 and FST4W are designed particularly for the LF and MF bands. On these
|
|
bands their fund</p>
|
|
|
|
|
|
</div>
|
|
|
|
<footer class="post-footer">
|
|
</footer>
|
|
<div class="comments-separator"></div>
|
|
</article>
|
|
</main>
|
|
|
|
<footer class="footer">
|
|
<span>© 2024 <a href="https://www.hibbian.org/"></a></span><span style="display: inline-block; margin-left: 1em;">
|
|
<a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA</a>
|
|
</span>
|
|
<span style="display: inline-block; margin-left: 1em;">
|
|
Powered by
|
|
<a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &
|
|
<a href="https://github.com/reorx/hugo-PaperModX/" rel="noopener" target="_blank">PaperModX</a>
|
|
</span>
|
|
</footer>
|
|
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
|
<path d="M12 6H0l6-6z" />
|
|
</svg>
|
|
</a>
|
|
|
|
<script>
|
|
(function() {
|
|
|
|
const disableThemeToggle = '' == '1';
|
|
if (disableThemeToggle) {
|
|
return;
|
|
}
|
|
|
|
let button = document.getElementById("theme-toggle")
|
|
|
|
button.removeEventListener('click', toggleThemeListener)
|
|
|
|
button.addEventListener('click', toggleThemeListener)
|
|
})();
|
|
</script>
|
|
|
|
<script>
|
|
(function () {
|
|
let menu = document.getElementById('menu')
|
|
if (menu) {
|
|
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
|
menu.onscroll = function () {
|
|
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
|
}
|
|
}
|
|
|
|
const disableSmoothScroll = '' == '1';
|
|
const enableInstantClick = '' == '1';
|
|
|
|
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches || disableSmoothScroll || enableInstantClick) {
|
|
return;
|
|
}
|
|
|
|
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
|
anchor.addEventListener("click", function (e) {
|
|
e.preventDefault();
|
|
var id = this.getAttribute("href").substr(1);
|
|
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
|
behavior: "smooth"
|
|
});
|
|
if (id === "top") {
|
|
history.replaceState(null, null, " ");
|
|
} else {
|
|
history.pushState(null, null, `#${id}`);
|
|
}
|
|
});
|
|
});
|
|
})();
|
|
</script>
|
|
<script>
|
|
var mybutton = document.getElementById("top-link");
|
|
window.onscroll = function () {
|
|
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
|
mybutton.style.visibility = "visible";
|
|
mybutton.style.opacity = "1";
|
|
} else {
|
|
mybutton.style.visibility = "hidden";
|
|
mybutton.style.opacity = "0";
|
|
}
|
|
};
|
|
</script>
|
|
<script>
|
|
if (window.scrollListeners) {
|
|
|
|
for (const listener of scrollListeners) {
|
|
window.removeEventListener('scroll', listener)
|
|
}
|
|
}
|
|
window.scrollListeners = []
|
|
</script>
|
|
|
|
|
|
|
|
<script src="/js/medium-zoom.min.js" data-no-instant
|
|
></script>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
|
(function() {
|
|
const enableTocScroll = '' == '1'
|
|
if (!enableTocScroll) {
|
|
return
|
|
}
|
|
if (!document.querySelector('.toc')) {
|
|
console.log('no toc found, ignore toc scroll')
|
|
return
|
|
}
|
|
|
|
|
|
|
|
const scrollListeners = window.scrollListeners
|
|
const headings = document.querySelectorAll('h1[id],h2[id],h3[id],h4[id],h5[id]');
|
|
const activeClass = 'active';
|
|
|
|
|
|
let activeHeading = headings[0];
|
|
getLinkByHeading(activeHeading).classList.add(activeClass);
|
|
|
|
const onScroll = () => {
|
|
const passedHeadings = [];
|
|
for (const h of headings) {
|
|
|
|
if (getOffsetTop(h) < 5) {
|
|
passedHeadings.push(h)
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
if (passedHeadings.length > 0) {
|
|
newActiveHeading = passedHeadings[passedHeadings.length - 1];
|
|
} else {
|
|
newActiveHeading = headings[0];
|
|
}
|
|
if (activeHeading != newActiveHeading) {
|
|
getLinkByHeading(activeHeading).classList.remove(activeClass);
|
|
activeHeading = newActiveHeading;
|
|
getLinkByHeading(activeHeading).classList.add(activeClass);
|
|
}
|
|
}
|
|
|
|
let timer = null;
|
|
const scrollListener = () => {
|
|
if (timer !== null) {
|
|
clearTimeout(timer)
|
|
}
|
|
timer = setTimeout(onScroll, 50)
|
|
}
|
|
window.addEventListener('scroll', scrollListener, false);
|
|
scrollListeners.push(scrollListener)
|
|
|
|
function getLinkByHeading(heading) {
|
|
const id = encodeURI(heading.getAttribute('id')).toLowerCase();
|
|
return document.querySelector(`.toc ul li a[href="#${id}"]`);
|
|
}
|
|
|
|
function getOffsetTop(heading) {
|
|
if (!heading.getClientRects().length) {
|
|
return 0;
|
|
}
|
|
let rect = heading.getBoundingClientRect();
|
|
return rect.top
|
|
}
|
|
})();
|
|
</script>
|
|
|
|
</body>
|
|
|
|
</html>
|