Files
klammertext/mac/character.h
Andy Kopra 37b6ba1c4f Verbatim-safe typography, ^-punctuation quoting, full-range ^UUUU^, polyglot html
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)
2026-08-23 20:48:26 +02:00

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();