Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Initial revision.

  • Loading branch information...
commit 31d36ee6e80eb05fb5487f7f92a6be8746879c31 0 parents
Jeff Trudeau authored

Showing 4 changed files with 648 additions and 0 deletions. Show diff stats Hide diff stats

  1. +339 0 LICENSE
  2. +26 0 README
  3. +73 0 i18n.js
  4. +210 0 sprintf.js
339 LICENSE
... ... @@ -0,0 +1,339 @@
  1 + GNU GENERAL PUBLIC LICENSE
  2 + Version 2, June 1991
  3 +
  4 + Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
  5 + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  6 + Everyone is permitted to copy and distribute verbatim copies
  7 + of this license document, but changing it is not allowed.
  8 +
  9 + Preamble
  10 +
  11 + The licenses for most software are designed to take away your
  12 +freedom to share and change it. By contrast, the GNU General Public
  13 +License is intended to guarantee your freedom to share and change free
  14 +software--to make sure the software is free for all its users. This
  15 +General Public License applies to most of the Free Software
  16 +Foundation's software and to any other program whose authors commit to
  17 +using it. (Some other Free Software Foundation software is covered by
  18 +the GNU Lesser General Public License instead.) You can apply it to
  19 +your programs, too.
  20 +
  21 + When we speak of free software, we are referring to freedom, not
  22 +price. Our General Public Licenses are designed to make sure that you
  23 +have the freedom to distribute copies of free software (and charge for
  24 +this service if you wish), that you receive source code or can get it
  25 +if you want it, that you can change the software or use pieces of it
  26 +in new free programs; and that you know you can do these things.
  27 +
  28 + To protect your rights, we need to make restrictions that forbid
  29 +anyone to deny you these rights or to ask you to surrender the rights.
  30 +These restrictions translate to certain responsibilities for you if you
  31 +distribute copies of the software, or if you modify it.
  32 +
  33 + For example, if you distribute copies of such a program, whether
  34 +gratis or for a fee, you must give the recipients all the rights that
  35 +you have. You must make sure that they, too, receive or can get the
  36 +source code. And you must show them these terms so they know their
  37 +rights.
  38 +
  39 + We protect your rights with two steps: (1) copyright the software, and
  40 +(2) offer you this license which gives you legal permission to copy,
  41 +distribute and/or modify the software.
  42 +
  43 + Also, for each author's protection and ours, we want to make certain
  44 +that everyone understands that there is no warranty for this free
  45 +software. If the software is modified by someone else and passed on, we
  46 +want its recipients to know that what they have is not the original, so
  47 +that any problems introduced by others will not reflect on the original
  48 +authors' reputations.
  49 +
  50 + Finally, any free program is threatened constantly by software
  51 +patents. We wish to avoid the danger that redistributors of a free
  52 +program will individually obtain patent licenses, in effect making the
  53 +program proprietary. To prevent this, we have made it clear that any
  54 +patent must be licensed for everyone's free use or not licensed at all.
  55 +
  56 + The precise terms and conditions for copying, distribution and
  57 +modification follow.
  58 +
  59 + GNU GENERAL PUBLIC LICENSE
  60 + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  61 +
  62 + 0. This License applies to any program or other work which contains
  63 +a notice placed by the copyright holder saying it may be distributed
  64 +under the terms of this General Public License. The "Program", below,
  65 +refers to any such program or work, and a "work based on the Program"
  66 +means either the Program or any derivative work under copyright law:
  67 +that is to say, a work containing the Program or a portion of it,
  68 +either verbatim or with modifications and/or translated into another
  69 +language. (Hereinafter, translation is included without limitation in
  70 +the term "modification".) Each licensee is addressed as "you".
  71 +
  72 +Activities other than copying, distribution and modification are not
  73 +covered by this License; they are outside its scope. The act of
  74 +running the Program is not restricted, and the output from the Program
  75 +is covered only if its contents constitute a work based on the
  76 +Program (independent of having been made by running the Program).
  77 +Whether that is true depends on what the Program does.
  78 +
  79 + 1. You may copy and distribute verbatim copies of the Program's
  80 +source code as you receive it, in any medium, provided that you
  81 +conspicuously and appropriately publish on each copy an appropriate
  82 +copyright notice and disclaimer of warranty; keep intact all the
  83 +notices that refer to this License and to the absence of any warranty;
  84 +and give any other recipients of the Program a copy of this License
  85 +along with the Program.
  86 +
  87 +You may charge a fee for the physical act of transferring a copy, and
  88 +you may at your option offer warranty protection in exchange for a fee.
  89 +
  90 + 2. You may modify your copy or copies of the Program or any portion
  91 +of it, thus forming a work based on the Program, and copy and
  92 +distribute such modifications or work under the terms of Section 1
  93 +above, provided that you also meet all of these conditions:
  94 +
  95 + a) You must cause the modified files to carry prominent notices
  96 + stating that you changed the files and the date of any change.
  97 +
  98 + b) You must cause any work that you distribute or publish, that in
  99 + whole or in part contains or is derived from the Program or any
  100 + part thereof, to be licensed as a whole at no charge to all third
  101 + parties under the terms of this License.
  102 +
  103 + c) If the modified program normally reads commands interactively
  104 + when run, you must cause it, when started running for such
  105 + interactive use in the most ordinary way, to print or display an
  106 + announcement including an appropriate copyright notice and a
  107 + notice that there is no warranty (or else, saying that you provide
  108 + a warranty) and that users may redistribute the program under
  109 + these conditions, and telling the user how to view a copy of this
  110 + License. (Exception: if the Program itself is interactive but
  111 + does not normally print such an announcement, your work based on
  112 + the Program is not required to print an announcement.)
  113 +
  114 +These requirements apply to the modified work as a whole. If
  115 +identifiable sections of that work are not derived from the Program,
  116 +and can be reasonably considered independent and separate works in
  117 +themselves, then this License, and its terms, do not apply to those
  118 +sections when you distribute them as separate works. But when you
  119 +distribute the same sections as part of a whole which is a work based
  120 +on the Program, the distribution of the whole must be on the terms of
  121 +this License, whose permissions for other licensees extend to the
  122 +entire whole, and thus to each and every part regardless of who wrote it.
  123 +
  124 +Thus, it is not the intent of this section to claim rights or contest
  125 +your rights to work written entirely by you; rather, the intent is to
  126 +exercise the right to control the distribution of derivative or
  127 +collective works based on the Program.
  128 +
  129 +In addition, mere aggregation of another work not based on the Program
  130 +with the Program (or with a work based on the Program) on a volume of
  131 +a storage or distribution medium does not bring the other work under
  132 +the scope of this License.
  133 +
  134 + 3. You may copy and distribute the Program (or a work based on it,
  135 +under Section 2) in object code or executable form under the terms of
  136 +Sections 1 and 2 above provided that you also do one of the following:
  137 +
  138 + a) Accompany it with the complete corresponding machine-readable
  139 + source code, which must be distributed under the terms of Sections
  140 + 1 and 2 above on a medium customarily used for software interchange; or,
  141 +
  142 + b) Accompany it with a written offer, valid for at least three
  143 + years, to give any third party, for a charge no more than your
  144 + cost of physically performing source distribution, a complete
  145 + machine-readable copy of the corresponding source code, to be
  146 + distributed under the terms of Sections 1 and 2 above on a medium
  147 + customarily used for software interchange; or,
  148 +
  149 + c) Accompany it with the information you received as to the offer
  150 + to distribute corresponding source code. (This alternative is
  151 + allowed only for noncommercial distribution and only if you
  152 + received the program in object code or executable form with such
  153 + an offer, in accord with Subsection b above.)
  154 +
  155 +The source code for a work means the preferred form of the work for
  156 +making modifications to it. For an executable work, complete source
  157 +code means all the source code for all modules it contains, plus any
  158 +associated interface definition files, plus the scripts used to
  159 +control compilation and installation of the executable. However, as a
  160 +special exception, the source code distributed need not include
  161 +anything that is normally distributed (in either source or binary
  162 +form) with the major components (compiler, kernel, and so on) of the
  163 +operating system on which the executable runs, unless that component
  164 +itself accompanies the executable.
  165 +
  166 +If distribution of executable or object code is made by offering
  167 +access to copy from a designated place, then offering equivalent
  168 +access to copy the source code from the same place counts as
  169 +distribution of the source code, even though third parties are not
  170 +compelled to copy the source along with the object code.
  171 +
  172 + 4. You may not copy, modify, sublicense, or distribute the Program
  173 +except as expressly provided under this License. Any attempt
  174 +otherwise to copy, modify, sublicense or distribute the Program is
  175 +void, and will automatically terminate your rights under this License.
  176 +However, parties who have received copies, or rights, from you under
  177 +this License will not have their licenses terminated so long as such
  178 +parties remain in full compliance.
  179 +
  180 + 5. You are not required to accept this License, since you have not
  181 +signed it. However, nothing else grants you permission to modify or
  182 +distribute the Program or its derivative works. These actions are
  183 +prohibited by law if you do not accept this License. Therefore, by
  184 +modifying or distributing the Program (or any work based on the
  185 +Program), you indicate your acceptance of this License to do so, and
  186 +all its terms and conditions for copying, distributing or modifying
  187 +the Program or works based on it.
  188 +
  189 + 6. Each time you redistribute the Program (or any work based on the
  190 +Program), the recipient automatically receives a license from the
  191 +original licensor to copy, distribute or modify the Program subject to
  192 +these terms and conditions. You may not impose any further
  193 +restrictions on the recipients' exercise of the rights granted herein.
  194 +You are not responsible for enforcing compliance by third parties to
  195 +this License.
  196 +
  197 + 7. If, as a consequence of a court judgment or allegation of patent
  198 +infringement or for any other reason (not limited to patent issues),
  199 +conditions are imposed on you (whether by court order, agreement or
  200 +otherwise) that contradict the conditions of this License, they do not
  201 +excuse you from the conditions of this License. If you cannot
  202 +distribute so as to satisfy simultaneously your obligations under this
  203 +License and any other pertinent obligations, then as a consequence you
  204 +may not distribute the Program at all. For example, if a patent
  205 +license would not permit royalty-free redistribution of the Program by
  206 +all those who receive copies directly or indirectly through you, then
  207 +the only way you could satisfy both it and this License would be to
  208 +refrain entirely from distribution of the Program.
  209 +
  210 +If any portion of this section is held invalid or unenforceable under
  211 +any particular circumstance, the balance of the section is intended to
  212 +apply and the section as a whole is intended to apply in other
  213 +circumstances.
  214 +
  215 +It is not the purpose of this section to induce you to infringe any
  216 +patents or other property right claims or to contest validity of any
  217 +such claims; this section has the sole purpose of protecting the
  218 +integrity of the free software distribution system, which is
  219 +implemented by public license practices. Many people have made
  220 +generous contributions to the wide range of software distributed
  221 +through that system in reliance on consistent application of that
  222 +system; it is up to the author/donor to decide if he or she is willing
  223 +to distribute software through any other system and a licensee cannot
  224 +impose that choice.
  225 +
  226 +This section is intended to make thoroughly clear what is believed to
  227 +be a consequence of the rest of this License.
  228 +
  229 + 8. If the distribution and/or use of the Program is restricted in
  230 +certain countries either by patents or by copyrighted interfaces, the
  231 +original copyright holder who places the Program under this License
  232 +may add an explicit geographical distribution limitation excluding
  233 +those countries, so that distribution is permitted only in or among
  234 +countries not thus excluded. In such case, this License incorporates
  235 +the limitation as if written in the body of this License.
  236 +
  237 + 9. The Free Software Foundation may publish revised and/or new versions
  238 +of the General Public License from time to time. Such new versions will
  239 +be similar in spirit to the present version, but may differ in detail to
  240 +address new problems or concerns.
  241 +
  242 +Each version is given a distinguishing version number. If the Program
  243 +specifies a version number of this License which applies to it and "any
  244 +later version", you have the option of following the terms and conditions
  245 +either of that version or of any later version published by the Free
  246 +Software Foundation. If the Program does not specify a version number of
  247 +this License, you may choose any version ever published by the Free Software
  248 +Foundation.
  249 +
  250 + 10. If you wish to incorporate parts of the Program into other free
  251 +programs whose distribution conditions are different, write to the author
  252 +to ask for permission. For software which is copyrighted by the Free
  253 +Software Foundation, write to the Free Software Foundation; we sometimes
  254 +make exceptions for this. Our decision will be guided by the two goals
  255 +of preserving the free status of all derivatives of our free software and
  256 +of promoting the sharing and reuse of software generally.
  257 +
  258 + NO WARRANTY
  259 +
  260 + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
  261 +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
  262 +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
  263 +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
  264 +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  265 +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
  266 +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
  267 +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
  268 +REPAIR OR CORRECTION.
  269 +
  270 + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
  271 +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
  272 +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
  273 +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
  274 +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
  275 +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
  276 +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
  277 +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
  278 +POSSIBILITY OF SUCH DAMAGES.
  279 +
  280 + END OF TERMS AND CONDITIONS
  281 +
  282 + How to Apply These Terms to Your New Programs
  283 +
  284 + If you develop a new program, and you want it to be of the greatest
  285 +possible use to the public, the best way to achieve this is to make it
  286 +free software which everyone can redistribute and change under these terms.
  287 +
  288 + To do so, attach the following notices to the program. It is safest
  289 +to attach them to the start of each source file to most effectively
  290 +convey the exclusion of warranty; and each file should have at least
  291 +the "copyright" line and a pointer to where the full notice is found.
  292 +
  293 + <one line to give the program's name and a brief idea of what it does.>
  294 + Copyright (C) <year> <name of author>
  295 +
  296 + This program is free software; you can redistribute it and/or modify
  297 + it under the terms of the GNU General Public License as published by
  298 + the Free Software Foundation; either version 2 of the License, or
  299 + (at your option) any later version.
  300 +
  301 + This program is distributed in the hope that it will be useful,
  302 + but WITHOUT ANY WARRANTY; without even the implied warranty of
  303 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  304 + GNU General Public License for more details.
  305 +
  306 + You should have received a copy of the GNU General Public License along
  307 + with this program; if not, write to the Free Software Foundation, Inc.,
  308 + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  309 +
  310 +Also add information on how to contact you by electronic and paper mail.
  311 +
  312 +If the program is interactive, make it output a short notice like this
  313 +when it starts in an interactive mode:
  314 +
  315 + Gnomovision version 69, Copyright (C) year name of author
  316 + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
  317 + This is free software, and you are welcome to redistribute it
  318 + under certain conditions; type `show c' for details.
  319 +
  320 +The hypothetical commands `show w' and `show c' should show the appropriate
  321 +parts of the General Public License. Of course, the commands you use may
  322 +be called something other than `show w' and `show c'; they could even be
  323 +mouse-clicks or menu items--whatever suits your program.
  324 +
  325 +You should also get your employer (if you work as a programmer) or your
  326 +school, if any, to sign a "copyright disclaimer" for the program, if
  327 +necessary. Here is a sample; alter the names:
  328 +
  329 + Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  330 + `Gnomovision' (which makes passes at compilers) written by James Hacker.
  331 +
  332 + <signature of Ty Coon>, 1 April 1989
  333 + Ty Coon, President of Vice
  334 +
  335 +This General Public License does not permit incorporating your program into
  336 +proprietary programs. If your program is a subroutine library, you may
  337 +consider it more useful to permit linking proprietary applications with the
  338 +library. If this is what you want to do, use the GNU Lesser General
  339 +Public License instead of this License.
26 README
... ... @@ -0,0 +1,26 @@
  1 +i18njs, an internationalization library for JavaScript.
  2 + http://github.com/jefftrudeau/i18njs
  3 +
  4 +Released under the GNU General Public License, version 2.
  5 + http://www.gnu.org/licenses/gpl-2.0.txt
  6 +
  7 +Copyright (C) Jeff Trudeau
  8 +
  9 +----------------
  10 +Supports one translation (.po) file per language, which should be placed in the po/ directory and
  11 +appropriately named, e.g., 'po/en-US.po'.
  12 +
  13 +Include the i18n.js script from your page and use the String class' i18n() prototype method, for
  14 +example:
  15 +
  16 +<script type="text/javascript" src="http://sub.domain.com/path/to/i18njs/i18n.js"></script>
  17 +<script type="text/javascript">
  18 +//<![CDATA[
  19 + alert("I will translate this string while replacing '%s' and %d".i18n("this", 1));
  20 +//]]>
  21 +</script>
  22 +
  23 +----------------
  24 +TODO:
  25 +
  26 +Currently does not support re-ordering of replacement tokens.
73 i18n.js
... ... @@ -0,0 +1,73 @@
  1 +/**
  2 + * i18njs, an internationalization library for JavaScript.
  3 + * http://github.com/jefftrudeau/i18njs
  4 + *
  5 + * Released under the GNU General Public License, version 2.
  6 + * http://www.gnu.org/licenses/gpl-2.0.txt
  7 + *
  8 + * Copyright (C) Jeff Trudeau
  9 + */
  10 +var i18n = {
  11 +
  12 + // translations
  13 + strings: {},
  14 +
  15 + // simple AJAX request used to load resources
  16 + ajax: function (uri) {
  17 + var a = [
  18 + 'XMLHttpRequest()',
  19 + 'ActiveXObject("Msxml2.XMLHTTP")',
  20 + 'ActiveXObject("Microsoft.XMLHTTP")'
  21 + ], o = null;
  22 + for (var i in a) try { o = eval(a[i]); break; } catch (e) {};
  23 + try {
  24 + o.open('GET', uri, false);
  25 + o.setRequestHeader('User-Agent', navigator.userAgent);
  26 + o.send(null);
  27 + return o.responseText;
  28 + }
  29 + catch (e) {}
  30 + },
  31 +
  32 + // setup library
  33 + init: function () {
  34 + var path = document.getElementsByTagName('script'),
  35 + path = path[path.length - 1].getAttribute('src'),
  36 + path = path.substr(0, path.lastIndexOf('/'));
  37 + if (typeof(sprintf) == 'undefined') try { eval(i18n.ajax(path+'/sprintf.js')); } catch (e) {}
  38 + i18n.load_translations(path+'/po');
  39 + },
  40 +
  41 + // load translations from a .po file matching user's locale
  42 + load_translations: function (path) {
  43 + var k = '', s = i18n.ajax(path+'/'+i18n.locale()+'.po').split(/\n|\r|\r\n/);
  44 + for (var i in s) {
  45 + if (!s[i] || !s[i].indexOf || s[i].indexOf('#') == 0) continue;
  46 + if (s[i].indexOf('msgid') == 0) k = s[i].replace(/msgid\s"(.*)"/, '$1');
  47 + else if (s[i].indexOf('msgstr') == 0) i18n.strings[k] = s[i].replace(/msgstr\s"(.*)"/, '$1');
  48 + }
  49 + },
  50 +
  51 + // determine user's locale
  52 + locale: function () {
  53 + if (navigator)
  54 + for (var key in ['language', 'browserLanguage', 'systemLanguage', 'userLanguage'])
  55 + if (navigator[key]) return navigator[key];
  56 + return 'en-US';
  57 + },
  58 +
  59 + // translate a string
  60 + translate: function (string, values) {
  61 + var args = '', format = i18n.strings[string] || string, result = format;
  62 + for (var i = 0; i < values.length; i++) args += ', "'+values[i]+'"';
  63 + try { eval('result = sprintf(format'+args+')'); } catch (e) {}
  64 + return result;
  65 + }
  66 +
  67 +};
  68 +
  69 +i18n.init();
  70 +
  71 +String.prototype.i18n = function () {
  72 + return i18n.translate(this.valueOf(), arguments);
  73 +};
210 sprintf.js
... ... @@ -0,0 +1,210 @@
  1 +/**
  2 + * Copyright (c) 2010 Jakob Westhoff
  3 + *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a copy
  5 + * of this software and associated documentation files (the "Software"), to deal
  6 + * in the Software without restriction, including without limitation the rights
  7 + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8 + * copies of the Software, and to permit persons to whom the Software is
  9 + * furnished to do so, subject to the following conditions:
  10 + *
  11 + * The above copyright notice and this permission notice shall be included in
  12 + * all copies or substantial portions of the Software.
  13 + *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19 + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  20 + * THE SOFTWARE.
  21 + */
  22 +(function( window ) {
  23 + var sprintf = function( format ) {
  24 + // Check for format definition
  25 + if ( typeof format != 'string' ) {
  26 + throw "sprintf: The first arguments need to be a valid format string.";
  27 + }
  28 +
  29 + /**
  30 + * Define the regex to match a formating string
  31 + * The regex consists of the following parts:
  32 + * percent sign to indicate the start
  33 + * (optional) sign specifier
  34 + * (optional) padding specifier
  35 + * (optional) alignment specifier
  36 + * (optional) width specifier
  37 + * (optional) precision specifier
  38 + * type specifier:
  39 + * % - literal percent sign
  40 + * b - binary number
  41 + * c - ASCII character represented by the given value
  42 + * d - signed decimal number
  43 + * f - floating point value
  44 + * o - octal number
  45 + * s - string
  46 + * x - hexadecimal number (lowercase characters)
  47 + * X - hexadecimal number (uppercase characters)
  48 + */
  49 + var r = new RegExp( /%(\+)?([0 ]|'(.))?(-)?([0-9]+)?(\.([0-9]+))?([%bcdfosxX])/g );
  50 +
  51 + /**
  52 + * Each format string is splitted into the following parts:
  53 + * 0: Full format string
  54 + * 1: sign specifier (+)
  55 + * 2: padding specifier (0/<space>/'<any char>)
  56 + * 3: if the padding character starts with a ' this will be the real
  57 + * padding character
  58 + * 4: alignment specifier
  59 + * 5: width specifier
  60 + * 6: precision specifier including the dot
  61 + * 7: precision specifier without the dot
  62 + * 8: type specifier
  63 + */
  64 + var parts = [];
  65 + var paramIndex = 1;
  66 + while ( part = r.exec( format ) ) {
  67 + // Check if an input value has been provided, for the current
  68 + // format string
  69 + if ( paramIndex >= arguments.length ) {
  70 + throw "sprintf: At least one argument was missing.";
  71 + }
  72 +
  73 + parts[parts.length] = {
  74 + /* beginning of the part in the string */
  75 + begin: part.index,
  76 + /* end of the part in the string */
  77 + end: part.index + part[0].length,
  78 + /* force sign */
  79 + sign: ( part[1] == '+' ),
  80 + /* is the given data negative */
  81 + negative: ( parseInt( arguments[paramIndex] ) < 0 ) ? true : false,
  82 + /* padding character (default: <space>) */
  83 + padding: ( part[2] == undefined )
  84 + ? ( ' ' ) /* default */
  85 + : ( ( part[2].substring( 0, 1 ) == "'" )
  86 + ? ( part[3] ) /* use special char */
  87 + : ( part[2] ) /* use normal <space> or zero */
  88 + ),
  89 + /* should the output be aligned left?*/
  90 + alignLeft: ( part[4] == '-' ),
  91 + /* width specifier (number or false) */
  92 + width: ( part[5] != undefined ) ? part[5] : false,
  93 + /* precision specifier (number or false) */
  94 + precision: ( part[7] != undefined ) ? part[7] : false,
  95 + /* type specifier */
  96 + type: part[8],
  97 + /* the given data associated with this part converted to a string */
  98 + data: ( part[8] != '%' ) ? String ( arguments[paramIndex++] ) : false
  99 + };
  100 + }
  101 +
  102 + var newString = "";
  103 + var start = 0;
  104 + // Generate our new formated string
  105 + for( var i=0; i<parts.length; ++i ) {
  106 + // Add first unformated string part
  107 + newString += format.substring( start, parts[i].begin );
  108 +
  109 + // Mark the new string start
  110 + start = parts[i].end;
  111 +
  112 + // Create the appropriate preformat substitution
  113 + // This substitution is only the correct type conversion. All the
  114 + // different options and flags haven't been applied to it at this
  115 + // point
  116 + var preSubstitution = "";
  117 + switch ( parts[i].type ) {
  118 + case '%':
  119 + preSubstitution = "%";
  120 + break;
  121 + case 'b':
  122 + preSubstitution = Math.abs( parseInt( parts[i].data ) ).toString( 2 );
  123 + break;
  124 + case 'c':
  125 + preSubstitution = String.fromCharCode( Math.abs( parseInt( parts[i].data ) ) );
  126 + break;
  127 + case 'd':
  128 + preSubstitution = String( Math.abs( parseInt( parts[i].data ) ) );
  129 + break;
  130 + case 'f':
  131 + preSubstitution = ( parts[i].precision == false )
  132 + ? ( String( ( Math.abs( parseFloat( parts[i].data ) ) ) ) )
  133 + : ( Math.abs( parseFloat( parts[i].data ) ).toFixed( parts[i].precision ) );
  134 + break;
  135 + case 'o':
  136 + preSubstitution = Math.abs( parseInt( parts[i].data ) ).toString( 8 );
  137 + break;
  138 + case 's':
  139 + preSubstitution = parts[i].data.substring( 0, parts[i].precision ? parts[i].precision : parts[i].data.length ); /* Cut if precision is defined */
  140 + break;
  141 + case 'x':
  142 + preSubstitution = Math.abs( parseInt( parts[i].data ) ).toString( 16 ).toLowerCase();
  143 + break;
  144 + case 'X':
  145 + preSubstitution = Math.abs( parseInt( parts[i].data ) ).toString( 16 ).toUpperCase();
  146 + break;
  147 + default:
  148 + throw 'sprintf: Unknown type "' + parts[i].type + '" detected. This should never happen. Maybe the regex is wrong.';
  149 + }
  150 +
  151 + // The % character is a special type and does not need further processing
  152 + if ( parts[i].type == "%" ) {
  153 + newString += preSubstitution;
  154 + continue;
  155 + }
  156 +
  157 + // Modify the preSubstitution by taking sign, padding and width
  158 + // into account
  159 +
  160 + // Pad the string based on the given width
  161 + if ( parts[i].width != false ) {
  162 + // Padding needed?
  163 + if ( parts[i].width > preSubstitution.length )
  164 + {
  165 + var origLength = preSubstitution.length;
  166 + for( var j = 0; j < parts[i].width - origLength; ++j )
  167 + {
  168 + preSubstitution = ( parts[i].alignLeft == true )
  169 + ? ( preSubstitution + parts[i].padding )
  170 + : ( parts[i].padding + preSubstitution );
  171 + }
  172 + }
  173 + }
  174 +
  175 + // Add a sign symbol if neccessary or enforced, but only if we are
  176 + // not handling a string
  177 + if ( parts[i].type == 'b'
  178 + || parts[i].type == 'd'
  179 + || parts[i].type == 'o'
  180 + || parts[i].type == 'f'
  181 + || parts[i].type == 'x'
  182 + || parts[i].type == 'X' ) {
  183 + if ( parts[i].negative == true ) {
  184 + preSubstitution = "-" + preSubstitution;
  185 + }
  186 + else if ( parts[i].sign == true ) {
  187 + preSubstitution = "+" + preSubstitution;
  188 + }
  189 + }
  190 +
  191 + // Add the substitution to the new string
  192 + newString += preSubstitution;
  193 + }
  194 +
  195 + // Add the last part of the given format string, which may still be there
  196 + newString += format.substring( start, format.length );
  197 +
  198 + return newString;
  199 + };
  200 +
  201 + // Register the new sprintf function as a global function, as well as a
  202 + // method to the String object.
  203 + window.sprintf = sprintf;
  204 + String.prototype.printf = function() {
  205 + var newArguments = Array.prototype.slice.call( arguments );
  206 + newArguments.unshift( String( this ) );
  207 + return sprintf.apply( undefined, newArguments );
  208 + }
  209 +})( window );
  210 +

0 comments on commit 31d36ee

Please sign in to comment.
Something went wrong with that request. Please try again.