7#include "unicode_bidi_class.hpp"
8#include "unicode_description.hpp"
10namespace hi::inline
v1 {
13 enum class mode_type : uint8_t { LTR, RTL, auto_LTR, auto_RTL };
15 mode_type direction_mode = mode_type::auto_LTR;
16 bool enable_mirrored_brackets =
true;
17 bool enable_line_separator =
true;
18 bool move_lf_and_ps_to_end_of_line =
false;
54 description(description),
55 code_point(code_point),
67 code_point(U
'\ufffd'),
68 direction(bidi_class),
69 bidi_class(bidi_class),
77using unicode_bidi_char_info_iterator = unicode_bidi_char_info_vector::iterator;
78using unicode_bidi_char_info_const_iterator = unicode_bidi_char_info_vector::const_iterator;
85 template<
typename... Args>
86 void emplace_character(Args &&...args)
noexcept
92template<
typename OutputIt,
typename SetCodePo
int,
typename SetTextDirection>
93static void unicode_bidi_L4(
94 unicode_bidi_char_info_iterator first,
95 unicode_bidi_char_info_iterator last,
97 SetCodePoint set_code_point,
98 SetTextDirection set_text_direction)
noexcept
100 for (
auto it = first; it != last; ++it, ++output_it) {
101 hilet text_direction = it->embedding_level % 2 == 0 ? unicode_bidi_class::L : unicode_bidi_class::R;
102 set_text_direction(*output_it, text_direction);
103 if (it->direction == unicode_bidi_class::R && it->description->bidi_bracket_type() != unicode_bidi_bracket_type::n) {
104 set_code_point(*output_it, it->description->bidi_mirroring_glyph());
110 unicode_bidi_char_info_iterator first,
111 unicode_bidi_char_info_iterator last,
112 unicode_bidi_context
const &context = {})
noexcept;
139template<
typename It,
typename GetDescription,
typename SetCodePo
int,
typename SetTextDirection>
143 GetDescription get_description,
144 SetCodePoint set_code_point,
145 SetTextDirection set_text_direction,
148 auto proxy = detail::unicode_bidi_char_info_vector{};
152 for (
auto it = first; it != last; ++it) {
153 hilet[code_point, description_ptr] = get_description(*it);
154 proxy.emplace_back(index++, code_point, description_ptr);
157 auto [proxy_last, paragraph_directions] = detail::unicode_bidi_P1(
begin(proxy),
end(proxy), context);
162 detail::unicode_bidi_L4(
166 std::forward<SetCodePoint>(set_code_point),
167 std::forward<SetTextDirection>(set_text_direction));
168 return {last,
std::move(paragraph_directions)};
181template<
typename It,
typename EndIt,
typename DescriptionFunc>
185 return is_control(description_func(item).bidi_class());
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
DOXYGEN BUG.
Definition algorithm.hpp:15
auto shuffle_by_index(auto first, auto last, auto indices_first, auto indices_last, auto index_op) noexcept
Shuffle a container based on a list of indices.
Definition algorithm.hpp:260
unicode_bidi_class
Bidirectional class Unicode Standard Annex #9: https://unicode.org/reports/tr9/.
Definition unicode_bidi_class.hpp:17
It unicode_bidi_control_filter(It first, EndIt last, DescriptionFunc const &description_func)
Removes control characters which will not survive the bidi-algorithm.
Definition unicode_bidi.hpp:182
std::pair< It, std::vector< unicode_bidi_class > > unicode_bidi(It first, It last, GetDescription get_description, SetCodePoint set_code_point, SetTextDirection set_text_direction, unicode_bidi_context const &context={})
Reorder a given range of characters based on the unicode_bidi algorithm.
Definition unicode_bidi.hpp:140
Definition unicode_bidi.hpp:12
Definition unicode_bidi.hpp:23
unicode_bidi_class direction
Current computed direction of the code-point.
Definition unicode_bidi.hpp:45
unicode_description const * description
Description of the code-point.
Definition unicode_bidi.hpp:30
int8_t embedding_level
The embedding level.
Definition unicode_bidi.hpp:40
unicode_bidi_class bidi_class
The original bidi class of the code-point.
Definition unicode_bidi.hpp:50
std::size_t index
Index from the first character in the original list.
Definition unicode_bidi.hpp:26
char32_t code_point
The current code point.
Definition unicode_bidi.hpp:35
unicode_bidi_char_info(std::size_t index, unicode_bidi_class bidi_class) noexcept
Constructor for testing to bypass normal initialization.
Definition unicode_bidi.hpp:65
Definition unicode_bidi.hpp:80
Description of a unicode code point.
Definition unicode_description.hpp:33
constexpr unicode_bidi_class bidi_class() const noexcept
The bidi class of this code-point This function is used by the bidirectional algorithm to figure out ...
Definition unicode_description.hpp:135
T emplace_back(T... args)