adding sprintf stuff to support unicode character escaping in marcxml
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Tue, 28 Nov 2006 01:30:39 +0000 (01:30 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Tue, 28 Nov 2006 01:30:39 +0000 (01:30 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@6621 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/xul/staff_client/chrome/content/util/sprintf.js [new file with mode: 0644]
Open-ILS/xul/staff_client/server/cat/marcedit.js
Open-ILS/xul/staff_client/server/cat/marcedit.xul

diff --git a/Open-ILS/xul/staff_client/chrome/content/util/sprintf.js b/Open-ILS/xul/staff_client/chrome/content/util/sprintf.js
new file mode 100644 (file)
index 0000000..5a9894e
--- /dev/null
@@ -0,0 +1,182 @@
+/* Copyright (c) 2005 Scott S. McCoy
+ * This was originally a non-object oriented interface
+* Function printf(format_string,arguments...)
+ * Javascript emulation of the C printf function (modifiers and argument types 
+ *    "p" and "n" are not supported due to language restrictions)
+ *
+ * Copyright 2003 K&L Productions. All rights reserved
+ * http://www.klproductions.com 
+ *
+ * Terms of use: This function can be used free of charge IF this header is not
+ *               modified and remains with the function code.
+ * 
+ * Legal: Use this code at your own risk. K&L Productions assumes NO resposibility
+ *        for anything.
+ ********************************************************************************/
+
+String.prototype.sprintf = function () {
+  var fstring = this.toString();
+
+  var pad = function(str,ch,len) { var ps='';
+      for(var i=0; i<Math.abs(len); i++) {
+                 ps+=ch;
+         }
+      return len>0?str+ps:ps+str;
+  };
+  var processFlags = function(flags,width,rs,arg) { 
+      var pn = function(flags,arg,rs) {
+          if(arg>=0) { 
+              if(flags.indexOf(' ')>=0) {
+                                 rs = ' ' + rs;
+                         } else if(flags.indexOf('+')>=0) {
+                                 rs = '+' + rs;
+                         }
+          } else {
+              rs = '-' + rs;
+                 }
+          return rs;
+      };
+      var iWidth = parseInt(width,10);
+      if(width.charAt(0) == '0') {
+          var ec=0;
+          if(flags.indexOf(' ')>=0 || flags.indexOf('+')>=0) {
+                         ec++;
+                 }
+          if(rs.length<(iWidth-ec)) {
+                         rs = pad(rs,'0',rs.length-(iWidth-ec));
+                 }
+          return pn(flags,arg,rs);
+      }
+      rs = pn(flags,arg,rs);
+      if(rs.length<iWidth) {
+          if(flags.indexOf('-')<0) {
+                         rs = pad(rs,' ',rs.length-iWidth);
+                 } else {
+                         rs = pad(rs,' ',iWidth - rs.length);
+                 }
+      }    
+      return rs;
+  };
+  var converters = [];
+  converters.c = function(flags,width,precision,arg) { 
+      if (typeof(arg) == 'number') {
+                 return String.fromCharCode(arg);
+         } else if (typeof(arg) == 'string') {
+                 return arg.charAt(0);
+         } else {
+                 return '';
+         }
+  };
+  converters.d = function(flags,width,precision,arg) { 
+      return converters.i(flags,width,precision,arg); 
+  };
+  converters.u = function(flags,width,precision,arg) { 
+      return converters.i(flags,width,precision,Math.abs(arg)); 
+  };
+  converters.i =  function(flags,width,precision,arg) {
+      var iPrecision=parseInt(precision, 10);
+      var rs = ((Math.abs(arg)).toString().split('.'))[0];
+      if(rs.length<iPrecision) {
+                 rs=pad(rs,' ',iPrecision - rs.length);
+         }
+      return processFlags(flags,width,rs,arg); 
+  };
+  converters.E = function(flags,width,precision,arg) {
+      return (converters.e(flags,width,precision,arg)).toUpperCase();
+  };
+  converters.e = function(flags,width,precision,arg) {
+      iPrecision = parseInt(precision, 10);
+      if(isNaN(iPrecision)) {
+                 iPrecision = 6;
+         }
+      rs = (Math.abs(arg)).toExponential(iPrecision);
+      if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) {
+                 rs = rs.replace(/^(.*)(e.*)$/,'$1.$2');
+         }
+      return processFlags(flags,width,rs,arg);        
+  };
+  converters.f = function(flags,width,precision,arg) { 
+      iPrecision = parseInt(precision, 10);
+      if(isNaN(iPrecision)) {
+                 iPrecision = 6;
+         }
+      rs = (Math.abs(arg)).toFixed(iPrecision);
+      if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) {
+                 rs = rs + '.';
+         }
+      return processFlags(flags,width,rs,arg);
+  };
+  converters.G = function(flags,width,precision,arg) { 
+      return (converters.g(flags,width,precision,arg)).toUpperCase();
+  };
+  converters.g = function(flags,width,precision,arg) {
+      iPrecision = parseInt(precision, 10);
+      absArg = Math.abs(arg);
+      rse = absArg.toExponential();
+      rsf = absArg.toFixed(6);
+      if(!isNaN(iPrecision)) { 
+          rsep = absArg.toExponential(iPrecision);
+          rse = rsep.length < rse.length ? rsep : rse;
+          rsfp = absArg.toFixed(iPrecision);
+          rsf = rsfp.length < rsf.length ? rsfp : rsf;
+      }
+      if(rse.indexOf('.')<0 && flags.indexOf('#')>=0) {
+                 rse = rse.replace(/^(.*)(e.*)$/,'$1.$2');
+         }
+      if(rsf.indexOf('.')<0 && flags.indexOf('#')>=0) {
+                 rsf = rsf + '.';
+         }
+      rs = rse.length<rsf.length ? rse : rsf;
+      return processFlags(flags,width,rs,arg);        
+  };  
+  converters.o = function(flags,width,precision,arg) { 
+      var iPrecision=parseInt(precision, 10);
+      var rs = Math.round(Math.abs(arg)).toString(8);
+      if(rs.length<iPrecision) {
+                 rs=pad(rs,' ',iPrecision - rs.length);
+         }
+      if(flags.indexOf('#')>=0) {
+                 rs='0'+rs;
+         }
+      return processFlags(flags,width,rs,arg); 
+  };
+  converters.X = function(flags,width,precision,arg) { 
+      return (converters.x(flags,width,precision,arg)).toUpperCase();
+  };
+  converters.x = function(flags,width,precision,arg) { 
+      var iPrecision=parseInt(precision, 10);
+      arg = Math.abs(arg);
+      var rs = Math.round(arg).toString(16);
+      if(rs.length<iPrecision) {
+                 rs=pad(rs,' ',iPrecision - rs.length);
+         }
+      if(flags.indexOf('#')>=0) {
+                 rs='0x'+rs;
+         }
+      return processFlags(flags,width,rs,arg); 
+  };
+  converters.s = function(flags,width,precision,arg) { 
+      var iPrecision=parseInt(precision, 10);
+      var rs = arg;
+      if(rs.length > iPrecision) {
+                 rs = rs.substring(0,iPrecision);
+         }
+      return processFlags(flags,width,rs,0);
+  };
+
+  farr = fstring.split('%');
+  retstr = farr[0];
+  fpRE = /^([-+ #]*)(?:(\d*)\$|)(\d*)\.?(\d*)([cdieEfFgGosuxX])(.*)$/;
+  for(var i = 1; i<farr.length; i++) { 
+      fps=fpRE.exec(farr[i]);
+      if(!fps) {
+                 continue;
+         }
+         var my_i = fps[2] ? fps[2] : i;
+      if(arguments[my_i-1]) {
+          retstr+=converters[fps[5]](fps[1],fps[3],fps[4],arguments[my_i-1]);
+      }
+      retstr += fps[6];
+  }
+  return retstr;
+};
index a48b566..fda503d 100644 (file)
@@ -85,7 +85,16 @@ function my_init() {
                // End faking part...
 
                document.getElementById('save-button').setAttribute('label', window.xulG.save.label);
-               document.getElementById('save-button').setAttribute('oncommand', 'mangle_005(); window.xulG.save.func(xml_record.toXMLString()); loadRecord(xml_record);');
+               document.getElementById('save-button').setAttribute('oncommand',
+                       'mangle_005(); ' + 
+                       'var xml_string = xml_record.toXMLString(); ' +
+                       'xml_string = xml_string.replace( ' +
+                       '       /([\\\\u0080-\\\\ufffe])/g, ' +
+                       '       function (r,s) { return "&#x%04x;".sprintf(s) } ' +
+                       '); ' +
+                       'window.xulG.save.func( xml_record ); ' +
+                       'loadRecord(xml_record);'
+               );
 
                if (window.xulG.record.url) {
                        var req =  new XMLHttpRequest();
index 7846cb4..73bfc59 100644 (file)
@@ -4,6 +4,7 @@
 
 <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:xhtml="http://www.w3.org/1999/xhtml" onload="my_init()">
 
+<script src="/xul/server/util/sprintf.js" type="application/x-javascript; e4x=1"/>
 <script src="marcedit.js" type="application/x-javascript; e4x=1"/>
 <script src="/opac/common/js/CGI.js" type="application/x-javascript; e4x=1"/>