Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

70
LINES

< > BotCompany Repo | #1030496 // SmoothHTMLTemplater

JavaX fragment (include)

sclass SmoothHTMLTemplater {
  // input
  S template;
  bool verbose;
  Map<S, LL<Replacement>> entriesByType = ciMap();

  // internal
  LS tok;
  L<IntRange> commentRanges;
  LS comments;
  
  *() {}
  *(S *template) {}
  
  srecord Replacement(S exampleValue, S actualValue) {
    S replaceIn(S text) {
      ret replaceIC(text, exampleValue, actualValue);
    }
  }

  L<Replacement> mapToEntry(MapSO map) {
    ret map(map, (key, value) -> new Replacement(key, str(value)));
  }
  
  S render() {
    tok = htmlTok(template);
    commentRanges = charRangesOfHTMLComments(template);
    comments = map(commentRanges, r -> htmlCommentContents(substring(template, r)));
    new Matches m;
    new LPair<IntRange, S> replacements;
    for i over comments: {
      S comment = comments.get(i);
      if (match("start * block", comment, m)) {
        S type = $1;
        S endPat = format3("end * block", type);
        if (verbose) print("Start of block found: " + i + " / " + comment);
        int j = indexOfMatches(endPat, comments, i+1);
        int jEndOfList = indexOfMatches(format3("end * list", type), comments, i+1);

        if (j < 0) continue with warn("End of block comment not found: " + endPat);
        if (verbose) print("End of block found: " + j + " / " + comments.get(j));
        if (!isEntity(type)) continue with print("Not an entity: " + type);
        LL<Replacement> entries = getEntries(type);
        if (verbose) print(nEntries(entries));
        IntRange r1 = commentRanges.get(i), r2 = commentRanges.get(j);
        IntRange rEndOfList = commentRanges.get(jEndOfList >= 0 ? jEndOfList : j);
        
        S contents = substring(template, r1.end, r2.start);
        addPair(replacements, intRange(r1.end, rEndOfList.start),
          lines(map(entries, entry -> rewriteEntry(contents, entry))));
        i = j;
      }
    }
    if (verbose) pnlStruct("Replacement", replacements);
    ret replaceCharRanges(template, replacements);
  }

  bool isEntity(S type) { true; }
  
  // TODO: avoid multi-replacements
  S rewriteEntry(S text, L<Replacement> entry) {
    fOr (Replacement r : entry)
      text = r.replaceIn(text);
    ret text;
  }
  
  LL<Replacement> getEntries(S type) {
    ret entriesByType.get(type);
  }
}

download  show line numbers  debug dex  old transpilations   

Travelled to 4 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, vouqrxazstgt

No comments. add comment

Snippet ID: #1030496
Snippet name: SmoothHTMLTemplater
Eternal ID of this version: #1030496/1
Text MD5: b77fc9a814374383b5d093b33e6dad77
Author: stefan
Category: javax / html
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2020-12-28 03:45:32
Source code size: 2330 bytes / 70 lines
Pitched / IR pitched: No / No
Views / Downloads: 209 / 382
Referenced in: [show references]