# # # # web_files_util.cfv # # # # # # # # # extract_language_variables_from_js_file # # # # subroutine(extract_language_variables_from_js_file( string file_path, node lang_variables), ( debug_message("\n\n#### extract_language_variables_from_js_file() START \n"); debug_message("#### file_path: " . file_path . "\n"); subroutine(get_i1( string line), ( int i = index(line, "langVar('"); if (i != -1) then ( # Found a language variable, return i i; ) else ( # Return index by checking the language variable surrounded with double quotes index(line, 'langVar("'); ); )); node item; string file; string line; bool is_lang_variable; int i1; int i2; string lang_var; file = open_file(file_path, "r"); while (!end_of_file(file)) ( line = read_line_from_file(file); i1 = get_i1(line); while (i1 != -1) ( # Get substring which starts with the first language variabe string, # add 9 characters so that we omit the "langVar('" word. # debug_message("#### line: " . line . "\n"); line = substr(line, i1 + 9); # debug_message("#### substring of line: " . line . "\n"); # Get the language variable string i2 = index(line, ")"); lang_var = substr(line, 0, i2 - 1); # if (contains(lang_var, "\n")) then ( # error("INVALID LANGUAGE VARIABLE"); # ); # Add lang_var to lang_variables node (use checksum so that duplicate language variables are added only once) @lang_variables{md5_digest(lang_var)} = lang_var; # debug_message("#### lang_var: " . lang_var . "\n"); # Check if the line contains another language variable i1 = get_i1(line); # if (i1 != -1) then ( # debug_message("#### Above line contains another langVar() ! \n"); # ); ); ); close_file(file); # debug_message("\n" . node_as_string(lang_variables) . "\n"); )); # # # # # get_text_from_multiple_files() # # # # subroutine(get_text_from_multiple_files( string web_server_root_dir, node the_files), ( debug_message("\n\n#### get_text_from_multiple_files() \n"); # This returns a string with the text of the given files. # Empty lines are removed. string s; string file_path; string file; string line; node item; foreach item the_files ( file_path = web_server_root_dir . @item; # debug_message("\n#### file_path: " . file_path . "\n"); file = open_file(file_path, "r"); while (!end_of_file(file)) ( line = read_line_from_file(file); # Strip \n while(ends_with(line, '\n')) ( line = substr(line, 0, length(line) - 1); ); # debug_message("#### line length: " . length(line) . "\n"); # debug_message("#### line: " . line . "\n"); # Don't include lines which contain only whitespace if (matches_regular_expression(line, "\S")) then ( # matches any non-whitespace character # debug_message("#### INCLUDE line: " . line . "\n"); s .= line . "\n"; ); ); close_file(file); ); # debug_message("#### s:\n" . s . "\n"); # debug_message("#### get_text_from_multiple_files() END \n\n"); # Return s; )); # # # # compress_css_and_js_files() # # # # subroutine(compress_css_and_js_files( string web_server_root_dir, node the_package), ( debug_message("\n\n#### compress_css_and_js_files() START \n"); node item; string auto_generated_web_file_path; node the_files; string the_text; string auto_generated_web_file; debug_message("\n" . node_as_string(the_package) . "\n"); foreach item the_package ( debug_message("#### item name: " . node_name(item) . "\n"); auto_generated_web_file_path = web_server_root_dir . "auto_generated_web_files/" . @item{"auto_generated_web_file_path"}; debug_message("#### auto_generated_web_file_path: " . auto_generated_web_file_path . "\n"); the_files = item{"files"}; # # Get combined text # the_text = get_text_from_multiple_files(web_server_root_dir, the_files); # # Minify the combined_text # # TODO, minify ... # # Save combined and minified text to auto_generated_web_file # auto_generated_web_file = open_file(auto_generated_web_file_path, "w"); write_string_to_file(auto_generated_web_file, the_text); close_file(auto_generated_web_file); ); )); # # # # # get_all_packages_of_page() # # # # subroutine(get_all_packages_of_page( string css_or_js_packages_name, node all_pages, node page), ( debug_message("\n\n#### get_all_packages_of_page() START \n"); debug_message("#### css_or_js_packages_name: " . css_or_js_packages_name . "\n"); delete_node("v.temp_" . css_or_js_packages_name); "v.temp_" . css_or_js_packages_name = ""; node n = "v.temp_" . css_or_js_packages_name; node item; int count = 0; if (all_pages?{css_or_js_packages_name}) then ( foreach item (all_pages{css_or_js_packages_name}) ( @n{count} = @item; count++; ); ); if (page?{css_or_js_packages_name}) then ( foreach item (page{css_or_js_packages_name}) ( @n{count} = @item; count++; ); ); # Return n n; )); # # # # # add_css_parameters_to_auto_generated_file_map() # # # # subroutine(add_css_parameters_to_auto_generated_file_map( node css_packages, node css_style_map, node css_packages_of_page, node new_file_map), ( node item; string package_name; int count = 0; node css_package; node css_files; node css_file_item; string css_file_item_name; node css_style_map_item; node style_item; string css_styles = ""; foreach item css_packages_of_page ( package_name = @item; css_package = css_packages{package_name}; @new_file_map{"css_files"}{count} = @css_package{"auto_generated_web_file_path"}; # Check css files if they are part in css_style_map css_files = css_package{"files"}; foreach css_file_item css_files ( css_file_item_name = node_name(css_file_item); if (css_style_map?{css_file_item_name}) then ( # # Add css styles to file map of page # css_style_map_item = css_style_map{css_file_item_name}; foreach style_item css_style_map_item ( # Add all css styles as single string css_styles .= @style_item . "\n"; ); ); ); count++; ); if (css_styles ne "") then ( @new_file_map{"css_styles"} = css_styles; ); )); # # # # # add_js_parameters_to_auto_generated_file_map() # # # # subroutine(add_js_parameters_to_auto_generated_file_map( string web_server_root_dir, node js_packages, node js_packages_of_page, node new_file_map), ( node item; string package_name; string auto_generated_web_file_path; int count = 0; delete_node("v.temp_language_variables"); "v.temp_language_variables" = ""; node lang_vars = "v.temp_language_variables"; foreach item js_packages_of_page ( package_name = @item; @new_file_map{"js_files"}{count} = @js_packages{package_name}{"auto_generated_web_file_path"}; # # Add language variables for this package to lang_vars # auto_generated_web_file_path = "auto_generated_web_files/" . @js_packages{package_name}{"auto_generated_web_file_path"}; extract_language_variables_from_js_file(web_server_root_dir . auto_generated_web_file_path, lang_vars); count++; ); # # Add language variables to page of new_file_map # count = 0; foreach item lang_vars ( @new_file_map{"language_variables"}{count} = @item; count++; ); )); # # # # # create_auto_generated_file_map() # # # # subroutine(create_auto_generated_file_map( string web_server_root_dir, node css_packages, node css_style_map, node js_packages, node default_file_map, string file_map_name), ( debug_message("\n\n#### create_auto_generated_file_map() START \n"); # delete_node("v.temp_new_file_map"); # v.temp_new_file_map = ""; # node new_file_map = "v.temp_new_file_map"; node new_file_map; node all_pages = if (default_file_map?{"all_pages"}) then (default_file_map{"all_pages"}) else (new_node();); node pages = default_file_map{"pages"}; node page_item; string page_name; node css_packages_of_page; node js_packages_of_page; foreach page_item pages ( page_name = node_name(page_item); delete_node("v.temp_new_file_map"); v.temp_new_file_map = ""; new_file_map = "v.temp_new_file_map"; css_packages_of_page = get_all_packages_of_page("css_packages", all_pages, page_item); js_packages_of_page = get_all_packages_of_page("js_packages", all_pages, page_item); debug_message("\n\n#### page_name: " . page_name . "\n"); debug_message("\n" . node_as_string(css_packages_of_page) . "\n"); debug_message("\n" . node_as_string(js_packages_of_page) . "\n\n"); add_css_parameters_to_auto_generated_file_map(css_packages, css_style_map, css_packages_of_page, new_file_map); add_js_parameters_to_auto_generated_file_map(web_server_root_dir, js_packages, js_packages_of_page, new_file_map); # Save one file map per page so that each one is as small as possible clone_node(new_file_map, "file_maps.auto_generated_file_maps." . file_map_name . "." . page_name); save_node("file_maps.auto_generated_file_maps." . file_map_name . "." . page_name); ); # Save new_file_map # clone_node(new_file_map, "file_maps.auto_generated_file_maps." . file_map_name); # save_node("file_maps.auto_generated_file_maps." . file_map_name); )); # # # # # create_web_files() # # # # subroutine(create_web_files, ( debug_message("\n\n#### compress() START \n"); string web_server_root_dir = LOGANALYSISINFO_DIRECTORY . "WebServerRoot" . "/"; node file_maps = "file_maps"; node css_packages = file_maps{"css_packages"}; node css_style_map = file_maps{"css_style_map"}; node js_packages = file_maps{"js_packages"}; # # Compress css and js files # compress_css_and_js_files(web_server_root_dir, css_packages); compress_css_and_js_files(web_server_root_dir, js_packages); # # Create auto_generated_file_maps # node default_file_maps = file_maps{"default_file_maps"}; node default_file_map; string file_map_name; foreach default_file_map default_file_maps ( file_map_name = node_name(default_file_map); create_auto_generated_file_map( web_server_root_dir, css_packages, css_style_map, js_packages, default_file_map, file_map_name ); ); # Add compressed timestamp file. The date of this file is used # for the web server root id. It is also used for profile # specific js files which include the language and image variables # which are generated upon compress(). # So each compress() operation should force the creation of a # new profile specific js file. # Create the timestamp file write_file(web_server_root_dir . "/auto_generated_web_files/timestamp.txt", now()); # "version.css_js_file_compression_timestamp" = epoc_to_date_time(now()); # save_node("version"); ));