{-# LANGUAGE DeriveDataTypeable, DeriveGeneric, OverloadedStrings #-} {- Copyright (C) 2016-17 John MacFarlane This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -} {- | Module : Text.Pandoc.Logging Copyright : Copyright (C) 2006-2016 John MacFarlane License : GNU GPL, version 2 or above Maintainer : John MacFarlane Stability : alpha Portability : portable This module provides data types and functions for warnings and info messages. -} module Text.Pandoc.Logging ( Verbosity(..) , LogMessage(..) , showLogMessage , messageVerbosity ) where import Text.Parsec.Pos import Data.Data (Data) import Data.Generics (Typeable) import GHC.Generics (Generic) import qualified Data.Text as Text import Data.Aeson import Text.Pandoc.Definition -- | Verbosity level. data Verbosity = ERROR | WARNING | INFO | DEBUG deriving (Show, Read, Eq, Data, Enum, Ord, Bounded, Typeable, Generic) instance ToJSON Verbosity where toJSON x = toJSON (show x) data LogMessage = SkippedContent String SourcePos | CouldNotParseYamlMetadata String SourcePos | DuplicateLinkReference String SourcePos | DuplicateNoteReference String SourcePos | ReferenceNotFound String SourcePos | ParsingUnescaped String SourcePos | CouldNotLoadIncludeFile String SourcePos | ParsingTrace String SourcePos | InlineNotRendered Inline | BlockNotRendered Block | DocxParserWarning String | CouldNotFetchResource String String | CouldNotDetermineImageSize String String | CouldNotDetermineMimeType String | CouldNotConvertTeXMath String String deriving (Show, Eq, Data, Ord, Typeable, Generic) instance ToJSON LogMessage where toJSON x = object $ "verbosity" .= toJSON (messageVerbosity x) : case x of SkippedContent s pos -> ["type" .= String "SkippedContent", "contents" .= Text.pack s, "source" .= Text.pack (sourceName pos), "line" .= sourceLine pos, "column" .= sourceColumn pos] CouldNotParseYamlMetadata s pos -> ["type" .= String "YamlSectionNotAnObject", "message" .= Text.pack s, "source" .= Text.pack (sourceName pos), "line" .= toJSON (sourceLine pos), "column" .= toJSON (sourceColumn pos)] DuplicateLinkReference s pos -> ["type" .= String "DuplicateLinkReference", "contents" .= Text.pack s, "source" .= Text.pack (sourceName pos), "line" .= toJSON (sourceLine pos), "column" .= toJSON (sourceColumn pos)] DuplicateNoteReference s pos -> ["type" .= String "DuplicateNoteReference", "contents" .= Text.pack s, "source" .= Text.pack (sourceName pos), "line" .= toJSON (sourceLine pos), "column" .= toJSON (sourceColumn pos)] ReferenceNotFound s pos -> ["type" .= String "ReferenceNotFound", "contents" .= Text.pack s, "source" .= Text.pack (sourceName pos), "line" .= toJSON (sourceLine pos), "column" .= toJSON (sourceColumn pos)] ParsingUnescaped s pos -> ["type" .= String "ParsingUnescaped", "contents" .= Text.pack s, "source" .= Text.pack (sourceName pos), "line" .= toJSON (sourceLine pos), "column" .= toJSON (sourceColumn pos)] CouldNotLoadIncludeFile fp pos -> ["type" .= String "CouldNotLoadIncludeFile", "path" .= Text.pack fp, "source" .= Text.pack (sourceName pos), "line" .= toJSON (sourceLine pos), "column" .= toJSON (sourceColumn pos)] ParsingTrace s pos -> ["type" .= String "ParsingTrace", "contents" .= Text.pack s, "source" .= Text.pack (sourceName pos), "line" .= sourceLine pos, "column" .= sourceColumn pos] InlineNotRendered il -> ["type" .= String "InlineNotRendered", "contents" .= toJSON il] BlockNotRendered bl -> ["type" .= String "BlockNotRendered", "contents" .= toJSON bl] DocxParserWarning s -> ["type" .= String "DocxParserWarning", "contents" .= Text.pack s] CouldNotFetchResource fp s -> ["type" .= String "CouldNotFetchResource", "path" .= Text.pack fp, "message" .= Text.pack s] CouldNotDetermineImageSize fp s -> ["type" .= String "CouldNotDetermineImageSize", "path" .= Text.pack fp, "message" .= Text.pack s] CouldNotDetermineMimeType fp -> ["type" .= String "CouldNotDetermineMimeType", "path" .= Text.pack fp] CouldNotConvertTeXMath s msg -> ["type" .= String "CouldNotConvertTeXMath", "contents" .= Text.pack s, "message" .= Text.pack msg] showPos :: SourcePos -> String showPos pos = sn ++ "line " ++ show (sourceLine pos) ++ " column " ++ show (sourceColumn pos) where sn = if sourceName pos == "source" || sourceName pos == "" then "" else sourceName pos ++ " " showLogMessage :: LogMessage -> String showLogMessage msg = case msg of SkippedContent s pos -> "Skipped '" ++ s ++ "' at " ++ showPos pos CouldNotParseYamlMetadata s pos -> "Could not parse YAML metadata at " ++ showPos pos ++ if null s then "" else (": " ++ s) DuplicateLinkReference s pos -> "Duplicate link reference '" ++ s ++ "' at " ++ showPos pos DuplicateNoteReference s pos -> "Duplicate note reference '" ++ s ++ "' at " ++ showPos pos ReferenceNotFound s pos -> "Reference not found for '" ++ s ++ "' at " ++ showPos pos ParsingUnescaped s pos -> "Parsing unescaped '" ++ s ++ "' at " ++ showPos pos CouldNotLoadIncludeFile fp pos -> "Could not load include file '" ++ fp ++ "' at " ++ showPos pos ParsingTrace s pos -> "Parsing trace at " ++ showPos pos ++ ": " ++ s InlineNotRendered il -> "Not rendering " ++ show il BlockNotRendered bl -> "Not rendering " ++ show bl DocxParserWarning s -> "Docx parser warning: " ++ s CouldNotFetchResource fp s -> "Could not fetch resource '" ++ fp ++ "'" ++ if null s then "" else (": " ++ s) CouldNotDetermineImageSize fp s -> "Could not determine image size for '" ++ fp ++ "'" ++ if null s then "" else (": " ++ s) CouldNotDetermineMimeType fp -> "Could not determine mime type for '" ++ fp ++ "'" CouldNotConvertTeXMath s m -> "Could not convert TeX math '" ++ s ++ "', rendering as TeX" ++ if null m then "" else (':':'\n':m) messageVerbosity:: LogMessage -> Verbosity messageVerbosity msg = case msg of SkippedContent{} -> INFO CouldNotParseYamlMetadata{} -> WARNING DuplicateLinkReference{} -> WARNING DuplicateNoteReference{} -> WARNING ReferenceNotFound{} -> WARNING CouldNotLoadIncludeFile{} -> WARNING ParsingUnescaped{} -> INFO ParsingTrace{} -> DEBUG InlineNotRendered{} -> INFO BlockNotRendered{} -> INFO DocxParserWarning{} -> WARNING CouldNotFetchResource{} -> WARNING CouldNotDetermineImageSize{} -> WARNING CouldNotDetermineMimeType{} -> WARNING CouldNotConvertTeXMath{} -> WARNING