úÎ.…(ÀA      !"#$%&'()*+,-./0123456789:;<=>?@None%A BCDE FG HIJK   A  BCDE FG HIJKNone&CA transformation applied to the final expression. Most often, this E would be used to force the type of the expression to help make more  meaningful error messages. 2KCoffeescript, TypeScript, and other languages compiles down to Javascript. ^ Previously we waited until the very end, at the rendering stage to perform this compilation.  Lets call is a post-conversion E This had the advantage that all Haskell values were inserted first: X for example a value could be inserted that Coffeescript would compile into Javascript. P While that is perhaps a safer approach, the advantage is not used in practice: 4 it was that way mainly for ease of implementation. Y The down-side is the template must be compiled down to Javascript during every request. B If instead we do a pre-conversion to compile down to Javascript, / we only need to perform the compilation once. HThe problem then is the insertion of Haskell values: we need a hole for > them. This can be done with variables known to the language. B During the pre-conversion we first modify all Haskell insertions  So ##{a} is change to shakespeare_var_a I Then we can place the Haskell values in a function wrapper that exposes L those variables: (function(shakespeare_var_a){ ... shakespeare_var_a ...}) E TypeScript can compile that, and then we tack an application of the " Haskell values onto the result: (#{a}) jpreEscapeIgnoreBalanced is used to not insert backtacks for variable already inside strings or backticks. v coffeescript will happily ignore the interpolations, and backticks would not be treated as escaping in that context. V preEscapeIgnoreLine was added to ignore comments (which in Coffeescript begin with a '#') 8%A parser with a user state of [String] L)run a parser with a user state of [String] Mcalls N+ when there is stderr or exit code failure >GDetermine which identifiers are used by the given template, useful for $ creating systems like yesod devel. KOPQRSTUVWXYZ[\]^_`a !"#$%&'()*+,-./012345678Lbc9defMfor error reporting gfor error reporting :h;<=i>jkl?@mnop( !"#$%&'()*+,-./0123456789:;<=>?@( !"#$%&234567*+,-./01')(9;=?<>8@:&OPTSRQXWVUYZ_^]\[`a  !"#$%&')(*+,-./012345678Lbc9defMg:h;<=i>jkl?@mnopq       !"#$%&'()*++,-./01223456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrshakespeare-1.2.0.1Text.Shakespeare.BaseText.ShakespeareDeref DerefTuple DerefList DerefBranch DerefString DerefRational DerefIntegral DerefIdentDerefModulesIdentScopeIdent parseDeref derefToExp flattenDeref parseHashparseVarparseAtparseUrlparseVarStringparseUrlStringparseIntString parseCaretparseInt parseUnder readUtf8FileVarType RenderUrlShakespeareSettingsvarCharurlCharintChar toBuilderwrapunwrapjustVarInterpolation preConversionmodifyFinalValue PreConversionId ReadProcess WrapInsertionwrapInsertionIndentwrapInsertionStartBeginwrapInsertionSeparatorwrapInsertionStartClosewrapInsertionEndwrapInsertionAddParens PreConvert preConvertpreEscapeIgnoreBalancedpreEscapeIgnoreLine wrapInsertionParserdefaultShakespeareSettingspack' shakespeareshakespeareFromStringshakespeareFileshakespeareUsedIdentifiersshakespeareFileReloadshakespeareRuntime UserParser derefParensderefCurlyBrackets derefList derefTupleread'expType curlyBracketsparseInterpolatedString $fLiftDeref $fLiftIdentparsereadProcessErrorbaseGHC.ErrerrorMTimeVarExpEMixin EUrlParamEUrlEPlainVTMixin VTUrlParamVTUrlVTPlainContentsContent ContentMixContentUrlParam ContentUrl ContentVar ContentRaw ShakespeareQueryParameters readFileQ readFileUtf8 eShowErrorscontentFromString parseContents preFiltercontentsToShakespearegetVars reloadMapReflookupReloadMapinsertReloadMap$fLiftShakespeareSettings$fLiftPreConversion$fLiftWrapInsertion$fLiftPreConvert