packages feed

svg2q-0.3.1: Output.hs

module Output where

import Types
import Translate (prettyCode, mkInitVals, codeString, mkAllocs, varNames, mkMember)
import Data.Maybe (mapMaybe, catMaybes)

mkImplementation :: [Maybe GraphicsElement] -> String -> IO ()
mkImplementation graphics file =
                 let cl = mapMaybe codeString (catMaybes graphics)
                     code = foldl (++) "" cl
                     con = imFileStart file graphics
                           ++ drawRect code
                           ++ imDealloc (catMaybes graphics)
                           ++ imFileEnd
                 in
                 writeFile (file++".m") (fileHeader++"\n\n"++con)

mkHeader :: [Maybe GraphicsElement] -> String -> IO ()
mkHeader graphics file =
         writeFile (file++".h") (hFileStart file
                                ++ hMembers graphics ++ "\n}\n"
                                ++ hProperties graphics 
                                ++ hFileEnd)

fileHeader :: String
fileHeader = "/* This file is generated using svg2q v.0.3.1.\n\
             \\tPlease feel free to report any bugs. */\n\n\n"


imInit :: [Maybe GraphicsElement] -> String
imInit ge = let b = mapMaybe mkInitVals (catMaybes ge)
                a = foldl (++) "" (mapMaybe mkAllocs (catMaybes ge))
            in
                a ++ prettyCode b

imFileStart :: String -> [Maybe GraphicsElement] -> String
imFileStart file graphics= 
            "#include \""++file++".h\"\n\n\
            \@implementation "++file++"\n\n"++
            imSynths (mapMaybe varNames (catMaybes graphics)) ++"\n\n\
            \- (id)init {\
            \\n\tself = [super initWithFrame:[self frame]];\
            \\n\t if (self) {\
            \\n\t\t // init code.\n\
            \\t\t self.scaleFactor = 1;\n"++
            imInit graphics ++
            "\n\t}\
            \\n\treturn self;\
            \\n}\n\n"

imDealloc :: [GraphicsElement] -> String
imDealloc xs = let vn = mapMaybe varNames xs
                   rl = foldl (\x y -> x++"\t["++y++" release];\n") "" vn
               in "-(void) dealloc {\n"++rl++
                  "\t[super dealloc];\n}"


imFileEnd :: String
imFileEnd = "\n\n@end\n"

drawRect :: String -> String
drawRect c = "- (void) drawRect: (CGRect) rect {\n\
             \\tCGContextRef context = UIGraphicsGetCurrentContext();\n\
             \\tCGContextScaleCTM(context, scaleFactor, scaleFactor);\n"
             ++ c ++ "}\n\n"

imSynths :: [String] -> String
imSynths = foldr (\y x -> x++"@synthesize "++y++";\n") "@synthesize scaleFactor;\n"

hFileStart :: String -> String
hFileStart file = fileHeader++
                  "#import \"svg2q.h\";\n\
                  \#import <UIKit/UIKit.h>;\n\n\
                  \@interface "++file++" : UIView {\n"


hFileEnd :: String
hFileEnd = "\n\n@end\n"

hProperties :: [Maybe GraphicsElement] -> String
hProperties xs = let m = (mapMaybe mkMember (catMaybes xs))
                     pl = map hProp m
                 in foldl (++)
                          "\t@property(nonatomic, assign)\tfloat scaleFactor;\n"
                          pl

hProp :: String -> String
hProp s  = "\t@property(nonatomic, retain) "++s

hMem :: String -> String
hMem x= "\t"++x++";\n"

hMembers :: [Maybe GraphicsElement] -> String
hMembers xs = foldl (++) "float scaleFactor;\n" (mapMaybe mkMember (catMaybes xs))

imScale :: String
imScale = "- (void) redraw {\
          \\n\t[self setNeedsDisplay];\
          \\n}\n\n"