# HG changeset patch # User G. Eyaeb # Date 1606781321 -28800 # Tue Dec 01 08:08:41 2020 +0800 # Node ID 271545a1a052c2637b369cd1dee5951fc9c20006 # Parent 7c50ba9df3a67cd8e225bedc38662b20ab1db2ad Make naming of pointers a bit more consistent diff --git a/src/Pdftotext/Internal.hs b/src/Pdftotext/Internal.hs --- a/src/Pdftotext/Internal.hs +++ b/src/Pdftotext/Internal.hs @@ -66,7 +66,9 @@ pageNumber :: Int, -- | Total number of pages in original document. pageOutOf :: Int, - pageDocument :: ForeignPtr Poppler_Document, + -- | Pointer to document which created this page. + pageDocumentPtr :: ForeignPtr Poppler_Document, + -- | Pointer to this page. pagePtr :: ForeignPtr Poppler_Page } @@ -91,46 +93,46 @@ openFile :: FilePath -> IO (Maybe Document) openFile file = withCString file \cfile -> do - docptr <- ffiOpenPdf cfile - if docptr == nullPtr + ptr <- ffiOpenPdf cfile + if ptr == nullPtr then return Nothing - else Just . Document <$> newForeignPtr ffiDocumentDelete docptr + else Just . Document <$> newForeignPtr ffiDocumentDelete ptr -- | Open PDF represented as bytestring. If document cannot be parsed as valid PDF, -- `Nothing` is returned. openByteStringIO :: ByteString -> IO (Maybe Document) -openByteStringIO (PS ptr _ len) = - withForeignPtr ptr \d -> do - docptr <- ffiOpenData d (fromIntegral len) +openByteStringIO (PS bsfptr _ len) = + withForeignPtr bsfptr \bsptr -> do + docptr <- ffiOpenData bsptr (fromIntegral len) if docptr == nullPtr then return Nothing else Just . Document <$> newForeignPtr ffiDocumentDelete docptr -- | Return all pages from document. pagesIO :: Document -> IO [Page] -pagesIO (Document doc) = do - withForeignPtr doc \docptr -> do - pageno <- ffiDocumentPages docptr +pagesIO (Document fptr) = do + withForeignPtr fptr \ptr -> do + pageno <- ffiDocumentPages ptr forM [0 .. pageno - 1] \pno -> do - p <- ffiDocumentOpenPage docptr pno >>= newForeignPtr ffiPageDelete - return $ Page (fromIntegral pno + 1) (fromIntegral pageno) doc p + p <- ffiDocumentOpenPage ptr pno >>= newForeignPtr ffiPageDelete + return $ Page (fromIntegral pno + 1) (fromIntegral pageno) fptr p -- | Return page number 'no' from PDF document, if the page exists. pageIO :: Int -> Document -> IO (Maybe Page) -pageIO no d@(Document docptr) = withForeignPtr docptr \ptr -> do - pno <- pagesTotalIO d +pageIO no doc@(Document fptr) = withForeignPtr fptr \ptr -> do + pno <- pagesTotalIO doc if no > 0 && no <= pno - then Just . Page no pno docptr <$> (ffiDocumentOpenPage ptr (fromIntegral no - 1) >>= newForeignPtr ffiPageDelete) + then Just . Page no pno fptr <$> (ffiDocumentOpenPage ptr (fromIntegral no - 1) >>= newForeignPtr ffiPageDelete) else return Nothing -- | Return number of pages contained in document. pagesTotalIO :: Document -> IO Int -pagesTotalIO (Document doc) = - fromIntegral <$> withForeignPtr doc ffiDocumentPages +pagesTotalIO (Document fptr) = + fromIntegral <$> withForeignPtr fptr ffiDocumentPages -- | Extract text from a page with given 'Layout'. pageTextIO :: Layout -> Page -> IO T.Text -pageTextIO layout (Page _ _ _ ptr) = withForeignPtr ptr \p -> asText (ffiPageText p l) +pageTextIO layout (Page _ _ _ fptr) = withForeignPtr fptr \ptr -> asText (ffiPageText ptr l) where l = case layout of @@ -142,14 +144,14 @@ -- -- @since 0.0.2.0 propertiesIO :: Document -> IO Properties -propertiesIO (Document docptr) = withForeignPtr docptr \doc -> do - a <- asText $ ffiDocumentAuthor doc - c <- asText $ ffiDocumentCreator doc - k <- asText $ ffiDocumentKeywords doc - m <- asText $ ffiDocumentMetadata doc - p <- asText $ ffiDocumentProducer doc - s <- asText $ ffiDocumentSubject doc - t <- asText $ ffiDocumentTitle doc +propertiesIO (Document fptr) = withForeignPtr fptr \ptr -> do + a <- asText $ ffiDocumentAuthor ptr + c <- asText $ ffiDocumentCreator ptr + k <- asText $ ffiDocumentKeywords ptr + m <- asText $ ffiDocumentMetadata ptr + p <- asText $ ffiDocumentProducer ptr + s <- asText $ ffiDocumentSubject ptr + t <- asText $ ffiDocumentTitle ptr return $ Properties (f a) (f c) (f k) (f m) (f p) (f s) (f t) where f x =