Skip to content

Commit

Permalink
Preparing for 0.0.16, having fixed issue #7
Browse files Browse the repository at this point in the history
closes #7
  • Loading branch information
alanz committed Apr 9, 2012
1 parent e55c68f commit 6a29b5a
Show file tree
Hide file tree
Showing 6 changed files with 175 additions and 144 deletions.
4 changes: 4 additions & 0 deletions README.markdown
Expand Up @@ -28,6 +28,10 @@ Running the tests
Changes
-------

0.0.16 - Fix bug for issue 7, blowing up when calculating if space needed after return

0.0.15 - Fix ambiguous symbols with GHC 7.4.1, from @luite

0.0.14 - Allow unicode characters in comments

0.0.13 - Error in parsing numbers with zeros before decimal point
Expand Down
78 changes: 39 additions & 39 deletions Text/Jasmine/Pretty.hs
@@ -1,5 +1,5 @@
module Text.Jasmine.Pretty
(
(
renderJS
) where

Expand Down Expand Up @@ -66,15 +66,15 @@ rn (JSArguments xs) = (text "(") <> (commaListList $ map fixLiterals xs)

rn (JSBlock x) = (text "{") <> (renderJS x) <> (text "}")

rn (JSIf c (NS (JSLiteral ";") _))= (text "if") <> (text "(") <> (renderJS c) <> (text ")")
rn (JSIf c (NS (JSLiteral ";") _))= (text "if") <> (text "(") <> (renderJS c) <> (text ")")
rn (JSIf c t) = (text "if") <> (text "(") <> (renderJS c) <> (text ")") <> (renderJS $ fixBlock t)

rn (JSIfElse c t (NS (JSLiteral ";") _)) = (text "if") <> (text "(") <> (renderJS c) <> (text ")") <> (renderJS t)
<> (text "else")
rn (JSIfElse c t e) = (text "if") <> (text "(") <> (renderJS c) <> (text ")") <> (renderJS t)
rn (JSIfElse c t (NS (JSLiteral ";") _)) = (text "if") <> (text "(") <> (renderJS c) <> (text ")") <> (renderJS t)
<> (text "else")
rn (JSIfElse c t e) = (text "if") <> (text "(") <> (renderJS c) <> (text ")") <> (renderJS t)
<> (text "else") <> (spaceOrBlock $ fixBlock e)
rn (JSMemberDot xs y) = (rJS xs) <> (text ".") <> (renderJS y)
rn (JSMemberSquare xs x) = (rJS xs) <> (text "[") <> (renderJS x) <> (text "]")
rn (JSMemberSquare xs x) = (rJS xs) <> (text "[") <> (renderJS x) <> (text "]")
rn (JSLiteral l) = (text l)
rn (JSStringLiteral s l) = empty <> (char s) <> (text l) <> (char s)
rn (JSUnary l ) = text l
Expand All @@ -88,13 +88,13 @@ rn (JSCallExpression "()" xs) = (rJS xs)
rn (JSCallExpression t xs) = (char $ head t) <> (rJS xs) <> (if ((length t) > 1) then (char $ last t) else empty)

-- No space between 'case' and string literal. TODO: what about expression in parentheses?
--rn (JSCase (JSExpression [JSStringLiteral sepa s]) xs) = (text "case") <> (renderJS (JSStringLiteral sepa s))
rn (JSCase (NS (JSExpression [(NS (JSStringLiteral sepa s) s1)]) _) xs) = (text "case") <> (renderJS (NS (JSStringLiteral sepa s) s1))
<> (char ':') <> (renderJS xs)
rn (JSCase e xs) = (text "case") <+> (renderJS e) <> (char ':') <> (renderJS xs) -- <> (text ";");
--rn (JSCase (JSExpression [JSStringLiteral sepa s]) xs) = (text "case") <> (renderJS (JSStringLiteral sepa s))
rn (JSCase (NS (JSExpression [(NS (JSStringLiteral sepa s) s1)]) _) xs) = (text "case") <> (renderJS (NS (JSStringLiteral sepa s) s1))
<> (char ':') <> (renderJS xs)
rn (JSCase e xs) = (text "case") <+> (renderJS e) <> (char ':') <> (renderJS xs) -- <> (text ";");

rn (JSCatch i [] s) = (text "catch") <> (char '(') <> (renderJS i) <> (char ')') <> (renderJS s)
rn (JSCatch i c s) = (text "catch") <> (char '(') <> (renderJS i) <>
rn (JSCatch i c s) = (text "catch") <> (char '(') <> (renderJS i) <>
(text " if ") <> (rJS c) <> (char ')') <> (renderJS s)

rn (JSContinue is) = (text "continue") <> (rJS is) -- <> (char ';')
Expand All @@ -109,16 +109,16 @@ rn (JSExpressionPostfix o e) = (rJS e) <> (text o)
rn (JSExpressionTernary c v1 v2) = (rJS c) <> (char '?') <> (rJS v1) <> (char ':') <> (rJS v2)
rn (JSFinally b) = (text "finally") <> (renderJS b)

rn (JSFor e1 e2 e3 s) = (text "for") <> (char '(') <> (commaList e1) <> (char ';')
rn (JSFor e1 e2 e3 s) = (text "for") <> (char '(') <> (commaList e1) <> (char ';')
<> (rJS e2) <> (char ';') <> (rJS e3) <> (char ')') <> (renderJS $ fixBlock s)
rn (JSForIn e1 e2 s) = (text "for") <> (char '(') <> (rJS e1) <+> (text "in")
<+> (renderJS e2) <> (char ')') <> (renderJS $ fixBlock s)
rn (JSForVar e1 e2 e3 s) = (text "for") <> (char '(') <> (text "var") <+> (commaList e1) <> (char ';')
rn (JSForVar e1 e2 e3 s) = (text "for") <> (char '(') <> (text "var") <+> (commaList e1) <> (char ';')
<> (rJS e2) <> (char ';') <> (rJS e3) <> (char ')') <> (renderJS $ fixBlock s)
rn (JSForVarIn e1 e2 s) = (text "for") <> (char '(') <> (text "var") <+> (renderJS e1) <+> (text "in")
rn (JSForVarIn e1 e2 s) = (text "for") <> (char '(') <> (text "var") <+> (renderJS e1) <+> (text "in")
<+> (renderJS e2) <> (char ')') <> (renderJS $ fixBlock s)
rn (JSHexInteger i) = (text $ show i) -- TODO: need to tweak this

rn (JSHexInteger i) = (text $ show i) -- TODO: need to tweak this
rn (JSLabelled l v) = (renderJS l) <> (text ":") <> (rJS $ fixSourceElements [fixBlock v])
rn (JSObjectLiteral xs) = (text "{") <> (commaList xs) <> (text "}")
rn (JSPropertyAccessor s n ps b) = (text s) <+> (renderJS n) <> (char '(') <> (rJS ps) <> (text ")") <> (renderJS b)
Expand All @@ -127,19 +127,19 @@ rn (JSRegEx s) = (text s)

rn (JSReturn []) = (text "return")
rn (JSReturn [(NS (JSLiteral ";") _)]) = (text "return;")
rn (JSReturn xs) = (text "return") <> (if (spaceNeeded xs) then (text " ") else (empty)) <> (rJS $ fixSourceElements xs)
rn (JSReturn xs) = (text "return") <> (if (spaceNeeded xs) then (text " ") else (empty)) <> (rJS $ fixSourceElements xs)

rn (JSThrow e) = (text "throw") <+> (renderJS e)

rn (JSStatementBlock x) = (text "{") <> (renderJS x) <> (text "}")

rn (JSStatementList xs) = rJS (fixSourceElements $ map fixBlock xs)

rn (JSSwitch e xs) = (text "switch") <> (char '(') <> (renderJS e) <> (char ')') <>
rn (JSSwitch e xs) = (text "switch") <> (char '(') <> (renderJS e) <> (char ')') <>
(char '{') <> (rJS $ fixSemis xs) <> (char '}')
rn (JSTry e xs) = (text "try") <> (renderJS e) <> (rJS xs)

rn (JSVarDecl i []) = (renderJS i)
rn (JSVarDecl i []) = (renderJS i)
rn (JSVarDecl i xs) = (renderJS i) <> (text "=") <> (rJS xs)

rn (JSVariables kw xs) = (text kw) <+> (commaList xs)
Expand All @@ -148,7 +148,7 @@ rn (JSWhile e (NS (JSLiteral ";") _)) = (text "while") <> (char '(') <> (rende
rn (JSWhile e s) = (text "while") <> (char '(') <> (renderJS e) <> (char ')') <> (renderJS s)

rn (JSWith e s) = (text "with") <> (char '(') <> (renderJS e) <> (char ')') <> (rJS s)

-- Helper functions
rJS :: [JSNode] -> BB.Builder
rJS xs = hcat $ map renderJS xs
Expand All @@ -160,7 +160,7 @@ commaList xs = (hcat $ (punctuate comma (toDoc xs') ++ trail))
-- (xs', trail) = if (last xs == JSLiteral ",") then (init xs, [comma]) else (xs,[])
(xs', trail) = if (x' == JSLiteral ",") then (init xs, [comma]) else (xs,[])
(NS x' _) = last xs

commaListList :: [[JSNode]] -> BB.Builder
commaListList xs = (hcat $ punctuate comma $ map rJS xs)

Expand Down Expand Up @@ -193,7 +193,7 @@ fixTop xs = if (n == (JSLiteral ";")) then (init xs) else (xs)

fixSourceElements :: [JSNode] -> [JSNode]
fixSourceElements xs = fixSemis $ myFix xs

myFix :: [JSNode] -> [JSNode]
myFix [] = []

Expand All @@ -210,27 +210,27 @@ myFix ((NS (JSExpression x) s1):(NS (JSBlock y) s2):xs) = (NS (JSExpression
myFix ((NS (JSBlock x) s1) :(NS (JSBlock y) s2):xs) = (NS (JSBlock x) s1) :(NS (JSLiteral ";") s1):myFix ((NS (JSBlock y) s2):xs)
myFix ((NS (JSBlock x) s1) :(NS (JSExpression y) s2):xs) = (NS (JSBlock x) s1) :(NS (JSLiteral ";") s1):myFix ((NS (JSExpression y) s2):xs)

myFix ((NS (JSExpression x) s1):(NS (JSStatementBlock y) s2):xs) =
myFix ((NS (JSExpression x) s1):(NS (JSStatementBlock y) s2):xs) =
(NS (JSExpression x) s1):(NS (JSLiteral ";") s1):myFix ((NS (JSStatementBlock y) s2):xs)
myFix ((NS (JSStatementBlock x) s1) :(NS (JSStatementBlock y) s2):xs) =
myFix ((NS (JSStatementBlock x) s1) :(NS (JSStatementBlock y) s2):xs) =
(NS (JSStatementBlock x) s1) :(NS (JSLiteral ";") s1):myFix ((NS (JSStatementBlock y) s2):xs)
myFix ((NS (JSStatementBlock x) s1) :(NS (JSExpression y) s2):xs) =
myFix ((NS (JSStatementBlock x) s1) :(NS (JSExpression y) s2):xs) =
(NS (JSStatementBlock x) s1) :(NS (JSLiteral ";") s1):myFix ((NS (JSExpression y) s2):xs)

-- Merge adjacent variable declarations, but only of the same type
myFix ((NS (JSVariables t1 x1s) s1):(NS (JSLiteral l) s2):(NS (JSVariables t2 x2s) s3):xs)
myFix ((NS (JSVariables t1 x1s) s1):(NS (JSLiteral l) s2):(NS (JSVariables t2 x2s) s3):xs)
| t1 == t2 = myFix ((NS (JSVariables t1 (x1s++x2s)) s1):xs)
| otherwise = (NS (JSVariables t1 x1s) s1):myFix ((NS (JSLiteral l) s2):(NS (JSVariables t2 x2s) s3):xs)

myFix ((NS (JSVariables t1 x1s) s1):(NS (JSVariables t2 x2s) s2):xs)
myFix ((NS (JSVariables t1 x1s) s1):(NS (JSVariables t2 x2s) s2):xs)
| t1 == t2 = myFix ((NS (JSVariables t1 (x1s++x2s)) s1):xs)
| otherwise = (NS (JSVariables t1 x1s) s1):myFix ((NS (JSVariables t2 x2s) s2):xs)

-- Merge adjacent semi colons
myFix ((NS (JSLiteral ";") s1):(NS (JSLiteral ";") _s2):xs) = myFix ((NS (JSLiteral ";") s1):xs)
myFix ((NS (JSLiteral ";") s1):(NS (JSLiteral "" ) _s2):xs) = myFix ((NS (JSLiteral "") s1):xs)


myFix (x:xs) = x : myFix xs

-- Merge strings split over lines and using "+"
Expand All @@ -239,11 +239,11 @@ fixLiterals [] = []
-- Old version
fixLiterals ((NS (JSStringLiteral d1 s1) ss1):(NS (JSExpressionBinary "+" [(NS (JSStringLiteral d2 s2) ss2)] r) ss3):xs)
| d1 == d2 = fixLiterals ((NS (JSStringLiteral d1 (s1++s2)) ss1):(r++xs))
| otherwise = (NS (JSStringLiteral d1 s1) ss1):fixLiterals ((NS (JSExpressionBinary "+" [(NS (JSStringLiteral d2 s2) ss2)] r) ss3):xs)
| otherwise = (NS (JSStringLiteral d1 s1) ss1):fixLiterals ((NS (JSExpressionBinary "+" [(NS (JSStringLiteral d2 s2) ss2)] r) ss3):xs)

fixLiterals ((NS (JSExpressionBinary "+" [(NS (JSStringLiteral d1 s1) ss2)] [(NS (JSStringLiteral d2 s2) ss3)]) ss4):xs)
| d1 == d2 = fixLiterals ((NS (JSStringLiteral d1 (s1++s2)) ss2):xs)
| otherwise = (NS (JSExpressionBinary "+" [(NS (JSStringLiteral d1 s1) ss2)] [(NS (JSStringLiteral d2 s2) ss3)]) ss4):fixLiterals xs
| otherwise = (NS (JSExpressionBinary "+" [(NS (JSStringLiteral d1 s1) ss2)] [(NS (JSStringLiteral d2 s2) ss3)]) ss4):fixLiterals xs

fixLiterals (x:xs) = x:fixLiterals xs

Expand All @@ -256,12 +256,12 @@ fixSemis' :: [JSNode] -> [JSNode]
fixSemis' [] = []
fixSemis' [(NS (JSContinue [(NS (JSLiteral ";") _)]) s2)] = [(NS (JSContinue []) s2)]
fixSemis' [x] = [x]
fixSemis' ((NS (JSIf c (NS (JSReturn [(NS (JSLiteral ";") s1)]) s2) ) s3):xs) =
fixSemis' ((NS (JSIf c (NS (JSReturn [(NS (JSLiteral ";") s1)]) s2) ) s3):xs) =
(NS (JSIf c (NS (JSReturn [(NS (JSLiteral ";") s1)]) s2)) s3):(fixSemis' xs)
fixSemis' ((NS (JSIf c (NS (JSContinue [(NS (JSLiteral ";") s1)]) s2) ) s3):xs) =
fixSemis' ((NS (JSIf c (NS (JSContinue [(NS (JSLiteral ";") s1)]) s2) ) s3):xs) =
(NS (JSIf c (NS (JSContinue [(NS (JSLiteral ";") s1)]) s2)) s3):(fixSemis' xs)
fixSemis' (x:(NS (JSLiteral "\n") s1):xs) = x:(NS (JSLiteral "\n") s1):(fixSemis' xs) -- TODO: is this needed?
fixSemis' ((NS (JSCase e1 ((NS (JSStatementList []) s1))) s2):(NS (JSCase e2 x) s3):xs) =
fixSemis' ((NS (JSCase e1 ((NS (JSStatementList []) s1))) s2):(NS (JSCase e2 x) s3):xs) =
(NS (JSCase e1 ((NS (JSStatementList []) s1))) s2):fixSemis' ((NS (JSCase e2 x) s3):xs)
fixSemis' (x:xs) = x:(NS (JSLiteral ";") SpanEmpty):fixSemis' xs

Expand All @@ -274,10 +274,10 @@ fixBlock (NS (JSStatementBlock (NS (JSStatementList []) s1) ) _) = (NS (JSLitera
fixBlock (NS (JSBlock (NS (JSStatementList [x]) _) ) _) = fixBlock x
fixBlock (NS (JSStatementBlock (NS (JSStatementList [x]) _) ) _) = fixBlock x

fixBlock (NS (JSBlock (NS (JSStatementList xs) s1) ) s2) =
fixBlock (NS (JSBlock (NS (JSStatementList xs) s1) ) s2) =
fixBlock' (NS (JSBlock (NS (JSStatementList (fixSourceElements xs)) s1)) s2)

fixBlock (NS (JSStatementBlock (NS (JSStatementList xs) s1) ) s2) =
fixBlock (NS (JSStatementBlock (NS (JSStatementList xs) s1) ) s2) =
fixBlock' (NS (JSStatementBlock (NS (JSStatementList (fixSourceElements xs)) s1)) s2)

fixBlock x = x
Expand All @@ -290,12 +290,12 @@ fixBlock' x = x

-- A space is needed if this expression starts with an identifier etc, but not if with a '('
spaceNeeded :: [JSNode] -> Bool
spaceNeeded xs =
spaceNeeded xs =
let
-- str = show $ rJS xs
str = LB.unpack $ BB.toLazyByteString $ rJS xs
in
head str /= (fromIntegral $ ord '(')
in
(str /= []) && head str /= (fromIntegral $ ord '(')

-- ---------------------------------------------------------------------
-- Test stuff
Expand All @@ -308,7 +308,7 @@ _case0 :: JSNode
_case0 = NS (JSSourceElementsTop [NS (JSStatementBlock (NS (JSStatementList [NS (JSStatementBlock (NS (JSStatementList [NS (JSStatementBlock (NS (JSStatementList []) (SpanPoint {span_filename = "", span_row = 1, span_column = 3}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 3})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 3}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 2})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 2}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 1})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 1})

_case01 :: [JSNode]
_case01 = [NS (JSStatementBlock (NS (JSStatementList [NS (JSStatementBlock (NS (JSStatementList [NS (JSStatementBlock (NS (JSStatementList []) (SpanPoint {span_filename = "", span_row = 1, span_column = 3}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 3})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 3}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 2})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 2}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 1})]
_case01 = [NS (JSStatementBlock (NS (JSStatementList [NS (JSStatementBlock (NS (JSStatementList [NS (JSStatementBlock (NS (JSStatementList []) (SpanPoint {span_filename = "", span_row = 1, span_column = 3}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 3})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 3}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 2})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 2}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 1})]

-- readJs "if(x){}{a=2}"
_case1 :: JSNode
Expand Down
6 changes: 3 additions & 3 deletions hjsmin.cabal
@@ -1,12 +1,12 @@
name: hjsmin
version: 0.0.15
version: 0.0.16
license: BSD3
license-file: LICENSE
author: Alan Zimmerman <alan.zimm@gmail.com>
maintainer: Alan Zimmerman <alan.zimm@gmail.com>
synopsis: Haskell implementation of a javascript minifier
description:
Reduces size of javascript files by stripping out extraneous whitespace and
Reduces size of javascript files by stripping out extraneous whitespace and
other syntactic elements, without changing the semantics.
category: Web
stability: unstable
Expand All @@ -15,7 +15,7 @@ build-type: Simple
homepage: http://github.com/alanz/hjsmin
bug-reports: http://github.com/alanz/hjsmin/issues

Extra-source-files:
Extra-source-files:
TODO.txt, README.markdown, buildall.sh


Expand Down

0 comments on commit 6a29b5a

Please sign in to comment.