Blame src/Text/Pandoc/Logging.hs

Packit Service d2f85f
{-# LANGUAGE DeriveDataTypeable #-}
Packit Service d2f85f
{-# LANGUAGE DeriveGeneric      #-}
Packit Service d2f85f
{-# LANGUAGE OverloadedStrings  #-}
Packit Service d2f85f
{-
Packit Service d2f85f
Copyright (C) 2016-17 John MacFarlane <jgm@berkeley.edu>
Packit Service d2f85f
Packit Service d2f85f
This program is free software; you can redistribute it and/or modify
Packit Service d2f85f
it under the terms of the GNU General Public License as published by
Packit Service d2f85f
the Free Software Foundation; either version 2 of the License, or
Packit Service d2f85f
(at your option) any later version.
Packit Service d2f85f
Packit Service d2f85f
This program is distributed in the hope that it will be useful,
Packit Service d2f85f
but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service d2f85f
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service d2f85f
GNU General Public License for more details.
Packit Service d2f85f
Packit Service d2f85f
You should have received a copy of the GNU General Public License
Packit Service d2f85f
along with this program; if not, write to the Free Software
Packit Service d2f85f
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit Service d2f85f
-}
Packit Service d2f85f
{- |
Packit Service d2f85f
   Module      : Text.Pandoc.Logging
Packit Service d2f85f
   Copyright   : Copyright (C) 2006-2017 John MacFarlane
Packit Service d2f85f
   License     : GNU GPL, version 2 or above
Packit Service d2f85f
Packit Service d2f85f
   Maintainer  : John MacFarlane <jgm@berkeley.edu>
Packit Service d2f85f
   Stability   : alpha
Packit Service d2f85f
   Portability : portable
Packit Service d2f85f
Packit Service d2f85f
This module provides data types and functions for warnings
Packit Service d2f85f
and info messages.
Packit Service d2f85f
Packit Service d2f85f
-}
Packit Service d2f85f
module Text.Pandoc.Logging (
Packit Service d2f85f
    Verbosity(..)
Packit Service d2f85f
  , LogMessage(..)
Packit Service d2f85f
  , encodeLogMessages
Packit Service d2f85f
  , showLogMessage
Packit Service d2f85f
  , messageVerbosity
Packit Service d2f85f
  ) where
Packit Service d2f85f
Packit Service d2f85f
import Control.Monad (mzero)
Packit Service d2f85f
import Data.Aeson
Packit Service d2f85f
import Data.Aeson.Encode.Pretty (Config (..), defConfig, encodePretty',
Packit Service d2f85f
                                 keyOrder)
Packit Service d2f85f
import qualified Data.ByteString.Lazy as BL
Packit Service d2f85f
import Data.Data (Data, toConstr)
Packit Service d2f85f
import Data.List (isSuffixOf)
Packit Service d2f85f
import qualified Data.Text as Text
Packit Service d2f85f
import Data.Typeable (Typeable)
Packit Service d2f85f
import GHC.Generics (Generic)
Packit Service d2f85f
import Text.Pandoc.Definition
Packit Service d2f85f
import Text.Parsec.Pos
Packit Service d2f85f
Packit Service d2f85f
-- | Verbosity level.
Packit Service d2f85f
data Verbosity = ERROR | WARNING | INFO
Packit Service d2f85f
     deriving (Show, Read, Eq, Data, Enum, Ord, Bounded, Typeable, Generic)
Packit Service d2f85f
Packit Service d2f85f
instance ToJSON Verbosity where
Packit Service d2f85f
  toJSON x = toJSON (show x)
Packit Service d2f85f
instance FromJSON Verbosity where
Packit Service d2f85f
  parseJSON (String t) =
Packit Service d2f85f
    case t of
Packit Service d2f85f
         "ERROR"   -> return ERROR
Packit Service d2f85f
         "WARNING" -> return WARNING
Packit Service d2f85f
         "INFO"    -> return INFO
Packit Service d2f85f
         _         -> mzero
Packit Service d2f85f
  parseJSON _      =  mzero
Packit Service d2f85f
Packit Service d2f85f
data LogMessage =
Packit Service d2f85f
    SkippedContent String SourcePos
Packit Service d2f85f
  | CouldNotParseYamlMetadata String SourcePos
Packit Service d2f85f
  | DuplicateLinkReference String SourcePos
Packit Service d2f85f
  | DuplicateNoteReference String SourcePos
Packit Service d2f85f
  | NoteDefinedButNotUsed String SourcePos
Packit Service d2f85f
  | DuplicateIdentifier String SourcePos
Packit Service d2f85f
  | ReferenceNotFound String SourcePos
Packit Service d2f85f
  | CircularReference String SourcePos
Packit Service d2f85f
  | UndefinedToggle String SourcePos
Packit Service d2f85f
  | ParsingUnescaped String SourcePos
Packit Service d2f85f
  | CouldNotLoadIncludeFile String SourcePos
Packit Service d2f85f
  | MacroAlreadyDefined String SourcePos
Packit Service d2f85f
  | InlineNotRendered Inline
Packit Service d2f85f
  | BlockNotRendered Block
Packit Service d2f85f
  | DocxParserWarning String
Packit Service d2f85f
  | CouldNotFetchResource String String
Packit Service d2f85f
  | CouldNotDetermineImageSize String String
Packit Service d2f85f
  | CouldNotConvertImage String String
Packit Service d2f85f
  | CouldNotDetermineMimeType String
Packit Service d2f85f
  | CouldNotConvertTeXMath String String
Packit Service d2f85f
  | CouldNotParseCSS String
Packit Service d2f85f
  | Fetching String
Packit Service d2f85f
  | Extracting String
Packit Service d2f85f
  | NoTitleElement String
Packit Service d2f85f
  | NoLangSpecified
Packit Service d2f85f
  | InvalidLang String
Packit Service d2f85f
  | CouldNotHighlight String
Packit Service d2f85f
  | MissingCharacter String
Packit Service d2f85f
  | Deprecated String String
Packit Service d2f85f
  | NoTranslation String
Packit Service d2f85f
  | CouldNotLoadTranslations String String
Packit Service d2f85f
  deriving (Show, Eq, Data, Ord, Typeable, Generic)
Packit Service d2f85f
Packit Service d2f85f
instance ToJSON LogMessage where
Packit Service d2f85f
  toJSON x = object $
Packit Service d2f85f
    "verbosity" .= toJSON (messageVerbosity x) :
Packit Service d2f85f
    "type" .= toJSON (show $ toConstr x) :
Packit Service d2f85f
    case x of
Packit Service d2f85f
      SkippedContent s pos ->
Packit Service d2f85f
           ["contents" .= Text.pack s,
Packit Service d2f85f
            "source" .= Text.pack (sourceName pos),
Packit Service d2f85f
            "line" .= sourceLine pos,
Packit Service d2f85f
            "column" .= sourceColumn pos]
Packit Service d2f85f
      CouldNotParseYamlMetadata s pos ->
Packit Service d2f85f
           ["message" .= Text.pack s,
Packit Service d2f85f
            "source" .= Text.pack (sourceName pos),
Packit Service d2f85f
            "line" .= toJSON (sourceLine pos),
Packit Service d2f85f
            "column" .= toJSON (sourceColumn pos)]
Packit Service d2f85f
      DuplicateLinkReference s pos ->
Packit Service d2f85f
           ["contents" .= Text.pack s,
Packit Service d2f85f
            "source" .= Text.pack (sourceName pos),
Packit Service d2f85f
            "line" .= toJSON (sourceLine pos),
Packit Service d2f85f
            "column" .= toJSON (sourceColumn pos)]
Packit Service d2f85f
      NoteDefinedButNotUsed s pos ->
Packit Service d2f85f
           ["key" .= Text.pack s,
Packit Service d2f85f
            "source" .= Text.pack (sourceName pos),
Packit Service d2f85f
            "line" .= toJSON (sourceLine pos),
Packit Service d2f85f
            "column" .= toJSON (sourceColumn pos)]
Packit Service d2f85f
      DuplicateNoteReference s pos ->
Packit Service d2f85f
           ["contents" .= Text.pack s,
Packit Service d2f85f
            "source" .= Text.pack (sourceName pos),
Packit Service d2f85f
            "line" .= toJSON (sourceLine pos),
Packit Service d2f85f
            "column" .= toJSON (sourceColumn pos)]
Packit Service d2f85f
      DuplicateIdentifier s pos ->
Packit Service d2f85f
           ["contents" .= Text.pack s,
Packit Service d2f85f
            "source" .= Text.pack (sourceName pos),
Packit Service d2f85f
            "line" .= toJSON (sourceLine pos),
Packit Service d2f85f
            "column" .= toJSON (sourceColumn pos)]
Packit Service d2f85f
      ReferenceNotFound s pos ->
Packit Service d2f85f
           ["contents" .= Text.pack s,
Packit Service d2f85f
            "source" .= Text.pack (sourceName pos),
Packit Service d2f85f
            "line" .= toJSON (sourceLine pos),
Packit Service d2f85f
            "column" .= toJSON (sourceColumn pos)]
Packit Service d2f85f
      CircularReference s pos ->
Packit Service d2f85f
           ["contents" .= Text.pack s,
Packit Service d2f85f
            "source" .= Text.pack (sourceName pos),
Packit Service d2f85f
            "line" .= toJSON (sourceLine pos),
Packit Service d2f85f
            "column" .= toJSON (sourceColumn pos)]
Packit Service d2f85f
      UndefinedToggle s pos ->
Packit Service d2f85f
           ["contents" .= Text.pack s,
Packit Service d2f85f
            "source" .= Text.pack (sourceName pos),
Packit Service d2f85f
            "line" .= toJSON (sourceLine pos),
Packit Service d2f85f
            "column" .= toJSON (sourceColumn pos)]
Packit Service d2f85f
      ParsingUnescaped s pos ->
Packit Service d2f85f
           ["contents" .= Text.pack s,
Packit Service d2f85f
            "source" .= Text.pack (sourceName pos),
Packit Service d2f85f
            "line" .= toJSON (sourceLine pos),
Packit Service d2f85f
            "column" .= toJSON (sourceColumn pos)]
Packit Service d2f85f
      CouldNotLoadIncludeFile fp pos ->
Packit Service d2f85f
           ["path" .= Text.pack fp,
Packit Service d2f85f
            "source" .= Text.pack (sourceName pos),
Packit Service d2f85f
            "line" .= toJSON (sourceLine pos),
Packit Service d2f85f
            "column" .= toJSON (sourceColumn pos)]
Packit Service d2f85f
      MacroAlreadyDefined name pos ->
Packit Service d2f85f
           ["name" .= Text.pack name,
Packit Service d2f85f
            "source" .= Text.pack (sourceName pos),
Packit Service d2f85f
            "line" .= toJSON (sourceLine pos),
Packit Service d2f85f
            "column" .= toJSON (sourceColumn pos)]
Packit Service d2f85f
      InlineNotRendered il ->
Packit Service d2f85f
           ["contents" .= toJSON il]
Packit Service d2f85f
      BlockNotRendered bl ->
Packit Service d2f85f
           ["contents" .= toJSON bl]
Packit Service d2f85f
      DocxParserWarning s ->
Packit Service d2f85f
           ["contents" .= Text.pack s]
Packit Service d2f85f
      CouldNotFetchResource fp s ->
Packit Service d2f85f
           ["path" .= Text.pack fp,
Packit Service d2f85f
            "message" .= Text.pack s]
Packit Service d2f85f
      CouldNotDetermineImageSize fp s ->
Packit Service d2f85f
           ["path" .= Text.pack fp,
Packit Service d2f85f
            "message" .= Text.pack s]
Packit Service d2f85f
      CouldNotConvertImage fp s ->
Packit Service d2f85f
           ["path" .= Text.pack fp,
Packit Service d2f85f
            "message" .= Text.pack s]
Packit Service d2f85f
      CouldNotDetermineMimeType fp ->
Packit Service d2f85f
           ["path" .= Text.pack fp]
Packit Service d2f85f
      CouldNotConvertTeXMath s msg ->
Packit Service d2f85f
           ["contents" .= Text.pack s,
Packit Service d2f85f
            "message" .= Text.pack msg]
Packit Service d2f85f
      CouldNotParseCSS msg ->
Packit Service d2f85f
           ["message" .= Text.pack msg]
Packit Service d2f85f
      Fetching fp ->
Packit Service d2f85f
           ["path" .= Text.pack fp]
Packit Service d2f85f
      Extracting fp ->
Packit Service d2f85f
           ["path" .= Text.pack fp]
Packit Service d2f85f
      NoTitleElement fallback ->
Packit Service d2f85f
           ["fallback" .= Text.pack fallback]
Packit Service d2f85f
      NoLangSpecified -> []
Packit Service d2f85f
      InvalidLang s ->
Packit Service d2f85f
           ["lang" .= Text.pack s]
Packit Service d2f85f
      CouldNotHighlight msg ->
Packit Service d2f85f
           ["message" .= Text.pack msg]
Packit Service d2f85f
      MissingCharacter msg ->
Packit Service d2f85f
           ["message" .= Text.pack msg]
Packit Service d2f85f
      Deprecated thing msg ->
Packit Service d2f85f
           ["thing" .= Text.pack thing,
Packit Service d2f85f
            "message" .= Text.pack msg]
Packit Service d2f85f
      NoTranslation term ->
Packit Service d2f85f
           ["term" .= Text.pack term]
Packit Service d2f85f
      CouldNotLoadTranslations lang msg ->
Packit Service d2f85f
           ["lang" .= Text.pack lang,
Packit Service d2f85f
            "message" .= Text.pack msg]
Packit Service d2f85f
Packit Service d2f85f
Packit Service d2f85f
showPos :: SourcePos -> String
Packit Service d2f85f
showPos pos = sn ++ "line " ++
Packit Service d2f85f
     show (sourceLine pos) ++ " column " ++ show (sourceColumn pos)
Packit Service d2f85f
  where sn = if sourceName pos == "source" || sourceName pos == ""
Packit Service d2f85f
                then ""
Packit Service d2f85f
                else sourceName pos ++ " "
Packit Service d2f85f
Packit Service d2f85f
encodeLogMessages :: [LogMessage] -> BL.ByteString
Packit Service d2f85f
encodeLogMessages ms =
Packit Service d2f85f
  encodePretty' defConfig{ confCompare =
Packit Service d2f85f
      keyOrder [ "type", "verbosity", "contents", "message", "path",
Packit Service d2f85f
                 "source", "line", "column" ] } ms
Packit Service d2f85f
Packit Service d2f85f
showLogMessage :: LogMessage -> String
Packit Service d2f85f
showLogMessage msg =
Packit Service d2f85f
  case msg of
Packit Service d2f85f
       SkippedContent s pos ->
Packit Service d2f85f
         "Skipped '" ++ s ++ "' at " ++ showPos pos
Packit Service d2f85f
       CouldNotParseYamlMetadata s pos ->
Packit Service d2f85f
         "Could not parse YAML metadata at " ++ showPos pos ++
Packit Service d2f85f
           if null s then "" else ": " ++ s
Packit Service d2f85f
       DuplicateLinkReference s pos ->
Packit Service d2f85f
         "Duplicate link reference '" ++ s ++ "' at " ++ showPos pos
Packit Service d2f85f
       DuplicateNoteReference s pos ->
Packit Service d2f85f
         "Duplicate note reference '" ++ s ++ "' at " ++ showPos pos
Packit Service d2f85f
       NoteDefinedButNotUsed s pos ->
Packit Service d2f85f
         "Note with key '" ++ s ++ "' defined at " ++ showPos pos ++
Packit Service d2f85f
           " but not used."
Packit Service d2f85f
       DuplicateIdentifier s pos ->
Packit Service d2f85f
         "Duplicate identifier '" ++ s ++ "' at " ++ showPos pos
Packit Service d2f85f
       ReferenceNotFound s pos ->
Packit Service d2f85f
         "Reference not found for '" ++ s ++ "' at " ++ showPos pos
Packit Service d2f85f
       CircularReference s pos ->
Packit Service d2f85f
         "Circular reference '" ++ s ++ "' at " ++ showPos pos
Packit Service d2f85f
       UndefinedToggle s pos ->
Packit Service d2f85f
         "Undefined toggle '" ++ s ++ "' at " ++ showPos pos
Packit Service d2f85f
       ParsingUnescaped s pos ->
Packit Service d2f85f
         "Parsing unescaped '" ++ s ++ "' at " ++ showPos pos
Packit Service d2f85f
       CouldNotLoadIncludeFile fp pos ->
Packit Service d2f85f
         "Could not load include file '" ++ fp ++ "' at " ++ showPos pos
Packit Service d2f85f
       MacroAlreadyDefined name pos ->
Packit Service d2f85f
         "Macro '" ++ name ++ "' already defined, ignoring at " ++ showPos pos
Packit Service d2f85f
       InlineNotRendered il ->
Packit Service d2f85f
         "Not rendering " ++ show il
Packit Service d2f85f
       BlockNotRendered bl ->
Packit Service d2f85f
         "Not rendering " ++ show bl
Packit Service d2f85f
       DocxParserWarning s ->
Packit Service d2f85f
         "Docx parser warning: " ++ s
Packit Service d2f85f
       CouldNotFetchResource fp s ->
Packit Service d2f85f
         "Could not fetch resource '" ++ fp ++ "'" ++
Packit Service d2f85f
           if null s then "" else ": " ++ s
Packit Service d2f85f
       CouldNotDetermineImageSize fp s ->
Packit Service d2f85f
         "Could not determine image size for '" ++ fp ++ "'" ++
Packit Service d2f85f
           if null s then "" else ": " ++ s
Packit Service d2f85f
       CouldNotConvertImage fp s ->
Packit Service d2f85f
         "Could not convert image '" ++ fp ++ "'" ++
Packit Service d2f85f
           if null s then "" else ": " ++ s
Packit Service d2f85f
       CouldNotDetermineMimeType fp ->
Packit Service d2f85f
         "Could not determine mime type for '" ++ fp ++ "'"
Packit Service d2f85f
       CouldNotConvertTeXMath s m ->
Packit Service d2f85f
         "Could not convert TeX math '" ++ s ++ "', rendering as TeX" ++
Packit Service d2f85f
           if null m then "" else ':' : '\n' : m
Packit Service d2f85f
       CouldNotParseCSS m ->
Packit Service d2f85f
         "Could not parse CSS" ++ if null m then "" else ':' : '\n' : m
Packit Service d2f85f
       Fetching fp ->
Packit Service d2f85f
         "Fetching " ++ fp ++ "..."
Packit Service d2f85f
       Extracting fp ->
Packit Service d2f85f
         "Extracting " ++ fp ++ "..."
Packit Service d2f85f
       NoTitleElement fallback ->
Packit Service d2f85f
         "This document format requires a nonempty <title> element.\n" ++
Packit Service d2f85f
         "Please specify either 'title' or 'pagetitle' in the metadata.\n" ++
Packit Service d2f85f
         "Falling back to '" ++ fallback ++ "'"
Packit Service d2f85f
       NoLangSpecified ->
Packit Service d2f85f
         "No value for 'lang' was specified in the metadata.\n" ++
Packit Service d2f85f
         "It is recommended that lang be specified for this format."
Packit Service d2f85f
       InvalidLang s ->
Packit Service d2f85f
         "Invalid 'lang' value '" ++ s ++ "'.\n" ++
Packit Service d2f85f
         "Use an IETF language tag like 'en-US'."
Packit Service d2f85f
       CouldNotHighlight m ->
Packit Service d2f85f
         "Could not highlight code block:\n" ++ m
Packit Service d2f85f
       MissingCharacter m ->
Packit Service d2f85f
         "Missing character: " ++ m
Packit Service d2f85f
       Deprecated t m ->
Packit Service d2f85f
         "Deprecated: " ++ t ++
Packit Service d2f85f
         if null m
Packit Service d2f85f
            then ""
Packit Service d2f85f
            else ". " ++ m
Packit Service d2f85f
       NoTranslation t ->
Packit Service d2f85f
         "The term " ++ t ++ " has no translation defined."
Packit Service d2f85f
       CouldNotLoadTranslations lang m ->
Packit Service d2f85f
         "Could not load translations for " ++ lang ++
Packit Service d2f85f
           if null m then "" else '\n' : m
Packit Service d2f85f
Packit Service d2f85f
messageVerbosity:: LogMessage -> Verbosity
Packit Service d2f85f
messageVerbosity msg =
Packit Service d2f85f
  case msg of
Packit Service d2f85f
       SkippedContent{}             -> INFO
Packit Service d2f85f
       CouldNotParseYamlMetadata{}  -> WARNING
Packit Service d2f85f
       DuplicateLinkReference{}     -> WARNING
Packit Service d2f85f
       DuplicateNoteReference{}     -> WARNING
Packit Service d2f85f
       NoteDefinedButNotUsed{}      -> WARNING
Packit Service d2f85f
       DuplicateIdentifier{}        -> WARNING
Packit Service d2f85f
       ReferenceNotFound{}          -> WARNING
Packit Service d2f85f
       CircularReference{}          -> WARNING
Packit Service d2f85f
       UndefinedToggle{}            -> WARNING
Packit Service d2f85f
       CouldNotLoadIncludeFile f _
Packit Service d2f85f
        | ".sty" `isSuffixOf` f     -> INFO
Packit Service d2f85f
        | otherwise                 -> WARNING
Packit Service d2f85f
       MacroAlreadyDefined{}        -> WARNING
Packit Service d2f85f
       ParsingUnescaped{}           -> INFO
Packit Service d2f85f
       InlineNotRendered{}          -> INFO
Packit Service d2f85f
       BlockNotRendered{}           -> INFO
Packit Service d2f85f
       DocxParserWarning{}          -> INFO
Packit Service d2f85f
       CouldNotFetchResource{}      -> WARNING
Packit Service d2f85f
       CouldNotDetermineImageSize{} -> WARNING
Packit Service d2f85f
       CouldNotConvertImage{}       -> WARNING
Packit Service d2f85f
       CouldNotDetermineMimeType{}  -> WARNING
Packit Service d2f85f
       CouldNotConvertTeXMath{}     -> WARNING
Packit Service d2f85f
       CouldNotParseCSS{}           -> WARNING
Packit Service d2f85f
       Fetching{}                   -> INFO
Packit Service d2f85f
       Extracting{}                 -> INFO
Packit Service d2f85f
       NoTitleElement{}             -> WARNING
Packit Service d2f85f
       NoLangSpecified              -> INFO
Packit Service d2f85f
       InvalidLang{}                -> WARNING
Packit Service d2f85f
       CouldNotHighlight{}          -> WARNING
Packit Service d2f85f
       MissingCharacter{}           -> WARNING
Packit Service d2f85f
       Deprecated{}                 -> WARNING
Packit Service d2f85f
       NoTranslation{}              -> WARNING
Packit Service d2f85f
       CouldNotLoadTranslations{}   -> WARNING