Evalueer markdown_quill vervanging (17 maanden stale, onverifieerde uitgever) #1743
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#1743
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Achtergrond
markdown_quill(4.3.0) is 17 maanden niet bijgewerkt en heeft een onverifieerde uitgever. Het pakket zet Markdown om naar Quill-Delta (en terug) voor de WYSIWYG-editor.Gebruik in OciDeck
markdown_quillwordt gebruikt in meerdere bestanden voor de markdown↔Quill conversie die de WYSIWYG-editor mogelijk maakt:lib/utils/markdown_quill_codec.dart(regels 3, 26) — de centrale codeclib/widgets/markdown_editor/markdown_editor.dart(regel 11)lib/widgets/markdown_editor/wysiwyg_notes_field.dart(regel 6)lib/widgets/markdown_editor/timeline_table_embed_builder.dart(regel 3)lib/widgets/markdown_editor/table_embed_builder.dart(regel 3)lib/utils/timeline_table_embed_syntax.dart(regel 56)lib/utils/pentest_block_embed_syntax.dart(regel 140)lib/utils/image_embed_syntax.dart(regels 5, 39)lib/services/latex/markdown_to_latex.dart(regel 9)lib/widgets/shell/document_save_actions.dart(regel 16)Het probleem
flutter_quillversiesflutter_quillzelf (11.5.1) is wel actief onderhouden (verified publisher, 3 maanden geleden bijgewerkt). Alsflutter_quillbreaking changes introduceert, ismarkdown_quillmogelijk niet tijdvolgend bij te werken.Alternatieven
lib/utils/markdown_quill_codec.dartals wrapper. We kunnen de conversielogica zelf implementeren met demarkdown-package (7.3.1, actief) enflutter_quill's Delta-API. Dit elimineert de afhankelijkheid volledig.third_party/met eigen onderhoud, net als we metdesktop_multi_windowenscreen_retriever_macosdoen.Wat dit issue moet uitzoeken
markdown_quill's conversielogica gebruiken we echt? Is het een dunne wrapper of diepe integratie?markdown-package kan Markdown naar AST parsen, enflutter_quillheeft een Delta-API. De brug daartussen is het werk.markdown_quill4.3.0 die we nu al werken omheen?Prioriteit
Medium. Het werkt nu, maar de combinatie van 'onverifieerde uitgever' + '17 maanden stale' + 'kernfunctionaliteit' is een risico. Als
flutter_quilleen major bump doet, kanmarkdown_quillachterblijven en de WYSIWYG-editor breken.Licentie- en taalonderzoek
Huidige package
Alternatief 1: Eigen codec bouwen
Als we een eigen markdown↔Quill codec bouwen, gebruiken we packages die we al hebben:
Alternatief 2: Fork van markdown_quill (vendoren)
third_party/met eigen onderhoud, net alsdesktop_multi_windowenscreen_retriever_macos. MIT licentie blijft gelden.Conclusie
Alle opties zijn licentie-technisch haalbaar. De taal is in alle gevallen pure Dart — geen native code, geen platform-specifieke complicaties.
Evaluatie: markdown_quill vervanging
Onderzoek uitgevoerd op branch
eval/markdown-quill-1743. Hieronder de antwoorden op de vier vragen uit het issue, gevolgd door een aanbeveling.1. Hoeveel van markdown_quill gebruiken we echt?
Geen dunne wrapper — we gebruiken de volledige conversie-engine.
De package (
markdown_quill-4.3.0) is 1169 regels verdeeld over 6 bestanden:markdown_to_delta.dartMarkdownToDeltain de codec met 7 custom embedsdelta_to_markdown.dartDeltaToMarkdownin de codec met custom embed handlers + custom italicembeddable_table_syntax.dartx-embed-tableembedEmbeddableTable+EmbeddableTableSyntaxdirect gebruiktutils.darttransform()(newline na embed) +horizontalRuletransform()wordt intern doorDeltaToMarkdown.convert()aangeroepencustom_quill_attributes.dartCodeBlockLanguageAttributemarkdown_to_delta.dartvoor code-blok-taalmarkdown_quill.dartDirecte import-plekken (4):
lib/utils/markdown_quill_codec.dart— de centrale codec. GebruiktMarkdownToDelta,DeltaToMarkdown,CustomAttributeHandler,EmbeddableTable,EmbeddableTableSyntax.lib/widgets/markdown_editor/table_embed_builder.dart— gebruikt alleenEmbeddableTable(deBlockEmbed-subclass +tableTypeconstante).lib/widgets/markdown_editor/timeline_table_embed_builder.dart— gebruikt alleenEmbeddableTable.test/markdown_quill_codec_test.dart— gebruiktEmbeddableTable.tableType,EmbeddableToc.tocType.De overige referenties in het issue (markdown_editor.dart, wysiwyg_notes_field.dart, document_save_actions.dart, etc.) importeren het lokale
markdown_quill_codec.dart, niet de package direct.Conclusie: OciDeck gebruikt de volledige conversie-engine (977 regels heen+terug) plus de tabel-embed (117 regels). Het is geen dunne wrapper die we makkelijk kunnen missen — het is de kern van de WYSIWYG-brug.
2. Is een eigen codec haalbaar?
Ja, maar het is geen klein project. De
markdown-package (al aanwezig, ^7.3.1) levert de AST. Deflutter_quillDelta-API (al aanwezig, ^11.5.1) levert het doel. De brug ertussen is precies het werk dat de package nu doet.OciDeck heeft al bewezen dat het patroon werkt:
lib/services/latex/markdown_to_latex.dartdoet hetzelfde (Markdown AST → LaTeX) met dezelfdemarkdown-package als AST-parser. Maar LaTeX is een andere output met eenvoudigere regels. De Quill-Delta heeft specifieke complexiteit:_effectiveBlockAttrs, 30 regels) om dit af te dwingen.hr, tussen opeenvolgende blockquotes, in geneste lijsten. De package heeft ~60 regels (_insertNewLineBefore/AfterElementIfNeeded) voor deze logica._trimTextToMdSpec).Root/Block/Line/QuillText/Embednode-hiërarchie. Dit is de kwetsbare kant: de package importeert met// ignore_for_file: implementation_importsen gebruiktpackage:flutter_quill/quill_delta.dart— als flutter_quill deze interne structuur hertekent, breekt dit.Haalbaarheid: Ja. Het is vertaalwerk, niet onderzoek. De
markdown-package API is stabiel (dart-lang team). Deflutter_quillDelta-API is publiek en gedocumenteerd. De node-hiërarchie (Root/Block/Line/QuillText/Embed) is publiek viaflutter_quill.dart— deimplementation_imports-flag staat er voorquill_delta.dart, niet voor de node-klassen.3. Hoeveel code zou een eigen codec kosten?
Schatting: ~950-1150 regels, vergelijkbaar met de package zelf. Dat is logisch — we zouden in essentie de package herschrijven, toegespitst op wat OciDeck gebruikt.
softLineBreakweglaten,customElementToInlineAttributeweglaten (ongebruikt)escapeSpecialCharactersRelaxedweglaten,_prefixNumbervereenvoudigen, custom italic handler inbouwencharcodeVergelijking: de huidige afhankelijkheid is 1169 regels. Een eigen codec zou ongeveer even groot zijn. Het verschil is niet in regels maar in controle: we ondersteunen alleen wat OciDeck nodig heeft, en we kunnen bugs direct fixen.
Bijkomend voordeel: de
charcode-dependency (alleen gebruikt inembeddable_table_syntax.dartvoor$pipe,$space,$tab— simpele code-unit constanten) kan vervallen.4. Bekende bugs in markdown_quill 4.3.0 waar we omheen werken?
Ja, zeven workarounds in OciDeck-code, plus 10 open issues upstream.
Workarounds in OciDeck
image-embed met alleen bron. README zegt dit expliciet: "Currently this convertor doesn't support image alts"EmbeddableMarkdownImagedraagt hele markdown als embedimage_embed_syntax.dartEmbedBuildervoorimage-type, Quill werptUnimplementedErrorDividerEmbedBuildervoordivider-typeimage_embed_syntax.dart,divider_embed_builder.dart- - -i.p.v.---—DeltaToMarkdownschrijft thematische breuk met spaties_writtenOutRulenormaliseert naar---markdown_quill_codec.dartregel 111, 118|escaped in tabelcellen —escapeSpecialCharactersbreekt tabelstructuur (één cel → twee)_normalizeQuillOutput: tabelregels via opslagnormalisatie, andere regels via schermnormalisatiemarkdown_quill_codec.dartregel 126-136_i.p.v.*— package default gebruikt_CustomAttributeHandleroverschrijft met*markdown_quill_codec.dartregel 87-98EmbeddableTableSyntaxworden tabellen losse woorden in de rijke-tekstlaagEmbeddableTableSyntaxvóór standaard-syntax geregistreerdmarkdown_quill_codec.dartregel 54footnote_embed_syntax.dart,toc_embed_syntax.dart,pentest_block_embed_syntax.dart,timeline_table_embed_syntax.dartOpen issues upstream (10, waarvan 5 relevant)
1.i.p.v.2.,3.Upstream activiteit
Aanbeveling
Fork / vendoren als korte-termijn actie; eigen codec als langetermijndoel in een apart issue.
Fork / vendoren (nu, kleinste diff)
Kopieer de 1169 regels naar
third_party/markdown_quill/metpath:-dependency, net alsdesktop_multi_windowenscreen_retriever_macos.Voordelen:
pubspec.yamlaanpassen (2 regels:markdown_quill: ^4.3.0→markdown_quill: path: third_party/markdown_quill).charcode-dependency kan vervallen (herschrijfembeddable_table_syntax.dartzondercharcode— het zijn 3 simpele constanten).MODIFICATIONS.mddocumenteert onze wijzigingen, net als bij de andere vendored packages.Nadeel: we nemen 1169 regels onderhoud over. Maar we onderhouden er nu al 7 workarounds voor — in een fork zijn dat 7 fixes in plaats van 7 workarounds.
Eigen codec bouwen (later, apart issue)
Herschrijf de conversie-engine met
markdown+flutter_quillDelta-API, ~980 regels, geen externe afhankelijkheid meer.Voordelen:
Nadeel: ~980 regels nieuw code + testdekking. Het is een herschrijving, geen refactor. Het verdient een eigen issue met een spike om de haalbaarheid te bevestigen (bijv. eerst alleen
DeltaToMarkdownherschrijven en de package'sMarkdownToDeltabehouden, of andersom).Waarom niet behouden?
Het werkt nu, maar het risico is reëel:
flutter_quillis actief (verified publisher, 3 maanden geleden bijgewerkt). Als flutter_quill een major bump doet die deNode/Root/Block/Line/QuillText/Embed-hiërarchie ofquill_delta.dartraakt, ismarkdown_quillmogelijk niet tijdvolgend bij te werken — 17 maanden stale, unverified uploader, restricted issues. De WYSIWYG-editor is kernfunctionaliteit.Volgorde
third_party/markdown_quill/(dit issue, ~1 PR).Als de fork er is, is de drempel voor de eigen codec lager: we hebben de code lokaal, kunnen hem stap voor stap vervangen, en de tests (10415+) vangen elke regressie.