///|
/// Parse cpdf's plain text bookmark-file format.
///
/// The input is byte-oriented. Bookmark titles are double-quoted UTF-8 text
/// with cpdf's `\\`, `\"`, and `\n` escapes; optional destinations are
/// double-quoted PDF object snippets such as `[1 /Fit]`.
pub fn PdfDocument::parse_bookmark_text(
  self : PdfDocument,
  data : BytesView,
  verify? : Bool = true,
) -> Array[@bookmark.PdfBookmark] raise @core.PdfError {
  let bookmarks : Array[@bookmark.PdfBookmark] = []
  let cursor = @core.byte_cursor_of_view(data)
  for line_number, line in cursor.read_line_views() {
    match self.pdf_bookmark_import_parse_line(line, line_number + 1) {
      Some(bookmark) => bookmarks.push(bookmark)
      None => ()
    }
  }
  if verify && !self.pdf_bookmark_import_verify(bookmarks) {
    raise SoftError(
      "Bad bookmark file (References non-existant pages or is malformed)",
    )
  }
  bookmarks
}

///|
/// Return a copy of the document with bookmarks imported from cpdf text bytes.
pub fn PdfDocument::add_bookmarks_from_text(
  self : PdfDocument,
  data : BytesView,
  verify? : Bool = true,
) -> PdfDocument raise @core.PdfError {
  self.add_bookmarks(self.parse_bookmark_text(data, verify~))
}

///|
/// Compatibility wrapper for `PdfDocument::parse_bookmark_text`.
pub fn pdf_parse_bookmark_text(
  verify : Bool,
  data : BytesView,
  document : PdfDocument,
) -> Array[@bookmark.PdfBookmark] raise @core.PdfError {
  document.parse_bookmark_text(data, verify~)
}

///|
/// Compatibility wrapper matching cpdfbookmarks' plain `parse_bookmark_file`.
pub fn pdf_parse_bookmark_file(
  verify : Bool,
  document : PdfDocument,
  data : BytesView,
) -> Array[@bookmark.PdfBookmark] raise @core.PdfError {
  document.parse_bookmark_text(data, verify~)
}

///|
/// Compatibility wrapper for `PdfDocument::add_bookmarks_from_text`.
pub fn pdf_add_bookmarks_from_text(
  verify : Bool,
  data : BytesView,
  document : PdfDocument,
) -> PdfDocument raise @core.PdfError {
  document.add_bookmarks_from_text(data, verify~)
}