Advertisement
Guest User

Shock

a guest
Aug 18th, 2009
392
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var TeX = {
  2.     lib : {
  3.         safeHTML : function (string) {
  4.             return string.replace(/&|"|'|<|>/g, function (symb) {
  5.                 switch (symb) {
  6.                     case "&"  : return "&amp;";
  7.                     case "\"" : return "&quot;";
  8.                     case "\'" : return "&#039;";
  9.                     case "<"  : return "&lt;";
  10.                     case ">"  : return "&gt;";
  11.                 }
  12.             })
  13.         }
  14.     },
  15.     // This is container for private functions
  16.     office  : {
  17.         tags     : {},
  18.         rules    : {},
  19.         validate : {
  20.             tag : function (tag) {
  21.                 var errors = []
  22.                 if (!tag.name) {
  23.                     errors.push('Name of tag is empty (tag.name);');
  24.                 }
  25.                 if (!tag.args) {
  26.                     errors.push('Arguments count is empty (tag.args);');
  27.                 }
  28.                 if (!tag.func) {
  29.                     errors.push('There are no function in tag (tag.func);');
  30.                 }
  31.                 if (errors.length) {
  32.                     throw errors.join("\n");
  33.                     return false;
  34.                 }
  35.                 return true;
  36.             }
  37.         },
  38.         analizeTags : function () {
  39.             if (!TeX.office.analizeTagsCache) {
  40.                 var longestName = 0;
  41.                 for (var i in TeX.office.tags) {
  42.                     var tag = TeX.office.tags[i];
  43.                     if (!tag) {
  44.                         continue;
  45.                     }
  46.                     if (tag.name.length > longestName) {
  47.                         longestName = tag.name.length;
  48.                     }
  49.                     tag.argsMax = tag.args.toString().toLowerCase() == 'unlimited' ?
  50.                         null : TeX.office.arrayEdges(tag.args)['max'];
  51.                 }
  52.                 TeX.office.analizeTagsCache = {
  53.                     longest : longestName
  54.                 };
  55.             }
  56.             return TeX.office.analizeTagsCache;
  57.         },
  58.         analizeTagsCache : {},
  59.         arrayHas : function (array, value) {
  60.             for (var i in array) {
  61.                 if (value == array[i]) {
  62.                     return true;
  63.                 }
  64.             }
  65.             return false;
  66.         },
  67.         arrayEdges : function (array) {
  68.             var max = array[0];
  69.             var min = array[0];
  70.             for (var i in array) {
  71.                 if (array[i] > max) {
  72.                     max = array[i];
  73.                 }
  74.                 if (array[i] < min) {
  75.                     min = array[i];
  76.                 }
  77.             }
  78.             return {max:max, min:min};
  79.         },
  80.         findBlock: function (string, startFrom) {
  81.             var opened = 0;
  82.             for (var i = startFrom, l = string.length; i < l; i++) {
  83.                 var chr = string.charAt(i);
  84.                 if (chr == '{') {
  85.                     opened++;
  86.                 } else if (chr == '}' && !--opened) {
  87.                     return i;
  88.                 }
  89.             }
  90.             return null;
  91.         },
  92.         findTag: function (string, startFrom) {
  93.             var possibleTag;
  94.             var tag = {
  95.                 start:startFrom,
  96.                 blocks:[]
  97.             };
  98.             var tagStat = TeX.office.analizeTags();
  99.             var srcLine = string.substr(startFrom);
  100.             for (var i = 0; i <= tagStat.longest + 1; i++) {
  101.                 var chr = srcLine.charAt(i);
  102.                 if (chr == '{') {
  103.                     tag.name  = srcLine.substring(1, i);
  104.                     possibleTag = TeX.getTag(tag.name);
  105.                     if(!possibleTag) {
  106.                         break;
  107.                     }
  108.                     var blogsEnds = [];
  109.                     var max = possibleTag.argsMax;
  110.                     while (max === null ? true : max--) {
  111.                         var end = TeX.office.findBlock(srcLine, i);
  112.                         if (!end) {
  113.                             break;
  114.                         }
  115.                         tag.blocks.push(srcLine.substring(i+1, end));
  116.                         blogsEnds.push(end);
  117.                         if (srcLine.charAt(end+1) == '{') {
  118.                             i = end+1;
  119.                         } else {
  120.                             break;
  121.                         }
  122.                     }
  123.                     while (max !== null && tag.blocks.length && !TeX.office.arrayHas(possibleTag.args, tag.blocks.length)) {
  124.                         tag.blocks.pop();
  125.                         blogsEnds.pop();
  126.                     }
  127.                     if (!tag.blocks.length) {
  128.                         break;
  129.                     }
  130.                     tag.finish = startFrom + 1 + blogsEnds.pop();
  131.                     tag.func   = possibleTag.func;
  132.                     return tag;
  133.                 }
  134.             }
  135.             return null;
  136.         }
  137.     },
  138.     markup  : function (string) {
  139.         var result = '';
  140.         for (var i = 0; i < string.length; i++) {
  141.             var chr = string.charAt(i);
  142.             if (chr == "\\") {
  143.                 try {
  144.                     var tag = TeX.office.findTag(string, i);
  145.                 } catch (ignored) {
  146.                     break;
  147.                 }
  148.                
  149.                 if (tag) {
  150.                     result += TeX.markupPlain(string.substring(0, tag.start));
  151.                     result += tag.func(tag.blocks);
  152.                     string = string.substr (tag.finish);
  153.                     i = -1;
  154.                 }
  155.             }
  156.         }
  157.         return result + TeX.markupPlain(string);
  158.        
  159.     },
  160.     markupPlain : function (string) {
  161.         for (var i in TeX.office.rules) {
  162.             var rule = TeX.office.rules[i];
  163.             if (!rule) {
  164.                 continue;
  165.             }
  166.             string = rule.func(string);
  167.         }
  168.         return string;
  169.     },
  170.    
  171.     // Rules
  172.     getRule  : function (name) {
  173.         var rule = TeX.office.rules[name];
  174.         return rule ? rule : null;
  175.     },
  176.     getRules  : function () {
  177.         return TeX.office.rules;
  178.     },
  179.     addRule : function (rule) {
  180.         TeX.office.rules[rule.name] = rule;
  181.     },
  182.     addRules : function (rules) {
  183.         for (var i in rules) {
  184.             TeX.addRule(rules[i]);
  185.         }
  186.     },
  187.     rmRule : function (name) {
  188.         TeX.office.rules[name] = null;
  189.     },
  190.  
  191.     // Tags
  192.     getTag  : function (name) {
  193.         var tag = TeX.office.tags[name];
  194.         return tag ? tag : null;
  195.     },
  196.     getTags  : function () {
  197.         return TeX.office.tags;
  198.     },
  199.     addTag  : function (tag) {
  200.         if (TeX.office.validate.tag(tag)) {
  201.             TeX.office.tags[tag.name] = tag;
  202.             TeX.office.analizeTagsCache = null;
  203.         }
  204.     },
  205.     addTags : function (tags) {
  206.         for (var i in tags) {
  207.             TeX.addTag(tags[i]);
  208.         }
  209.     },
  210.     rmTag : function (name) {
  211.         TeX.office.analizeTagsCache = null;
  212.         TeX.office.tags[name] = null;
  213.     }
  214. };
  215.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement