Skip to content

✨ feat(pdf): export markdown documents to PDF - #12

Draft
Alex-ok2005 wants to merge 1 commit into
dartdavros:mainfrom
Alex-ok2005:pdf-export
Draft

✨ feat(pdf): export markdown documents to PDF#12
Alex-ok2005 wants to merge 1 commit into
dartdavros:mainfrom
Alex-ok2005:pdf-export

Conversation

@Alex-ok2005

Copy link
Copy Markdown
Contributor

Summary

  • Add PDF export use case, file picker support, menu item, and success dialog.
  • Render Markdown documents to PDF with SkiaSharp, including headings, lists, code, quotes, tables, and wrapped text.
  • Embed a compact Noto Emoji PNG subset for common emoji used during PDF export.
  • Cover the export flow and localization behavior in presentation tests.

Validation

  • dotnet build MarkMello.sln
  • dotnet test MarkMello.sln --no-build

@dartdavros dartdavros left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо за PR! По критическому пути всё хорошо — экспорт ленивый и не влияет на cold start / открытие файла: рендер и декод эмодзи происходят только по действию пользователя, ассеты грузятся on-demand с кэшем, а команда доступна в режиме просмотра без входа в edit mode. Два замечания по реализации (inline).

return;
}
catch (IOException) when (attempt < maxAttempts)
{

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Синхронный renderer.Render(...) выполняется на вызывающем потоке до первого await, а в MainWindowViewModel.ExportPdfAsync вызов идёт с ConfigureAwait(true) — то есть вся вёрстка PDF крутится на UI-потоке и подвешивает окно на больших документах.

Для продукта, чьё ядро — отзывчивость и ощущение лёгкости (constitution §11, «measured performance»), это режет ровно то, что обещано. Предлагаю вынести CPU-bound рендер в фон, например обернуть создание документа и renderer.Render(...) в Task.Run(...), чтобы UI оставался отзывчивым во время экспорта.


<ItemGroup>
<Content Include="Assets\NotoEmoji\**\*.png" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SkiaSharp запинен на preview-версию (3.119.3-preview.1.1). Проект собирается под Native AOT для production-сборок, а SkiaSharp и так приходит транзитивно через Avalonia. Явный пин на preview, отличный от версии Avalonia.Skia, рискует конфликтом версий и проблемами при AOT-трим.

Лучше согласовать версию с той, что тянет Avalonia 12 (или убрать явную ссылку, если транзитивной достаточно), и не использовать preview в production-зависимостях.

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.

2 participants