Support Incremental Parsing for Streaming Markdown Input/支持流式 Markdown 输入的增量解析
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 25/100
Direzione di ricerca
Inizia esaminando Parser.parse(String markdown) e la logica esistente di continuazione del parser a blocchi descritta tramite canContinue(). Definisci come un ParserContext conserverebbe i parser aperti, la radice dell’AST e la posizione corrente tra i chunk aggiunti. Il lavoro sarebbe considerato completato quando esistano un’API incrementale e un comportamento concordati che aggiornino l’AST esistente senza rianalizzare l’input invariato e gli scenari di streaming siano coperti dai test.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
English
Background
Currently, commonmark-java parses Markdown via Parser.parse(String markdown), which always processes the entire input from scratch and rebuilds the AST.
In streaming scenarios (e.g., live Markdown preview, collaborative editing, chat messages), new content is appended continuously. Re-parsing the whole document each time is inefficient and can cause performance issues for large documents.
Request
I would like to request incremental parsing support — the ability to parse only the newly added Markdown content and update the existing AST without re-parsing unchanged parts.
Possible Approach
- Maintain a parsing context (
ParserContext) that stores:- Current open block parsers
- AST root node
- Current line number / position
- Add a method like:
which:Node parseIncremental(String newMarkdown, ParserContext context);- Resumes parsing from the saved context
- Continues open blocks if possible (
canContinue()logic) - Creates new blocks for new content
- Parses inline elements only for new blocks
- Update the AST in place, avoiding full rebuild.
Benefits
- Significant performance improvement for streaming or real-time editing scenarios.
- Reduced memory and CPU usage for large documents.
- Enables more responsive applications using
commonmark-java.
Example Use Case
Parser parser = Parser.builder().build();
ParserContext context = new ParserContext();
Node doc = parser.parseIncremental(initialMarkdown, context);
doc = parser.parseIncremental(newMarkdownChunk, context);
Would you consider adding this feature or providing hooks to implement it externally?
中文
背景
目前,commonmark-java 通过 Parser.parse(String markdown) 解析 Markdown,每次都会从头处理整个输入并重建 AST。
在流式场景(例如实时 Markdown 预览、协同编辑、聊天消息)中,内容会不断追加。每次都全量解析会导致性能浪费,尤其是文档较大时。
需求
希望能支持 增量解析 —— 只解析新增的 Markdown 内容,并在已有 AST 基础上更新,而不重新解析未变化的部分。
可能的实现思路
- 维护一个解析上下文(
ParserContext),保存:- 当前未闭合的块解析器
- AST 根节点
- 当前行号 / 位置
- 增加一个方法,例如:
该方法:Node parseIncremental(String newMarkdown, ParserContext context);- 从保存的上下文恢复解析状态
- 如果可能,继续旧块(依赖
canContinue()逻辑) - 为新增内容创建新块
- 仅对新增块进行行内解析
- 在原 AST 上直接更新,避免全量重建。
好处
- 在流式或实时编辑场景下显著提升性能。
- 降低大文档的内存和 CPU 消耗。
- 让基于
commonmark-java的应用更加流畅、响应更快。
使用示例
Parser parser = Parser.builder().build();
ParserContext context = new ParserContext();
Node doc = parser.parseIncremental(initialMarkdown, context);
doc = parser.parseIncremental(newMarkdownChunk, context);
- Lingua principale
- Java
- Stelle
- 2.7k
- Fork
- 336
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di commonmark/commonmark-java
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
commonmark/commonmark-java#460 ·
-
Second code span not recognised after an unclosed backtick string and another code spanForse già presa @TanbirRamim l’ha presa 13 giorni fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 68/100
commonmark/commonmark-java#458 ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 74/100
commonmark/commonmark-java#457 ·
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 48/100
commonmark/commonmark-java#443 · 4 commenti ·
-
Option to define custom flanking/canOpen/canClose rules for delimitersForse di nuovo libera @abhiramaab l’ha presa 57 giorni fa e non c’è nessuna pull request aperta. Apertaenhancement
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
commonmark/commonmark-java#428 · 4 commenti ·
Tutte le issue di commonmark/commonmark-java
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 74/100
I maintainer di solito rispondono entro 1 giorno
-
team:Lumberjack
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
OpenLiberty/open-liberty#35998 ·
I maintainer di solito rispondono entro 1 giorno
-
[BUG] SQS SendMessageBatch accepts more than 10 entries instead of TooManyEntriesInBatchRequestAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 67/100
floci-io/floci#5319 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Bug QWP
Difficoltà 2/5 1-3 ore Idoneità per principianti 79/100
I maintainer di solito rispondono entro 3 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 64/100