{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_HADDOCK show-extensions #-}

-- |
-- Module      :  Yi.Mode.Latex
-- License     :  GPL-2
-- Maintainer  :  yi-devel@googlegroups.com
-- Stability   :  experimental
-- Portability :  portable
--
-- Collection of 'Mode's for working with LaTeX.

module Yi.Mode.Latex (latexMode3, latexMode2, fastMode) where

import           Data.Text            ()
import           Yi.Buffer
import qualified Yi.IncrementalParse  as IncrParser (scanner)
import           Yi.Lexer.Alex        (AlexState, CharScanner, Tok, commonLexer, lexScanner)
import qualified Yi.Lexer.Latex       as Latex (HlState, Token, alexScanToken, initState)
import           Yi.Mode.Common       (anyExtension, fundamentalMode)
import           Yi.Syntax            (ExtHL (ExtHL), Scanner, mkHighlighter)
import qualified Yi.Syntax.Driver     as Driver (mkHighlighter)
import qualified Yi.Syntax.Latex      as Latex (TT, Tree, getStrokes, parse, tokenToStroke)
import           Yi.Syntax.OnlineTree (Tree, manyToks)
import           Yi.Syntax.Tree       (tokenBasedStrokes)

abstract :: Mode syntax
abstract :: Mode syntax
abstract = Mode syntax
forall syntax. Mode syntax
fundamentalMode
 {
   modeApplies :: FilePath -> YiString -> Bool
modeApplies = [FilePath] -> FilePath -> YiString -> Bool
forall a. [FilePath] -> FilePath -> a -> Bool
anyExtension [FilePath
"tex", FilePath
"sty", FilePath
"ltx"],
   modeToggleCommentSelection :: Maybe (BufferM ())
modeToggleCommentSelection = BufferM () -> Maybe (BufferM ())
forall a. a -> Maybe a
Just (YiString -> BufferM ()
toggleCommentB YiString
"%")
 }

fastMode :: Mode (Tree Latex.TT)
fastMode :: Mode (Tree TT)
fastMode = Mode (Tree TT)
forall syntax. Mode syntax
abstract
  {
    modeName :: Text
modeName = Text
"fast latex",
    modeHL :: ExtHL (Tree TT)
modeHL = Highlighter
  (Cache (State (AlexState HlState) TT (Tree TT)) (Tree TT))
  (Tree TT)
-> ExtHL (Tree TT)
forall syntax cache. Highlighter cache syntax -> ExtHL syntax
ExtHL (Highlighter
   (Cache (State (AlexState HlState) TT (Tree TT)) (Tree TT))
   (Tree TT)
 -> ExtHL (Tree TT))
-> Highlighter
     (Cache (State (AlexState HlState) TT (Tree TT)) (Tree TT))
     (Tree TT)
-> ExtHL (Tree TT)
forall a b. (a -> b) -> a -> b
$ (Scanner Point Char
 -> Scanner (State (AlexState HlState) TT (Tree TT)) (Tree TT))
-> Highlighter
     (Cache (State (AlexState HlState) TT (Tree TT)) (Tree TT))
     (Tree TT)
forall state result.
Show state =>
(Scanner Point Char -> Scanner state result)
-> Highlighter (Cache state result) result
mkHighlighter (Parser TT (Tree TT)
-> Scanner (AlexState HlState) TT
-> Scanner (State (AlexState HlState) TT (Tree TT)) (Tree TT)
forall st token result.
Parser token result
-> Scanner st token -> Scanner (State st token result) result
IncrParser.scanner Parser TT (Tree TT)
forall t. P (Tok t) (Tree (Tok t))
manyToks (Scanner (AlexState HlState) TT
 -> Scanner (State (AlexState HlState) TT (Tree TT)) (Tree TT))
-> (Scanner Point Char -> Scanner (AlexState HlState) TT)
-> Scanner Point Char
-> Scanner (State (AlexState HlState) TT (Tree TT)) (Tree TT)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scanner Point Char -> Scanner (AlexState HlState) TT
latexLexer),
    modeGetStrokes :: Tree TT -> Point -> Point -> Point -> [Stroke]
modeGetStrokes = (TT -> Stroke) -> Tree TT -> Point -> Point -> Point -> [Stroke]
forall (t3 :: * -> *) a b t t2 t1.
Foldable t3 =>
(a -> b) -> t3 a -> t -> t2 -> t1 -> [b]
tokenBasedStrokes TT -> Stroke
Latex.tokenToStroke
  }

-- | syntax-based latex mode
latexMode2 :: Mode (Latex.Tree Latex.TT)
latexMode2 :: Mode (Tree TT)
latexMode2 = Mode (Tree TT)
forall syntax. Mode syntax
abstract
  {
    modeName :: Text
modeName = Text
"latex",
    modeHL :: ExtHL (Tree TT)
modeHL = Highlighter
  (Cache (State (AlexState HlState) TT (Tree TT)) (Tree TT))
  (Tree TT)
-> ExtHL (Tree TT)
forall syntax cache. Highlighter cache syntax -> ExtHL syntax
ExtHL (Highlighter
   (Cache (State (AlexState HlState) TT (Tree TT)) (Tree TT))
   (Tree TT)
 -> ExtHL (Tree TT))
-> Highlighter
     (Cache (State (AlexState HlState) TT (Tree TT)) (Tree TT))
     (Tree TT)
-> ExtHL (Tree TT)
forall a b. (a -> b) -> a -> b
$
       (Scanner Point Char
 -> Scanner (State (AlexState HlState) TT (Tree TT)) (Tree TT))
-> Highlighter
     (Cache (State (AlexState HlState) TT (Tree TT)) (Tree TT))
     (Tree TT)
forall state result.
Show state =>
(Scanner Point Char -> Scanner state result)
-> Highlighter (Cache state result) result
mkHighlighter (Parser TT (Tree TT)
-> Scanner (AlexState HlState) TT
-> Scanner (State (AlexState HlState) TT (Tree TT)) (Tree TT)
forall st token result.
Parser token result
-> Scanner st token -> Scanner (State st token result) result
IncrParser.scanner Parser TT (Tree TT)
Latex.parse (Scanner (AlexState HlState) TT
 -> Scanner (State (AlexState HlState) TT (Tree TT)) (Tree TT))
-> (Scanner Point Char -> Scanner (AlexState HlState) TT)
-> Scanner Point Char
-> Scanner (State (AlexState HlState) TT (Tree TT)) (Tree TT)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scanner Point Char -> Scanner (AlexState HlState) TT
latexLexer),
    modeGetStrokes :: Tree TT -> Point -> Point -> Point -> [Stroke]
modeGetStrokes = \Tree TT
t Point
point Point
begin Point
end -> Point -> Point -> Point -> Tree TT -> [Stroke]
Latex.getStrokes Point
point Point
begin Point
end Tree TT
t
  }

-- | syntax-based latex mode
latexMode3 :: Mode (Latex.Tree Latex.TT)
latexMode3 :: Mode (Tree TT)
latexMode3 = Mode (Tree TT)
forall syntax. Mode syntax
abstract
  {
    modeName :: Text
modeName = Text
"latex",
    modeHL :: ExtHL (Tree TT)
modeHL = Highlighter
  (Cache (State (AlexState HlState) TT (Tree TT)) Tree Token)
  (Tree TT)
-> ExtHL (Tree TT)
forall syntax cache. Highlighter cache syntax -> ExtHL syntax
ExtHL (Highlighter
   (Cache (State (AlexState HlState) TT (Tree TT)) Tree Token)
   (Tree TT)
 -> ExtHL (Tree TT))
-> Highlighter
     (Cache (State (AlexState HlState) TT (Tree TT)) Tree Token)
     (Tree TT)
-> ExtHL (Tree TT)
forall a b. (a -> b) -> a -> b
$
       (Scanner Point Char
 -> Scanner (State (AlexState HlState) TT (Tree TT)) (Tree TT))
-> Highlighter
     (Cache (State (AlexState HlState) TT (Tree TT)) Tree Token)
     (Tree TT)
forall state (tree :: * -> *) tt.
(IsTree tree, Show state) =>
(Scanner Point Char -> Scanner state (tree (Tok tt)))
-> Highlighter (Cache state tree tt) (tree (Tok tt))
Driver.mkHighlighter (Parser TT (Tree TT)
-> Scanner (AlexState HlState) TT
-> Scanner (State (AlexState HlState) TT (Tree TT)) (Tree TT)
forall st token result.
Parser token result
-> Scanner st token -> Scanner (State st token result) result
IncrParser.scanner Parser TT (Tree TT)
Latex.parse (Scanner (AlexState HlState) TT
 -> Scanner (State (AlexState HlState) TT (Tree TT)) (Tree TT))
-> (Scanner Point Char -> Scanner (AlexState HlState) TT)
-> Scanner Point Char
-> Scanner (State (AlexState HlState) TT (Tree TT)) (Tree TT)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scanner Point Char -> Scanner (AlexState HlState) TT
latexLexer),
    modeGetStrokes :: Tree TT -> Point -> Point -> Point -> [Stroke]
modeGetStrokes = \Tree TT
t Point
point Point
begin Point
end -> Point -> Point -> Point -> Tree TT -> [Stroke]
Latex.getStrokes Point
point Point
begin Point
end Tree TT
t
  }

latexLexer :: CharScanner -> Scanner (AlexState Latex.HlState) (Tok Latex.Token)
latexLexer :: Scanner Point Char -> Scanner (AlexState HlState) TT
latexLexer = Lexer AlexState HlState TT AlexInput
-> Scanner Point Char -> Scanner (AlexState HlState) TT
forall (l :: * -> *) s t i.
Lexer l s t i -> Scanner Point Char -> Scanner (l s) t
lexScanner ((ASI HlState -> Maybe (TT, ASI HlState))
-> HlState -> Lexer AlexState HlState TT AlexInput
forall s t.
(ASI s -> Maybe (Tok t, ASI s))
-> s -> Lexer AlexState s (Tok t) AlexInput
commonLexer ASI HlState -> Maybe (TT, ASI HlState)
Latex.alexScanToken HlState
Latex.initState)