1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103 | --
-- Copyright (C) 2021-2023, AdaCore
--
-- SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
--
with VSS.Regular_Expressions;
package body Markdown.Implementation.ATX_Headings is
Prefix_Pattern : constant Wide_Wide_String :=
"^(?: | | |)(######|#####|####|###|##|#)(?: |$)";
Suffix_Pattern : constant Wide_Wide_String := " +#* *$";
Prefix : VSS.Regular_Expressions.Regular_Expression;
-- Regexp of Prefix_Pattern
Suffix : VSS.Regular_Expressions.Regular_Expression;
-- Regexp of Suffix_Pattern
----------------------
-- Complete_Parsing --
----------------------
overriding procedure Complete_Parsing
(Self : in out ATX_Heading;
Parser : Markdown.Inline_Parsers.Inline_Parser) is
begin
Self.Parser := Parser'Unchecked_Access;
end Complete_Parsing;
------------
-- Create --
------------
overriding function Create
(Input : not null access Input_Position) return ATX_Heading
is
Prefix_Match : constant VSS.Regular_Expressions.Regular_Expression_Match
:= Prefix.Match (Input.Line.Expanded, Input.First);
Suffix_Match : constant VSS.Regular_Expressions.Regular_Expression_Match
:= Suffix.Match (Input.Line.Expanded, Input.First);
begin
pragma Assert (Prefix_Match.Has_Match);
return Result : ATX_Heading do
Result.Level := Positive (Prefix_Match.Marker (1).Character_Length);
Input.First.Set_At (Prefix_Match.Last_Marker);
if Suffix_Match.Has_Match then
declare
Last : VSS.Strings.Character_Iterators.Character_Iterator;
Ignore : Boolean;
begin
Last.Set_At (Suffix_Match.First_Marker);
Ignore := Last.Backward;
Result.Title := Input.Line.Unexpanded_Tail (Input.First, Last);
end;
else
Result.Title := Input.Line.Unexpanded_Tail (Input.First);
end if;
-- Shift Input.First to end-of-line
Input.First.Set_After_Last (Input.Line.Expanded);
end return;
end Create;
--------------
-- Detector --
--------------
procedure Detector
(Input : Input_Position;
Tag : in out Ada.Tags.Tag;
CIP : out Can_Interrupt_Paragraph)
is
Match : VSS.Regular_Expressions.Regular_Expression_Match;
begin
if not Prefix.Is_Valid then -- Construct Prefix regexp
Prefix := VSS.Regular_Expressions.To_Regular_Expression
(VSS.Strings.To_Virtual_String (Prefix_Pattern));
Suffix := VSS.Regular_Expressions.To_Regular_Expression
(VSS.Strings.To_Virtual_String (Suffix_Pattern));
pragma Assert (Prefix.Is_Valid and Suffix.Is_Valid);
end if;
CIP := True; -- Suppress a warning about uninitialized parameter
Match := Prefix.Match (Input.Line.Expanded, Input.First);
if Match.Has_Match then
Tag := ATX_Heading'Tag;
end if;
end Detector;
end Markdown.Implementation.ATX_Headings;
|