-- -- Copyright (C) 2021-2023, AdaCore -- -- SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -- with Ada.Containers.Vectors; with Markdown.Documents; with VSS.Strings; with Markdown.Implementation; with Markdown.Inline_Parsers; package Markdown.Parsers is pragma Preelaborate; type Markdown_Parser is tagged limited private; -- Markdown parser representation procedure Parse_Line (Self : in out Markdown_Parser'Class; Line : VSS.Strings.Virtual_String); -- Parse next line of Markdown text and update internal state of the parser function Document (Self : in out Markdown_Parser) return Markdown.Documents.Document; -- Return parsed document. After this call the Parse_Line has no effect. private use Markdown.Implementation; package Block_Vectors is new Ada.Containers.Vectors (Positive, Abstract_Block_Access); type Abstract_Container_Block_Access is access all Abstract_Container_Block'Class; package Container_Vectors is new Ada.Containers.Vectors (Positive, Abstract_Container_Block_Access); package Block_Detector_Vectors is new Ada.Containers.Vectors (Positive, Block_Detector); type Parser_State is (Initial, Started, Completed); type Markdown_Parser is tagged limited record State : Parser_State := Initial; Document : Markdown.Documents.Document; -- Resulting markdown document Open : Container_Vectors.Vector; -- Current open container blocks, e.g. block-quote Open_Leaf : Abstract_Block_Access; -- Current open non-container block (if any), e.g. paragraph Block_Detectors : Block_Detector_Vectors.Vector; -- Known block detectors Inline_Parser : Markdown.Inline_Parsers.Inline_Parser; -- Parser of inline markups (links, emphasis, code spans, etc) end record; procedure Register_Block (Self : in out Markdown_Parser'Class; Detector : Block_Detector); -- Let the parser know a new block kind end Markdown.Parsers;