Note:

You are viewing a development version of the library. Goto the latest version.

let of_string str =
  let lst = OASISString.split_newline ~do_trim:false str in
  let is_verbatim = OASISString.starts_with ~what:" " in
  let rec parse =
    function
      (* End of string special cases. *)
      | [""""->
          [`BlankLine]
      | [str; ""->
          if is_verbatim str then
            [`Verbatim str; `BlankLine]
          else
            [`ContPara str; `BlankLine]

      | "" :: "" :: tl ->
          `BlankLine :: (parse tl)

      | str1 :: "" :: str2 :: tl when is_verbatim str2 ->
          `ContPara str1 :: `BlankLine :: `Verbatim str2 :: (parse tl)

      | str :: "" :: tl ->
          if is_verbatim str then
            (`Verbatim str) :: `BlankLine :: (parse tl)
          else
            (`ContPara str) :: `EndPara :: (parse tl)
      | str :: tl ->
          if is_verbatim str then
            (`Verbatim str) :: (parse tl)
          else
            (`ContPara str) :: (parse tl)
      | [] ->
          []
  in
  let rec join_para =
    function
      | `ContPara str1 :: `ContPara str2 :: tl ->
          join_para ((`ContPara (str1 ^ " " ^ str2)) :: tl)
      | `EndPara :: tl ->
          join_para tl
      | (`Verbatim _ | `ContPara _ | `BlankLineas e :: tl ->
          e :: join_para tl
      | [] ->
          []
  in
    List.map
      (function
         | `ContPara str -> Para str
         | `Verbatim str ->
             Verbatim (String.sub str 1 ((String.length str) - 1))
         | `BlankLine -> BlankLine)
      (join_para (parse lst))