From da8831eaaef04d77e1389d11945bc430bfb6c4cd Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Tue, 24 Mar 2026 00:08:10 +0000 Subject: [PATCH] Added new fonts Added new documentation --- docs/Getting started/Setup.md | 78 ++++++++ docs/Getting started/_index.md | 4 + docs/Is the ETL free.md | 76 ++++++++ docs/_config.yml | 6 - docs/_index.md | 7 +- docs/callbacks/delegate.md | 66 ++++++- docs/callbacks/inplace_function.md | 174 ++++++++++++++++-- docs/codecs/manchester.md | 132 +++++++------ docs/releases/_index.md | 66 +++---- hugo/assets/css/custom.css | 97 +++++++--- hugo/assets/css/syntax-dark.css | 137 +++++++------- hugo/hugo.toml | 21 +++ .../fonts/roboto-mono-v31-latin-500.woff2 | Bin 0 -> 12936 bytes .../fonts/roboto-v51-latin-regular.woff2 | Bin 0 -> 21884 bytes test/vs2022/etl.vcxproj | 5 - test/vs2022/etl.vcxproj.filters | 15 -- 16 files changed, 649 insertions(+), 235 deletions(-) create mode 100644 docs/Getting started/Setup.md create mode 100644 docs/Getting started/_index.md create mode 100644 docs/Is the ETL free.md delete mode 100644 docs/_config.yml create mode 100644 hugo/static/fonts/roboto-mono-v31-latin-500.woff2 create mode 100644 hugo/static/fonts/roboto-v51-latin-regular.woff2 diff --git a/docs/Getting started/Setup.md b/docs/Getting started/Setup.md new file mode 100644 index 00000000..96ca35e8 --- /dev/null +++ b/docs/Getting started/Setup.md @@ -0,0 +1,78 @@ +--- +title: "Setup" +--- + +--- + +This page describes the steps needed to integrate the ETL with your project. +The ETL requires no special installation. Just copy or clone the GitHub project into an appropriate directory. +For additional information pertaining to compilers, see this page. + +The ETL does not depend on the STL, but can use the algorithms and definitions from it, if the project does. +This is controlled by the ETL_NO_STL macro. If this macro is defined in the profile then the ETL will use its own reverse engineered versions. +See No STL + +## User defined files +The user may create a file named `etl_profile.h` that exists in the include path for the project. +The file will define any ETL configuration macros. See here for further information. +This header is included from ETL's `platform.h` + +An example of `etl_profile.h` could be:- + +```C++ +#ifndef ETL_PROFILE_H +#define ETL_PROFILE_H + +#define ETL_THROW_EXCEPTIONS +#define ETL_VERBOSE_ERRORS +#define ETL_CHECK_PUSH_POP +#endif +``` + +There are several example profiles available in the ETL's `profiles/` directory. They may be used as a base for your own project specific variant. + +If `etl_profile.h` does not exist then `platform.h` will attempt to automatically deduce the development OS, compiler +type, version and language support level. + +## platform.h +This header is defined by the ETL and is included in all ETL headers. It will attempt to identify the development OS, compiler and language support level. Using this information it will define various ETL configuration macros. +The user does not need to modify this file. + +## Additional include directories +The compiler will normally expect paths to additional include directories to be specified +A path to `etl/include` would normally be set, allowing header files to be specified as follows:- +```C++ +#include "etl/vector.h" +#include "etl/fsm.h" +``` + +A path to a user generated `etl_profile.h` must be defined. + +## WSL +There is a WSL Ubuntu image for running unit tests on Windows Subsystem for Linux. + +## Arduino +The ETL is available through the Arduino library manager. + +## Missing +The Arduino is often not supplied with a definition of the header `` causing compilation to fail. +One option, if you have this problem, is to define your own empty header `new`. + +## STL +The Arduino programming platform is not supplied with an implementation of the STL. Probably the best option for Arduino users to define ETL_NO_STL which will allow the ETL to be compiled without the standard library. + +If `ETL_NO_STL` is not defined then one must be acquired. + +A suitable STL implementation may be downloaded from the Arduino library resource. It is called ArduinoSTL. +Add `#include ` to the start of every file that uses the ETL. +Remember to add the directory to the include path. + +## PlatformIO +Many people are now using PlatformIO in conjunction with Visual Studio Code, which supports many platforms, including Arduino. + +## Compatibility with CppUTest +There are some issues with using the ETL with a project that uses CppUTest for unit testing. +The unit test library redefines the new operator. The ETL uses 'placement new' in many of its classes and the CppUTest redefinition breaks this functionality. + +To allow CppUTest to work with the ETL these macros must be disabled, either by commenting them out in the source files or removing the header files from the Makefile. A recompilation of CppUTest will be necessary. + diff --git a/docs/Getting started/_index.md b/docs/Getting started/_index.md new file mode 100644 index 00000000..a85f1731 --- /dev/null +++ b/docs/Getting started/_index.md @@ -0,0 +1,4 @@ +--- +title: "Getting started" +weight: 2 +--- diff --git a/docs/Is the ETL free.md b/docs/Is the ETL free.md new file mode 100644 index 00000000..0961decb --- /dev/null +++ b/docs/Is the ETL free.md @@ -0,0 +1,76 @@ +--- +title: "Is the ETL free?" +# Force it to the top of the list +weight: 1 +# Disable the Table of Contents entirely for this page +toc: false +--- + +--- + +The ETL is free for you or your company to use, including in commercial applications. +*However, it is not free for me to create or maintain.* + +## Why Open Source Needs Support + +Development, support, documentation, testing, and hosting all require time and resources. +*Currently, this work is carried entirely by me, usually without compensation.* + +As the ETL has grown in functionality and popularity, so has the workload. In some weeks, maintaining the project takes over 30 hours. Without financial support, this is difficult to sustain alongside paid work and personal obligations. + +## Why Sponsor the Embedded Template Library (ETL)? + +The Embedded Template Library (ETL) is a modern, high-performance C++ library designed specifically for embedded systems. It provides STL-like functionality for environments where efficiency, reliability, and low overhead are essential. + +The ETL is used by hobbyists, engineers, and international companies developing commercial embedded products. Yet it is maintained by a single developer in their spare time. + +If the ETL has helped your project or become part of your development toolset, please consider supporting its continued growth. + +## Why Sponsorship Matters + +- **Sustainability** +Ongoing support helps keep the library maintained and up to date. +- **Reliability** +Sponsorship allows for regular testing, bug fixes, and improvements. +- **Responsibility** +Supporting the tools you depend on strengthens the software ecosystem. +- **Recognition** +Sponsors can be publicly acknowledged if desired. + +Whether you use the ETL in personal projects or commercial products, your support helps keep it available and improving. + +The ETL began as a way to share years of embedded development experience. Since 2014, it has grown into a feature-rich and widely used library. +*But it is still powered by one developer, without corporate funding.* + +If you or your company benefit from the ETL, please consider becoming a sponsor. Even small contributions help cover hosting, tools, and time spent supporting the library and its users. + +[Why CFOs should care about Open Source software](https://opensourcepledge.com/blog/CFOs-care-about-OSS/) + +## How to sponsor + +There are two ways that you can help me with the maintenance and further development of the library. + +**Through the GitHub donations link.** +[Github sponsors](https://github.com/sponsors/ETLCPP) + +--- + +**By direct bank transfer** + Donations are accepted in many world currencies. + AED, AUD, BGN, CAD, CHF, CLP, COP, CZK, DKK, EGP, EUR, GBP, HKD, HUF, ILS, INR, ISK, JPY, KRW, + KZT, MAD, MXN, NOK, NZD, PHP, PLN, QAR, RON, RSD, SAR, SEK, SGD, THB, TRY, USD, ZAR + + I can supply invoices for companies that require one for accounting and tax purposes. + +**UK** +Beneficiary John Wellbelove +Account 12655643 +Sort code 04-00-75 + +**Swift (International)** +Beneficiary John Wellbelove +IBAN GB17 REVO 0099 7000 7513 26 +BIC REVOGB21 + +Many thanks for any support you can give to keep this project actively supported, +*John Wellbelove* diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index 6fac68f0..00000000 --- a/docs/_config.yml +++ /dev/null @@ -1,6 +0,0 @@ -plugins: - - jekyll-relative-links -relative_links: - enabled: true -include: - - manchester.md diff --git a/docs/_index.md b/docs/_index.md index 8f9ebdba..3c0da463 100644 --- a/docs/_index.md +++ b/docs/_index.md @@ -1,8 +1,13 @@ --- title: "Embedded Template Library" -alwaysopen: true --- +--- + +{{< callout emoji="❓">}} + ### [Is the ETL free?]({{< ref "Is the ETL free.md" >}}) +{{< /callout >}} + ## Motivation diff --git a/docs/callbacks/delegate.md b/docs/callbacks/delegate.md index 6a46b4f9..8d7cb1b3 100644 --- a/docs/callbacks/delegate.md +++ b/docs/callbacks/delegate.md @@ -5,15 +5,17 @@ weight: 1 --- -#### Header: `delegate.h` -#### Support: `20.45.0` -#### Similar to: `std::function` +{{< callout type="info">}} + Header: `delegate.h` + Support: `20.45.0` + Similar to: [std::function](https://en.cppreference.com/w/cpp/utility/functional/function.html) +{{< /callout >}} A small, in-place function wrapper that stores callable objects inside a fixed-size buffer (no dynamic allocation). It supports free functions, member functions, functors, and lambdas, with both runtime and compile-time bindings. ```C++ template class inplace_function; ``` @@ -21,8 +23,8 @@ class inplace_function; The defaults are defined as follows:- ```C++ -#if !defined(ETL_DEFAULT_INPLACE_FUNCTION_SIE) - #define ETL_DEFAULT_INPLACE_FUNCTION_SIE 32 +#if !defined(ETL_DEFAULT_INPLACE_FUNCTION_SIZE) + #define ETL_DEFAULT_INPLACE_FUNCTION_SIZE 32 #endif ``` @@ -46,8 +48,8 @@ The function signature. e.g. `int(char, float)` ```C++ Object_Size ``` -Size of the internal storage buffer. -Defaults to `ETL_DEFAULT_INPLACE_FUNCTION_SIE`. +Size of the internal storage buffer. +Defaults to `ETL_DEFAULT_INPLACE_FUNCTION_SIZE`. --- @@ -89,24 +91,33 @@ argument_types ## Constructors +**Description** Default constructor. +**Description** Copy/move constructors. +**Description** Construction from a free function pointer. +**Description** Construction from an object + member function pointer (const or non-const). +**Description** Construction from a lambda/functor (const or non-const). ## Assignment +**Description** Copy/move assignment. +**Description** Assignment from nullptr clears the target. +**Description** Assignment from function pointer. +**Description** Assignment from lambda/functor. ## Invocation @@ -114,21 +125,35 @@ Assignment from lambda/functor. ```C++ operator() ``` +**Description** Invokes the bound callable and asserts if uninitialised. +**Parameters** + +**Returns** + --- ```C++ call_if(...) ``` -For `void` return bool indicating whether it executed. -For non-void returns etl::optional. +**Description** +Calls the delegate function, if valid. +Indicates success in the return type. + +**Parameters** +`TArgs...` + +**Returns** +For `void` return `bool` indicating whether it executed. +For non-void returns `etl::optional`. --- ```C++ call_or(...) ``` +**Description** Invokes the target or a fallback callable. ## Observers @@ -136,6 +161,7 @@ Invokes the target or a fallback callable. ```C++ bool is_valid() const ``` +**Returns** Returns `true` if there is a valid callable. --- @@ -143,6 +169,11 @@ Returns `true` if there is a valid callable. ```C++ explicit operator bool() const ``` +**Description** + +**Parameters** + +**Returns** Returns the result of `is_valid()` ## Modifiers @@ -150,6 +181,7 @@ Returns the result of `is_valid()` ```C++ void clear() ``` +**Description** Clears any stored callable. --- @@ -157,6 +189,7 @@ Clears any stored callable. ```C++ void swap(inplace_function& other) ``` +**Description** Swaps with another inplace_function. --- @@ -166,6 +199,7 @@ Swaps with another inplace_function. ```C++ static constexpr size_t size() ``` +**Returns** Returns the size of the internal storage. --- @@ -173,6 +207,7 @@ Returns the size of the internal storage. ```C++ static constexpr size_t alignment() ``` +**Returns** Returns the alignment of the internal storage. ## Compile-Time Binding (No Payload) @@ -193,6 +228,7 @@ inplace_function create() ``` +**Description** Creates an `etl::inplace_function` using `Function`. ### Member function + instance (external linkage) @@ -201,6 +237,7 @@ Creates an `etl::inplace_function` using `Function`. template set() ``` +**Description** Sets the callable to the member function `Method` for the object `Instance`. --- @@ -208,44 +245,53 @@ Sets the callable to the member function `Method` for the object `Instance`. ```C++ create() ``` +**Description** ### Callable object + instance (operator()) ```C++ set() ``` +**Description** ```C++ create() ``` +**Description** ## Helper Aliases ```C++ etl::inplace_function_for ``` +**Description** ```C++ etl::inplace_function_for_any ``` +**Description** ## Helper Factories ```C++ make_inplace_function(function_ptr) ``` +**Description** ```C++ make_inplace_function(obj, &Type::Method) ``` +**Description** ```C++ make_inplace_function(lambda_or_functor) ``` +**Description** ```C++ make_inplace_function(function_like) ``` +**Description** C++17-only overloads also exist for compile-time binding. diff --git a/docs/callbacks/inplace_function.md b/docs/callbacks/inplace_function.md index 8feabeed..6cbd4c0d 100644 --- a/docs/callbacks/inplace_function.md +++ b/docs/callbacks/inplace_function.md @@ -5,15 +5,17 @@ weight: 1 --- -#### Header: `inplace_function.h` -#### Support: `20.45.0` -#### Similar to: `std::function` +{{< callout type="info">}} + Header: `inplace_function.h` + Support: `20.45.0` + Similar to: [std::function](https://en.cppreference.com/w/cpp/utility/functional/function.html) +{{< /callout >}} A small, in-place function wrapper that stores callable objects inside a fixed-size buffer (no dynamic allocation). It supports free functions, member functions, functors, and lambdas, with both runtime and compile-time bindings. ```C++ template class inplace_function; ``` @@ -21,8 +23,8 @@ class inplace_function; The defaults are defined as follows:- ```C++ -#if !defined(ETL_DEFAULT_INPLACE_FUNCTION_SIE) - #define ETL_DEFAULT_INPLACE_FUNCTION_SIE 32 +#if !defined(ETL_DEFAULT_INPLACE_FUNCTION_SIZE) + #define ETL_DEFAULT_INPLACE_FUNCTION_SIZE 32 #endif ``` @@ -32,26 +34,32 @@ The defaults are defined as follows:- #endif ``` -Set your own definitions in `etl_profile.h` if you require different defaults. +Set your own definitions if you require different defaults. ## Template Parameters ```C++ TSignature ``` -The function signature. -e.g. `int(char, float)` +**Description** +The function signature. e.g. `int(char, float)` + +--- ```C++ Object_Size ``` +**Description** Size of the internal storage buffer. Defaults to `ETL_DEFAULT_INPLACE_FUNCTION_SIZE`. +--- + ```C++ Object_Alignment ``` -Alignment of the internal storage buffer. +**Description** +Alignment of the internal storage buffer. Defaults to `ETL_DEFAULT_INPLACE_FUNCTION_ALIGNMENT`. ## Exceptions @@ -59,77 +67,133 @@ Defaults to `ETL_DEFAULT_INPLACE_FUNCTION_ALIGNMENT`. ```C++ etl::inplace_function_exception ``` +**Description** Base exception. +--- + ```C++ etl::inplace_function_uninitialized ``` +**Description** Thrown (via `ETL_ASSERT`) when invoked without a target. +--- + ## Member Types ```C++ function_type ``` +**Description** ```C++ return_type ``` +**Description** ```C++ argument_types ``` +**Description** ## Constructors +**Description** Default constructor. +**Description** Copy/move constructors. +**Description** Construction from a free function pointer. +**Description** Construction from an object + member function pointer (const or non-const). +**Description** Construction from a lambda/functor (const or non-const). ## Assignment +**Description** Copy/move assignment. +--- + +**Description** Assignment from nullptr clears the target. +--- + +**Description** Assignment from function pointer. +--- + +**Description** Assignment from lambda/functor. +--- + ## Invocation ```C++ operator() ``` +**Description** Invokes the bound callable and asserts if uninitialised. +**Parameters** + +**Returns** + +--- + ```C++ call_if(...) ``` -For `void` return bool indicating whether it executed. -For non-void returns etl::optional. +**Description** +Calls the delegate function, if valid. +Indicates success in the return type. + +**Parameters** +`TArgs...` + +**Returns** +For `void` return `bool` indicating whether it executed. +For non-void returns `etl::optional`. + +--- ```C++ call_or(...) ``` +**Description** Invokes the target or a fallback callable. +**Parameters** + +**Returns** + ## Observers ```C++ bool is_valid() const ``` +**Returns** Returns `true` if there is a valid callable. +--- + ```C++ explicit operator bool() const ``` +**Description** + +**Parameters** + +**Returns** Returns the result of `is_valid()` ## Modifiers @@ -137,23 +201,58 @@ Returns the result of `is_valid()` ```C++ void clear() ``` -Clears any stored callable. +**Description** +Clears any stored callable. + +**Parameters** +None + +**Returns** +Void. + +--- ```C++ void swap(inplace_function& other) ``` +**Description** Swaps with another inplace_function. + +**Parameters** +None + +**Returns** +Void. + +--- + ## Storage Introspection ```C++ static constexpr size_t size() ``` +**Description** +Interogates the internal storage size. + +**Parameters** +None + +**Returns** Returns the size of the internal storage. +--- + ```C++ static constexpr size_t alignment() ``` +**Description** +Interogates the internal storage alignment. + +**Parameters** +None + +**Returns** Returns the alignment of the internal storage. ## Compile-Time Binding (No Payload) @@ -166,12 +265,15 @@ void set() ``` Sets the callable to `Function`. +--- + ```C++ template inplace_function create() ``` +**Description** Creates an `etl::inplace_function` using `Function`. ### Member function + instance (external linkage) @@ -180,49 +282,95 @@ Creates an `etl::inplace_function` using `Function`. template set() ``` +**Description** Sets the callable to the member function `Method` for the object `Instance`. +--- + ```C++ create() ``` +**Description** + +**Parameters** + +**Returns** ### Callable object + instance (operator()) ```C++ set() ``` +**Description** + +**Parameters** + +**Returns** ```C++ create() ``` +**Description** + +**Parameters** + +**Returns** ## Helper Aliases ```C++ etl::inplace_function_for ``` +**Description** + +**Parameters** + +**Returns** + + ```C++ etl::inplace_function_for_any ``` +**Description** + +**Parameters** + +**Returns** ## Helper Factories ```C++ make_inplace_function(function_ptr) ``` +**Description** + +**Parameters** + +**Returns** ```C++ make_inplace_function(obj, &Type::Method) ``` +**Description** + +**Parameters** + +**Returns** ```C++ make_inplace_function(lambda_or_functor) ``` +**Description** ```C++ make_inplace_function(function_like) ``` +**Description** + +**Parameters** + +**Returns** C++17-only overloads also exist for compile-time binding. diff --git a/docs/codecs/manchester.md b/docs/codecs/manchester.md index 1eeceacd..6eb0ed6a 100644 --- a/docs/codecs/manchester.md +++ b/docs/codecs/manchester.md @@ -3,7 +3,14 @@ title: Manchester encoding and decoding weight: 1 --- -Efficient Manchester encoding and decoding of data. The Manchester code represents a data bit as a sequence of a 'high' and a 'low' value. In software this translates to a conversion from one to two bits, or in a practical situation, from `n` bytes to `n*2` bytes. +--- + +{{< callout type="info">}} + Header: `manchester.h` + Support: `20.45.0` +{{< /callout >}} + +Efficient Manchester encoding and decoding of data. The Manchester code represents a data bit as a sequence of a 'high' and a 'low' values. In software this translates to a conversion from one to two bits, or in a practical situation, from `n` bytes to `n*2` bytes. ## See also @@ -58,13 +65,11 @@ Comparing all 8 bit pairs in a 16-bit word is done as follows. Most traditional ways to Manchester encode data consist of a loop over all bits and a nested if-statement to check the value of the current bit. This approach does not scale well to increasing number of bits. The algorithm implemented here contains no conditional code and scales well. Doubling the number of processed bits per step (the chunk size) adds a single row to the bit duplication table. Because of the lack of loops and conditional code, this algorithm is likely to perform better than traditional ones on simple processors or when compiler optimization is disabled. On modern, powerful processors with caches and advanced optimization possibilities this algorithm may not show much benefit. In any case, the performance of the algorithm depends heavily on the processor type, compiler and compiler (optimization) settings. -## API Reference - -### Classes +## Classes Classes `etl::manchester` and `etl::manchester_inverted` contain static functions for encoding, decoding and validity checking. It is not necessary to instantiate objects of these classes. -#### etl::manchester +### etl::manchester ```cpp typedef manchester_base manchester; @@ -72,7 +77,7 @@ typedef manchester_base manchester; Manchester encoder using normal encoding (no inversion). -#### etl::manchester_inverted +### etl::manchester_inverted ```cpp typedef manchester_base manchester_inverted; @@ -80,9 +85,9 @@ typedef manchester_base manchester Manchester encoder using inverted encoding. -### Encoding Functions +## Encoding Functions -#### Encode single value +### Encode single value ```cpp template @@ -91,21 +96,21 @@ static ETL_CONSTEXPR14 typename encoded::type encode(TDecoded decoded) Encodes a single value using Manchester encoding. -**Parameters:** +**Parameters** -- `decoded`: The value to encode (`uint8_t`, `uint16_t`, or `uint32_t`) +`decoded`: The value to encode (`uint8_t`, `uint16_t`, or `uint32_t`) -**Returns:** +**Returns** -- The Manchester encoded value (twice the bit width of input) +The Manchester encoded value (twice the bit width of input) -**Example:** +**Example** ```cpp uint16_t encoded = etl::manchester::encode(0x55); ``` -#### Encode range +### Encode range ```cpp template @@ -115,16 +120,16 @@ static ETL_CONSTEXPR14 void encode(etl::span decoded, Encodes a span of data using the specified chunk size. -**Parameters:** +**Parameters** -- `decoded`: Source data to encode -- `encoded`: Destination for encoded data (must be twice the size of `decoded`) +`decoded`: Source data to encode +`encoded`: Destination for encoded data (must be twice the size of `decoded`) -**Template Parameters:** +**Template Parameters** -- `TChunk`: Chunk size for encoding (`uint8_t`, `uint16_t` or `uint32_t`) +`TChunk`: Chunk size for encoding (`uint8_t`, `uint16_t` or `uint32_t`) -**Example:** +**Example** ```cpp std::array data = {0x12, 0x34, 0x56, 0x78}; @@ -138,51 +143,56 @@ etl::manchester::encode(data, encoded_data1); etl::manchester::encode(data, encoded_data2); ``` -### Decoding Functions +## Decoding Functions -#### Decode single value +### Decode single value ```cpp template static ETL_CONSTEXPR14 typename decoded::type decode(TEncoded encoded) ``` +**Description** + Decodes a single Manchester encoded value. -**Parameters:** +**Parameters** -- `encoded`: The encoded value to decode (`uint16_t`, `uint32_t`, or `uint64_t`) +`encoded`: The encoded value to decode (`uint16_t`, `uint32_t`, or `uint64_t`) -**Returns:** +**Returns** -- The Manchester decoded value (half the bit width of input) +The Manchester decoded value (half the bit width of input) -**Example:** +**Example** ```cpp uint8_t decoded = etl::manchester::decode(0x5A5A); ``` +--- -#### Decode range +### Decode range ```cpp -template ::type> -static ETL_CONSTEXPR14 void decode(etl::span encoded, - etl::span decoded) +template ::type> +static ETL_CONSTEXPR14 +void decode(etl::span encoded, + etl::span decoded) ``` Decodes a span of Manchester encoded data. -**Parameters:** +**Parameters** -- `encoded`: Source data to decode -- `decoded`: Destination for decoded data (must be half the size of `encoded`) +`encoded`: Source data to decode +`decoded`: Destination for decoded data (must be half the size of `encoded`) -**Template Parameters:** +**Template Parameters** -- `TChunk`: Chunk type for decoding (`uint16_t`, `uint32_t`, or `uint64_t`) +`TChunk`: Chunk type for decoding (`uint16_t`, `uint32_t`, or `uint64_t`) -**Example:** +**Example** ```cpp std::array encoded = {/* ... */}; @@ -196,9 +206,9 @@ etl::manchester::decode(encoded, decoded1); etl::manchester::decode(encoded, decoded2); ``` -### Validation Functions +## Validation Functions -#### Single value +### Single value ```cpp template @@ -207,53 +217,53 @@ static ETL_CONSTEXPR14 bool is_valid(TChunk encoded) Validates that a single value contains valid Manchester encoded data. -**Parameters:** +**Parameters** -- `encoded`: The encoded value to validate +`encoded`: The encoded value to validate -**Returns:** +**Returns** -- `true` if the value contains valid Manchester encoded data, `false` otherwise +`true` if the value contains valid Manchester encoded data, `false` otherwise -**Example:** +**Example** ```cpp bool valid = etl::manchester::is_valid(0x5A5A); ``` -#### Range +### Range ```cpp -static ETL_CONSTEXPR14 bool is_valid(etl::span encoded) +static +ETL_CONSTEXPR14 +bool is_valid(etl::span encoded) ``` Validates that a range contains valid Manchester encoded data. -**Parameters:** +**Parameters** -- `encoded`: The range of encoded data to validate +`encoded`: The range of encoded data to validate -**Returns:** +**Returns** -- `true` if all data is valid Manchester encoding, `false` otherwise +`true` if all data is valid Manchester encoding, `false` otherwise -**Example:** +**Example** ```cpp std::array encoded_data = {/* ... */}; bool valid = etl::manchester::is_valid(encoded_data); ``` -## Supported Types +## Input/chunk types for encoding -### Input/chunk types for encoding +`uint8_t` → `uint16_t` (if 8-bit types are supported) +`uint16_t` → `uint32_t` +`uint32_t` → `uint64_t` (if 64-bit types are supported) -- `uint8_t` → `uint16_t` (if 8-bit types are supported) -- `uint16_t` → `uint32_t` -- `uint32_t` → `uint64_t` (if 64-bit types are supported) +## Input/chunk types for decoding -### Input/chunk types for decoding - -- `uint16_t` → `uint8_t` (if 8-bit types are supported) -- `uint32_t` → `uint16_t` -- `uint64_t` → `uint32_t` (if 64-bit types are supported) +`uint16_t` → `uint8_t` (if 8-bit types are supported) +`uint32_t` → `uint16_t` +`uint64_t` → `uint32_t` (if 64-bit types are supported) diff --git a/docs/releases/_index.md b/docs/releases/_index.md index fcb26047..e9a93d1a 100644 --- a/docs/releases/_index.md +++ b/docs/releases/_index.md @@ -20,45 +20,45 @@ Click on the links to see the original Github page. ## 20.46.0 **Pull requests:** -#1257 Fix `year_month` arithmetic and correct `chrono` API behavior +[#1257](https://github.com/ETLCPP/etl/pull/1257) Fix `year_month` arithmetic and correct `chrono` API behavior [#1259](https://github.com/ETLCPP/etl/pull/1259) Suppress warnings from std in optimized builds [#1261](https://github.com/ETLCPP/etl/pull/1261) Fix incorrect namespace for `iter_swap` calls -#1262 Document how to implement platform specifics -#1264 Add template deduction guide for `span` from `vector` -#1265 Fix etl::tuple template signature error in pair assignment operator -#1266 Fix etl::as_bytes for etl::span -#1267 Update C++26 deprecated constructs to ensure future standard compliance -#1268 Remove some UB in test_vector_non_trivial.cpp -#1269 Deduce underlying storage size when constructing string_ext from char[]. -#1271 Fix return value of get_token_list -#1275 Add etl::type_list API to more classes. -#1277 Fix for issue 1276 "Data corruption in the etl::bip_buffer_spsc_atomic" -#1281 Remove advance() on static spans -#1285 Manchester coding -#1286 Add missing includes -#1287 Move comparison operators of etl::expected to namespace etl -#1288 Add basic_format_arg constructor for ibasic_string -#1290 Add support for size_t and unsigned long to etl::format -#1291 Make typed_storage constructor constexpr -#1292 Add ref-qualifiers to basic_format_spec -#1299 Fix link rotations for etl::tree_node -#1303 Add constexpr to array comparison operators -#1304 Fix etl::variant get() for ambiguous types -#1307 Add more features to etl::type_list -#1308 Fix comparison and swap operators not in etl namespace -#1309 Reduce string flash usage -#1312 Enforce worse-case O(log n) dispatch for messages when using message router for c++11 and up -#1315 Add get endianness to byte stream reader +[#1262](https://github.com/ETLCPP/etl/pull/1262) Document how to implement platform specifics +[#1264](https://github.com/ETLCPP/etl/pull/1264) Add template deduction guide for `span` from `vector` +[#1265](https://github.com/ETLCPP/etl/pull/1265) Fix etl::tuple template signature error in pair assignment operator +[#1266](https://github.com/ETLCPP/etl/pull/1266) Fix etl::as_bytes for etl::span +[#1267](https://github.com/ETLCPP/etl/pull/1267) Update C++26 deprecated constructs to ensure future standard compliance +[#1268](https://github.com/ETLCPP/etl/pull/1268) Remove some UB in test_vector_non_trivial.cpp +[#1269](https://github.com/ETLCPP/etl/pull/1269) Deduce underlying storage size when constructing string_ext from char[]. +[#1271](https://github.com/ETLCPP/etl/pull/1271) Fix return value of get_token_list +[#1275](https://github.com/ETLCPP/etl/pull/1275) Add etl::type_list API to more classes. +[#1277](https://github.com/ETLCPP/etl/pull/1277) Fix for issue 1276 "Data corruption in the etl::bip_buffer_spsc_atomic" +[#1281](https://github.com/ETLCPP/etl/pull/1281) Remove advance() on static spans +[#1285](https://github.com/ETLCPP/etl/pull/1285) Manchester coding +[#1286](https://github.com/ETLCPP/etl/pull/1286) Add missing includes +[#1287](https://github.com/ETLCPP/etl/pull/1287) Move comparison operators of etl::expected to namespace etl +[#1288](https://github.com/ETLCPP/etl/pull/1288) Add basic_format_arg constructor for ibasic_string +[#1290](https://github.com/ETLCPP/etl/pull/1290) Add support for size_t and unsigned long to etl::format +[#1291](https://github.com/ETLCPP/etl/pull/1291) Make typed_storage constructor constexpr +[#1292](https://github.com/ETLCPP/etl/pull/1292) Add ref-qualifiers to basic_format_spec +[#1299](https://github.com/ETLCPP/etl/pull/1299) Fix link rotations for etl::tree_node +[#1303](https://github.com/ETLCPP/etl/pull/1303) Add constexpr to array comparison operators +[#1304](https://github.com/ETLCPP/etl/pull/1304) Fix etl::variant get() for ambiguous types +[#1307](https://github.com/ETLCPP/etl/pull/1307) Add more features to etl::type_list +[#1308](https://github.com/ETLCPP/etl/pull/1308) Fix comparison and swap operators not in etl namespace +[#1309](https://github.com/ETLCPP/etl/pull/1309) Reduce string flash usage +[#1312](https://github.com/ETLCPP/etl/pull/1312) Enforce worse-case O(log n) dispatch for messages when using message router for c++11 and up +[#1315](https://github.com/ETLCPP/etl/pull/1315) Add get endianness to byte stream reader ## 20.45.0 **Issues:** -#1184 Request: Adding a method to check whether a etl::callback_timer_atomic is currently running -#1189 Request: make useage of osMutexRobust in etl::mutex optional -#1207 Monadic Operations for etl::expected -#1240 Add redundant semicolon checks to CMakeLists.txt and fix issues -#1241 Add -pedantic-errors to unit test CMakeLists.txt and fix issues -#1242 Add begin() and end() to etl::optional +[#1184](https://github.com/ETLCPP/etl/issues/1184) Request: Adding a method to check whether a etl::callback_timer_atomic is currently running +[#1189](https://github.com/ETLCPP/etl/issues/1189) Request: make useage of osMutexRobust in etl::mutex optional +[#1207](https://github.com/ETLCPP/etl/issues/1207) Monadic Operations for etl::expected +[#1240](https://github.com/ETLCPP/etl/issues/1240) Add redundant semicolon checks to CMakeLists.txt and fix issues +[#1241](https://github.com/ETLCPP/etl/issues/1241) Add -pedantic-errors to unit test CMakeLists.txt and fix issues +[#1242](https://github.com/ETLCPP/etl/issues/1242) Add begin() and end() to etl::optional **Pull requests:** #1204 Add etl::format diff --git a/hugo/assets/css/custom.css b/hugo/assets/css/custom.css index e089e698..0471ed7d 100644 --- a/hugo/assets/css/custom.css +++ b/hugo/assets/css/custom.css @@ -1,11 +1,12 @@ +/* Definitions for light mode */ html:not(.dark) h1 { color: coral !important; } html:not(.dark) h2 { - color: #4884cc !important; - border-bottom: 2px solid black !important; + color: royalblue !important; + border-bottom: 3px solid black !important; } html:not(.dark) h3, @@ -26,14 +27,14 @@ html:not(.dark) dl, html:not(.dark) dl dt code, html:not(.dark) dl dd { color: black !important; - background-color: dddddd !important; + background-color: #eeeeee !important; } html:not(.dark) code, html:not(.dark) pre, html:not(.dark) pre code { - color: darkslategrey !important; - background-color: #dddddd !important; + color: black !important; + background-color: #eeeeee !important; } html:not(.dark) hr { @@ -41,9 +42,9 @@ html:not(.dark) hr { } html:not(.dark) .hx\:font-extrabold { - font-family: Tahoma, sans-serif !important; + font-family: Roboto, sans-serif !important; font-size: 1.6rem !important; - color: black !important; + color: royalblue !important; } /* inactive */ @@ -56,8 +57,11 @@ html:not(.dark) .hextra-sidebar-active-item { color: black !important; } +html:not(.dark) .content p.red-text { + color: red !important; +} - +/* Definitions for dark mode */ html.dark body { background-color: #1e1e1e !important; } @@ -88,8 +92,8 @@ html.dark h1 } html.dark h2 { - color: skyblue !important; - border-bottom: 2px solid #f0f0f0 !important; + color: #7099c7 !important; + border-bottom: 3px solid #f0f0f0 !important; } html.dark h3, @@ -120,7 +124,7 @@ html.dark hr { } html.dark .hx\:font-extrabold { - font-family: Tahoma, sans-serif !important; + font-family: Roboto, sans-serif !important; font-size: 1.6rem !important; color: #7099c7 !important; } @@ -135,10 +139,53 @@ html.dark .hextra-sidebar-active-item { color: white !important; } +html.dark .content p.red-text { + color: salmon !important; +} + +/* Common definitions */ + +@font-face { + font-family: Roboto; + src: url('/fonts/roboto-v51-latin-regular.woff2') format('woff2'); + font-weight:500; + font-style: normal; +} + +@font-face { + font-family: 'Roboto Mono'; + src: url('/fonts/roboto-mono-v31-latin-500.woff2') format('woff2'); + font-weight: nornal; + font-style: normal; +} + +/* Regular item hover */ +.hextra-sidebar-item a:hover, +.hextra-sidebar-item a:hover span { + background-color: rgb(250, 195, 175) !important; + color: black !important; +} + +/* Active item default + hover - must come AFTER regular hover */ +.hextra-sidebar-item[data-active="true"] a, +.hextra-sidebar-item[data-active="true"] a span, +.hextra-sidebar-item[data-active="true"] a:hover, +.hextra-sidebar-item[data-active="true"] a:hover span { + background-color: coral !important; + color: #ffffff !important; +} + +.content ul li { + font-family: Roboto, sans-serif !important; + font-style: normal !important; + font-weight: normal !important; + font-size: 110% !important; +} + h1 { - font-family: Tahoma, sans-serif !important; + font-family: Roboto, sans-serif !important; font-style: normal !important; font-weight: normal !important; margin-top: 0.5em !important; @@ -146,7 +193,7 @@ h1 { } h2 { - font-family: Tahoma, sans-serif !important; + font-family: Roboto, sans-serif !important; font-style: normal !important; font-weight: normal !important; font-size: 150% !important; @@ -155,7 +202,7 @@ h2 { } h3 { - font-family: Tahoma, sans-serif !important; + font-family: Roboto, sans-serif !important; font-style: normal !important; font-weight: normal !important; font-size: 130% !important; @@ -164,7 +211,7 @@ h3 { } h4 { - font-family: Tahoma, sans-serif !important; + font-family: Roboto, sans-serif !important; font-style: normal !important; font-weight: normal !important; font-size: 110% !important; @@ -173,48 +220,48 @@ h4 { } dl { - font-family: Consolas, monospace !important; + font-family: 'Roboto Mono', monospace !important; font-style: normal !important; font-weight: normal !important; font-size: 1rem !important; } dl dt code { - font-family: Consolas, monospace !important; + font-family: 'Roboto Mono', monospace !important; font-style: normal !important; font-weight: normal !important; font-size: 1rem !important; } dl dd { - font-family: Tahoma, sans-serif !important; + font-family: Roboto, sans-serif !important; font-style: normal !important; font-weight: normal !important; font-size: 1rem !important; } code { - font-family: Consolas, monospace !important; + font-family: 'Roboto Mono', monospace !important; font-style: normal !important; font-weight: normal !important; - font-size: 1rem !important; + font-size: 0.9rem !important; border: none !important; border-radius: 2px !important; } pre code { - font-family: Consolas, monospace !important; + font-family: 'Roboto Mono', monospace !important; font-style: normal !important; font-weight: normal !important; - font-size: 1rem !important; + font-size: 0.9rem !important; padding-left: 0 !important; margin-left: 0 !important; border: none !important; } pre { - font-family: Consolas, monospace !important; - font-size: 1rem !important; + font-family: 'Roboto Mono', monospace !important; + font-size: 0.9rem !important; margin-top: 2em !important; margin-bottom: 0em !important; padding-top: 0.5em !important; @@ -232,7 +279,7 @@ hr { } p { - font-family: Tahoma, sans-serif !important; + font-family: Roboto, sans-serif !important; font-style: normal !important; font-weight: normal !important; font-size: 110% !important; diff --git a/hugo/assets/css/syntax-dark.css b/hugo/assets/css/syntax-dark.css index 7c96288b..55757d15 100644 --- a/hugo/assets/css/syntax-dark.css +++ b/hugo/assets/css/syntax-dark.css @@ -1,74 +1,79 @@ -/* Generated using: hugo gen chromastyles --style=aura-theme-dark-soft */ +/* Generated using: hugo gen chromastyles --style=github-dark */ -/* Background */ .bg { color:#bdbdbd;background-color:#15141b; } -/* PreWrapper */ .chroma { color:#bdbdbd;background-color:#15141b;-webkit-text-size-adjust:none; } -/* Error */ .chroma .err { color:#c55858 } +/* Background */ .bg { color:#e6edf3;background-color:#0d1117; } +/* PreWrapper */ .chroma { color:#e6edf3;background-color:#0d1117;-webkit-text-size-adjust:none; } +/* Error */ .chroma .err { color:#f85149 } /* LineLink */ .chroma .lnlinks { outline:none;text-decoration:none;color:inherit } /* LineTableTD */ .chroma .lntd { vertical-align:top;padding:0;margin:0;border:0; } /* LineTable */ .chroma .lntable { border-spacing:0;padding:0;margin:0;border:0; } -/* LineHighlight */ .chroma .hl { background-color:#29263c } -/* LineNumbersTable */ .chroma .lnt { white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6d6d6d } -/* LineNumbers */ .chroma .ln { white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6d6d6d } +/* LineHighlight */ .chroma .hl { background-color:#6e7681 } +/* LineNumbersTable */ .chroma .lnt { white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679 } +/* LineNumbers */ .chroma .ln { white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6e7681 } /* Line */ .chroma .line { display:flex; } -/* Keyword */ .chroma .k { color:#8464c6 } -/* KeywordConstant */ .chroma .kc { color:#54c59f } -/* KeywordDeclaration */ .chroma .kd { color:#8464c6 } -/* KeywordNamespace */ .chroma .kn { color:#8464c6 } -/* KeywordPseudo */ .chroma .kp { color:#8464c6 } -/* KeywordReserved */ .chroma .kr { color:#8464c6 } -/* KeywordType */ .chroma .kt { color:#6cb2c7 } -/* NameAttribute */ .chroma .na { color:#c17ac8 } -/* NameClass */ .chroma .nc { color:#6cb2c7 } -/* NameConstant */ .chroma .no { color:#54c59f } -/* NameDecorator */ .chroma .nd { color:#c17ac8 } -/* NameEntity */ .chroma .ni { color:#c7a06f } -/* NameException */ .chroma .ne { color:#c55858 } -/* NameLabel */ .chroma .nl { color:#c17ac8 } -/* NameProperty */ .chroma .py { color:#c17ac8 } -/* NameTag */ .chroma .nt { color:#8464c6 } -/* NameBuiltin */ .chroma .nb { color:#6cb2c7 } -/* NameBuiltinPseudo */ .chroma .bp { color:#6cb2c7 } -/* NameFunction */ .chroma .nf { color:#c7a06f } -/* NameFunctionMagic */ .chroma .fm { color:#c7a06f } -/* Literal */ .chroma .l { color:#54c59f } -/* LiteralDate */ .chroma .ld { color:#54c59f } -/* LiteralString */ .chroma .s { color:#54c59f } -/* LiteralStringAffix */ .chroma .sa { color:#8464c6 } -/* LiteralStringBacktick */ .chroma .sb { color:#54c59f } -/* LiteralStringChar */ .chroma .sc { color:#54c59f } -/* LiteralStringDelimiter */ .chroma .dl { color:#54c59f } -/* LiteralStringDoc */ .chroma .sd { color:#6d6d6d } -/* LiteralStringDouble */ .chroma .s2 { color:#54c59f } -/* LiteralStringEscape */ .chroma .se { color:#8464c6 } -/* LiteralStringHeredoc */ .chroma .sh { color:#6d6d6d } -/* LiteralStringInterpol */ .chroma .si { color:#54c59f } -/* LiteralStringOther */ .chroma .sx { color:#54c59f } -/* LiteralStringRegex */ .chroma .sr { color:#54c59f } -/* LiteralStringSingle */ .chroma .s1 { color:#54c59f } -/* LiteralStringSymbol */ .chroma .ss { color:#54c59f } -/* LiteralNumber */ .chroma .m { color:#54c59f } -/* LiteralNumberBin */ .chroma .mb { color:#54c59f } -/* LiteralNumberFloat */ .chroma .mf { color:#54c59f } -/* LiteralNumberHex */ .chroma .mh { color:#54c59f } -/* LiteralNumberInteger */ .chroma .mi { color:#54c59f } -/* LiteralNumberIntegerLong */ .chroma .il { color:#54c59f } -/* LiteralNumberOct */ .chroma .mo { color:#54c59f } -/* Operator */ .chroma .o { color:#8464c6 } -/* OperatorWord */ .chroma .ow { color:#8464c6 } -/* Punctuation */ .chroma .p { color:#c17ac8 } -/* Comment */ .chroma .c { color:#6d6d6d;font-style:italic } -/* CommentHashbang */ .chroma .ch { color:#6d6d6d;font-style:italic } -/* CommentMultiline */ .chroma .cm { color:#6d6d6d;font-style:italic } -/* CommentSingle */ .chroma .c1 { color:#6d6d6d;font-style:italic } -/* CommentSpecial */ .chroma .cs { color:#6d6d6d;font-style:italic } -/* CommentPreproc */ .chroma .cp { color:#6d6d6d;font-style:italic } -/* CommentPreprocFile */ .chroma .cpf { color:#6d6d6d;font-style:italic } -/* GenericDeleted */ .chroma .gd { color:#c55858 } +/* Keyword */ .chroma .k { color:#ff7b72 } +/* KeywordConstant */ .chroma .kc { color:#79c0ff } +/* KeywordDeclaration */ .chroma .kd { color:#ff7b72 } +/* KeywordNamespace */ .chroma .kn { color:#ff7b72 } +/* KeywordPseudo */ .chroma .kp { color:#79c0ff } +/* KeywordReserved */ .chroma .kr { color:#ff7b72 } +/* KeywordType */ .chroma .kt { color:#ff7b72 } +/* NameClass */ .chroma .nc { color:#f0883e;font-weight:bold } +/* NameConstant */ .chroma .no { color:#79c0ff;font-weight:bold } +/* NameDecorator */ .chroma .nd { color:#d2a8ff;font-weight:bold } +/* NameEntity */ .chroma .ni { color:#ffa657 } +/* NameException */ .chroma .ne { color:#f0883e;font-weight:bold } +/* NameLabel */ .chroma .nl { color:#79c0ff;font-weight:bold } +/* NameNamespace */ .chroma .nn { color:#ff7b72 } +/* NameProperty */ .chroma .py { color:#79c0ff } +/* NameTag */ .chroma .nt { color:#7ee787 } +/* NameVariable */ .chroma .nv { color:#79c0ff } +/* NameVariableClass */ .chroma .vc { color:#79c0ff } +/* NameVariableGlobal */ .chroma .vg { color:#79c0ff } +/* NameVariableInstance */ .chroma .vi { color:#79c0ff } +/* NameVariableMagic */ .chroma .vm { color:#79c0ff } +/* NameFunction */ .chroma .nf { color:#d2a8ff;font-weight:bold } +/* NameFunctionMagic */ .chroma .fm { color:#d2a8ff;font-weight:bold } +/* Literal */ .chroma .l { color:#a5d6ff } +/* LiteralDate */ .chroma .ld { color:#79c0ff } +/* LiteralString */ .chroma .s { color:#a5d6ff } +/* LiteralStringAffix */ .chroma .sa { color:#79c0ff } +/* LiteralStringBacktick */ .chroma .sb { color:#a5d6ff } +/* LiteralStringChar */ .chroma .sc { color:#a5d6ff } +/* LiteralStringDelimiter */ .chroma .dl { color:#79c0ff } +/* LiteralStringDoc */ .chroma .sd { color:#a5d6ff } +/* LiteralStringDouble */ .chroma .s2 { color:#a5d6ff } +/* LiteralStringEscape */ .chroma .se { color:#79c0ff } +/* LiteralStringHeredoc */ .chroma .sh { color:#79c0ff } +/* LiteralStringInterpol */ .chroma .si { color:#a5d6ff } +/* LiteralStringOther */ .chroma .sx { color:#a5d6ff } +/* LiteralStringRegex */ .chroma .sr { color:#79c0ff } +/* LiteralStringSingle */ .chroma .s1 { color:#a5d6ff } +/* LiteralStringSymbol */ .chroma .ss { color:#a5d6ff } +/* LiteralNumber */ .chroma .m { color:#a5d6ff } +/* LiteralNumberBin */ .chroma .mb { color:#a5d6ff } +/* LiteralNumberFloat */ .chroma .mf { color:#a5d6ff } +/* LiteralNumberHex */ .chroma .mh { color:#a5d6ff } +/* LiteralNumberInteger */ .chroma .mi { color:#a5d6ff } +/* LiteralNumberIntegerLong */ .chroma .il { color:#a5d6ff } +/* LiteralNumberOct */ .chroma .mo { color:#a5d6ff } +/* Operator */ .chroma .o { color:#ff7b72;font-weight:bold } +/* OperatorWord */ .chroma .ow { color:#ff7b72;font-weight:bold } +/* Comment */ .chroma .c { color:#8b949e;font-style:italic } +/* CommentHashbang */ .chroma .ch { color:#8b949e;font-style:italic } +/* CommentMultiline */ .chroma .cm { color:#8b949e;font-style:italic } +/* CommentSingle */ .chroma .c1 { color:#8b949e;font-style:italic } +/* CommentSpecial */ .chroma .cs { color:#8b949e;font-weight:bold;font-style:italic } +/* CommentPreproc */ .chroma .cp { color:#8b949e;font-weight:bold;font-style:italic } +/* CommentPreprocFile */ .chroma .cpf { color:#8b949e;font-weight:bold;font-style:italic } +/* GenericDeleted */ .chroma .gd { color:#ffa198;background-color:#490202 } /* GenericEmph */ .chroma .ge { font-style:italic } -/* GenericError */ .chroma .gr { color:#c55858 } -/* GenericHeading */ .chroma .gh { color:#8464c6;font-weight:bold } -/* GenericInserted */ .chroma .gi { color:#54c59f } +/* GenericError */ .chroma .gr { color:#ffa198 } +/* GenericHeading */ .chroma .gh { color:#79c0ff;font-weight:bold } +/* GenericInserted */ .chroma .gi { color:#56d364;background-color:#0f5323 } +/* GenericOutput */ .chroma .go { color:#8b949e } +/* GenericPrompt */ .chroma .gp { color:#8b949e } /* GenericStrong */ .chroma .gs { font-weight:bold } -/* GenericSubheading */ .chroma .gu { color:#8464c6;font-weight:bold } -/* GenericTraceback */ .chroma .gt { color:#c55858 } +/* GenericSubheading */ .chroma .gu { color:#79c0ff } +/* GenericTraceback */ .chroma .gt { color:#ff7b72 } /* GenericUnderline */ .chroma .gl { text-decoration:underline } +/* TextWhitespace */ .chroma .w { color:#6e7681 } diff --git a/hugo/hugo.toml b/hugo/hugo.toml index a12988b7..652626e1 100644 --- a/hugo/hugo.toml +++ b/hugo/hugo.toml @@ -13,6 +13,9 @@ theme = 'hextra' [markup.goldmark.renderer] unsafe = true + [markup.goldmark.parser.attribute] + block = true + [module] [[module.mounts]] source = "../docs" @@ -24,8 +27,26 @@ theme = 'hextra' [params.theme] customCSS = ["css/custom.css"] + [params.page] + width = "wide" + [params.navbar] displayTitle = true [params.navbar.logo] path = "images/logo.png" link = "/" + + [params.search] + enable = true + + [params.sidebar] + # This stops the sidebar from "drilling down" into H2/H3 headers + levels = 1 + # Ensure these are also set to prevent auto-expansion + defaultOpen = false + autoCollapse = true + +[[menus.main]] + name = "Home" + pageRef = "/docs" + weight = 10 diff --git a/hugo/static/fonts/roboto-mono-v31-latin-500.woff2 b/hugo/static/fonts/roboto-mono-v31-latin-500.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5392e0374b26fa2d41434017a8ede63a9074ed67 GIT binary patch literal 12936 zcmV;3GIz~)Pew8T0RR9105XUG4gdfE09tqe05U890RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/hugo/static/fonts/roboto-v51-latin-regular.woff2 b/hugo/static/fonts/roboto-v51-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..77e42594c11eada587f9be4d0330699f4218e3b5 GIT binary patch literal 21884 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 - - - - - diff --git a/test/vs2022/etl.vcxproj.filters b/test/vs2022/etl.vcxproj.filters index cc10760c..777f4853 100644 --- a/test/vs2022/etl.vcxproj.filters +++ b/test/vs2022/etl.vcxproj.filters @@ -3967,27 +3967,12 @@ Resource Files\CI\Github - - Documentation - Documentation Documentation - - Documentation - - - Documentation - - - Documentation - - - Documentation -