module Errata.Types
(
Line
, Column
, Header
, Body
, Label
, Errata (..)
, Block (..)
, Pointer (..)
, pointerColumns
, Style (..)
, highlight
) where
import qualified Data.Text as T
type Line = Int
type Column = Int
type = T.Text
type Body = T.Text
type Label = T.Text
data Errata = Errata
{ :: Maybe Header
, Errata -> [Block]
errataBlocks :: [Block]
, Errata -> Maybe Header
errataBody :: Maybe Body
}
data Block = Block
{ Block -> Style
blockStyle :: Style
, Block -> (FilePath, Line, Line)
blockLocation :: (FilePath, Line, Column)
, :: Maybe Header
, Block -> [Pointer]
blockPointers :: [Pointer]
, Block -> Maybe Header
blockBody :: Maybe Body
}
data Pointer = Pointer
{ Pointer -> Line
pointerLine :: Line
, Pointer -> Line
pointerColStart :: Column
, Pointer -> Line
pointerColEnd :: Column
, Pointer -> Bool
pointerConnect :: Bool
, Pointer -> Maybe Header
pointerLabel :: Maybe Label
}
deriving (Line -> Pointer -> ShowS
[Pointer] -> ShowS
Pointer -> FilePath
(Line -> Pointer -> ShowS)
-> (Pointer -> FilePath) -> ([Pointer] -> ShowS) -> Show Pointer
forall a.
(Line -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
showList :: [Pointer] -> ShowS
$cshowList :: [Pointer] -> ShowS
show :: Pointer -> FilePath
$cshow :: Pointer -> FilePath
showsPrec :: Line -> Pointer -> ShowS
$cshowsPrec :: Line -> Pointer -> ShowS
Show, Pointer -> Pointer -> Bool
(Pointer -> Pointer -> Bool)
-> (Pointer -> Pointer -> Bool) -> Eq Pointer
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Pointer -> Pointer -> Bool
$c/= :: Pointer -> Pointer -> Bool
== :: Pointer -> Pointer -> Bool
$c== :: Pointer -> Pointer -> Bool
Eq)
pointerColumns :: Pointer -> (Column, Column)
pointerColumns :: Pointer -> (Line, Line)
pointerColumns Pointer
p = (Pointer -> Line
pointerColStart Pointer
p, Pointer -> Line
pointerColEnd Pointer
p)
data Style = Style
{ Style -> (FilePath, Line, Line) -> Header
styleLocation :: (FilePath, Line, Column) -> T.Text
, Style -> Line -> Header
styleNumber :: Line -> T.Text
, Style -> [(Line, Line)] -> Header -> Header
styleLine :: [(Column, Column)] -> T.Text -> T.Text
, Style -> Header
styleEllipsis :: T.Text
, Style -> Header
styleLinePrefix :: T.Text
, Style -> Header
styleUnderline :: T.Text
, Style -> Header
styleVertical :: T.Text
, Style -> Header
styleHorizontal :: T.Text
, Style -> Header
styleDownRight :: T.Text
, Style -> Header
styleUpRight :: T.Text
, Style -> Header
styleUpDownRight :: T.Text
}
highlight
:: T.Text
-> T.Text
-> [(Column, Column)]
-> T.Text
-> T.Text
highlight :: Header -> Header -> [(Line, Line)] -> Header -> Header
highlight Header
open Header
close = Bool -> [Line] -> Header -> Header
go Bool
False ([Line] -> Header -> Header)
-> ([(Line, Line)] -> [Line]) -> [(Line, Line)] -> Header -> Header
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Line, Line) -> [Line]) -> [(Line, Line)] -> [Line]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\(Line
a, Line
b) -> [Line
a, Line
b])
where
go :: Bool -> [Line] -> Header -> Header
go Bool
_ [] Header
xs = Header
xs
go Bool
False (Line
i:[Line]
is) Header
xs =
let (Header
a, Header
ys) = Line -> Header -> (Header, Header)
T.splitAt (Line
i Line -> Line -> Line
forall a. Num a => a -> a -> a
- Line
1) Header
xs
in Header
a Header -> Header -> Header
forall a. Semigroup a => a -> a -> a
<> Header
open Header -> Header -> Header
forall a. Semigroup a => a -> a -> a
<> Bool -> [Line] -> Header -> Header
go Bool
True ((Line -> Line) -> [Line] -> [Line]
forall a b. (a -> b) -> [a] -> [b]
map (\Line
x -> Line
x Line -> Line -> Line
forall a. Num a => a -> a -> a
- Line
i Line -> Line -> Line
forall a. Num a => a -> a -> a
+ Line
1) [Line]
is) Header
ys
go Bool
True (Line
i:[Line]
is) Header
xs =
let (Header
a, Header
ys) = Line -> Header -> (Header, Header)
T.splitAt (Line
i Line -> Line -> Line
forall a. Num a => a -> a -> a
- Line
1) Header
xs
in Header
a Header -> Header -> Header
forall a. Semigroup a => a -> a -> a
<> Header
close Header -> Header -> Header
forall a. Semigroup a => a -> a -> a
<> Bool -> [Line] -> Header -> Header
go Bool
False ((Line -> Line) -> [Line] -> [Line]
forall a b. (a -> b) -> [a] -> [b]
map (\Line
x -> Line
x Line -> Line -> Line
forall a. Num a => a -> a -> a
- Line
i Line -> Line -> Line
forall a. Num a => a -> a -> a
+ Line
1) [Line]
is) Header
ys