From 9d1397715e3c4b6d41de28e62a5e2a72caab4ffa Mon Sep 17 00:00:00 2001 From: Gaurav Kumar Date: Thu, 1 May 2025 10:00:44 +0530 Subject: [PATCH] dlf --- .../Controller/HtmlGeneratorController.java | 4 +- .../realnet/OpenAi/Services/HtmlBuilder4.java | 232 +++++---- .../com/realnet/dlf/Builders/HtmlBuilder.java | 31 ++ .../Controllers/Design_lbraryController.java | 7 + .../dlf/Services/Design_lbraryService.java | 103 ++++ .../com/realnet/dlf/Services/HtmlService.java | 461 ++++++++++++++++++ 6 files changed, 746 insertions(+), 92 deletions(-) create mode 100644 visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Builders/HtmlBuilder.java create mode 100644 visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Services/HtmlService.java diff --git a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/OpenAi/Controller/HtmlGeneratorController.java b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/OpenAi/Controller/HtmlGeneratorController.java index a6d7745..572a19c 100644 --- a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/OpenAi/Controller/HtmlGeneratorController.java +++ b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/OpenAi/Controller/HtmlGeneratorController.java @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RestController; import com.realnet.OpenAi.Services.HtmlBuilder4; import com.realnet.OpenAi.Services.HtmlGenerTorService; +import com.realnet.dlf.Services.HtmlService; import com.realnet.fnd.response.EntityResponse; @RestController @@ -47,7 +48,8 @@ public class HtmlGeneratorController { return ResponseEntity.badRequest().body("Missing 'jsonStructure' in request."); } - String html = HtmlBuilder4.buildHtml(jsonStructure); +// String html = HtmlBuilder4.buildHtml(jsonStructure); + String html = HtmlService.buildHtml(jsonStructure); return ResponseEntity.ok(new EntityResponse(html)); } catch (Exception e) { e.printStackTrace(); diff --git a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/OpenAi/Services/HtmlBuilder4.java b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/OpenAi/Services/HtmlBuilder4.java index 9e4f38f..b930842 100644 --- a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/OpenAi/Services/HtmlBuilder4.java +++ b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/OpenAi/Services/HtmlBuilder4.java @@ -255,6 +255,7 @@ public class HtmlBuilder4 { TYPE_RENDERERS.put("blog-author-bio", HtmlBuilder4::renderBlogAuthorBio); TYPE_RENDERERS.put("newsletter-signup", HtmlBuilder4::renderNewsletterSignup); TYPE_RENDERERS.put("blog-categories", HtmlBuilder4::renderBlogCategories); + TYPE_RENDERERS.put("how-to-blog-post", HtmlBuilder4::renderHowToBlogPost); // Media TYPE_RENDERERS.put("video-section", HtmlBuilder4::renderVideoSection); @@ -928,12 +929,30 @@ public class HtmlBuilder4 { String className = get(child, "class"); if ("img".equalsIgnoreCase(type)) { - sb.append("\"")"); + String ref = getString(child, "ref", ""); + String classAttr = getString(child, "class", ""); + String src = getString(child, "src", "").trim(); + String alt = getString(child, "alt", "Image"); + + if (src.isEmpty()) { + src = "/assets/images/place.png"; + } + + if ("feature-image".equalsIgnoreCase(ref) || "feature-image".equalsIgnoreCase(classAttr)) { + // ✅ Correct: render actual + sb.append("\"").append(alt)"); + } else { + // ✅ fallback icon + sb.append(renderImageDiv(child)); + } } - if ("img".equals(type)) { - sb.append(renderImageDiv(child)); - } else if ("div".equals(type) && "placeholder-img".equals(className)) { + + else if ("div".equals(type) && "placeholder-img".equals(className)) { sb.append(renderImageDiv(child)); } @@ -969,6 +988,74 @@ public class HtmlBuilder4 { return sb.toString(); } + private static String renderFeatureSection(Map node) { + StringBuilder sb = new StringBuilder(); + sb.append("
"); + + List> children = getChildren(node); + + for (Map child : children) { + String type = getString(child, "type", ""); + String className = get(child, "class"); + + if ("img".equalsIgnoreCase(type)) { + String ref = getString(child, "ref", ""); + String classAttr = getString(child, "class", ""); + String src = getString(child, "src", "").trim(); + String alt = getString(child, "alt", "Image"); + + if (src.isEmpty()) { + src = "/assets/images/place.png"; + } + + if ("feature-image".equalsIgnoreCase(ref) || "feature-image".equalsIgnoreCase(classAttr)) { + // ✅ Correct: render actual + sb.append("\"").append(alt).append("\"");"); + } else { + // ✅ fallback icon + sb.append(renderImageDiv(child)); + } + } + + else if ("div".equals(type) && "placeholder-img".equals(className)) { + sb.append(renderImageDiv(child)); + } + + else if ("div".equalsIgnoreCase(type)) { + sb.append("
"); + + List> divChildren = getChildren(child); + for (Map inner : divChildren) { + String innerType = getString(inner, "type", ""); + + if ("h2".equalsIgnoreCase(innerType)) { + sb.append("

").append(getString(inner, "content", "")) + .append("

"); + } else if ("p".equalsIgnoreCase(innerType)) { + sb.append("

").append(getString(inner, "content", "")) + .append("

"); + } else if ("ul".equalsIgnoreCase(innerType)) { + sb.append("
    "); + List> items = getChildren(inner); + for (Map li : items) { + sb.append("
  • ").append(getString(li, "content", "")).append("
  • "); + } + sb.append("
"); + } + } + + sb.append("
"); + } + } + + sb.append("
"); + return sb.toString(); + } + private static String renderFeatureGrid(Map node) { return "
Features
"; } @@ -3906,74 +3993,86 @@ public class HtmlBuilder4 { private static String renderBrandGuideline(Map data) { StringBuilder html = new StringBuilder(); - html.append("
"); + html.append("
"); // Project Info Map project = (Map) data.get("project"); - html.append("
") - .append("

").append(getString(project, "name", "")).append("

") - .append("

Designer: ").append(getString(project, "designer", "")).append("

") - .append("

Client: ").append(getString(project, "client", "")).append("

") - .append("

Website: ").append(getString(project, "website", "")).append("

") - .append("

Logo Date: ").append(getString(project, "logoDate", "")).append("

") - .append("
"); + html.append("
").append("

") + .append(getString(project, "name", "")).append("

") + .append("

Designer: ") + .append(getString(project, "designer", "")).append("

") + .append("

Client: ").append(getString(project, "client", "")) + .append("

").append("

Website: ").append(getString(project, "website", "")) + .append("

").append("

Logo Date: ") + .append(getString(project, "logoDate", "")).append("

").append("
"); // Logos Map logo = (Map) data.get("logo"); - html.append("
").append("

Logo Variants

"); + html.append("
").append("

Logo Variants

"); - html.append("

Primary Logo:

\"Primary

"); + html.append("

Primary Logo:

\"Primary
"); - html.append("

Icon Logo:

\"Icon

"); + html.append("

Icon Logo:

\"Icon
"); List mono = (List) logo.get("monochrome"); if (mono != null && mono.size() == 2) { - html.append("

Monochrome Logos:

").append("\"Black").append("\"White

"); + html.append("

Monochrome Logos:

").append("
") + .append("\"Black").append("\"White").append("
"); } Map social = (Map) logo.get("social"); - html.append("

Social Logos:

").append("\"Social").append("\"Social") - .append("
"); + html.append("

Social Logos:

").append("
") + .append("\"Social").append("\"Social").append("
").append("
"); // Colors List> colors = (List>) data.get("colors"); - html.append("
").append("

Brand Colors

") - .append("
"); + html.append("
").append("

Brand Colors

") + .append("
"); for (Map color : colors) { String hex = getString(color, "hex", "#000"); - html.append("
").append("
") - .append("

").append(getString(color, "name", "")) - .append("

").append("

") - .append(getString(color, "usage", "")).append("

").append("
"); + String slug = color.get("name").toString().toLowerCase().replaceAll("\\s+", "-"); + html.append("
").append("

") + .append(getString(color, "name", "")).append(" (").append(hex).append(")

") + .append("

").append(getString(color, "usage", "")).append("

") + .append("
"); } html.append("
"); // Typography Map typography = (Map) data.get("typography"); - html.append("
").append("

Typography

"); + html.append("
").append("

Typography

"); Map headline = (Map) typography.get("headline"); - html.append("

Headline: ").append(getString(headline, "fontFamily", "")).append(" - ") - .append(getString(headline, "weight", "")).append("

"); + html.append("
").append("

Headline

") + .append("

").append(getString(headline, "fontFamily", "")).append(" — ") + .append(getString(headline, "weight", "")).append("

").append("
"); Map body = (Map) typography.get("body"); - html.append("

Body: ").append(getString(body, "fontFamily", "")).append(" - ") - .append(getString(body, "weight", "")).append("

"); + html.append("
").append("

Body

") + .append("

").append(getString(body, "fontFamily", "")).append(" — ") + .append(getString(body, "weight", "")).append("

").append("
").append("
"); - html.append("
"); + html.append("
"); return html.toString(); } + private static String getOrDefaultImage(Object src) { + String s = src == null ? "" : src.toString().trim(); + return s.isEmpty() ? "/assets/images/placeholder.png" : s; + } + private static String renderLogoGrid(List> data) { StringBuilder html = new StringBuilder(); html.append("
") @@ -4318,55 +4417,6 @@ public class HtmlBuilder4 { return Collections.emptyList(); } - private static String renderFeatureSection(Map node) { - StringBuilder sb = new StringBuilder(); - sb.append("
"); - - List> children = getChildren(node); - - for (Map child : children) { - String type = getString(child, "type", ""); - String className = get(child, "class"); - - if ("img".equalsIgnoreCase(type)) { - sb.append("\"")"); - } - if ("img".equals(type)) { - sb.append(renderImageDiv(child)); - } else if ("div".equals(type) && "placeholder-img".equals(className)) { - sb.append(renderImageDiv(child)); - } else if ("div".equalsIgnoreCase(type)) { - sb.append("
"); - - List> divChildren = getChildren(child); - for (Map inner : divChildren) { - String innerType = getString(inner, "type", ""); - - if ("h2".equalsIgnoreCase(innerType)) { - sb.append("

").append(getString(inner, "content", "")) - .append("

"); - } else if ("p".equalsIgnoreCase(innerType)) { - sb.append("

").append(getString(inner, "content", "")) - .append("

"); - } else if ("ul".equalsIgnoreCase(innerType)) { - sb.append("
    "); - List> items = getChildren(inner); - for (Map li : items) { - sb.append("
  • ").append(getString(li, "content", "")).append("
  • "); - } - sb.append("
"); - } - } - - sb.append("
"); - } - } - - sb.append("
"); - return sb.toString(); - } - private static String renderHeroCenteredHeadingSplit(Map section) { StringBuilder html = new StringBuilder(); html.append("
"); @@ -4571,13 +4621,13 @@ public class HtmlBuilder4 { // Get attributes from JSON // String className = getString(data, "class", "placeholder-img"); String className = "placeholder-img"; - String src = getString(data, "src", "/src/assets/images/placeholder.png"); + String src = getString(data, "src", "/src/assets/images/place.png"); String width = getString(data, "width", ""); // optional String height = getString(data, "height", ""); // optional // Fallback to default image if src is missing or blank if (src.isEmpty()) { - src = "/src/assets/images/placeholder.png"; + src = "/src/assets/images/place.png"; } // Build style diff --git a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Builders/HtmlBuilder.java b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Builders/HtmlBuilder.java new file mode 100644 index 0000000..ab8de8d --- /dev/null +++ b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Builders/HtmlBuilder.java @@ -0,0 +1,31 @@ +package com.realnet.dlf.Builders; + +import java.util.HashMap; +import java.util.*; +import java.util.Map; +import java.util.function.Function; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class HtmlBuilder { + + public static final Map, String>> TYPE_RENDERERS = new HashMap<>(); + + static { + // Blog Related + +// TYPE_RENDERERS.put("cta-block", HtmlBuilder::renderCtaBlock); + + // + + } + + // + +} diff --git a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Controllers/Design_lbraryController.java b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Controllers/Design_lbraryController.java index 9be71dc..aff9fb8 100644 --- a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Controllers/Design_lbraryController.java +++ b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Controllers/Design_lbraryController.java @@ -1,5 +1,6 @@ package com.realnet.dlf.Controllers; +import java.io.IOException; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; @@ -97,4 +98,10 @@ public class Design_lbraryController { return ResponseEntity.ok(htmlWithCss); } + @GetMapping("/Design_lbrary/build") + public void buildFiles() throws IOException { + designLibraryService.build(); + System.out.println(" all files build.."); + } + } \ No newline at end of file diff --git a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Services/Design_lbraryService.java b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Services/Design_lbraryService.java index af889ba..48f98d6 100644 --- a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Services/Design_lbraryService.java +++ b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Services/Design_lbraryService.java @@ -1,8 +1,16 @@ package com.realnet.dlf.Services; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; import java.util.List; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -17,6 +25,9 @@ import com.realnet.users.service1.AppUserServiceImpl; @Service public class Design_lbraryService { + + @Value("${projectPath}") + private String projectPath; @Autowired private Design_lbraryRepository designLibraryRepository; @Autowired @@ -92,6 +103,98 @@ public class Design_lbraryService { return finalHtml; } + public void build() throws IOException { + List dls = designLibraryRepository.findAll(); + + int i = 0; + for (Design_lbrary design_lbrary : dls) { + + String name = design_lbrary.getName(); + String javacode = design_lbrary.getJavacode(); + String method = javacode.substring(javacode.indexOf("static String"), javacode.indexOf("(")); + + System.out.println(name + " building start .... "); + + String typeRender = "TYPE_RENDERERS.put(" + "\"" + name + "\", HtmlBuilder::" + method + ");"; + + buildfront2("//", typeRender); + + buildfront2("//", javacode); + + i++; + + System.out.println(name + " build "); + System.out.println("total build " + i); + + } + + } + + public void buildfront2(String keyword, String replaceString) throws IOException { + + String fileName = "HtmlBuilder.java"; + StringBuilder frontend = new StringBuilder(); + + // CEATE PACKAGE + + String directoryName; + + directoryName = projectPath + "/src/main/java/com/realnet/dlf/Builders"; + + String filePath = directoryName + File.separator + fileName; + System.out.println("routing path is " + filePath); + + String str = replaceString; + + int length = str.length(); + + // CEATE PACKAGE + + File file = null; + + file = new File(filePath); + + FileReader fr = new FileReader(file); + BufferedReader br = new BufferedReader(fr); + String line; + + while ((line = br.readLine()) != null) { + + if (line.trim().equalsIgnoreCase(str.trim())) { + str = ""; + } + frontend.append(line + "\n"); +// System.out.println(line); + } + fr.close(); + br.close(); + System.out.println(frontend.length()); + + String back = keyword; + int back_l = back.length(); + + int ord = StringUtils.ordinalIndexOf(frontend.toString(), back, 1); + + String front = frontend.substring(0, ord + back_l) + "\n" + str + "\n" + + frontend.substring(ord + back_l, frontend.length()); + + String codee = front.substring(0, front.lastIndexOf("\n")); // remove last line break + +// creating files + File file1 = new File(filePath); + +// Writing files + + FileWriter fr1 = new FileWriter(file1.getAbsoluteFile()); + BufferedWriter br1 = new BufferedWriter(fr1); +// PrintWriter out = new PrintWriter(br1); +// out.println(r_import); + + br1.write(codee.toString()); + br1.close(); + + } + public AppUser getUser() { AppUser user = userService.getLoggedInUser(); return user; diff --git a/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Services/HtmlService.java b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Services/HtmlService.java new file mode 100644 index 0000000..fa270ff --- /dev/null +++ b/visaproject-back-b/authsec_springboot/backend/src/main/java/com/realnet/dlf/Services/HtmlService.java @@ -0,0 +1,461 @@ +package com.realnet.dlf.Services; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.stereotype.Service; + +import com.realnet.dlf.Builders.HtmlBuilder; + +@Service +public class HtmlService { + + public static String buildHtml(Object node) { + if (node instanceof Map) { + Map map = (Map) node; + + // Handle raw section container + + // Check if a universal TYPE_RENDERER exists for this block + String type = getString(map, "type", ""); + if (HtmlBuilder.TYPE_RENDERERS.containsKey(type.toLowerCase())) { + return HtmlBuilder.TYPE_RENDERERS.get(type.toLowerCase()).apply(map); + } + // Normal map block + return renderFromMap(map); + } else if (node instanceof List) { + return renderFromList((List) node); + } else if (node != null) { + return node.toString(); + } else { + return ""; + } + } + + private static final Map TYPE_TAG_MAP = new HashMap<>(); + static { + TYPE_TAG_MAP.put("navbar", "nav"); + TYPE_TAG_MAP.put("footer", "footer"); + TYPE_TAG_MAP.put("article", "article"); + TYPE_TAG_MAP.put("header", "header"); + TYPE_TAG_MAP.put("logo", "div"); + TYPE_TAG_MAP.put("nav", "nav"); + TYPE_TAG_MAP.put("link", "a"); + TYPE_TAG_MAP.put("button", "button"); + TYPE_TAG_MAP.put("span", "span"); + TYPE_TAG_MAP.put("img", "img"); // already supported as self-closing + TYPE_TAG_MAP.put("social-icons", "div"); + TYPE_TAG_MAP.put("icon", "div"); + TYPE_TAG_MAP.put("text", "span"); // or "p" depending on your choice + + // add more if needed + } + + private static String getString(Map map, String key, String defaultValue) { + Object val = map.get(key); + return val instanceof String ? (String) val : defaultValue; + } + + private static String renderFromMap(Map node) { + StringBuilder html = new StringBuilder(); + + // Get tag from 'tag' or fallback to 'type' + String type = getString(node, "type", "div"); + String rawTag = getString(node, "tag", ""); + String tag = !rawTag.isEmpty() ? rawTag : TYPE_TAG_MAP.getOrDefault(type.toLowerCase(), type); + + html.append("<").append(tag); + + // Add class and id if present + String className = getString(node, "class", getString(node, "ref", "")); + String id = getString(node, "id", ""); + + if (!className.isEmpty()) + html.append(" class=\"").append(className).append("\""); + if (!id.isEmpty()) + html.append(" id=\"").append(id).append("\""); + + // Add other attributes (like src, alt for img) + for (Map.Entry entry : node.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + if (!Arrays.asList("type", "tag", "class", "id", "content", "children", "menu", "actions", "buttons") + .contains(key) && !(value instanceof Map || value instanceof List)) { + html.append(" ").append(key).append("=\"").append(value).append("\""); + } + } + + // Self-closing tag support (like img) + // Self-closing tag like + if ("img".equalsIgnoreCase(tag)) { + html.append(" src=\"").append(getString(node, "src", "")).append("\""); + html.append(" alt=\"").append(getString(node, "alt", "")).append("\""); + html.append(" />"); + return html.toString(); + } + + // Content rendering + if (node.containsKey("content")) { + html.append(node.get("content")); + } + + html.append(">"); + + // Render inline content if present + + // Special short-circuit rendering for link and button + if ("link".equalsIgnoreCase(type)) { + html.append("").append(node.get("content")).append(""); + return html.toString(); + } + + if ("text".equalsIgnoreCase(type)) { + html.append(getString(node, "content", "")); + return html.toString(); + } + + if ("logo".equalsIgnoreCase(type)) { + html.append("
").append(getString(node, "content", "Logo")) + .append("
"); + return html.toString(); + } + + if ("icon".equalsIgnoreCase(type)) { + String label = getString(node, "content", ""); + String emoji = getIconEmoji(label); + html.append("
").append(emoji).append(" ").append(label).append("
"); + return html.toString(); + } + + if ("a".equalsIgnoreCase(type)) { + String href = getString(node, "href", "#"); + html.append("").append(getString(node, "content", "")).append(""); + return html.toString(); + } + + if ("button".equalsIgnoreCase(type)) { + html.append(""); + return html.toString(); + } + + if (node.containsKey("content")) { + html.append(node.get("content")); + } + + // Handle structured known patterns + if (node.containsKey("logo")) { + html.append("
").append(node.get("logo")).append("
"); + } + + if (node.containsKey("heading")) { + html.append("

").append(node.get("heading")).append("

"); + } + + if (node.containsKey("subheading")) { + html.append("

").append(node.get("subheading")).append("

"); + } + + if (node.containsKey("text")) { + html.append("

").append(node.get("text")).append("

"); + } + + if (node.containsKey("menu")) { + html.append(renderMenu(node.get("menu"))); + } + + if (node.containsKey("actions")) { + html.append(renderActions(node.get("actions"))); + } + + if (node.containsKey("buttons")) { + html.append(renderButtons(node.get("buttons"))); + } + + if (node.containsKey("columns")) { + html.append(renderColumns(node.get("columns"))); + } + + if (node.containsKey("children")) { + html.append(buildHtml(node.get("children"))); + } + + html.append(""); + return html.toString(); + } + + private static String renderFromList(List list) { + StringBuilder html = new StringBuilder(); + for (Object item : list) { + html.append(buildHtml(item)); + } + return html.toString(); + } + + private static String renderButtons(Object obj) { + StringBuilder html = new StringBuilder(); + + // Case 1: Simple list of string labels + if (obj instanceof List) { + List btns = (List) obj; + html.append("
"); + for (Object item : btns) { + if (item instanceof String) { + html.append(""); + } else if (item instanceof Map) { + html.append(renderSingleButton((Map) item)); + } + } + html.append("
"); + } + + // Case 2: Object with "items" list and optional class + else if (obj instanceof Map) { + Map btnMap = (Map) obj; + List items = (List) btnMap.get("items"); + String btnClass = getString(btnMap, "class", "cta-buttons"); + + html.append("
"); + if (items != null) { + for (Object btn : items) { + if (btn instanceof String) { + html.append(""); + } else if (btn instanceof Map) { + html.append(renderSingleButton((Map) btn)); + } + } + } + html.append("
"); + } + + return html.toString(); + } + + private static String renderSingleButton(Map btn) { + String label = getString(btn, "label", "Button"); + String href = getString(btn, "action", "#"); + String style = getString(btn, "style", "filled"); + String bg = getString(btn, "backgroundColor", style.equals("outlined") ? "white" : "black"); + String color = getString(btn, "textColor", style.equals("outlined") ? "black" : "white"); + String border = style.equals("outlined") ? "1px solid " + getString(btn, "borderColor", "#000") : "none"; + + return new StringBuilder().append("").append(label).append("").toString(); + } + + private static String renderColumns(Object obj) { + StringBuilder html = new StringBuilder(); + html.append("
"); + + List> columns = (List>) obj; + for (Map col : columns) { + String type = getString(col, "type", ""); + if ("main".equalsIgnoreCase(type)) { + html.append("
"); + if (col.containsKey("contentBlocks")) { + List> blocks = (List>) col.get("contentBlocks"); + for (Map block : blocks) { + html.append("
").append("

") + .append(getString(block, "heading", "")).append("

").append("

") + .append(getString(block, "text", "")).append("

").append("
"); + } + } + html.append("
"); + } else if ("sidebar".equalsIgnoreCase(type)) { + html.append(""); + } + } + + html.append("
"); + return html.toString(); + } + + private static String renderMenu(Object obj) { + StringBuilder html = new StringBuilder("
    "); + + List menu = (List) obj; + for (Object item : menu) { + if (item instanceof String) { + html.append("
  • ").append(item).append("
  • "); + } else if (item instanceof Map) { + Map dropdownItem = (Map) item; + html.append("
  • "); + html.append("").append(dropdownItem.get("title")).append(""); + + if (dropdownItem.containsKey("dropdown")) { + html.append(renderDropdown(dropdownItem.get("dropdown"))); + } + html.append("
  • "); + } + } + + html.append(""); + return html.toString(); + } + + private static String renderDropdown(Object obj) { + StringBuilder html = new StringBuilder("
    "); + + Map dropdown = (Map) obj; + List> columns = (List>) dropdown.get("columns"); + + for (Map column : columns) { + html.append("
    "); + html.append("

    ").append(column.get("title")).append("

    "); + html.append("
      "); + + if (column.containsKey("items")) { + List> items = (List>) column.get("items"); + for (Map item : items) { + html.append("
    • ").append(item.get("icon")).append("").append("") + .append(item.get("title")).append("").append("

      ").append(item.get("description")) + .append("

      ").append("
    • "); + } + } else if (column.containsKey("blogs")) { + List> blogs = (List>) column.get("blogs"); + for (Map blog : blogs) { + html.append("
    • ").append(blog.get("title")).append("").append("

      ") + .append(blog.get("description")).append("

      ").append("") + .append(blog.get("cta")).append("
    • "); + } + if (column.containsKey("footerLink")) { + html.append(""); + } + } + + html.append("
    "); + } + + html.append("
    "); + return html.toString(); + } + + private static String renderActions(Object obj) { + StringBuilder html = new StringBuilder("
    "); + + List> actions = (List>) obj; + for (Map action : actions) { + String label = getString(action, "label", "Button"); + String variant = getString(action, "variant", ""); + String btnClass = "join-btn"; + if (!variant.isEmpty()) { + btnClass += " " + variant; + } + html.append(""); + } + + html.append("
    "); + return html.toString(); + } + + private static String renderNavbarBlock(Map nav) { + StringBuilder html = new StringBuilder(); + + // Inline styles + StringBuilder style = new StringBuilder(); + if (nav.containsKey("style")) { + Map styleMap = (Map) nav.get("style"); + for (Map.Entry s : styleMap.entrySet()) { + appendStyle(style, s.getKey(), s.getValue()); + } + } + + html.append(""); + return html.toString(); + } + + private static void appendStyle(StringBuilder style, String key, Object value) { + if (value != null) { + style.append(key).append(":").append(value).append("; "); + } + } + + private static String getIconEmoji(String label) { + label = label.toLowerCase(); + if (label.contains("facebook")) + return "📘"; + if (label.contains("instagram")) + return "📷"; + if (label.equals("x")) + return "𝕏"; + if (label.contains("search")) + return "🔍"; + if (label.contains("profile")) + return "👤"; + if (label.contains("twitter")) + return "🐦"; + + if (label.contains("linkedin")) + return "🔗"; + if (label.contains("youtube")) + return "▶️"; + return "📦"; + } + + private static String getWidgetIcon(String widget) { + widget = widget.toLowerCase(); + if (widget.contains("search")) + return "🔍"; + if (widget.contains("recent")) + return "📝"; + if (widget.contains("newsletter")) + return "📬"; + return "📦"; + } + +}