diff --git a/source/pandoc-blocks.adb b/source/pandoc-blocks.adb new file mode 100644 index 0000000..f108e01 --- /dev/null +++ b/source/pandoc-blocks.adb @@ -0,0 +1,59 @@ +package body Pandoc.Blocks is + + function Create_Block + (T : Object_Type; + Content : League.JSON.Values.JSON_Value) + return League.JSON.Values.JSON_Value + is + begin + return Create_Block (T, Empty_Attribute, Content); + end Create_Block; + + function Create_Block + (T : Object_Type; + Attr : League.JSON.Values.JSON_Value; + Content : League.JSON.Values.JSON_Value) + return League.JSON.Values.JSON_Value + is + Block : League.JSON.Objects.JSON_Object; + New_Content : League.JSON.Arrays.JSON_Array; + begin + + New_Content.Append (Attr); + New_Content.Append (Content); + + Block.Insert + (Type_String, League.JSON.Values.To_JSON_Value( Type_To_String (T))); + + Block.Insert (Content_String, New_Content); + + return Block.To_JSON_Value; + end Create_Block; + + function Raw_Block + (T : League.Strings.Universal_String; + Content : League.Strings.Universal_String) + return League.JSON.Values.JSON_Value + is + begin + return Raw_Block (Empty_Attribute, T, Content); + end Raw_Block; + + function Raw_Block + (Attr : League.JSON.Values.JSON_Value; + T : League.Strings.Universal_String; + Content : League.Strings.Universal_String + return League.JSON.Values.JSON_Value + is + Formatted_Content : League.JSON.Arrays.JSON_Array; + begin + Formatted_Content.Append ( + League.JSON.Values.To_JSON_Value (T)); + + Formatted_Content.Append ( + League.JSON.Values.To_JSON_Value (Content)); + + return Create_Block (Block_RawBlock, Attr, Formatted_Content); + end Raw_Block; + +end Pandoc.Blocks; diff --git a/source/pandoc-blocks.ads b/source/pandoc-blocks.ads new file mode 100644 index 0000000..159eb18 --- /dev/null +++ b/source/pandoc-blocks.ads @@ -0,0 +1,28 @@ +with League.JSON.Values; +with League.JSON.Arrays.JSON_Array; + +package Pandoc.Blocks is + + function Create_Block + (T : Object_Type; + Content : League.JSON.Values.JSON_Value) + return League.JSON.Values.JSON_Value; + + function Create_Block + (T : Object_Type; + Attr : League.JSON.Values.JSON_Value; + Content : League.JSON.Values.JSON_Value) + return League.JSON.Values.JSON_Value; + + function Raw_Block + (T : League.Strings.Universal_String; + Content : League.Strings.Universal_String) + return League.JSON.Values.JSON_Value; + + function Raw_Block + (Attr : League.JSON.Values.JSON_Value; + T : League.Strings.Universal_String; + Content : League.Strings.Universal_String) + return League.JSON.Values.JSON_Value; + +end Pandoc.Blocks; diff --git a/source/pandoc.adb b/source/pandoc.adb index cc6073b..1f89f42 100644 --- a/source/pandoc.adb +++ b/source/pandoc.adb @@ -1,183 +1,86 @@ -pragma Ada_2022; - package body Pandoc is - function Attr - (Key : League.Strings.Universal_String; - Value : League.Strings.Universal_String; - Id : League.Strings.Universal_String := - League.Strings.Empty_Universal_String) - return League.JSON.Values.JSON_Value is - (Attr (Id, [Key], [Value])); - - function Attr - (Id : League.Strings.Universal_String; - Key : String_Array; - Value : String_Array) return League.JSON.Values.JSON_Value - is - Outer : League.JSON.Arrays.JSON_Array; - Other : League.JSON.Arrays.JSON_Array; - Inner : League.JSON.Arrays.JSON_Array; - begin - Outer.Append (League.JSON.Values.To_JSON_Value (Id)); - Outer.Append (Other.To_JSON_Value); - - for K in Key'Range loop - declare - Pair : League.JSON.Arrays.JSON_Array; - begin - Pair.Append (League.JSON.Values.To_JSON_Value (Key (K))); - Pair.Append (League.JSON.Values.To_JSON_Value (Value (K))); - Inner.Append (Pair.To_JSON_Value); - end; - end loop; - - Outer.Append (Inner.To_JSON_Value); - - return Outer.To_JSON_Value; - end Attr; - - function Div ( - Attr : League.JSON.Values.JSON_Value; - Content : Content_Arr) return League.JSON.Values.JSON_Value - is - Block : League.JSON.Objects.JSON_Object; - Out_Content : League.JSON.Arrays.JSON_Array; - Content_Block : League.JSON.Arrays.JSON_Array; - begin - Block.Insert ( - Type_String, - League.JSON.Values.To_JSON_Value ( - Obj_String_Representation (Block_Div) - ) - ); - - for C in Content'Range loop - Content_Block.Append (Content (C)); - end loop; - - Out_Content.Append (Attr); - Out_Content.Append (Content_Block.To_JSON_Value); - - Block.Insert ( - Content_String, - Out_Content.To_JSON_Value - ); - - return Block.To_JSON_Value; - end Div; - - function Div - (Attr : League.JSON.Values.JSON_Value; - Content : League.JSON.Values.JSON_Value) - return League.JSON.Values.JSON_Value - is - Block : League.JSON.Objects.JSON_Object; - Out_Content : League.JSON.Arrays.JSON_Array; - begin - Block.Insert ( - Type_String, - League.JSON.Values.To_JSON_Value ( - Obj_String_Representation (Block_Div) - ) - ); - - Out_Content.Append (Attr); - Out_Content.Append (Content); - - Block.Insert ( - Content_String, - Out_Content.To_JSON_Value - ); - - return Block.To_JSON_Value; - end Div; - - function HTML_Block (Text : League.Strings.Universal_String) return - League.JSON.Values.JSON_Value - is - Output : League.JSON.Objects.JSON_Object; - Content_Arr : League.JSON.Arrays.JSON_Array; - begin - Output.Insert ( - Type_String, - League.JSON.Values.To_JSON_Value (+"RawBlock")); - - Content_Arr.Append ( - League.JSON.Values.To_JSON_Value (+"html")); - - Content_Arr.Append ( - League.JSON.Values.To_JSON_Value (Text)); - - Output.Insert ( - Content_String, - Content_Arr.To_JSON_Value); - - return Output.To_JSON_Value; - end HTML_Block; - - function Plain (Inlines : League.JSON.Values.JSON_Value) return - League.JSON.Values.JSON_Value - is - Output : League.JSON.Objects.JSON_Object; - begin - Output.Insert ( - Type_String, - League.JSON.Values.To_JSON_Value (+"Plain")); - - Output.Insert ( - Content_String, - Inlines); - - return Output.To_JSON_Value; - end Plain; - - function Definition_List (B : League.JSON.Objects.JSON_Object) return - League.JSON.Arrays.JSON_Array - is - Output : League.JSON.Arrays.JSON_Array; - Content : constant League.JSON.Arrays.JSON_Array := - B (Content_String).To_Array; - begin - Output.Append (HTML_Block (+"
")); - - for I in 1 .. Content.Length loop - declare - Def_Item : constant League.JSON.Arrays.JSON_Array := - Content (I).To_Array; - Def_Header : constant League.JSON.Arrays.JSON_Array := - Def_Item (1).To_Array; - Def_Content : constant League.JSON.Arrays.JSON_Array := - Def_Item (2).To_Array; - begin - Output.Append (HTML_Block (+"
")); - Output.Append (Plain (Def_Header.To_JSON_Value)); - Output.Append (HTML_Block (+"
")); - - for J in 1 .. Def_Content.Length loop - declare - Def_Sub_Content : constant League.JSON.Arrays.JSON_Array := - Def_Content (J).To_Array; - begin - for K in 1 .. Def_Sub_Content.Length loop - Output.Append (Def_Sub_Content (K)); - end loop; - end; - end loop; - - Output.Append (HTML_Block (+"
")); - end; - end loop; - - Output.Append (HTML_Block (+"
")); - - return Output; - - end Definition_List; - function Get_Type (B : League.JSON.Objects.JSON_Object) return Object_Type is (Type_Mapping (B (Type_String).To_String)); + function Type_To_String (T : Object_Type) + return League.Strings.Universal_String + is + begin + return Obj_String_Representation (T); + end Type_To_String; + + function Attr + (Id : League.Strings.Universal_String; + Key : League.Strings.Universal_String; + Value : League.Strings.Universal_String) + return League.JSON.Values.JSON_Value + is + Key_Value_Pair : League.JSON.Arrays.JSON_Array; + Attr_Map : League.JSON.Arrays.JSON_Array; + Attr : League.JSON.Arrays.JSON_Array; + begin + Key_Value_Pair.Append ( + League.JSON.Values.To_JSON_Value (Key)); + Key_Value_Pair.Append ( + League.JSON.Values.To_JSON_Value (Value)); + + Attr_Map.Append (Key_Value_Pair.To_JSON_Value); + + Attr.Append ( + League.JSON.Values.To_JSON_Value (Id)); + + Attr.Append (Attr_Map.To_JSON_Value); + + return Attr.To_JSON_Value; + end Attr; + + function Attr + (Id : League.Strings.Universal_String; + Key_Value : Key_Value_Pairs) + return League.JSON.Values.JSON_Value + is + Attr_Map : League.JSON.Arrays.JSON_Array; + Attr : League.JSON.Arrays.JSON_Array; + begin + + for J in Key_Value'Range loop + declare + Pair : League.JSON.Arrays.JSON_Array; + begin + Pair.Append ( + League.JSON.Values.To_JSON_Value (Key_Value (J).Key)); + Pair.Append ( + League.JSON.Values.To_JSON_Value (Key_Value (J).Value)); + + Attr_Map.Append (Pair.To_JSON_Value); + end; + end loop; + + Attr.Append ( + League.JSON.Values.To_JSON_Value (Id)); + + Attr.Append (Attr_Map.To_JSON_Value); + + return Attr.To_JSON_Value; + end Attr; + + function Attr + (Key : League.Strings.Universal_String; + Value : League.Strings.Universal_String) + return League.JSON.Values.JSON_Value + is + begin + return Attr (+"", Key, Value); + end Attr; + + function Attr (Key_Value : Key_Value_Pairs) + return League.JSON.Values.JSON_Value + is + begin + return Attr (+"", Key_Value); + end Attr; + begin for Key in Object_Type loop diff --git a/source/pandoc.ads b/source/pandoc.ads index 1128702..1d7b613 100644 --- a/source/pandoc.ads +++ b/source/pandoc.ads @@ -1,3 +1,5 @@ +pragma Ada_2022; + with Ada.Containers; with Ada.Containers.Hashed_Maps; with League.JSON.Objects; @@ -8,9 +10,6 @@ with League.JSON.Arrays; package Pandoc is - type String_Array is array (Natural range <>) of - League.Strings.Universal_String; - type Object_Type is (Block_Plain, Block_Para, @@ -47,51 +46,55 @@ package Pandoc is Inline_Note, Inline_Span); - type Content_Arr is array (Natural range <>) - of League.JSON.Values.JSON_Value; + type Key_Value_Pair is + record + Key : League.Strings.Universal_String; + Value : League.Strings.Universal_String; + end record; + + type Key_Value_Pairs is array (Natural range <>) of Key_Value_Pair; function Get_Type (B : League.JSON.Objects.JSON_Object) return Object_Type; + function Type_To_String (T : Object_Type) + return League.Strings.Universal_String; + + Type_String : constant League.Strings.Universal_String := + League.Strings.To_Universal_String ("t"); + + Content_String : constant League.Strings.Universal_String := + League.Strings.To_Universal_String ("c"); + + function Attr + (Id : League.Strings.Universal_String; + Key : League.Strings.Universal_String; + Value : League.Strings.Universal_String) + return League.JSON.Values.JSON_Value; + + function Attr + (Id : League.Strings.Universal_String; + Key_Value : Key_Value_Pairs) + return League.JSON.Values.JSON_Value; + + function Attr + (Key : League.Strings.Universal_String; + Value : League.Strings.Universal_String) + return League.JSON.Values.JSON_Value; + + function Attr (Key_Value : Key_Value_Pairs) + return League.JSON.Values.JSON_Value; + + Empty_Attribute : constant League.JSON.Values.JSON_Value := Attr([]); + +private + + type String_Array is array (Natural range <>) of + League.Strings.Universal_String; function "+" (T : Wide_Wide_String) return League.Strings.Universal_String renames League.Strings.To_Universal_String; - function Attr - (Key : League.Strings.Universal_String; - Value : League.Strings.Universal_String; - Id : League.Strings.Universal_String := - League.Strings.Empty_Universal_String) - return League.JSON.Values.JSON_Value; - - function Attr - (Id : League.Strings.Universal_String; - Key : String_Array; - Value : String_Array) return League.JSON.Values.JSON_Value; - - function Div - (Attr : League.JSON.Values.JSON_Value; - Content : Content_Arr) return League.JSON.Values.JSON_Value; - - function Div - (Attr : League.JSON.Values.JSON_Value; - Content : League.JSON.Values.JSON_Value) - return League.JSON.Values.JSON_Value; - - function HTML_Block (Text : League.Strings.Universal_String) - return League.JSON.Values.JSON_Value; - - function Plain (Inlines : League.JSON.Values.JSON_Value) return - League.JSON.Values.JSON_Value; - - function Definition_List (B : League.JSON.Objects.JSON_Object) return - League.JSON.Arrays.JSON_Array; - - Type_String : constant League.Strings.Universal_String := +"t"; - Content_String : constant League.Strings.Universal_String := +"c"; - -private - Obj_String_Representation : - constant array (Object_Type) of League.Strings.Universal_String := ( + constant array (Object_Type) of League.Strings.Universal_String := [ +"Plain", +"Para", +"LineBlock", @@ -126,7 +129,7 @@ private +"Image", +"Note", +"Span" - ); + ]; package Type_Map is new Ada.Containers.Hashed_Maps ( Key_Type => League.Strings.Universal_String, @@ -134,6 +137,6 @@ private Hash => League.Strings.Hash, Equivalent_Keys => League.Strings."="); - Type_Mapping : Type_Map.Map := Type_Map.Empty; + Type_Mapping : constant Type_Map.Map := Type_Map.Empty_Map; end Pandoc;