markdown

package
v0.21.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 12, 2026 License: Apache-2.0 Imports: 19 Imported by: 0

Documentation

Overview

Package markdown extracts and transforms Markdown documents.

Reader can emit one whole document or heading-scoped documents with source metadata. Splitter performs structure-aware, token-bounded chunking: headings are repeated as retrieval context, tables split only between rows, lists only between items, and fenced code blocks only between lines while retaining their fences.

Index

Constants

View Source
const (
	MetadataHeading      = "markdown.heading"
	MetadataHeadingLevel = "markdown.heading.level"
	MetadataHeadingPath  = "markdown.heading.path"
	MetadataSourceName   = "markdown.source"
)

Markdown metadata keys keep structural lineage explicit without changing the core document contract.

Variables

View Source
var ErrSemanticUnitTooLarge = errors.New("markdown splitter: semantic unit exceeds token limit")

ErrSemanticUnitTooLarge reports a Markdown unit that cannot be split without losing its semantic boundary.

Functions

This section is empty.

Types

type Reader

type Reader struct {
	// contains filtered or unexported fields
}

Reader extracts documents from Markdown.

func NewReader

func NewReader(source io.Reader, config ReaderConfig) (*Reader, error)

NewReader freezes Markdown extraction and source-budget policy.

func (*Reader) Read

func (r *Reader) Read(ctx context.Context) ([]*document.Document, error)

Read consumes the underlying reader and emits documents according to the configuration. Context cancellation is honored around parsing and between emitted sections.

type ReaderConfig

type ReaderConfig struct {
	HeadingSplitLevel int
	SourceName        string
	Metadata          coremetadata.Map
	SourceBudget      etl.SourceBudget
}

ReaderConfig controls Markdown extraction. HeadingSplitLevel emits one document per section split on headings at or above that level (1 = H1, 2 = H1+H2). Zero disables splitting; non-zero values must be in [1, 6]. Metadata is cloned by NewReader, and reader-derived markdown.* keys take precedence. A zero SourceBudget uses etl.DefaultMaxSourceBytes.

type Splitter

type Splitter struct {
	// contains filtered or unexported fields
}

Splitter produces token-bounded Markdown chunks without severing tables, list items, or code lines. Active heading ancestry is repeated in each chunk so independently retrieved chunks retain their section context.

func NewSplitter

func NewSplitter(config SplitterConfig) (*Splitter, error)

NewSplitter validates semantic and output bounds before retaining policy.

func (*Splitter) Split

func (s *Splitter) Split(ctx context.Context, docs []*document.Document) ([]*document.Document, error)

Split preserves source metadata and stamps standard chunk-lineage metadata through the base ETL splitter.

func (*Splitter) SplitText

func (s *Splitter) SplitText(ctx context.Context, source string) ([]string, error)

SplitText splits one Markdown source string. Every returned chunk is non-empty and within MaxTokensPerChunk. The total is bounded by MaxChunks.

type SplitterConfig

type SplitterConfig struct {
	Tokenizer tokenizer.Tokenizer

	MaxTokensPerChunk int
	MaxChunks         int
	// MaxSearchWork bounds each paragraph prefix search in bytes rendered or
	// encoded plus tokens decoded; zero uses etl.DefaultMaxSearchWork.
	MaxSearchWork int
	IDGenerator   etl.IDGenerator
}

SplitterConfig configures structure-aware Markdown chunking. Zero limits use documented defaults; negative limits are rejected.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL