Открытый код: текст, рендер, язык (Lingo), шрифты, Qt, формулы — исследование для MOffice
Статус: готов к обсуждению, 2026-10-04. Область: шейпинг и шрифты, Unicode, раскладка абзаца, переносы, diff, рендер, цвет, экспорт PDF, правописание и грамматика, словари и тезаурусы, шрифты в комплекте, Qt 6 и мост Rust↔︎Qt, лента и докинг, MOffice Math. Классы лицензий — по
docs/12-license-policy.md.
1. Выводы (топ-10 с экономией в чел.-мес.)
Источники: oss-verified.tsv (области text, render,
lingo, fonts, qt, math, shell), клоны в
…/scratchpad/oss-src/, веб-проверки (≈ 40 запросов) —
помечены «(проверено 2026-10-04)». Экономия — оценка против написания
своими силами; дорожная карта (08-roadmap.md) не даёт
оценок по эпикам, поэтому суммы указаны как «сколько не придётся писать»
внутри эпиков E0.3, E1.2, E1.3, E1.7, E4.4, E4.x Math и E1.5 Shell.
| # | Вывод | Стратегия | Экономия, чел.-мес. |
|---|---|---|---|
| 1 | Экспорт PDF — krilla + pdf-writer
+ subsetter (MIT/Apache, класс 1):
PDF/A-1a/1b/2a/2b/2u/3a/3b/3u/4/4f/4e и PDF/UA-1 с проверками, теги
(H1–H6, L/LI, Table/TH с заголовками, Figure/Formula с Alt),
подмножества TTF/CFF, цветные и вариативные шрифты, вложения AF,
CMYK/ICC. Нет шифрования и подписей — это свой слой (см. 3.4) |
adopt | 8–10 |
| 2 | rustybuzz заархивирован (README клона:
проект «unmaintained, and archived», рекомендован переход на HarfRust).
Шейпинг — harfrust (MIT, соответствует
HarfBuzz 14.3.1), шрифты —
skrifa/read-fonts (Google
Fonts, они же в Chrome), системные шрифты и резерв —
fontique; строка библии «HarfBuzz
(rustybuzz)» устарела |
adopt | ≥ 30 против своего шейпера; 1–2 на миграции позже |
| 3 | Раскладка формул — порт
typst-layout/src/math/* (Apache-2.0, ≈ 3,9 тыс.
строк + IR 3,3 тыс.): дроби, радикалы, индексы, акценты, растяжимые
скобки по таблице OpenType MATH. ReX — без файлов лицензии и мёртв с
2020 → только reference |
port | 6–8 |
| 4 | Озвучивание формул — MathCAT (MIT,
Rust, 15 языков речи включая русский, шрифт Брайля,
навигация по дереву) закрывает P1 Math «MathSpeak/ClearSpeak, ru» и
PDF/UA /Alt |
adopt | 8–12 |
| 5 | Правописание: своего движка не избежать. Hunspell
(MPL/GPL/LGPL), spellbook (MPL-2.0), nuspell (LGPL-3),
hunspell-rs (линкует C-Hunspell) — класс 2. Пишем
meridian-spell по формату .aff/.dic (стоимость
7,5–9,5 чел.-мес.); ru_RU использует только
SFX/TRY/SET, поэтому первая
версия для ru/en/uk/be дешёвая (3–4). Альтернатива по решению владельца
— spellbook как есть (экономия ≈ 6) |
own (★) | −7,5…−9,5 (затраты) / +6 при решении |
| 6 | Словари класса 1 в установщик: ru_RU (Lebedev, BSD-подобная), en_US/en_GB/en_CA/en_AU (SCOWL, брать из первоисточника, а не из пакета LibreOffice), pl (SJP.PL — Apache-2.0/CC BY 4.0 на выбор), nl (OpenTaal — BSD-3), tr (MIT); тезаурус en — Open English WordNet (CC-BY 4.0). Список «20 словарей в комплекте» из E1.7 политике не соответствует: de/it/cs — GPL, fr/uk/es/pt/da/el/kk/sv — MPL/LGPL | adopt (данные) | > 100 (лексикография) |
| 7 | Переносы — форк hypher (MIT/Apache,
конечные автоматы, 0 мкс загрузки, ru 33 КиБ) вместо застывшего
hyphenation (2021); шаблоны: ru — LPPL-1.2+, en-us — FSFAP,
en-gb/de/fr/be/pl/nl — MIT, uk — MIT/LPPL, kk — Public Domain (новый,
2025), cs — GPL (исключить) |
fork | 1–2 |
| 8 | Кнут–Пласс — порт
typst-layout/src/inline/linebreak.rs (1 070 строк:
оптимальный перенос с оценочной границей и штрафами за переносы); основа
«качественного выравнивания» Write, при этом совместимый с Word режим —
жадный |
port | 1–1,5 |
| 9 | Грамматика английского — harper-core
(Apache-2.0, миллисекунды, WASM); LanguageTool и nlprule
(данные — LGPL-2.1 из LanguageTool 5.2) — класс 2; для русского — свой
движок правил |
adopt + own | 6–8 |
| 10 | Qt 6.8: список GPL-only модулей подтверждён
(Charts, CoAP, Data Visualization, Graphs, GRPC, HTTP Server, Lottie,
MQTT, Network Authorization, Qml
Compiler, Quick 3D (+Physics), Quick Timeline, Virtual
Keyboard, Wayland Compositor) — всем есть замены; «Qt for Small
Business» (546 €/год за место) нам недоступна (≤ 3 места,
выручка+инвестиции ≤ 1 млн €); cxx-qt — adopt; SARibbon —
только на Qt Widgets → перенос алгоритмов в QML-ленту; докинг —
свой |
adopt / port / own | 3–4 (cxx-qt) + 1,5–2 (лента) |
Дополнительно: для Aptos найден открытый метрический клон Intos (OFL-1.1, без RFN, 2026) — кандидат вместо заказа клона (нужна юридическая проверка: в нём кернинг Aptos); Latin Modern Math распространяется под GUST Font License (на базе LPPL), а не OFL — политику шрифтов надо дополнить.
2. Таблицы по подобластям
Обозначения: ★ — звёзды GitHub; «загр.» — загрузки crates.io; дата —
последний коммит (push) или выпуск; класс — по
12-license-policy.md. Данные из
oss-verified.tsv, если не помечено «(проверено
2026-10-04)».
2.1 Шейпинг и шрифты
| Кандидат | Лицензия (класс) | Активность | Яз. | Что даёт MOffice | Стратегия | Остаётся писать / риски | Экон. |
|---|---|---|---|---|---|---|---|
| harfrust | MIT (1) | ★308; 0.13.3, 10,5 млн загр.; 2026-10-03 (проверено 2026-10-04) | Rust | шейпинг всех письменностей: text-layout, Math, PDF
(krilla уже на нём) |
adopt | нет graphite; на битом шрифте ошибка, а не запасной шейпер — нужен свой путь «пропустить шрифт»; до 25 % медленнее HarfBuzz | ≥ 30 |
| rustybuzz | MIT (1) | ★667; 0.20.1, 32,7 млн; архив (README клона) | Rust | — | avoid | typst ещё на нём; при порте кода typst заменить вызовы на harfrust | — |
| HarfBuzz | Old MIT (1) | ★6110; 2026-10-02 | C++ | эталон; уже внутри Qt (текст интерфейса) | reference | его тест-набор шейпинга — в CI против harfrust | — |
| fontations: skrifa / read-fonts | MIT OR Apache-2.0 (1) | ★833; skrifa 0.48.0, 31 млн; 2026-10-03 | Rust | разбор шрифтов, метрики, контуры, хинтинг, вариативные оси, таблица MATH | adopt | версии 0.x меняют API — закреплять; заменяет
ttf-parser |
≥ 12 |
| ttf-parser | MIT OR Apache-2.0 (1) | ★793; 0.25.1, 113 млн; 2026-08-06 | Rust | — (дублирует read-fonts) | avoid в новом коде | в typst math используется ttf_parser::math — при порте
заменить |
— |
| fontique | Apache-2.0 OR MIT (1) | 0.11.1, 3,6 млн; 2026-08-16 (проверено 2026-10-04) | Rust | перечисление системных шрифтов и резервирование через DirectWrite / CoreText / fontconfig | adopt (сравнить с fontdb в спайке E0.2) | таблица метрических замен (Arial→Liberation Sans, Calibri→Carlito…) — своя | 2–3 |
| fontdb | MIT (1) | ★180; 0.24.0, 36 млн; 2026-07-29 | Rust | база шрифтов из файлов: комплект, встроенные в docx/pptx | adopt | без системного резервирования | 1 |
| swash | Apache-2.0 OR MIT (1) | ★875; 0.2.10, 14 млн; 2026-07-17 | Rust | растеризация глифов на CPU (WASM, тесты) | reference | на экране и в печати растеризует Skia | — |
| font-kit | MIT OR Apache-2.0 (1) | ★842; 0.14.3 (2025-05) | Rust | — | avoid | заменяется fontique | — |
2.2 Unicode: BiDi, разрывы, сегментация, нормализация
| Кандидат | Лицензия (класс) | Активность | Яз. | Что даёт MOffice | Стратегия | Остаётся / риски | Экон. |
|---|---|---|---|---|---|---|---|
ICU4X:
icu_segmenter, icu_collator,
icu_properties, icu_normalizer |
Unicode-3.0 (1) | ★1867; icu 2.3.1; segmenter 18,7 млн загр.; 2026-10-02 | Rust | разрывы строк UAX #14 (с LSTM/словарями для тайского, лаосского, кхмерского, бирманского и CJ), слова/предложения/графемы UAX #29, сортировка Sheets/Base, числа, даты, регистр | adopt | данные CLDR тоже Unicode-3.0; собирать только нужные локали
(icu4x-datagen); typst и parley уже на нём |
≥ 12 |
| unicode-bidi | MIT OR Apache-2.0 (1) | ★87; 0.3.18, 522 млн; 2026-09-15 | Rust | BiDi UAX #9: арабский/иврит в Write, Slides, ячейках | adopt | альтернатива — parley_engine/src/bidi.rs на свойствах
ICU |
2 |
| unicode-linebreak | Apache-2.0 (1) | ★41; 0.1.5; 2023-07-25 | Rust | — | avoid | застыл на старой версии Unicode; заменить на
icu_segmenter (правка библии, раздел 7) |
— |
| unicode-segmentation | MIT OR Apache-2.0 (1) | ★678; 1.13.3, 584 млн; 2026-09-17 | Rust | быстрые графемы/слова без данных ICU: курсор, счётчик слов | adopt | — | 0,5 |
| unicode-normalization | MIT OR Apache-2.0 (1) | ★201; 0.1.25, 596 млн; 2026-09-18 | Rust | NFC/NFD для поиска, словарей и переносов | adopt | — | 0,5 |
| regex, fancy-regex, aho-corasick | MIT/Apache (1); aho-corasick Unlicense OR MIT (0) | 1,2 млрд загр.; 2026-08 | Rust | «Найти и заменить» с подстановочными знаками, автозамена, поиск по нескольким словам | adopt | перевод подстановочных знаков Word в regex — свой | 1 |
2.3 Раскладка абзаца, переносы, сравнение, rope
| Кандидат | Лицензия (класс) | Активность | Яз. | Что даёт MOffice | Стратегия | Остаётся / риски | Экон. |
|---|---|---|---|---|---|---|---|
| parley | Apache-2.0 OR MIT (1) | ★744; 0.11.1, 3,5 млн; 2026-09-28 | Rust | итемизация, BiDi, резерв шрифтов, жадный перенос, выравнивание по
пробелам, встроенные блоки, PlainEditor |
reference + port фрагментов
(parley_engine/src/{analysis,itemize,bidi}.rs) |
нет словарных переносов и Кнута–Пласса, нет интервалов «точно/минимум/множитель» Word, табуляций, обтекания, сносок, вертикального текста | 2–3 |
| cosmic-text | MIT OR Apache-2.0 (1) | ★2154; 0.19.0, 9,6 млн; 2026-08-08 | Rust | многострочный текст для простых полей | reference | рассчитан на UI и терминалы, для документов не годится | — |
typst
inline/linebreak.rs |
Apache-2.0 (1) | ★56 366; 0.15.1; 2026-10-01 | Rust | Кнут–Пласс с приближённой оценкой и отсечением, штрафы за переносы у края слова и два дефиса подряд | port (раздел 3.3) | код завязан на Engine/Preparation typst —
переносим алгоритм, а не модуль |
1–1,5 |
| bramstein/typeset | BSD-2-Clause (1) | ★1034; 2026-06-20 | JS | классическая модель box/glue/penalty | reference | — | — |
| hypher | код MIT OR Apache-2.0 (1); шаблоны — по языкам | ★142; 0.1.8, 3,3 млн; 2026-09-17 (проверено 2026-10-04) | Rust | переносы 48 языков; автоматы встраиваются при сборке; ru — 33 КиБ | fork → meridian-hyph |
добавить en-gb (MIT) и kk (PD), пользовательские исключения; не
включать hu (MPL) и проверить hyph-cs-sojka.tex |
1–2 |
| hyphenation | Apache-2.0/MIT (1) | ★58; 0.8.4 (2021), репо 2024-01-24 | Rust | — | avoid | в patterns/*.pat.txt заголовки лицензий вырезаны
(README отсылает к hyph-utf8) — атрибуцию пришлось бы восстанавливать;
вдвое медленнее hypher |
— |
| tex-hyphen (hyph-utf8) | по языкам: MIT, LPPL, FSFAP, PD, BSD-3, GPL | ★67; 2026-02-24 | TeX | первоисточник шаблонов (раздел 3.2) | adopt (данные) | — | — |
| similar | Apache-2.0 (1) | ★1329; 3.2.0, 210 млн; 2026-09-16 | Rust | «Рецензирование → Сравнить»: абзацы, затем слова (Myers/Patience) | adopt | перемещения фрагментов (как в Word) — своё | 1 |
| imara-diff | Apache-2.0 (1) | ★225; 0.2.0, 34 млн; 2026-06-21 | Rust | быстрый diff больших документов и версий | adopt | — | 0,5 |
| diffy | MIT OR Apache-2.0 (1) | 0.5.2, 16,7 млн; 2026-08-31 | Rust | трёхстороннее слияние для «Объединить исправления» | adopt | — | 0,5 |
| ropey / crop | MIT (1) | ★1670 / ★320; 2026-09 | Rust | rope для редактора скриптов и плоского текста (модель Write — своя piece table) | adopt (Script) | — | 0,5 |
2.4 Рендер и геометрия
| Кандидат | Лицензия (класс) | Активность | Яз. | Что даёт MOffice | Стратегия | Остаётся / риски | Экон. |
|---|---|---|---|---|---|---|---|
| Skia + skia-safe | BSD-3-Clause + MIT (1) | ★10 956 / ★1816; skia-safe 0.153.3, 4,2 млн; 2026-09-30 | C++ / Rust | холст всех приложений, GPU-бэкенды, печать, PathOps (булевы операции над кривыми для «Объединить фигуры») | adopt | в third_party Skia: FreeType (двойная FTL/GPL-2 —
выбрать FTL и указать в NOTICE), libpng, zlib, libjpeg-turbo, libwebp,
expat; функцию textlayout не включать (шейпинг наш);
предсобранные бинарники rust-skia закрепить по хэшу или собирать
сами |
≥ 24 |
| tiny-skia | BSD-3-Clause (1) | ★1647; 0.12.0, 52 млн; 2026-08-20 | Rust | CPU-рендер миниатюр, снимочных тестов, веб-просмотрщика без Skia | adopt (вспом.) | — | 1 |
| vello | Apache-2.0 OR MIT (1) | ★4379; 0.11.0; 2026-10-02 | Rust | экспериментальный GPU-бэкенд (по библии) | reference / spike | API нестабилен | — |
| kurbo | Apache-2.0 OR MIT (1) | ★1010; 0.13.1, 49 млн; 2026-09-24 | Rust | геометрия Безье для scene: длины, пересечения, смещение
контура, упрощение |
adopt | — | 2 |
| lyon | MIT OR Apache-2.0 (1) | ★2602; 1.0.19; 2026-09-22 | Rust | тесселяция путей (нужна только при своём GPU-рендере) | reference | при Skia не нужна | — |
| i_overlay | MIT OR Apache-2.0 (1) | ★211; 9.0.0, 9,1 млн; 2026-09-24 | Rust | булевы операции над многоугольниками: контур обтекания «по контуру», области | adopt | кривые не сохраняет — для фигур Draw брать Skia PathOps | 1 |
| resvg / usvg | Apache-2.0 OR MIT (1) | ★4107; 0.48.1, 28 млн; 2026-10-03 | Rust | импорт SVG (значки, рисунки) в список отображения;
krilla-svg — SVG в PDF векторно |
adopt | — | 3 |
2.5 Управление цветом
| Кандидат | Лицензия (класс) | Активность | Яз. | Что даёт MOffice | Стратегия | Остаётся / риски | Экон. |
|---|---|---|---|---|---|---|---|
| Little-CMS 2 + rust-lcms2 | MIT (1) | ★748 / ★52; lcms2 6.2.0, 7,1 млн; 2026-09-29 | C / Rust | meridian-color: ICC v2/v4, CMYK, намерения рендеринга,
компенсация точки чёрного, цветопроба — Paint, PDF, печать, PDF/X |
adopt | C-код разбирает профили из чужих документов → фаззинг и песочный процесс | 4–6 |
| palette | MIT OR Apache-2.0 (1) | ★838; 0.7.7, 24,7 млн; 2026-09-05 | Rust | OKLab/LCh для тем MDS, градиентов, палитр Chart | adopt | — | 0,5 |
2.6 Экспорт PDF
| Кандидат | Лицензия (класс) | Активность | Яз. | Что даёт MOffice | Стратегия | Остаётся / риски | Экон. |
|---|---|---|---|---|---|---|---|
| krilla | MIT OR Apache-2.0 (1) | ★445; 0.8.2, 2,4 млн; 2026-10-02 | Rust | meridian-pdf-write: экспорт из списка отображения
Write/Sheets/Slides/Draw/Paint/Base; PDF/A, PDF/UA-1, теги, подмножества
шрифтов |
adopt | нет шифрования, подписей, PDF/X, линеаризации (README: «out-of-scope») — свой слой (3.4) | 8–10 |
| pdf-writer | MIT OR Apache-2.0 (1) | ★741; 0.15.0, 4,8 млн; 2026-08-17 | Rust | низкоуровневая запись объектов для своих расширений: словарь
/Encrypt, поля форм, PDF/X |
adopt | — | 2 |
| subsetter | MIT OR Apache-2.0 (1) | ★56; 0.2.6, 6,5 млн; 2026-07-23 | Rust | подмножества TrueType/CFF/CFF2 (через krilla) | adopt | — | 2 |
| typst-pdf | Apache-2.0 (1) | в составе typst | Rust | образец сборки дерева тегов: tags/tree/build.rs,
таблицы с заголовками tags/context/table.rs, группы
tags/groups.rs (≈ 8,8 тыс. строк всего) |
port фрагментов | завязано на модель typst | 1 |
2.7 Правописание, грамматика, тезаурус
| Кандидат | Лицензия (класс) | Активность | Яз. | Что даёт MOffice | Стратегия | Остаётся / риски | Экон. |
|---|---|---|---|---|---|---|---|
| Hunspell | MPL-1.1 / GPL-2 / LGPL-2.1 (2) | ★2595; 2026-09-27 | C++ | эталон формата .aff/.dic; тест-набор (≈ 460 файлов,
копия в spellbook/tests/legacy) |
reference; тесты — вне продукта | — | — |
| spellbook | MPL-2.0 (2) | ★147; 0.4.2, 159 тыс.; 2026-07-11 | Rust | проверка и подсказки «как Nuspell», no_std, ≈ 11 тыс.
строк |
reference; adopt — только решением владельца | alpha; нет морфологии и PHONE; принимает только UTF-8 | (6) |
| nuspell | LGPL-3.0 (2) | ★274; 2026-09-11 | C++ | алгоритмы проверки и подсказок | reference | — | — |
| zspell | Apache-2.0 по файлу LICENSE (1); в TSV ошибочно «GPL-3.0» (проверено 2026-10-04) | ★63; 0.5.5; 2024-09-03 | Rust | разбор .aff/.dic, проверка, морфология, стемминг |
reference; выборочный port разбора | нет компаундов, подсказки не готовы; раскрывает все словоформы в память (для ru — сотни МБ) | 1 |
| hunspell-rs | Apache-2.0 обёртка, но линкует C-Hunspell (2) | 0.4.0 (2022) | Rust | — | avoid (убрать из библии) | — | — |
| harper-core | Apache-2.0 (1) | ★16 093; 2.11.0, 119 тыс.; 2026-10-01 | Rust | грамматика и стиль английского, миллисекунды на документ, WASM | adopt (P1) | только английский (README, проверено 2026-10-04); происхождение встроенного словаря не проверено | 6–8 |
| LanguageTool | LGPL-2.1 (2); правила — тоже LGPL | ★15 097; 2026-10-01 | Java | грамматика 30+ языков | только отдельный сервер по решению владельца | Java-рантайм; набор n-грамм ≈ 16 ГБ | — |
| nlprule | код MIT/Apache; бинарные правила LGPL-2.1 из LT 5.2 (2) (проверено 2026-10-04) | ★674; 0.6.4 (2021) | Rust | en/de по правилам LanguageTool | avoid | заброшен; данные класса 2 | — |
| SymSpell / symspell | MIT (1) | ★3473 / ★145; 2026 | C# / Rust | быстрые подсказки по частотному словарю (дополнение к правилам
.aff) |
reference / adopt | — | 0,5 |
| Vale | MIT (1) | ★6170 | Go | стилевые правила (канцелярит, длина предложений) — идеи формата | reference | — | — |
| Open English WordNet | CC-BY-4.0 + WordNet License (1) (проверено 2026-10-04) | ★892; 2026-09-03 | данные | тезаурус en (современнее WordNet 2.1 в пакете LibreOffice) | adopt | конвертация в свой формат | 2 |
2.8 Шрифты в комплекте (подробно — 3.7)
| Шрифт | Метрически заменяет | Лицензия, RFN | Источник | Решение |
|---|---|---|---|---|
| Liberation Sans/Serif/Mono 2.x | Arial, Times New Roman, Courier New | OFL-1.1; RFN «Liberation» и «Arimo, Tinos, Cousine» (проверено 2026-10-04) | ★574; посл. коммит 2022-12 | adopt |
| Carlito | Calibri | OFL-1.1; RFN «Carlito» (проверено) | google/fonts ofl/carlito |
adopt |
| Caladea | Cambria | OFL-1.1; без RFN (проверено) | ★20; 2020-02 | adopt |
| Gelasio | Georgia | OFL-1.1; без RFN (проверено) | google/fonts ofl/gelasio |
adopt |
| Selawik | Segoe UI (приблизительно) | OFL-1.1; RFN «Selawik», товарный знак Microsoft (проверено) | ★207; 2023-06 | только резерв (3.7) |
| Intos | Aptos (заявлено 0 % расхождения ширин) | OFL-1.1; без RFN (проверено 2026-10-04) | github.com/muglug/intos | кандидат после юр. проверки |
| PT Sans / PT Serif | — (русские шаблоны) | OFL-1.1; RFN «PT Sans», «PT Serif», «ParaType» (проверено) | google/fonts | adopt |
| Noto (все письменности, Noto Sans Math) | — | OFL-1.1; без RFN (проверено по ofl/notosans,
ofl/notosansmath) |
notofonts | adopt (по письменностям, по загрузке) |
| Inter | Segoe UI в интерфейсе | OFL-1.1; без RFN (проверено) | ★19 920 | adopt |
| JetBrains Mono | Consolas | OFL-1.1; без RFN (проверено) | ★13 048 | adopt |
| STIX Two Text / Math | Cambria Math | OFL-1.1; RFN «TM Math»; «STIX Fonts™» — товарный знак IEEE (проверено) | ★986; 2.12 | adopt |
| Latin Modern Math | — | GUST Font License (GFL, на базе LPPL-1.3c), не OFL (CTAN, проверено 2026-10-04) | CTAN lm-math 1.959 (2014) | решение владельца (раздел 4) |
2.9 Qt 6, мост Rust↔︎Qt, лента, докинг
| Кандидат | Лицензия (класс) | Активность | Яз. | Что даёт MOffice | Стратегия | Остаётся / риски | Экон. |
|---|---|---|---|---|---|---|---|
| cxx-qt | MIT OR Apache-2.0 (1) | ★1547; 0.10.0, 109 тыс.; 2026-09-29 | Rust | мост Rust↔︎Qt: QObject из Rust, свойства, сигналы,
#[qml_element], потоки |
adopt | версии 0.x; стоимость вызовов замерить в E0.2 | 3–4 |
| qmetaobject-rs | MIT (1) | ★735; 0.2.10 (2023) | Rust | — | avoid | развитие остановилось | — |
Qt 6.8 LTS (qtbase и др.) |
LGPL-3.0 / GPL / коммерческая (2 / 4) | — | C++ | оболочка | решение владельца (3.6) | GPL-only модули не подключать | — |
| SARibbon | MIT (1) | ★1447; 2026-09-30; CI на Qt 6.8 LTS | C++ | лента: раскладка групп и кнопок, прокрутка вкладки, «свободный» и «компактный» стили, галереи, контекстные вкладки, настройка ленты | port алгоритмов в QML (3.6) | только Qt Widgets (QWidget) — в QML-оболочку не
встраивается |
1,5–2 |
| Qt-Advanced-Docking-System | LGPL-2.1 (2) | ★2525; 2026-09-10 | C++ | идеи: перспективы, автоскрытие, плавающие контейнеры | reference | Widgets и LGPL | — |
| KDDockWidgets | GPL-2.0 / GPL-3.0 или коммерческая KDAB (3 / 4) (проверено 2026-10-04) | — | C++ | докинг с поддержкой QtQuick/QML | avoid; покупка — по решению владельца | — | — |
| FluentUI (QML) | MIT (1) | ★4601; 2026-04-07 | C++/QML | образцы QML-контролов (оконная рамка, навигация) | reference | — | 0,5 |
| Slint | GPL-3.0 / Royalty-free 2.0 / коммерческая (2–3) | ★24 000 | Rust | — | avoid | не наш стек | — |
2.10 Формулы (MOffice Math)
| Кандидат | Лицензия (класс) | Активность | Яз. | Что даёт MOffice | Стратегия | Остаётся / риски | Экон. |
|---|---|---|---|---|---|---|---|
| typst math | Apache-2.0 (1) | ★56 366; 2026-09-30 | Rust | раскладка по OpenType MATH: fraction.rs,
radical.rs, scripts.rs,
accent.rs, fenced.rs, table.rs,
run.rs, fragment/glyph.rs (растяжимые
глифы) |
port (3.5) | завязан на стили и Engine typst; наш AST — MathML
Core |
6–8 |
| ReX | заявлено MIT/Apache в README, файлов лицензии в репозитории
нет, в Cargo.toml поля license нет |
★114; 2020-07-15 | Rust | раскладка TeX-формул | reference | юридически мутно, заброшен | — |
| MathCAT | MIT (1) | ★119; 0.7.5, 115 тыс.; 2026-10-02 (проверено 2026-10-04) | Rust | речь (15 языков, есть русский), Брайль (Nemeth, UEB и др.), навигация по формуле; используется в NVDA и JAWS | adopt | правила ClearSpeak для ru проверить с носителями | 8–12 |
| KaTeX | MIT (1) | ★20 422; 2026-10-02 | TS | таблицы символов и макросов LaTeX, тест-набор | port таблиц / reference | — | 1 |
| Temml | MIT (1) | ★349; 2026-08-28 | JS | LaTeX → MathML Core (окружения, \tag,
\label) |
port / reference | — | 2 |
| MathJax | Apache-2.0 (1) | ★2401; 2026-10-02 | TS | эталон разбора LaTeX и AsciiMath; правила речи SRE (MathJax-SRE отдельно, не проверено) | reference | — | — |
| math-core | MIT (1) | ★43; 0.8.2; 2026-10-02 (проверено) | Rust | LaTeX → MathML Core на Rust | reference / adopt после оценки | молодой проект | 1–2 |
| pulldown-latex | MIT (1) | 0.8.0, 80 тыс.; 2026-07-28 (проверено) | Rust | потоковый разбор LaTeX → MathML | reference | — | — |
| latex2mathml (Rust) | MIT (1) | 0.2.3, 114 тыс.; 2020-04 | Rust | — | avoid | заброшен | — |
| MathLive | MIT (1) | ★2165; 2026-09-30 | TS | эталон поведения визуального редактора (курсор, заполнители, линейный ввод) | reference | — | — |
unicode-math-class / codex (из typst) |
MIT OR Apache-2.0 / Apache-2.0 (1) (не проверено) | — | Rust | классы символов (Bin/Rel/Op), таблицы имён символов | adopt | — | 0,5 |
3. Глубокие разборы
3.1 Правописание «под нашей лицензией»: свой Hunspell-совместимый движок, словари, тезаурус, грамматика
Почему свой движок. Все зрелые реализации формата
Hunspell — класса 2: Hunspell (MPL-1.1/GPL-2/LGPL-2.1), nuspell
(LGPL-3), spellbook (MPL-2.0). Указанный в библии
hunspell-rs — Apache-обёртка, но линкует C-Hunspell, то
есть тоже класс 2. Единственная разрешительная реализация — zspell
(Apache-2.0; TSV ошибочно пишет «GPL-3.0»), но в ней нет компаундов,
подсказки не готовы, а все словоформы раскрываются в хеш-таблицу (для
русского это сотни мегабайт). Вывод: пишем
kernel/crates/meridian-spell (класс ★), формат
.aff/.dic не охраняется — это данные и документация
(hunspell(5)). Разрешённые источники знаний: страница
hunspell(5), поведение Hunspell как «чёрного ящика», серия
статей zverok «Rebuilding the spellchecker» (на неё ссылается README
spellbook), разбор .aff из zspell (port с уведомлением
Apache-2.0). Код spellbook и nuspell читать можно, копировать
нельзя.
Что реально используют словари (подсчёт директив по
клонам LibreOffice_dictionaries):
| Словарь | Директивы .aff (число строк) |
Вывод |
|---|---|---|
ru_RU/ru_RU.aff (146 270 основ) |
SFX 1 606, TRY,
SET UTF-8 |
только суффиксы — русская проверка дешёвая |
en/en_US.aff (49 568 слов) |
REP 91, SFX 59, PFX 14,
COMPOUNDRULE 3, ICONV 2,
ONLYINCOMPOUND, NOSUGGEST,
WORDCHARS |
COMPOUNDRULE нужен для «1st, 22nd» |
uk_UA/uk_UA.aff |
SFX 5 804, ICONV 65, MAP 2,
BREAK 2, IGNORE |
нормализация апострофов через ICONV |
be_BY/be-official.aff |
SFX 10 000, FLAG |
длинные флаги |
fr_FR/dictionaries/fr.aff |
SFX 5 343, PFX 215, REP 111,
ICONV 43, MAP 26, BREAK 8,
OCONV, KEY, CIRCUMFIX,
NEEDAFFIX, FULLSTRIP, KEEPCASE,
FORBIDDENWORD |
почти весь «аффиксный» набор |
de/de_DE_frami.aff |
SFX 437, PFX 68, REP 29,
MAP 8, COMPOUNDBEGIN/MIDDLE/END,
COMPOUNDPERMITFLAG, CHECKSHARPS,
CIRCUMFIX, NEEDAFFIX |
компаунды обязательны |
Что поддержать из формата (по фазам; A — для ru/en/uk/be/pl/nl/tr, B — de/fr/nl/sv/da/nb, C — hu и морфология):
| Группа | Директивы | Фаза |
|---|---|---|
| Заголовок и кодировки | SET (UTF-8, ISO8859-1…15, KOI8-R/U, CP1251),
FLAG (символ / long / num /
UTF-8), AF/AM (псевдонимы флагов
и морфологии), LANG, IGNORE,
WORDCHARS, BREAK,
COMPLEXPREFIXES |
A |
| Аффиксы | PFX/SFX: отсечение, добавка, условие
(классы символов), флаги продолжения (два уровня суффиксов + префикс),
перекрёстное произведение Y/N; CIRCUMFIX,
NEEDAFFIX, FULLSTRIP, KEEPCASE,
FORCEUCASE, CHECKSHARPS,
FORBIDDENWORD, NOSUGGEST,
SUBSTANDARD, WARN/FORBIDWARN,
ONLYINCOMPOUND |
A (PFX/SFX), B (остальное) |
| Компаунды | COMPOUNDFLAG,
COMPOUNDBEGIN/MIDDLE/END/ROOT,
COMPOUNDPERMITFLAG/FORBIDFLAG,
COMPOUNDRULE (регулярные выражения над флагами),
COMPOUNDMIN, COMPOUNDWORDMAX,
CHECKCOMPOUNDDUP/REP/CASE/TRIPLE/PATTERN,
SIMPLIFIEDTRIPLE, COMPOUNDMORESUFFIXES;
COMPOUNDSYLLABLE, SYLLABLENUM
(венгерский) |
A (COMPOUNDRULE), B, C |
| Подсказки | TRY, KEY (соседние клавиши),
REP (с якорями ^ $ и _ = пробел),
MAP (родственные символы), PHONE (фонетика),
MAXCPDSUGS, MAXNGRAMSUGS,
MAXDIFF, ONLYMAXDIFF,
NOSPLITSUGS, SUGSWITHDOTS; алгоритмы правок
(вставка, удаление, перестановка, замена, удвоение), разбиение на два
слова, n-граммы, восстановление регистра |
A (правки, REP/MAP/KEY/TRY), B (n-граммы, PHONE) |
| Преобразования | ICONV (нормализация ввода: апострофы, составные
символы), OCONV (вывод подсказок) |
A |
| Морфология | поля st: po: al: ph: is: ts: ds: ip: tp: sp: pa: dp:;
API analyze, stem, generate — для
поиска по словоформам, тезауруса по лемме и правил грамматики |
B (stem), C (generate) |
| Пользовательские данные | личный словарь с «образцом склонения» (как
add_with_affix), «пропустить всё», исключения; импорт
.dic LibreOffice, custom.dic Word (UTF-16),
расширений .oxt |
A |
Устройство. Компиляция .aff/.dic →
двоичный .mspell (основы в FST или идеальном хеше, таблицы
аффиксов — деревья по условиям, отображение в память; загрузка ru <
50 мс); проверка по схеме Hunspell/Nuspell (классификация регистра →
ICONV → BREAK → отсечение аффиксов → компаунды
→ запреты); подсказки с бюджетом времени (≤ 50 мс, асинхронно в Write);
no_std + alloc ради WASM. Соответствие: тест-набор Hunspell
(*.aff/*.dic/*.good/*.wrong/*.sug, лицензия на выбор MPL —
хранится в tests/third_party/, в продукт не попадает) и
дифференциальный фаззинг против бинарника hunspell в CI
(только как оракул, не распространяется).
Трудоёмкость: фаза A — 3–4 чел.-мес.; B — 2,5–3; C —
1–1,5; тесты и фаззинг — 1. Итого 7,5–9,5 (порт разбора из zspell
экономит ≈ 0,5). Если владелец разрешит spellbook как неизменённую
зависимость (класс 2), интеграция — ≈ 1 чел.-мес., морфологию дописывать
отдельно; экономия ≈ 6 чел.-мес. ценой MPL-исключения в
deny.toml.
Словари: что в установщик, что по решению, что только
загрузкой. Брать из первоисточников (SCOWL, sjp.pl, OpenTaal),
а не из пакетов LibreOffice: в en/ лежит
license.txt с текстом GPLv2 без указания, к чему он
относится, и устаревший README.txt (2010) про LGPL.
Лицензии ниже — по README в клоне и частичному клону
LibreOffice/dictionaries (коммит 32b006a от 2026-08-22) и по таблице
wooorm/dictionaries (проверено 2026-10-04).
| Язык | Источник (файл в клоне / первоисточник) | Лицензия | Кл. | Решение |
|---|---|---|---|---|
| ru | ru_RU/README_ru_RU.txt (А. Лебедев, 1997–2008) |
BSD-3-подобная + «изменённые версии помечать» | 1 | установщик |
| en-US, en-CA, en-AU | en/README_en_US.txt → SCOWL (K. Atkinson) |
разрешительная SCOWL + PD (12dicts, MWords) + WordNet 1.6 + BSD (Ispell) | 1 | установщик |
| en-GB | SCOWL en_GB-ise/-ize |
SCOWL (у wooorm — «MIT AND BSD», проверено 2026-10-04) | 1 | установщик; вариант LibreOffice (README_en_GB.txt, M.
Pinto) — LGPL, не брать |
| en-ZA | en/README_en_ZA.txt |
LGPL | 2 | заменить en-GB |
| pl | SJP.PL, выпуск 2026-09-01 | на выбор GPL-2 / LGPL-2.1 / MPL-1.1 / CC BY 4.0 / Apache-2.0 (проверено 2026-10-04) | 1 | установщик (Apache-2.0) |
| nl | OpenTaal | BSD-3-Clause или CC-BY-3.0 (проверено по wooorm) | 1 | установщик |
| tr | hunspell-tr (dictionary-tr у wooorm) |
MIT (в LibreOffice tr_TR/README.txt — MPL-2.0) |
1 | установщик (вариант MIT) |
| nb, nn | no/README v3.0: списки из Ordbanken (CC BY 4.0) и
CLARIN PUB+BY, но .aff — spell-norwegian (GPL-2) |
смешанная | 1 / 3 | собрать свои .aff/.dic из Ordbanken (≈ 0,5
чел.-мес.) |
| lt, ka, fa, tk | wooorm | BSD-3 / MIT / Apache-2.0 / Apache-2.0 | 1 | установщик по региону |
| fr | fr_FR/dictionaries/README_dict_fr.txt
(Grammalecte) |
MPL-2.0 | 2 | решение владельца |
| uk | uk_UA/README_uk_UA.txt |
MPL-1.1 (dict_uk у wooorm — GPL-3.0) | 2 | решение владельца |
| be | be_BY/README_be_BY.txt |
CC BY-SA 4.0 или LGPL-3 | 2 | решение владельца (LGPL) |
| es, pt-PT, da, el | es/README_hunspell_es.txt, pt_PT/…,
da_DK/…, el_GR/… |
тройные GPL/LGPL/MPL-1.1 | 2 | решение владельца (MPL) |
| pt-BR, hu | pt_BR/README_pt_BR.txt,
hu_HU/README_hu_HU.txt |
LGPL-3 или MPL(-2.0) | 2 | решение владельца |
| kk | myspell-kk (в LibreOffice/dictionaries нет) | GPL-2+ / LGPL-2.1+ / MPL-1.1+ (поиск, 2026-10-04) | 2 | решение владельца |
| sv | wooorm dictionary-sv |
LGPL-3.0 | 2 | решение владельца |
| de, de-AT, de-CH | de/README_extension_owner.txt (igerman98 + frami) |
GPL-2/GPL-3 или «OASIS 0.1» — та разрешает только программам, чей
основной формат ODF, и без изменений
(de/COPYING_OASIS.txt) → не наш случай |
3 | загрузка по запросу из первоисточника |
| it, cs, he | it_IT/README_it_IT.txt,
cs_CZ/README_en.txt, wooorm |
GPL-3 / GPL-2 / AGPL-3 | 3 | загрузка по запросу |
| fi | словаря Hunspell нет (Voikko) | — | — | вне плана |
Итог для E1.7 («20 словарей в комплекте»): без решений владельца в установщик идут ru, en-US/GB/CA/AU, pl, nl, tr (+ nb/nn после своей сборки); с разрешением «словари MPL/LGPL отдельными неизменёнными файлами» — ещё fr, uk, es, pt-BR, pt-PT, da, el, kk, sv, be; de/it/cs — только загрузка пользователем из первоисточника.
Тезаурус. en — Open English WordNet (CC-BY-4.0 +
WordNet License, класс 1; современнее th_en_US_v2.dat,
который построен на WordNet 2.1 — en/WordNet_license.txt,
тоже допустим). ru — готового разрешительного нет:
th_ru_RU_M_aot_and_v2.dat — LGPL-2.1
(ru_RU/README_thes_ru_RU_M_aot_and_v2.txt; AOT + словарь
Абрамова в оцифровке М. Королёва), YARN — CC BY-SA (3), RuWordNet/RuThes
— только некоммерческое использование (3) (оба — поиск, проверено
2026-10-04), RDT (nlpub/rdt) — код Apache-2.0, лицензия данных не
проверена, к тому же это «похожие слова», а не синонимы. Предложение:
собрать свой русский тезаурус из оригинала словаря Н. Абрамова
(1911; общественное достояние — автор умер в 1914, не проверено
юристом) с переводом в современную орфографию, плюс лексемы
Викиданных (CC0), под контролем лингвиста — 2–3 чел.-мес.; до готовности
— LGPL-файл AOT как отдельные данные по решению владельца. de —
OpenThesaurus (LGPL-2.1+), fr/es — LGPL-2.1, uk — GPL/LGPL/MPL (все
класс 2); pt-PT — Onto.PT (CC-BY-3.0, класс 1).
Грамматика. Английский — harper-core
(Apache-2.0) в процессе, P1. Русский — свой
meridian-grammar: токены ICU, морфология из
meridian-spell, декларативные правила (шаблоны токенов +
регулярные выражения + подсказка + категория); стартовый набор 150–200
правил пишет лингвист по справочникам (кавычки «ёлочки», тире и
неразрывные пробелы, «в течение/в течении», повтор слов, пробелы у
знаков препинания) — факты языка не охраняются, а правила LanguageTool и
Lightproof (ru_RU/README_Lightproof_ru_RU.txt:
MPL-1.1/GPL/LGPL) не копируем. Оценка: движок 2 чел.-мес. + правила 3–4.
LanguageTool — только как внешний сервер, к которому
клиент Lingo обращается по HTTP-протоколу /v2/check
(протокол не охраняется): сами LT не поставляем, организация может
подключить свой сервер (Enterprise). Это снимает вопрос LGPL при
сохранении совместимости, обещанной в E1.7.
3.2 Переносы: лицензии TeX-шаблонов по языкам
Заголовки прочитаны во всех 88 файлах
hyph-utf8/tex/generic/hyph-utf8/patterns/tex/hyph-*.tex
репозитория tex-hyphen (коммит 5684c0f от 2026-02-24, проверено
2026-10-04). В крейте hyphenation
(patterns/*.pat.txt) заголовки вырезаны, README отсылает к
первоисточнику. В hypher файлы хранятся с заголовками
(patterns/hyph-*.tex).
| Язык | Файл | Авторы | Лицензия | Кл. | Что в LibreOffice (для сравнения) |
|---|---|---|---|---|---|
| ru | hyph-ru.tex (2003) |
A. I. Lebedev | LPPL-1.2+ (не PD, как ошибочно в
12-license-policy.md §1) |
1* | hyph_ru_RU.dic — лицензия в README не указана → не
брать |
| en-us | hyph-en-us.tex (2005) |
G. Kuiken (на основе Liang) | «копирование и распространение с изменениями или без… при сохранении уведомления» (FSF All-Permissive) | 0–1 | README_hyph_en_US.txt — BSD-подобная |
| en-gb | hyph-en-gb.tex (1992–2016) |
D. Wujastyk, G. Toal | MIT | 1 | hyph_en_GB.dic основан на старом
ukhyphen.tex: изменения только под другим именем файла,
исходный список слов — © OUP (README_hyph_en_GB.txt) →
брать версию hyph-utf8 |
| de (1996, 1901, de-CH) | hyph-de-1996.tex (2024-02-28) |
Trennmustermannschaft (Hennig, Lemberg, Milde и др.) | MIT | 1 | hyph_de_*.dic — LGPL-2.1+ (2) |
| fr | hyph-fr.tex v2.13 |
Flipo, Gaulle, Reutenauer | MIT | 1 | hyph_fr.dic — LGPL (адаптация), исходник
hyph-fr.tex — MIT (README_hyph_fr.txt) |
| uk | hyph-uk.tex (2001) |
M. Polyakov | MIT или LPPL на выбор | 1 | hyph_uk_UA.dic — GPL-2+ (3) |
| kk | hyph-kk.tex v0.1 (2025–2026) |
Miklavec, Ermers, Rosendahl | Public domain | 0 | — (в hyphenation и hypher казахского нет —
добавляем сами) |
| be | hyph-be.tex 1.01 (2016) |
M. Salau | MIT | 1 | hyph_be_BY.dic — CC BY-SA 4.0 или LGPL-3 (2) |
| es | hyph-es.tex |
— | MIT/X11 | 1 | GPL-3/LGPL-3/MPL-1.1 |
| it | hyph-it.tex |
— | LPPL-1.3+ или MIT | 1 | LGPL |
| pt | hyph-pt.tex |
— | BSD-3-Clause | 1 | pt_PT — GPL |
| pl | hyph-pl.tex |
— | MIT | 1 | LGPL-2.1 |
| tr | hyph-tr.tex |
— | LPPL-1+ | 1* | — |
| nl | hyph-nl.tex |
— | MIT | 1 | — |
| sv | hyph-sv.tex |
— | LPPL-1.2+ | 1* | MPL/LGPL-3+ |
| da | hyph-da.tex |
— | LPPL-1.3+ или MIT | 1 | — |
| nb, nn, no | hyph-nb.tex, hyph-no.tex |
Kleveland, Selberg, Hufthammer | FSF All-Permissive | 0–1 | GPL |
| fi | hyph-fi.tex (1989) |
K. Saarinen | «Patterns may be freely distributed» — права на изменение не названы | 1* | — |
| el (монотоника) | hyph-el-monoton.tex |
— | LPPL или MIT | 1 | LGPL |
| cs | hyph-cs.tex |
— | GPL-2+ | 3 | GPL (в hypher — другой файл hyph-cs-sojka.tex, лицензия
не проверена) |
| hu | hyph-hu.tex |
B. Nagy | MPL-1.1 / GPL-2 / LGPL-2.1 | 2 | — |
* LPPL и «свободно распространяемые без права изменения» не названы в политике. По сути это разрешительные условия для данных (как OFL для шрифтов): распространять можно, изменённый файл — под другим именем и с уведомлением. Предложение (раздел 7): внести LPPL-1.3c и FSF All-Permissive в класс 1 для данных, а шаблоны не менять — свои исключения хранить отдельным списком. Прочие GPL-only шаблоны в tex-hyphen: id, mk, sr-cyrl; с выбором MIT (брать MIT): ga, индийские языки (as, bn, gu, hi, kn, ml, mr, or, pa, ta, te).
Реализация. Форк hypher (MIT/Apache) в
kernel/crates/meridian-hyph: автоматы строятся при сборке
из .tex-файлов, выбор языков — функциями Cargo; добавить
en-gb и kk, пользовательские исключения и
LEFTHYPHENMIN/ RIGHTHYPHENMIN из стилей документа (Word
хранит «зону переноса» и «макс. переносов подряд» — это уже раскладка).
Заголовки лицензий собираются скриптом сборки в
THIRD_PARTY/hyphenation/<lang>.txt и в окно «О
программе». Нестандартные переносы (немецкое «Schiff-fahrt», венгерский)
— фаза 3+, по статье L. Németh (TUGboat 27/1).
3.3 Раскладка абзаца: parley vs cosmic-text vs своя; Кнут–Пласс из typst
| Критерий (требования E0.3/E1.2) | parley 0.11 | cosmic-text 0.19 | своя text-layout на готовых крейтах |
|---|---|---|---|
| Шейпинг, шрифты, резерв | harfrust + skrifa + fontique (README клона) | свой буфер, растеризация swash | harfrust + skrifa + fontique — те же кирпичи |
| BiDi, сегментация | есть (parley_engine/src/bidi.rs, ICU4X) |
есть | unicode-bidi + icu_segmenter |
| Перенос строк | жадный, свойства CSS (WordBreak,
OverflowWrap, TextWrapMode) |
жадный | жадный «как Word» + оптимальный (Кнут–Пласс) |
| Переносы по словарю | нет (только мягкий перенос, shaped_text.rs) |
нет | meridian-hyph |
| Выравнивание по ширине | только межсловные пробелы (layout/alignment.rs) |
простое | пробелы + межбуквенное (как «распределить» Word) + сжатие пробелов |
Интервалы Word (точно/минимум/множитель), табуляции с заполнителями,
обтекание, сноски, висячие строки, w:compat |
нет | нет | пишем (E1.2) |
| Встроенные объекты, редактирование | inline boxes, PlainEditor |
редактор | свои (модель — piece table) |
| Лицензия, зрелость | Apache-2.0 OR MIT; ★744; активен | MIT OR Apache-2.0; ★2154 | наша |
Решение: своя text-layout
(совместимость с Word нельзя получить без собственной модели строки), но
без собственного шейпинга, Unicode и шрифтов. Из parley переносим
(Apache/MIT, port с уведомлением) итемизацию и анализ
(parley_engine/src/{analysis,analyzer,itemize}.rs) и
сверяем выравнивание с parley/src/layout/alignment.rs;
cosmic-text — только reference.
Кнут–Пласс из typst. Файл
crates/typst-layout/src/inline/linebreak.rs (1 070 строк,
Apache-2.0, коммит e58a63a от 2026-09-30) содержит:
linebreak_simple— жадный перенос;linebreak_optimized→linebreak_optimized_approximate(дешёвая оценка по накопленным массивамCumulativeVec, даёт верхнюю границу стоимости) →linebreak_optimized_bounded(точный динамический поиск с отсечением по этой границе);raw_ratio,raw_cost: «плохость» 100·|r|³, переполнение = 10⁶, стоимость(1 + плохость + штраф)²; штраф за перенос 135 (у Кнута–Пласса 50 — в typst переносов было бы слишком много), +15 % за каждую букву ближе 5 к краю слова, штраф за два дефиса подряд, штраф 100 за «висячее» короткое слово в конце абзаца;breakpoints— точки разрыва черезicu_segmenter(отдельный сегментер для китайского/японского), переносы черезhypher, разрывы в URL.
План порта: перенести алгоритм (не модуль) в
kernel/crates/text-layout/src/linebreak/optimal.rs, заменив
Preparation/Engine typst нашей моделью
«прогонов» и метриками строк; параметры (стоимость переноса, висячих
строк, допуск растяжения) вынести в настройки абзаца; жадный режим
оставить по умолчанию (так ломает строки Word), оптимальный — флаг
«Выравнивание по ширине — качественное» и режим Publisher. Оценка 1–1,5
чел.-мес. против 2,5–3 с нуля. Уведомление (Apache-2.0 §4): в начале
файла — «Portions derived from Typst (https://github.com/typst/typst),
crates/typst-layout/src/inline/linebreak.rs, © The Typst Project
Developers, Apache License 2.0; modified by MOffice: …», в
NOTICE — строка о typst и текст Apache-2.0 в «О программе».
Сторонние уведомления из NOTICE typst (colors.css — MIT,
переводы Babel — LPPL, Skia — BSD, LLVM) к этому файлу не относятся и не
переносятся.
3.4 Экспорт PDF через krilla: PDF/A, PDF/UA, теги, шрифты
Проверено по клону LaurenzV_krilla (коммит bdefa10 от
2026-10-02). Требования — docs/apps/write.md (алгоритм
5.26, диалог WR-61, критерий «veraPDF: 0 ошибок PDF/A-2b и PDF/UA-1, PAC
2024») и docs/apps/pdf.md (2.11, 5.13).
| Требование | krilla | Что дописываем мы |
|---|---|---|
| Шрифты: подмножества TrueType/CFF, Type0 + CIDFont, Identity-H, ToUnicode из кластеров шейпинга (лигатура → несколько символов) | есть: subsetter, src/text/cid.rs; режимы
PDF/A и UA требуют сопоставления глифов с текстом и проверяют его |
передавать текст кластеров вместе с глифами (низкоуровневый API глифов) |
| PDF/A-1b, 2b, 2u, 3b (WR-61); 1a/2a/3a (P2) | Validator::A(..):
A1_A, A1_B, A2_A, A2_B, A2_U, A3_A, A3_B, A3_U, A4, A4F, A4E
(src/configure/validate.rs); соответствие пунктам ведётся в
src/configure/PDF_A1.md…PDF_A4.md (A-1: 58 пунктов
проверяются кодом, 32 — «не поддерживается, значит выполнено», 7 — на
совести вызывающего) |
для A-1 krilla не сводит прозрачность сама, а выдаёт ошибку →
растрирование фрагментов с альфой (300 dpi) делаем до вызова; A-3:
исходник .mwx — EmbeddedFile с
AssociationKind::Source
(src/interchange/embed.rs) — есть |
| PDF/UA-1, теги из структуры документа | Validator::Ua(UA1); теги
(interchange/tagging/generate.toml): Part, Article,
Section, Div, BlockQuote, Caption, TOC, TOCI, Index, P, Hn, L, LI, Lbl,
LBody, Table, TR, TH, TD, THead, TBody, TFoot, Span, InlineQuote, Note,
Reference, BibEntry, Code, Link, Annot, Figure, Formula, Form, Datetime,
Terms, Title, Strong, Em; атрибуты AltText, ActualText, Lang, заголовки
ячеек; артефакты |
отображение нашей модели в дерево тегов (образец —
typst-pdf/src/tags/*); 26 пунктов UA помечены 🟣
«обеспечивает пользователь» (смысловая разметка) — их проверяет наша
«Проверка доступности» Write |
Закладки из заголовков, ссылки, именованные назначения, метки
страниц, XMP (pdfaid, pdfuaid),
OutputIntent |
есть (interchange/outline.rs,
interactive/destination.rs, metadata.rs,
xmp-writer) |
— |
Комментарии как аннотации /Text,
/Highlight |
нет: AnnotationType = только
Link и Widget
(src/interactive/annotation.rs) |
добавить разметочные аннотации в форке или постобработкой через
pdf-writer (≈ 0,5 чел.-мес.) |
| Поля форм (Forms → PDF) | Widget, src/interactive/form.rs |
— |
| Шифрование AES-256 (R6), права | нет (README: «encryption or digital signatures… out-of-scope») | свой проход meridian-pdf-crypt по ISO 32000-2 (≈ 1
чел.-мес.); PDF/A шифрование запрещает — предупреждение в диалоге |
| Подписи PAdES, линеаризация, PDF/X-1a/3/4 | нет (рамки TrimBox/BleedBox есть:
src/page.rs; CMYK, Separation, ICC —
src/graphics/color.rs) |
подписи и линеаризация — модуль PDF (pdf.md 5.x);
проверка PDF/X — своя (P2) |
| Изображения JPEG без перекодирования, PNG, GIF, WebP; SVG векторно | есть (krilla-svg) |
— |
| Прозрачность, маски, режимы наложения, градиенты (линейный, радиальный, конический), узоры | есть | — |
| Цветные шрифты (эмодзи), вариативные шрифты | есть: COLR/SVG/sbix/CBDT → Type3 (src/text/type3.rs),
Font::new_variable |
— |
Формулы: /Formula + /Alt, MathML как
Associated File (PDF 2.0, math.md P1) |
тег Formula и Alt есть; AF на уровне документа есть, на уровне элемента структуры — не проверено | при необходимости — правка в форке |
| Скорость: страницы параллельно | функция rayon |
— |
Вывод: krilla закрывает ≈ 80 % пунктов диалога экспорта Write (WR-61;
нет только «комментарии как аннотации» и «безопасность») и всю «трудную»
часть (шрифты, соответствие стандартам с проверками, теги); для
приложения PDF (подписи, линеаризация, правка существующих файлов) он не
замена — это зона lopdf/своего кода. Стратегия —
adopt с возможностью форка (MIT OR Apache-2.0, правки
публиковать не нужно); свои слои: шифрование, разметочные аннотации,
сведение прозрачности для A-1, валидация veraPDF в CI. Нюанс
NOTICE.md krilla: метод content_draw_path
(src/content.rs) «взят из resvg» в период, когда resvg был
под MPL; фрагмент тривиален (перевод квадратичной кривой в кубическую по
стандартной формуле) — в форке переписать за минуты, в остальном NOTICE
содержит заимствования из typst, svg2pdf, vello (Apache-2.0) — включить
в наш NOTICE.
3.5 MOffice Math: раскладка typst, ReX, LaTeX, MathCAT
Требования docs/apps/math.md: раскладка по TeXbook
(прил. G) с таблицей OpenType MATH (56 констант), ввод палитрами,
UnicodeMath (UTN #28), LaTeX (подмножество), AsciiMath (P1); форматы
OMML, MathML (Presentation 1–4, Core), StarMath; озвучивание
MathSpeak/ClearSpeak ru/en (P1), навигация по дереву (P0),
/Formula в PDF/UA (P1).
Раскладка — порт typst (Apache-2.0). Что лежит в
crates/typst-layout/src/math/ (коммит e58a63a):
| Файл | Строк | Что переносим |
|---|---|---|
mod.rs |
649 | входы layout_equation_inline/block, нумерация
add_equation_number, выбор математического шрифта,
предупреждение о шрифте без MATH |
fraction.rs |
188 | дроби и биномы по константам Fraction* |
radical.rs |
152 | корни со степенью (Radical*) |
scripts.rs |
452 | индексы, пределы, штрихи (правила 18a–f TeXbook через
Subscript*/Superscript*) |
accent.rs, line.rs,
cancel.rs |
95 / 80 / 148 | акценты, над/подчёркивания, зачёркивания
(m:borderBox) |
fenced.rs |
103 | растяжимые скобки \left…\right, m:d |
table.rs |
239 | матрицы, cases, точки выравнивания
(m:eqArr) |
run.rs |
373 | межатомные интервалы по классам Ord/Op/Bin/Rel/Open/Close/Punct |
shaping.rs, text.rs |
241 / 144 | шейпинг математического текста (ssty,
flac) |
fragment/glyph.rs |
721 | варианты и сборка растяжимых глифов
(GlyphAssembly) |
Плюс промежуточное представление
crates/typst-library/src/math/ir/{item,process,resolve,multiline}.rs
(3,3 тыс. строк) — образец перехода «дерево → боксы». При порте: вместо
Engine/StyleChain/Frame typst —
наш AST (MathML Core + расширения m:*) и список
отображения; ttf_parser::math и rustybuzz →
read-fonts (таблица MATH) и harfrust.
Дописываем сами: фантомы m:phant, m:box,
перенос длинных выключных формул по m:mathPr
(brkBin, wrapIndent), настройки Word
(smallFrac, dispDef, interSp),
эвристики для шрифтов без MATH. Оценка: порт 3–4 чел.-мес. + дополнения
2–3 против 10–14 с нуля → экономия 6–8.
ReX (ReTeX_ReX, последний коммит
2020-07-15): README заявляет «MIT и Apache-2.0, с частями под различными
BSD-подобными лицензиями», но файлов
LICENSE-APACHE/LICENSE-MIT в репозитории нет,
поля license в Cargo.toml нет, а
fonts/stix2/src/*.rs (≈ 12 тыс. строк) — таблицы,
сгенерированные из шрифта STIX. Только reference.
Разбор входа.
- LaTeX: свой парсер в AST с позициями исходника (нужно для
«сохранения исходного текста неизменённых узлов»); таблицы символов,
макросов и окружений портируем из KaTeX/Temml (MIT); на Rust оценить
math-core(MIT, LaTeX → MathML Core, активен в 2026) как основу или эталон тестов;latex2mathml(2020) — не брать. - UnicodeMath и AsciiMath — по спецификациям (UTN #28 и описание ASCIIMathML); открытые реализации не проверялись.
- OMML ↔︎ MathML: XSLT Microsoft (
OMML2MML.XSL) поставляется с Office и открытой лицензии не имеет — таблицу соответствий (data/omml_map.csv, math.md 5.5) строим сами по ECMA-376 ч. 1 §22.1. - StarMath: код LibreOffice — MPL/LGPL, реализуем по пользовательской документации и поведению.
Озвучивание и Брайль — MathCAT (MIT, Rust). Вход —
MathML, выход — текст речи с командами синтезатора, Брайль (Nemeth, UEB
Technical, CMU и др.), навигация по формуле; языки речи: китайский
(трад.), английский, финский, французский, немецкий, греческий,
венгерский, индонезийский, норвежский, польский, португальский,
русский, испанский, шведский, вьетнамский (README,
проверено 2026-10-04); используется в NVDA и JAWS. Правила речи —
YAML-данные в том же репозитории (MIT). Закрывает math.md 5.7 и
/Alt формул для PDF/UA; наши задачи — UIA
MathML-шаблон (Windows), AXMathEquation
(macOS), AT-SPI (Linux) и проверка русских правил носителями. Набор
стилей (ClearSpeak/SimpleSpeak; полный MathSpeak) — проверить при
интеграции. Экономия 8–12 чел.-мес.
Шрифты формул: STIX Two Math (OFL, RFN «TM Math») — по умолчанию; Noto Sans Math (OFL, без RFN); Latin Modern Math — GFL (раздел 4); Fira Math, Libertinus Math, XITS Math, Garamond Math — не проверялись, в установщик не включать до проверки.
План по фазе 4 (I13–I18 из 08-roadmap.md): I13 — AST и
порт раскладки; I14 — LaTeX/UnicodeMath, визуальный редактор; I15 —
OMML/MathML/StarMath; I16 — интеграция в Write/Slides, PDF-теги; I17 —
MathCAT (P1, релиз 2.7).
3.6 Qt: GPL-only модули, коммерческая лицензия, cxx-qt, лента и докинг
Официальный список (doc.qt.io/qt-6.8/licensing.html, проверено 2026-10-04): «для открытой Qt некоторые модули доступны не под LGPLv3, а только под GPL». Для Qt 6.8 LTS:
| GPL-only модуль Qt 6.8 | Нужен MOffice? | Замена (класс 0–1 или своё) |
|---|---|---|
| Qt Charts, Qt Graphs, Qt Data Visualization | диаграммы во всех приложениях | MOffice Chart на Skia (уже в плане; порт d3/ECharts — отчёт по charts) |
| Qt Virtual Keyboard | сенсорный ввод | экранные клавиатуры ОС (Windows Touch Keyboard, macOS «Клавиатура универсального доступа», Linux — через метод ввода) |
| Qt Lottie Animation | анимации в Slides, иллюстрации | rlottie (MIT, в карте компонентов) или velato (linebender, не проверено) |
| Qt Quick Timeline | анимации интерфейса | стандартные
Animation/Behavior/State Qt Quick
(LGPL) |
| Qt Quick 3D, Qt Quick 3D Physics | 3D-модели в Slides (P2) | не используем; при необходимости — свой рендер glTF |
| Qt Network Authorization (OAuth 2) | вход в MOffice ID, облака | Rust oauth2/openidconnect (уже в карте
компонентов) |
| Qt HTTP Server | локальные службы (брокер, надстройки) | axum/hyper в Rust |
| Qt GRPC | — | tonic/prost в Rust при необходимости |
| Qt MQTT, Qt CoAP, Qt Wayland Compositor | нет | — |
| Qt Qml Compiler (qmlsc — компиляция QML в C++) | производительность QML | открытый qmlcachegen (байт-код) + тяжёлая логика в
Rust/C++; замерить в спайке E0.2 |
В актуальной документации (Qt 6.12) список изменился: исчезли Charts и Data Visualization, добавился Qt Canvas Painter — при переходе на следующую LTS список перепроверять. Помимо этого, на пути LGPL: только динамическая линковка, без правок Qt (или с публикацией правок), предложение исходников точной версии Qt, тексты лицензий в «О программе»; Qt Multimedia — только с LGPL-сборкой FFmpeg; инструменты Qt (moc, rcc и др.) — GPL с исключением Qt GPL exception 1.0, на сгенерированный код не влияют.
Коммерческая Qt (qt.io, проверено 2026-10-04): «Qt for Small Business» — Qt for Application Development Enterprise за 546 € (618 $) в год за место, но только при выручке и привлечённых инвестициях компании ≤ 1 млн € и не более 3 мест, поддержка — 5 обращений в год. Команде MOffice (до 11 Qt-инженеров по таблице 2.2 дорожной карты, бюджет проекта заведомо больше 1 млн €) это не подходит. Стандартная цена на сайте не публикуется (по запросу); в дорожной карте заложено 60–75 тыс. в год за 12–15 мест (≈ 5 тыс. за место) — правдоподобно, но не подтверждено. Риск подписки: при прекращении оплаты теряется право пользоваться инструментами и выпускать новые версии на коммерческой Qt (страница Small Business прямо об этом говорит) — путь LGPL от этого не зависит. Рекомендация: стартовать на LGPL (решение библии), коммерческую лицензию рассматривать только ради Qt Qml Compiler или если понадобится статическая линковка (например, для веб-версии на Qt for WebAssembly).
cxx-qt (KDAB, MIT OR Apache-2.0, 0.10.0, 2026-09-29)
— adopt: #[cxx_qt::bridge] с QObject,
свойствами, сигналами и #[qml_element], потокобезопасные
обновления из Rust в Qt; экономия 3–4 чел.-мес. против своего моста.
Риски: версии 0.x, ломающие изменения; цена вызова и передача буферов
(Skia-текстура → QQuickItem) — замер в E0.2.
Лента. SARibbon (MIT, CI на Qt 6.8 LTS) построен на
QWidget (src/SARibbonBar/SARibbonBar.h:
SARibbonBar(QWidget* parent)), а оболочка MOffice — Qt
Quick (QML). Виджет в сцену QML не встраивается (наоборот — можно, через
QQuickWidget), поэтому «fork» из карты компонентов
невозможен без смены оболочки на Widgets. Переносим алгоритмы (MIT, port
с уведомлением) в QML/C++-компонент shell/ribbon: раскладку
элементов группы по рядам (крупные/малые кнопки) —
SARibbonPanelLayout.cpp (1 863 строки), размещение групп на
вкладке с прокруткой при нехватке ширины —
SARibbonCategoryLayout.cpp (1 425), общую раскладку ленты в
«свободном» и «компактном» стилях — SARibbonBarLayout.cpp
(1 993,
resizeInLooseStyle/resizeInCompactStyle),
модель настройки ленты — SARibbonCustomizeData.cpp (1 037),
галереи — SARibbonGallery*.cpp (2 100), контекстные вкладки
— SARibbonContextCategory.cpp. Сворачивание группы в одну
кнопку, как в Office, при порте проверить и при необходимости дописать.
Оценка: своя лента 4–6 чел.-мес., с портом алгоритмов 3–4 → экономия
1,5–2. Рамка окна без системного заголовка: в SARibbon используется
подмодуль QWindowKit (в клоне пуст, лицензия не проверена). Юридическая
сторона «ленты» (патенты/дизайн Microsoft) — заключение в фазе 0 по
политике §6.
Докинг. Qt-ADS — LGPL-2.1 и QWidget
(класс 2, только идеи: перспективы, автоскрытие, плавающие контейнеры,
индикаторы сброса). KDDockWidgets поддерживает QtQuick, но
GPL-2.0/GPL-3.0 или коммерческая лицензия KDAB (проверено 2026-10-04) —
открытый вариант запрещён, покупка — класс 4. Рекомендация: свой докинг
на QML (боковые панели, вкладки панелей, плавающие окна, сохранение
раскладки) — 3–4 чел.-мес.; запрос цены KDAB — как запасной вариант для
решения владельца.
3.7 Шрифты: лицензии, Reserved Font Name, метрические клоны
Лицензии подтверждены по файлам OFL.txt в google/fonts
(частичный клон, коммит 9710da1 от 2026-09-30), LICENSE
Liberation и Selawik, CTAN (lm-math, stix2-otf) — таблица 2.8. Все
шрифты раздела 4 библии — OFL-1.1, кроме Latin Modern Math (GUST
Font License).
Правило Reserved Font Name (OFL-1.1, п. 3). Изменённую версию шрифта нельзя называть зарезервированным именем. Имена с RFN: Liberation (и Arimo/Tinos/Cousine), Carlito, PT Sans / PT Serif / ParaType, Selawik (плюс товарный знак Microsoft), STIX — RFN «TM Math» и товарный знак IEEE «STIX Fonts™». Без RFN: Caladea, Gelasio, Inter, JetBrains Mono, Noto (включая Noto Sans Math), Intos. Практические следствия для MOffice:
- Шрифты ставим неизменёнными и под своими именами — документы ссылаются на «Carlito», замена Calibri→Carlito делается таблицей подстановки, а не переименованием.
- Если понадобится доработка (компенсация ширин, недостающие глифы, кириллица для Selawik) — только в шрифте с новым именем (например, «MOffice Sans»), с сохранением OFL и уведомлений.
- Продавать шрифты отдельно нельзя (п. 1 OFL); в составе программы — можно. Подмножества шрифтов внутри PDF — обычная практика встраивания в документ (документы под OFL не подпадают); формулировку FAQ OFL о подмножествах с RFN юристу перепроверить (не проверено).
Метрические клоны.
| Шрифт Office | Клон | Статус |
|---|---|---|
| Arial, Times New Roman, Courier New | Liberation Sans / Serif / Mono | метрически совместимы (назначение проекта) |
| Calibri / Cambria | Carlito / Caladea | метрически совместимы |
| Georgia | Gelasio | метрически совместим (описание проекта) |
| Aptos (по умолчанию в Office с 2024) | Intos (github.com/muglug/intos) | OFL-1.1 без RFN; семейства Intos, Intos Display, Intos Narrow, Intos Serif на основе Inter и Gelasio; по данным проекта — 0,000 % расхождения ширин с Aptos 2.01 в четырёх начертаниях и равные вертикальные метрики (проверено 2026-10-04). Риск: в шрифт перенесён кернинг Aptos — ширины традиционно считают нефункциональными «фактами» (так делались Liberation и Carlito), а таблицу кернинга — юристу; кириллица заявлена для Intos Serif (из Gelasio), для гротеска — проверить. Если юристы одобрят — заменяет «заказ OFL-клона в фазе 2» (3–6 мес. работы шрифтового дизайнера); иначе — заказ, как в библии |
| Segoe UI | нет полноценного | Selawik — «open source replacement for Segoe UI» (README), но без кернинга под Segoe UI; проект OpenPresentation отклонил его как замену (PR #54); кириллицы, по-видимому, нет (не проверено). Интерфейс MOffice и так на Inter; для документов — Selawik для латиницы + таблица компенсации ширин |
| Cambria Math | STIX Two Math | не метрический; формулы всё равно раскладываются заново |
| Consolas | JetBrains Mono | не метрический |
| Segoe UI Emoji | Noto Color Emoji (OFL) / Twemoji (MIT, графика CC-BY-4.0) | замена по символам |
Latin Modern Math — лицензия GFL (юридически LPPL-1.3c плюс просьба переименовывать изменённые версии). Политика §6 разрешает только OFL/Apache → либо владелец добавляет GFL/LPPL для шрифтов в класс 1, либо комплект формул ограничиваем STIX Two Math + Noto Sans Math (качество не страдает, Latin Modern нужен в основном ради «вида LaTeX»).
4. Класс 2 — требует решения владельца (с альтернативами классов 0–1)
| # | Вопрос | Лицензия (класс) | Что даёт | Альтернатива класса 0–1 / своя | Рекомендация |
|---|---|---|---|---|---|
| 1 | Qt 6.8: LGPL-3 с динамической линковкой или коммерческая | LGPL-3 (2) / коммерч. (4) | вся оболочка | внутри выбранной архитектуры нет | LGPL сейчас (как в библии); GPL-only модули запрещены; коммерческую — только ради Qt Qml Compiler или статической сборки, цену запросить |
| 2 | spellbook как временный движок правописания | MPL-2.0 (2), без правок | экономия ≈ 6 чел.-мес., готовые подсказки «как Nuspell» | свой meridian-spell (7,5–9,5 чел.-мес.), разбор
.aff — порт из zspell (Apache-2.0) |
свой движок; spellbook — только если под угрозой альфа A1
(2027-06-25), за трейтом SpellEngine, с удалением к релизу
1.0 |
| 3 | Словари MPL/LGPL отдельными неизменёнными файлами данных: fr, uk, es, pt-BR, pt-PT, da, el, hu, kk, sv, be | MPL-1.1/2.0, LGPL (2) | 11 языков «из коробки» вместо загрузки | загрузка пользователем из первоисточника; свои словари — человеко-годы | разрешить одним решением: файлы не меняем, лежат отдельно
(пользователь может заменить), рядом лицензия и ссылка на исходник; в
deny.toml/THIRD_PARTY.md — категория «данные,
класс 2» |
| 4 | Тезаурусы LGPL: ru (AOT + Абрамов/Королёв), de (OpenThesaurus), fr, es | LGPL-2.1 (2) | синонимы с первого дня | ru — свой из оригинала Абрамова 1911 (PD) + Викиданные (CC0), 2–3 чел.-мес.; en — Open English WordNet (CC-BY-4.0) | ru — свой; остальные — как п. 3 (отдельные файлы) или загрузка |
| 5 | LanguageTool как внешний сервер | LGPL-2.1 (2), правила тоже | грамматика 30+ языков | Harper (en, Apache-2.0) + свои правила (ru) | не поставлять; клиент протокола /v2/check к серверу,
который ставит пользователь или организация |
| 6 | Шаблоны переносов LPPL (ru, tr, sv; у it/da/el/uk есть выбор MIT), FSF All-Permissive (en-us, nb/nn), Latin Modern Math (GFL = LPPL-1.3c) | не названы в политике (по сути 1) | русские переносы целиком зависят от LPPL | ru — генерировать свои шаблоны patgen по своему словарю
переносов (≈ 2–3 чел.-мес.) или правиловый алгоритм хуже качеством |
внести LPPL-1.3c, FSF All-Permissive и GFL в класс 1 для данных и шрифтов; шаблоны не изменять |
| 7 | Венгерские шаблоны (hyph-hu.tex) и словарь hu |
MPL-1.1 / LGPL (2) | венгерский | нет | только если венгерский войдёт в волну локализации |
| 8 | Норвежский nb/nn из LibreOffice | .aff GPL-2 (3) + списки CC BY 4.0 |
— | свой .aff к спискам Ordbanken (CC BY 4.0), ≈ 0,5
чел.-мес. |
свой |
| 9 | Докинг KDDockWidgets (коммерческая KDAB) | коммерч. (4) | готовый докинг для QML | свой на QML, 3–4 чел.-мес. | свой; цену KDAB запросить для сравнения |
5. Запрещено (класс 3) и замены
| Что | Лицензия | Где всплывает | Замена |
|---|---|---|---|
| Qt Charts, Graphs, Data Visualization, Virtual Keyboard, Lottie, Quick Timeline, Quick 3D (+Physics), Network Authorization, HTTP Server, GRPC, MQTT, CoAP, Wayland Compositor, Qml Compiler | GPL-3 (без коммерческой Qt) | оболочка, диаграммы, OAuth | см. таблицу в 3.6 |
| KDDockWidgets (открытая версия) | GPL-2.0 / GPL-3.0 | докинг для QML | свой докинг |
| PyQt-Fluent-Widgets | GPL-3.0 | стиль Fluent | FluentUI (MIT) как reference, свой стиль MDS |
| Slint | GPL-3.0 или royalty-free с обязательной атрибуцией | альтернатива Qt | не нужен (Qt) |
| Словари de/de-AT/de-CH (igerman98, frami) | GPL-2/3; «OASIS 0.1» не применима | правописание de | загрузка пользователем из первоисточника; позже — свой словарь из разрешительных источников (не исследовано) |
| Словари it (GPL-3), cs (GPL-2), he (AGPL-3), dict_uk (GPL-3), gl, ga, eo, eu, la, mk, vi, ia, gd, rw (GPL), is (CC-BY-SA-3.0) | GPL / AGPL / CC-BY-SA | правописание | загрузка из первоисточника; для uk — вариант LibreOffice под MPL-1.1 (п. 3 раздела 4) |
Переносы LibreOffice: hyph_uk_UA.dic (GPL-2+),
hyph_NO (GPL), hyph_pt_PT (GPL); TeX:
hyph-cs.tex (GPL-2+), id, mk, sr-cyrl |
GPL | переносы | TeX-шаблоны uk (MIT), nb (FSFAP), pt (BSD-3); cs — проверить
hyph-cs-sojka.tex в hypher |
| Тезаурусы: YARN (CC BY-SA), RuWordNet/RuThes (некоммерческие), it (GPL-3), hu (GPL) | — | тезаурус ru | свой ru-тезаурус (раздел 3.1) |
en/license.txt в пакете LibreOffice |
GPLv2, без привязки к файлам | английские словари | брать SCOWL из первоисточника |
Отдельно: код класса 2 (Hunspell, nuspell, spellbook, LanguageTool,
Lightproof) не запрещён к чтению, но копировать его без решения
владельца нельзя — meridian-spell и
meridian-grammar пишутся по hunspell(5),
описаниям алгоритмов и наблюдаемому поведению.
6. Что переносим кодом (файл → куда в MOffice, лицензия, NOTICE)
| Источник (путь в клоне) | Лицензия | Куда в MOffice | Объём | Уведомление |
|---|---|---|---|---|
typst crates/typst-layout/src/inline/linebreak.rs |
Apache-2.0 | kernel/crates/text-layout/src/linebreak/optimal.rs |
1 070 → ≈ 600 строк | заголовок «Portions derived from Typst … Apache-2.0; modified by
MOffice: …», строка в NOTICE, текст Apache-2.0 в «О
программе» |
typst
crates/typst-layout/src/math/{fraction,radical,scripts,accent,fenced,table,run,line,cancel,shaping,text}.rs,
fragment/{glyph,mod}.rs |
Apache-2.0 | kernel/crates/meridian-math/src/layout/*.rs |
≈ 3,2 тыс. строк | то же |
typst crates/typst-library/src/math/ir/* |
Apache-2.0 | образец для meridian-math/src/ir/ |
3,3 тыс. (по необходимости) | то же, если копируется текст |
typst
crates/typst-pdf/src/tags/{tree/build.rs,context/table.rs,groups.rs} |
Apache-2.0 | kernel/crates/meridian-pdf-write/src/tags/ |
≈ 2,1 тыс. → ≈ 1 тыс. | то же |
hypher (весь крейт; patterns/hyph-*.tex выбранных
языков) |
MIT OR Apache-2.0; шаблоны — по языкам (3.2) | kernel/crates/meridian-hyph/ (форк) |
≈ 1 тыс. строк + данные | LICENSE-MIT/LICENSE-APACHE в папке крейта;
заголовки .tex сохраняются; скрипт сборки кладёт их в
THIRD_PARTY/hyphenation/<lang>.txt |
parley
parley_engine/src/{analysis,analyzer,itemize}.rs |
Apache-2.0 OR MIT | kernel/crates/text-layout/src/itemize/ |
≈ 1 тыс. | выбрать MIT: заголовок + NOTICE |
SARibbon
src/SARibbonBar/SARibbon{PanelLayout,CategoryLayout,BarLayout,CustomizeData,Gallery,GalleryGroup,ContextCategory}.cpp |
MIT (© 2020 czyt1988) | shell/src/ribbon/ (C++ QQuickItem +
QML) |
≈ 8,8 тыс. строк C++ → порт на QML/C++ | заголовок «Based on SARibbon (MIT)», NOTICE |
zspell — модуль разбора .aff/.dic (путь не проверен,
клона нет) |
Apache-2.0 | kernel/crates/meridian-spell/src/aff/ |
≈ 1–1,5 тыс. | заголовок Apache, NOTICE |
| KaTeX / Temml — таблицы символов, макросов, окружений (пути не проверены) | MIT | kernel/crates/meridian-math/data/latex_*.toml
(генерация) |
данные | MIT-уведомление |
| krilla (зависимость; форк при необходимости) | MIT OR Apache-2.0 | kernel/crates/meridian-pdf-write |
— | наш NOTICE включает содержимое NOTICE.md
krilla (typst, svg2pdf, vello, resvg) |
| Open English WordNet | CC-BY-4.0 + WordNet License | data/thesaurus/en.* (компилированный) |
данные | атрибуция Princeton WordNet и Open English WordNet |
| Словари ru_RU, SCOWL (en ×4), SJP.PL (Apache-2.0), OpenTaal, hunspell-tr | BSD-подобная / SCOWL / Apache-2.0 / BSD-3 / MIT | data/dictionaries/<lang>/ |
данные | файлы README/лицензий поставляются рядом; ru — «изменённые версии помечать» |
| MathCAT (зависимость с YAML-правилами) | MIT | kernel/crates/meridian-math (feature
speech) |
— | MIT-уведомление |
Порядок оформления (Apache-2.0 §4): копия лицензии; заметное указание
об изменениях в каждом изменённом файле; сохранение исходных уведомлений
об авторстве; если у источника есть NOTICE — перенос
относящихся к взятому коду строк. Сводные NOTICE и
THIRD_PARTY.md генерировать из Cargo.lock
(cargo-about или аналог — не проверено) плюс ручной реестр для
портированного кода и данных.
7. Предложения в библию и план
docs/00-foundation.md, раздел 4:
- «Шейпинг текста»:
rustybuzz→harfrust+skrifa/read-fonts(rustybuzz в архиве);unicode-linebreak→icu_segmenter;hyphenation→meridian-hyph(форкhypher);fontdb+ системные API →fontique(системные шрифты и резерв) +fontdb(встроенные шрифты) — окончательно по спайку E0.2. - «Проверка языка»:
hunspell-rs→ свойmeridian-spell(формат Hunspell.aff/.dic); «LanguageTool-совместимый локальный сервер» → «клиент протокола LanguageTool к внешнему серверу (не поставляется)» +harper-coreдля английского + свои правила для русского. - «PDF»: добавить «экспорт —
krilla(MIT/Apache) + свой слой шифрования и разметочных аннотаций». - «Шрифты в комплекте»: Selawik — только резерв для латиницы; Aptos — «Intos (OFL-1.1) после юридической проверки, иначе заказ клона»; Latin Modern Math — по решению о GFL (раздел 4, п. 6).
docs/12-license-policy.md: 5. §1
«TeX-шаблоны переносов большинства языков» стоят в классе 0 — неверно:
ru — LPPL-1.2+, en-us и nb — FSF All-Permissive, большинство — MIT, PD
только kk (и gl — Unlicense). Перенести в класс 0–1 «по языкам». 6. §2:
добавить в класс 1 для данных и шрифтов LPPL-1.3c, GFL, FSF
All-Permissive, WordNet License, лицензию SCOWL; ввести категорию
«данные класса 2 отдельными неизменёнными файлами» (словари MPL/LGPL).
7. §6 «Qt»: заменить «Qt Charts, Qt Data Visualization, Qt Virtual
Keyboard и др.» точным списком Qt 6.8 из 3.6 (обязательно — Qt Network
Authorization и Qt Qml Compiler).
docs/08-roadmap.md: 8. E0.8: строка
«cargo-deny: разрешены MIT/Apache-2.0/BSD/MPL-2.0/OFL; LGPL — только
динамическая линковка (Qt, Hunspell, libraw)» противоречит политике
(MPL-2.0 — класс 2 через exceptions; Hunspell больше не
нужен). Добавить: юридическая проверка Intos, запрос цен Qt и KDAB. 9.
E0.2: добавить пункты (h) fontique против
fontdb; (i) соответствие harfrust тест-набору
HarfBuzz на корпусе; (j) производительность QML без Qt Qml Compiler. 10.
E1.7 Lingo: «20 словарей в комплекте» → три списка (раздел 3.1); новые
задачи: meridian-spell фаза A к A1 (2 инженера I03–I05, 3–4
чел.-мес.), фазы B/C к релизу 1.6 (3,5–4,5); свой русский тезаурус
(лингвист, 2–3); meridian-grammar для русского (движок 2 +
правила 3–4, P1); сборка nb/nn из Ordbanken (0,5). 11. E1.3: экспорт PDF
на krilla — оценку уменьшить на 8–10 чел.-мес.; добавить
meridian-pdf-crypt (1), разметочные аннотации (0,5),
сведение прозрачности для PDF/A-1 и veraPDF в CI. 12. Фаза 4, Math: порт
раскладки typst (I13), MathCAT (I17, P1); LaTeX-парсер с таблицами
KaTeX/Temml. 13. Shell (E0.4, E1.5): «ribbon-компонент» = порт
алгоритмов SARibbon в QML; докинг — свой (3–4 чел.-мес.).
docs/research/component-map.md: «Kernel
/ шейпинг» — harfrust вместо rustybuzz; «Kernel / переносы» —
hypher-форк, лицензии по языкам; «Shell / лента» — port вместо fork;
«Math» — убрать ReX, добавить MathCAT как adopt; «Lingo / прочие языки»
— списки из 3.1 вместо «de (GPL/OASIS)»: для нас OASIS 0.1
неприменима.
Итого по экономии в области отчёта (против написания
своими силами, без шейпинга и Skia): krilla 8–10, typst math 6–8,
MathCAT 8–12, Harper 6–8, cxx-qt 3–4, SARibbon 1,5–2, hypher 1–2,
Кнут–Пласс 1–1,5, ICU4X/шрифтовые крейты — десятки; ≈ 35–48
чел.-мес.; дополнительные затраты из-за политики —
meridian-spell 7,5–9,5, русский тезаурус 2–3, русская
грамматика 5–6.
8. Непроверенное
- Стандартная цена коммерческой Qt (не Small Business) — на сайте не публикуется; 60–75 тыс./год из дорожной карты не подтверждены.
- Происхождение и лицензия словаря, встроенного в
harper-core(запрос к GitHub API не прошёл по тайм-ауту). - Лицензия
hyph-cs-sojka.texв hypher; лицензия QWindowKit (подмодуль SARibbon); velato (Lottie на Rust); moxcms. - Кириллица в Selawik и в гротеске Intos; юридическая чистота кернинга Aptos в Intos.
- Лицензия данных RDT на Zenodo; покрытие синонимами лексем Викиданных для русского; статус оцифровки словаря Абрамова в Викитеке.
- Формулировка FAQ OFL о подмножествах шрифтов с RFN при встраивании в PDF.
- Поддержка в krilla Associated Files на уровне элементов структуры (MathML для PDF/UA); полнота стиля MathSpeak в MathCAT и качество русских правил.
- Состав
third_partySkia в сборкеskia-safe(FreeType — выбор FTL) и наличие PathOps в привязках — проверить при сборке спайка. - Пути к таблицам символов/макросов KaTeX и Temml; путь модуля разбора в zspell (крейт помечен на crates.io как «non-standard», файл LICENSE — Apache-2.0).
- Лицензии
unicode-math-classиcodex; лицензии Fira Math, Libertinus Math, XITS Math, Garamond Math. - Лицензия набора n-грамм LanguageTool; наличие у Microsoft открытой
лицензии на
OMML2MML.XSL(исходим из того, что её нет). - Метрическая совместимость Gelasio с Georgia — по описанию проекта, замеры не делались.