Skip to content

feat(utf8): internal_encoding flag + route format_text (A1, #3681) - #3683

Merged
kvirund merged 1 commit into
kvirund/utf8-migration-plan-16b188from
kvirund/utf8-a1-native-text
Aug 3, 2026
Merged

feat(utf8): internal_encoding flag + route format_text (A1, #3681)#3683
kvirund merged 1 commit into
kvirund/utf8-migration-plan-16b188from
kvirund/utf8-a1-native-text

Conversation

@kvirund

@kvirund kvirund commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

Черновик намеренно — не мёрджить, пока не отревьюено. Стекнут поверх #3682 (A0); база PR — ветка A0, так что в diff только A1.

Трек A1 «Плана Наполеон» (#3681): вводим переключатель кодировки и слой-диспетчер, прогоняем через него переформатер текста. Поведение на дефолтной KOI8-R-сборке не меняется (char_count == flow-start, capitalize_first == UPPER(*pos), truncate_offset == maxlen) — это no-op-рефактор, который «оживёт» только при флипе кодировки.

Что внутри

  • meson_options.txt / meson.build — опция internal_encoding (koi8r по умолчанию / utf8); значение utf8 определяет -DINTERNAL_ENCODING_UTF8.
  • src/utils/native_text.{h,cpp} — операции в нативной рантайм-кодировке: char_count, capitalize_first, truncate_offset. Две ветки за макросом: KOI8-R — байт-в-байт как раньше; UTF-8 — через utf8::. Плюс native_is_utf8(), чтобы тесты/вызывающий код могли ветвиться по флагу, с которым собрана библиотека.
  • src/utils/utils.cppformat_text(): счёт ширины строки, заглавная первая буква слова и обрезка по maxlen больше не предполагают «1 байт = 1 символ».
  • tests/native_text.cpp — адаптивный GTest-набор (ветвится по native_is_utf8()), поэтому один файл корректен и под KOI8-R, и под UTF-8 сборку.

Проверка

  • UTF-8-ветку native_text + утилиты прогнал автономно с -DINTERNAL_ENCODING_UTF8 — 5/5 зелёные, чисто под -Wall -Wextra.
  • KOI8-R-ветку (дефолт) прогонит CI дефолтной сборкой (там native_is_utf8()==false).

Патч-бамп VERSION.txt0.1.28.

#3681)

Track A1 of the KOI8-R -> UTF-8 migration. Introduces the build-time
`internal_encoding` switch and a native-encoding dispatch layer, then routes the
text reformatter through it. No behaviour change on the default KOI8-R build
(char_count == byte count, capitalize_first == UPPER of the first byte,
truncate_offset == maxlen); the utf8 build gets code-point semantics.

- meson_options.txt / meson.build: internal_encoding=koi8r|utf8, the utf8 value
  defines INTERNAL_ENCODING_UTF8.
- src/utils/native_text.{h,cpp}: char_count / capitalize_first / truncate_offset
  with a byte-identical KOI8-R branch and a utf8:: branch, plus native_is_utf8().
- src/utils/utils.cpp: format_text() width accounting, first-letter capitalisation
  and maxlen truncation no longer assume 1 byte == 1 character.
- tests/native_text.cpp: adaptive GTest suite branching on native_is_utf8().
@kvirund
kvirund merged commit 3ec73ba into kvirund/utf8-migration-plan-16b188 Aug 3, 2026
4 checks passed
@kvirund
kvirund deleted the kvirund/utf8-a1-native-text branch August 3, 2026 01:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant