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

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

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

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