----------------------------------------------------------------------
-- |
-- Module      : MoreCustom
-- Maintainer  : AR
-- Stability   : (stable)
-- Portability : (portable)
--
-- > CVS $Date: 2005/02/24 11:46:39 $ 
-- > CVS $Author: peb $
-- > CVS $Revision: 1.5 $
--
-- databases for customizable commands. AR 21\/11\/2001
--
-- Extends "Custom".
--
-- obsolete???
-----------------------------------------------------------------------------

module MoreCustom where

import Operations
import Text
import Tokenize
import UseGrammar
import qualified UseSyntax as S
import ShellState
import Editing
import Paraphrases
import Option
import CF
import CFIdent --- (CFTok, tS)

import EBNF
import CFtoGrammar
import PPrCF

import CFtoHappy
import Morphology
import GrammarToHaskell
import GrammarToCanon (showCanon)
import GrammarToXML
import qualified SyntaxToLatex as L
import GFTex
import MkResource
import SeparateOper

-- the cf parsing algorithms
import ChartParser -- or some other CF Parser
import Earley -- such as this one
---- import HappyParser -- or this...

import qualified PPrSRG as SRG
import PPrGSL

import qualified TransPredCalc as PC

-- databases for customizable commands. AR 21/11/2001
-- Extends ../Custom.

moreCustomGrammarParser :: CustomData (FilePath -> IOE C.CanonGrammar) 
moreCustomGrammarParser = 
  [
   (strCIm "gfl",  S.parseGrammar . extractGFLatex)   
  ,(strCIm "tex",  S.parseGrammar . extractGFLatex)
  ,(strCIm "ebnf", pAsGrammar pEBNFasGrammar)
  ,(strCIm "cf",   pAsGrammar pCFAsGrammar)
-- add your own grammar parsers here
  ]
 where
  -- use a parser with no imports or flags
  pAsGrammar p = err Bad (\g -> return (([],noOptions),g)) . p


moreCustomGrammarPrinter :: CustomData (StateGrammar -> String)             
moreCustomGrammarPrinter = 
  [
   (strCIm "happy",   cf2HappyS . stateCF)
  ,(strCIm "srg",     SRG.prSRG . stateCF)
  ,(strCIm "gsl",     prGSL . stateCF)
  ,(strCIm "gfhs",    show . stateGrammarST)
  ,(strCIm "haskell", grammar2haskell . st2grammar . stateGrammarST)
  ,(strCIm "xml",     unlines . prDTD . grammar2dtd . stateAbstract)
  ,(strCIm "fullform",prFullForm . stateMorpho)
  ,(strCIm "resource",prt . st2grammar . mkResourceGrammar . stateGrammarST)
  ,(strCIm "resourcetypes", 
      prt . operTypeGrammar . st2grammar . mkResourceGrammar . stateGrammarST)
  ,(strCIm "resourcedefs", 
      prt . operDefGrammar . st2grammar . mkResourceGrammar . stateGrammarST)
-- add your own grammar printers here
--- also include printing via grammar2syntax!
  ]

moreCustomMultiGrammarPrinter :: CustomData (CanonGrammar -> String)    
moreCustomMultiGrammarPrinter = []

moreCustomSyntaxPrinter  :: CustomData (GF.Grammar -> String)        
moreCustomSyntaxPrinter = 
  [ 
    (strCIm "gf",    S.prSyntax) -- DEFAULT
   ,(strCIm "latex", L.syntax2latexfile)
-- add your own grammar printers here
  ]

moreCustomTermPrinter  :: CustomData (StateGrammar -> Tree -> String)
moreCustomTermPrinter = 
  [ 
    (strCIm "xml",    \g t -> unlines $ prElementX $ term2elemx (stateAbstract g) t)
-- add your own term printers here
  ]

moreCustomTermCommand    :: CustomData (StateGrammar -> Tree -> [Tree])
moreCustomTermCommand = 
  [
   (strCIm "predcalc",   \_ t -> PC.transfer t)
-- add your own term commands here
  ]

moreCustomEditCommand    :: CustomData (StateGrammar -> Action)
moreCustomEditCommand = 
  [
-- add your own edit commands here
  ]

moreCustomStringCommand  :: CustomData (StateGrammar -> String -> String)
moreCustomStringCommand = 
  [
-- add your own string commands here
  ]

moreCustomParser         :: CustomData (StateGrammar -> CFCat -> CFParser)
moreCustomParser = 
  [
   (strCIm "chart",    chartParser . stateCF)
  ,(strCIm "earley",   earleyParser . stateCF)
--  ,(strCIm "happy",     const $ lexHaskell)
--  ,(strCIm "td",        const $ lexText)
-- add your own parsers here
  ]

moreCustomTokenizer      :: CustomData (StateGrammar -> String -> [CFTok])  
moreCustomTokenizer = 
  [
-- add your own tokenizers here
  ]

moreCustomUntokenizer    :: CustomData (StateGrammar -> String -> String)  
moreCustomUntokenizer = 
  [
-- add your own untokenizers here
  ]

moreCustomUniCoding :: CustomData (String -> String)
moreCustomUniCoding = 
  [
-- add your own codings here
  ]

strCIm :: String -> CommandId
strCIm = id
