Simple image host.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

preprocess.js 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. var vals = {
  2. env: "[^\\s}]+#[^\\s}]+",
  3. string: "'[^'}]*'"
  4. }
  5. //Get regex for all values
  6. var valueRegex =
  7. Object.keys(vals)
  8. .map(function(i) { return vals[i]; })
  9. .join("|");
  10. //Turn value regex strings into actual regexes
  11. Object.keys(vals).forEach(function(i) {
  12. vals[i] = new RegExp(vals[i]);
  13. });
  14. var regexStr =
  15. "{{"+ //{{
  16. "("+valueRegex+")"+ //value - $1
  17. "(?:"+ //<optional>
  18. " \\? "+ //?
  19. "("+valueRegex+")"+ //value - $2
  20. " : "+ //:
  21. "("+valueRegex+")"+ //value - $3
  22. ")?"+ //</optional>
  23. "}}"; //}}
  24. var localRegex = new RegExp(regexStr);
  25. var globalRegex = new RegExp(regexStr, "g");
  26. function getObjVal(obj, str) {
  27. var val = obj[str];
  28. if (val !== undefined)
  29. return val;
  30. var parts = str.split(".");
  31. val = obj;
  32. for (var i = 0; i < parts.length; ++i) {
  33. val = val[parts[i]];
  34. if (val === undefined)
  35. return undefined;
  36. }
  37. return val;
  38. }
  39. function getVal(str, env) {
  40. if (vals.env.test(str)) {
  41. var parts = str.split("#");
  42. var ns = env[parts[0]];
  43. if (typeof ns === "function")
  44. return ns(parts[1]);
  45. else if (ns !== undefined)
  46. return getObjVal(ns, parts[1]);
  47. else
  48. throw new Error("No: "+str);
  49. } else if (vals.string.test(str)) {
  50. return str.substring(1, str.length - 1);
  51. }
  52. }
  53. module.exports = function(str, env) {
  54. var placeholders = str.match(globalRegex);
  55. if (!placeholders)
  56. return str;
  57. placeholders.forEach(function(p) {
  58. var parts = p.match(localRegex);
  59. var s = parts[0];
  60. //Ternary
  61. if (parts[3]) {
  62. try {
  63. var cond = getVal(parts[1], env);
  64. var val1 = getVal(parts[2], env);
  65. var val2 = getVal(parts[3], env);
  66. } catch (err) {
  67. return;
  68. }
  69. if (cond === true)
  70. str = str.replace(s, val1);
  71. else
  72. str = str.replace(s, val2);
  73. }
  74. //Direct value
  75. else {
  76. try {
  77. var val = getVal(parts[1], env);
  78. } catch (err) {
  79. return;
  80. }
  81. if (val !== undefined && val !== null)
  82. str = str.replace(s, val);
  83. }
  84. });
  85. return str;
  86. }