module TemplateEditor using JSON3, Genie, Unicode import Unicode.normalize export generate_layout_html dict_libraries = Dict( "ECharts" => "", "GSAP" => "", "Leaflet" => " " ) function register_components() p_components = "public/js/components" components_filenames = readdir(p_components) components_names = String[] for filename in components_filenames if filename[1:5]!="index" n = filename[1:end-3] push!(components_names,n) Genie.Renderer.Html.register_normal_element(replace(n,"-" => "__")) end end return end """ template_filename - name of a template to use controller - name of a controller where to look for a view file view_filename - a view file name css - should be a vector of names of css files libraries - should be a vector of names of library names from `dict_libraries` """ template_filename,controller,view_filename = "main","basic","landing" css=["landing"] libraries=["Leaflet"] preload=[Dict("path"=>"/img/crowd.webp","type"=>"image")] function generate_layout_html(template_filename,controller,view_filename; css=nothing, libraries=nothing, preload=nothing) template_filename = template_filename*".jl.html" function add_spacing(snippet_name,snippet,html) ind = findfirst(snippet_name,html)[1] - 1 cnt = 0 while true if html[ind]=='\n' break else ind = ind - 1 cnt += 1 end end snippet = replace(snippet,"\n" => string("\n",repeat(" ",cnt))) return snippet end function push_component_tags(tags,html,components_names) for n in components_names if occursin(n,html) push!(tags,n) end end end function list_files(x) v = String[] for (root, dirs, files) in walkdir(x) for file in files file = joinpath(root, file) push!(v, file) end end return v end warning_comment = """ """ p_components = "public/js/components" components_filenames = readdir(p_components) components_names = String[] for filename in components_filenames if filename[1:5]!="index" n = filename[1:end-3] push!(components_names,n) Genie.Renderer.Html.register_normal_element(replace(n,"-" => "__")) end end #= p_snippets = "app/layouts/snippets" snippet_filenames = readdir(p_snippets) snippet_names = map(x-> string("<%@",x[1:end-8],"%>"],snippet_filenames) snippets = String[] for snippet_filename in snippet_filenames snippet = open(joinpath(p_snippets,snippet_filename)) do file read(file, String) end push!(snippets,snippet) end =# savepath = "app/layouts" p_controllers = "app/resources" p_templates = "app/layouts" p_components = "public/js/components" p_css = "public/css" p_svelte = "./app/svelte/src" template_filenames = readdir(p_templates) controllers_dirs = readdir(p_controllers) dict_views = Dict{String,String}() dict_template_views = Dict{String,Vector{String}}() #for controller in controllers_dirs # Get views p_controller = joinpath(p_controllers,controller) p_views = joinpath(p_controller,"views") #if isdir(p_views) # HTML code for view #for view_filename in readdir(p_views) html_view = open(joinpath(p_views,view_filename*".jl.html")) do file read(file, String) end dict_views[view_filename] = html_view #end #end # Get views per template controller_vec = filter(x -> occursin("Controller",x),readdir(p_controller)) if !isempty(controller_vec) controller_filename = controller_vec[1] controller_code = open(joinpath(p_controller,controller_filename)) do file read(file, String) end controller_split = split(controller_code,"\n") controller_filtered = filter(x -> occursin("html(",x) && !occursin("generate_layout_html",x),controller_split) controller_split = map(x -> split(x,",")[2:3],controller_filtered) controller_pairs = map(x -> map(y -> split(y,":")[end],x),controller_split) for pair in controller_pairs view = pair[1] template = pair[end] if template in keys(dict_template_views) push!(dict_template_views[template],view) else dict_template_views[template] = [view] end end end #end # html - HTML code for template html = open(joinpath(p_templates,template_filename)) do file read(file, String) end html_view = dict_views[view_filename] files_svelte = list_files(p_svelte) files_svelte_names = map(x -> split(x, ['/','\\','.'])[end-1],files_svelte) dict_svelte_files = Dict(zip(files_svelte_names,files_svelte)) css_tags = [] tags = [] push_component_tags(tags,html,components_names) push_component_tags(tags,html_view,components_names) for tag in tags js = open(joinpath(p_components,string(tag,".js"))) do file read(file, String) end temp_tags = [] js_split = split(js,"\n") js_temp = string(js_split[occursin.("import",js_split)]) push_component_tags(temp_tags,js_temp,components_names) map(t -> t in tags ? nothing : push!(tags,t),temp_tags) if tag in keys(dict_svelte_files) svelte = open(dict_svelte_files[tag]) do file read(file, String) end svelte_split = split(svelte,"\r\n") svelte_css_imports = filter(x -> occursin("@import",x),svelte_split) css_tags_temp = map(x -> split(x,['\'','"'])[end-1], svelte_css_imports) push!(css_tags,css_tags_temp...) end end css_tags = unique(css_tags) if !isnothing(css) map(x -> push!(css_tags,"/css/"*x*".css"),css) end #html = string(warning_comment,html) #= for (snippet_name,snippet) in zip(snippet_names,snippets) if (occursin(snippet_name, html)) snippet = add_spacing(snippet_name,snippet,html) html = replace(html,snippet_name => snippet) end end htmls = [html,html_view] template_name = template_filename[1:end-8] p_view_snippets = joinpath(p_view,"snippets",template_name) if isdir(p_view_snippets) view_snippets_filenames = readdir(p_view_snippets) view_snippet_html = open(joinpath(p_view,template_filename)) do file read(file, String) end push!(htmls,view_snippet_html) end =# ind_opening = findfirst("",html)[1] - 1 ind_closing = findfirst("",html)[1] - 1 components_to_add = "\n " bools_navbar = contains.(tags,"navbar") bools_footer = contains.(tags,"footer") bools_main = contains.(tags,view_filename) keep_bools = (!).(bools_navbar .| bools_footer .| bools_main) navbar_tags = tags[bools_navbar] footer_tags = tags[bools_footer] main_tag = tags[bools_main] tags = reduce(vcat,[tags[keep_bools],navbar_tags,main_tag,footer_tags]) for ind = 1:lastindex(keep_bools) component_name = tags[ind] if (component_name in navbar_tags) || (component_name in footer_tags) || (component_name in main_tag) components_to_add = string(components_to_add,"\n ") else components_to_add = string(components_to_add,"\n ") end end html = string(html[1:ind_opening],components_to_add,"\n",html[ind_closing+1:end]) ind_opening = findfirst("",html)[1] - 1 ind_closing = findfirst("",html)[1] - 1 css_to_add = "\n " for css_name in css_tags css_to_add = string(css_to_add,"\n ") end html = string(html[1:ind_opening],css_to_add,"\n",html[ind_closing+1:end]) tags_libraries = String["GSAP"] if !isnothing(libraries) ks = collect(keys(dict_libraries)) ks_normalized = lowercase.(ks) libraries_normalized = lowercase.(libraries) lib = libraries_normalized[1] for lib in libraries_normalized inds = lib .== ks_normalized if count(inds)==1 push!(tags_libraries,ks[inds][1]) end end end ind_opening = findfirst("",html)[1] - 1 ind_closing = findfirst("",html)[1] - 1 libraries_to_add = "\n " for lib in tags_libraries libraries_to_add = string(libraries_to_add,"\n "*dict_libraries[lib]) end html = string(html[1:ind_opening],libraries_to_add,"\n",html[ind_closing+1:end]) if !isnothing(preload) ind_opening = findfirst("",html)[1] - 1 ind_closing = findfirst("",html)[1] - 1 preload_to_add = "\n " for preload_data in preload preload_to_add = string(preload_to_add,"\n ") end html = string(html[1:ind_opening],preload_to_add,"\n",html[ind_closing+1:end]) end #= path = joinpath(savepath,template_filename) open(path, "w") do io write(io, html) end =# return html end end