Guest User

Untitled

a guest
Jan 22nd, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.00 KB | None | 0 0
  1. 17a18
  2. > escapeXml_regexp : /[&<>"]/g,
  3. 20c21
  4. < return typeof(s) != 'string' ? s : s.replace(/[&<>"]/g, Shotenjin._escape_func); //"
  5. ---
  6. > return typeof(s) != 'string' ? s : s.replace(Shotenjin.escapeXml_regexp, Shotenjin._escape_func); //"
  7. 44c45,47
  8. <
  9. ---
  10. >
  11. > extension : {}, // extension functions (ex. !{extension_name param} -> extension_name.call(window, 'param'); )
  12. >
  13. 92a96
  14. > _parseExpressions_regexp : /([$#!])\{(.*?)\}/g,
  15. 96c100
  16. < var regexp = /([$#])\{(.*?)\}/g;
  17. ---
  18. > var regexp = this._parseExpressions_regexp;
  19. 107c111
  20. < if (indicator == "$")
  21. ---
  22. > if (indicator == "$") {
  23. 109c113,119
  24. < else
  25. ---
  26. > } else if (indicator == "!") {
  27. > var extension = expr.split(' ');
  28. > var func = Shotenjin.extension[extension.shift()];
  29. > if (func) {
  30. > buf.push(func(extension.join(' ')));
  31. > };
  32. > } else {
  33. 110a121
  34. > };
  35. 118a130,131
  36. > addText_regexp1 : /[\'\\]/g,
  37. > addText_regexp2 : /\n/g,
  38. 121c134
  39. < var s = text.replace(/[\'\\]/g, '\\$&').replace(/\n/g, '\\n\\\n');
  40. ---
  41. > var s = text.replace(this.addText_regexp1, '\\$&').replace(this.addText_regexp2, '\\n\\\n');
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52. /*
  53. * $Rev: 39 $
  54. * $Release: 0.0.3 $
  55. * Copyright(c) 2007-2008 kuwata-lab.com all rights reserved
  56. * License: MIT License
  57. */
  58.  
  59. /**
  60. * namespace
  61. */
  62.  
  63. var Shotenjin = {
  64.  
  65. _escape_table: { '&': '&', '<': '<', '>': '>', '"': '"' },
  66.  
  67. _escape_func: function(m) { return Shotenjin._escape_table[m] },
  68.  
  69. escapeXml_regexp : /[&<>"]/g,
  70. escapeXml: function(s) {
  71. //if (s == null) return '';
  72. return typeof(s) != 'string' ? s : s.replace(Shotenjin.escapeXml_regexp, Shotenjin._escape_func); //"
  73. //return String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"'); //"
  74. },
  75.  
  76. escapeXml2: function(s) {
  77. if (s == null) return '';
  78. return String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"'); //"
  79. },
  80.  
  81. strip: function(s) {
  82. if (! s) return s;
  83. //return s.replace(/^\s+|\s+$/g, '');
  84. return s.replace(/^\s+/, '').replace(/\s+$/, '');
  85. },
  86.  
  87. // ex. {x: 10, y: 'foo'}
  88. // => "var x = _context['x'];\nvar y = _conntext['y'];\n"
  89. _setlocalvarscode: function(obj) {
  90. var buf = [];
  91. for (var p in obj) {
  92. buf.push("var ", p, " = _context['", p, "'];\n");
  93. }
  94. return buf.join('');
  95. },
  96.  
  97. extension : {}, // extension functions (ex. !{extension_name param} -> extension_name.call(window, 'param'); )
  98.  
  99. _end: undefined // dummy property to escape strict warning (not legal in ECMA-262)
  100. };
  101. delete(Shotenjin._end);
  102.  
  103. var escapeXml = Shotenjin.escapeXml;
  104.  
  105.  
  106. /**
  107. * Template class
  108. */
  109.  
  110. Shotenjin.Template = function(properties) {
  111. if (properties) {
  112. var p = properties;
  113. if (p['escaefunc']) this.escapefunc = p['escapefunc'];
  114. }
  115. };
  116.  
  117. Shotenjin.Template.prototype = {
  118.  
  119. escapefunc: 'escapeXml',
  120.  
  121. program: null,
  122.  
  123. convert: function(input) {
  124. var buf = [];
  125. buf.push("var _buf = []; ");
  126. this.parseStatements(buf, input);
  127. buf.push("_buf.join('')\n");
  128. return this.program = buf.join('');
  129. },
  130.  
  131. parseStatements: function(buf, input) {
  132. var regexp = /<\?js(\s(.|\n)*?) ?\?>/mg;
  133. var pos = 0;
  134. var m;
  135. while ((m = regexp.exec(input)) != null) {
  136. var stmt = m[1];
  137. var text = input.substring(pos, m.index);
  138. pos = m.index + m[0].length;
  139. //
  140. if (text) this.parseExpressions(buf, text);
  141. if (stmt) buf.push(stmt);
  142. }
  143. var rest = pos == 0 ? input : input.substring(pos);
  144. this.parseExpressions(buf, rest);
  145. },
  146.  
  147. _parseExpressions_regexp : /([$#!])\{(.*?)\}/g,
  148. parseExpressions: function(buf, input) {
  149. if (! input) return;
  150. buf.push(" _buf.push(");
  151. var regexp = this._parseExpressions_regexp;
  152. var pos = 0;
  153. var m;
  154. while ((m = regexp.exec(input)) != null) {
  155. var text = input.substring(pos, m.index);
  156. var s = m[0];
  157. pos = m.index + s.length;
  158. this.addText(buf, text);
  159. buf.push(", ");
  160. var indicator = m[1];
  161. var expr = m[2];
  162. if (indicator == "$") {
  163. buf.push(this.escapefunc, "(", expr, "), ");
  164. } else if (indicator == "!") {
  165. var extension = expr.split(' ');
  166. var func = Shotenjin.extension[extension.shift()];
  167. if (func) {
  168. buf.push(func(extension.join(' ')));
  169. };
  170. } else {
  171. buf.push(expr, ", ");
  172. };
  173. }
  174. var rest = pos == 0 ? input : input.substring(pos);
  175. rest ? this.addText(buf, rest, true) : buf.push('""');
  176. buf.push(");");
  177. if (input.charAt(input.length-1) == "\n")
  178. buf.push("\n");
  179. },
  180.  
  181. addText_regexp1 : /[\'\\]/g,
  182. addText_regexp2 : /\n/g,
  183. addText: function(buf, text, encode_newline) {
  184. if (! text) return;
  185. var s = text.replace(this.addText_regexp1, '\\$&').replace(this.addText_regexp2, '\\n\\\n');
  186. buf.push("'", s, "'");
  187. },
  188.  
  189. render: function(_context) {
  190. if (_context) {
  191. eval(Shotenjin._setlocalvarscode(_context));
  192. }
  193. else {
  194. _context = {};
  195. }
  196. return eval(this.program);
  197. },
  198.  
  199. _end: undefined // dummy property to escape strict warning (not legal in ECMA-262)
  200. };
  201. delete(Shotenjin.Template.prototype._end);
  202.  
  203.  
  204. /*
  205. * convenient function
  206. */
  207. Shotenjin.render = function(template_str, context) {
  208. var template = new Shotenjin.Template();
  209. template.convert(template_str);
  210. var output = template.render(context);
  211. return output;
  212. };
Add Comment
Please, Sign In to add comment