home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / Inkscape / Inkscape-0.48.2-1-win32.exe / share / extensions / test / inkweb-debug.js < prev    next >
Text File  |  2011-07-08  |  13KB  |  369 lines

  1. /*
  2. **  InkWeb Debuger - help the development with InkWeb.
  3. **
  4. **  Copyright (C) 2009 Aurelio A. Heckert, aurium (a) gmail dot com
  5. **
  6. **  ********* Bugs and New Fetures *************************************
  7. **   If you found any bug on this script or if you want to propose a
  8. **   new feature, please report it in the inkscape bug traker
  9. **   https://bugs.launchpad.net/inkscape/+filebug
  10. **   and assign that to Aurium.
  11. **  ********************************************************************
  12. **
  13. **  This program is free software: you can redistribute it and/or modify
  14. **  it under the terms of the GNU Lesser General Public License as published
  15. **  by the Free Software Foundation, either version 3 of the License, or
  16. **  (at your option) any later version.
  17. **
  18. **  This program is distributed in the hope that it will be useful,
  19. **  but WITHOUT ANY WARRANTY; without even the implied warranty of
  20. **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21. **  GNU Lesser General Public License for more details.
  22. **
  23. **  You should have received a copy of the GNU Lesser General Public License
  24. **  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  25. **
  26. **  ********************************************************************
  27. **
  28. **  This script extends InkWeb with methods like log() and viewProperties().
  29. **  So, you must to call this script after the inkweb.js load.
  30. */
  31.  
  32. InkWeb.debugVersion = 0.1;
  33.  
  34. // Prepare InkWeb Debug:
  35. (function (bli, xyz) {
  36.   // Add logging calls to all InkWeb methods:
  37.   for ( var att in InkWeb ) {
  38.     if ( typeof(InkWeb[att]) == "function" ) {
  39.       var code = InkWeb[att].toString()
  40.       beforeCode = 'this.log(this.__callMethodInfo("'+att+'", arguments));\ntry {';
  41.       afterCode = '} catch(e) { this.log( e, "Ups... There is a problem in InkWeb.'+att+'()" ) }';
  42.       code = code
  43.         .replace( /^(function [^{]+[{])/, "$1\n"+ beforeCode +"\n" )
  44.         .replace( /[}]$/, ";\n"+ afterCode +"\n}" );
  45.       eval( "InkWeb."+att+" = "+ code );
  46.       //alert( InkWeb[att] )
  47.     }
  48.   }
  49. })(123,456);
  50.  
  51. InkWeb.__callMethodInfo = function (funcName, arg) {
  52.   var func = arg.callee;
  53.   var str = 'Called InkWeb.'+funcName+'() with:'
  54.   if ( ! func.argList ) {
  55.     func.argList = func.toString()
  56.                        .replace( /^function [^(]*\(([^)]*)\)(.|\s)*$/, "$1" )
  57.                        .split( /,\s*/ );
  58.   }
  59.   for ( var a,i=0; a=func.argList[i]; i++ ) {
  60.     str += "\n"+ a +" = "+ this.serialize( arg[i], {recursionLimit:2} );
  61.   }
  62.   return str;
  63. }
  64.  
  65.  
  66. InkWeb.copySerializeConf = function (conf) {
  67.   return {
  68.     recursionStep:   conf.recursionStep,
  69.     recursionLimit:  conf.recursionLimit,
  70.     showTagElements: conf.showTagElements
  71.   }
  72. }
  73.  
  74. InkWeb.serialize = function (v, conf) {
  75.   try {
  76.     if ( ! conf ) { conf = {} }
  77.     if ( ! conf.showTagElements ) { conf.showTagElements = false }
  78.     if ( ! conf.recursionLimit ) { conf.recursionLimit = 10 }
  79.     if ( ! conf.recursionStep ) { conf.recursionStep = 0  }
  80.     if ( conf.recursionLimit == 0 ) {
  81.       return '"<<recursion limit>>"';
  82.     }
  83.     conf.recursionLimit--;
  84.     conf.recursionStep++;
  85.     switch ( typeof(v) ) {
  86.       case "undefined":
  87.         v = "undefined";
  88.         break;
  89.       case "string":
  90.         v = '"'+ v
  91.               .replace( /\n/g, "\\n" )
  92.               .replace( /\r/g, "\\r" )
  93.               .replace( /\t/g, "\\t" )
  94.               .replace( /"/g, '"' ) +
  95.             '"';
  96.         break;
  97.       case "boolean":
  98.       case "number":
  99.       case "function":
  100.         v = v.toString();
  101.         break;
  102.       case "object":
  103.         if ( v == null ) {
  104.           v = "null";
  105.         } else {
  106.           if ( v.constructor == Array ) {
  107.             try {
  108.               v = this.__serializeArray(v, conf);
  109.             } catch(e) {
  110.               this.log( e, "InkWeb.serialize(): Forced recursion limit in" +
  111.                             " recursionLimit="+ conf.recursionLimit +
  112.                             " and recursionStep="+ conf.recursionStep
  113.                       );
  114.               v += '"<<forced recursion limit>>"'
  115.             }
  116.           } else {
  117.             // A Hash Object
  118.             if ( v.tagName && ! conf.showTagElements ) {
  119.               // Tags are not allowed.
  120.               v = '"<'+ v.tagName +' id=\\"'+ v.id +'\\">"';
  121.             } else {
  122.               // Ok, serialize this object:
  123.               try {
  124.                 v = this.__serializeObject(v, conf);
  125.               } catch(e) {
  126.                 this.log( e, "InkWeb.serialize(): Forced recursion limit in" +
  127.                               " recursionLimit="+ conf.recursionLimit +
  128.                               " and recursionStep="+ conf.recursionStep
  129.                         );
  130.                 v += '"<<forced recursion limit>>"'
  131.               }
  132.             }
  133.           }
  134.         }
  135.         break;
  136.       default:
  137.         v = '"<<unknown type '+typeof(v)+' : '+v+'>>"';
  138.     }
  139.     return v;
  140.   } catch(e) {
  141.     this.log( e, "Ups... There is a problem in InkWeb.serialize()." );
  142.   }
  143. }
  144.  
  145. InkWeb.__serializeArray = function (v, conf) {
  146.   try {
  147.     var vStr = "[ ";
  148.     var size = v.length;
  149.     for ( var i=0; i<size; i++ ) {
  150.       if ( i>0 ) { vStr += ", " }
  151.       vStr += this.serialize(v[i], this.copySerializeConf(conf));
  152.     }
  153.     return vStr +" ]";
  154.   } catch(e) {
  155.     this.log( e, "Ups... There is a problem in InkWeb.__serializeArray()." );
  156.   }
  157. }
  158.  
  159. InkWeb.__serializeObject = function (obj, conf) {
  160.   try {
  161.     var vStr = "{ ";
  162.     var first = true;
  163.     for ( var att in obj ) {
  164.       if ( !first ) { vStr += ", " }
  165.       vStr += this.serialize(att) +':'+
  166.               this.serialize( obj[att], this.copySerializeConf(conf) );
  167.       first = false;
  168.     }
  169.     return vStr +" }";
  170.   } catch(e) {
  171.     this.log( e, "Ups... There is a problem in InkWeb.__serializeObject()." );
  172.   }
  173. }
  174.  
  175. // Allow log configuration:
  176. InkWeb.mustLog = {
  177.     error: true,
  178.     warning: true,
  179.     sequence: true
  180.   };
  181.  
  182. // This will keep the log information:
  183. InkWeb.__log__ = [];
  184.  
  185. InkWeb.log = function (type, msg) {
  186.   /* This method register what was happen with InkWeb
  187.   ** ( if mustLog allows that )
  188.   **
  189.   ** --- Usage ---
  190.   ** this.log( <"sequence"|"warning"|"warn"|errorObject>, <"logMessage"> );
  191.   ** this.log( <"logMessage"> );  // only for sequences
  192.   **
  193.   ** --- Examples ---
  194.   ** Sequence log:
  195.   ** function foo (bar) {
  196.   **   InkWeb.log( 'Call function foo with argument bar="'+bar+'"' );
  197.   **
  198.   ** Warning log:
  199.   ** if ( foo == bar ) {
  200.   **   foo = other;
  201.   **   InkWeb.log( "warn", "foo must not be bar." );
  202.   **
  203.   ** Error log:
  204.   ** try { ... some hard thing ... }
  205.   ** catch (e) { InkWeb.log( e, "Trying to do some hard thing." ) }
  206.   */
  207.   if ( this.mustLog ) {
  208.     if( type.constructor == ReferenceError ) {
  209.       // in a error loging the type argument is the error object.
  210.       var error = type;
  211.       type = "error";
  212.       this.addViewLogBt();
  213.     }
  214.     if( type == "warn" ) {
  215.       // that allows a little simplify in the log call.
  216.       type = "warning";
  217.     }
  218.     if( msg == undefined ) {
  219.       // that allows to log a sequence without tos say the type.
  220.       msg = type;
  221.       type = "sequence";
  222.     }
  223.     var logSize = this.__log__.length
  224.     if ( logSize > 0 &&
  225.          this.__log__[logSize-1].type == type &&
  226.          this.__log__[logSize-1].msg == msg ) {
  227.       this.__log__[logSize-1].happens++
  228.     } else {
  229.       if ( type == "error" && this.mustLog.error ) {
  230.         this.__log__[logSize] = this.__logError( error, msg )
  231.       }
  232.       if ( type == "warning" && this.mustLog.warning ) {
  233.         this.__log__[logSize] = this.__logWarning( msg )
  234.       }
  235.       if ( type == "sequence" && this.mustLog.sequence ) {
  236.         this.__log__[logSize] = this.__logSequence( msg )
  237.       }
  238.     }
  239.   }
  240. }
  241.  
  242. InkWeb.__logError = function ( error, msg ) {
  243.   return { type:"error", date:new Date(), msg:msg, error:error, happens:1 };
  244. }
  245.  
  246. InkWeb.__logWarning = function ( msg ) {
  247.   return { type:"warning", date:new Date(), msg:msg, happens:1 };
  248. }
  249.  
  250. InkWeb.__logSequence = function ( msg ) {
  251.   return { type:"sequence", date:new Date(), msg:msg, happens:1 };
  252. }
  253.  
  254. InkWeb.logToString = function (conf) {
  255.   /* Show the log in a formated string.
  256.   ** conf attributes:
  257.   **   format: a string to format the log itens.
  258.   **   formatError: to format the error log itens.
  259.   **   sep: the log itens separator string.
  260.   ** format variables:
  261.   **   $F: the item date in the format YYYY-MM-DD
  262.   **   $T: the item time in the format HH:MM:SS
  263.   **   $type: the log type
  264.   **   $logmsg: the text argument in the log call
  265.   **   $times: how much times this item happens in sequence
  266.   **   $error: the error text (if this is a error item)
  267.   **   $index: the position of the item in the log list
  268.   **   $oddeven: return odd or even based in the index.
  269.   */
  270.   if (!conf)        { conf        = {}     }
  271.   if (!conf.sep)    { conf.sep    = "\n\n" }
  272.   if (!conf.format) { conf.format = "$F $T - $type - $logmsg - Happens $times." }
  273.   if (!conf.formatError) { conf.formatError = "$F $T - ERROR - $logmsg - Happens $times.\n$error" }
  274.   /* * * Helper * * */
  275.   function _2d(num) {
  276.     return ( ( num < 10 )? "0"+num : ""+num )
  277.   }
  278.   function _2dMonth(date) {
  279.     var m = date.getMonth() + 1;
  280.     return _2d( m )
  281.   }
  282.   var str = "";
  283.   var logSize = this.__log__.length;
  284.   if ( logSize == 0 ) {
  285.     str = "There are no errors.";
  286.   }
  287.   // View all itens to mount the log string:
  288.   for ( var item,pos=0; item=this.__log__[pos]; pos++ ) {
  289.     var d = item.date;
  290.     // Add log line, converting variables:
  291.     var line = ( (item.type=="error")? conf.formatError : conf.format );
  292.     str += line
  293.            .replace( /\$index/g,   pos )
  294.            .replace( /\$oddeven/g, (pos%2 == 1)? "odd" : "even" )
  295.            .replace( /\$type/g,    item.type )
  296.            .replace( /\$logmsg/g,  item.msg  )
  297.            .replace( /\$error/g,   (item.error)? item.error.message : "" )
  298.            .replace( /\$times/g,   (item.happens>1)? item.happens+" times" : "one time" )
  299.            .replace( /\$F/g, d.getFullYear() +"-"+ _2dMonth(d) +"-"+ _2d(d.getDate()) )
  300.            .replace( /\$T/g, _2d(d.getHours()) +":"+ _2d(d.getMinutes()) +":"+ _2d(d.getSeconds()) )
  301.     // Add separator:
  302.     if ( pos < (logSize-1) ) { str += conf.sep }
  303.   }
  304.   return str;
  305. }
  306.  
  307. InkWeb.addViewLogBt = function () {
  308.   var svg = document.getElementsByTagName("svg")[0];
  309.   if ( this.__viewLogBt ) {
  310.     svg.appendChild( this.__viewLogBt );
  311.   } else {
  312.     var g = this.el( "g", { onclick: "InkWeb.openLogWindow()", parent: svg } );
  313.     var rect = this.el( "rect", { x: 10, y: 10, width: 60, height: 17, ry: 5,
  314.                                   style: "fill:#C00; stroke:#800; stroke-width:2",
  315.                                   parent: g } );
  316.     var text = this.el( "text", { x: 40, y: 22, text: "View Log",
  317.                                   style: "fill:#FFF; font-size:10px;" +
  318.                                          "font-family:sans-serif;" +
  319.                                          "text-anchor:middle; text-align:center",
  320.                                   parent: g } );
  321.     this.__viewLogBt = g;
  322.   }
  323. }
  324.  
  325. InkWeb.__openFormatedWindow = function (bodyHTML) {
  326.   var win = window.open("","_blank","width=500,height=500,scrollbars=yes");
  327.   var html =
  328.     '<html><head><title>InkWeb</title>' +
  329.     '<style type="text/css">' +
  330.     'body { font-family:sans-serif; font-size:12px; padding:5px; margin:0px; }' +
  331.     'h1 { font-size:13px; text-align:center; }' +
  332.     '.error    { color: #C00 }' +
  333.     '.warning  { color: #B90 }' +
  334.     '.sequence { color: #06A }' +
  335.     'table { border: 2px solid #ABC }' +
  336.     'th, td { padding:1px 2px; font-size:12px }' +
  337.     'th { text-align:center; background:#CCC; color:#FFF }' +
  338.     '.odd  { background: #F0F0F0 }' +
  339.     '.even { background: #F8F8F8 }' +
  340.     '</style><body>'+ bodyHTML +'</body></html>';
  341.   win.document.write(html);
  342.   win.document.close();
  343.   return win;
  344. }
  345.  
  346. InkWeb.openLogWindow = function () {
  347.   var html = '<h1>InkWeb Log</h1>\n' +
  348.     '<table border="0" width="100%" cellpadding="2" cellspacing="0"><tr>\n' +
  349.     '<tr><th>Time</th><th>Message</th><th><small>Happens</small></th><tr>\n' +
  350.     this.logToString({
  351.       format:      '<tr class="$type $oddeven" title="$type">' +
  352.                    '<td>$T</td><td>$logmsg</td><td align="right">$times</td></tr>',
  353.       formatError: '<tr class="error $oddeven" title="ERROR">' +
  354.                    '<td>$T</td><td>$logmsg</td><td align="right">$times</td></tr>\n'+
  355.                    '<tr class="error $oddeven"><td colspan="3"><code>$error</code></td></tr>',
  356.       sep: '\n</tr><tr>\n'
  357.     }) +
  358.     '\n</tr></table>'
  359.   var win = this.__openFormatedWindow( html );
  360.   win.document.title = "InkWeb Log"
  361. }
  362.  
  363.  
  364. InkWeb.viewProperties = function () {
  365.   // Display object properties.
  366.   this.__openFormatedWindow( "coming soon..." );
  367. }
  368.  
  369.