outTemplate.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. const tagsAndAttrs = require('./lib/tagsAndAttrs');
  2. class outwxml{
  3. constructor(option){
  4. const _ts = this;
  5. _ts.config = {};
  6. option = option || {};
  7. for(let i in option){
  8. _ts.config[i] = option[i];
  9. };
  10. _ts.m = {
  11. fs:require('fs'),
  12. path:require('path')
  13. };
  14. }
  15. init(){
  16. const _ts = this;
  17. _ts.outtag();
  18. let s = _ts.outwxml();
  19. _ts.m.fs.writeFileSync('./renderTemplate.wxml',s);
  20. }
  21. //输出tag
  22. outtag(id){
  23. const _ts = this;
  24. let s = '',
  25. wxmlTag = tagsAndAttrs.wxml;
  26. wxmlTag.forEach((item,index)=>{
  27. let imgMode = '',
  28. attr = _ts.outattr(item);
  29. if(item === 'image'){
  30. imgMode = `mode="{{item.type === 'audio' ? '' : 'widthFix'}}"`;
  31. };
  32. // todo添加绑定事件
  33. if(item === 'checkbox-group'){
  34. attr += `bindchange="{{item.attr['bindchange']}}"`;
  35. };
  36. if(item === 'checkbox'){
  37. attr += `value="{{item.attr['value']}}"`;
  38. };
  39. s+= `<${item} wx:if="{{item.node === 'element' && item.tag === '${item}'}}" ${attr} ${imgMode}><block wx:for="{{item.child}}" wx:key="{{item}}"><template is="m${id}" data="{{item}}"/></block></${item}>`;
  40. });
  41. return s;
  42. }
  43. //生成模版对应属性
  44. outattr(tagName){
  45. tagName = tagName || '';
  46. const _ts = this;
  47. let s = '',
  48. attr = [];
  49. attr.push(...tagsAndAttrs.attrs);
  50. switch (tagName) {
  51. case 'navigator':
  52. attr.push('href');
  53. break;
  54. case 'checkbox':
  55. case 'radio':
  56. case 'switch':
  57. attr.push('checked');
  58. break;
  59. case 'audio':
  60. attr.push('poster');
  61. attr.push('src');
  62. attr.push('name');
  63. attr.push('author');
  64. attr.push('loop');
  65. // attr.push('controls');
  66. s += 'controls="true" ';
  67. break;
  68. case 'video':
  69. attr.push('poster');
  70. attr.push('src');
  71. break;
  72. case 'image':
  73. attr.push('src');
  74. break;
  75. };
  76. s += `data-_el="{{item}}"`;
  77. attr.forEach((item,index)=>{
  78. switch (item) {
  79. case 'class':
  80. s += `${item}="{{item.attr.class}}"`;
  81. break;
  82. case 'href':
  83. s += `url="{{item.attr.${item}}}"`;
  84. break;
  85. default:
  86. let aItem = item.split(':');
  87. if(aItem.length > 1){
  88. s += `${item}='__${aItem[0]}_${aItem[1]}'`;
  89. }else{
  90. s += `${item}="{{item.attr['${item}']}}"`;
  91. };
  92. break;
  93. };
  94. });
  95. return s;
  96. }
  97. //wxml模版生成
  98. outwxml(){
  99. const _ts = this;
  100. let s = '';
  101. for (let i = 0, len = _ts.config.depth; i<len; i++){
  102. let c = i < len - 1 ? i+1 : i;
  103. let temp = `<template name="m${i}"><block wx:if="{{item.node === 'text'}}">{{item.text}}</block>${_ts.outtag(c)}</template>`;
  104. // let temp = `<template name="m${i}">
  105. // <!--文字-->
  106. // <block wx:if="{{item.node === 'text'}}">
  107. // {{item.text}}
  108. // </block>
  109. // ${_ts.outtag(c)}
  110. // </template>
  111. // `;
  112. // let temp = `
  113. // <template name="m${i}">
  114. // <!--文字-->
  115. // <block wx:if="{{item.node === 'text'}}">
  116. // {{item.text}}
  117. // </block>
  118. // <!--视图-->
  119. // <view
  120. // wx:if="{{item.node === 'element' && item.tag === 'view'}}"
  121. // class="{{item.attr.class}}"
  122. // width="{{item.attr.width}}"
  123. // height="{{item.attr.height}}"
  124. // data="{{item.attr.data}}"
  125. // src="{{item.attr.src}}"
  126. // id="{{item.attr.id}}"
  127. // style="{{item.attr.style}}"
  128. // >
  129. // <block wx:for="{{item.child}}" wx:key="{{item}}">
  130. // <template is="m${c}" data="{{item}}"/>
  131. // </block>
  132. // </view>
  133. // <!--按钮-->
  134. // <button
  135. // wx:if="{{item.tag === 'button'}}"
  136. // class="{{item.attr.class}}"
  137. // width="{{item.attr.width}}"
  138. // height="{{item.attr.height}}"
  139. // data="{{item.attr.data}}"
  140. // src="{{item.attr.src}}"
  141. // id="{{item.attr.id}}"
  142. // style="{{item.attr.style}}"
  143. // >
  144. // <block wx:for="{{item.child}}" wx:key="{{item}}">
  145. // <template is="m${c}" data="{{item}}"/>
  146. // </block>
  147. // </button>
  148. // </template>
  149. // `;
  150. s+=temp;
  151. };
  152. return s;
  153. }
  154. };
  155. new outwxml({depth:10}).init();