module Sound.Audacity.Project where

import qualified Sound.Audacity.Project.Track.Label as LabelTrack
import qualified Sound.Audacity.Project.Track.Wave as WaveTrack
import qualified Sound.Audacity.XML.Attribute as Attr
import qualified Sound.Audacity.XML as XML

import qualified Text.HTML.Tagchup.Format as Format
import qualified Text.HTML.Tagchup.Tag as Tag
import qualified Text.XML.Basic.ProcessingInstruction as PI
import qualified Text.XML.Basic.Name.MixedCase as Name
import qualified Text.XML.Basic.Tag as XmlTag


data T =
   Cons {
      T -> String
name_ :: String,
      T -> Double
selectionStart_, T -> Double
selectionEnd_ :: Double,
      T -> Int
vpos_ :: Int,
      T -> Double
h_ :: Double,
      T -> Double
zoom_ :: Double,
      T -> Double
rate_ :: Double,
      T -> [Track]
tracks_ :: [Track]
   }

deflt :: T
deflt :: T
deflt =
   Cons :: String
-> Double
-> Double
-> Int
-> Double
-> Double
-> Double
-> [Track]
-> T
Cons {
      name_ :: String
name_ = String
"",
      selectionStart_ :: Double
selectionStart_ = Double
0, selectionEnd_ :: Double
selectionEnd_ = Double
0,
      vpos_ :: Int
vpos_ = Int
0,
      h_ :: Double
h_ = Double
0,
      zoom_ :: Double
zoom_ = Double
1,
      rate_ :: Double
rate_ = Double
44100,
      tracks_ :: [Track]
tracks_ = []
   }


data Track =
     WaveTrack WaveTrack.T
   | LabelTrack LabelTrack.T


format :: T -> ShowS
format :: T -> ShowS
format T
x =
   [T T String] -> ShowS
forall name string.
(Tag name, Attribute name, C string) =>
[T name string] -> ShowS
Format.xmlCondensed ([[T T String]] -> [T T String]
XML.unlines ([[T T String]] -> [T T String]) -> [[T T String]] -> [T T String]
forall a b. (a -> b) -> a -> b
$ T -> [[T T String]]
toXML T
x)

toXML :: T -> [[Tag.T Name.T String]]
toXML :: T -> [[T T String]]
toXML T
x =
   [Name T -> T T String -> T T String
forall name string. Name name -> T name string -> T name string
Tag.processing Name T
forall name. Tag name => Name name
XmlTag.xmlName (T T String -> T T String) -> T T String -> T T String
forall a b. (a -> b) -> a -> b
$ [T T String] -> T T String
forall name string. [T name string] -> T name string
PI.Known ([T T String] -> T T String) -> [T T String] -> T T String
forall a b. (a -> b) -> a -> b
$
      String -> String -> T T String
forall a. String -> a -> T T a
XML.attr String
"version" String
"1.0" T T String -> [T T String] -> [T T String]
forall a. a -> [a] -> [a]
:
      String -> String -> T T String
forall a. String -> a -> T T a
XML.attr String
"standalone" String
"no" T T String -> [T T String] -> [T T String]
forall a. a -> [a] -> [a]
:
      []] [T T String] -> [[T T String]] -> [[T T String]]
forall a. a -> [a] -> [a]
:
   [Name T -> String -> T T String
forall name string. Name name -> String -> T name string
Tag.special Name T
forall name. Tag name => Name name
XmlTag.doctypeName (String -> T T String) -> String -> T T String
forall a b. (a -> b) -> a -> b
$
      String
"project PUBLIC \"-//audacityproject-1.3.0//DTD//EN\" " String -> ShowS
forall a. [a] -> [a] -> [a]
++
      String
"\"http://audacity.sourceforge.net/xml/audacityproject-1.3.0.dtd\""] [T T String] -> [[T T String]] -> [[T T String]]
forall a. a -> [a] -> [a]
:
   String
-> T -> [T T (T -> String)] -> [[T T String]] -> [[T T String]]
forall a.
String
-> a -> [T T (a -> String)] -> [[T T String]] -> [[T T String]]
XML.tag String
"project" T
x
     (String -> (T -> String) -> T T (T -> String)
forall a. String -> (a -> String) -> T T (a -> String)
Attr.string String
"xmlns" (String -> T -> String
forall a b. a -> b -> a
const String
"http://audacity.sourceforge.net/xml/") T T (T -> String) -> [T T (T -> String)] -> [T T (T -> String)]
forall a. a -> [a] -> [a]
:
      String -> (T -> String) -> T T (T -> String)
forall a. String -> (a -> String) -> T T (a -> String)
Attr.string String
"projname" T -> String
name_ T T (T -> String) -> [T T (T -> String)] -> [T T (T -> String)]
forall a. a -> [a] -> [a]
:
      String -> (T -> String) -> T T (T -> String)
forall a. String -> (a -> String) -> T T (a -> String)
Attr.string String
"version" (String -> T -> String
forall a b. a -> b -> a
const String
"1.3.0") T T (T -> String) -> [T T (T -> String)] -> [T T (T -> String)]
forall a. a -> [a] -> [a]
:
      String -> (T -> String) -> T T (T -> String)
forall a. String -> (a -> String) -> T T (a -> String)
Attr.string String
"audacityversion" (String -> T -> String
forall a b. a -> b -> a
const String
"2.0.0") T T (T -> String) -> [T T (T -> String)] -> [T T (T -> String)]
forall a. a -> [a] -> [a]
:
      String -> (T -> Double) -> T T (T -> String)
forall a. String -> (a -> Double) -> T T (a -> String)
Attr.double String
"sel0" T -> Double
selectionStart_ T T (T -> String) -> [T T (T -> String)] -> [T T (T -> String)]
forall a. a -> [a] -> [a]
:
      String -> (T -> Double) -> T T (T -> String)
forall a. String -> (a -> Double) -> T T (a -> String)
Attr.double String
"sel1" T -> Double
selectionEnd_ T T (T -> String) -> [T T (T -> String)] -> [T T (T -> String)]
forall a. a -> [a] -> [a]
:
      String -> (T -> Int) -> T T (T -> String)
forall a. String -> (a -> Int) -> T T (a -> String)
Attr.int String
"vpos" T -> Int
vpos_ T T (T -> String) -> [T T (T -> String)] -> [T T (T -> String)]
forall a. a -> [a] -> [a]
:
      String -> (T -> Double) -> T T (T -> String)
forall a. String -> (a -> Double) -> T T (a -> String)
Attr.double String
"h" T -> Double
h_ T T (T -> String) -> [T T (T -> String)] -> [T T (T -> String)]
forall a. a -> [a] -> [a]
:
      String -> (T -> Double) -> T T (T -> String)
forall a. String -> (a -> Double) -> T T (a -> String)
Attr.double String
"zoom" T -> Double
zoom_ T T (T -> String) -> [T T (T -> String)] -> [T T (T -> String)]
forall a. a -> [a] -> [a]
:
      String -> (T -> Double) -> T T (T -> String)
forall a. String -> (a -> Double) -> T T (a -> String)
Attr.double String
"rate" T -> Double
rate_ T T (T -> String) -> [T T (T -> String)] -> [T T (T -> String)]
forall a. a -> [a] -> [a]
:
      [])
     ((Track -> [[T T String]]) -> [Track] -> [[T T String]]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Track -> [[T T String]]
trackToXML (T -> [Track]
tracks_ T
x))

trackToXML :: Track -> [[Tag.T Name.T String]]
trackToXML :: Track -> [[T T String]]
trackToXML (LabelTrack T
x) = T -> [[T T String]]
LabelTrack.toXML T
x
trackToXML (WaveTrack T
x) = T -> [[T T String]]
WaveTrack.toXML T
x