import { Parser, List, Node } from './src/combinator/parser'; import { Input } from './src/parser/context'; declare abstract class Document { private parser?: T; } export interface DocumentParser extends Document<'document'>, Parser { } export namespace DocumentParser { export interface SegmentParser extends Document<'segment'>, Parser, SourceParser.ContentLineParser, ]> { } export interface BlockParser extends Document<'block'>, Parser, BlockParser.ParagraphParser, ]> { } export namespace BlockParser { interface Block extends Document<`block/${T}`> { } export interface HeaderParser extends // --- // url: https://host/path // --- Block<'header'>, Parser, Parser, ]>, Parser, ]> { } export namespace HeaderParser { export interface FieldParser extends Block<'header/field'>, Parser { } } export interface PagebreakParser extends // === Block<'pagebreak'>, Parser { } export interface HeadingParser extends // # Title Block<'heading'>, Parser, Parser, ]> { } export namespace HeadingParser { export interface SegmentParser extends Block<'heading/segment'>, Parser { } } export interface UListParser extends // - item Block<'ulist'>, Parser { } export namespace UListParser { export interface ItemParser extends Block<'ulist/item'>, Parser, ]>, Parser, ]> { } } export interface OListParser extends // 0. item // 1-1. item // (a)-1 item Block<'olist'>, Parser { } export namespace OListParser { export interface ListParser extends Block<'olist/list'>, Parser { } export interface ItemParser extends Block<'olist/item'>, Parser, ]>, Parser, ]> { } } export interface IListParser extends // + item // * item Block<'ilist'>, Parser { } export namespace IListParser { export interface ItemParser extends Block<'ilist/item'>, Parser, ]> { } } export interface DListParser extends // ~ term // : description Block<'dlist'>, Parser { } export namespace DListParser { export interface TermParser extends Block<'dlist/term'>, Parser { } export interface DescriptionParser extends Block<'dlist/description'>, Parser { } } export interface SidefenceParser extends // | abc Block<'sidefence'>, Parser { } export namespace SidefenceParser { export interface SourceParser extends Block<'sidefence/source'>, Parser, ]> { } } export interface TableParser extends // |Head| // |:--:| // |data| Block<'table'>, Parser, TableParser.RowParser, TableParser.RowParser, ]> { } export namespace TableParser { export interface RowParser

extends Block<'table/row'>, Parser { } export interface AlignParser extends Block<'table/align'>, Parser { } export type CellParser = CellParser.HeadParser | CellParser.DataParser; export namespace CellParser { export interface HeadParser extends Block<'table/cell/head'>, Parser { } export interface DataParser extends Block<'table/cell/data'>, Parser { } } } export interface CodeBlockParser extends // ```js index.js // abc // ``` Block<'codeblock'>, Parser, Parser, AutolinkParser, Parser, ]> { } export namespace CodeBlockParser { export interface SegmentParser extends Block<'codeblock/segment'>, Parser { } } export interface MathBlockParser extends // $$ // expr // $$ Block<'mathblock'>, Parser, Parser, ]> { } export namespace MathBlockParser { export interface SegmentParser extends Block<'mathblock/segment'>, Parser { } } export interface ExtensionParser extends // ~~~abc // ~~~ Block<'extension'>, Parser { } export namespace ExtensionParser { export interface SegmentParser extends Block<'extension/segment'>, Parser { } export interface FigureParser extends // ~~~figure $group-name // !https://host/image.png // // caption // ~~~ Block<'extension/figure'>, Parser, Parser, SourceParser.EmptyLineParser, InlineParser, ]>, ]> { } export namespace FigureParser { export interface SegmentParser extends Block<'extension/figure/segment'>, Parser, SourceParser.EmptyLineParser, Parser, ]>, ]> { } } export interface FigParser extends // $group-name // !https://host/image.png Block<'extension/fig'>, Parser { } export namespace FigParser { export interface SegmentParser extends Block<'extension/fig/segment'>, Parser, ]> { } } export interface FigbaseParser extends // $group-name Block<'extension/figbase'>, Parser { } export interface TableParser extends // ~~~table // -/- // # header // : data // ~~~ Block<'extension/table'>, Parser, TableParser.GridTableParser, ]> { } export namespace TableParser { export interface GridTableParser extends Block<'extension/table/gridtable'>, Parser { } export interface RowParser extends Block<'extension/table/row'>, Parser>, Input, [ Parser<[string[], string[]?], Input, [ AlignParser, ]>, Parser, ]> { } export interface AlignParser extends Block<'extension/table/align'>, Parser<[string[], string[]?], Input, [ SourceParser.StrParser, ]> { } export namespace CellParser { export interface HeadParser extends Block<'extension/table/cell/head'>, Parser, InlineParser, ]> { } export interface DataParser extends Block<'extension/table/cell/data'>, Parser, InlineParser, ]> { } export interface DatalineParser extends Block<'extension/table/cell/dataline'>, Parser { } } } export interface MessageParser extends // ~~~message/note // Message // ~~~ Block<'extension/message'>, Parser, Parser, MessageParser.ContentParser, Parser, ]> { } export namespace MessageParser { export interface ContentParser extends Block<'extension/message/content'>, Parser { } } export interface AsideParser extends // ~~~aside // ## title // ~~~ Block<'extension/aside'>, Parser, Parser, DocumentParser, Parser, ]> { } export interface ExampleParser extends // ~~~example // ~~~ Block<'extension/example'>, Parser, Parser, ]> { } export interface PlaceholderParser extends // ~~~abc // ~~~ Block<'extension/placeholder'>, Parser, Parser, ]> { } export namespace PlaceholderParser { export interface SegmentParser extends Block<'extension/placeholder/segment'>, Parser { } } } export interface BlockquoteParser extends // > abc // !> *abc* Block<'blockquote'>, Parser { } export namespace BlockquoteParser { export interface SegmentParser extends Block<'blockquote/segment'>, Parser { } export interface SourceParser extends Block<'blockquote/source'>, Parser { } export interface MarkdownParser extends Block<'blockquote/markdown'>, Parser { } } export interface MediaBlockParser extends // abc Block<'mediablock'>, Parser, Parser, ]> { } export interface ReplyParser extends // >>1 // > text // abc Block<'reply'>, Parser { } export namespace ReplyParser { export interface CiteParser extends Block<'reply/cite'>, Parser, Parser, Parser, ]> { } export interface QuoteParser extends Block<'reply/quote'>, Parser { } } export interface ParagraphParser extends // abc Block<'paragraph'>, Parser { } } export interface InlineParser extends Document<'inline'>, Parser, InlineParser.AutolinkParser, SourceParser.TextParser, ]> { } export namespace InlineParser { interface Inline extends Document<`inline/${T}`> { } export interface AnnotationParser extends // ((abc)) Inline<'annotation'>, Parser { } export interface ReferenceParser extends // [[abc]] // [[^Abbr]] // [[^Abbr| abc]] Inline<'reference'>, Parser { } export namespace ReferenceParser { export interface AbbrParser extends // ^X 2020, 1-2 // ^X. Y., and Z et al. 2020, 1-2 Inline<'reference/abbr'>, Parser { } } export interface TemplateParser extends // {{abc}} Inline<'template'>, Parser { } export namespace TemplateParser { export interface BracketParser extends Inline<'template/bracket'>, Parser, Parser, Parser, SourceParser.EscapableSourceParser, ]> { } } export interface RemarkParser extends // [% remark %] Inline<'remark'>, Parser { } export interface ExtensionParser extends Inline<'extension'>, Parser { } export namespace ExtensionParser { export interface IndexParser extends // [#index] // [#index|signature] Inline<'extension/index'>, Parser { } export namespace IndexParser { export interface SignatureParser extends Inline<'extension/index/signature'>, Parser { } } export interface IndexerParser extends // [|signature] // [|] Inline<'extension/indexer'>, Parser, ]> { } export interface LabelParser extends // $group-name // [$group-name] Inline<'extension/label'>, Parser { } export namespace LabelParser { export interface SegmentParser extends Inline<'extension/label/segment'>, Parser { } } export interface PlaceholderParser extends // [^abc] Inline<'extension/placeholder'>, Parser { } } export interface LinkParser extends // { uri } // [abc]{uri nofollow} Inline<'link'>, Parser { } export namespace LinkParser { export interface TextLinkParser extends Inline<'link/textlink'>, Parser>, Input, [ InlineParser, ]>, LinkParser.ParameterParser, ]> { } export interface MediaLinkParser extends Inline<'link/medialink'>, Parser>, Input, [ MediaParser, ShortMediaParser, ]>, LinkParser.ParameterParser, ]> { } export interface ContentParser extends Inline<'link/content'>, Parser>, Input, [ MediaParser, ShortMediaParser, InlineParser, ]> { } export interface TextParser extends Inline<'link/text'>, Parser>, Input, [ SourceParser.UnescapableSourceParser, ]> { } export interface ParameterParser extends Inline<'link/parameter'>, Parser>, Input, [ LinkParser.ParameterParser.UriParser, LinkParser.ParameterParser.OptionParser, ]> { } export namespace ParameterParser { export interface UriParser extends Inline<'link/parameter/uri'>, Parser { } export interface OptionParser extends Inline<'link/parameter/option'>, Parser { } } } export interface MediaParser extends // !{ uri } // ![abc]{uri nofollow} Inline<'media'>, Parser { } export namespace MediaParser { export interface TextParser extends Inline<'media/text'>, Parser>, Input, [ UnsafeHTMLEntityParser, TextParser.BracketParser, SourceParser.TxtParser, ]> { } export namespace TextParser { export interface BracketParser extends Inline<'media/text/bracket'>, Parser, Parser, Parser, Parser, ]> { } } export interface ParameterParser extends Inline<'media/parameter'>, Parser>, Input, [ LinkParser.ParameterParser.UriParser, ParameterParser.OptionParser, ]> { } export namespace ParameterParser { export interface OptionParser extends Inline<'media/parameter/option'>, Parser { } } } export interface RubyParser extends // [AB](a b) Inline<'ruby'>, Parser>, Input, [RubyParser.TextParser]>, Parser>, Input, [RubyParser.TextParser]>, ]> { } export namespace RubyParser { export interface TextParser extends Inline<'ruby/text'>, Parser { } } export interface HTMLParser extends // Allow: wbr, bdo, bdi // abc Inline<'html'>, Parser { } export namespace HTMLParser { export interface VoidTagParser extends Inline<'html/voidtag'>, Parser { } export interface TagParser extends Inline<'html/tag'>, Parser { } export interface AttributeParser extends Inline<'html/attribute'>, Parser { } } export interface InsertionParser extends // ++abc++ Inline<'insertion'>, Parser { } export interface DeletionParser extends // ~~abc~~ Inline<'deletion'>, Parser { } export interface MarkParser extends // ==abc== Inline<'mark'>, Parser { } export interface EmStrongParser extends // ***abc*** Inline<'emstrong'>, Parser { } export interface StrongParser extends // **abc** Inline<'strong'>, Parser { } export interface EmphasisParser extends // *abc* Inline<'emphasis'>, Parser { } export interface ItalicParser extends // ///abc/// Inline<'italic'>, Parser { } export interface MathParser extends // $expr$ // ${expr}$ Inline<'math'>, Parser, ]> { } export namespace MathParser { export interface BracketParser extends Inline<'math/bracket'>, Parser { } } export interface CodeParser extends // `abc` Inline<'code'>, Parser { } export interface HTMLEntityParser extends // © Inline<'htmlentity'>, Parser { } export interface UnsafeHTMLEntityParser extends // © Inline<'unsafehtmlentity'>, Parser { } export interface ShortMediaParser extends // !https://host Inline<'shortmedia'>, Parser { } export namespace ShortMediaParser { export interface LineShortMediaParser extends Inline<'shortmedia/lineshortmedia'>, Parser { } } export interface BracketParser extends // () // [] // {} // "" Inline<'bracket'>, Parser { } export interface AutolinkParser extends Inline<'autolink'>, Parser { } export namespace AutolinkParser { export interface UrlParser extends // https://host Inline<'url'>, Parser, Parser, ]> { } export namespace UrlParser { export interface LineUrlParser extends Inline<'url/lineurl'>, Parser, Parser, ]>, ]> { } export interface BracketParser extends Inline<'url/bracket'>, Parser, Parser, Parser, SourceParser.UnescapableSourceParser, ]> { } } export interface EmailParser extends // user@host Inline<'email'>, Parser { } export interface AccountParser extends // @user // @user#tag Inline<'account'>, Parser { } export interface HashtagParser extends // #tag Inline<'hashtag'>, Parser { } export interface HashnumParser extends // #1 Inline<'hashnum'>, Parser { } export interface AnchorParser extends // >>1 Inline<'anchor'>, Parser { } } } export interface AutolinkParser extends Document<'autolink'>, Parser { } export namespace SourceParser { interface Source extends Document<`source/${T}`> { } export interface TextParser extends // abc Source<'text'>, Parser { } export interface TxtParser extends // abc Source<'txt'>, Parser { } export interface EscapableSourceParser extends // abc Source<'escsource'>, Parser { } export interface UnescapableSourceParser extends // abc Source<'unescsource'>, Parser { } export interface StrParser extends Source<'str'>, Parser { } export interface ContentLineParser extends Source<'contentline'>, Parser { } export interface EmptyLineParser extends Source<'emptyline'>, Parser { } export interface EmptySegmentParser extends Source<'emptysegment'>, Parser { } export interface AnyLineParser extends Source<'anyline'>, Parser { } } }