Changeset 25


Ignore:
Timestamp:
Jun 3, 2014, 3:03:22 AM (7 years ago)
Author:
vadim.godunko
Message:

Rewrite block parser handling. It handles sequence of paragraphs
correctly.

Location:
trunk/forge/source/wiki
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/forge/source/wiki/forge-wiki-parsers.adb

    r24 r25  
    170170    (Self : in out Wiki_Parser'Class; Data : League.Strings.Universal_String)
    171171   is
    172       Lines  : constant League.String_Vectors.Universal_String_Vector
     172      Lines       : constant League.String_Vectors.Universal_String_Vector
    173173        := Data.Split (League.Characters.Latin.Line_Feed);
    174       Line   : Positive := 1;
    175       Match  : League.Regexps.Regexp_Match;
    176       Offset : Natural;
    177       Found  : Boolean;
     174      Line        : Positive := 1;
     175      Match       : League.Regexps.Regexp_Match;
     176      Text_Offset : Natural;
     177      Found       : Boolean;
     178      Next_Block  : Block_Parser_Access;
    178179
    179180   begin
    180181      Self.Initialize_Block_Regexp;
     182      Self.Is_Separated := True;
    181183      Self.Block_State := null;
    182184
     
    190192                 <= Match.Last_Index (Item.Match_Group)
    191193            then
    192                Offset := Match.First_Index (Item.Match_Group);
    193 
    194                if Self.Block_State = null then
    195                   Self.Block_State :=
     194               Text_Offset := Match.First_Index (Item.Offset_Group);
     195
     196               if Item.Is_Start
     197                 or else Self.Is_Separated
     198               then
     199                  Self.Is_Separated := False;
     200                  Put_Line (Standard_Error, ">>> new block parser created <<<");
     201                  Put_Line (Standard_Error, Ada.Tags.External_Tag (Item.Parser_Tag));
     202                  Next_Block :=
    196203                    Create_Block_Parser
    197204                     (Item.Parser_Tag,
     
    201208                      (if Item.Markup_Group = 0
    202209                         then 0 else Match.First_Index (Item.Markup_Group)),
    203                       Offset);
     210                      Text_Offset);
     211
     212                  if Self.Block_State /= null then
     213                     Self.Block_State.End_Block (Next_Block);
     214                  end if;
     215
     216                  Free (Self.Block_State);
     217                  Self.Block_State := Next_Block;
     218                  Next_Block := null;
     219
    204220                  Self.Block_State.Start_Block;
    205                   Self.Block_State.Line (Lines (Line).Tail_From (Offset));
    206 
    207                else
    208                   if Item.Is_Start then
    209                      Put_Line (Standard_Error, "WARNING!");
    210                      --  This is start of next block element, not handled right
    211                      --  now.
    212                   end if;
    213 
    214                   Self.Block_State.Line (Lines (Line).Tail_From (Offset));
    215221               end if;
     222
     223               Self.Block_State.Line (Lines (Line).Tail_From (Text_Offset));
    216224
    217225               Found := True;
     
    222230
    223231         if not Found then
    224             Self.Block_State.End_Block;
    225             Free (Self.Block_State);
    226 
    227             if not Self.Block_Stack.Is_Empty then
    228                Self.Block_State := Self.Block_Stack.Last_Element;
    229                Self.Block_Stack.Delete_Last;
    230             end if;
     232            --  It means that separator line's regular expression was matched,
     233            --  mark last block as explicitly separated.
     234
     235            Self.Is_Separated := True;
    231236         end if;
    232237
    233238         Line := Line + 1;
    234239      end loop;
     240
     241      if Self.Block_State /= null then
     242         Self.Block_State.End_Block (null);
     243      end if;
    235244   end Parse;
    236245
  • trunk/forge/source/wiki/forge-wiki-parsers.ads

    r23 r25  
    143143      Block_State     : Block_Parser_Access;
    144144      Block_Stack     : Block_Parser_Vectors.Vector;
     145      Is_Separated    : Boolean;
    145146   end record;
    146147
Note: See TracChangeset for help on using the changeset viewer.