Files
hapi/web/src/lib/remark-disable-indented-code.ts
T
29b87d92fc fix(web): disable indented code blocks in markdown rendering (#395)
* fix(web): disable indented code blocks in markdown rendering

In CommonMark, text indented by 4+ spaces is treated as a code block.
LLM responses frequently have indented content inside numbered lists or
quoted text, causing large chunks to render as a single code block
instead of formatted markdown.

Add a remark plugin that disables the codeIndented tokenizer. Fenced
code blocks (``` … ```) continue to work normally.

via [HAPI](https://hapi.run)

Co-Authored-By: HAPI <noreply@hapi.run>

* fix(web): fix typecheck for remark plugin this binding

Use `as any` cast for the unified processor `this` context instead of
an explicit type annotation that conflicts with the Processor type.

via [HAPI](https://hapi.run)

Co-Authored-By: HAPI <noreply@hapi.run>

* fix(web): use this:unknown annotation to satisfy noImplicitThis

The previous `as any` cast on `this` still triggers noImplicitThis in
strict mode. Annotate the parameter as `this: unknown` and cast to
the required shape inside the function body. Also use the key-based
`data(key, value)` API instead of mutating the returned object.

via [HAPI](https://hapi.run)

Co-Authored-By: HAPI <noreply@hapi.run>

---------

Co-authored-by: HAPI <noreply@hapi.run>
2026-04-05 12:37:38 +08:00

15 lines
696 B
TypeScript

/**
* Remark plugin that disables indented code blocks (4-space indent).
*
* In CommonMark, text indented by 4+ spaces becomes a code block. This
* frequently misparses LLM output where numbered-list items with nested
* content or quoted text are indented. Fenced code blocks (``` … ```)
* still work normally.
*/
export default function remarkDisableIndentedCode(this: unknown) {
const processor = this as { data(key: string, value?: unknown): unknown }
const micromarkExtensions = (processor.data('micromarkExtensions') ?? []) as unknown[]
micromarkExtensions.push({ disable: { null: ['codeIndented'] } })
processor.data('micromarkExtensions', micromarkExtensions)
}