ViewTemplatePrototypes.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. //
  2. // Created by xcbosa on 2023/1/29.
  3. //
  4. #include "ViewTemplatePrototypes.h"
  5. namespace xc {
  6. namespace processor {
  7. namespace templates {
  8. string& replace_all(string& src, const string& old_value, const string& new_value) {
  9. for (string::size_type pos(0); pos != string::npos; pos += new_value.length()) {
  10. if ((pos = src.find(old_value, pos)) != string::npos) {
  11. src.replace(pos, old_value.length(), new_value);
  12. }
  13. else break;
  14. }
  15. return src;
  16. }
  17. string fixStringFormat(string strToFix) {
  18. replace_all(strToFix, "\"", "\\\"");
  19. replace_all(strToFix, "\'", "\\\'");
  20. replace_all(strToFix, "\r", "\\\r");
  21. replace_all(strToFix, "\n", "\\\n");
  22. return strToFix;
  23. }
  24. string generateInner(ViewTemplatePrototype inner) {
  25. ostringstream oss;
  26. inner.generateHTML(oss);
  27. return oss.str();
  28. }
  29. string generateInner(vector<ViewTemplatePrototype> inners) {
  30. ostringstream oss;
  31. for (auto it : inners) {
  32. it.generateHTML(oss);
  33. }
  34. return oss.str();
  35. }
  36. ViewTemplatePrototype::ViewTemplatePrototype(string directHTML): directHTML(directHTML), useDirectHTML(true), keyName(), innerHTML(), properties(), styles() { }
  37. ViewTemplatePrototype::ViewTemplatePrototype(const char *directHTML): directHTML(directHTML), useDirectHTML(true), keyName(), innerHTML(), properties(), styles() { }
  38. ViewTemplatePrototype::ViewTemplatePrototype(string keyName, string innerText): directHTML(), useDirectHTML(false), keyName(keyName), innerHTML(innerText), properties(), styles() { }
  39. ViewTemplatePrototype::ViewTemplatePrototype(string keyName, vector<ViewTemplatePrototype> inners): directHTML(), useDirectHTML(false), keyName(keyName), innerHTML(generateInner(inners)), properties(), styles() { }
  40. void ViewTemplatePrototype::generateHTML(ostream &writeTo) {
  41. if (this->useDirectHTML) {
  42. writeTo << this->directHTML;
  43. } else {
  44. if (!this->keyName.empty()) {
  45. writeTo << '<';
  46. writeTo << this->keyName;
  47. writeTo << ' ';
  48. for (auto it: this->properties) {
  49. writeTo << it.first;
  50. writeTo << "=\"";
  51. writeTo << fixStringFormat(it.second);
  52. writeTo << "\" ";
  53. }
  54. writeTo << "style=\"";
  55. for (auto it: this->styles) {
  56. writeTo << it.first;
  57. writeTo << ": ";
  58. writeTo << it.second;
  59. writeTo << "; ";
  60. }
  61. writeTo << '\"';
  62. writeTo << '>';
  63. }
  64. writeTo << this->innerHTML;
  65. if (!this->keyName.empty()) {
  66. writeTo << "</";
  67. writeTo << this->keyName;
  68. writeTo << '>';
  69. }
  70. }
  71. }
  72. ViewTemplatePrototype& ViewTemplatePrototype::prop(string key, string value) {
  73. this->makeSureNotUseDirectHTML();
  74. this->properties[key] = value;
  75. return *this;
  76. }
  77. ViewTemplatePrototype& ViewTemplatePrototype::style(string key, string value) {
  78. this->makeSureNotUseDirectHTML();
  79. this->styles[key] = value;
  80. return *this;
  81. }
  82. ViewTemplatePrototype& ViewTemplatePrototype::inner(vector<ViewTemplatePrototype> inner) {
  83. this->makeSureNotUseDirectHTML();
  84. this->innerHTML = generateInner(inner);
  85. return *this;
  86. }
  87. ViewTemplatePrototype& ViewTemplatePrototype::inner(string inner) {
  88. this->makeSureNotUseDirectHTML();
  89. this->innerHTML = inner;
  90. return *this;
  91. }
  92. void ViewTemplatePrototype::makeSureNotUseDirectHTML() {
  93. if (this->useDirectHTML) {
  94. this->useDirectHTML = false;
  95. this->keyName = this->directHTML;
  96. this->directHTML = "";
  97. }
  98. }
  99. ViewTemplatePrototype& ViewTemplatePrototype::klass(string value) { return this->prop("class", value); }
  100. ViewTemplatePrototype& ViewTemplatePrototype::classAdd(string klass) {
  101. if (this->properties.find("class") == this->properties.end()) {
  102. this->properties["class"] = klass;
  103. } else {
  104. this->properties["class"] += klass + " ";
  105. }
  106. return *this;
  107. }
  108. ViewTemplatePrototype& ViewTemplatePrototype::contenteditable(bool value) { return this->prop("contenteditable", value ? "true" : "false"); }
  109. ViewTemplatePrototype& ViewTemplatePrototype::dir(string value) { return this->prop("dir", value); }
  110. ViewTemplatePrototype& ViewTemplatePrototype::draggable(bool value) { return this->prop("draggable", value ? "true" : "false"); }
  111. ViewTemplatePrototype& ViewTemplatePrototype::hidden(bool value) { return this->prop("hidden", value ? "true" : "false"); }
  112. ViewTemplatePrototype& ViewTemplatePrototype::id(string value) { return this->prop("id", value); }
  113. ViewTemplatePrototype& ViewTemplatePrototype::lang(string value) { return this->prop("lang", value); }
  114. ViewTemplatePrototype& ViewTemplatePrototype::spellcheck(bool value) { return this->prop("spellcheck", value ? "true" : "false"); }
  115. ViewTemplatePrototype& ViewTemplatePrototype::title(string value) { return this->prop("title", value); }
  116. Foreach::Foreach(vector<JsonModel> model, function<ViewTemplatePrototype(JsonModel)> generateBlock): ViewTemplatePrototype("") {
  117. ostringstream oss;
  118. for (JsonModel t : model) {
  119. generateBlock(t).generateHTML(oss);
  120. }
  121. this->inner(oss.str());
  122. }
  123. Foreach::Foreach(vector<JsonModel> model, function<ViewCollection (JsonModel)> generateBlock): ViewTemplatePrototype("") {
  124. ostringstream oss;
  125. for (JsonModel t : model) {
  126. oss << generateInner(generateBlock(t));
  127. }
  128. this->inner(oss.str());
  129. }
  130. Foreach::Foreach(JsonArrayObject model, function<ViewTemplatePrototype(JsonModel)> generateBlock): ViewTemplatePrototype("") {
  131. ostringstream oss;
  132. for (JsonModel t : model) {
  133. generateBlock(t).generateHTML(oss);
  134. }
  135. this->inner(oss.str());
  136. }
  137. Foreach::Foreach(JsonArrayObject model, function<ViewCollection (JsonModel)> generateBlock): ViewTemplatePrototype("") {
  138. ostringstream oss;
  139. for (JsonModel t : model) {
  140. oss << generateInner(generateBlock(t));
  141. }
  142. this->inner(oss.str());
  143. }
  144. #define __GenerateElemImpl(tagName, keyString) \
  145. tagName::tagName(string text): ViewTemplatePrototype(keyString, text) { } \
  146. tagName::tagName(const char *text): ViewTemplatePrototype(keyString, string(text)) { } \
  147. tagName::tagName(ViewCollection inner): ViewTemplatePrototype(keyString, inner) { } \
  148. tagName::tagName(ViewTemplatePrototype inner): ViewTemplatePrototype(keyString, generateInner(inner)) { }
  149. #define __GenerateElemImpl_KeySameAsTagName(tagName) __GenerateElemImpl(tagName, #tagName)
  150. __GenerateElemImpl_KeySameAsTagName(a)
  151. __GenerateElemImpl_KeySameAsTagName(abbr)
  152. __GenerateElemImpl_KeySameAsTagName(acronym)
  153. __GenerateElemImpl_KeySameAsTagName(address)
  154. __GenerateElemImpl_KeySameAsTagName(applet)
  155. __GenerateElemImpl_KeySameAsTagName(area)
  156. __GenerateElemImpl_KeySameAsTagName(article)
  157. __GenerateElemImpl_KeySameAsTagName(aside)
  158. __GenerateElemImpl_KeySameAsTagName(audio)
  159. __GenerateElemImpl_KeySameAsTagName(b)
  160. __GenerateElemImpl_KeySameAsTagName(base)
  161. __GenerateElemImpl_KeySameAsTagName(bdi)
  162. __GenerateElemImpl_KeySameAsTagName(bdo)
  163. __GenerateElemImpl_KeySameAsTagName(big)
  164. __GenerateElemImpl_KeySameAsTagName(blockquote)
  165. __GenerateElemImpl_KeySameAsTagName(body)
  166. __GenerateElemImpl_KeySameAsTagName(br)
  167. __GenerateElemImpl_KeySameAsTagName(button)
  168. __GenerateElemImpl_KeySameAsTagName(canvas)
  169. __GenerateElemImpl_KeySameAsTagName(caption)
  170. __GenerateElemImpl_KeySameAsTagName(center)
  171. __GenerateElemImpl_KeySameAsTagName(cite)
  172. __GenerateElemImpl_KeySameAsTagName(code)
  173. __GenerateElemImpl_KeySameAsTagName(col)
  174. __GenerateElemImpl_KeySameAsTagName(colgroup)
  175. __GenerateElemImpl_KeySameAsTagName(command)
  176. __GenerateElemImpl_KeySameAsTagName(data)
  177. __GenerateElemImpl_KeySameAsTagName(datalist)
  178. __GenerateElemImpl(do_, "do")
  179. __GenerateElemImpl_KeySameAsTagName(del)
  180. __GenerateElemImpl_KeySameAsTagName(details)
  181. __GenerateElemImpl_KeySameAsTagName(dir)
  182. __GenerateElemImpl_KeySameAsTagName(div)
  183. __GenerateElemImpl_KeySameAsTagName(dfn)
  184. __GenerateElemImpl_KeySameAsTagName(dialog)
  185. __GenerateElemImpl_KeySameAsTagName(dl)
  186. __GenerateElemImpl_KeySameAsTagName(dt)
  187. __GenerateElemImpl_KeySameAsTagName(em)
  188. __GenerateElemImpl_KeySameAsTagName(embed)
  189. __GenerateElemImpl_KeySameAsTagName(fieldset)
  190. __GenerateElemImpl_KeySameAsTagName(figcaption)
  191. __GenerateElemImpl_KeySameAsTagName(figure)
  192. __GenerateElemImpl_KeySameAsTagName(font)
  193. __GenerateElemImpl_KeySameAsTagName(footer)
  194. __GenerateElemImpl_KeySameAsTagName(form)
  195. __GenerateElemImpl_KeySameAsTagName(frame)
  196. __GenerateElemImpl_KeySameAsTagName(frameset)
  197. __GenerateElemImpl_KeySameAsTagName(h1)
  198. __GenerateElemImpl_KeySameAsTagName(h2)
  199. __GenerateElemImpl_KeySameAsTagName(h3)
  200. __GenerateElemImpl_KeySameAsTagName(h4)
  201. __GenerateElemImpl_KeySameAsTagName(h5)
  202. __GenerateElemImpl_KeySameAsTagName(h6)
  203. __GenerateElemImpl_KeySameAsTagName(head)
  204. __GenerateElemImpl_KeySameAsTagName(header)
  205. __GenerateElemImpl_KeySameAsTagName(hr)
  206. __GenerateElemImpl_KeySameAsTagName(html)
  207. __GenerateElemImpl_KeySameAsTagName(i)
  208. __GenerateElemImpl_KeySameAsTagName(iframe)
  209. __GenerateElemImpl_KeySameAsTagName(img)
  210. __GenerateElemImpl_KeySameAsTagName(input)
  211. __GenerateElemImpl_KeySameAsTagName(ins)
  212. __GenerateElemImpl_KeySameAsTagName(isindex)
  213. __GenerateElemImpl_KeySameAsTagName(kbd)
  214. __GenerateElemImpl_KeySameAsTagName(keygen)
  215. __GenerateElemImpl_KeySameAsTagName(label)
  216. __GenerateElemImpl_KeySameAsTagName(legend)
  217. __GenerateElemImpl_KeySameAsTagName(li)
  218. __GenerateElemImpl_KeySameAsTagName(link)
  219. __GenerateElemImpl_KeySameAsTagName(main)
  220. __GenerateElemImpl_KeySameAsTagName(map_)
  221. __GenerateElemImpl_KeySameAsTagName(mark)
  222. __GenerateElemImpl_KeySameAsTagName(menu)
  223. __GenerateElemImpl_KeySameAsTagName(menuitem)
  224. __GenerateElemImpl_KeySameAsTagName(meta)
  225. __GenerateElemImpl_KeySameAsTagName(meter)
  226. __GenerateElemImpl_KeySameAsTagName(nav)
  227. __GenerateElemImpl_KeySameAsTagName(noframes)
  228. __GenerateElemImpl_KeySameAsTagName(noscript)
  229. __GenerateElemImpl_KeySameAsTagName(object)
  230. __GenerateElemImpl_KeySameAsTagName(ol)
  231. __GenerateElemImpl_KeySameAsTagName(optgroup)
  232. __GenerateElemImpl_KeySameAsTagName(option)
  233. __GenerateElemImpl_KeySameAsTagName(output)
  234. __GenerateElemImpl_KeySameAsTagName(p)
  235. __GenerateElemImpl_KeySameAsTagName(param)
  236. __GenerateElemImpl_KeySameAsTagName(pre)
  237. __GenerateElemImpl_KeySameAsTagName(progress)
  238. __GenerateElemImpl_KeySameAsTagName(q)
  239. __GenerateElemImpl_KeySameAsTagName(rp)
  240. __GenerateElemImpl_KeySameAsTagName(ruby)
  241. __GenerateElemImpl_KeySameAsTagName(s)
  242. __GenerateElemImpl_KeySameAsTagName(samp)
  243. __GenerateElemImpl_KeySameAsTagName(script)
  244. __GenerateElemImpl_KeySameAsTagName(section)
  245. __GenerateElemImpl_KeySameAsTagName(select)
  246. __GenerateElemImpl_KeySameAsTagName(small)
  247. __GenerateElemImpl_KeySameAsTagName(source)
  248. __GenerateElemImpl_KeySameAsTagName(span)
  249. __GenerateElemImpl_KeySameAsTagName(strike)
  250. __GenerateElemImpl_KeySameAsTagName(strong)
  251. __GenerateElemImpl_KeySameAsTagName(style)
  252. __GenerateElemImpl_KeySameAsTagName(sub)
  253. __GenerateElemImpl_KeySameAsTagName(summary)
  254. __GenerateElemImpl_KeySameAsTagName(sup)
  255. __GenerateElemImpl_KeySameAsTagName(svg)
  256. __GenerateElemImpl_KeySameAsTagName(table)
  257. __GenerateElemImpl_KeySameAsTagName(tbody)
  258. __GenerateElemImpl_KeySameAsTagName(td)
  259. __GenerateElemImpl(template_, "template_")
  260. __GenerateElemImpl_KeySameAsTagName(textarea)
  261. __GenerateElemImpl_KeySameAsTagName(tfoot)
  262. __GenerateElemImpl_KeySameAsTagName(th)
  263. __GenerateElemImpl_KeySameAsTagName(thead)
  264. __GenerateElemImpl_KeySameAsTagName(time)
  265. __GenerateElemImpl_KeySameAsTagName(title)
  266. __GenerateElemImpl_KeySameAsTagName(tr)
  267. __GenerateElemImpl_KeySameAsTagName(track)
  268. __GenerateElemImpl_KeySameAsTagName(tt)
  269. __GenerateElemImpl_KeySameAsTagName(u)
  270. __GenerateElemImpl_KeySameAsTagName(ul)
  271. __GenerateElemImpl_KeySameAsTagName(var)
  272. __GenerateElemImpl_KeySameAsTagName(video)
  273. __GenerateElemImpl_KeySameAsTagName(wbr)
  274. __GenerateElemImpl_KeySameAsTagName(xmp)
  275. } // xc
  276. } // processor
  277. } // templates