mirror of
https://github.com/zero-peak/ZeroOmega.git
synced 2025-02-12 23:28:13 -05:00
147 lines
5.1 KiB
CoffeeScript
147 lines
5.1 KiB
CoffeeScript
U2 = require 'uglify-js'
|
|
Profiles = require './profiles'
|
|
|
|
# PacGenerator is used like a singleton class instance.
|
|
# coffeelint: disable=missing_fat_arrows
|
|
module.exports =
|
|
ascii: (str) ->
|
|
str.replace /[\u0080-\uffff]/g, (char) ->
|
|
hex = char.charCodeAt(0).toString(16)
|
|
result = '\\u'
|
|
result += '0' for _ in [hex.length...4]
|
|
result += hex
|
|
return result
|
|
|
|
compress: (ast) ->
|
|
ast.figure_out_scope()
|
|
compressor = U2.Compressor(warnings: false, keep_fargs: true,
|
|
if_return: false)
|
|
compressed_ast = ast.transform(compressor)
|
|
compressed_ast.figure_out_scope()
|
|
compressed_ast.compute_char_frequency()
|
|
compressed_ast.mangle_names()
|
|
compressed_ast
|
|
|
|
script: (options, profile, args) ->
|
|
if typeof profile == 'string'
|
|
profile = Profiles.byName(profile, options)
|
|
refs = Profiles.allReferenceSet(profile, options,
|
|
profileNotFound: args?.profileNotFound)
|
|
|
|
profiles = new U2.AST_Object properties:
|
|
for key, name of refs when key != '+direct'
|
|
p = if typeof profile == 'object' and profile.name == name
|
|
profile
|
|
else
|
|
Profiles.byName(name, options)
|
|
if not p?
|
|
p = Profiles.profileNotFound(name, args?.profileNotFound)
|
|
new U2.AST_ObjectKeyVal(key: key, value: Profiles.compile(p))
|
|
|
|
factory = new U2.AST_Function(
|
|
argnames: [
|
|
new U2.AST_SymbolFunarg name: 'init'
|
|
new U2.AST_SymbolFunarg name: 'profiles'
|
|
]
|
|
body: [new U2.AST_Return value: new U2.AST_Function(
|
|
argnames: [
|
|
new U2.AST_SymbolFunarg name: 'url'
|
|
new U2.AST_SymbolFunarg name: 'host'
|
|
]
|
|
body: [
|
|
new U2.AST_Directive value: 'use strict'
|
|
new U2.AST_Var definitions: [
|
|
new U2.AST_VarDef name: new U2.AST_SymbolVar(name: 'result'), value:
|
|
new U2.AST_SymbolRef name: 'init'
|
|
new U2.AST_VarDef name: new U2.AST_SymbolVar(name: 'scheme'), value:
|
|
new U2.AST_Call(
|
|
expression: new U2.AST_Dot(
|
|
expression: new U2.AST_SymbolRef name: 'url'
|
|
property: 'substr'
|
|
)
|
|
args: [
|
|
new U2.AST_Number value: 0
|
|
new U2.AST_Call(
|
|
expression: new U2.AST_Dot(
|
|
expression: new U2.AST_SymbolRef name: 'url'
|
|
property: 'indexOf'
|
|
)
|
|
args: [new U2.AST_String value: ':']
|
|
)
|
|
]
|
|
)
|
|
]
|
|
new U2.AST_Do(
|
|
body: new U2.AST_BlockStatement body: [
|
|
new U2.AST_SimpleStatement body: new U2.AST_Assign(
|
|
left: new U2.AST_SymbolRef name: 'result'
|
|
operator: '='
|
|
right: new U2.AST_Sub(
|
|
expression: new U2.AST_SymbolRef name: 'profiles'
|
|
property: new U2.AST_SymbolRef name: 'result'
|
|
)
|
|
)
|
|
new U2.AST_If(
|
|
condition: new U2.AST_Binary(
|
|
left: new U2.AST_UnaryPrefix(
|
|
operator: 'typeof'
|
|
expression: new U2.AST_SymbolRef name: 'result'
|
|
)
|
|
operator: '==='
|
|
right: new U2.AST_String value: 'function'
|
|
)
|
|
body: new U2.AST_SimpleStatement body: new U2.AST_Assign(
|
|
left: new U2.AST_SymbolRef name: 'result'
|
|
operator: '='
|
|
right: new U2.AST_Call(
|
|
expression: new U2.AST_SymbolRef name: 'result'
|
|
args: [
|
|
new U2.AST_SymbolRef name: 'url'
|
|
new U2.AST_SymbolRef name: 'host'
|
|
new U2.AST_SymbolRef name: 'scheme'
|
|
]
|
|
)
|
|
)
|
|
)
|
|
]
|
|
condition: new U2.AST_Binary(
|
|
left: new U2.AST_Binary(
|
|
left: new U2.AST_UnaryPrefix(
|
|
operator: 'typeof'
|
|
expression: new U2.AST_SymbolRef name: 'result'
|
|
)
|
|
operator: '!=='
|
|
right: new U2.AST_String value: 'string'
|
|
)
|
|
operator: '||'
|
|
right: new U2.AST_Binary(
|
|
left: new U2.AST_Call(
|
|
expression: new U2.AST_Dot(
|
|
expression: new U2.AST_SymbolRef name: 'result'
|
|
property: 'charCodeAt'
|
|
)
|
|
args: [new U2.AST_Number(value: 0)]
|
|
)
|
|
operator: '==='
|
|
right: new U2.AST_Number value: '+'.charCodeAt(0)
|
|
)
|
|
)
|
|
)
|
|
new U2.AST_Return value: new U2.AST_SymbolRef name: 'result'
|
|
]
|
|
)]
|
|
)
|
|
new U2.AST_Toplevel body: [new U2.AST_Var definitions: [
|
|
new U2.AST_VarDef(
|
|
name: new U2.AST_SymbolVar name: 'FindProxyForURL'
|
|
value: new U2.AST_Call(
|
|
expression: factory
|
|
args: [
|
|
Profiles.profileResult profile.name
|
|
profiles
|
|
]
|
|
)
|
|
)
|
|
]]
|
|
# coffeelint: enable=missing_fat_arrows
|