def translate_js_with_compilation_plan(js, HEADER=DEFAULT_HEADER):
match_increaser_str, match_increaser_num, compilation_plan = get_compilation_plan(<EOL>js)<EOL>cp_hash = hashlib.md5(compilation_plan.encode('<STR_LIT:utf-8>')).digest()<EOL>try:<EOL><INDENT>python_code = cache[cp_hash]['<STR_LIT>']<EOL><DEDENT>except:<EOL><INDENT>parser = pyjsparser.PyJsParser()<EOL>parsed = parser.parse(compilation_plan)  <EOL>translating_nodes.clean_stacks()<EOL>python_code = translating_nodes.trans(<EOL>parsed)  <EOL>cache[cp_hash] = {<EOL>'<STR_LIT>': compilation_plan,<EOL>'<STR_LIT>': python_code,<EOL>}<EOL><DEDENT>python_code = match_increaser_str.wrap_up(python_code)<EOL>python_code = match_increaser_num.wrap_up(python_code)<EOL>return HEADER + python_code<EOL>
js has to be a javascript source code.
       returns equivalent python code.

       compile plans only work with the following restrictions:
       - only enabled for oneliner expressions
       - when there are comments in the js code string substitution is disabled
       - when there nested escaped quotes string substitution is disabled, so

       cacheable:
       Q1 == 1 && name == 'harry'

       not cacheable:
       Q1 == 1 && name == 'harry' // some comment

       not cacheable:
       Q1 == 1 && name == 'o\'Reilly'

       not cacheable:
       Q1 == 1 && name /* some comment */ == 'o\'Reilly'