Typographic transforms (---, quote pairs, ~) no longer touch verbatim text: @c/@code/@source_listing content and ^'...'^ spans show exactly the characters written. "^" before any punctuation character quotes it in every target (the apostrophe excepted: ^' opens a literal span), with the new :resolve option on @@@target declaring per-target renderings. The ^UUUU^ code-point form accepts 4-6 hex digits, the full Unicode range. The html output and transform spellings are polyglot (XML-valid), in preparation for an EPUB target. New suites: transform_test, character_test (engine), typography_test (SKS). (from dev 07ce5ea86a0a)
110 lines
3.4 KiB
C++
110 lines
3.4 KiB
C++
#pragma once
|
|
|
|
// https://jakubmarian.com/special-characters-diacritics-used-in-european-languages/
|
|
|
|
#include <string>
|
|
#include <map>
|
|
#include <iomanip>
|
|
#include <tuple>
|
|
#include <vector>
|
|
#include <utility>
|
|
#include <regex>
|
|
#include <unistd.h>
|
|
|
|
// ^UUUU^ — a Unicode code point in hex, 4 to 6 digits (^263A^ is the BMP,
|
|
// ^13000^ EGYPTIAN HIEROGLYPH A001, ^10FFFD^ the top of the range), or a
|
|
// single digit. Lengths 2-3 are NOT accepted: two- and three-letter
|
|
// sequences of a-f collide with the ^s^-style mnemonic names.
|
|
const std::regex unicode_re(R"(\^(([0-9A-Fa-f]{4,6})|([0-9A-Fa-f]))\^)");
|
|
const std::regex unicode_hide_re(R"(=([0-9A-Fa-f]{2})=)");
|
|
const std::regex hex2_re(R"(([0-9A-Fa-f]{2}))");
|
|
const std::regex hex4_re(R"(([0-9A-Fa-f]{4}))");
|
|
const std::regex hex5_re(R"(([0-9A-Fa-f]{5}))");
|
|
|
|
// The hide_special_characters vector was removed. The ^X mechanism for
|
|
// Klammertext special characters is handled by the katomizer (type
|
|
// katom_t::special) and the general KTESC escape mechanism for
|
|
// target-specific characters.
|
|
|
|
inline
|
|
std::map<std::string, std::string> diacritic_example_letter {
|
|
{"'", "e"},
|
|
{"`", "a"},
|
|
{"h", "o"},
|
|
{"~", "n"},
|
|
{"\"", "u"},
|
|
{"c", "c"},
|
|
{"-", "o"},
|
|
{"b", "g"},
|
|
{"r", "a"},
|
|
{"d", "e"},
|
|
{"w", "s"},
|
|
{"a", "o"}};
|
|
|
|
inline
|
|
std::map<std::string, std::pair<std::string, std::string>> diacritics {
|
|
{"`", {"0300", "grave accent"}},
|
|
{"'", {"0301", "acute accent"}},
|
|
{"h", {"0302", "circumflex"}},
|
|
{"~", {"0303", "tilde"}},
|
|
{"-", {"0304", "macron"}},
|
|
{"\"", {"0308", "diaresis"}},
|
|
// {"v", {"0305", "vinculum"}},
|
|
{"b", {"0306", "breve"}},
|
|
{"d", {"0307", "dot above"}},
|
|
{"r", {"030A", "ring above"}},
|
|
{"w", {"030C", "wedge"}},
|
|
{"c", {"0327", "cedilla"}},
|
|
{"a", {"030B", "double acute accent"}}};
|
|
|
|
inline
|
|
std::vector<std::string> extended_latin_symbols = {
|
|
"s",
|
|
"i", "I", "t", "T", "e", "E", "o", "O", "d", "D",
|
|
"ae", "AE", "oe", "OE"
|
|
};
|
|
|
|
inline
|
|
std::map<std::string, std::pair<std::string, std::string>> extended_latin {
|
|
{"ae", {"00E6", "ae ligature"}},
|
|
{"AE", {"00C6", "ae ligature capital"}},
|
|
{"oe", {"0153", "oe ligature"}},
|
|
{"OE", {"0152", "oe ligature capital"}},
|
|
{"i", {"0131", "dotless i"}},
|
|
{"I", {"0130", "capital dotted i"}},
|
|
{"t", {"00FE", "thorn"}},
|
|
{"T", {"00DE", "thorn capital"}},
|
|
{"e", {"00F0", "eth"}},
|
|
{"E", {"00D0", "eth capital"}},
|
|
{"o", {"00F8", "o stroke"}},
|
|
{"O", {"00D8", "o stroke capital"}},
|
|
{"s", {"00DF", "Eszett"}},
|
|
{"d", {"0111", "d stroke"}},
|
|
{"D", {"0110", "d stroke capital"}}};
|
|
|
|
inline
|
|
std::map<std::string, std::pair<std::string, std::string>> pinyin_tones {
|
|
{"1", {"0304", "high"}},
|
|
{"2", {"0301", "rising"}},
|
|
{"3", {"030C", "falling-rising"}},
|
|
{"4", {"0300", "falling"}}};
|
|
|
|
|
|
inline
|
|
bool is_tty() { return isatty(fileno(stdout)); }
|
|
//const char* italic_on() { return tty() ? "\033[3m" : ""; }
|
|
//const char* italic_off() { return tty() ? "\033[0m" : ""; }
|
|
inline
|
|
const std::string italic_on() { return is_tty() ? "\033[3m" : ""; }
|
|
inline
|
|
const std::string italic_off() { return is_tty() ? "\033[0m" : ""; }
|
|
|
|
|
|
std::string encode(const std::string& s);
|
|
|
|
void diacritics_examples(const std::string& kt_filename = "");
|
|
void extended_latin_examples(const std::string& kt_filename = "");
|
|
void pinyin_examples(const std::string& kt_filename = "");
|
|
|
|
void show_special_characters();
|