--
-- Copyright (C) 2021-2023, AdaCore
--
-- SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
--
-- Simple inline elements (like code spans, auto links, raw html, etc) contain
-- no nested elements and all have the same priority (are processed in
-- left-to-right order).
with Ada.Containers.Vectors;
with VSS.Strings.Cursors;
with VSS.Strings.Cursors.Markers;
with Markdown.Annotations;
package Markdown.Simple_Inline_Parsers is
pragma Preelaborate;
type Inline_Span (Is_Set : Boolean := False) is record
case Is_Set is
when True =>
From, To : VSS.Strings.Cursors.Markers.Character_Marker;
-- Markers in the original Text
Plain_Text : VSS.Strings.Virtual_String;
Annotation : Markdown.Annotations.Annotation_Vectors.Vector;
when False =>
null;
end case;
end record;
type Inline_Span_Wrapper is record
Element : Inline_Span;
end record;
-- To be able to update an element of a vector through implicit reference.
type Simple_Inline_Parser_Access is access procedure
(Text : VSS.Strings.Virtual_String;
From : VSS.Strings.Cursors.Abstract_Character_Cursor'Class;
Span : out Inline_Span);
-- Find next inline element in Text staring From given position. Return
-- `Is_Set => False` if not found.
package Simple_Parser_Vectors is new Ada.Containers.Vectors
(Positive, Simple_Inline_Parser_Access);
package Inline_Span_Vectors is new Ada.Containers.Vectors
(Positive, Inline_Span_Wrapper);
procedure Initialize
(Parsers : Simple_Parser_Vectors.Vector;
Text : VSS.Strings.Virtual_String;
From : VSS.Strings.Cursors.Abstract_Character_Cursor'Class;
State : out Inline_Span_Vectors.Vector)
with Post => Parsers.Last_Index = State.Last_Index;
-- For each parser find the very first occurrence in the Text and put it
-- into State (with corresponding index).
procedure Get_Next_Inline
(Parsers : Simple_Parser_Vectors.Vector;
Text : VSS.Strings.Virtual_String;
State : in out Inline_Span_Vectors.Vector;
Value : out Inline_Span)
with
Pre => Parsers.Last_Index = State.Last_Index,
Post => Parsers.Last_Index = State.Last_Index;
-- Find next simple inline in the Text and return it in Value. Return
-- `Value => (Is_Set => False)` if no more simple inline elements in the
-- Text. Update State vector as needed.
end Markdown.Simple_Inline_Parsers;