nana/include/nana/unicode_bidi.hpp
2014-12-11 03:32:35 +08:00

76 lines
1.7 KiB
C++

#ifndef NANA_UNICODE_BIDI_HPP
#define NANA_UNICODE_BIDI_HPP
#include <vector>
namespace nana
{
class unicode_bidi
{
public:
typedef wchar_t char_type;
enum class directional_override_status
{
neutral, right_to_left, left_to_right
};
enum class bidi_char
{
L, LRE, LRO, R, AL, RLE, RLO,
PDF = 0x1000, EN, ES, ET, AN, CS, NSM, BN,
B = 0x2000, S, WS, ON
};
enum class bidi_category
{
strong, weak = 0x1000, neutral = 0x2000
};
const static char_type LRE = 0x202A;
const static char_type RLE = 0x202B;
const static char_type PDF = 0x202C;
const static char_type LRO = 0x202D;
const static char_type RLO = 0x202E;
const static char_type LRM = 0x200E;
const static char_type RLM = 0x200F;
struct remember
{
unsigned level;
directional_override_status directional_override;
};
struct entity
{
const wchar_t * begin, * end;
bidi_char bidi_char_type;
unsigned level;
};
void linestr(const char_type*, std::size_t len, std::vector<entity> & reordered);
private:
static unsigned _m_paragraph_level(const char_type * begin, const char_type * end);
void _m_push_entity(const char_type * begin, const char_type *end, unsigned level, bidi_char);
std::vector<entity>::iterator _m_search_first_character();
bidi_char _m_eor(std::vector<entity>::iterator);
void _m_resolve_weak_types();
void _m_resolve_neutral_types();
void _m_resolve_implicit_levels();
void _m_reordering_resolved_levels(const char_type*, std::vector<entity> & reordered);
static bidi_category _m_bidi_category(bidi_char);
static bidi_char _m_char_dir(char_type);
private:
void _m_output_levels() const;
void _m_output_bidi_char() const;
private:
std::vector<entity> levels_;
};
}
#endif