{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
module Render.ColSpan where
import Data.Function(on)
import Data.String (fromString, IsString)
import Data.Text (Text)
import qualified Data.Text as T
import Data.List(groupBy, sortBy)
import Data.Maybe(fromMaybe)
import Prelude hiding(getLine)
import Optics.Core ( Field1(_1), Field2(_2), view, (%), lens )
import Data.Tuple.Optics ( Field1(_1), Field2(_2) )
import Alignment
import FindColumns
import Token(MyTok)
import Util
type TokensWithColSpan = ([(MyTok, Text)], Int, Align)
--type TextWithColSpan = (Text, Int, [Processed])
--extractTexts :: [[TextWithColSpan]] -> [[_]]
{-extractTexts ps = fmap extractText <$> ps
where
maxCol :: Int
maxCol = maximum $ map getAlignCol $ ps
extractText (tok:toks, colspan) = (T.concat (view textContent <$> (tok:toks))
,colspan
,view (alignPos % maybeLens (ALeft,-1) % _1) tok)
-}
-- | Find colspan parameters
colspans :: [Processed] -> [[TokensWithColSpan]]
colspans ps = fmap ( fmap extractTokens
. addColSpans
. groupBy sameColSpan )
$ groupBy ((==) `on` getLine)
$ sortBy (compare `on` getLineCol) ps
where
maxCol :: Int
maxCol = maximum $ map getAlignCol $ ps
sameColSpan :: Processed -> Processed -> Bool
sameColSpan tok1 tok2 = case view alignPos tok2 of
Nothing | getLine tok1 == getLine tok2 -> True
_ -> False
addColSpans :: [[Processed]] -> [([Processed], Int, Align)]
addColSpans [] = []
addColSpans [a] = [(a, maxCol -getAlignCol (head a)+1, getAlign $ head a)]
addColSpans (b:c:cs) = (b, nextCol-getAlignCol (head b) , getAlign $ head b):addColSpans (c:cs)
where
nextCol = getAlignCol $ head c
getAlign :: Processed -> Align
getAlign = view (alignPos % maybeLens (ALeft, 0) % _1)
extractTokens (a,b,c) = (extractToken <$> a, b, c)
extractToken tok = (view tokenType tok, view textContent tok)
-- FIXME: split lines before colspans!
getAlignCol :: Processed -> Int
getAlignCol = view (alignPos % maybeLens (ALeft, 0) % _2)