HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
unicode_normalization.hpp
1// Copyright Take Vos 2022.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "unicode_decomposition_type.hpp"
8#include "../cast.hpp"
9#include "../algorithm.hpp"
10#include <cstdint>
11#include <string>
12#include <string_view>
13
14namespace hi::inline v1 {
15
16// Windows.h defines small as a macro.
17#ifdef small
18#undef small
19#endif
20
21// clang-format off
23 decompose_canonical = 1 << to_underlying(unicode_decomposition_type::canonical),
24 decompose_font = 1 << to_underlying(unicode_decomposition_type::font),
25 decompose_noBreak = 1 << to_underlying(unicode_decomposition_type::noBreak),
26 decompose_initial = 1 << to_underlying(unicode_decomposition_type::initial),
27 decompose_medial = 1 << to_underlying(unicode_decomposition_type::medial),
28 decompose_final = 1 << to_underlying(unicode_decomposition_type::_final),
29 decompose_isolated = 1 << to_underlying(unicode_decomposition_type::isolated),
30 decompose_circle = 1 << to_underlying(unicode_decomposition_type::circle),
31 decompose_super = 1 << to_underlying(unicode_decomposition_type::super),
32 decompose_sub = 1 << to_underlying(unicode_decomposition_type::sub),
33 decompose_fraction = 1 << to_underlying(unicode_decomposition_type::fraction),
34 decompose_vertical = 1 << to_underlying(unicode_decomposition_type::vertical),
35 decompose_wide = 1 << to_underlying(unicode_decomposition_type::wide),
36 decompose_narrow = 1 << to_underlying(unicode_decomposition_type::narrow),
37 decompose_small = 1 << to_underlying(unicode_decomposition_type::small),
38 decompose_square = 1 << to_underlying(unicode_decomposition_type::square),
39 decompose_compat = 1 << to_underlying(unicode_decomposition_type::compat),
40
45 decompose_control = 1 << 25,
46
49 compose_CRLF = 1 << 26,
50
56
62
68
74
80
83 NFD = decompose_canonical,
84
87 NFKD =
88 NFD | decompose_font | decompose_noBreak | decompose_initial | decompose_medial | decompose_final | decompose_isolated |
89 decompose_circle | decompose_super | decompose_sub | decompose_fraction | decompose_vertical | decompose_wide |
90 decompose_narrow | decompose_small | decompose_square | decompose_compat,
91};
92// clang-format on
93
94[[nodiscard]] constexpr unicode_normalization_mask decompose_newline_to(char32_t new_line_char) noexcept
95{
96 switch (new_line_char) {
97 case U'\n':
98 return unicode_normalization_mask::decompose_newline_to_LF;
99 case U'\r':
100 return unicode_normalization_mask::decompose_newline_to_CRLF;
101 case U'\u2029':
102 return unicode_normalization_mask::decompose_newline_to_PS;
103 case U' ':
104 return unicode_normalization_mask::decompose_newline_to_SP;
105 default:
107 }
108}
109
110[[nodiscard]] constexpr bool to_bool(unicode_normalization_mask const& rhs) noexcept
111{
112 return to_bool(to_underlying(rhs));
113}
114
115[[nodiscard]] constexpr unicode_normalization_mask
116operator|(unicode_normalization_mask const& lhs, unicode_normalization_mask const& rhs) noexcept
117{
118 return static_cast<unicode_normalization_mask>(to_underlying(lhs) | to_underlying(rhs));
119}
120
121[[nodiscard]] constexpr unicode_normalization_mask
122operator&(unicode_normalization_mask const& lhs, unicode_normalization_mask const& rhs) noexcept
123{
124 return static_cast<unicode_normalization_mask>(to_underlying(lhs) & to_underlying(rhs));
125}
126
127[[nodiscard]] constexpr unicode_normalization_mask
128operator&(unicode_normalization_mask const& lhs, unicode_decomposition_type const& rhs) noexcept
129{
130 return static_cast<unicode_normalization_mask>(to_underlying(lhs) & (1 << to_underlying(rhs)));
131}
132
141unicode_NFD(std::u32string_view text, unicode_normalization_mask normalization_mask = unicode_normalization_mask::NFD) noexcept;
142
150[[nodiscard]] std::u32string
151unicode_NFC(std::u32string_view text, unicode_normalization_mask normalization_mask = unicode_normalization_mask::NFD) noexcept;
152
160unicode_NFKD(std::u32string_view text, unicode_normalization_mask normalization_mask = unicode_normalization_mask::NFKD) noexcept;
161
169unicode_NFKC(std::u32string_view text, unicode_normalization_mask normalization_mask = unicode_normalization_mask::NFKD) noexcept;
170
171} // namespace hi::inline v1
#define hi_no_default()
This part of the code should not be reachable, unless a programming bug.
Definition assert.hpp:145
DOXYGEN BUG.
Definition algorithm.hpp:15
constexpr alignment operator|(horizontal_alignment lhs, vertical_alignment rhs) noexcept
Combine vertical and horizontal alignment.
Definition alignment.hpp:216
std::u32string unicode_NFD(std::u32string_view text, unicode_normalization_mask normalization_mask=unicode_normalization_mask::NFD) noexcept
Convert text to Unicode-NFD normal form.
std::u32string unicode_NFKD(std::u32string_view text, unicode_normalization_mask normalization_mask=unicode_normalization_mask::NFKD) noexcept
Convert text to Unicode-NFKD normal form.
std::u32string unicode_NFKC(std::u32string_view text, unicode_normalization_mask normalization_mask=unicode_normalization_mask::NFKD) noexcept
Convert text to Unicode-NFKC normal form.
std::u32string unicode_NFC(std::u32string_view text, unicode_normalization_mask normalization_mask=unicode_normalization_mask::NFD) noexcept
Convert text to Unicode-NFC normal form.
unicode_normalization_mask
Definition unicode_normalization.hpp:22
@ decompose_newline_to_SP
Decompose any newline character into SP (Space).
@ decompose_newline_to_LF
Decompose any newline character into LF (Line Feed).
@ decompose_newline_to_PS
Decompose any newline character into PS (Paragraph Separator).
@ decompose_newline
Mask for one of decompose_PS, decompose_LF or decompose_CRLF.
@ compose_CRLF
Compose CR+LF into a single LF.
@ decompose_control
During decomposition remove control characters.
@ NFKD
Compatible decomposition and composition.
@ NFD
Canonical decomposition and composition.
@ decompose_newline_to_CRLF
Decompose any newline character into CR+LF (Carriage Return + Line Feed).
A variant of text.
Definition label.hpp:36